SOM网络算法分析与应用(适合入门、快速上手)

内容

一、 SOM网络的生物学基础

二、SOM网络的拓扑结构

三、SOM网络的权值调整

四、SOM网络的实现

4.1 创建函数NEWSOM

4.2 传递函数

4.3 距离函数

4.4 权值函数negdist

五、SOM网络的应用

5.1 SOM网络在分类中的应用

5.2 SOM网络应用于故障诊断

1918年,芬兰Helsink大学的T.K教授提出一种自组织SOM网络,简称SOM网络kohonen网络,Kohonen认为,一个神经网络接收外界输入模式时,将会分为不同的对应区域,各区域对应输入模式具有不同的响应特征,而且这个过程是自动完成的。自组织特征映射正是根据这一看法提出来的,其特点是与人脑的自组织特征相类似。

一、 SOM网络的生物学基础

生物学研究的事实表明,在人脑的感觉通道中,神经元的组织原理是有序的。因此,当人脑通过感官从外界接收到特定的时空信息时,大脑皮层的特定区域被激发,相似的外部信息在相应区域不断成像。例如,生物视网膜中有许多对特定图像敏感的特定细胞。当视网膜中的几个感受器单元受到特定模式的刺激时,大脑皮层中的特定神经元就会开始兴奋,输入模式接近相应的兴奋性神经元也有较大的频率差异。大脑皮层的这种反应不是先天的,而是通过后天学习自组织的。

SOM网络算法分析与应用(适合入门、快速上手)

对于一定的模式、一定频率的特定激发过程、神经元的有序排列和外部信息的连续映射,是自组织神经网络特征映射网络中竞争机制的生物学基础。当从外界输入不同的样本时,网络中该位置的神经元在训练开始时的激发是随机的。但在后天的自组织训练中,竞争层会形成有序排列的神经元,功能相似的神经元靠得很近,功能不同的神经元相距较远。这一特点与人脑神经元的组织原理非常相似。

SOM网络算法分析与应用(适合入门、快速上手)

二、SOM网络的拓扑结构

SOM网络的一个典型特征是可以在一维或者二维的处理单元阵列上,形成输入信号特征的拓扑分布,因此SOM网络具有抽取输入信号模式特征的能力。SOM网络一般只包含一维阵列和二维阵列,但有时也可以推广到多维处理单元中。下面我们讨论一下应用较多的二维阵列。SOM的网络模型由以下四部分组成:

  1. 处理单元阵列。用于接收输入事件并对这些信号形成“判别函数”
  2. 比较选择机制。用于比较“判别函数”,选择函数处理值较大的处理单元。
  3. 本地互连。用于同时激活选定的处理单元及其最近的邻居。
  4. 适应过程。用于修改激励处理单元的参数以增加其判别函数的输出值

这里写图片描述

三、SOM网络的权值调整

SOM网络采用的算法为Kohonen算法,它是在“胜者为王”的学习规则上加以改进形成的,主要的区别是调整权向量和侧抑方式的不同。

WTA:侧抑是“封杀”式的。只有获取神经元可以调整其权值,其他神经元无权调整。

Kohonen算法:获胜神经元对其临近神经元的影响是由近及远的,由兴奋逐渐变为抑制。换句话说,不仅获胜神经元要调整权值,他周围的神经元也要不同程度的调整权向量,常见的调整方式有如下几种:

1)墨西哥草帽函数:获胜结点有最大的权值调整量,临近的结点有稍小的调整量,离获胜结点距离越大,权值调整量越小,最后到达某一设定距离d0时候,权值调整量为

SOM网络算法分析与应用(适合入门、快速上手)

2)大礼帽函数:是墨西哥草帽函数的一种简化版。

3)厨师帽函数:大礼帽函数的一种简化版。

以获胜神经元为中心为中心设定一个领域半径R,该半径固定的范围称为优胜邻域。在SOM网络学习方法中,优胜邻域内所有神经元均按其与获胜神经元的距离调整权值,优胜邻域开始设定的较大,但其大小随着训练次数的不断增加而减小,最终收缩到半径为0.

Kohonen神经网络算法工作机理为:网络学习过程中,当样本输入网络时, 竞争层上的神经元计算 输入样本与 竞争层神经元权值之间的 欧几里德距离,距离最小的神经元为获胜神经元。调整获胜神经元和相邻神经元权值,使获得神经元及周边权值靠近该输入样本。通过反复训练,最终各神经元的连接权值具有一定的分布,该分布把数据之间的相似性组织到代表各类的神经元上,使同类神经元具有相近的权系数,不同类的神经元权系数差别明显。需要注意的是,在学习的过程中,权值修改学习速率和神经元领域均在不断较少,从而使同类神经元逐渐集中。

四、SOM网络的实现

