原始形式
模型
线性二分类模型
[fleft( x ight) = signleft( {w cdot x + b} ight)]
学习策略
误分类点到超平面函数距离最小化
损失函数:$mathop {min }limits_{w,b} Lleft( {w,b} ight) = - sumlimits_{{x_i} in M} {{y_i}left( {w cdot {x_i} + b} ight)} ,M$是误分类点集合
参数更新方式
随机选择一个误分类点$left( {{x_i},{y_i}}
ight)$,对w,b进行更新:
[egin{array}{l}
w leftarrow w + eta {y_i}{x_i}\
b leftarrow b + eta {y_i}
end{array}]
其中$eta $是学习率
对偶形式
模型表示
假设w,b初始值为0,则最后学习到的w,b可表示为:
[egin{array}{l}
w = sumlimits_{i = 1}^N {{alpha _i}{y_i}{x_i}} \
b = sumlimits_{i = 1}^N {{alpha _i}{y_i}} \
{alpha _i} = {n_i}eta
end{array}]
其中${n_i}$表示第$i$个误分类点修改的次数
这样感知机模型可以表示为:
[fleft( x ight) = signleft( {sumlimits_{j = 1}^N {{alpha _j}{y_j}{x_j} cdot x + b} } ight)]
参数更新方式
随机选择一个样本$left( {{x_i},{y_i}} ight)$,如果${y_i}left( {sumlimits_{j = 1}^N {{alpha _j}{y_j}{x_j} cdot {x_i} + b} } ight) le 0$,对$w,b$进行更新:
[egin{array}{l}
{alpha _i} leftarrow {alpha _i} + eta \
b leftarrow b + eta {y_i}
end{array}]
这个公式可以理解为:对于第$i$个样本每被误分类一次,这个样本对应的参数${alpha _i}$就更新一次。
对偶形式的优点
对偶形式的模型计算每个样本的预测值时向量乘积部分以${x_j} cdot {x_i}$的形式存在,这样通过提前计算Gram矩阵(${ m{G}} = {left[ {{x_i} cdot {x_j}} ight]_{N imes N}}$)来加快运算速度。
代码实现
class Model(object): def __init__(self, W, b, l_rate): self.W = W self.b = b self.l_rate = l_rate def sign(self, X): y = np.dot(self.W, X) + self.b return y def fit(self, X_train, y_train): while True: have_wrong = False for i in range(len(X_train)): X = X_train[i].transpose() y = y_train[i] if y * self.sign(X) <= 0: self.W += (self.l_rate * y * X).transpose() self.b += self.l_rate * y have_wrong = True if have_wrong == False: break
完整代码见github:https://github.com/xmm1994/machine-learning/blob/master/感知机.ipynb