Implement a simple 2-features Perceptron with graphic plotting at each iteration.
感知器Perceptron (也稱為Perceptron Learning Algorithm簡稱PLA)
- 線性可分 (2D:在平面上找一條線去完全切出這兩群;3D:的話就是可以在空間中找一個平面去切出兩群)
- 當w1x1 + w2x2 + w3x3 +…. wnxn >某一個定值(aka. threshold, -bias),就會出發神經元發送信號出去
- Activation Function挑選像sign一樣導出離散分類結果的function
Figure 1. Perceptron Algorithm (by Yeh James)
平面的法向量為W, 法向量指向的輸入空間,其輸出值為+1,而與法向量反向的輸入空間,其輸出值為-1。
每次迭代:
-
Input為一筆資料的features,Perceptron將features分別跟Weights相乘再加bias,透過Activation二元分類情況的話將output經由Sign()將資料分成兩個結果[-1, 1]
-
將所有Outputs與其相對之targets比較,找出其中一筆error Data出來update weights 用x 到原點的向量 X ,來修正直線的法向量 W
要怎麼修正呢?要看 x 的類別 y 來決定, 調整 W的方向
公式如下:
W → W + y⋅X
用這個方法就可以改變直線的斜率,把分類錯誤的點 x ,歸到正確的一類。
- 重新迭代直至沒有error為止
Perception優點:
- 最簡單的線性分類演算法,Perception演算法的原理可推廣至其他複雜的演算法。
Perception缺點:
- 一定要線性可分Perception演算法才會停下來(實務上我們沒辦法事先知道資料是否線性可分)
- Perception演算法的錯誤率不會逐步收斂
- Perception演算法只知道結果是A類還B類,但沒辦法知道是A, B類的機率是多少(Logistic regression可解決此問題)
Q: What kind of problems can it fix?
A: Binary Classification (二元分類), a type of linear classifier
Q: Can it solve multiclass problems?
A: 有點麻煩,參考別人的例子:
Suppose we have data (𝑥1,𝑦1),…,(𝑥𝑘,𝑦𝑘) where 𝑥𝑖∈ℝ𝑛 are input vectors and 𝑦𝑖∈{red, blue, green} are the classifications.
We know how to build a classifier for binary outcomes, so we do this three times: group the outcomes together, {red, blue or green},{blue, red or green} and {green, blue or red}.
1.0
Python==3.5.2
numpy==1.15.4
pandas==0.18.1
a binary classifier with Iris Data (經filter後有100筆資料) 以Iris 資料集來做資料線性可分的視覺化, 選出其中2種特徵(inputs) and2種花的種類(output)
# as a dataframe
from sklearn import datasets
iris_data = iris_data_preprocess()
iris_data.head()
sepal length (cm) petal length (cm) target
0 5.1 1.4 -1
1 4.9 1.4 -1
2 4.7 1.3 -1
myPerceptron = Perceptron(n_inputs=len(iris_data.columns)-1, save_fig=False)
myPerceptron.train(iris_data)
plot_data_and_line(iris_data, myPerceptron.weights, save_fig=False)
Concepts:
Coding: