MATLAB神經網絡——單層感知器


目錄

單層感知器基礎理論知識

MATLAB神經網絡工具箱使用例程

算法實現

參考文獻


單層感知器基礎理論知識

關於單層感知器的理論知識與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神經網絡原理與實例精解

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章