感知機學習算法的原始形式及其Python實現

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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章