《统计学习》——感知机
本文不是像网上大多数的博文那样,洋洋洒洒的写一大篇文章,只是记录下学习机器学习的一些总结与心得,志在总结与和同道中人一起讨论,分享各自的想法。
1.何为感知机?
我们在学习机器学习的时候,基本都是从感知机开始的,为什么?因为它的思想较为易懂和容易实现,而且对于一般的问题(如二分类问题),效果也很好。感知机是神经网络和支持向量机SVM的基础,也被称为“单层神经网络”。
感知机是二分类分类的线性分类模型,输入为实例的特征向量,输出为实例的类别,定义为+1和-1两个值。说白了,就是通过一个 超平面 把输入的实例切分为正实例和负实例,归为判别模型。【注意(1)超平面,很多人被一些博文误导,以为感知机模型就是一条切分线,其实是不对的。注意了,感知机的输入是特征向量,所以可以是n多维度的,如果输入实例是2维度的,超平面才会退化为一条“线”,如果是3维度,那么就是特征空间中的一个“面”。】
2.感知机模型
为了效率,直接把李航先生的《统计学习方法》的内容直接搬过来了,想看完整内容的请移步《统计学习方法》的第二章。
由感知机的模型,引出了一些术语:特征空间、特征向量、权值向量、偏置。为了方便大家,下面直接对它们做出解释。
- 特征空间:特征是对原始数据的抽象,是从原始数据中提取特征并把原始数据映射到一个更高维的空间,方便研究。例如文本,就是把词向量化。
- 特征向量:线性变换的特征向量(本征向量)是一个非简并的向量,其方向在该变换下不变。详细只能去查资料了,不然一篇博文都写不下原理。
- 权值向量:权向量ωm中的权系数ωi的大小代表相应目标fi在多目标最优化问题中的重要程度,ωi越大表示fi在问题中越重要,反之,越小的ωi表示fi越不重要。其实表示目标的重要程度。
- 偏置:就是超平面的的移动偏离,也是截距。
由感知机模型知道,x是实例输入,已知的,正是通过其来确定 w 和 b。最常用的方法是梯度下降法,通过逐渐逼近的方法来求出完全分类时的w和b参数。
3.感知机的学习策略
-
注意2说明:||w||其实就是加权向量的平方加和的开方。如果不知道这公式可以看下面的点到直线的距离的公式:
-
可以引出函数距离(functional margins)和几何距离(geometrical margins)。假设x∈Rn,那么显然wTx+b=0是一个超平面。通过推导,空间中的任意一点x(i)到这个超平面的距离为 L=w*x+b / ||w||
-
注意3说明:感知机模型判断有误时,对于数据(xi, yi)来说,-yi(w*xi + b)>0 。为什么?因为感知机模型判断正确时,应是以下结果: wxi+b>0,yi=1,wxi+b<0,y=-1 。举个例子如下图
- 注意4 5说明:没什么好说的,就是根据是上面的空间中点到直线的距离公式得来,并且把所有维度考虑进来。
-
注意6说明:这里要注意了。很多人疑惑,为什么在推出感知机的损失函数时||w||可以忽略。在这里给出我自己的观点。
- 1.感知机主要是靠在迭代的过程中判断sign的符号,也即+1/-1来逐渐优化感知机模型的达到分类的目的的,既然是通过正负变化来判断,那么||w||是恒大于0的,不影响迭代判断的符号变换,因此可以忽略。
- 2.w是输入实例的加权向量,在训练模型的时候,w的维度是根据训练集x的维度已经确定的了,对于损失函数的优化,很明显是优化可变项,所以||w||是不变的,所以可以忽略。
-
注意7说明:这是最终的感知机的损失函数定义了,也就是把二分类优化问题,转换为求损失函数的最优,也就是通过某些方法(朴素贝叶斯or梯度下降法)求出使损失函数值最小的w和b两个模型参数。
4.感知机学习算法
给定数据集T,学习率η
- 1.选取初值w0,b0
- 2.根据函数距离选取误分类点
- 3.更新w,b
- 4.转至 2,直至没有误分类点
详细的推导过程请看《统计学习方法》一书。
5.Python实现感知机小例子
# -*- coding:utf-8 -*- import copy training_set = [[(3, 3), 1], [(4, 5), 1], [(1, 1), -1], [(1, 2), -1]] w = [0, 0] b = 0 history = [] def update(item): global w, b, history w[0] += 1 * item[1] * item[0][0] w[1] += 1 * item[1] * item[0][1] b += 1 * item[1] print w, b history.append([copy.copy(w), b]) def cal(item): res = 0 for i in range(len(item[0])): res += item[0][i] * w[i] res += b res *= item[1] return res def check(): flag = False for item in training_set: if cal(item) <= 0: flag = True update(item) if not flag: print "RESULT: w: " + str(w) + " b: " + str(b) return flag if __name__ == "__main__": for i in range(1000): if not check(): break
6.小结
感知机虽然简单,但是简单就是美,它是神经网络和支持向量机的基础。比如感知机和支持向量机最大的区别是,感知机只是为了分正确,但是支持向量机还考虑了最优选择,扩展了优化函数的参数是L2范数,可以通过核函数把低维不可分数据向高维映射,从而达到线性化处理的目的。这些后面深入学到再来分析。