感知机学习算法初步1

感知机学习算法初步—1

本博文简单介绍了感知机学习算法,给出了解决思路,算法,实验代码,以及实验结果等等。

问题定义1

给定一个训练数据集

T={(x1,y1),(x2,y2,,(xN,yN))}

其中, xiRn , yi{1,1} , i=1,2,,N ,求参数 w,b ,使其为以下损失函数极小化问题的解
minw,bL(w,b)=xiMyi(wxi+b)

其中, M 为误分类点的集合。

解决思路

感知机学习算法是无分类驱动的,具体采用随机梯度下降法(stochastic gradient descent)。首先,任意选取一个超平面 w0,b0 ,然后采用梯度下降法不断地极小化目标函数。极小化过程中不是一次使 M 中所有误分类点的梯度下降,而是一次随机选取一个误分类点使其梯度下降。


算法1 (感知机学习算法的原始形式)
输入: T ,学习率 η(0<η1)
输出: w,b
1. 随机生成初值 w=w0,b=b0
2. 如果存在误分类点,在训练集中选取误分类点 (xk,yk) ,即 yk(wxk+b)0
3. w=w+ηykxk b=b+ηyk
4. 跳转到2,直至训练集中没有误分类点


实验分析

我们以《统计学习方法》中的例2.1作为示例,来验证我们的代码正确与否,Python代码如下:

import numpy as np
import matplotlib.pyplot as plt

x = [[3,3],[4,3],[1,1]]
y = [1,1,-1]

w = np.zeros(2)
b = 0

while 1:
    for i in range(3):
        flag = 0
        if (np.dot(w,x[i])+b)*y[i] <= 0:
            w = np.add(w,np.multiply(x[i],y[i]))
            b = b+y[i]
            print i,w,b
            flag = 1
            break

    if flag == 0:
        break


print w,b

s1 = np.linspace(0,5,100)    
s2 = (-1*b-w[0]*s1)/w[1] 

plt.plot([3,4],[3,3],'*',[1],[1],'o',s1,s2,'r-')    
plt.show()

实验结果
感知机学习算法初步1_第1张图片

ID w b 误分类点
0 [0,0] 0 0
1 [3,3] 1 2
2 [2,2] 0 2
3 [1 1] -1 2
4 [0,0] -2 0
5 [3,3] -1 2
6 [2,2] -2 2
7 [1,1] -3
8 [1,1] -3

Talking is cheap, show me the code! YOU KNOW!!!

吴小同
2016-5-20


  1. 来源于李航《统计学习方法》. ↩

你可能感兴趣的:(感知机学习算法初步1)