1 描述
(1)模型:
其中 w * x 表示 w 與 x 的內積,sign 爲符號函數,當 w * x + b >= 0時,爲 1,否則爲 -1。
(2)策略:
損失函數:
其中 M 爲誤分類點的集合。
(3)算法:
因此將問題轉化爲通過調節參數 w, b使得損失函數極小化,從而使得 M 中沒有誤分類的點。
2 思路
(1)選取初值w,b
(2)在訓練集中選取數據(x,y)
(3)如果y(w * x + b)<= 0,利用隨機梯度下降算法更新w,b
梯度可以通過對損失函數分別對w,b求偏導可得。
w = w + lr · y · x; b = b + lr · y(lr 爲學習率)
(4)轉至(2)直到 M 爲空
3 實現
import numpy as np
import matplotlib.pyplot as plt
# 感知機學習算法的原始形式
# 輸入T={(x1, y1), (x2, y2), (x3, y3)}, y屬於{1,-1};學習率爲lr
# 輸出w, b; 感知機模型 f(x)=sign(w*x+b) 其中w*x表示w與x的內積
# sign爲符號函數,當w*x+b>=0時,爲1,否則爲-1
def Perceptron_orgin():
# 訓練集
x1 = np.array([3, 3], ndmin=2).T
x2 = np.array([4, 3], ndmin=2).T
x3 = np.array([1, 1], ndmin=2).T
input = [x1, x2, x3]
targets = [1, 1, -1]
# 初始化w,b,lr
w = np.zeros(2).reshape(1, 2)
b = 0
lr = 1
while True:
num_errors = 0
for i in range(3):
# 判斷是否誤分類
if targets[i] * (np.dot(w, input[i])[0][0] + b) <= 0:
# 利用隨機梯度下降算法,更新w,b
w += lr * targets[i] * input[i].T
b += lr * targets[i]
# 誤分類個數加1
num_errors += 1
# M中爲空訓練結束
if num_errors == 0:
print(w, b)
break
# 畫出超平面(二維中即一條直線)
x = np.random.rand(10)*5
y = -(w[0][0] / w[0][1]) * x - b / w[0][1]
plt.plot(x, y, 'g')
# 畫出訓練集中的點
plt.scatter(x1[0, 0], x1[1, 0], c='r')
plt.scatter(x2[0, 0], x2[1, 0], c='r')
plt.scatter(x3[0, 0], x3[1, 0], c='b')
plt.show()
if __name__ == '__main__':
Perceptron_orgin()