在matlab中神经网络工具箱中提供了若干函数实现SOM网络。

4.1 创建函数NEWSOM

代码显示如下:

其中:P为一个R*Q的输入矩阵,R为输入向量的个数,STEP为分类阶段的步数,默认为100;IN为初始分类的大小默认值为3;net为生成的SOM网络。

load simpleclass_dataset
net = newsom(simpleclassInputs,[8 8]);
plotsom(net.layers{1}.positions)
net = train(net,simpleclassInputs);
figure;
plot(simpleclassInputs(1,:),simpleclassInputs(2,:), ...
    '.g','markersize',20)
hold on
plotsom(net.iw{1,1},net.layers{1}.distances)
hold off

运行程序,训练过程如下:

SOM网络算法分析与应用(适合入门、快速上手)

二维自组织特征映射神经网络的结果图如下:

SOM网络算法分析与应用(适合入门、快速上手)

SOM网络算法分析与应用(适合入门、快速上手)

4.2 传递函数

在MATLAB中提供了softmax函数实现软最大传递函数,利用最大传递函数求给定向量的返回值。

 clear all;
n = [0; 1; -0.5; 0.5];
a = softmax(n)
subplot(2,1,1), bar(n), ylabel('n')
subplot(2,1,2), bar(a), ylabel('a')

运行程序后的结果:

a =

    0.1674
    0.4551
    0.1015
    0.2760

SOM网络算法分析与应用(适合入门、快速上手)

4.3 距离函数

在MATLAB的神经网络工具箱中提供了若干函数实现SOM网络神经元之间的距离。

1)BOXDIST函数

该函数为Box距离函数,在给定神经元的位置后,可利用该函数计算神经元之间的距离。求创建函数随机矩阵的BOX距离代码如下:

clear all;
pos=rand(3,6);
d=boxdist(pos)

运行后的结果如下

d =

         0    0.5352    0.2187    0.5816    0.6414    0.4042
    0.5352         0    0.4261    0.6356    0.4706    0.6746
    0.2187    0.4261         0    0.6230    0.6828    0.6230
    0.5816    0.6356    0.6230         0    0.1951    0.7713
    0.6414    0.4706    0.6828    0.1951         0    0.8311
    0.4042    0.6746    0.6230    0.7713    0.8311         0

2)Linkdist函数

该函数为连接距离函数,在给定的神经元位置后,该函数可用于计算神经元之间的距离。pos为N*S维度的矩阵,d为S*S维的距离矩阵,求创建随机矩阵神经元间的连接距离代码如下:

clear all;
pos=rand(3,6);
D=linkdist(pos)

结果如下:

D =

     0     1     1     1     1     1
     1     0     1     1     1     1
     1     1     0     1     1     1
     1     1     1     0     1     1
     1     1     1     1     0     1
     1     1     1     1     1     0

4.4 权值函数negdist

代码如下:W为S*R维的权值矩阵;P为Q组输入向量的R*Q维矩阵。

clear all;
p = rand(2,1);
a = rand(6,1);
w = rand(6,2);
pos = hextop(2,3);   %创建含有12个神经元的自组织特征映射网络
d = linkdist(pos);   %计算各神经元的连接距离
%设置学习的参数属性
lp.order_lr = 0.9;
lp.order_steps = 1000;
lp.tune_lr = 0.02;
lp.tune_nd = 1;
ls = [];         %学习速率为空
[dW,ls] = learnsom(w,p,[],[],a,[],[],[],[],d,lp,ls)

结果如下:

ls = 

      step: 1
    nd_max: 2

4.5 结构函数

使用三个常见的结构化函数创建一个 2D 神经网络层:

clear all;
pos1 = gridtop(8,5);
subplot(221);plotsom(pos1);
title('网格层结构函数')
pos2 = hextop(8,5);
subplot(222);plotsom(pos2)
title('六角层结构函数')
pos3 = randtop(8,5);
subplot(223);plotsom(pos3)
title('随机层结构函数')

结果如下:

SOM网络算法分析与应用(适合入门、快速上手)

五、SOM网络的应用

5.1 SOM网络在分类中的应用

针对给定的输入向量P,建立一个自组织特征映射,并对P进行分类。首先建立一个SOM网络,并绘制出网络当前神经元的位置。

P=[0.1 0.8 0.1 0.9;0.2 0.9 0.1 0.8];
net=newsom([0 2;0 1],[3 5]);
plotsom(net.layers{1}.positions)
title('神经元的位置')

创建的SOM网络竞争层为一个二维的3*5的平面阵列,拓扑函数为hextop,距离函数为linkdist,其他参数均取默认值。

SOM网络算法分析与应用(适合入门、快速上手)

接下来对网络进行训练,得到自组织神经网络的训练过程和神经元位置。完整代码如下:

