目录
Python复现,使用了随机梯度下降法,梯度下降法,adagrad和对偶形式四种算法:
[舟晓南:感知机模型python复现 - 随机梯度下降法;梯度下降法;adagrad;对偶形式]
1. 走近感知机 - 感知机与童话
回想一下,在现实生活中,我们是怎么对事物进行分类的?首先,我们需要对这个事物进行观察,我们需要知道它的形状,颜色,大小,触感,温度等等不同的特征,在对这个事物的特征有足够多的认知的时候,就可以对其进行分类了。
当然,现实中我们几乎感觉不到这个过程,因为大脑的运算速度非常快,当我们看到一个苹果的时候,我们立刻就知道这是一个苹果,而不是一个西瓜,但事实上依然走过了上述的过程。
更符合感知机模型的例子是,如果只是由另一个人给你转述这个水果的特征,那你就会对这个判断的过程有一个清晰的实感了。
比如他人告诉你这是一个圆形的水果,你可能会认为它是一个樱桃,或者苹果,或者西瓜,这是因为我们对它的特征的了解还不够,接着又告诉你这是一个红色的苹果,现在我们知道它不是西瓜了,但还不能判断是樱桃还是水果,最后,他又让你用手感受了一下大小,现在我们能够确定是苹果了。
但在上面的例子中,我们候选的分类中有太多的水果, 但现在要学习的感知机,只能对一个事物分成两类,颇为极端了。
这有些像童话中的简单却极端的想法,认为这个世界只有好人与坏人,只有黑与白,只有正面与反面,感知机就是这样一个思想简单却极端的童话,它只能对一个事物进行两个类别的分类。
在明白感知机要解决的问题后,我们需要了解感知机的数学形式,这样才能在数学上实现感知机。
2.重要概念
在正式介绍感知机模型之前,需要先对一些基本概念有所了解,如果明白这些概念可以直接跳过。
感知机模型: 二分类模型且线性可分。
二分类: 个体均可被分为两个类别,比如每个人按照生物学性别可分为男和女,通常将其中一个类别作为正类,用1表示,将另一个作为负类,用-1表示。一般将更加关注的类别作为正类。
线性可分: 可以用超平面将不同的样本完全分开。
分离超平面: 超平面是指n维线性空间中维度为n-1的子空间,分离超平面是一个可以把线性空间分割成不相交的两部分的超平面。对于二维和三维空间来说,该平面即分别为一条线和一个面,对于四维空间来说为一个体,对于五维空间,是一个四维几何结构。
数据集,特征,实例,标记:
其中数据集可以有:训练集,验证集和测试集。训练集用来建构模型,验证集用来选择模型,测试集用来测试模型。
监督学习: 当训练集中的实例有标记时,用此类训练集来训练模型叫监督学习。
非监督学习: 当训练集中的实例没有标记时,用此类训练集来训练模型叫非监督学习。机的构建。
3. 感知机模型的数学形式
输入空间X:n维实数的子集。
这里的n就是特征的个数,每个特征只能用实数来表示,但如果有的特征无法用实数来表示怎么办呢?比如颜色?这时我们可以将它用实数代码替换,比如红色为1,黄色为2,绿色为3等等。
输入变量x:x属于X
输出空间Y:因为是二分类问题,我们用1和-1代表两个类。
输出变量y:要么是1要么是-1
由输入空间到输出空间的如下函数:
称为感知机。
w叫做权值向量,b叫作偏置。w·x表示w和x的内积,即w1x1+w2x2…+wn*xn。Sign是符号函数。
首先解释为什么w不是一个实数而是一个向量。如果我们只考虑一个特征,比如头发的长短来区分人的性别,认为长发可分为女,短发可分为男,那么此时头发的长短只需要一维空间即可表示(ax),每一个ax都代表一个点,遍历实数x(假设头发长短为实数,且在-∞到+∞之间),即可得到整个一维空间。此时如果我们规定头发大于等于半米为女,用1代表,小于半米为男,用-1代表,可以再加上偏置和符号函数,f(x) = sign(ax-0.5),其中0.5即为偏置,用b代表,如果ax-0.5≥0,则f(x)=1,分为男性,如果ax-0.5≤0.5,则f(x)=-1,分为女性。
那么x前面的a是什么意思呢?直观认知是x的重要程度,比如在上面的例子中,头发长短对判断性别的重要程度是a,不过,重要程度在有多个变量时才能有更具体的体现。
现在我们发现,只用头发长短并不能对性别进行准确分类,还需要加上另一个特征,比如身高,此时头发长短用x1表示,身高用x2表示。那么此时感知机变为f(x) = sign(a1x1 + a2x2 + b)。
此时权值也有两个,分别为x1前面的a1,和x2前面的a2,这两个权值分别代表了头发长短和身高的重要程度,如果头发长短对判断性别更重要,则a1>a2,反之,则a2>a1。
如果仅用头发长短和身高也无法准确分类呢,我们还可以加入第三个特征,第四个特征等等,比如肌肉量和思维方式。那么此时感知机变为f(x) = sign(a1x1 + a2x2 + a3x3 + a4x4 + … + anxn + b)。
之前提到,点乘可以表示两个向量的内积,于是可以将a1x1 + a2x2 + a3x3 + a4x4 + … + anxn用a·x表示。其中a和x代表权值和特征且都是向量,因而叫做权值向量和特征向量。
感知机的更为直观的认识可以查看下图,下图显示了一个二维特征空间中的一维分离超平面,其中w是超平面的法向量,-b/||w||是原点到超平面的距离,点到超平面的距离的一般形式为:
其中 ||w|| 被称为w的L2范数,关于L2范数的定义:
好了,现在我们知道了感知机的形式,但我们怎么得到一个合适的感知机呢?总不能在特征空间中随便画一个超平面,就是一个合适的感知机吧?至少,得有什么指标来判断这个感知机是否合适吧?
正是基于这样的思考,提出了损失函数的概念。
简单来说,损失函数代表的是模型对一个数据集的预测与该数据集的真实值之间的差距,显然,差距越大,说明模型预测越不准确,我们需要一个预测准确的模型,所以我们需要让这样的差距最小,即最小化损失函数。
对于感知机而言,损失函数为误分类点到超平面的总距离。可知损失函数越小,说明被误分类的点到超平面的距离较近,且被误分类点较少,如果损失函数为0,说明没有误分类点。
接下来构建感知机模型的损失函数。
4. 构建感知机的损失函数
感知机的损失函数为误分类点到超平面的总距离,首先看一个点到超平面的距离:
在距离公式中,
称为函数间隔,当w和b等比例放大和缩小时,函数间隔也会按照同样的间隔放大和缩小,这对于我们求取损失函数最小值没有意义。
而除以一个||w||时,即可得到一个比例,称为几何间隔,此时w和b无论怎样等比例放大缩小,||w||也会等比例放大缩小,因此两者之比不变,可以用于求取损失函数最小值。
一个更直观的理解是,以二维特征空间作为例子,二维空间中点到直线的距离为:
其中A和B组成w权值向量,就是||w||。当A和B都为原来的2倍时,函数间隔变为|2Ax+2By+2C|,此时超平面并没有改变,但是函数间隔变为原来的2倍,几何间隔则变为:
所以几何间隔仍然不变。
好,现在有了点到超平面的距离的计算公式,但是我们需要计算的是误分类点到超平面的距离,那么怎么知道哪个点是被误分的呢?
对于误分类的数据来说下式成立:
因为当w·x+b≥0且被误分时,对应的真实的y=-1,当w·x+b<0且被误分时,对应的真实的y=1。
这样就可以判断哪个点是误分类点了。现在,假定通过上式,我们将误分类点都提取了出来,数了数,一共有M个分类点,现在我们需要计算这M个误分类点到超平面的总距离,计算公式如下:
因为需要取得损失函数最小值,可以忽略常数||w||。可得其损失函数为:
好,现在有了损失函数,损失函数越大,说明对应的感知机模型越差,因此,我们需要一个损失函数最小的模型,接下来说明如何取得损失函数最小值。
5. 如何取得损失函数最小值 - 随机梯度下降法
随机梯度下降法不是一次使M中所有误分类点的梯度下降,而是一次随机选取一个误分类点使其梯度下降。
第一步,任意选择一对初始的w和b,称为w0,b0,这时得到的感知机大概率不是最合适的,大概率有很多误分类点。
接着,我们任意选择误分类点中的一个,得到它的损失函数:
然后计算该点损失函数的梯度(对损失函数求偏导):
接着更新w和b:
η是学习率,其范围在(0,1],学习率越大,则每次迭代w和b的变化越大。通过迭代可以期待总损失函数不断减小,直至训练集中没有误分类点,此时损失函数为0。
当损失函数为0,得到最终的w和b,即可代入感知机模型之中。
感知机学习算法由于采用不同的初值或选取不同的误分类点,解可以不同。
6. 感知机模型对偶形式
因为在获得超平面前对w和b进行过N次迭代,可以将:
转换为(w和b的初值取0,学习率η取1):
因为同一个点有可能被多次误分类,因此在式中αi表示同一个点被误分类的次数。对于同一个实例而言,如果它被迭代的次数较多,说明它离分离超平面越近,越难被正确分类。
误分条件为:
迭代公式为:
此时仅需要计算每个样本点的内积即可,因每次迭代样本点的内积不变,可以提前算出并以矩阵形式存储,这个矩阵被称为Gram矩阵:
比如:
以《统计学习方法》中的例子来说明感知机模型的对偶形式如何进行学习:
这里给出书中忽略的第四步迭代过程的前两步。
首先选取x1作为第一个误分类点,计算误分条件:
在上面一步中,因为已经计算了Gram矩阵,因此xj·xi这一步可以直接从Gram矩阵中选择。
进行迭代:α1 = 0+1 = 1;b = 0 + 1 = 1
第一步迭代完成,进行第二步迭代,选取x3作为误分类点,计算误分条件(利用Gram矩阵):
进行迭代:α3 = 0 + 1 = 1;b = 1 – 1 = 0
第二步迭代完成。继续迭代直到没有误分类点。
同名公众号和知乎:舟晓南
对机器学习,深度学习,python感兴趣,欢迎关注专栏,学习笔记已原创70+篇,持续更新中~ ^_^
学习笔记:数据分析,机器学习,深度学习https://www.zhihu.com/column/c_1274454587772915712
专栏文章举例:
【机器学习】关于逻辑斯蒂回归,看这一篇就够了!解答绝大部分关于逻辑斯蒂回归的常见问题,以及代码实现 - 知乎 (zhihu.com)
关于 python 二三事https://www.zhihu.com/column/c_1484952401395941377
专栏文章举例:
记录一下工作中用到的少有人知的pandas骚操作,提升工作效率 - 知乎 (zhihu.com)
关于切片时不考虑最后一个元素以及为什么从0开始计数的问题 - 知乎 (zhihu.com)
关于转行:
舟晓南:如何转行和学习数据分析 | 工科生三个月成功转行数据分析心得浅谈
舟晓南:求职数据分析师岗位,简历应该如何写?|工科生三个月成功转行数据分析心得浅谈
我建了个数据分析,机器学习,深度学习的群~ 需要学习资料,想要加入社群均可私信~
在群里我会不定期分享各种数据分析相关资源,技能学习技巧和经验等等~
详情私信,一起进步吧!