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
end
%对于训练好的网络,选择特定的输入向量,得到网络的输出结果
p=[0.5;0.3];
a=0;
a = sim(net,p)
--------------------------
example8_3
%指定输入二维向量及其类别
P = [-3 -2 -2
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))