3 自组织映射
目录
一 引言
自组织映射是一种基于拓扑表示法的数据降维技术
二 关于自组织映射简单入门那些事
自组织映射算法需要反复迭代一些简单的操作,在目标数据很小时,自组织映射与k均值聚类非常相似;在目标数据集较大时,自组织映射就会用一种强大的方式展现复杂数据集的拓扑结构
自组织映射是由许多节点构成的网络(一般是矩形或者六边形),每个节点都包含一个权重向量,该权重向量的维度与输入数据集相同,节点可以随机初始化,但是与数据集分布大致相似的初始化能使算法训练的更快,算法会随着观测值的输入而迭代
- 找出现有配置下的激活节点,也就是最佳匹配单元(BMU),通过度量输入向量与所有权向量间的欧几里得距离,可以决定BMU
- 根据输入向量调整BMU(将BMU向输入向量移动)
- 通常以较小量调整临近节点,临近节点调整的幅度由邻域函数决定
该过程会重复很多次,并运用合适的取样方法,直到网络收敛(当新输入项增加时,损失无法进一步降低)
输入数据集的拓扑结构可以用一个低维映射来存储并进行可视化
学习率 = 学习率 /(1 + 0.5 * t) # t为迭代指数
import numpy as np
from sklearn. datasets import load_ digits
from som import Som
from pylab import plot, axis, show,pcolor, colorbar, bone
digits=load_digits()
data= dfgits.data
labels= digits target
som=som(16,16,64, sigma=1.0 learning_rate=0.5
som. random_weights_init (data)
print(Initiating SOM.)
som. train_random(data, 10000)
bone()
print ("\n. SOM Processing Complete")
pcolor(som. distance_map() .T)
colorbar()
这里我们使用了 Sompy文件中定义的m类,该类包含了我们用来实现自组织映射算法的方法。我们将提供映射的维度(经过一系列尝试后,本例将16×16作为网格规模,因为这样的网格规模能够给特征映射留有充足的延伸空间,即使仍可能存在一些簇间的重叠)和输入数据的维度(用来确定自组织映射节点的权重向量的维度作为函数的参数,同时提供 sigma值和学习率本例中的 sigma定义了邻域函数的覆盖范围如前文所述,我们使用的是高斯邻域函数。最恰当的 sigma值与网格规模有关。对8×8的网格来说, sigma的值一般取1.0,而本例16×16的网格对应的最佳 sigma值为1.3。sigma取值不恰当是很容易发 sigma现的。当过小时,数据点会在网格的中心聚集;当 sigma过大时,网格中心就会出现若干较大空白。
接下来给每个定义标签并分配颜色,以便在自组织映射图像中区分他们,然后遍历每个数据点,每次迭代,都要根据自映射算法的计算结果标出表明类的BMU,自组织映射结束迭代时,需要添加U矩阵(一种表示相对观测密度的颜色矩阵)作为一个单色图层
labels[kabels == '0'] = 0
labels[kabels == '1'] = 1
labels[kabels == '2'] = 2
labels[kabels == '3'] = 3
labels[kabels == '4'] = 4
labels[kabels == '5'] = 5
labels[kabels == '6'] = 6
labels[kabels == '7'] = 7
labels[kabels == '8'] = 8
labels[kabels == '9'] = 9
markers = ['o','v','1','3','8','s','p','x','D','*']
colors ["r","g","b","y","c",(0,0.1,0.8),(1,0.5,0),(1,1,0.3),(0.4,0.6,0)]
for cnt, xx in enumerate(data):
w =som. winner (xx)
plot(w[0].5,w[1]+.5,markers [1abels[cnt]],
markerfacecolor='None', markeredgecolorcolors [labels(cnt]],
markersize=12, markeredgewidth=2)
axis([0,som. weights.shape[0],0, som.weights.shape [1]])
show()