[python]感知機學習演算法實現
阿新 • • 發佈:2019-01-22
模型
- 感知機模型是屬於二分類的線性判別模型,旨在找到一個線性超平面,能將正負例項劃分開來。
f(x)=sign(w∗x+b)
學習策略
- 學習策略即定義(經驗)損失函式並將損失函式最小化
- 感知機的學習策略是基於誤分類點到超平面的距離之和
- 經驗損失函式如下:
L(w,b)=−∑xi∈Myi(ω⋅xi+b)
其中M為誤分類點的集合,
學習演算法
- 感知器演算法是誤分類驅動的,具體採用隨機梯度下降法。首先,任意選取一個超平面
w0,b0 ,然後利用梯度下降不斷極小化目標函式,極小化過程中不是一次使M中所有誤分類點的梯度下降,而是一次隨機選取一個誤分類點使其梯度下降.損失函式的梯度L 的梯度由
∇wL(ω,b)=−∑xi∈Myixi∇bL(ω,b)=−∑xi∈Myi
給出 - 隨機選取一個誤分類點
(xi,yi) ,對w,b 進行更新:
w←w+ηyixib←b+η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(w∗x+b)
(1)任意選取w0,b0 ,例如可以設定為w
(2)在訓練資料集中選取資料(xi,yi)
(3)計算yi(wi⋅xi+b) 如果yi(wi⋅xi+b)≤0
w←w+ηyixib←b+ηyi
(4)轉至(2),直至訓練集中沒有誤分類點
特點
- 感知機學習演算法簡單易於實現,在原始形式中,首先任意選取一個超平面,然後使用梯度下降演算法不斷極小化目標函式。在這個過程中一次隨機選取一個誤分類點使其梯度下降
- 當訓練資料集是線性可分時,感知機學習演算法是收斂的,並且存在無窮多個解,而且誤分類次數滿足不等式:
k≤(Rγ)2
其中γ 表示所有分類模型中能將資料集分開的超平面,而且||wi||=1 ,函式間隔的最小值,R
實現參考程式碼如下
# -*- 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