MATLAB机器学习系列-6 竞争神经网络与SOFM(SOM)神经网络原理及其例子代码

竞争神经网络

结构上和RBF等网络是比较像的。这里的距离是负数距离,||ndist||中带一个n,表示negative。在matlab中计算方法是ngedist。 它的计算过程是:待分类样本输入后,和样本(就是输入权值向量IW)计算负距离。||ndist||计算后输出是S1x1维的列向量,列向量中每个元素为输入向量p和IW距离的负数。之后,再和一个阈值b1相加,得到n1。接下来就进入了最重要的竞争层,在竞争层中,只有值最大的一个输入才能“崭露头角”,输出为1,其它弱鸡的输入都会变成0。

如上图,只有在输入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.也就是说是取输入向量的中心。
中心怎么理解呢?简单的说是最大最小值的平均值。

S是神经元个数,PR矩阵的维度

如图所示,假如有两个输入01;-22 ,隐藏层有5个神经元,得到的LW是0.5

阈值b是如何计算的

计算方式见图 rows=前面的5时,结果c=13.5914

权重更新方式

阈值更新方法

SOFM(SOM)自组织映射神经网络

SOM能够通过其输入样本学会检测其规律性和输入样本相互之间的关系,并且根据这些输入样本的信息自适应地调整网络,使得网络以后的响应与输入样本相适应。竞争型神经网络的神经元通过输入信息能够识别成组的相似输入向量;自组织映射神经网络通过学习同样能够识别成组的相似输入向量,使那些网络层中彼此靠的很近的神经元对相似的输入向量产生响应。与竞争型神经网络不同的是,SOM不但能学习输入向量的分布情况,还可以学习输入向量的拓扑结构,其单个神经元对模式分类不起决定性作用,而要靠多个神经元的协同作用才能完成模式分类。

和竞争性神经网络区别:

  • 1没有阈值b
  • 2在权重更新时,竞争性神经网络只有1个获得调整,som是多个获得调整,主神经元和邻近神经元都获得调整。如图,主神经元为13,选择不同邻域,则不同神经元都得到调整。

权重更新公式

常用函数

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

输入attributes

输出classes,1234四类

第三步:训练集测试集划分/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,操作更方便哦

在这里插入图片描述
作者:电气工程的计算机萌新-余登武
在这里插入图片描述

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

总裁余(余登武)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值