目錄
單層感知器基礎理論知識
關於單層感知器的理論知識與MATLAB中單層感知器相關函數,在單層感知器--matlab神經網絡這篇文章中有詳細的講解。
MATLAB神經網絡工具箱使用例程
實例:在下圖中,o點的輸出值爲1,*點的輸出值爲0。希望能獲得一個神經網絡,當我們輸入一個座標時,它能給出對應的輸出值。
根據理論知識,結果將會是一條直線(x1*w1+x2*w2+b=0),他將會把平面分割爲兩塊區域,一塊輸出值爲0,一塊輸出值爲1。使用MATLAB神經網絡工具箱求解代碼如下:
net = newp([0 1; 0 1],1) %創建一個單層感知器(NEW Perceptron),它有兩個輸入節點(假設爲x1和x2),x1的取值範圍是0~1,x2的取值範圍是0~1,有一個節點。
P = [0 0 1 1; 0 1 0 1]; %輸入樣本,在這裏是一個2X4的矩陣,矩陣的每一列表示一個樣本點
T = [0 1 1 1]; %期望值(輸出值),對應輸入樣本
net.trainParam.epochs = 20; %net是已經創建的神經網絡,它本質上是一個對象,在這裏修改trainParam的epochs值爲20,表示訓練最大的迭代次數爲20次
net = train(net,P,T); %訓練神經網絡
%以下爲理解‘單層感知器’而做的可視化部分,非求解問題必須代碼
Y = sim(net,P);%對訓練好的神經網絡仿真(simulate),把樣本值傳入神經網絡,觀察輸出結果於原結果是否一致
b = net.b{1,1}; %我們的目的實際上是爲了獲得直線(x1*w1+x2*w2+b=0),這裏獲取b值(它存儲在net對象的b參數值裏)
w1 = net.IW{1,1}(1); %獲取w1值
w2 = net.IW{1,1}(2); %獲取w2值
% 繪圖
x1 = -1:0.1:2;
x2 = -w1/w2*x1-b;
plot(x1,x2,'k')
hold on
plot(P(1,2:end),P(2,2:end),'ko');
plot(P(1,1),P(2,1),'r*');
axis([-1,2,-1,2])
legend('分類直線','值爲1','值爲0')
結果如下
測試神經網絡,過程如下(正確性可從上圖中觀察得出)
>> sim(net,[0.1;0.1])
ans =
0
>> sim(net,[0.5;0.5])
ans =
1
算法實現
根據單層感知器--matlab神經網絡文中 “二、學習算法步驟:”,上面的問題可根據算法步驟,用以下MATLAB代碼實現(不使用MATLAB神經網絡工具箱):
n=0.2; % 學習率
w=[0,0,0];
P = [0 0 1 1; 0 1 0 1];
d=[0 1 1 1]; % 期望輸出
P=[ones(1,4);P];
MAX=20; % 最大迭代次數爲20次
i=0;
while 1
v=w*P;
x2=hardlim(v); % 實際輸出
%更新
e=(d-x2);
ee(i+1)=mae(e);
if (ee(i+1)<0.001) % 判斷
disp('we have got it:');
disp(w);
break;
end
% 更新權值和偏置
w=w+n*(d-x2)*P';
if (i>=MAX) % 達到最大迭代次數,退出
disp('MAX times loop');
disp(w);
disp(ee(i+1));
break;
end
i= i+1;
end
figure;
subplot(2,1,1); % 顯示待分類的點和分類結果
plot(P(2,2:end),P(3,2:end),'ko');
hold on
plot(P(2,1),P(3,1),'r*');
axis([-1,2,-1,2])
x1=-1:.1:2;
x2=x1*(-w(2)/w(3))-w(1)/w(3);
plot(x1,x2);
legend('值爲1','值爲0','分類直線');
hold off
subplot(2,1,2); % 顯示mae值的變化
x1=0:i;
plot(x1,ee,'o-');
s=sprintf('mae的值(迭代次數:%d)', i+1);
title(s)
參考文獻
陳明.MATLAB神經網絡原理與實例精解