加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

matlab自组织特征映射SOM神经网络程序

(2011-10-15 11:43:40)
标签:

杂谈

分类: 经典算法/数据挖掘/神经网络

%产生指定类别的样本点,并在图中绘出 
X = [0 1; 0 1];    % 限制类中心的范围 
clusters = 5;      % 指定类别数目 
points = 10;        % 指定每一类的点的数目 
std_dev = 0.05;    % 每一类的标准差 
P = nngenc(X,clusters,points,std_dev); 
plot(P(1,:),P(2,:),'+r'); 
title('输入样本向量'); 
xlabel('p(1)'); 
ylabel('p(2)'); 
%建立网络 
net=newc([0 1;0 1],5,0.1); %设置神经元数目为5 
%得到网络权值,并在图上绘出 
figure; 
plot(P(1,:),P(2,:),'+r'); 
w=net.iw{1} 
hold on; 
plot(w(:,1),w(:,2),'ob'); 
hold off; 
title('输入样本向量及初始权值'); 
xlabel('p(1)'); 
ylabel('p(2)'); 
figure; 
plot(P(1,:),P(2,:),'+r'); 
hold on; 
%训练网络 
net.trainParam.epochs=7; 
net=init(net); 
net=train(net,P); 
%得到训练后的网络权值,并在图上绘出 
w=net.iw{1} 
plot(w(:,1),w(:,2),'ob'); 
hold off; 
title('输入样本向量及更新后的权值'); 
xlabel('p(1)'); 
ylabel('p(2)'); 
a=0; 
p = [0.6 ;0.8]; 
a=sim(net,p) 

 

自组织网络应用举例应用自组织网络对输入样本进行分类。

首先利用函数nngenc生成聚类数据点,具体生成过程如下:

x=[0 1;0 1] 聚类数据点的范围;

clusters=8 聚类数;

points=10 每个聚类的数据点个数;

std_dev=0.05 聚类偏差;

p=nngenc(x, clusters, points, std_dev)

图形显示聚类数据点: plot(p(1,:),p(2,:),'+')

聚类数据点再运用函数initc初始化自组织神经网络,得到相应的网络节点和权值的初始值,再运用函数trainc对所构件的网络进行训练:

w=initc(p,8) df=25 me=1000 lr=0.1 tp=[df me lr] w=trainc(w,p,tp)

网络训练结果对训练成熟的网络,可以利用函数simuc进行仿真: p1=[0.1; 0.4] a1=simuc(p1, w) 输出仿真结果: a1 = (1, 1) 1 p2=[0.6; 0.2] a2=simuc(p2, w) 输出仿真结果: a2 = (7, 1) 1


------------------- 

example8_2 

%随机生成1000个二维向量,作为样本,并绘出其分布 
P = rands(2,1000); 
plot(P(1,:),P(2,:),'+r') 
title('初始随机样本点分布'); 
xlabel('P(1)'); 
ylabel('P(2)'); 
%建立网络,得到初始权值 
net=newsom([0 1; 0 1],[5 6]); 
w1_init=net.iw{1,1} 
%绘出初始权值分布图 
figure; 
plotsom(w1_init,net.layers{1}.distances) 
%分别对不同的步长,训练网络,绘出相应的权值分布图 
for i=10:30:100 
    net.trainParam.epochs=i; 
    net=train(net,P); 
    figure; 
    plotsom(net.iw{1,1},net.layers{1}.distances) 
end 
%对于训练好的网络,选择特定的输入向量,得到网络的输出结果 
p=[0.5;0.3]; 
a=0; 
a = sim(net,p) 
-------------------------- 

example8_3 

%指定输入二维向量及其类别 
P = [-3 -2 -2      0 +2 +2 +3;   
      0 +1 -1 +2 +1 -1 -2 +1 -1   0]; 
C = [1 1 1 2 2 2 2 1 1 1]; 
%将这些类别转换成学习向量量化网络使用的目标向量 
T = ind2vec(C) 
%用不同的颜色,绘出这些输入向量 
plotvec(P,C), 
title('输入二维向量'); 
xlabel('P(1)'); 
ylabel('P(2)'); 
%建立网络 
net = newlvq(minmax(P),4,[.6 .4],0.1); 
%在同一幅图上绘出输入向量及初始权重向量 
figure; 
plotvec(P,C) 
hold on 
W1=net.iw{1}; 
plot(W1(1,1),W1(1,2),'ow') 
title('输入以及权重向量'); 
xlabel('P(1), W(1)'); 
ylabel('P(2), W(2)'); 
hold off; 
%训练网络,并再次绘出权重向量 
figure; 
plotvec(P,C); 
hold on; 
net.trainParam.epochs=150; 
net.trainParam.show=Inf; 
net=train(net,P,T); 
plotvec(net.iw{1}',vec2ind(net.lw{2}),'o'); 
%对于一个特定的点,得到网络的输出 
p = [0.8; 0.3]; 
a = vec2ind(sim(net,p))

 

参考http://blog.sina.com.cn/s/blog_6cbd70830100veim.html

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有