本站原创文章,转载请说明来自《老饼讲解-BP神经网络》bp.bbbdata.com
本算法来源于旧版matlab2009b ,使用的是单样本训练方法(matlab中的learnsom文件),
该算法相对简单、原汁原叶、易理解,是理解批量更新算法的基础。
相关文章
基础原理参见文章《SOM基本原理》
代码实现参见《SOM-代码重写(单样本训练)》
整体流程如下:
1、生成拓扑结构,并由拓扑结构算得矩阵距离
2、初始化聚类点中心
3、单样本训练w,训练n次:
-----用收缩法计算本次学习率lr
-----用收缩法计算本次邻域范围dn
-----计算本次竞争胜出神经元编号及邻域神经元
-----使用kohonen规则对竞争胜出神经元的权重wk更新
-----使用kohonen规则对邻域神经元的权重进行弱更新
4、输出训练好的w(聚类中心点的位置)
共分为两步,
(1) 生成目标拓扑结构
(2) 生成拓扑点之间的距离矩阵
例 子
以生成一个3x5的六边形拓扑结构为例,
先生成3x5的六边形拓扑结构(包括拓扑点的位置和连线),
再生成拓扑点间的距离矩阵。
在matlab中可以使用hextop生成六边形拓扑结构,并由linkdist函数得到距离矩阵,如下
pos = hextop([3,5]);
d = linkdist(pos);
拓扑点与聚类中心点是一一对应的,因此,拓扑点之间的距离矩阵,就是聚类中心点的距离矩阵。
初始化聚类中心点的位置,也就是初始化输入层到输出层的权重矩阵w.
不妨把所有聚类点初始化到样本数据的中心点,
即对所有的(w的第i行,即第i个聚类点的位置)都有:
w的训练采用单样本训练,即训练n次,每次把样本逐个依次训练w.
每次单样本训练流程如下:
单样本训练主流程
(1) 计算本次竞争胜出神经元
先算出样本所属的聚类点k, 即网络的输出(竞争胜出的输出神经元)的编号。
(2) 对胜出神经元进行kohonen更新
对聚类点k的位置作如下更新:
(3) 对胜出神经元的邻域聚类点进行弱更新
对聚类点k的邻域聚类点( )的位置作如下更新:
式中的学习率 lr 和邻域的范围dn采用收缩算法确定。
学习率与邻域范围的收缩
(1) 学习率
学习率lr采用收缩算法,随迭代次数递减:
其中, lr0 ,lr1 ,T 是待设参数。
该式的意思是,在0-T步,lr先以线性收缩方式从lr0收缩到lr1, 之后以负一次幂的速度收缩。
(2) 邻域范围
邻域范围也采用收缩算法,随迭代次数从最大距离递减到1
其中,dmax为聚类点间的最大距离。
该式的意思是,在0-T步,dn以线性收缩方式 从dmax收缩到1,之后保持为1.即刚开始时,所有聚类点都会被更新,到最后只更新相邻的聚类点。
End