神经网络

【模型】一篇入门之-SOM神经网络

作者 : 老饼 发表日期 : 2022-06-09 04:42:02 更新日期 : 2024-10-25 13:05:52
本站原创文章,转载请说明来自《老饼讲解-BP神经网络》www.bbbdata.com



SOM全称为自组织竞争神经网络(Self-organizing Feature Map),是Kohonen提出的一种聚类模型

本文介绍SOM神经网络的模型结构、拓扑图以及模型训练方法,并展示一个SOM神经网络的代码实现

通过本文,可以快速了解SOM神经网络是什么、有什么用,以及如何使用SOM神经网络来对样本进行聚类





  01.  SOM神经网络的思想  




本节先简单回顾Kohonen规则,并描述性讲述SOM神经网络是什么




    SOM神经网络是什么    


SOM(自组织竞争)神经网络是一种基于kohonen规则的聚类算法
kohonen规则

kohonen规则进行聚类的方法如下:
  kohonen规则聚类算法流程
先随机初始化k个聚类中心点,然后每次选出一个样本,
将离它最近的聚类点往它移动,使该聚类点更靠近它,如此反复m次
 kohonen更新法则如下:
 
   其中  
 :离样本最近的聚类中心点
  : 学习率                             
 kohonen规则虽然简单,然而它却是行之有效的
 SOM神经网络  
 SOM神经网络用于解决聚类问题,它是Kohonen规则聚类的改进
 
SOM在更新离样本最近的聚类中心P时,会把P的邻近聚类中心也一起更新   
  更细节的,有以下三点:
1、更新邻近聚类点                                                                    
  更新样本最近点P的同时,P的邻近聚类点也一起更新      
(P的学习率要比邻近聚类点更大一些)                  

 2、增加学习率的收缩机制                                                           
 随着更新步数,学习率越来越小                       
 3、邻近距离收缩机制                                                                  
 随着更新步数,邻近距离阈值越来越小                 
渐渐的,就只更新目标点及其邻边聚类点              

 
SOM模型在对样本进行判别时,只需要判断样本离哪个聚类中心点近,就判为哪个聚类点





      SOM的距离与邻近点       


初学者很容易误会,以为SOM训练时所用的邻近聚类点就是目标聚类点附近的聚类点
 其实不是,SOM训练时使用的“邻近聚类点”有自己的定义

SOM是先引入一个拓扑结构,把所有聚类点连结在一起,然后籍此来定义距离
 
拓扑结构与距离
 SOM聚类点的拓扑结构可以是一维的,二维的,三维的,或者更高维的
 但SOM中最常用是二维的六边形拓扑结构,如下:
 
SOM的六边形拓扑结构 
    在SOM中,两点的距离,则是指在拓扑结构中,这两点之间的最小边数 
 
 SOM的邻近聚类点     
SOM每次更新会把邻近聚类点一起更新
  对于点P,它的邻近聚类点是指,与P的最小连结边数小于某个阈值的聚类点
 例如,当距离阈值设置为2时,则是到达点P不超过2条边的聚类点
所以,SOM中的邻近聚类点并不是用实际距离来区分,而是按拓扑结构中的距离来区分







     02.  SOM模型表达式与结构拓扑图   




本节讲解SOM神经网络的数学表达式与拓扑图,进一步具体了解SOM是什么





   SOM神经网络的模型表达式  


SOM的模型数学表达式为:
 
  
其中,dist        :欧氏距离函数    
compet :竞争函数 
 简单来说,就是x离哪个聚类中心(即W的每一行)最近,就为1,其余为0
✍️ dist 和compet函数的计算例子   
 一、dist的计算举例                                                       
 dist为欧氏距离函数,                                       
 例如,2输入、3隐节点时,x和W如下:        
 ,
 则:                                                               
                
 
二、 compet的计算举例                                               
                 compet 为竞争函数,它将向量最大的值置为1,其余置0
 例如,compet([ 2 5 3 ]) = [ 0 1 0 ]     






     SOM神经网络拓扑图     


SOM神经网络是典型的三层神经网络
  SOM的网络拓扑图如下,第一层是输入层,第二层是隐层,第三层是输出层
 
SOM神经网络拓扑图 
 隐节点的意义如下:
1. 隐节点的意义就是聚类中心点                                               
 有多少个隐节点就代表有多少个聚类中心点               
2. 隐节点的权重W就是聚类中心点的位置                                  
 输出层的意义如下: 
1. 输出层是one-hot格式(即[0 0 0 1]这样的格式)                  
2. 输出节点个数与隐层节点个数一致,并与隐节点一一对应       
3. 输出节点的值由隐层节点竞争得到                                         
  即隐层节点哪个值最大,对应的输出节点就为1,其余为0   
    ✍️带隐层拓扑结构的SOM神经网络拓扑图    
往往还会把隐层节点之间的拓扑结构一起画上, 则SOM的网络拓扑图会如下:
 SOM神经网络拓扑图 
 往往我们看到的都是带隐节点拓扑结构的拓扑图,很容易误会,以为隐层节点之间相互连接
其实隐节点的拓扑图只在训练阶段用于获取邻域节点,与最终的模型并没有任何关系的








    03.SOM神经网络-代码实现    




本节讲解如何实现一个SOM神经网络来对样本进行聚类





     SOM神经网络DEMO代码    


下面,我们先随机初始化一些样本点,然后调用matlab的神经网络工具箱训练一个SOM神经网络
 具体代码如下:
% 本demo展示用matlab工具箱训练一个SOM神经网络
% 生成用于聚类的数据
rand('seed',70);                                   % 随机种子,设定随机种子是为了每次的结果一样
dataC = [2.5,2.5;7.5,2.5;2.5,7.5;7.5,7.5]';        % 生成四个样本中心
sn = 80;                                           % 样本个数
X = rand(2,sn)+dataC(:,mod(1:sn,4)+1);             % 随机生成样本点
											       
% 调用工具箱训练一个SOM网络                        
net = selforgmap([3 5]);                           % 建立一个SOM神经网络
net = train(net,X);                                % 训练网络
W   = net.IW{1};                                   % 网络的权重,也即各个聚类中心的位置
y   = net(X);                                      % 用训练好的网络进行预测
classes = vec2ind(y);                              % 将预测结果由one-hot格式转为类别索引

% 绘图
plot(X(1,:),X(2,:),'*');                           % 原始样本
hold on 
plot(W(:,1),W(:,2),'or','MarkerFaceColor','g');    % 网络训练好的聚类中心
运行结果如下:
 SOM神经网络代码运行结果 
 绿色的隐神经元(聚类中心),红色的是样本












  End  






联系老饼