單層感知器的學習與練習


參考文章:

http://blog.csdn.net/xiaowei_cqu/article/details/9004101

http://www.hcii-lab.net/lianwen/Course/Machine%20Learning/main/notes/Lecture%208%20%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C%EF%BC%88Part%202%EF%BC%89.pdf


1、簡要說明

單層感知器可以用來區分線性可分的數據,並且一定可以在有限的迭代次數中收斂。數學證明參考參考的第二篇文章。

從使用過程來看,單層的感知器其實看起來是相當簡單的:對假設函數進行訓練,直到對所有的樣本都滿足經過假設函數計算出來的結果與預期結果一致,就結束了。


單層的感知函數,是一個非0即1的兩類的判斷函數:計算出來的值大於一定的門限,就認爲是等於1,否則就是0,下面的圖來自參考的第二篇文章:




2、計算練習

有兩個算法可以用來迭代得到合適的權重值:感知器算法,以及delta算法。

這裏只第一個感知器算法進行驗證:

%


clear all; close all; clc


function z=signvalue(v)
	if v>0
	   z=1;
        else
	   z=-1;
	end
end

x=[1,1,1;1,1,-1;1,0,-1;1,-1,-1;1,-1,1;1,0,1]
y=[1;1;1;-1;-1;-1]

m=length(y)
%x = [ones(m, 1) x]; % Add a column of ones to x

w=zeros(size(x(1,:)))'

nita=0.5;

iter=0;
wt=w;
for k=1:200
   iter++;
   disp("iter--------------------begin");
   
   change=0;
   for i=1:m
       x(i,:);
       tmpout=signvalue(x(i,:)*wt) ;
       disp(sprintf('y(i) is %.2f,tmpout is %.2f', y(i),tmpout)) % c語言風格
       wt=wt+(nita*(y(i)-tmpout)*x(i,:))' 
       if y(i)!=tmpout
	  change=1
       end
   end
   if change==0
      disp("break loop");
      break;
   end

end

iter
wt

可以看到輸出:


iter =  3
wt =

   1
   2
  -1



三次迭代就可以了。



上面的三維的不是很直觀,我換一個二維的,以y=x這條線爲界,上邊的爲1類,下邊的爲另一類:

輸入改爲:

x=[1,1.1;1.2,1.3;0.5,0.6;-0.3,-0.2;-0.1,1;1,0.9;1.2,1.1;0.4,0.3;-1,-1.1;-0.5,-0.6];
y=[1;1;1;1;1;-1;-1;-1;-1;-1]


程序不變,輸出爲:

iter =  9
wt =
  -1.1000
   1.1000

分的很好。



============================後記===============================

參考wiki:

https://en.wikipedia.org/wiki/Perceptron

有很詳盡的介紹。


發佈了111 篇原創文章 · 獲贊 46 · 訪問量 36萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章