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网络算法分析与应用(适合入门、快速上手)_第1张图片

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

SOM网络算法分析与应用(适合入门、快速上手)_第2张图片

 二、SOM网络的拓扑结构

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

  1. 处理单元阵列。用于接收输入事件,并且形成对这些信号的“判别函数”
  2. 比较选择机制。用于比较“判别函数”,并且选择一个具有较大函数处理值的处理单元。
  3. 局部互连作用。用于同时激励别选择的处理单元以及其最邻近的处理单元。
  4. 自适应过程。用于修正被激励的处理单元的参数,以增加其对于判别函数的输出值

这里写图片描述

 三、SOM网络的权值调整

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

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

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

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

SOM网络算法分析与应用(适合入门、快速上手)_第3张图片

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网络算法分析与应用(适合入门、快速上手)_第4张图片

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

SOM网络算法分析与应用(适合入门、快速上手)_第5张图片

SOM网络算法分析与应用(适合入门、快速上手)_第6张图片

 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网络算法分析与应用(适合入门、快速上手)_第7张图片

 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 结构函数

利用三个常见的结构函数创建一个二维神经网络层:

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网络算法分析与应用(适合入门、快速上手)_第8张图片

 五、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网络算法分析与应用(适合入门、快速上手)_第9张图片

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

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张图片

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

SOM网络算法分析与应用(适合入门、快速上手)_第11张图片

 再举一个例子:人口分类是人口统计指标中的一个重要指标。由于各方面的原因,我国人口的出生率在性别上差异较大,具体表现在同一个时期的出生人口中,男性所占比例较大,超过了正常的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网络算法分析与应用(适合入门、快速上手)_第12张图片

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网络算法分析与应用(适合入门、快速上手)_第13张图片

 在命令窗口中可以查看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网络算法分析与应用(适合入门、快速上手)_第14张图片

神经元的初始分布如下:

SOM网络算法分析与应用(适合入门、快速上手)_第15张图片

 

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

SOM网络算法分析与应用(适合入门、快速上手)_第16张图片SOM网络算法分析与应用(适合入门、快速上手)_第17张图片

SOM网络算法分析与应用(适合入门、快速上手)_第18张图片SOM网络算法分析与应用(适合入门、快速上手)_第19张图片

 SOM网络算法分析与应用(适合入门、快速上手)_第20张图片SOM网络算法分析与应用(适合入门、快速上手)_第21张图片

 

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

SOM网络算法分析与应用(适合入门、快速上手)_第22张图片

 邻近神经元之间的距离效果:

SOM网络算法分析与应用(适合入门、快速上手)_第23张图片

 每个神经元的分类情况:

SOM网络算法分析与应用(适合入门、快速上手)_第24张图片

 

 最后,更多的神经网络教学以及最全代码资源戳这里下载:

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

 

你可能感兴趣的:(MATLAB神经网络,机器学习,神经网络,算法,matlab,分类)