《统计学习方法》学习笔记(1)-- 感知机

感知机(perceptron)是Frank Rosenblatt在1957年就职于Cornell航空实验室(Cornell Aeronautical Laboratory)时发明的一种人工神经网络,是一种二元线性分类器。

      定义:输入空间(特征空间),输出空间是。由输入空间到输出空间的函数称为感知机。sign是符号函数,即

       数据集,其中xi为n维实数向量),,i=1,2, … , N。如果存在某个超平面(hyperplane)S:,对于所有的实例i有;对于所有的实例i有,则称数据集T为线性可分;否则称数据集T线性不可分。

      学习策略:输入空间任一点x0到超平面S的距离为,对于误分类的数据来说,当;当,所以,。因此,误分类点到超平面S的距离为,假设所有误分类点的集合为M,那么所有误分类点到超平面的总距离为。不考虑,感知机的损失函数定义为

      求解:感知机学习算法是误分类驱动的,任意选取一个超平面w0, b0,,然后用随机梯度下降法(stochastic gradient descent)不断的极小化目标函数。梯度由损失函数分别对w和b求偏微分获得:

                   

       迭代:                (0<η<=1,步长,又称学习率)

      代码:

 

 1 # perceptron.py
 2 # -*- coding: gbk -*-
 3 #《统计学习方法》,例2.1,代码
 4 
 5 from numpy import *
 6 
 7 def getDataSet():
 8     dataMat=mat([[3,3],
 9                 [4,3],
10                 [1,1]])
11     labelSet = [1,1,-1]
12     return dataMat, labelSet
13 
14 def run(dataMat, labelSet):
15     m,n = shape(dataMat)
16     wi = mat([0,0]); bi = 0
17     wrongclass = True
18     i=0
19     print(i, "error point:", "*", " w:", wi, " b:", bi)
20     while True:
21         i += 1
22         wj = wi; bj = bi
23         wrongclass = False
24         for j in range(m):
25             if (labelSet[j]*(((wj*dataMat[j].T)[0,0]) + bj) <= 0):  #wrong classification
26                 wi = wj + labelSet[j]*dataMat[j]
27                 bi = bj + labelSet[j]
28                 wrongclass = True
29                 print(i, "error point:", j, " w:", wi, " b:", bi)
30                 break;
31         if(wrongclass == False):
32             break;

 

      代码输出:

>>> import perceptron

>>> dataMat, labelMat = perceptron.getDataSet()

>>> perceptron.run(dataMat, labelMat)

0 error point: *  w: [[0 0]]  b: 0

1 error point: 0  w: [[3 3]]  b: 1

2 error point: 2  w: [[2 2]]  b: 0

3 error point: 2  w: [[1 1]]  b: -1

4 error point: 2  w: [[0 0]]  b: -2

5 error point: 0  w: [[3 3]]  b: -1

6 error point: 2  w: [[2 2]]  b: -2

7 error point: 2  w: [[1 1]]  b: -3

>>> 

      上面的结果和书里的结果是一样的,选择的误分类点都是第一次遇到的误分类点。而实际上在选择误分类点时应该采用随机的方法来选取,每次梯度下降的时候只对随机选择的一个误分类点进行梯度下降。由于采用不同初值或选取不同的误分类点,结果可以不同。

 

posted @ 2013-06-12 10:36  TheLongRoad  阅读(457)  评论(0编辑  收藏  举报