從0開始的機器學習(一)--感知器
1 人贊了文章
從今天開始,我將嘗試自學機器學習相關方面的知識。因為平時科研工作比較繁忙,只能擠時間來進行學習,因此更新會非常的緩慢。最重要的是記錄所學到的,用來備忘。
學習參考的用書為Simon Haykin所著的《神經網路與機器學習》一書。因為聽信了豆瓣(豆瓣的受害者),我所看的是它的英文影印版,更加增加了自學的難度(笑)。同時參考的還有一本神書《Numerical Optimization》,可以說是自討苦吃了。
今天主要記錄的是書本中第一章《Rosenblatts Perceptron》,中文名稱直譯過來的話,是羅森布拉特感知機,是最為簡單的一種感知器。其常常用於分類可以線性分離的兩個集合。一個典型的集合特徵如下圖所示:
其中左圖即為兩個線性可分離的集合。右圖所示的就不具備線性可分離的特徵。
通常來說,一個感知器具有下述結構:
其具有一個固定的輸入埠,輸入值為1。最後計算得到的數據通過一個硬限制器(Hard Limiter)進行判決。整個網路的更新迭代過程可以通過下面的表格進行闡述:
下面給出matlab代碼,與書後的示例相同。
首先是書中所述,雙月形數據集的產生代碼:
function [data] = DoubleMoonDataGenerator(N,r,d,w,bLabeled)%% 雙月集產生器% 參數見書第61頁。《Specifications of the Classification Problem》章節。% N代表每個集合數據點數量% r代表每個月牙形的半徑% d代表向下偏離X軸的偏移量% w代表每個集合的寬度% bLabeled : 是否進行標識(A為1,B為-1)if bLabeled == false data = zeros(2*N,2); %ragion A: Armin = r-w/2; for i = 1:2*N R = Armin+rand(1)*w; Theta = 2*pi*rand(1); if Theta >= 0 && Theta < pi % Ragion A data(i,1) = R*cos(Theta); data(i,2) = R*sin(Theta); else % Ragion B data(i,1) = r + R*cos(Theta); data(i,2) = -d + R*sin(Theta); end endelse data = zeros(2*N,3); %ragion A: Armin = r-w/2; for i = 1:2*N R = Armin+rand(1)*w; Theta = 2*pi*rand(1); if Theta >= 0 && Theta < pi % Ragion A data(i,1) = R*cos(Theta); data(i,2) = R*sin(Theta); data(i,3) = 1; else % Ragion B data(i,1) = r + R*cos(Theta); data(i,2) = -d + R*sin(Theta); data(i,3) = -1; end endend
生成的數據,第一列代表數據點的X坐標,第二列代表數據點的y坐標,最後一列代表著數據點所屬的集合分類(可選)。
接下來是演示用代碼:
% 產生帶標籤的數據集合data = DoubleMoonDataGenerator(2000,10,1,6,true);%構建感知器並分類%學習效率eta = 1e-4;%初始權值w = [0;0;0];for i = 1:4000 x = [1;data(i,1);data(i,2)]; %偏置為0 y = sign(w*x); w = w +eta*(data(i,3)-y)*x;endX = -30:0.1:30;Y = (-w(2)*X-w(1))/w(3);plot(data(:,1),data(:,2),.);hold onplot(X,Y);grid on
其最終運行結果如圖:
圖中的直線即是兩個區域的分離邊界。
*文章中部分圖片來自源書。
推薦閱讀:
※CodyNote002:富有彈性的數組長度(part.2)
※大家都來說說,matlab里有什麼函數,在python里是找不到的?
※AMEsim & Matlab聯合模擬 ---軟體安裝方法
※CodyNote004:簡單解碼環加密問題
※CodyNote012:再談動態長度子序列(Part.1)