-
感覺機模型
定義2.1(感覺機):假設輸入空間是
,輸出空間是
。輸入
表示執行個體的特征向量,對應于輸入空間的點;輸出
表示執行個體的類别。由輸入空間到輸出空間的如下函數
,稱為感覺機。其中,w和b為感覺機模型參數,
叫做權值或權值向量,
叫做偏置,
表示w和x的内積。sign是符号函數,即
感覺機是一種線性分類模型,屬于判别模型。感覺機模型的假設空間是定義在特征空間中的所有線性分類模型或線性分類器,即函數集合
-
感覺機學習政策
定義2.2(資料集的線性可分性):給定一個資料集
其中,
,
,
,如果存在某個超平面S:
,能夠将資料集的正執行個體點和負執行個體點完全正确地劃分到超平面的兩側,即對所有
的執行個體i,有
,對所有
的執行個體i,有
,則稱資料集T為線性可分資料集;否則,稱資料集T線性不可分。
對于上述訓練集T,感覺機
學習的損失函數(所有誤分類點到超平面S的總距離)定義為:
其中M為誤分類點的集合。這個損失函數就是感覺機學習的經驗風險函數。
-
感覺機學習算法
感覺機學習算法是誤分類驅動的,具體采用随機梯度下降法。首先,任意選取一個超平面
,然後用梯度下降法不斷地極小化目标函數。極小化過程中不是一次使M中所有誤分類點的梯度下降,而是一次随機選取一個誤分類點使其梯度下降。
假設誤分類點集合M是固定的,那麼損失函數L(w,b)的梯度由下式給出:
随機選取一個誤分類點
,對w,b進行更新:
-
練習
1.思考感覺機模型假設空間是什麼?模型複雜度展現在哪裡?
感覺機是一種線性分類模型,屬于判别模型。感覺機模型的假設空間是定義在特征空間中的所有線性分類模型或線性分類器,即函數集合
。
模型複雜度展現在
的特征數量,也就是次元d上。
2.已知訓練資料集D,其正執行個體點是
,
,負執行個體點是
,
(1)用python自程式設計實作感覺機模型,對訓練資料集進行分類,并對比誤分類點選擇次序不同對最終結果的影響。可采用函數式程式設計或面向對象的程式設計。
随機梯度下降法:
輸入:訓練資料集
,其中
,
,
;學習率
輸出:w,b;感覺機模型
(1)選取初值
(2)在訓練集中選取資料
(3)如果
(4)轉至(2),直至訓練集中沒有誤分類點
直覺解釋:當一個執行個體點被誤分類,即位于分離超平面的錯誤一側時,則調整w,b的值,使分離超平面向該誤分類點的一側移動,以減少該誤分類點與超平面間的距離,直至超平面越過該誤分類點使其被正确分類。
代碼如下:
# coding:utf-8
"""
@author:hanmy
@file:perceptron.py
@time:2019/04/25
"""
import numpy as np
class Perceptron:
def __init__(self, x, y, n, eta):
self.x = x # 執行個體點
self.y = y # 執行個體點的分類
self.n = n # 執行個體點個數
self.eta = eta # 學習率
# 随機梯度下降法
def SGD(self):
# 對w,b取初值
w = np.array([0, 0])
b = 0
# 記錄一次疊代是否有誤分類點
flag = 1
while flag == 1:
flag = 0
for i in range(n):
# 如果有誤分類點
if self.y[i] * (w.dot(self.x[i]) + b) <= 0:
# 更新w,b,設定flag為1
w = w + self.eta * self.y[i] * self.x[i]
b = b + self.eta * self.y[i]
flag = 1
return w, b
if __name__ == "__main__":
x = np.array([[3, 3], [4, 3], [1, 1]])
y = np.array([1, 1, -1])
n = 3
eta = 1
perceptron = Perceptron(x, y, n, eta)
w, b = perceptron.SGD()
print("模型參數w:", w, "b:", b)
學習到的模型參數為
(2)試調用sklearn.linear_model的Perception子產品,對訓練資料集進行分類,并對比不同學習率
對模型學習速度及結果的影響。
Perceptron(penalty=None, alpha=0.0001, fit_intercept=True, n_iter=5, shuffle=True, verbose=0, eta0=1.0, n_jobs=1, random_state=0, class_weight=None, warm_start=False)
參數
1.penalty:正則化項,預設值為None,可選值為'l2' or 'l1' or 'elasticnet'
l1讓特征值更稀疏,l2讓權值更均勻。
2.alpha:正則化系數,預設值為0.0001
正則化系數過小則無限制效力,過大則限制的太狠。
3.eta0:學習率,預設值為1,可選值為(0,1]
在w和b初始值為0時,學習率對疊代過程和最終結果無影響。
4.n_iter:疊代次數,預設值為5
方法
1.fit:用于訓練資料集
2.score:用來評價訓練效果
from sklearn.linear_model import Perceptron
import numpy as np
X = np.array([[3, 3], [4, 3], [1, 1]])
Y = np.array([1, 1, -1])
perceptron = Perceptron()
# fit用于訓練資料集
perceptron.fit(X, Y)
# coef_:權重w,intercept_:b,n_iter:疊代次數
print("w:", perceptron.coef_, "\n", "b:", perceptron.intercept_, "\n", "n_iter:", perceptron.n_iter)
# score用來評價訓練效果
res = perceptron.score(X, Y)
print("correct rate:{}".format(res))
結果如下:
w: [[1. 0.]]
b: [-2.]
n_iter: 5
correct rate:1.0