P=[0.1 0.8 0.1 0.9;0.2 0.9 0.1 0.8];
net=newsom([0 2;0 1],[3 5]);
plotsom(net.layers{1}.positions)
title('神经元的位置')
P=[0.1 0.8 0.1 0.9;0.2 0.9 0.1 0.8];
net=newsom([0 2;0 1],[3 5]);
plotsom(net.layers{1}.positions)
title('神经元的位置')
%进行训练
%训练次数为10
net.trainParam.epochs=10;
net=train(net,P);
plot(P(1,:),P(2,:),'.g','markersize',20);
hold on;
%绘制训练后神经元的位置
plotsom(net.iw{1,1},net.layers{1}.distances);
hold off;
title('权向量');
figure;
%训练次数为25
%训练前进行初始化
net=init(net);
net.trainParam.epochs=25;
net=train(net,P);
plot(P(1,:),P(2,:),'.g','markersize',20);
hold on;
plotsom(net.iw{1,1},net.layers{1}.distances);
hold off;
title('权向量');

SOM网络算法分析与应用(适合入门、快速上手)

经过10次训练后,神经元的位置就发生了明显的改变。神经元的位置的分布状况表示他们已经可以对输入向量进行分类了。经过25次训练后的神经网络分布和10次训练后的神经元分布没有明显的差异。

SOM网络算法分析与应用(适合入门、快速上手)

再举一个例子:人口分类是人口统计指标中的一个重要指标。由于各方面的原因,我国人口的出生率在性别上差异较大,具体表现在同一个时期的出生人口中,男性所占比例较大,超过了正常的1:1比例。因此,正确的进行人口分类是制定合理人口政策的基础。

下面代码中的P表示1999年12月共20个地区的人口出生比例的情况,是一个二维矩阵,利用12个神经元的SOM网络对输入的向量P进行分类。该网络竞争层神经元的组织结构为3*4,通过距离函数linkdist来计算距离,网络创建的代码如下:

P=[0.5512 0.5123 0.5087 0.5001 0.6012 0.5298 0.5000 0.4965 0.5103 0.5003;
   0.4488 0.4877 0.4913 0.4999 0.3988 0.4702 0.5000 0.5035 0.4897 0.4997];
plot(P(1,:),P(2,:),'*r');
hold on

SOM网络算法分析与应用(适合入门、快速上手)

net=newsom([0 1;0 1],[3 4]);
w1_init=net.iw{1,1};
plotsom(w1_init,net.layers{1}.distances);
title('权向量');

图中的每一个点表示一个神经元,由于网络初始权值被设置为0.5,所以这些点在图中是重合的。

SOM网络算法分析与应用(适合入门、快速上手)

在命令窗口中可以查看w1_init的值:

w1_init =

    0.5000    0.5000
    0.5000    0.5000
    0.5000    0.5000
    0.5000    0.5000
    0.5000    0.5000
    0.5000    0.5000
    0.5000    0.5000
    0.5000    0.5000
    0.5000    0.5000
    0.5000    0.5000
    0.5000    0.5000
    0.5000    0.5000

接下来利用训练函数train对网络进行训练,设想训练的网络可以对输入向量进行正确的分类。网络训练步数对网络的性能影响较大,这里设置步数分别为100,300,500进行训练并观察其权值分布。

对于步数为100时的训练代码:

clear all;
P=[0.5512 0.5123 0.5087 0.5001 0.6012 0.5298 0.5000 0.4965 0.5103 0.5003;
   0.4488 0.4877 0.4913 0.4999 0.3988 0.4702 0.5000 0.5035 0.4897 0.4997];

plot(P(1,:),P(2,:),'*r');
hold on
net=newsom([0 1;0 1],[3 4]);
w1_init=net.iw{1,1};
plotsom(w1_init,net.layers{1}.distances);
title('权向量');
net=train(net,P);
figure;
w1=net.iw{1,1};
plotsom(w1,net,layers{1}.distances)
title('权向量')

5.2 SOM网络应用于故障诊断

给出一个含有8个故障样本的数据集。每个故障样本中有8个特征,应用SOM神经网络诊断柴油机故障的步骤如下:

1)选取标准故障样本。

2)对每一种故障样本进行学习,学习结束后,对具有最大输出的神经元标有该故障的记号。

3)将待检测样本输入SOM网络中。

4)如果输出神经元在输出层的位置与某种标准故障的位置相同,说明待检测样本中发生了相应的故障;如果输出神经元在输出层的位置介于很多标准故障之间,说明这几种标准故障都可能发生,且各种故障的程度可以由与该位置与相应标准故障样本位置的欧氏距离确定。

相应的matlab代码如下:

 clear all;
