一文搞懂感知機算法

什么是感知機

感知機(preceptron)是線性分類的二分類模型,輸入為實例的特征向量,輸出為實例的類別,分別用 1 和 -1 表示。感知機將輸入空間(特征空間)中的實例劃分為正負兩類分離的超平面,旨在求出將訓練集進行線性劃分的超平面,為此,導入基于誤分類的損失函數(shù),利用梯度下降法對損失函數(shù)進行極小化,求得最優(yōu)解。感知機是神經(jīng)網(wǎng)絡(luò)和支持向量機的基礎(chǔ)。

感知機模型

感知機的函數(shù)公式為:
f(x) = sign(w\cdot x + b)

其中, w和 b 為感知機模型參數(shù),w \in R^n叫做權(quán)值或者權(quán)值向量,b \in R 叫做偏差,w \cdot x表示 w 和 x 的內(nèi)積, sign 是符號函數(shù),即:
sign\left( x\right) =\begin{cases}1,x\geq 0\\ -1,x <0\end{cases}
感知機的假設(shè)空間是定義在特征空間中所有線性分類模型的函數(shù)集合,即\{f|f(x) = w \cdot x + b\}.

感知機的幾何解釋:線性方程w \cdot x + b = 0對應特征空間R^n中的一個超平面 S,其中 w 是超平面的法向量,b 是超平面的截距。該超平面將特征空間分為兩個部分,將特征向量分為正負兩類。因此,超平面 S 成為分離超平面。

image

感知機學習策略

假設(shè)訓練數(shù)據(jù)集是線性可分的,感知機的學習目標就是找到能夠?qū)⒄搶嵗c完全分開的超平面,即確定感知機模型參數(shù) w 和 b,因此就是確定(經(jīng)驗)損失函數(shù)并求損失函數(shù)的最優(yōu)解,即最小化。

感知機 sign(w\cdot x + b)學習的損失函數(shù) 定義為:
L(w, b) = - \sum_{x \in M}y_i(w \cdot x_i + b) 公式(1)
下面給出推導:
1.首先寫入輸入空間R^n中任意點 x_0到超平面 S 的距離:
\dfrac {1}{\left\| w\right\| }\left| w\cdot x_0 +b\right|
其中,\left\| w\right\|是 w 的 L2 范數(shù)。

2.當w \cdot x_i + b > 0時, y_i = -1, 而當w \cdot x_i + b <0時,y_i = 1。因此,對于誤分類的數(shù)據(jù)(x_i, y_i)來說,- y_i(w \cdot x_i + b) > 0成立。

3.另外,誤差分類點到超平面 S 的距離是

\dfrac {1}{\left\| w\right\| }y_i (w\cdot x_i +b)

設(shè) M 為超平面 S 的誤分類點的集合,則所有誤分類點到超平面 S 的總距離為:
\dfrac {1}{\left\| w\right\| }\sum_{x \in M}y_i(w \cdot x_i + b)
不考慮\dfrac {1}{\left\| w\right\| },則得到感知機的損失函數(shù) L(w, b),即公式(1)

顯然,損失函數(shù) L(w, b)是非負的。如果有所分類都正確,則損失函數(shù)值為 0。而且,分類越正確,則誤分類的點離超平面越近,損失函數(shù)值越小。

因此,一個特定的樣本的損失函數(shù),在誤分類時時參數(shù) w, b 的線性函數(shù),正確分類時時 0,可以得出給定訓練數(shù)據(jù)集 T,損失函數(shù) L(w, b)是 w,b 的連續(xù)可導函數(shù)。

感知機學習算法

下面我們來看感知機的學習算法。給定一個訓練數(shù)據(jù)集T=\{(x_1,y_1), (x_2, y_2), ..., (x_N, y_N)\}
感知機的算法是誤分類驅(qū)動的,具體采用 隨機梯度下降法(stochastic gradient descent). 在極小化目標函數(shù)的過程中,并不是一次使 M 中所有誤分類的點梯度下降,而是每次隨機一個誤分類的點使其梯度下降。
具體步驟為:
1.假設(shè)誤分類點的集合為 M,那么損失函數(shù)L(w, b)的梯度為:
\nabla_wL(w, b) = - \sum_{x \in M}y_ix_i
\nabla_bL(w, b) = - \sum_{x \in M}y_i
2.隨機選取一個誤分類的點(x_i, y_i),對 w, b 更新:
w \leftarrow w + \eta y_ix_i
b \leftarrow b + \eta y_i
式中\eta(0<\eta\leq1)是步長,又稱為學習率(learning_rate),這樣,通過迭代可以使損失函數(shù)不斷減小,直到為 0.

