競爭型神經網路續1
1.競爭神經網路函式
1.1建立函式
1.1.1 newc函式
newc函式用於建立一個競爭層,這是一箇舊版本的函式,現在用competlayer函式代替。函式呼叫格式:
net = newc(range,class,klr,clr);
其中,class是資料類別個數,也是競爭層神經元的個數;klr和clr分貝是網路的權值學習速率和閾值學習速率。競爭型網路在訓練時不需要目標輸出,網路通過對資料分佈特性的學習,自動地將資料劃分為制定類別數。
返回引數net是一個新的競爭層。該網路採用negdist作為權值函式,netsum作為網路輸入函式,以及compet作為傳輸函式。除了權值以外,網路還包含一個閾值,權值和閾值使用midpoint和initcon函式進行初始化。
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為分類的類別數;kohonenLR為Kohonen學習率;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)
輸入引數PR為R個輸入元素的最大值和最小值的設定值,Rx2維矩陣;di為第i層的維數,預設[5,8];tfcn為拓撲函式,預設為hextop;dfcn為距離函式,預設為linkdist;olr為分類階段學習速率,預設為0.9;osteps為分類階段的步長,預設為1000;tlr為調諧階段的學習速率,預設為0.02;tns為調諧階段的鄰域距離,預設為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.01;LF表示學習函式,預設值為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 = softmax(N,FP):N為SxQ,包含Q個長度為S的列向量,對每個列向量分別求最大值,返回同類型矩陣A,在每一列的最大值對應位置,A中的元素為1,其餘元素為0,A中的每一列中有且只有一個元素等於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)
其中,引數W為RxQ矩陣,每列是一個輸入的樣本向量,共Q個嚴格吧你。P為SxQ權值矩陣。函式返回每個樣本向量與相應輸出神經元權值向量的曼哈頓距離。
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 自組織競爭神經網路的應用
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)