输入:
训练数据集T=(x1,y1),(x1,y1),,(xn,yn)T={(x_1, y_1), (x_1, y_1), \cdots, (x_n, y_n)},其中
xiRnyiy=1,+1,i=1,2,,n \begin{aligned} x_i \in R^n \\ y_i \in y = {-1, +1}, \\ i = 1, 2, \cdots, n \end{aligned} 学习率为η\eta
输出:
w, b
感知机模型f(x)=sign(wx+b)f(x) = sign(w \cdot x + b) 过程:

  1. 选取初值w_0, b_0
  2. 在训练集中选取数据(xi,yi)(x_i, y_i)
  3. 如果yi(wxi+b)0y_i(w \cdot x_i + b) \le 0,则 {ww+ηyixibb+ηyi \begin{cases} w \leftarrow w + \eta y_ix_i \\ b \leftarrow b + \eta y_i \end{cases}
  4. 转至2,直至训练集中没有错误分类点
    直观解释:当一个实例点被误分类, 即位于超平面错误的一侧时,则调整w,b的值,使超平面向该误分类点的一侧移动,以减少该误分类点与超平面的距离,直至超平面越过该误分类点使其被正确划分

代码: https://github.com/windmissing/LiHang-TongJiXueXiFangFa/blob/master/Chapter2/perceptron.ipynb

# 感知机原始形式
def perceptron(X, y, eta):
    w, b = np.zeros(X.shape[1]),0
    while ((y*(w.dot(X.T)+b))<=0).any():
        index = np.random.randint(X.shape[0])
        if y[index]*(w.dot(X[index])+b) <= 0:
            w = w + eta * y[index] * X[index]
            b = b + eta * y[index]
    def f(x):
        return np.sign(w.dot(x)+b)
    return w, b, f

results matching ""

    No results matching ""