淘客网站备案,网站上资源截图怎么做,社区问答网站开发,重庆市建设厅网站首页原创文章#xff0c;转载请说明来自《老饼讲解神经网络》:www.bbbdata.com 关于《老饼讲解神经网络》#xff1a; 本网结构化讲解神经网络的知识#xff0c;原理和代码。 重现matlab神经网络工具箱的算法#xff0c;是学习神经网络的好助手。 目录
一、入门原理解说
01.…原创文章转载请说明来自《老饼讲解神经网络》:www.bbbdata.com 关于《老饼讲解神经网络》 本网结构化讲解神经网络的知识原理和代码。 重现matlab神经网络工具箱的算法是学习神经网络的好助手。 目录
一、入门原理解说
01. 基于Kohonen规则的聚类算法
02. SOM聚类的思想
03. SOM神经网络的拓扑图
04. SOM的模型表达式
编后语
二、SOM-代码重写(单样本训练)
01. 代码结构说明
02. 代码运行结果解说
03. 具体代码 SOM神经网络(Self-organizing Feature Map)是Kohonen在1981年提出的一种用于聚类的神经网络是神经网络家族中经典、重要且广泛应用的一员。
本篇第一节先聚焦于讲清SOM是个什么东西解决什么问题思路是什么有什么特性 第二节则扒取matlab的源码自写《SOM-单样本训练算法》即用自己的代码逻辑重现matlab工具箱的效果。 笔者语 SOM不是一个困难的算法但要讲清SOM,却是一个困难的问题。 笔者曾想一张文章讲完SOM左揉右捏后来发现这鬼东西越图快越不行。 为什么SOM必须慢慢讲述主要是因为SOM的思想经历了三阶段 Kohonen规则 -- 单样本训练 -- 批量样本训练 想直接讲述批量样本训练根本讲不了。 谨此希望读者也不要图快一步一步来。 一、入门原理解说 01. 基于Kohonen规则的聚类算法 聚类问题 口语描述假设数据是一团团的我们希望找出这些一团团数据的中心点(聚类中心)样本离哪个聚类中心最近就将样本判为该聚类中心。 基于Kohonen规则的聚类方法 kohonen规则聚类很简单 先随机初始化k个聚类中心点 然后每次选出一个样本将离它最近的聚类点往它移动使该聚类点更靠近它如此反复m次。 更新法则如下 其中 离样本最近的聚类中心点。 : 学习率。 kohonen规则的有效性 kohonen规则虽然简单然而它却是行之有效的。 且看一个Demo 平面中有四簇数据 我们先随机初始化5个聚类中心点 然后使用Kohonen规则调整聚类中心点的位置 可以看到经过一定步数后聚类中心点移到了四类数据的中心位置附近。 Demo代码 % Kohonen聚类规则
rand(seed,70);
%------------生成样本数据-------------
dataC [2.5,2.5;7.5,2.5;2.5,7.5;7.5,7.5]; % 生成四个样本中心
sn 40; % 样本个数
X rand(sn,2)dataC(mod(1:sn,4)1,:); % 随机生成样本点% -----------初始化聚类中心点--------------
kn 5; % 聚类中心点个数
C rand(kn,2)*10; % 随机生成聚类中心
C0 C; % 备份聚类中心点的初始值% -----------使用样本训练聚类中心点-----------
lr 0.1; % 学习率
for t 1:50for i 1:sncur_x X(i,:); % 提取一个样本dist sum((repmat(cur_x,kn,1) - C).^2,2); % 计算样本到各个聚类中心点的距离[~,idx] min(dist); % 找出最近的聚类中心点C(idx,:) C(idx,:) lr*(cur_x - C(idx,:)); % 将该聚类中心点往样本靠近end
end% ----------画图------------------------
subplot(1,2,1)
plot(X(:,1),X(:,2),*);
hold on
plot(C0(:,1),C0(:,2),or,MarkerFaceColor,g);subplot(1,2,2)
plot(X(:,1),X(:,2),*);
hold on
plot(C(:,1),C(:,2),or,MarkerFaceColor,g);02. SOM聚类的思想 SOM是Kohonen规则的改进 它在更新离样本最近的聚类中心点P的的时候会把P的邻近聚类中心点也一起更新。 请注意初学者很容易误会以为SOM所指的邻近聚类点就是目标聚类点附近的聚类点其实不是SOM对“邻近聚类点”有自己的定义。 SOM聚类点的距离与邻近聚类点 SOM是先引入一个拓扑结构把所有聚类点连结在一起然后籍此来定义距离。 拓扑结构 拓扑结构可以是一维的二维的三维的等等最常用是二维 例如最常用的二维六边形拓扑结构 距离的定义 在SOM中两点之间的距离 是指在引入的拓扑结构中这两点之间的最小边数。 邻近聚类点 点P的邻近聚类点是指与P的最小连结边数小于某个阈值的聚类点。 例如 当邻域距离阈值为1时点P的邻近聚类点是与点P直接连接的点。 当邻域距离阈值为2时则是到达点P不超过2条边的聚类点。 当邻域距离阈值为k时就是指经过mmk)条边可达点P的聚类点。 SOM的更新方法 SOM更新的方法与上面所说的Kohonen规则思想是一样的 不同点在于SOM在更新离样本最近的聚类中心点P的的时候会把P的邻近聚类中心点也一起更新
更细节的有以下三点 1、更新邻近聚类点 更新样本最近点P的同时P的邻近聚类点也一起更新(P的学习率要比邻近聚类点更大一些)。 2、增加学习率的收缩机制 随着更新步数学习率越来越小。 3、邻近距离收缩机制 随着更新步数邻近距离阈值越来越小渐渐的只有目标点及其邻边聚类点。 比起纯粹的Kohonen规则虽然改动不大在代码编写上却要复杂很多。 复杂是因为要初始化拓扑结构获得点与点之间的距离矩阵(这里说的距离是上面所说的边数)以便在更新时获取邻近聚类点。 说 明 ● 以上的更新方法来自matlab老版本的单样本训练算法(learnsom)。 ● matlab新版本已采用了批量更新算法(learnsomb)。 两种方法的细节我们都另起文章细讲并扒出源码重现matlab的实现逻辑。 03. SOM神经网络的拓扑图 网络拓扑图 SOM神经网络是典型的三层神经网络 拓扑图如下 第一层是输入层 第二层是隐层 隐层有多少个隐节点就代表有多少个聚类中心点 ( 聚类中心点的位置就是该隐节点与输入的连接权重 ) 。 第三层是输出层 输出层是one-hot格式即[0 0 0 1]这样的格式 它的节点与隐层节点个数一致 它的值由隐层节点竞争得到 即隐层节点哪个值最大对应的输出节点就为1其余为0。 带隐层拓扑的网络拓扑图 往往还会把隐层节点之间的拓扑结构一起画上 则SOM的网络拓扑图会如下 PASS:输出节点之间的拓扑结构对于最终模型的应用上是没有任何影响的它只是在训练过程中需要使用。 04. SOM的模型表达式 SOM的模型数学表达式为 其中 ● dist 为x和W的欧氏距离 例如2输出3隐节点时 , 则 ● compet 为竞争函数,
它将向量最大的值置为1其实置0 例如compet([ 2 5 3 ]) [ 0 1 0 ] SOM模型输出的计算简单来说就是x离W哪行最近就为1其余为0.
背后意义就是离哪个聚类中心点近就判为哪个聚类点。 编后语
本文我们先大概摸清SOM神经网络是什么 它的思路其实并不复杂只是Kohonen的基础上在隐节点引入了一个拓扑结构来定义邻域 由于我们往往看到的基本都是带隐节点拓扑结构的网络拓扑图很容易产生误会以为隐层节点间相互连接 其实隐节点的拓扑图只在训练阶段用于获取邻域节点与最终的模型并没有任何关系。 在接下来的文章我们把SOM的代码按matlab内部逻辑实现后我们将更清晰SOM算法的具体细节与算法流程。 二、SOM-代码重写(单样本训练) 本文是笔者细扒matlab2009b神经网络工具箱newsom的源码
在源码的基础上去除冗余代码重现的简版newsom代码代码与newsom的结果完全一致。 通过本代码的学习可以完全细节的了解SOM单样本训练的实现逻辑。 01. 代码结构说明 代码主要包含了三个函数 testSomNet trainSomNet predictSomNet testSomNet: 测试用例主函数直接运行时就是执行该函数。 1、数据生成随机生成一组训练数据 2、用自写的函数训练一个SOM网络与预测结果。 3、使用工具箱训练一个SOM网络。 4、比较自写函数与工具箱训练结果是否一致(权重、训练误差的比较) trainSomNet网络训练主函数用于训练一个SOM神经网络。 单样本训练方式训练一个SOM神经网络 predictSomNet用训练好的网络进行预测。 传入需要预测的X与网络的权重矩阵即可得到预测结果。 02. 代码运行结果解说 运行代码后得到预测结果与对比结果如下 从中可以看到自写代码与工具箱的逻辑一致。 相关文章
《BP神经网络梯度推导》
《BP神经网络提取的数学表达式》
《一个BP的完整建模流程》