感知机学习算法——统计学习方法笔记,代码实现

看了李航博士的《统计学习算法》,做一个笔记,备忘。

感知机学习算法有两种形式——原始形式、对偶形式

我先把算法的原始形式贴出来,然后一步一步的解释:

输入:训练数据集 ,其中   学习率 (0<<=1)

输出:w,b;感知机模型

(1)选取初值 

(2)在训练集中选取数据

(3)如果

                                    

                                    

(4)转至(2),直至训练集中没有误分类点


感知机是二分类学习算法,也就是说在空间内他是线性的,对于输入的点,有一个超平面 w*x + b = 0 可以将输入点分为两类(-1,+1)

那么我们就是要求出向量 w 和 截距 b,w 是超平面的法向量,法向量垂直于超平面

我们初始化一个w0,b0  如何判断这两个初始化值是否满足我们的要求,我们通过判断这个超平面误分类的点就可以。但是,只是单个的点的话,跟超平面方程的导数联系不上。我们使用误分类点的距离和作为误差函数,当这个距离和为0的时候,说明没有误差,他越接近0说明误差越小。

他的损失函数定义为:

                       


求使这个函数最小的 w 和 b , 很明显这是一个最优化问题,使用梯度下降法,分别对w 和 b 进行梯度下降求导,然后随机选取一个误分类点更新w 和 b:

                                    

                                    



下面是针对书中的例子2.1做的一个代码实现

from numpy import *
def find_wrong(inputX,inputY,w,b):
    for i in range(len(inputX)):
        res = dot(inputX[i],w) + b
        if res*inputY[i]<=0:
            return i
    return -1

def training():
    inputX = [array([3,3]),
             array([4,3]),
             array([1,1])]
    inputY = [1,1,-1]

    w = zeros(2)
    b = 0

    wrg_index = find_wrong(inputX,inputY,w,b)
    while wrg_index != -1:
        w = w + (inputY[wrg_index] * inputX[wrg_index])
        b = b + inputY[wrg_index]
        wrg_index = find_wrong(inputX,inputY,w,b)
    print w,b

if __name__=="__main__":
    training()


你可能感兴趣的:(机器学习)