【学习笔记】感知机(原始)

来源:互联网 发布:学java走前端还是后端 编辑:程序博客网 时间:2024/06/06 19:01

【学习笔记】感知机(原始)

感知机(perceptron)是二分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别。

感知机模型

由输入空间到输出空间的如下函数:
f(x)=sign(wx+b)
称为感知机。

w,b为感知机模型参数。w为权值,b为偏置。
sign符号函数如下:

sign(x)={+1,1,x0x<0

学习策略

假设:训练数据集是线性可分。
策略(定义损失函数):误分类点到超平面S的总距离。

  1. 输入空间中任一点x0到超平面S的距离:
    1||w|||wx0+b|

    • 其中 ||w||wL2范数
  2. 对误分类的数据(xi,yi)有:
    [yi(wxi+b)]>0

    • 如何被误分:当wxi+b>0时,yi却等于1,而当wxi+b<0时,yi却等于+1
      正确的划分应该是:当wxi+b>0时,yi等于+1,当wxi+b<0时,yi等于1
      即:错误划分后wxi+byi始终符号相反,两者相乘恒小于零
  3. 所以,误分类点xi到超平面S的距离:
    1||w||yi(wxi+b)

  4. 所以误分类点集合M到超平面S的总距离函数:
    1||w||xiMyi(wxi+b)

  5. 不考虑1||w|| 得到损失函数:
    L(w,b)=xiMyi(wxi+b)

感知机学习算法

最优化的方法是随机梯度下降法

感知机学习算法的原始形式

损失函数最小化问题的解为,找到w,b,使得损失函数的值最小,即:
minw,bL(w,b)=xiMyi(wxi+b)

随机梯度下降法:
1. 任选一个超平面w0,b0,
2. 随机选取一个误分类点使其梯度下降。

算法:
* 输入:训练数据集,学习率η(0<η)
* 输出:w,b,f(x)=sign(wx+b)

  1. 选取初值w0,b0

  2. 在训练集中选取数据(xi,yi)

  3. 如果(xi,yi)被错误划分,即 yi(wx+b)0

    • 更新参数w,b
      ww+ηyixi
      bb+ηyi
  4. 跳转到2,直到训练集中没有误分类点。(更新参数后,测试每个点,都没有误分类结束)
#coding:utf-8'''author:zhdata:2017/9/22感知机实现,学习率为1'''w = [0,0]b = [0]def SetDate():    """    制作测试数据,采用书中例题数据。    """    return [[(3, 3), 1], [(4, 3), 1], [(1, 1), -1]]def UpDate(item):    """    更新参数w,b    """    global w, b    w[0] += item[1] * item[0][0]    w[1] += item[1] * item[0][1]    b[0] += item[1]    passdef cal(item):    """   计算并返回yi(w*xi+b)的值    """    res = 0    for i in range(len(item[0])):        res += w[i] * item[0][i]    res += b[0]    res *= item[1]    return resdef check(data):    """    检查超平面是否可以正确地分类示例。    """    flag = False    for item in data:        print(item)        if cal(item) <= 0 :            flag = True            UpDate(item)    if flag == False:        print( "RESULT: w: " + str(w) + " b: " + str(b))    return flagif __name__ == '__main__':    traindata = SetDate()    while check(traindata):        pass

小结

References

[1] 统计学习方法 李航