《统计学习方法》学习笔记(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
>>>
上面的结果和书里的结果是一样的,选择的误分类点都是第一次遇到的误分类点。而实际上在选择误分类点时应该采用随机的方法来选取,每次梯度下降的时候只对随机选择的一个误分类点进行梯度下降。由于采用不同初值或选取不同的误分类点,结果可以不同。