感知机
感知机在1957年被提出,算是最古老的分类方法之一。
虽然感知机泛化能力不及其他的分类模型,但是如果能够对感知机的原理有一定的认识,在之后学习支持向量机、神经网络等机器学习算法的时候会轻松很多。
感知机学习目标
感知机模型
感知机的损失函数和目标函数
感知机原始形式和对偶形式
感知机流程
感知机优缺点
感知机引入
线性可分和线性不可分
每逢下午有体育课,总会有男孩和女孩在学校的操场上玩耍。
假设由于传统思想的影响,男孩总会和男孩一起打打篮球,女孩总会和女孩一起踢毽子、跳跳绳,如下图所示。
import numpy as np
import matplotlib. pyplot as plt
from matplotlib. font_manager import FontProperties
% matplotlib inline
font = FontProperties( fname= '/Library/Fonts/Heiti.ttc' )
np. random. seed( 1 )
x1 = np. random. random( 20 ) + 1.5
y1 = np. random. random( 20 ) + 0.5
x2 = np. random. random( 20 ) + 3
y2 = np. random. random( 20 ) + 0.5
plt. subplot( 121 )
plt. scatter( x1, y1, s= 50 , color= 'b' , label= '男孩(+1)' )
plt. scatter( x2, y2, s= 50 , color= 'r' , label= '女孩(-1)' )
plt. vlines( 2.8 , 0 , 2 , colors= "r" , linestyles= "-" , label= '$wx+b=0$' )
plt. title( '线性可分' , fontproperties= font, fontsize= 20 )
plt. xlabel( 'x' )
plt. legend( prop= font)
plt. subplot( 122 )
plt. scatter( x1, y1, s= 50 , color= 'b' , label= '男孩(+1)' )
plt. scatter( x2, y2, s= 50 , color= 'r' , label= '女孩(-1)' )
plt. scatter( 3.5 , 1 , s= 50 , color= 'b' )
plt. title( '线性不可分' , fontproperties= font, fontsize= 20 )
plt. xlabel( 'x' )
plt. legend( prop= font, loc= 'upper right' )
plt. show( )
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IpLeIFUM-1582628772276)(02-01%20%E6%84%9F%E7%9F%A5%E6%9C%BA_files/02-01%20%E6%84%9F%E7%9F%A5%E6%9C%BA_7_0.png)]
从左图中也可以看出总能找到一条直线将男孩和女孩分开,即男孩和女孩在操场上的分布是线性可分的,此时该分隔直线为ω x + b = 0
\omega{x}+b=0
ω x + b = 0
其中ω , b \omega,b ω , b 是参数,x x x 是男孩和女孩共有的某种特征。
如果某个男孩不听话跑到女孩那边去了,如下图右图所示,则无法通过一条直线能够把所有的男孩和女孩分开,则称男孩和女孩在操场上的分布是线性不可分的,即无法使用感知机算法完成该分类过程。
上述整个过程其实就是感知机实现的一个过程。
感知机详解
感知机模型
感知机是一个二分类线性模型,即输出为实例的类别,一般为其中一类称为正类( + 1 ) (+1) ( + 1 ) ,另一类称为负类( − 1 ) (-1) ( − 1 ) 。可以把上图所示的男孩( + 1 ) (+1) ( + 1 ) 称为正类,女孩( − 1 ) (-1) ( − 1 ) 称为负类。
假设有m m m 个实例n n n 维特征并且数据线性可分的数据集T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯ , ( x m , y m ) }
T = \{(x_1,y_1),(x_2,y_2),\cdots,(x_m,y_m)\}
T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯ , ( x m , y m ) }
它的输出空间即y y y 的取值是y = { + 1 , − 1 } y=\{+1,-1\} y = { + 1 , − 1 } 。
由于数据线性可分,如果是二维空间,则总能找到一条直线将二维空间中的数据集分为两类,如上图所示的ω x + b = 0 \omega{x}+b=0 ω x + b = 0 ,如果是三维空间,则能找到一个平面把三维空间中的数据集分为两类。对于上述的假设的数据集T T T ,则总能找到一个超平面S S S 将该数据集分成两类,该超平面S S S 可以记作ω 1 x 1 + ω 2 x 2 + ⋯ + ω n x n + b = 0
\omega_1x_1 + \omega_2x_2 + \cdots + \omega_nx_n + b = 0
ω 1 x 1 + ω 2 x 2 + ⋯ + ω n x n + b = 0
其中如果假设ω 0 = b , x 0 = 1 \omega_0=b,x_0=1 ω 0 = b , x 0 = 1 ,则超平面为ω 0 x 0 + ω 1 x 1 + ω 2 x 2 + ⋯ + ω n x n = 0
\omega_0x_0 + \omega_1x_1 + \omega_2x_2 + \cdots + \omega_nx_n =0
ω 0 x 0 + ω 1 x 1 + ω 2 x 2 + ⋯ + ω n x n = 0
如果把上述公式使用向量来表示,则超平面为ω T x = 0
\omega^Tx = 0
ω T x = 0
其中ω , x \omega,x ω , x 都为n + 1 n+1 n + 1 维的向量。
如果把ω T x > 0 \omega^Tx > 0 ω T x > 0 内的数据集看成一类;把ω T x < 0 \omega^Tx < 0 ω T x < 0 内的数据集看成另一类,即通过ω T x = 0 \omega^Tx=0 ω T x = 0 成功将数据集分为两类。为了将两个类别符号化,我们可以使用s i g n sign s i g n 函数,由此即可得到感知机的模型为s i g n ( ω T x ) = { 1 , ω T x > 0 − 1 , ω T x < 0
sign(\omega^Tx)=
\begin{cases}
1, \quad \omega^Tx > 0 \\
-1, \quad \omega^Tx < 0
\end{cases}
s i g n ( ω T x ) = { 1 , ω T x > 0 − 1 , ω T x < 0
感知机损失函数
假设有一个线性可分的数据集T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯ , ( x i , y i ) , ⋯ , ( x m , y m ) }
T = \{(x_1,y_1),(x_2,y_2),\cdots,(x_i,y_i),\cdots,(x_m,y_m)\}
T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯ , ( x i , y i ) , ⋯ , ( x m , y m ) }
则数据集中的样本x i x_i x i 到超平面S S S 的距离为∣ ω T x i ∣ ∣ ∣ ω ∣ ∣
{\frac{|\omega^Tx_i|}{||\omega||}}
∣ ∣ ω ∣ ∣ ∣ ω T x i ∣
其中∣ ∣ ω ∣ ∣ ||\omega|| ∣ ∣ ω ∣ ∣ 为L2范数。
该距离公式源自于数学中点( x 0 , y 0 ) (x_0,y_0) ( x 0 , y 0 ) 到面A x + B y + C = 0 Ax+By+C=0 A x + B y + C = 0 的公式A x 0 + B y 0 + C A 2 + B 2
\frac{Ax_0+By_0+C}{\sqrt{A^2+B^2}}
A 2 + B 2 A x 0 + B y 0 + C
假设存在一个误分类的样本( x i , y i ) (x_i,y_i) ( x i , y i ) ,对有误分类的样本都存在− y i ( ω T x i ) > 0 - y_i(\omega^Tx_i) > 0 − y i ( ω T x i ) > 0 。因为误分类时当ω T x i = 1 \omega^Tx_i = 1 ω T x i = 1 时y i = − 1 y_i = -1 y i = − 1 ;当ω T x i = − 1 \omega^Tx_i = -1 ω T x i = − 1 时y i = 1 y_i = 1 y i = 1 。因此∣ ω T x i ∣ = − y i ( ω T x i ) |\omega^Tx_i| = -y_i(\omega^Tx_i) ∣ ω T x i ∣ = − y i ( ω T x i ) ,则误分类点到超平面S S S 的距离即损失函数为− y i ( ω T x i ) ∣ ∣ ω ∣ ∣
-{\frac{y_i(\omega^Tx_i)}{||\omega||}}
− ∣ ∣ ω ∣ ∣ y i ( ω T x i )
感知机目标函数
假设误分类点的集合为M M M ,那么所有误分类点到超平面S S S 的距离即感知机的目标函数为J ( ω ) = ∑ x i ∈ M − y i ( ω T x i ) ∣ ∣ ω ∣ ∣
J(\omega)=\sum_{{x_i}\in{M}} -{\frac{y_i(\omega^Tx_i)}{||\omega||}}
J ( ω ) = x i ∈ M ∑ − ∣ ∣ ω ∣ ∣ y i ( ω T x i )
给定了所有误分类点到超平面的距离,我们的目的就是优化上述公式,即最小化目标函数。
由于ω T x i = ω 1 x 1 + ω 2 x 2 + ⋯ + ω n x n + b \omega^Tx_i=\omega_1x_1 + \omega_2x_2 + \cdots + \omega_nx_n + b ω T x i = ω 1 x 1 + ω 2 x 2 + ⋯ + ω n x n + b ,如果ω \omega ω 和b b b 成比例的增加,即分子的ω \omega ω 和b b b 扩大n n n 倍时,分母的L2范数也将扩大n n n 倍,也就是说分子和分母有固定的倍数关系,即可以将分子或分母固定为1 1 1 ,然后求分子自己或分母的倒数的最小化作为新的目标函数。(此处讲解拿出b b b ,事实上b b b 对结果的影响很小,后续会继续用向量的方式,并且忽略b b b )。
感知机将分母∣ ∣ ω ∣ ∣ ||\omega|| ∣ ∣ ω ∣ ∣ 固定为1 1 1 ,然后将分子的最小化作为目标函数,因此感知机的目标函数更新为J ( ω ) = − ∑ x i ∈ M y i ( ω T x i )
J(\omega)=-\sum_{{x_i}\in{M}}y_i(\omega^Tx_i)
J ( ω ) = − x i ∈ M ∑ y i ( ω T x i )
多说一嘴,支持向量机则是将分子固定位1 1 1 ,然后将分母的倒数最小化作为目标函数。
对于给定的目标函数J ( ω ) J(\omega) J ( ω ) ,如果没有误分类点,目标函数值为0;如果误分类点越少,则目标函数值越小;如果误分类点越多,则目标函数值越大。
求出目标函数的最小值便可得到误分类点少的感知机模型,并且从目标函数中也可以看出目标函数中未知的变量只有ω \omega ω ,因此需要求出能使目标函数值最小的ω \omega ω 。
感知机最小化目标函数原始形式
假设感知机的目标函数为J ( ω ) = − ∑ x i ∈ M y i ( ω T x i )
J(\omega)=-\sum_{{x_i}\in{M}}y_i(\omega^Tx_i)
J ( ω ) = − x i ∈ M ∑ y i ( ω T x i )
为了求该函数的最小值一般使用梯度下降算法,首先通过该目标函数可以求出目标函数对ω \omega ω 的偏导为Δ ω J ( ω ) = − ∑ x i ∈ M x i y i
\Delta_\omega{J(\omega)} = -\sum_{x_i\in{M}}x_iy_i
Δ ω J ( ω ) = − x i ∈ M ∑ x i y i
在训练集中选取一个数据( x i , y i ) (x_i, y_i) ( x i , y i ) ,设定ω = 0 \omega=0 ω = 0 ,如果− y i ( ω T x i ) > 0 -y_i(\omega^Tx_i)>0 − y i ( ω T x i ) > 0 ,则对ω \omega ω 使用随机梯度下降的迭代更新ω = ω + α x i y i
\omega = \omega + \alpha{x_iy_i}
ω = ω + α x i y i
其中α ( 0 < α ≤ 1 ) \alpha(0<\alpha\leq1) α ( 0 < α ≤ 1 ) 是自定义的超参数称为学习率(learning rate)
。
通过对ω \omega ω 不断地更新直到训练集中没有误分类的点时更新停止。即可求出目标函数J ( ω ) J(\omega) J ( ω ) 的最小值,则该ω \omega ω 即最后感知机模型的最优ω \omega ω 。
这种学习算法可以理解成,当实例点被误分类后,则调整ω \omega ω 的值,使超平面向靠误分类点的一侧移动,因此减少该误分类点与超平面间的距离,直至超平面越过该误分类点将其分类正确;当实例点分类正确,则不会更新ω \omega ω 。
感知机最小化目标函数对偶形式
通过随机梯度下降算法可以得到了一个较好的感知机模型,但是如果样本特征较多或者误分类的数据较多,计算将成为该算法的最大的一个麻烦,接下来将介绍计算量较少的感知机最小化目标函数的对偶形式,通过该方法,将极大地减少计算量。
假设误分类点( x i , y i ) (x_i,y_i) ( x i , y i ) 通过梯度下降算法修改ω \omega ω 共n i n_i n i 次,误分类点每次增量α x i y i \alpha{x_i}y_i α x i y i ,则ω \omega ω 的增量是α n i x i y i \alpha{n_i}x_iy_i α n i x i y i ,而正确分类点的n i n_i n i 则初始化为0 0 0 ,因此所有实例的总增量为ω = ∑ i = 1 m α n i x i y i
\omega = \sum_{i=1}^m\alpha{n_i}x_iy_i
ω = i = 1 ∑ m α n i x i y i
其中n i n_i n i 初始值为0 0 0 ,每当误分类点因误分类而梯度更新时则n i + 1 n_i+1 n i + 1 。
通过误分类点的总增量公式即可得到一个新的感知机目标函数为J ( α n i ) = ∑ x = 1 m y i ( α n i x i y i x ) = ∑ x = 1 m α n i x i x
J(\alpha{n_i}) = \sum_{x=1}^my_i(\alpha{n_i}x_iy_ix) =\sum_{x=1}^m\alpha{n_i}x_ix
J ( α n i ) = x = 1 ∑ m y i ( α n i x i y i x ) = x = 1 ∑ m α n i x i x
对目标函数使用梯度下降法求最小化目标函数,即对α n i \alpha{n_i} α n i 求偏导得Δ α n i J ( α n i ) = − ∑ x = 1 m α
\Delta_{\alpha{n_i}}{J(\alpha{n_i})} = -\sum_{x=1}^m\alpha
Δ α n i J ( α n i ) = − x = 1 ∑ m α
在训练集中选取一个点( x j , y j ) (x_j, y_j) ( x j , y j ) ,设定α = 0 , n i = 0 , ( i = 1 , 2 , ⋯ , m ) \alpha=0, n_i=0, \quad (i=1,2,\cdots,m) α = 0 , n i = 0 , ( i = 1 , 2 , ⋯ , m ) ,如果− y i ( α n i x i x j ) > 0 -y_i(\alpha{n_i}x_ix_j)>0 − y i ( α n i x i x j ) > 0 ,则对α n i \alpha{n_i} α n i 使用随机梯度下降的迭代更新KaTeX parse error: No such environment: align at position 8:
\begin{̲a̲l̲i̲g̲n̲}̲
& \alpha{n_i} …
通过对α n i \alpha{n_i} α n i 不断地更新直到训练集中没有误分类的点时更新停止。即可求出目标函数J ( α n i ) J(\alpha{n_i}) J ( α n i ) 的最小值,同时可以得到最优的∑ i = 1 m α n i x i y i \sum_{i=1}^m\alpha{n_i}x_iy_i ∑ i = 1 m α n i x i y i ,由于ω = ∑ i = 1 m α n i x i y i \omega = \sum_{i=1}^m\alpha{n_i}x_iy_i ω = ∑ i = 1 m α n i x i y i 即也可以得到感知机模型的最优ω \omega ω 。
对偶形式中在判断误分类点的时候是计算x i , x j x_i,x_j x i , x j 两个样本的内积,因此为了方便可以预先将训练集中样本之间的内积计算出来并以矩阵的形式存储,这个矩阵就是所谓的Gram矩阵(Gram matrix)
,这也正是对偶形式比原始形式计算速度更快的原因之一。
感知机算法的收敛性
感知机算法中所有误分类点到超平面的总距离为− 1 ∣ ∣ w ∣ ∣ 2 ∑ x i ∈ M y i ( w T x i )
-{\frac{1}{||w||_2}}\sum_{{x_i}\in{M}}y_i(w^Tx_i)
− ∣ ∣ w ∣ ∣ 2 1 x i ∈ M ∑ y i ( w T x i )
通常情况下默认∣ ∣ w ∣ ∣ 2 ||w||_2 ∣ ∣ w ∣ ∣ 2 为1(注:支持向量机会讲到为什么为1),即存在满足条件∣ ∣ w ^ o p t ∣ ∣ = 1 ||\hat{w}_{opt}||=1 ∣ ∣ w ^ o p t ∣ ∣ = 1 的超平面w ^ o p t T x ^ = 0 \hat{w}_{opt}^T\hat{x}=0 w ^ o p t T x ^ = 0 将数据集完全正确分开,即当w ^ o p t T x ^ > 0 \hat{w}_{opt}^T\hat{x}>0 w ^ o p t T x ^ > 0 ,则y i > 0 y_i>0 y i > 0 ;当w ^ o p t T x ^ < 0 \hat{w}_{opt}^T\hat{x}<0 w ^ o p t T x ^ < 0 ,则y i < 0 y_i<0 y i < 0 。因此一定存在γ > 0 \gamma>0 γ > 0 ,对任何一个样本( x i , y i ) (x_i,y_i) ( x i , y i ) 都有y i ( w ^ o p t T x ^ ) ≥ γ
y_i(\hat{w}_{opt}^T\hat{x})\geq\gamma
y i ( w ^ o p t T x ^ ) ≥ γ
当1 ≥ i ≤ n 1\geq{i}\leq{n} 1 ≥ i ≤ n 时R = m a x ∣ ∣ x i ^ ∣ ∣ R=max||\hat{x_i}|| R = m a x ∣ ∣ x i ^ ∣ ∣ ,则感知机算法在训练集上的误分类次数k k k 满足k ≤ R γ 2
k\leq{\frac{R}{\gamma}}^2
k ≤ γ R 2
感知机流程
输入
有m m m 个实例n n n 维特征的数据集T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯ , ( x m , y m ) }
T=\{(x_1,y_1),(x_2,y_2),\cdots,(x_m,y_m)\}
T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯ , ( x m , y m ) }
其中x i x_i x i 是实例的特征向量即( x i ( 1 ) , x i ( 2 ) , ⋯ , x i ( n ) ) ({x_i}^{(1)},{x_i}^{(2)},\cdots,{x_i}^{(n)}) ( x i ( 1 ) , x i ( 2 ) , ⋯ , x i ( n ) ) 。
输出
ω \omega ω 和感知机模型f ( x ) = s i g n ( ω T x ) f(x)=sign(\omega^Tx) f ( x ) = s i g n ( ω T x ) 。
原始形式流程
选取初值ω = 0 \omega=0 ω = 0
训练集中选取数据( x i , y i ) (x_i,y_i) ( x i , y i ) ,如果− y i ( ω T x i ) > 0 -y_i(\omega^Tx_i)>0 − y i ( ω T x i ) > 0 ,则对ω \omega ω 使用梯度下降更新ω = ω + α x i y i
\omega = \omega + \alpha{x_iy_i}
ω = ω + α x i y i
重复步骤2,直至训练集中没有误分类点
得到最小化的目标函数J ( ω ) J(\omega) J ( ω ) ,同时可以得到最优的ω ∗ \omega^* ω ∗ ,感知机模型为f ( x ) = s i g n ( w ∗ T x ) f(x)=sign({w^*}^Tx) f ( x ) = s i g n ( w ∗ T x )
对偶形式流程
选取初值α = 0 , n i = 0 , ( i = 1 , 2 , ⋯ , m ) \alpha=0, n_i=0, \quad (i=1,2,\cdots,m) α = 0 , n i = 0 , ( i = 1 , 2 , ⋯ , m )
训练集中选取数据( x j , y j ) (x_j,y_j) ( x j , y j ) ,如果− y j ( α n i x i x j ) > 0 -y_j(\alpha{n_i}x_ix_j)>0 − y j ( α n i x i x j ) > 0 ,则对α n i \alpha{n_i} α n i 使用梯度下降更新并更新该实例分类错误的次数n i n_i n i KaTeX parse error: No such environment: align at position 8:
\begin{̲a̲l̲i̲g̲n̲}̲
& \alpha{n_i} …
重复步骤2,直至训练集中没有误分类点
得到最小化的目标函数J ( α n i ) J(\alpha{n_i}) J ( α n i ) ,同时可以得到最优的∑ i = 1 m α n i x i y i \sum_{i=1}^m\alpha{n_i}x_iy_i ∑ i = 1 m α n i x i y i ,由于ω = ∑ i = 1 m α n i x i y i \omega = \sum_{i=1}^m\alpha{n_i}x_iy_i ω = ∑ i = 1 m α n i x i y i 即也可以得到感知机模型的最优ω ∗ \omega^* ω ∗ , 感知机模型为f ( x ) = s i g n ( w ∗ T x ) f(x)=sign({w^*}^Tx) f ( x ) = s i g n ( w ∗ T x ) 。
感知机优缺点
优点
简单易懂,编程实现容易
由于非线性支持向量机和神经网络等算法在此基础上改进的,感知机在一定程度上值得细细体会
缺点
目前在工业上使用的较少(太古老了,没辙!)
只能处理线性可分的数据(它的后代支持向量机和神经网络完美的解决了这个缺点)
无法解决回归问题(试着使用回归支持向量机?)
小结
感知机算法最大的前提则是数据集需要线性可分,这也正是感知机算法最大的局限性。为了解决线性不可分数据的分类问题,因此在此感知机算法的基础上发明了非线性支持向量机、神经网络等机器学习算法。
感知机算法虽然现在用的很少了,但是如果能深刻了解感知机算法的对偶形式为什么比原始形式更快的做到算法收敛会让你未来学习其他的机器学习算法轻松不少。
感知机其实用到了部分线性模型知识,至于线性模型是什么,下一篇即会揭晓——线性回归。