感知机是SVM和神经网络的基础。
一、感知机的原理
感知机是二分类的线性模型,其输入是实例的特征向量,输出的是实例的类别,分别是+1和-1,属于判别模型。
假设训练数据集是线性可分的,感知机学习的目标是求得一个能够将训练数据集正实例点和负实例点完全正确分开的分离超平面。如果是非线性可分的数据,则最后无法获得超平面
二、感知机模型
![](https://i-blog.csdnimg.cn/blog_migrate/b3f5c65d3423342f6a7401b270ade32d.png)
感知机从输入空间到输出空间的模型如下:
![](https://i-blog.csdnimg.cn/blog_migrate/c765bc44608fc0336450b8ae5960e98a.png)
1.感知机的损失函数
损失函数的两个选择:
(1)误分类点的总数,但是,这样的损失函数不是参数w,b的连续可导函数。
(2)误分类点到超平面S的总距离,这是感知机所采用的的。
我们损失函数的优化目标,就是期望使误分类的所有样本,到超平面的距离之和最小。
所以损失函数定义如下:
![](https://i-blog.csdnimg.cn/blog_migrate/937d4e15fca218636fe6642fe4c79409.png)
其中M集合是误分类点的集合。
不考虑 1 ∣ ∣ w ∣ ∣ \frac{1}{||w||} ∣∣w∣∣1,就得到感知机模型的损失函数:
![](https://i-blog.csdnimg.cn/blog_migrate/156b97e999b3fd936556dc05393b81ce.png)
2.为什么可以不考虑 1 ∣ ∣ w ∣ ∣ \frac{1}{||w||} ∣∣w∣∣1
网上有人说 1 ∣ ∣ w ∣ ∣ \frac{1}{||w||} ∣∣w∣∣1是个定值,但是个人觉得平面不唯一,这个值肯定也会变。通过参考他人观点结合思考,觉得原因可以列为以下两点。
- 1 ∣ ∣ w ∣ ∣ \frac{1}{||w||} ∣∣w∣∣1不影响 y i ( w ⋅ x i + b ) y_i(w⋅x_i+b) yi(w⋅xi+b)正负的判断,即不影响学习算法的中间过程。因为感知机学习算法是误分类驱动的,这里需要注意的是所谓的“误分类驱动”指的是我们只需要判断 − y i ( w ⋅ x i + b ) -y_i(w⋅x_i+b) −yi(w⋅xi+b)的正负来判断分类的正确与否,而 1 ∣ ∣ w ∣ ∣ \frac{1}{||w||} ∣∣w∣∣1并不影响正负值的判断。所以 1 ∣ ∣ w ∣ ∣ \frac{1}{||w||} ∣∣w∣∣1对感知机学习算法的中间过程可以不考虑。
-
1
∣
∣
w
∣
∣
\frac{1}{||w||}
∣∣w∣∣1不影响感知机学习算法的最终结果。因为感知机学习算法最终的终止条件是所有的输入都被正确分类,即不存在误分类的点。则此时损失函数为0.
对应于 1 ∣ ∣ w ∣ ∣ \frac{1}{||w||} ∣∣w∣∣1
∑ i ∈ M ∑_{i∈M} ∑i∈M y i ( w ⋅ x i + b ) y_i(w⋅x_i+b) yi(w⋅xi+b),即分子为0.则可以看出 1 ∣ ∣ w ∣ ∣ \frac{1}{||w||} ∣∣w∣∣1对最终结果也无影响。
综上所述,即使忽略 1 ∣ ∣ w ∣ ∣ \frac{1}{||w||} ∣∣w∣∣1,也不会对感知机学习算法的执行过程产生任何影响。反而还能简化运算,提高算法执行效率。
三、感知机学习算法
感知机学习算法是对上述损失函数进行极小化,求得 w w w和 b b b。但是用普通的基于所有样本的梯度和的均值的批量梯度下降法(BGD)是行不通的,原因在于我们的损失函数里面有限定,只有误分类的M集合里面的样本才能参与损失函数的优化。 所以我们不能用最普通的批量梯度下降,只能采用随机梯度下降(SGD)。目标函数如下:
![](https://i-blog.csdnimg.cn/blog_migrate/8e9f7a168ca6aae6365ce604a2e300df.png)
1.原始形式算法
输入:训练数据集
T
=
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
.
.
.
,
(
x
N
,
y
N
)
T=(x_1,y_1),(x_2,y_2),...,(x_N,y_N)
T=(x1,y1),(x2,y2),...,(xN,yN),
y
i
∈
−
1
,
+
1
y_i∈{ −1,+1}
yi∈−1,+1,学习率
η
(
0
<
η
<
1
)
η(0<η<1)
η(0<η<1)
输出: w , b w,b w,b;感知机模型 f ( x ) = s i g n ( w ⋅ x + b ) f(x)=sign(w⋅x+b) f(x)=sign(w⋅x+b)
- 1.赋初值 w 0 , b 0 w_0,b_0 w0,b0
- 2.选取数据点 ( x i , y i ) (x_i,y_i) (xi,yi)
- 3.判断该数据点是否为当前模型的误分类点,即判断若 y i ( w ⋅ x i + b ) < = 0 y_i(w⋅x_i+b)<=0 yi(w⋅xi+b)<=0则更新
![](https://i-blog.csdnimg.cn/blog_migrate/545ffeb5f2f7a6783355f0e13508eb80.png)
- 4.转到2,直到训练集中没有误分类点
2.对偶形式算法
由于 w , b w,b w,b的梯度更新公式:
![](https://i-blog.csdnimg.cn/blog_migrate/4880219c3d81ee874d1c4366809bef21.png)
我们的 w , b w,b w,b经过了n次修改后的,参数可以变化为下公式,其中 α = n y α=ny α=ny:
![](https://i-blog.csdnimg.cn/blog_migrate/3cc0e030c69128d65e8623ade671570c.png)
这样我们就得出了感知机的对偶算法。
输入:训练数据集 T = ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) T=(x_1,y_1),(x_2,y_2),...,(x_N,y_N) T=(x1,y1),(x2,y2),...,(xN,yN), y i ∈ − 1 , + 1 y_i∈{ −1,+1} yi∈−1,+1,学习率 η ( 0 < η < 1 ) η(0<η<1) η(0<η<1)
输出: α , b α,b α,b;感知机模型 f ( x ) = s i g n ( ∑ j = 1 n α j y j x j ⋅ x + b ) f(x)=sign(∑^n_{j=1}α_jy_jx_j⋅x+b) f(x)=sign(∑j=1nαjyjxj⋅x+b)
其中 α = ( α 1 , α 2 , . . . , α n ) T α=(α_1,α_2,...,α_n)^T α=(α1,α2,...,αn)T
- 1.赋初值 w 0 , b 0 w_0,b_0 w0,b0
- 2.选取数据点 ( x i , y i ) (x_i,y_i) (xi,yi)
- 3.判断该数据点是否为当前模型的误分类点,即判断若 y i ( ∑ j = 1 n α j y j x j ⋅ x + b ) y_i(∑^n_{j=1}α_jy_jx_j⋅x+b) yi(∑j=1nαjyjxj⋅x+b)则更新
![](https://i-blog.csdnimg.cn/blog_migrate/1ae9cfb8c458d248b66e2989f86f3167.png)
- 4.转到2,直到训练集中没有误分类点
为了减少计算量,我们可以预先计算式中的内积,得到Gram矩阵
![](https://i-blog.csdnimg.cn/blog_migrate/f120124bf267477fcdfc2369d26e1862.png)
详细的推导请看:《统计学习方法》李航著
链接:https://pan.baidu.com/s/1ASPUujzDU6rLmxG72DGiyQ
提取码:5vwt
3.原始形式和对偶形式的选择
在向量维数(特征数)过高时,计算内积非常耗时,应选择对偶形式算法加速。
在向量个数(样本数)过多时,每次计算累计和就没有必要,应选择原始算法
四、小结
感知机算法是一个简单易懂的算法,自己编程实现也不太难。前面提到它是很多算法的鼻祖,比如支持向量机算法,神经网络与深度学习。因此虽然它现在已经不是一个在实践中广泛运用的算法,还是值得好好的去研究一下。感知机算法对偶形式为什么在实际运用中比原始形式快,也值得好好去体会。
缺点:
感知机是线性的模型,其不能表达复杂的函数,不能出来线性不可分的问题,其连异或问题(XOR)都无法解决,因为异或问题是线性不可分的,怎样解决这个问题呢,通常有两种做法。
其一:用更多的感知机去进行学习,这也就是人工神经网络的由来。
其二:用非线性模型,核技巧,如SVM进行处理。
参考资料:
[1] https://www.cnblogs.com/huangyc/p/9706575.html
[2]《统计学习方法》李航著