竞争型神经网络续1

原创
2017/12/30 21:00
阅读数 43

1.竞争神经网络函数

1.1创建函数

1.1.1 newc函数

newc函数用于创建一个竞争层,这是一个旧版本的函数,现在用competlayer函数代替。函数调用格式:

net = newc(range,class,klr,clr);

其中,class是数据类别个数,也是竞争层神经元的个数;klrclr分贝是网络的权值学习速率和阈值学习速率。竞争型网络在训练时不需要目标输出,网络通过对数据分布特性的学习,自动地将数据划分为制定类别数。

返回参数net是一个新的竞争层。该网络采用negdist作为权值函数,netsum作为网络输入函数,以及compet作为传输函数。除了权值以外,网络还包含一个阈值,权值和阈值使用midpointinitcon函数进行初始化。

p=[0.1 0.8 0.1 0.9;0.2 0.9 0.1 0.8];

% 创建自组织竞争神经网络

net=newc(p,2);

% 训练神经网络

net = train(net,p);

% 网络仿真

y = sim(net,p)

yc = vec2ind(y)

1.1.2 competlayer函数

competlayer函数创建一个竞争网络层,它根据输入样本之间的相似性对其及逆行分类,分类的类别数是给定的。该函数总是倾向于给每一个类别分配相同数量的样本,尽量均衡地进行分配。函数的调用格式为:

competlayer(numClass,kohonenLR,conscienceLR)
   其中,输入参数numClass为分类的类别数;kohonenLRKohonen学习率;conscienceLR为“良心”学习率,即阈值学习规则的学习率。

inputs=iris_dataset;

net=competlayer(6);

net=train(net,inputs);

view(net)

outputs=net(inputs)

classes=vec2ind(outputs)

1.1.3 newsom函数

newsom函数可以创建一个自组织特征映射网络,在新版本中使用selforgmap代替。函数调用格式如下:

net = newsom(PR,[d1,d2,...],tfcn,dfcn,olr,osteps,tlr,tns)

输入参数PRR个输入元素的最大值和最小值的设定值,Rx2维矩阵;di为第i层的维数,默认[5,8]tfcn为拓扑函数,默认为hextopdfcn为距离函数,默认为linkdistolr为分类阶段学习速率,默认为0.9osteps为分类阶段的步长,默认为1000tlr为调谐阶段的学习速率,默认为0.02tns为调谐阶段的邻域距离,默认为1。输出参数net为生成的自组织特征映射神经网络。

1.1.4 selforgmap函数

利用数据本身的相似性和拓扑结构对数据进行聚类。

x=simplecluster_dataset;

plot(x(1,:),x(2,:),'mo');

net = selforgmap([8 8]);

net = train(net,x);

y = net(x);

classes = vec2ind(y);

figure;

hist(classes,64)

1.1.5 newlvq函数

newlvq函数用于创建学习向量量化LVQ网络,在新版中使用lvqnet代替。函数的调用格式如下:

net = newlvq(PR,S1,PC,LR,LF)

其中,输入参数PR为一个Rx2维输入矩阵,它决定了输入向量的最小值和最大值,R为输入向量的个数;S1表示隐含层神经元的数目;PC表示在第二层的权值中列所属类别的百分比;L表示学习速率,默认值为0.01LF表示学习函数,默认值为learnlvq;输出参数为生陈大哥学习向量量化网络。

1.1.6 lvqnet函数

lvqnet(hiddenSize,lvqLR,lvqLF)

其中,参数hiddenSize是竞争层神经元个数,lvqLR为学习率,lvqLF为学习函数

[x,t]=iris_dataset;

net = lvqnet(10);

net.trainParam.epochs = 50;

net = train(net,x,t);

view(net)

y=net(x)

perf = perform(net,y,t)

classes = vec2ind(y);

1.2 学习函数

1.2.1 learnk函数

1.2.2 learnis函数

1.2.3 learnos函数

1.2.4 learnh函数

1.2.5 learnhd函数

1.2.6 learnsom函数

1.2.7 learnlv1函数

1.2.8 learnlv2函数

1.3 传递函数

A = softmaxN,FP):NSxQ,包含Q个长度为S的列向量,对每个列向量分别求最大值,返回同类型矩阵A,在每一列的最大值对应位置,A中的元素为1,其余元素为0A中的每一列中有且只有一个元素等于1

1.4 初始化函数

W=midpoint(S,PR):参数S为神经元的数目;PR为输入向量取值范围的矩阵,W为函数返回权值矩阵

1.5 结构函数

1.5.1 gridtop函数

该函数用于创建自组织映射网络中输出层的网络拓扑结构。函数调用格式为:

pos = gridtop(dim1,dim2,...,dimN)

1.5.2 hextop函数

该函数用于创建一个二维的六边形神经网络

1.5.3 randtop函数

该函数用于创建一个二维的随机层神经网络

1.5.4 tritop函数

该函数用于创建一个二维的三角拓扑结构

1.6 距离函数

1.6.1 boxdist函数

boxdist函数用于求得的距离是向量个分量绝对差的最大值

1.6.2 linkdist函数

