根据《统计学习方法》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))