如上图,只有在输入4的位置处,对应的输出才是1,其它都是0。这就是竞争层的作用。
通过这样的方法,对于n1中最大的元素,可以获胜,竞争层输出1。如果b1=0,即没有阈值向量作用,那么只有当神经元的权值向量IW与输入向量最接近时,它在n1中各元素的负值最小,而值最大,所以能赢得竞争。这就是为什么要用负距离。
就使得不是每次迭代就把所有神经元的权重都更新一遍,而是每次迭代只更新一个隐含层神经元的权重。例如上面这个例子的输出a1,a1是S1x1的维度,其中就一个值为1,其它为0,那么就只有1的位置对应的那个神经元的权重才会得到更新(只有获胜的神经元才有机会跳转权值)。
这样不断迭代,势必会带来一个问题:获胜的神经元通过调整能够不断缩小误差,导致它们取胜几率不断增大,导致最后整个网络中只有一部分胜利的神经元取得成功,其他神经元始终没有取得训练,成为“死神经元”。
解决这个问题的办法:设置较大的b1,帮助被冷落的神经元们获得竞争胜利的机会。针对某个竞争神经元而言,如果偏置b1取得比较大,那么就能帮助输入p在竞争中获得更大的取胜概率。当然,这个b也是会动态调整的,通过学习函数learncon来帮助动态调整b
权重IW{1,1}如何设定?
are initialized to the centers of the input ranges with the function midpoint.也就是说是取输入向量的中心。
中心怎么理解呢?简单的说是最大最小值的平均值。
SOM能够通过其输入样本学会检测其规律性和输入样本相互之间的关系,并且根据这些输入样本的信息自适应地调整网络,使得网络以后的响应与输入样本相适应。竞争型神经网络的神经元通过输入信息能够识别成组的相似输入向量;自组织映射神经网络通过学习同样能够识别成组的相似输入向量,使那些网络层中彼此靠的很近的神经元对相似的输入向量产生响应。与竞争型神经网络不同的是,SOM不但能学习输入向量的分布情况,还可以学习输入向量的拓扑结构,其单个神经元对模式分类不起决定性作用,而要靠多个神经元的协同作用才能完成模式分类。
和竞争性神经网络区别:
newc
功能:该函数用于创建一个竞争层
net=newc
net=newc(PR,S,KLR,CLR)
PR:输入样本,每个特征的最大值和最小值,R2矩阵
S:神经元的数目,即分类类别数
KLR:Kohonen学习速度,默认为0.01
CLR:Conscience学习速度,默认为0.001
net:函数返回值,一个新的竞争层。
newsom
et=newsom(PR,[D1,D2,^],TFCN,DFCN,OLR,OSTEPS,TLR,TND)
PR:R个输入元素
Di:第I层的维数,默认为[5 8]
TFCN:拓扑函数,默认为hextop
DFCN:距离函数,默认为linkdist
OLR:分类阶段学习速率,默认为0.9
OSTEPS:分类阶段的步长,默认为1000
TLR:调谐阶段的学习速率,默认为0.02
TNS:调谐阶段的领域距离,默认为1.
输入net=newsom([0 1;0 1],[3 5])时的拓扑结构,[0 1;0 1]为输入样本
第一步:清空环境
%% I. 清空环境变量
clear all
clc
第二步:导入数据
%% II. 训练集/测试集产生
%%
% 1. 导入数据
load water_data.mat
第三步:训练集测试集划分/font>
%%
% 2. 数据归一化
attributes = mapminmax(attributes);
%%
% 3. 训练集和测试集划分
% 训练集——35个样本
P_train = attributes(:,1:35);
T_train = classes(:,1:35);
% 测试集——4个样本
P_test = attributes(:,36:end);
T_test = classes(:,36:end);
第四步:竞争神经网络创建,训练,仿真/font>
%% III. 竞争神经网络创建、训练及仿真测试
%%
% 1. 创建网络
net = newc(minmax(P_train),4,0.01,0.01);
%%
% 2. 设置训练参数
net.trainParam.epochs = 500;
%%
% 3. 训练网络
net = train(net,P_train);
%%
% 4. 仿真测试
% 训练集
t_sim_compet_1 = sim(net,P_train);
T_sim_compet_1 = vec2ind(t_sim_compet_1);
% 测试集
t_sim_compet_2 = sim(net,P_test);
T_sim_compet_2 = vec2ind(t_sim_compet_2);
解析:
net = newc(minmax(P_train),4,0.01,0.01);
因为有4类,所以第二个参数设为4,后面两个参数为权值和阈值
minmax(P_train) 有6个特征,返回每个特征的最大值和最小值
训练过程
仿真测试
vec2ind把一个稀疏矩阵(one-hot)转换成行向量或者列向量
第五步:SOFM(SOM)神经网络创建,训练,仿真/font>
%% IV. SOFM神经网络创建、训练及仿真测试
%%
% 1. 创建网络
net = newsom(P_train,[4 4]);
%%
% 2. 设置训练参数
net.trainParam.epochs = 200;
%%
% 3. 训练网络
net = train(net,P_train);
%%
% 4. 仿真测试
% 训练集
t_sim_sofm_1 = sim(net,P_train);
T_sim_sofm_1 = vec2ind(t_sim_sofm_1);
% 测试集
t_sim_sofm_2 = sim(net,P_test);
T_sim_sofm_2 = vec2ind(t_sim_sofm_2);
解析
第六步:结果对比
%% V. 结果对比
%%
% 1. 竞争神经网络
result_compet_1 = [T_train' T_sim_compet_1']
result_compet_2 = [T_test' T_sim_compet_2']
%%
% 2. SOFM神经网络
result_sofm_1 = [T_train' T_sim_sofm_1']
result_sofm_2 = [T_test' T_sim_sofm_2']
代码和数据百度云
链接:https://pan.baidu.com/s/1QITn_fTWAlCTMZf6swMjDg
提取码:fb8o
复制这段内容后打开百度网盘手机App,操作更方便哦
作者:电气工程的计算机萌新-余登武