%样本数据
p=[0.9325	1.0000	1.0000	-0.4526	0.3895	1.0000	1.0000	1.0000;...
    -0.4571	-0.2854	-0.9024	-0.9121	-0.0841	1.0000	-0.2871	0.5647;...
    0.5134	0.9413	0.9711	-0.4187	0.2855	0.8546	0.9478	0.9512;...
    0.1545	0.1564	-0.5000	-0.6571	-0.3333	-0.6667	-0.3333	-0.5000;...
    0.1765	0.7648	0.4259	-0.6472	-0.0563	0.1726	0.5151	0.4212;...
    -0.6744	-0.4541	-0.8454	1.0000	-0.8614	-0.6714	-0.6279	-0.6785;...
    0.4647	0.8710	0.0712	-0.7845	-0.2871	0.8915	0.6553	0.6152;...
    0.6818	1.0000	-0.625	-0.8426	-0.6215	-0.1574	1.0000	0.7782];
%newsom建立SOM网络。Minmax(p)取输入的最大最小值。竞争层为6*6=36个神经元
net=newsom(minmax(p),[6 6]);
plotsom(net.layers{1}.positions)
%7次训练的次数
a=[10 30 50 100 200 500 1000];
%随机初始化一个7*8向量
yc=rands(7,8);
%训练次数为10次
net.trainparam.epochs=a(1);
%训练网络和查看分类
net=train(net,p);
y=sim(net,p);
yc(1,:)=vec2ind(y);
plotsom(net.iw{1,1},net.layers{1}.distances)

%训练次数为30次
net.trainparam.epochs=a(2);
%训练网络和查看分类
net=train(net,p);
y=sim(net,p);
yc(2,:)=vec2ind(y);
plotsom(net.iw{1,1},net.layers{1}.distances)

%训练次数为50次
net.trainparam.epochs=a(3);
%训练网络和查看分类
net=train(net,p);
y=sim(net,p);
yc(3,:)=vec2ind(y);
plotsom(net.iw{1,1},net.layers{1}.distances)

%训练次数为100次
net.trainparam.epochs=a(4);
%训练网络和查看分类
net=train(net,p);
y=sim(net,p);
yc(4,:)=vec2ind(y);
plotsom(net.iw{1,1},net.layers{1}.distances)

%训练次数为200次
net.trainparam.epochs=a(5);
%训练网络和查看分类
net=train(net,p);
y=sim(net,p);
yc(5,:)=vec2ind(y);
plotsom(net.iw{1,1},net.layers{1}.distances)        
%训练次数为500次
net.trainparam.epochs=a(6);
%训练网络和查看分类
net=train(net,p);
y=sim(net,p);
yc(6,:)=vec2ind(y);
plotsom(net.iw{1,1},net.layers{1}.distances)

%训练次数为1000次          %得到1000次权值向量图,如图2-18所示。
net.trainparam.epochs=a(7);
%训练网络和查看分类
net=train(net,p);
y=sim(net,p);
yc(7,:)=vec2ind(y);
plotsom(net.iw{1,1},net.layers{1}.distances)
title('权向量')
yc
%网络作分类的预测
%测试样本输入
t=[0.9512 1.0000 0.9458 -0.4215 0.4218 0.9511 0.9645 0.8941]';
%用sim来做网络仿真
r=sim(net,t);
%变换函数,将单值向量转换为下标向量
rr=vec2ind(r)
%查看网络拓扑学结构
plotsomtop(net)            %SOM网络拓扑学结构如图2-19所示
title('SOM网络拓扑结构')
%查看临近神经元直接的距离情况
plotsomnd(net)            %得到临近神经元直接距离如图2-20所示
title('临近神经元直接的距离')

训练过程如下:

SOM网络算法分析与应用(适合入门、快速上手)

神经元的初始分布如下:

SOM网络算法分析与应用(适合入门、快速上手)

训练30,50,100,200,500,1000次,后得到的权值向量图如下:

SOM网络算法分析与应用(适合入门、快速上手)SOM网络算法分析与应用(适合入门、快速上手)

SOM网络算法分析与应用(适合入门、快速上手)SOM网络算法分析与应用(适合入门、快速上手)

SOM网络算法分析与应用(适合入门、快速上手)SOM网络算法分析与应用(适合入门、快速上手)

接下来,做出SOM网络的拓扑结构图如下

SOM网络算法分析与应用(适合入门、快速上手)

相邻神经元之间的距离效应:

SOM网络算法分析与应用(适合入门、快速上手)

每个神经元的分类:

SOM网络算法分析与应用(适合入门、快速上手)

最后,更多神经网络教学和最全的代码资源,点击这里下载:

MATLAB神经网络设计应用27例-机器学习文档类资源-CSDN下载

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
扎眼的阳光的头像扎眼的阳光普通用户
上一篇 2022年3月23日 下午5:16
下一篇 2022年3月23日 下午5:43

相关推荐