感知機算法原理及程序實現

感知機是一個二分類的線性模型,通過輸入樣本的特徵,返回樣本對應的類別,其中,類別限定爲1和-1。模型如下。(偏置已併入ω\omega
f(x)=sign(ωTx) f(x)=sign(\omega^T*x)

這個模型的主要思想是錯誤驅動,通過分錯類的樣本數據計算損失函數。
一、具體過程

  1. 隨機設置一個權重向量ω\omega,將訓練數據代入模型,把結果和真實的分類比較,得到錯誤分類集NN
  2. 建立損失函數。
    L(ω)=xiN[yi(ωTxi)] L(\omega)=\sum_{x_i\in N}[-y_i(\omega^Tx_i)]
    採用梯度下降法求得迭代式
    ω=ωλLω=ω+λxiNyixi \omega=\omega-\lambda*\frac{\partial L}{\partial \omega}=\omega+\lambda*\sum_{x_i\in N}y_i*x_i
    通過不斷迭代ω\omega的值,將數據分爲二類。

二、python代碼實現

def sign(x):
    res = [1 if temp>=0 else -1 for temp in x]
    return np.array(res).reshape(-1,1)

class Perceptron():
    def __init__(self, alpha=0.01, iteration=1000):
        """
        alpha     學習步長
        w         權重向量
        iteration 最大迭代次數
        """
        self.alpha = alpha
        self.iteration = iteration
    
    def fit(self, X, y):
        X = np.hstack((np.ones(X.shape[0]).reshape(-1,1),X))
        y = y.reshape(-1,1)
        self.w = np.random.rand(X.shape[1],1)
        self.iteration = 0
        deng = sign(X.dot(self.w))!=y
        while self.iteration<1000 and sum(deng):
            deng = sign(X.dot(self.w))!=y
            self.w = self.w + X.T.dot(y*deng)*self.alpha
            self.iteration += 1
    
    def predict(self, X):
        X = np.hstack((np.ones(X.shape[0]).reshape(-1,1),X))
        return sign(X.dot(self.w))

三、需要注意的問題

  • 該模型只能處理線性可分問題。
  • 如果遇到線性不可分問題,使用該模型可能會發生無限迭代的情況。爲此,可以設置最大迭代次數,當迭代到達最大次數時自動停止迭代;或是設定一個最大容錯的數值,能夠容忍一定程度的類別分錯。
  • 激活函數可以更改成其他的激活函數,如sigmoid、tanh等。

四、演示
以燕尾花數據集的前兩類爲例,先畫出二維的圖像。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris

data = load_iris()
X = data.data[:100]
y = data.target[:100]
y = np.array([-1 if a==0 else 1 for a in y])

plt.scatter(X[y==-1,0],X[y==-1,1],color='red',marker='o')
plt.scatter(X[y==1,0],X[y==1,1],color='blue',marker='o')


訓練

clf = Perceptron()
clf.fit(X, y)

根據ω\omega的值畫出分類平面
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章