[資料分析&機器學習] 第3.2講:線性分類-感知器(Perceptron) 介紹

Yeh James
JamesLearningNote
Published in
9 min readOct 22, 2017

我們先介紹在機器學習領域最早被開發出來的演算法:感知器Perceptron(也稱為Perceptron Learning Algorithm簡稱PLA)、並教大家如何實作一個perceptron演算法來訓練Iris資料集,並成功分類。

首先要注意Perceptron這個演算法只有在資料是線性可分的形況下才能正確分類(演算法才會停止)。什麼是資料是線性可分呢?以2D的情況簡單來說就是可以在平面上找一條線去完全切出這兩群,3D的話就是可以在空間中找一個平面去切出兩群,下方以Iris 資料集來做資料線性可分的視覺化(為了簡單起見選出其中兩個特徵以及兩種花的種類)。

Iris線性可分資料

或是可參考下方的圖示說明

雖然說感知器是以生物的“神經元模型”為基礎所開發出來的演算法,但其實只是概念類似跟真實的生物神經元傳遞訊號的機制類似,除此之外沒有其他關係,大家不用把這個演算法想得太神奇或是跟人的大腦有什麼關聯,先介紹一下神經元的基本構造

生物神經元模型

左邊的突觸是神經接收訊息的地方(input),若input的訊號總和強度大於等於某一個值(threshold),這個神經元就會透過軸突(axon)發送訊息到右邊的突觸給下一個神經元。舉例來說當你的膝蓋被打超過一定的力道時,膝蓋神經就會發出訊號給肌肉內的神經進行所謂的膝反射。

假設左邊的突觸有n個,每一個input以 x1, x2, x3,…xn來表示的話,當w1*x1 + w2*x2 + w3*x3 +…. wn*xn >某一個定值,就會出發神經元發送信號出去。w1,w2,…wn,以及某一個定值都是這個神經元根據過往經驗學會的數字,也是資料科學家平常說在train這個model到底是在train什麼,就是找出w1,w2…wn以及某一個定值。

為了往後計算方便,資料科學家會把“某一個定值”移到等號左邊當成w0(w0 = 某一個定值的負號, x0 則永遠都是1),變成x0*w0+x1*w1+x2*w2+…+xn*wn >0 ,以二元分類來說(+1代表1類, -1但表另一類),只要這些數字大於0就判斷是+1,小於等於零就是-1(也可以定成大於等於0就是+1小於零就是-1) ,以數學方程式來表示的話如下圖所示

神經元的數學模型

上圖中的Activation function(激勵函數),就是大於0就判斷1、小於等於0就判斷成是-1。

以Iris dataset資料為例,假設我要判斷這個Iris花是屬於Setosa或是Versicolor,我可以透過花萼的長度以及花瓣的長度來判斷,以數學模型來表示就是: w1*花萼的長度+w2*花瓣的長度>某一個定值,我就推測這朵花是Setosa或是Versicolor。為了簡單起見可以變成 “某一個定值”*1+ w1*花萼的長度+w2*花瓣的長度>0,就推測這朵花是Setosa或是Versicolor。那當中的“某一個定值”跟w1,w2就是從過往的資料學習到的

接著要介紹如何從過往資料學習如何推出“某一個定值”跟w1,w2了,方便起見把“某一個定值”以w0來表示並增加x0(x0都是1),一開始我們可以隨意給w0,w1,w2一組任意的數字,像是[0,0,0]然後再透過過往資料去更新,更新的規則如下

如果預測錯誤則做如下更新

w = w + ▵w

▵w = y*x

這是什麼意思呢?由於一開始w=[0,0,0]所以 0*1 + 0*花萼的長度 + 0*花瓣的長度 = 0 ,因為≤0 都會預測成Setosa(-1類),因此這個模型一開始會把所有的花都預測成Setosa。Versicolor花都會被錯誤分類,因此找到第一筆被錯誤分類的Versicolor資料,如果這筆資料的花萼的長度=3.5,花瓣的長度=6,模型更新後就變成 w = [0,0,0] + 1*[1,3.5,6] 也就是更新之後w = [1,3.5,6], 其中的“1*”代表y = 1,y在二元分類為+1或是-1。[1,3.5,6]當中的1是因為多了x0,而x0永遠是1的關係。

