Introduce
感知機模型(Perceptron)是一個最簡單的有監督的二分類線性模型。他可以從兩個方面進行介紹
方面一 問題分析
問題(一維):兒童免票乘車問題(孩子身高低於1.2m可以免票上車)
這轉換成數學表達式就是 $x:$身高,$y:\{-1:$免票 ,$1:$購票$\}$
$$ y=\left\{\begin{matrix}+1,x\ge1.2m \\ -1,x\lt1.2m\end{matrix}\right. $$
如果把$y$用函數$f(x;b)$表達出來就如下所示
$$ y=f(x;b)=\left\{\begin{matrix}+1,z=x+b\ge0 \\ -1,z=x+b \lt0 \end{matrix}\right. $$
用機器學習的話來說變量$x$就是一個特征,$y$就是一個標記,$b$就是一個偏置
問題(二維):西瓜分類(依靠西瓜的顏色和敲擊的響聲分類)
這里的$x$就從一個一維特征編程了二維的特稱向量$\{x_1:$顏色 ,$x_2:$響聲$\}$ $y$仍然是一個標記 $y:\{-1:$壞瓜 ,$1:$好瓜$\}$ 數據如圖所示:
用一般的數學方法,我們希望將兩個變量$x_1,x_2$映射到一個維度上去 就會出現如下三種經典的情況
映射到水平方向
映射到豎直方向
映射到任意方向
二維向量映射到一維空間需要有映射的方向。此時就需要一定的方向向量$\mathbb{w}=(w_1 \ w_2)^T$ 此時,如果把$y$用函數$f(\mathbb{x};\mathbb{w},b)$來表示
$$ y=f(\mathbb{x};\mathbb{w},b)=\left\{\begin{matrix}+1,\mathbb{w}^T\mathbb{x}+b\ge0 \\ -1,\mathbb{w}^T\mathbb{x}+b\lt0 \end{matrix}\right. $$
綜上所述,可以類推到n維。只要將$\mathbb{x},\mathbb{w}升維就可以了$
方面二 模型發展
1943年,McCulloch和Pits結合神經元模型Neuron提出來經典的抽象的M-P神經元模型
神經元的生物學結構
M-P神經元模型
而感知機模型是從神經元模型發展過來的。感知機是由兩層神經元組成的一個簡單模型。只有輸出層是M-P 神經元,即只有輸出層神經元進行激活函數處理,也稱為功能神經元( functional neuron);輸入層只是接受外界信號(樣本屬性)並傳遞給輸出層(輸入層的神經元個數等於樣本的屬性數目),而沒有激活函數。示意圖如下:
Definition
假設輸入空間(特征空間)是$\mathcal{X} \subset \mathbb{R}^n$,輸出空間是$\mathcal{Y}=\{-1,+1\}$。輸入$x\in \mathcal{X}$表示實例的特征向量,對應於輸入空間(特征空間)的點;輸出$y\in \mathcal{Y}$表示類別。由輸入空間到輸出空間的如下函數: $$ f(x)=sign(w \cdot x+b) $$ 成為感知機。其中,$w,b$成為感知機模型的參數,$w \in \mathbb{R}^n$叫做權值(weight)或權值向量(weight vector),$b \in \mathbb{R}$叫做偏置(bias),$w \cdot x$表示兩者的內積。$sign$是符號函數,即 $$ sign(a)=\left\{\begin{matrix}+1,a\ge0\\-1,a\lt0\end{matrix}\right. $$ 感知機是一種線性分類器,屬於判別模型。感知機模型的假設空間是定義在特征空間中的所有線性分類模型(linear classification model)或線性分類器(linear classifier),即函數模型$\{f\,|\,f(x)=w \cdot x +b \}$
Loss Function
感知機學習的策略就是最小化損失函數。對於感知機來說損失函數有兩種方式。
1. 統計誤分類點: $$ l(w)=\sum_{i=1}^N \ \mathbb{I}(y_i \cdot (w^Tx +b ) < 0) $$ 但是指示函數不連續,在計算過程中不太友好
2. 統計誤分類點到分來超平面的距離: $$ \begin{align}l(w) &=|w^Tx +b |\\ &=\sum_{i=1}^N - \,y_i \cdot (w^Tx +b )\end{align} $$
Algorithm
為了找到更好的$w,b$。使用隨機梯度下降SGD(Stochastic Gradient Descend), 但是該方法容易受特征縮放、學習率因素影響陷入局部最小值。 $$ w_{n+1} \leftarrow w_n +\eta \frac{\partial l}{\partial w}\\ b_{n+1} \leftarrow b_n +\eta \frac{\partial l}{\partial b} $$
對該算法的超參數:學習率$\eta$,誤差上限$\varepsilon$,學習次數$epoch$
收斂性
設訓練數據集$T=\{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)\}$是線性可分的,其中$x_i\in \mathcal{X}=\mathbb{R}^n,\ y_i\in\mathcal{Y}=\{+1,-1\},\ i=1,2,\cdots,N$則:
- 存在滿足條件$||\hat{w}_{opt}||=1$的超平面$\hat{w}_{opt} \cdot \hat{x}=w_{opt}\cdot x +b_{opt}=0$將訓練數據集完全正確分開;且存在$\gamma>0$,對所有$i=1,2,\cdots,N$: $$ y_i (\hat{w}_{opt} \cdot \hat{x})=y_i(w_{opt}\cdot x +b_{opt})\geq \gamma $$
- 令$R=max_{1 \leq i \leq N} ||\hat{x}_i||$,則感知機算法在訓練數據集上的誤分類次數$k$滿足不等式: $$ k \leq (\frac{R}{\gamma})^2 $$
Disadvantage
1. 存在多解
2. 依賴初值,也依賴選擇順序
3. 當數據集線性不可分就會產生迭代震盪。例如XOR異或問題
針對感知機算法的缺點,提出SVM解決多解問題,Pocket Algorithm使感知機容忍一些錯誤。
Python代碼實現
import numpy as np data1 = [[1,2],[3,3],[2,1],[5,2]] lable1 = [1,1,-1,-1] data2 = [[3,3],[4,3],[1,1]] lable2 = [1,1,-1] class Model: def __init__(self,data): self.w = np.zeros(np.shape(data)[1]) # 權重參數 self.b = 0 # 偏置 self.l_rate = 1 # 學習率 def sign(self, x, w, b): y = np.dot(x, w) + b return y # 隨機梯度下降法 def fit(self, data, lable): is_wrong = False while not is_wrong: wrong_count = 0 for d in range(len(data)): X = data[d] y = lable[d] judge = y * self.sign(X, self.w, self.b) if judge <= 0: self.w = self.w + self.l_rate * np.dot(y, X) self.b = self.b + self.l_rate * y if judge == 0: print('未分類=', d + 1, ' ', data[d]) else: print('誤分類=', d + 1, ' ', data[d]) print('w = ',self.w,'b= ',self.b) wrong_count += 1 if wrong_count == 0: is_wrong = True perception1 = Model(data1) perception1.fit(data1,lable1)
參考
李航 統計學習方法
周志華 機器學習(西瓜書)
shuhuai008 機器學習白板推導