感知機--Python實現
阿新 • • 發佈:2018-12-17
感知機簡介
感知機是二類分類的線性分類模型,其輸入為例項的特徵向量,輸出為例項的類別,取+1和-1二值。感知機對應於輸入空間(特徵空間)中將例項劃分成正負兩類的分離超平面,屬於判別模型。感知機學習指在求出將訓練資料進行線性劃分的分離超平面。
- 前提條件:線性可分的資料集。
- 損失函式:基於誤分類的損失函式。
- 學習演算法:梯度下降法。
- L0範數:向量中非0的元素個數。
- L1範數:向量中各元素絕對值之和。
- L2範數:向量中各元素的平方和之後開根號。
原始形式
輸入:訓練資料集,學習率 輸出:w,b 感知機模型
- 選取初值
- 在訓練集中選取資料
- 如果
- 轉至2,直至訓練集中沒有誤分類點
原始形式Python程式碼: import numpy as np Data_set = np.array([[3,3,1],[4,3,1],[1,1,-1]]) w = np.array([0,0]) b = 0 theta = 1 history = [] def ganzhiji(dataset): global w, b, theta , history s = dataset.shape[0] history.append([w,b]) for i in range(s): if (dataset[i,2]*(np.dot(w,dataset[i,0:2])+b)<=0): w = w + theta*dataset[i,2]*dataset[i,0:2] b = b + theta*dataset[i,2] ganzhiji(dataset) return w,b if __name__=='__main__': s = ganzhiji(Data_set) print("最終迭代引數為:" ,s) print("迭代過程引數變化: \n" ) for i in history: print(i)
執行結果:
對偶形式
輸入:線性可分的資料集,學習率 輸出: 感知機模型:
- 在訓練集中選取資料
- 如果
- 轉至2直到沒有誤分類資料。
對偶形式中訓練例項僅以內積的形式出現,可以預先將訓練集中例項間的內積計算出來並以矩陣的形式儲存,這個矩陣就是Gram矩陣:
對偶形式
import numpy as np
Data_set = np.array([[3,3,1],[4,3,1],[1,1,-1]])
datax = Data_set[:,0:2]
datay = Data_set[:,2]
length = Data_set.shape[0]
history =[]
Gram = np.zeros([length,length])
for i in range(length):
for j in range(length):
Gram[i][j] = np.dot(datax[i],datax[j])
print("輸出格拉姆矩陣:\n",Gram)
alpha = np.zeros([1,Data_set.shape[0]])[0]
b = 0
def ganzhiji2():
global w1,w2,history,alpha,b
w1 , w2 = np.dot(alpha*datay,datax)
history.append([[w1,w2],b])
for i in range(Data_set.shape[0]):
if((np.dot(alpha*datay,Gram[:,i])+b)*datay[i] <= 0):
alpha[i] = alpha[i] + 1
b = b + datay[i]
ganzhiji2()
return alpha,b
if __name__== '__main__':
s = ganzhiji2()
print("最終迭代引數為:",w1,w2,b)
print("迭代過程引數變化: \n" )
for i in history:
print(i)
執行結果:
當訓練集線性可分時,感知機學習演算法存在無窮多個解,其解由於不同的初值或迭代順序不同而可能有所不同。