linkdist函数为链接距离函数,在给定神经元位置后,该函数用于计算神经元之间的距离。

1.6.3 Manhattan函数

该函数用于计算曼哈顿距离,曼哈顿距离是指出租车几何距离,相当于向量之差的1-范数。计算公式为:

Manhatten函数的调用格式为:

z=mandist(W,P)

其中,参数WRxQ矩阵,每列是一个输入的样本向量,共Q个严格吧你。PSxQ权值矩阵。函数返回每个样本向量与相应输出神经元权值向量的曼哈顿距离。

1.7 距离绘图函数

1.7.1 plotsom函数

该函数用于自组织特征映射网络的权值图

1.7.2 plotvec函数

该函数用于显示LVQ网络,函数的调用格式为:

plotvec(X,C,M)

其中,输入参数X为一个列向量矩阵;C为标记颜色坐标的行向量;M为指定绘图时向量的标记符号,默认值为“+”。

1.8 归一化函数

[Y,PS]=mapminmax(X,YMIN,YMAX)

其中,函数将X中的值归一化到[-1,1]区间,X可以是矩阵或元胞数组。归一化的结果保存在Y中,PS保存了归一化信息,可以用来做数据的反归一化。

自组织竞争神经网络的应用

2.1 对应传播网络的应用

创建一个CPN网络,完成在已知一个人本星期应该完成的工作量和此人当时的思乡情绪,对此人星期日下午的活动安排提出建议。

工作量

思想情绪

活动安排

目标输出

没有0

0

看画报

10000

有一些0.5

0

看画报

10000

没有0

一般0.5

购物

01000

很多1

1

散步

00100

有一些0.5

1

吃饭

00010

很多1

一般0.5

工作

00001

clear all;

clc;

% 初始化正向权值w和反向权值v

w=rand(18,2)/2+0.5;

v=rand(5,18)/2+0.5;

% 输入向量p和目标向量t

p=[0 0;0.5 0;0 0.5;1 1;0.5 1;1 0.5];

t=[1 0 0 0 0;1 0 0 0 0;0 1 0 0 0;0 0 1 0 0;0 0 0 1 0;0 0 0 0 1];

t_out=t;

% 设定学习步数为1000

epoch=1000;

% 归一化输入向量p

for i=1:6

    if p(i,:)==[0 0];

        p(i,:)=p(i,:);

    else

        p(i,:)=p(i,:)/norm(p(i,:));

    end

end

% 开始训练

while epoch>0

    for j=1:6

%         归一化正向权值w

        for i = 1:18

        w(i,:)=w(i,:)/norm(w(i,:));

        s(i)=p(j,:)*w(i,:)';

        end

        

%     求输出为最大的神经元

         temp=max(s);

         for i= 1:18

             if temp==s(i)

                 count=i;

             end

%              将所有竞争层神经元的输出置为0

             for i=1:18

                 s(i)=0;

             end

%              将获胜神经元的输出置为1

             s(count)=1;

%              权值调整

             w(count,:)=w(count,:)+0.1*[p(j,:)-w(count,:)];

             w(count,:)=w(count,:)/norm(w(count,:));

             v(:,count)=v(:,count)+0.1*(t(j,:)'-t_out(j,:)');

% 计算网络输出

             t_out(j,:)=v(:,count)';

         end

         epoch=epoch-1;

    end

%     训练结束

end

t_out

% 网络回想,其输入模式为pc

pc=[0.5 1;1 1];

% 归一化

for i=1:2

    if pc(i,:)==[0 0]

        pc(i,:)=pc(i,:);

    else

        pc(i,:)=pc(i,:)/norm(pc(i,:));

    end

end

%

% 网络输出

outc=[0 0 0 0 0;0 0 0 0 0];

% outc

for j=1:2

    for i=1:18

        sc(i)=pc(j,:)*w(j,:)';

    end

    tempc = max(sc);

    for i=1:18

        if tempc==sc(i)

            countp=i;

        end

        sc(i)=0;

    end

    sc(countp)=1;

    outc(j,:)=v(:,countp)';

end

outc

for j=1:2

    for i=1:18

        outc(j,:)=outc(j,:)/norm(outc(j,:));

    end

end

outc

 

2.2 学习向量量化网络的应用

p=[-3 -2 -2 0 0 0 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);

i=1;

cla;

for i=1:10

    if c(i)==1

        plot(p(1,i),p(2,i),'b+')

        hold on

    else

        plot(p(1,i),p(2,i),'r*')

        hold on

    end

end

net = newlvq(minmax(p),4,[0.6 0.4],0.1);

hold on

w1=net.iw{1};

plot(w1(1,1),w1(1,2),'p');

% 设置网络训练参数

net.trainParam.epochs=150;

net.trainParam.show=Inf;

net=train(net,p,t);

w1=net.iw{1};

w2=vec2ind(net.LW{2});

i =1;

cla;

for i=1:10

    if c(i)==1

        plot(p(1,i),p(2,i),'p')

        hold on

    else

        plot(p(1,i),p(2,i),'o')

        hold on

    end

end

j=1;

