% 利用竞争层网络对样本数据进行分类 %本例中待分类的样本数据由nngenc函数随机产生,即P=nngenc(range,class,num,std); 其中,参数class表示样本数据的类别个数。然后利用newc函数 %建立竞争层网络:net=newc(range,class,klr,clr); 其中,class是数据类别个数,也是竞争层神经元个数;klr和clr 分别是网络的权值学习速率 %和阈值学习速率。竞争层网络在训练时不需要目标输出,网络通过对数据分布特性的学习,自动地将数据划分为指定类别数。 %网络训练语句如下(其中,默认的训练函数为trainr):net=train(net,P); %在对训练好的网络进行仿真时,网络的输出为单值矢量组,为了观察方便,一般要将单值矢量组转化为下标矩阵的形式: % Y=sim(net,P); Y1=vec2ind(Y); %本例完整的MATLAB程序如下: close all clf reset figure(gcf); echo on clc % NEWC---创建竞争层网络 % TRAIN---对竞争层网络进行训练 % SIM---对竞争层网络进行仿真 pause clc % 产生样本数据P,P中包括三类共30个二维矢量 range=[-1 1;-1 1]; % 样本数据取值范围 class=3; % 样本数据类别数 num=10; % 每类样本数据的个数 std=0.1; % 每类样本数据的方差 P=nngenc(range,class,num,std); pause clc % 画第一幅图:样本数据分布图 plot(P(1,:),P(2,:),'*','markersize',5); axis([-1.5 1.5 -1.5 1.5]); pause clc % 建立竞争层网络(由于样本数据分为三类,因此竞争层由三个神经元构成) klr=0.1; % 权值学习速率 clr=0.01; % 阈值学习速率 net=newc(range,class,klr,clr); pause clc % 对网络进行训练 net.trainParam.epochs=5; %训练过程每五步显示一次 net=train(net,P); pause clc %在第一幅图上画竞争层神经元权值,也就是每类样本的聚类中心 w=net.IW{1}; hold on; plot(w(:,1),w(:,2),'ob'); title('Input data & Weights'); pause clc %利用原始样本数据对网络进行仿真 Y=sim(net,P); Y1=vec2ind(Y) pause clc % 画第二幅图:用不同符号标注数据分类结果 figure; for i=1:30 if Y1(i)==1 plot(P(1,i),P(2,i),'*','markersize',5); elseif Y1(i)==2 plot(P(1,i),P(2,i),'+','markersize',5); else plot(P(1,i),P(2,i),'x','markersize',5); end hold on; end axis([-1.5 1.5 -1.5 1.5]); title('class 1:* class 2:+ class 3:x'); pause clc %利用一组新的输入数据检验网络性能 p=[-0.4 -0.4;-0.1 0.9]; y=sim(net,p); y1=vec2ind(y) echo off % 程序运行结果如图所示。在图中,待分类的样本数据用星号标注,网络训练完毕后的竞争层神经元 %权值由圆圈标注。在图中,已经划分好的三类数据分别用星号、加号和“x”符号标注。 % (a) 待分类样本的数据和竞争层神经元权值 (b) 网络分类结果