SelforganizingmapinR自组织映射网络在R中的实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

自组织映射网络在R 中的实现
Self organizing map in R
一,结构和主要原理
自组织映射网络是由T. Kohonen 于1980提出的,参考陈桂霞,黄重光《自組織映射圖網路簡介》一文。

其原理主要是基于竞争性的同类相聚,即同类的神经元或者说数据节点具有相同的数据特征。

自组织映射网络主要包含输出层,输入层和网络连接加权。

输出层即网络拓扑,最常见的几种网络拓扑结构矩形图,六边形图。

下图所示为8 x 8的平面网络拓扑。

它代表神经元。

在SOM 自组织网络映射中,输入层为单一的数据维度。

在训练中,样本直接进入输出层单元。

网络连接加权值代表着点与点之间的相似性情况,SOM 网络会通过距离函数施加对邻近数据点的影响。

常用的正态分布函数和指数分布函数,函数呈现递减的趋势。

总体来说,拓扑结构和距离函数共同控制着神经元数据节点的相似度。

拓扑结构本身是对于数据节点的一个距离定义。

距离函数将节点之间的拓扑距离做映射,使得神经元数据节点实现了近同远异的变化模式,从而模拟了人神经元相似相聚的特点。

二,过程简述
预定义的参变量包括:影响半径R ,半径收缩常数R_factor ,初始学习率ETA ,学习效率收缩常数ETR_factor, 网络拓扑结构,初始化的权重矩阵。

24
681234
5
67pos[, 2]
p o s [, 1]
1
234567
8
1
234
5678
pos[, 2]
p o s [, 1]
实例简介参考陈桂霞,黄重光《自組織映射圖網路簡介》,实现方式为R语言平台。

模拟数据为平面内四个半径为5的圆内随机点,如下图所示:
R语言代码如下
x=runif(200,5,15) #从5到15的均匀分布中随机取200个点
y=runif(200,35,45)
d=sqrt((x-10)^2+(y-40)^2) #求其距离
c1=cbind(x,y,d)
c1=c1[c1[,3]<=5,] #筛选出圆内点
c1=c1[,1:2]
x=runif(200,30,40)
y=runif(200,30,40)
d=sqrt((x-35)^2+(y-35)^2)
c2=cbind(x,y,d)
c2=c2[c2[,3]<=5,]
c2=c2[,1:2]
x=runif(200,0,10)
y=runif(200,0,10)
d=sqrt((x-5)^2+(y-5)^2)
c3=cbind(x,y,d)
c3=c3[c3[,3]<=5,]
c3=c3[,1:2]
x=runif(200,35,45)
y=runif(200,5,15)
d=sqrt((x-40)^2+(y-10)^2)
c4=cbind(x,y,d)
c4=c4[c4[,3]<=5,]
c4=c4[,1:2]
dat=rbind(c1,c2,c3,c4)
plot(dat,pch=8,cex=.5,col=4)
四个圆的圆心分别为(10,40)(35,35)(5,5)(40,10),利用SOM的分类学习特点将其分类。

R=0.05 #影响半径
R_rate=0.8 #收敛速率
R_factor=1 #初始值
ETA=1 #学习初始值
ETA_rate=0.8 #学习效率
dist=rep(0,map_col*map_row)
d=rep(0,map_col*map_row)
totaldis=rep(0,totalnum)
totalnum=50; #total training number
count=0; #recording training number
topology="rectangle" #拓扑结构
#四个圆,故而精确的设置为四类2x2矩阵
map_col=2 #拓扑横向数据节点数
map_row= 2 #拓扑纵向数据节点数
#构建网络拓扑结构,网络拓扑结构的本质在于顺序和距离。

所以本例中,用一个数据定义拓扑网络的#顺序,而其对应的另一个矩阵变量则包含其对应的网络坐标。

本质上,六变形拓扑也是一种不同的距离定#义。

