Python 純手寫 實現感知機模型及對偶形式
阿新 • • 發佈:2019-02-11
根據《統計學習方法》P29頁演算法2.1,實現感知機模型及對偶形式。
演算法2.1:
輸入:訓練資料集,learning rate alpha。
輸出:權重w,偏置b。
(1)初始化w0,b0
(2)在資料集中選定Xi,Yi帶入
(3)計算Yi * (Xi * w + b),如果小於等於0,對w和b進行更新
(4)重複(2),(3),直至無誤分類點。
Python程式碼如下:
import numpy as np x = np.array([[3,3] , [4,3] , [1,1]]) y = np.array([1 , 1 , -1]) yita = 1 def traning(x,y,yita): w = np.zeros(len(x[0])) b = 0 n = len(x) while True: j = 0 for i in range(n): if y[i]*(np.dot(x[i],w) + b) <= 0: w += x[i] * y[i] * yita b += y[i] * yita else: j += 1 if j == 3: return w , b w1 , b1 = traning(x,y,yita) print("Model:w = {}".format(w1)) print("Model:b = {}".format(b1))
演算法2.2:
輸入:訓練資料集,learning rate alpha。
輸出:a,偏置b。
(1)初始化w0,b0
(2)在資料集中選定Xi,Yi帶入
(3)計算,如果小於等於0,對a和b進行更新
(4)重複(2),(3),直至無誤分類點。
Python程式碼如下:
import numpy as np x = np.array([[3,3] , [4,3] , [1,1]]) y = np.array([1 , 1 , -1]) yita = 1 def x_dot(a,i): sum_res = 0 for xx in range(len(x)): sum_res += np.dot(x[xx],x[i]) * a[xx] * y[xx] return sum_res def training(x,y,yita): n = len(x) a = np.zeros(n) b = 0 while True: z = 0 for i in range(n): if y[i] * (x_dot(a,i) + b) <= 0: a[i] += yita b += y[i] * yita else: z += 1 if z == 3: return a , b a1 , b1 = training(x,y,yita) print("Model a1:{}".format(a1)) print("Model b1:{}".format(b1))