for j=1:4

    if w2(j)==1

        plot(w1(j,1),w1(j,2),'p','markersize',15);

        hold on;

    else

        plot(w1(j,1),w1(j,2),'o','markersize',15);

        hold on;

    end

end

训练后的网络已经基本可以将数据分为两类

2.3 自组织映射网络的应用

使用SOM神经网络诊断柴油机故障步骤如下:

(1)选取标准故障样本;

(2)对每一种标准故障样本进行学习,学习结束后,对具有最大输出的神经元标以该故障的记号;

(3)将待检样本输入到SOM神经网络中;

(4)如果输出神经元所在输出层的位置与某标准故障样本位置相同,说明待检样本发生了相应的故障;如果输出神经元在输出层的位置介于很多标准故障之间,说明这几种标准故障都有可能发生,且各故障的称嘀咕由该位置与相应标准样本位置的欧氏距离确定。

故障原因

P1

P2

p3

p4

p5

p6

p7

p8

T1

0.9325

1

1

-0.4635

0.3895

1

1

1

T2

-0.4571

-0.2854

-0.9024

-0.9121

-0.0841

1

-0.2871

0.5647

T3

0.5134

0.9413

0.9711

-0.4187

0.2855

0.8546

0.9478

0.9512

T4

0.1545

0.1564

-0.5

-0.6571

-0.3333

-0.6667

-0.3333

-0.5

T5

0.1765

0.7648

0.4259

-0.6472

-0.0563

0.1726

0.5151

0.4212

T6

-0.6744

-0.4541

-0.8454

1

-0.8614

-0.6714

-0.6279

-0.6785

T7

0.4647

0.871

0.0712

-0.7845

-0.2871

0.8915

0.6553

0.6152

T8

0.6818

1

-0.625

-0.8426

-0.6215

-0.1574

1

0.7782

 

clear all;

p=[0.9325   1   1   -0.4635 0.3895  1   1   1;...

-0.4571 -0.2854 -0.9024 -0.9121 -0.0841 1   -0.2871 0.5647;...

0.5134  0.9413  0.9711  -0.4187 0.2855  0.8546  0.9478  0.9512;...

0.1545  0.1564  -0.5    -0.6571 -0.3333 -0.6667 -0.3333 -0.5;...

0.1765  0.7648  0.4259  -0.6472 -0.0563 0.1726  0.5151  0.4212;...

-0.6744 -0.4541 -0.8454 1   -0.8614 -0.6714 -0.6279 -0.6785;...

0.4647  0.871   0.0712  -0.7845 -0.2871 0.8915  0.6553  0.6152;...

0.6818  1   -0.625  -0.8426 -0.6215 -0.1574 1   0.7782];

net=newsom(minmax(p),[6 6]);

plotsom(net.layers{1}.positions);

% 7次训练

a=[10 30 50 100 200 500 1000];

% 随机初始化一个7*8向量

yc=rands(7,8);

% 训练次数为10

net.trainParam.epochs=a(1);

% 训练网络和查看分类

net=train(net,p);

y=sim(net,p);

yc(1,:)=vec2ind(y);

plotsom(net.iw{1,1},net.layers{1}.distances)

 

% 训练次数为30

net.trainParam.epochs=a(2);

% 训练网络和查看分类

net=train(net,p);

y=sim(net,p);

yc(2,:)=vec2ind(y);

plotsom(net.iw{1,1},net.layers{1}.distances)

 

% 训练次数为50

net.trainParam.epochs=a(3);

% 训练网络和查看分类

net=train(net,p);

y=sim(net,p);

yc(3,:)=vec2ind(y);

plotsom(net.iw{1,1},net.layers{1}.distances)

 

% 训练次数为100

net.trainParam.epochs=a(4);

% 训练网络和查看分类

net=train(net,p);

y=sim(net,p);

yc(4,:)=vec2ind(y);

plotsom(net.iw{1,1},net.layers{1}.distances)

 

% 训练次数为200

net.trainParam.epochs=a(5);

% 训练网络和查看分类

net=train(net,p);

y=sim(net,p);

yc(5,:)=vec2ind(y);

plotsom(net.iw{1,1},net.layers{1}.distances)

 

% 训练次数为500

net.trainParam.epochs=a(6);

% 训练网络和查看分类

net=train(net,p);

y=sim(net,p);

yc(6,:)=vec2ind(y);

plotsom(net.iw{1,1},net.layers{1}.distances)

 

% 训练次数为1000

net.trainParam.epochs=a(7);

% 训练网络和查看分类

net=train(net,p);

y=sim(net,p);

yc(7,:)=vec2ind(y);

plotsom(net.iw{1,1},net.layers{1}.distances)

 

 

% 测试样本输入

t=[0.9512 1.0000 0.9458 -0.4218 0.9511 0.9645 0.8941]';

% sim来做网络仿真

r=sim(net,t);

% 变换函数,将单值向量转换为下标向量

rr=vec2ind(r)

% 查看网络拓扑

plotsomtop(net)


 

 



本文分享自微信公众号 - 瓜大三哥(xiguazai_tortoise)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部