先幫大家複習一下高中數學:

ax+by=c 在平面上是一條直線

(a,b)是垂直於這個平面的法向量,(b,-a)是方向向量

接著示範一步一步的過程:

匯入Iris資料集

選出花萼長度、花瓣長度以及花的種類欄位

把這target_name欄位的兩種花改成1,-1,主要是為了往後方便計算

激勵函數,取名叫sign

初始化w =[0,0,0] ,你也可以自訂任何想要的數字,w都會透過之後的更新,來自動調整。error =1 主要是紀錄沒有錯誤分類的話就停止,這也是為什麼一定要線性可分,如果資料不是線性可分的話,一定至少有一個錯誤分類存在,因此不會停止。iterator主要是用來記錄更新了幾次。

for i in range(len(iris_data))寫個迴圈一筆一筆去跑iris裡面的資料。

x,y = np.concatenate((np.array([1.]), np.array(iris_data.iloc[i])[:2])), np.array(iris_data.iloc[i])[2],其中np.concatenate((np.array([1.]), np.array(iris_data.iloc[i])[:2]))是要把x的資料都加上x0=1。

if sign(np.dot(w,x)) != y: 則是指預測失敗時

裡面這麼大一串程式碼只有一行重要,就是w += y*x,用來更新w,其他都只是視覺化過程來讓新手可以理解。

一開始w = [0,0,0] ,會把所有的花都判斷成-1類,因此找到第一筆+1類的就會發現預測錯誤,對w進行更新 w = w+y*x 就是 [0,0,0]+[1, 5.1,1.4] = [1, 5.1,1.4] 更新第一輪之後的w,以物理意義來說,代表的是該Decision boundary(紅線)的法向量(綠線),在紅線的內以及下方資料點會被歸類成-1類,在紅線的上方會被歸類成+1類

iterator: 0
x: [ 1. 5.1 1.4]
w: [ 1. 5.1 1.4]
iterator: 0 的狀態

為了方便理解新增了青色的虛線代表上一個Decision boundary的法向量,藍色線代表發生預測錯誤的資料點,而 w = w+y*x 而這次的y是-1,因此 [1, 5.1, 1.4] + -1*[1,7,4.7] = [0, -1.9, -3.3],就是下方的綠色線

iterator: 1
x: [ 1. 7. 4.7]
w: [ 0. -1.9 -3.3]
iterator: 1的狀態

依此類推,最後跑到iterator 9的時候會找到一個完美的decision boundary把這兩群資料切開

iterator: 9
x: [ 1. 5.1 1.4]
w: [ 2. 3.4 -9.1]
iterator: 9的狀態
Perceptron 演進圖形

到這邊我們找到完美的一條線,成功的把資料分成兩群,未來的新進的資料就可以用這條線去預測到底是屬於哪一類的花。

Perception優點:

  1. 最簡單的線性分類演算法,Perception演算法的原理可推廣至其他複雜的演算法,因此許多課程或是書籍皆會以此當作最初的教材。

Perception缺點:

  1. 一定要線性可分Perception演算法才會停下來(實務上我們沒辦法事先知道資料是否線性可分)
  2. Perception演算法的錯誤率不會逐步收斂
  3. Perception演算法只知道結果是A類還B類,但沒辦法知道是A, B類的機率是多少(接下來要介紹的Logistic regression可解決此問題)

程式碼

感謝你閱讀完這篇文章,如果你覺得這些文章對你有幫助請在底下幫我拍個手(長按最多可以拍50下手)。

[Python資料分析&機器學習]這系列文章是我在Hahow上面所開設課程的講義,如果你是新手想著看影片一步一步學習,可以參考這門課:https://hahow.in/cr/pydataml

如果你對什麼主題的文章有興趣的話,歡迎透過這個連結告訴我:https://yehjames.typeform.com/to/XIIVQC
有任何問題也歡迎在底下留言或是來信告訴我: yehjames23@gmail.com

參考閱讀

  1. [書]Python 機器學習
  2. 林軒田 機器學習基石
  3. 【机器学习算法系列之二】浅析Logistic Regression

--

--