1. 程式人生 > >python實現感知機學習演算法的原始形式

python實現感知機學習演算法的原始形式

感知機

感知機(perceptron)是二類分類的線性分類模型,其輸入為例項的特徵向量,輸出為例項的類別,取+1和-1二值。感知機對應於輸入空間(特徵空間)中將例項劃分為正負兩類的分離超平面,屬於判別模型。感知機學習旨在求出將訓練資料進行線性劃分的分離超平面

感知機學習演算法的原始形式

輸入:訓練資料集 T = { (

x 1 , y 1 ) , ( x
2
, y 2 ) , . . . ,
( x N , y N ) } T=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\} ,其中 x i χ = R n x_i\in\chi=R^n y i γ = { 1 , + 1 } y_i\in\gamma=\{-1,+1\} i 1 , 2 , . . . , N i-1,2,...,N ;學習率 η ( 0 < η 1 ) \eta(0<\eta\le1)
輸出:w,b;感知機模型 f ( x ) = s i g n ( w x + b ) f(x)=sign(w \cdot x + b)
步驟:
(1)選取初值 w 0 , b 0 w_0,b_0
(2)在訓練集中選取資料 ( x i , y i ) (x_i,y_i)
(3)判斷是否誤分類,如果 y i ( w x i + b ) 0 y_i(w \cdot x_i + b)\le0 :
w w + η y i x i w\gets w+\eta y_ix_i
b b + η y i b\gets b + \eta y_i
(4)轉至(2),直至訓練集中沒有誤分類點。

python實現

#感知機演算法的原始形式
import pandas as pd
import numpy as np
dataSet = pd.DataFrame({'x1':[3,4,1], 'x2':[3,3,1], 'y':[1,1,-1]})
w = [0, 0]
b = 0
r = 1
lengths = 100
def perceptronOriginal(dataSet, w, b, r, lengths):
    X = dataSet.iloc[:,:-1].as_matrix()
    Y = dataSet.iloc[:,-1].as_matrix()
    W = np.array(w)
    count = 0
    while count < lengths:
        #記錄對於所有X是否都沒有誤分類
        correctCount = 0
        for i in range(len(X)):
        	#判斷是否屬於誤分類
            if Y[i] * (np.dot(W, X[i]) + b) <= 0:
                W = W + r * Y[i] * X[i]
                b = b + r * Y[i]
                #print('Xi:',X[i], 'Yi:',Y[i], 'W:',W, 'b:',b)
                #每次迭代更新引數後,退出迴圈,重新判斷
                break
            else:
                correctCount += 1
        count += 1
        #所有X都正確分類後
        if correctCount == len(X):
            #print (count, W, b)
            return W, b            
        #記錄迭代次數
        else:
            print (count)