本例中待分类的样本数据是 100 个分布在 1/4 圆弧上的矢量点。样本数据 P 采用如下方式产生:
angles = 0: 0.5*pi/99: 0.5*pi;
P = [ cos(angles); sin(angles) ];
图1中绘出了样本数据的分布图。
利用 newsom 函数建立自组织网络:
net = newsom ([0 1; 0 1], [9]);
该网络的竞争层共有 9 个神经元,即数据的类别个数。自组织网络在训练时不需要目标输出,网络通过对数据分布特性的学习,自动地将数据划分为指定的类别数。下面是完整的 MATLAB 程序:
close all
clf reset
figure (gcf);
echo on
clc
% NEWSOM——创建自组织网络
% TRAIN——对自组织网络进行训练
% SIM——对自组织网络进行仿真
pause
clc
% 产生样本数据 P
angles = 0: 0.5*pi/99: 0.5*pi;
P = [ cos(angles); sin(angles) ];
pause
clc
% 画第一幅图:样本数据分布图
plot (P(1, :), P(2, :), '*');
axis ([0 1 0 1]);
title ('Input data');
pause
clc
% 建立自组织网络
% 欲将样本数据分为 9 类,因此网络的竞争层由 9 个神经元构成
net = newsom([0 1; 0 1],[9]);
pause
clc
% 对网络进行训练
net.trainParam.epochs = 10;
net = train (net, P);
pause
clc
% 画第二幅图:画出网络神经元权值,也就是每类样本数据的聚类中心
figure;
w = net.IW{1};
plotsom (net.IW{1,1},net.layers{1}.distances);
pause
clc
% 利用一组新的输入数据检验网络性能
a = sim (net, [0.6; 0.8])
echo off
自组织神经网络进行分类的设计
自组织竞争网络对给定的输入向量能够进行分类。如果只需要对输入向量进行分类,那么自组织竞争神经网络就能够很好地完成任务。为了将输入空间进行分类,这就需要更多神经元,特别是当输入向量的密度增大时,。
%产生指定类别的样本点,并在图中绘出
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,故设置神经元数目为5,学习速率为0.1
%得到网络权值,并在图上绘出
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;
%训练网络,最大训练步数为7
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)');
%使用sim函数来对其进行分类,并得出结果,这个结果指出了哪个神经元发生了响应,也就反映了这个输入属于哪个类别
a=0;
p = [0.6 ;0.8];
a=sim(net,p)
二维自组织特征映射网络进行分类设计
自组织特征映射网络根据输入向量在输入空间的分布情况对他们进行分类。与自组织竞争网络不同的是,在自组织神经网络中邻近的神经元能够识别输入空间中邻近的部分。这样,自组织特征映射神经网络不但能够学习输入的分布情况(这点和自组织竞争网络一样),而且可以学习进行训练的输入向量的拓扑结构。
%随机生成1000个二维向量,作为样本,并绘出其分布
P = rands(2,1000);
plot(P(1,:),P(2,:),'+r')
title('初始随机样本点分布');
xlabel('P(1)');
ylabel('P(2)');
%建立网络,二维影射网络的神经元组织结构为5*6,我们希望每一个神经元对应矩形中某一个区域产生响应,邻近的神经元对应相邻的区域。
%每一个神经元用一个点表示,其坐标值为相应的权值,初始状态下这些神经元都拥有相同的权值
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)
可以看出,训练10步后,神经元就已经自组织的分布了,每个神经元开始能够区分输入空间的不同区域了。睡者训练步数的增加,神经元的权值分布更合理,但是当步数达到一定数目以后,这种改变旧非常不明显了。