參考文章:
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
有很詳盡的介紹。