問題:蠓蟲分類問題
1 問題描述
蠓蟲分類問題可概括敘述如下:生物學家試圖對兩種蠓蟲(Af 與Apf)進行鑒別,依據的資料是觸角和翅膀的長度,已經測得了9 只Af 和6 只Apf 的數據如下:
Af: (1.24,1.27),(1.36,1.74),(1.38,1.64),(1.38,1.82),(1.38,1.90),(1.40,1.70),(1.48,1.82),(1.54,1.82),(1.56,2.08).
Apf: (1.14,1.82),(1.18,1.96),(1.20,1.86),(1.26,2.00),(1.28,2.00),(1.30,1.96).
現在的問題是:
(i)根據如上資料,如何制定一種方法,正確地區分兩類蠓蟲。
(ii)對觸角和翼長分別為(1.24,1.80),(1.28,1.84)與(1.40,2.04)的3 個標本,用所得
到的方法加以識別。
已知的蠓蟲數據分布如圖(圓圈為Apf類,六角為Af,米字型為未知型)
2.MATLAB 實現
clear
p1=[1.24,1.27;1.36,1.74;1.38,1.64;1.38,1.82;1.38,1.90;1.40,1.70;1.48,1.82;1.54,1.82;1.56,2.08]; %Af
p2=[1.14,1.82;1.18,1.96;1.20,1.86;1.26,2.00;1.28,2.00;1.30,1.96]; %Apf
p=[p1;p2]';
pr=minmax(p);
goal=[ones(1,9),zeros(1,6);zeros(1,9),ones(1,6)]; %p1類為1;p2類為0
x=[1.24 1.80;1.28 1.84;1.40 2.04];
for i=1:9
plot(p1(i,1),p1(i,2),'h')
hold on
end
for i=1:6
plot(p2(i,1),p2(i,2),'o');
end
for i=1:3
plot(x(i,1),x(i,2),'*')
text (x(i,1),x(i,2),'?');
end
%Rx2的矩陣以定義R個輸入向量的最小值和最大值;設定每層神經元個數的數組
net=newff(pr,[3,2],{'logsig','logsig'});
net.trainParam.show = 10; % 訓練顯示間隔
net.trainParam.lr = 0.05; %學習步長
net.trainParam.goal = 1e-10; %最小均方誤差
net.trainParam.epochs = 50000; %最大訓練次數
net = train(net,p,goal); %訓練神經網絡
y0=sim(net,p); %對已知的數據進行驗證
x=x';
y=sim(net,x); %對未知的數據進行分類
3 結果
目標標簽設置
goal =
1 1 1 1 1 1 1 1 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 1 1 1 1 1
已知數據訓練后:
y0 =
1 至 10 列 11 至 15 列
0.9999 0.9999 0.9999 0.9998 0.9995 0.9999 0.9999 0.9999 0.9999 0.0001 0.0001 0.0001 0.0001 0.0002 0.0006
0.0001 0.0001 0.0001 0.0002 0.0005 0.0001 0.0001 0.0001 0.0001 0.9999 0.9999 0.9999 0.9999 0.9998 0.9994
未知數據分類:
y =
0.0004 0.0036 0.9899
0.9996 0.9964 0.0101
從結果可知:(1.24,1.80),(1.28,1.84)屬於Apf,(1.40,2.04)屬於Af
4 工具箱界面簡介
更具體的介紹詳見:http://blog.csdn.net/q1302182594/article/details/8790613
神經網絡訓練參數說明:http://blog.sina.com.cn/s/blog_5c9288aa0101gsu2.html
5 拓展
可以通過蒙卡特羅法產生大量數據點,通過神經網絡進行分類。
因為有一些數據點分布在神經網絡的分界面附近,因此可以大約知道分界面的位置。
N=1000; k1 = 1.1 + (1.6-1.1).*rand(1,N); k2 = 1.2 + (2.1-1.2).*rand(1,N); z=[k1;k2]; z1=sim(net,z); for i=1:1000 if z1(1,i)<0.5 plot(z(1,i),z(2,i),'o'); hold on end if z1(1,i)>0.5 plot(z(1,i),z(2,i),'h'); end end
6.非監督學習
clear p1=[1.24,1.27;1.36,1.74;1.38,1.64;1.38,1.82;1.38,1.90; 1.40,1.70;1.48,1.82;1.54,1.82;1.56,2.08]; p2=[1.14,1.82;1.18,1.96;1.20,1.86;1.26,2.00; 1.28,2.00;1.30,1.96]; p=[p1;p2]' pr=minmax(p) goal=[ones(1,9),zeros(1,6);zeros(1,9),ones(1,6)] net = newlvq(pr,4,[0.6,0.4]) net = train(net,p,goal) Y = sim(net,p) x=[1.24 1.80;1.28 1.84;1.40 2.04]' sim(net,x)