1. 程式人生 > >[python]感知機學習演算法實現

[python]感知機學習演算法實現

模型

  • 感知機模型是屬於二分類的線性判別模型,旨在找到一個線性超平面,能將正負例項劃分開來。
    f(x)=sign(wx+b)

學習策略

  • 學習策略即定義(經驗)損失函式並將損失函式最小化
  • 感知機的學習策略是基於誤分類點到超平面的距離之和
  • 經驗損失函式如下:
    L(w,b)=xiMyi(ωxi+b)
    其中M為誤分類點的集合,

學習演算法

  • 感知器演算法是誤分類驅動的,具體採用隨機梯度下降法。首先,任意選取一個超平面w0,b0,然後利用梯度下降不斷極小化目標函式,極小化過程中不是一次使M中所有誤分類點的梯度下降,而是一次隨機選取一個誤分類點使其梯度下降.損失函式的梯度L
    (ω,b)
    的梯度由
    wL(ω,b)=xiMyixibL(ω,b)=xiMyi
    給出
  • 隨機選取一個誤分類點(xi,yi),對w,b進行更新:
    ww+ηyixibb+ηyi
    公式中η(0<η1)是步長,在統計學中又稱為學習率。通過迭代可以期待損失函式L(ω,b)不斷減小,直到為0,綜上所述,得到如下演算法:
    演算法2.1(感知器學習演算法的原始形式)
    :T=(x1,y1),(x2,y2),,(xN,yN)xiχ=Rn,yiψ={1,+1}
    輸出:w,b;感知機模型 f(x)=sign(wx+b)
    (1)任意選取w0,b0,例如可以設定為w
    0
    =0,b0=0

    (2)在訓練資料集中選取資料(xi,yi)
    (3)計算yi(wixi+b)如果yi(wixi+b)0
    ww+ηyixibb+ηyi
    (4)轉至(2),直至訓練集中沒有誤分類點

特點

  • 感知機學習演算法簡單易於實現,在原始形式中,首先任意選取一個超平面,然後使用梯度下降演算法不斷極小化目標函式。在這個過程中一次隨機選取一個誤分類點使其梯度下降
  • 當訓練資料集是線性可分時,感知機學習演算法是收斂的,並且存在無窮多個解,而且誤分類次數滿足不等式:
    k(Rγ)2
    其中γ表示所有分類模型中能將資料集分開的超平面,而且||wi||=1,函式間隔的最小值,R
    =max1iN||x^i||

實現參考程式碼如下

# -*- coding: utf-8 -*-
"""
Created on Tue Apr 18 08:56:56 2017
感知機演算法實現
@author: Administrator
"""
import numpy as np
from sklearn.metrics import accuracy_score

class myPreception:
    def __init__(self,X,y):
        self.X=X
        self.y=y

    def dot(self,xi,w,b):
        yPre =  np.dot(w,xi)+b
        return int(yPre)

    def prediction(self):
        length = np.shape(self.X)[0]
        a = 1
        w=np.zeros([self.X.shape[1],1])
        print np.shape(w)
        b=0
        flag =True
        while flag:
            count = 0
            for i in xrange(length):
            #print np.shape(self.X[i])
                if self.y[i] ==0:
                    self.y[i] = -1
                tempY=self.dot(sel