感知机

原始形式

模型

线性二分类模型

[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
View Code

完整代码见github:https://github.com/xmm1994/machine-learning/blob/master/感知机.ipynb

原文地址:https://www.cnblogs.com/xumaomao/p/11022503.html