本站原创文章,转载请说明来自《老饼讲解-BP神经网络》www.bbbdata.com
本文展示如何用matlab工具箱训练一个SOM神经网络的DEMO
并讲解其中的代码含义和相关使用说明
本节展示一个用matlab工具箱实现的SOM神经网络代码DEMO
本文说明
下面,我们先随机初始化一些样本点,
然后调用matlab的神经网络工具箱训练一个SOM神经网络
并借此DEMO讲解如何用matlab工具箱SOM神经网络的使用
SOM神经网络DEMO代码
% 本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'); % 网络训练好的聚类中心
运行结果
运行结果如下
绿色的隐神经元(聚类中心),红色的是样本
本节讲解matlab工具箱如何训练一个SOM神经网络,及一些常用的问题
如何训练一个SOM神经网络
从上面的例子我们可以看到,
使用selforgmap函数就可以建立一个SOM神经网络,
然后用train函数对网络进行训练(需要传入训练的数据),
最后把要预测的样本传入训练好的net中,就可以得到预测结果
如下
net = selforgmap([3 5]);
net = train(net,X);
y = net(X);
PASS:selforgmap中的[3 5]用于指定隐节点拓扑为3*5,即15个隐节点
✍️关于selforgmap的入参说明
selforgmap共有5个入参:
dimensions :行向量,它定义了隐层神经元尺寸
例如[8 3]定义了2维(8*3)的隐层
coverSteps :在该步数之后,领域距离<=1,即不再更新邻域神经元
initNeighbor :初始的邻域阈值
topologyFcn :隐层拓扑结构函数
distanceFcn :拓扑距离计算函数
默认参数为:selforgmap([8 8],100,3,'hextop',linkdist')
常见问题
如何将one-hot形式的判别结果转为类别序号
net(X)得到分类结果的是one-hot形式,
即得到的结果是这种形式
为了直接得到类别的序号3,而不是,
可以通过vec2ind函数将转为3
如何查看类别中心
SOM神经网络的权重W就是各个类别中心
用net.IW{1}就可以提取出来
如下,就是15个聚类中心的位置
相关的绘图函数
另外,工具箱还附带了相关的绘图函数
可以画出较好看的SOM相关图片
👉plotsomhits
👉plotsomnc
👉plotsomnd
👉plotsomplanes
👉plotsompos
👉plotsomtop
但基本都是只有数据是二维时才能使用/或才具有意义
因此老饼不再讲解,需要了解的自行在matlab里help一下
End