原始形式
模型
线性二分类模型
\[f\left( x \right) = sign\left( {w \cdot x + b} \right)\]
学习策略
误分类点到超平面函数距离最小化
损失函数:$\mathop {\min }\limits_{w,b} L\left( {w,b} \right) = - \sum\limits_{{x_i} \in M} {{y_i}\left( {w \cdot {x_i} + b} \right)} ,M$是误分类点集合
参数更新方式
随机选择一个误分类点$\left( {{x_i},{y_i}} \right)$,对w,b进行更新:
\[\begin{array}{l}
w \leftarrow w + \eta {y_i}{x_i}\\
b \leftarrow b + \eta {y_i}
\end{array}\]
其中$\eta $是学习率
对偶形式
模型表示
假设w,b初始值为0,则最后学习到的w,b可表示为:
\[\begin{array}{l}
w = \sum\limits_{i = 1}^N {{\alpha _i}{y_i}{x_i}} \\
b = \sum\limits_{i = 1}^N {{\alpha _i}{y_i}} \\
{\alpha _i} = {n_i}\eta
\end{array}\]
其中${n_i}$表示第$i$个误分类点修改的次数
这样感知机模型可以表示为:
\[f\left( x \right) = sign\left( {\sum\limits_{j = 1}^N {{\alpha _j}{y_j}{x_j} \cdot x + b} } \right)\]
参数更新方式
随机选择一个样本$\left( {{x_i},{y_i}} \right)$,如果${y_i}\left( {\sum\limits_{j = 1}^N {{\alpha _j}{y_j}{x_j} \cdot {x_i} + b} } \right) \le 0$,对$w,b$进行更新:
\[\begin{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矩阵(${\rm{G}} = {\left[ {{x_i} \cdot {x_j}} \right]_{N \times N}}$)来加快运算速度。
代码实现
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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