map=matrix(1:(map_col*map_row),map_row,map_col,byrow=T)
pos=matrix(1:(map_col*map_row*2),map_row*map_col,2) #the coodinate of the topology map
if(topology == "rectangle"){
for(i in 1:(map_col*map_row)){
for(j in 1:nrow(map)){
for(k in 1:ncol(map)){
if(map[j,k]==i){
pos[i,1]=k; #横坐标
pos[i,2]=j; #纵坐标
}
}
}
}
}
if(topology == "hexgonal") {
for(i in 1:(map_col*map_row)){
for(j in 1:nrow(map)){
for(k in 1:ncol(map)){
if(map[j,k]==i){
pos[i,1]=k;
pos[i,2]=j;
}
}
}
}
mode=0;
for(i in 1:(map_col*map_row)){
if(i %% map_col ==1){
mode=mode+1;
}
for(j in 1:nrow(map)){
for(k in 1:ncol(map)){
#从矩形拓扑中演化出六边形拓扑,此处纯粹是本人的理解。

if((map[j,k]==i) && (i<=map_col)){
pos[i,1]=j;
pos[i,2]=k;
}
if((map[j,k]==i) && ((mode%%2)==0) && (i > map_col)){
pos[i,1]=pos[i-map_col,1]+sin(2*pi/3);
pos[i,2]=pos[i-map_col,2]+0.5;
}
if((map[j,k]==i) && ((mode%%2)==1) && (i > map_col)){
pos[i,1]=pos[i-map_col,1]+sin(2*pi/3);
pos[i,2]=pos[i-map_col,2]-0.5;
}
}
}
}
#plot(pos[,2],pos[,1],col=c(1:map_col))
}
#随机化输入矩阵,
y=sample(1:nrow(dat))
dat1=dat
for(i in 1:nrow(dat)){ dat1[i,]=dat[y[i],]}
dat=dat1[1:200,]
#以平均值初始化权重矩阵
weight=matrix(runif(map_col*map_row*ncol(dat),min(dat),max(dat)),map_col*map_row,ncol(dat))
作形象化的概念理解,网络拓扑如上图的网格点,权重即为每个节点的上的蓝线,这些蓝线代表了所
属类型的典型数据特征,同训练数据具有相同的数据维度。

右侧凌乱的短线为训练数据,通过的训练数据的归类和对权重的修改,使得事先定义的距离最小化,以完成收敛过程。

W(i)=W(i)+ETA*(w[i,m]-weight[n,m])*R_factor
ETA=ETA*ETA_factor
plot(1:50,1:50,xlim=c(0,50),ylim=c(0,50),type="n")
while(count < totalnum) { #完成训练次数
for(i in 1:nrow(dat)) {
for(k in 1:nrow(weight)){
for(j in 1:ncol(dat)) {
d[k]=d[k]+(weight[k,j]-dat[i,j])^2; 计算距离
}
d[k]=sqrt(d[k])
}
i_min=which.min(d)
#caluculate the nearest distance
for (m in 1:nrow(pos)){
dist[m]=sqrt((pos[m,1]-pos[i_min,1])^2+(pos[m,2]-pos[i_min,2])^2)
}
for (n in 1:nrow(weight)){
for(m in 1:ncol(weight)){
R_factor=exp(-dist[n]/R)
weight[n,m]=weight[n,m]+ETA*(dat[i,m]-weight[n,m])*R_factor #权重矩阵的调整公式}
}
for(s in 1:nrow(weight)){
points(weight[s,1],weight[s,2],col=s)
}
totaldis[count]=totaldis[count]+d[i_min]
}
ETA=ETA_rate*ETA;
R=R_rate*R
count=count+1;
}
将权重的变化plot如下图,四个权重精确的匹配到圆心。

9.817267 39.643520
34.795443 34.952146
5.265513 4.776607
40.444490 9.532965
调整初始的影响半径R=2, 茹下图,收敛速度减慢,以四个圆心的平均值散射。

在半径不变的情况下R=2,R_factor由0.8调整为0.08,如上右图所示,收敛速度加快。

以训练次数为横轴,训练集到各自距离最小圆心距离之和为纵轴,看出20次左右训练后,总体稳定。

相关文档
最新文档