當訓練數(shù)據(jù)集線性可分的時候,感知機學習算法是收斂的,并且存在無窮多個解,解會由于不同的初值或不同的迭代順序不同而有所不同。

實戰(zhàn)

下面使用 sklearn 包中感知機來訓練和分類 Iris(鳶尾花) 數(shù)據(jù)集。

from sklearn import datasets
import pandas as pd
from sklearn import Perceptron
from sklearn.cross_validation import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score
from sklearn.utils import shuffle

iris = datasets.load_iris()

先導入數(shù)據(jù),然后使用shuffle打亂數(shù)據(jù)順序,

X, y = shuffle(iris.data, iris.target,random_state=7)

接下來分割訓練集和測試集:

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=7)

然后進行樣本特征的標準化縮放,為了讓特征同步變化。標準化縮放就是將樣本特征轉(zhuǎn)化成均值為 0 ,方差為 1 的正態(tài)分布。

sc_X = StandardScaler()
X_train_std = sc_X.fit_transform(X_train)
X_test_std = sc_X.fit_transform(X_test)

創(chuàng)建感知機模型,進行訓練,最終對測試集預測結(jié)果。

model = Perceptron()
model.fit(X_train_std, y_train)
y_pred = model.predict(X_test_std)

訓練完成以后評價一下訓練結(jié)果,

print ("Accuracy score on test data: {:.4f}".format(accuracy_score(y_test, y_pred)))
print ("F-score on test data: {:.4f}".format(fbeta_score(y_test, y_pred, beta = 0.5,average='weighted')))

結(jié)果如下:


image

效果不太好,我們嘗試用網(wǎng)格搜索法來優(yōu)化一下,設(shè)置好參數(shù)集,代碼如下:

from sklearn.model_selection import GridSearchCV
from sklearn.metrics import make_scorer
from sklearn.metrics import fbeta_score, accuracy_score
clf = Perceptron(random_state=7)
parameters = {'eta0':[0.1,1,10], 'max_iter':[30,40,50]}
scorer = make_scorer(fbeta_score, beta=0.5, average='weighted')
#在分類器上使用網(wǎng)格搜索,使用'scorer'作為評價函數(shù)
grid_obj = GridSearchCV(clf, parameters, scoring=scorer)
grid_obj.fit(X_train_std, y_train)
# 得到estimator
best_clf = grid_obj.best_estimator_
# 使用沒有調(diào)優(yōu)的模型做預測
predictions = (clf.fit(X_train_std, y_train)).predict(X_test_std)
best_predictions = best_clf.predict(X_test_std)

最后我們將優(yōu)化前和優(yōu)化后的結(jié)果打印出來比較一下效果:

# 匯報調(diào)參前和調(diào)參后的分數(shù)
print ("\nUnoptimized model\n------")
print ("Accuracy score on test data: {:.4f}".format(accuracy_score(y_test, predictions)))
print ("F-score on test data: {:.4f}".format(fbeta_score(y_test, predictions, beta = 0.5,average='weighted')))
print ("\nOptimized Model\n------")
print ("Final accuracy score on the test data: {:.4f}".format(accuracy_score(y_test, best_predictions)))
print ("Final F-score on the test data: {:.4f}".format(fbeta_score(y_test, best_predictions, beta = 0.5,average='weighted')))

運行一下,得到下圖:


image

最終可以看到,我們的模型預測效果已經(jīng)有明顯進步了。

如果你喜歡我的文章,歡迎掃碼關(guān)注公眾號:機器學習Club.聚焦機器學習,關(guān)注自我管理。
[圖片上傳失敗...(image-d73933-1534854404075)]

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 【概述】 1、感知機模型特征:感知機對應于輸入空間中將實例劃分為正負兩類的分離超平面,屬于判別模型。 2、感知機策...
    sealaes閱讀 3,243評論 2 3
  • 以西瓜書為主線,以其他書籍作為參考進行補充,例如《統(tǒng)計學習方法》,《PRML》等 第一章 緒論 1.2 基本術(shù)語 ...
    danielAck閱讀 4,903評論 0 5
  • 感知機 概述 感知機是二類分類的線性分類模型,其輸入為實例的特征向量,輸出為實例的類別,取+1和-1二值。感知機學...
    _Joe閱讀 5,417評論 2 7
  • 有網(wǎng)友發(fā)帖稱:好友結(jié)婚的日子,剛好是我一場職稱考試的日子。她要我放棄考試,去參加婚禮,我向她說明情況,表示歉意,包...
    李彧飛閱讀 730評論 4 4
  • 35歲你因為身體越來越差 加班越來越少 晉升的速度也越來越緩慢 那天下班,媳婦告訴你,孩子要上幼兒園了。雙語的一個...
    賣萌維生閱讀 373評論 0 1

友情鏈接更多精彩內(nèi)容