感知機是一個二分類的線性模型,通過輸入樣本的特徵,返回樣本對應的類別,其中,類別限定爲1和-1。模型如下。(偏置已併入)
這個模型的主要思想是錯誤驅動,通過分錯類的樣本數據計算損失函數。
一、具體過程
- 隨機設置一個權重向量,將訓練數據代入模型,把結果和真實的分類比較,得到錯誤分類集。
- 建立損失函數。
採用梯度下降法求得迭代式
通過不斷迭代的值,將數據分爲二類。
二、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)
根據的值畫出分類平面