本文来自《老饼讲解-BP神经网络》https://www.bbbdata.com/
目录
- 一、什么是SOM神经网络
- 二、如何训练一个SOM神经网络
-
- [2.1. 训练一个SOM神经网络的代码示例](#2.1. 训练一个SOM神经网络的代码示例)
- [2.2. 如何查看SOM神经网络的聚类中心](#2.2. 如何查看SOM神经网络的聚类中心)
SOM神经网络全称为自组织竞争神经网络(Self-organizing Feature Map),它是Kohonen在1981年提出的一种用于聚类的神经网络,本文讲解如何一步一步训练一个SOM神经网络。
一、什么是SOM神经网络
1.1.SOM神经网络有什么用
SOM神经网络主要用来解决聚类问题,聚类问题是一种无监督学习,就是对样本进行分类,
通过算法,找出N个聚类中心,样本离哪个聚类中心最近,就将样本判为哪一个类别。
如上示所,经过聚类算法后,将样本划分为不同的类别。
1.2.SOM神经网络是如何聚类的
SOM按一个固定的拓扑初始化聚类中心,如下所示就是SOM常用的六边形拓扑结构
进一步地,根据Kohonen规则更新聚类中心,SOM与Kohonen的不同是,SOM会把邻近的聚类中心一起更新(这就是为什么SOM会引入拓扑结构来连结各个聚类中心了)。
以神经网络的拓扑图来展示SOM神经网络时,则如下:
输入是样本,隐层的各个隐节点就是各个聚类中心,最终样本离哪个聚类中心最近,就判断样本属于哪个类别。
二、如何训练一个SOM神经网络
2.1. 训练一个SOM神经网络的代码示例
在matlab中可以使用selforgmap来训练一个SOM神经网络,示例代码如下:
matlab
% 本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神经网络已经基本较为合理地将样本进行聚类了。
2.2. 如何查看SOM神经网络的聚类中心
SOM神经网络的权重W就是各个聚类中心,只需要使用用net.IW{1}就可以提取出来,如下所示:
上面就是我们训练得到的15个聚类中心的位置了。
相关链接:
《老饼讲解-机器学习》:老饼讲解-机器学习教程-通俗易懂
《老饼讲解-神经网络》:老饼讲解-matlab神经网络-通俗易懂
《老饼讲解-神经网络》:老饼讲解-深度学习-通俗易懂