李航的统计学习方法上写的不是很详细,这个博客写的还可以。
自己尝试把感知机对偶形式的代码写了一下,假设学习率为1,我这个菜鸡,代码能力是真的差,明年就要实习了,得硬着头皮写了:
# -*- coding:utf-8 -*-
import numpy as np # 感知机对偶形式学习算法demo
data = np.array([[3, 3, 1], [4, 3, 1], [1, 1, -1]]) #生成数据
x_data = data[:, :2]
y_data = data[:, -1]
def getGram(x_data): #计算得到Gram矩阵
gram_matrix = []
for i in range(x_data.shape[0]):
for j in range(x_data.shape[0]):
gram_matrix.append(x_data[i].T.dot(x_data[j]))
gram_matrix = np.array(gram_matrix)
gram_matrix.resize([x_data.shape[0], x_data.shape[0]])
return gram_matrix
#对偶形式的感知机学习算法
n = np.array([0]*len(x_data))
key = True
while key:
key = False
for i in range(len(x_data)):
x_i = x_data[i, :]
y_i = y_data[i]
s = 0
for j in range(len(x_data)):
s += n[j]*y_data[j]*getGram(x_data)[j][i]+n[j]*y_data[j]
if y_i*s <= 0:
n[i]+=1
key = True
print("n的值:", n) # n中存放了每个样本点被修改的次数
w_d = 0
b_d = 0
for i in range(len(x_data)): #根据每个样本点的修改次数计算w_d和b_d的值
w_d += n[i]*y_data[i]*x_data[i]
b_d += n[i]*y_data[i]
print("最终w_d的值:", w_d)
print("最终b_d的值", b_d)
最后的答案和新版统计学习方法给的答案一样。