感知机算法原理及实例

版权声明:站在巨人的肩膀上学习。 https://blog.csdn.net/zgcr654321/article/details/85219184

感知机介绍

感知机是一个二类分类的线性分类器,是支持向量机和神经网络的基础。感知机假设数据是线性可分的,目标是通过梯度下降法,极小化损失函数,最后找到一个分割超平面,可以将数据划分成两个类别。

使用感知机一个最大的前提,就是数据是线性可分的。这严重限制了感知机的使用场景。它的分类竞争对手在面对不可分的情况时,比如支持向量机可以通过核技巧来让数据在高维可分,神经网络可以通过激活函数和增加隐藏层来让数据可分。

感知机模型的函数

如果我们有m个样本,每个样本对应于n维特征和一个二元的类别输出:

x ( i ) = ( x 1 ( i ) , x 2 ( i ) , , x n ( i ) ) , y ( i ) [ 1 , + 1 ] ( i = 1 , 2 , , m ) x ^ { ( i ) } = \left( x _ { 1 } ^ { ( i ) } , x _ { 2 } ^ { ( i ) } , \ldots , x _ { n } ^ { ( i ) } \right) , y ^ { ( i ) } \in [ - 1 , + 1 ] \quad ( i = 1,2 , \ldots , m )

我们的目标是找到这样一个超平面(向量形式):

w x + b = 0 w \cdot x + b = 0

这个超平面将特征空间划分为两个部分:

对于 y ( i ) = 1 y ( i ) = - 1 的样本, w x ( i ) + b < 0 w \cdot x ^ { ( i ) } + b < 0

对于 y ( i ) = + 1 y ( i ) = + 1 的样本, w x ( i ) + b > 0 w \cdot x ^ { ( i ) } + b > 0

如何实现上面的分类呢?

定义一个函数: f ( x ) = sign ( w x + b ) f ( x ) = \operatorname { sign } ( w \cdot x + b )

其中 sign ( x ) \operatorname { sign } ( x ) 是符号函数, sign ( x ) = { 1 x < 0 1 x 0 \operatorname { sign } ( x ) = \left\{ \begin{array} { l l } { - 1 } & { x < 0 } \\ { 1 } & { x \geq 0 } \end{array} \right.

上面的 f ( x ) f ( x ) 函数就是感知机模型函数。一旦学习到了w和b的值,我们就可以利用 f ( x ( i ) ) f \left( x ^ { ( i ) } \right) 来判断新的样本属于哪一类别。

使得其中一个类别的样本都满足 θ 0 + θ 1 x 1 + + θ n x n > 0 \theta _ { 0 } + \theta _ { 1 } x _ { 1 } + \ldots + \theta _ { n } x _ { n } > 0 ,另一个类别的样本都满足 θ 0 + θ 1 x 1 + + θ n x n < 0 \theta _ { 0 } + \theta _ { 1 } x _ { 1 } + \ldots + \theta _ { n } x _ { n } < 0

感知机模型的损失函数

为了训练感知机模型函数的参数w和b,我们需要定义损失函数并将损失函数最小化。

如何选择损失函数?

我们首先想到的是最小化误分类点的总数。误分类点就是真实分类与其通过感知机模型函数得到的分类不一致的点。但是这样的损失函数不是参数w,b的连续可导函数,难以优化。

另一种思路就是最小化误分类点到超平面的总距离,这就是感知机模型所采用的损失函数。

空间上一点 x ( i ) x ^ { ( i ) } 到超平面 w x + b = 0 w \cdot x + b=0 的距离公式为:

w x ( i ) + b w 2 \frac { \left| w \cdot x ^ { ( i ) } + b \right| } { \| w \| _ { 2 } }

其中分母 w 2 \left. || w | \right| _ { 2 } w w 的L2范数(每个 w i w_{i} 的平方和加起来再求平方根)。

对于误分类点 ( x ( i ) , y ( i ) ) \left( x ^ { ( i ) } , y ^ { ( i ) } \right) ,总有 y ( i ) f ( x ( i ) ) > 0 -y ^ { ( i ) } f \left( x ^ { ( i ) } \right) > 0

这是因为假如点的正确分类为+1,而感知机将其误分类为-1时, 有 f ( x ( i ) ) < 0 f \left( x ^ { ( i ) } \right) < 0 ,那么再乘以 y ( i ) -y ^ { ( i ) } 就有 y ( i ) f ( x ( i ) ) > 0 -y ^ { ( i ) } f \left( x ^ { ( i ) } \right) > 0

而假如点的正确分类为-1,而感知机将其误分类为+1时,有 f ( x ( i ) ) > 0 f \left( x ^ { ( i ) } \right) > 0 ,那么再乘以 y ( i ) -y ^ { ( i ) } 就有 y ( i ) f ( x ( i ) ) > 0 -y ^ { ( i ) } f \left( x ^ { ( i ) } \right) > 0

因此一个误分类点到超平面的距离为:

y ( i ) ( w x ( i ) + b ) w 2 \frac { - y ^ { ( i ) } \left( w \cdot x ^ { ( i ) } + b \right) } { \| w \| _ { 2 } }

所有误分类点到超平面的总距离为:

1 w 2 x ( i ) M y ( i ) ( w x ( i ) + b ) - \frac { 1 } { \| w \| _ { 2 } } \sum _ { x ^ { ( i ) } \in M } y ^ { ( i ) } \left( w \cdot x ^ { ( i ) } + b \right)
我们可以发现分子和分母都含有w,当分子的w扩大N倍时,分母的w的L2范数也会扩大N倍。也就是说,分子和分母有固定的倍数关系。因此我们令分母 w 2 = 1 \| w \| _ { 2 } = 1 ,这样可以简化我们的损失函数。

最终感知机模型的损失函数为:

L ( w , b ) = x ( i ) M y ( i ) ( w x ( i ) + b ) L ( w , b ) = - \sum _ { x ^ { ( i ) } \in M } y ^ { ( i ) } \left( w \cdot x ^ { ( i ) } + b \right)

感知机模型函数的优化算法

对于上面的损失函数,我们可以用梯度下降的方法来优化。但是用普通的基于所有样本的梯度和均值的批量梯度下降法(BGD)是行不通的,原因在于我们的损失函数里面有限定,只有误分类的点集合里面的样本才能参与损失函数的优化。

所以我们不能用最普通的批量梯度下降,只能采用随机梯度下降(SGD)或者小批量梯度下降(MBGD)。感知机模型选择的是采用随机梯度下降,这意味着我们每次只使用一个误分类的点来更新梯度。

给定训练集T,感知机学习的目标是最小化损失函数:

min w , b L ( w , b ) = x ( i ) M y ( i ) ( w x ( i ) + b ) \min _ { w , b } L ( w , b ) = - \sum _ { x ^ { ( i ) } \in M } y ^ { ( i ) } \left( w \cdot x ^ { ( i ) } + b \right)

其中M是误分类点的集合。

损失函数的梯度为:

w k L ( w , b ) = x ( i ) M y ( i ) x k ( i ) \nabla _ { w_{k} } L ( w , b ) = - \sum _ { x ^ { ( i ) } \in M } y ^ { ( i ) } x_{k} ^ { ( i ) }

b L ( w , b ) = x ( i ) M y ( i ) \nabla _ { b } L ( w , b ) = - \sum _ { x ^ { ( i ) } \in M } y ^ { ( i ) }

因为采用随机梯度下降,所以每次仅采用一个误分类的样本点 ( x ( i ) , y ( i ) ) \left( x ^ { ( i ) } , y ^ { ( i ) } \right) 来计算梯度对w,b进行更新:

w = w η w L ( w , b ) = w + η y ( i ) x ( i ) w = w - \eta \nabla _ { w } L ( w , b ) = w + \eta y ^ { ( i ) } x ^ { ( i ) }

b = b η b L ( w , b ) = b + η y ( i ) b = b - \eta \nabla _ { b } L ( w , b ) = b + \eta y ^ { ( i ) }

其中 η \eta 为学习率。每次调整都使超平面向误分类点的一侧移动,以减小改误分类点与超平面间的距离,直到超平面越过该点使其被正确分类。

感知机模型的算法步骤

输入m个样本,每个样本对应于n维特征和一个二元类别输出1或者-1,如下:

( x ( 0 ) , y ( 0 ) ) , ( x ( 1 ) , y ( 1 ) ) , ( x ( m ) , y ( m ) ) \left( x ^ { ( 0 ) } , y ^ { ( 0 ) } \right),\left( x ^ { ( 1 ) } , y ^ { ( 1) } \right), \ldots \left( x ^ { ( m ) } , y ^ { ( m) } \right)

输出为超平面的参数w和b。

步骤如下:

  • 定义所有w和b的处置,设置初始学习率。
  • 在训练集中任意抽取一个数据点 ( x ( i ) , y ( i ) ) \left( x ^ { ( i ) } , y ^ { ( i ) } \right) ,判断它用现有的感知机模型分类是否是误分类点,如果是,执行下一步;如果不是,则放回再抽取一个点,再判断是否是误分类点。如果所有数据点都判断过且无误分类点,则直接结束算法。
  • 使用上一步得到的误分类点对w和b进行一次随机梯度下降,更新w和b的参数,再重新执行上一步。

感知机模型的算法对偶形式

对偶就是从一个不同的角度去解答相似问题,但是问题的解是相通的,甚至是一样一样的。

上面的计算方式是感知机模型的原始形式,而使用对偶形式可以显著地减小计算量(特征维度越高越明显)。

在原始形式中,我们的参数w和b的更新是完全基于样本点的。如果我们将参数w和b表示为样本点的线性组合,我们可以记录各个样本点在参数更新中分别被使用了多少次。

假设初始值 w 0 , b 0 w _ { 0 } , b _ { 0 } 均为0,然后使用随机梯度下降调整w,b,设现在迭代n次, w , b w , b 关于点 ( x ( i ) , y ( i ) ) \left( x ^ { ( i ) } , y ^ { ( i ) } \right) 的增量分别是 α i y ( i ) x ( i ) \alpha _ { i } y ^ { ( i ) } x ^ { ( i ) } α i y ( i ) \alpha _ { i } y ^ { ( i ) } ,那么最后学习到的 w , b w , b 可以表示为:

w = i = 1 n α i y ( i ) x ( i ) w = \sum _ { i = 1 } ^ { n } \alpha _ { i } y ^ { ( i ) } x ^ { ( i ) }

b = i = 1 n α i y ( i ) b = \sum _ { i = 1 } ^ { n } \alpha _ { i } y ^ { ( i ) }

其中 α i = n i η \alpha _ { i } = n _ { i } \eta n i n _ { i } 表示第i个个样本点由于误分类而进行更新的次数。

样本点更新次数越多,意味着它距离分离超平面就越近,也就越难正确分类。换句话说,这样的样本点对学习结果影响最大。

这样每次判断误分类点的条件就变为:

y ( i ) ( j = 1 n α i y ( j ) x ( j ) x ( i ) + b ) 0 y ^ { ( i ) } \left( \sum _ { j = 1 } ^ { n } \alpha _ { i } y ^ { ( j ) } x ^ { ( j ) } \cdot x ^ { ( i ) } + b \right) \leq 0

这种形式有一个好处,就是在训练过程中,训练样本仅以内积 x ( j ) x ( i ) x ^ { ( j ) } \cdot x ^ { ( i ) } 的形式出现。而且这个内积计算的结果在下面的迭代次数中可以重用。

如果我们事先用矩阵运算计算出所有的样本之间的内积,那么在算法运行时, 仅仅一次矩阵内积运算比多次循环计算省时。 这就节省了很多计算时间。

这个样本内积矩阵也就是所谓的Gram矩阵:

G = [ x ( i ) y ( j ) ] N × N G = \left[ x ^ { ( i ) } \cdot y ^ { ( j ) } \right] _ { N \times N }

在原始形式中我们利用 y ( i ) ( w x ( i ) + b ) 0 y ^ { ( i ) } \left( w \cdot x ^ { ( i ) } + b \right) \leq 0 判断点是否是误分类点,因为每次w都有变化,所以每次都需要计算特征向量 x ( i ) x ^ { ( i ) } 和w的乘积。在对偶形式中我们利用 y ( i ) ( j = 1 n α i y ( j ) x ( j ) x ( i ) + b ) 0 y ^ { ( i ) } \left( \sum _ { j = 1 } ^ { n } \alpha _ { i } y ^ { ( j ) } x ^ { ( j ) } \cdot x ^ { ( i ) } + b \right) \leq 0 来判断,而只要事先计算好Gram矩阵,通过查找Gram矩阵就能得到样本内积 x ( j ) x ( i ) x ^ { ( j ) } \cdot x ^ { ( i ) } ,这比原始形式每次迭代都需要计算 w x ( i ) w \cdot x ^ { ( i ) } 节省了大量的计算时间。

另外,内积形式很方便我们引入支持向量机的核方法,用来解决数据集线性不可分时的情况。

总结:

感知机的对偶形式本质上就是用样本 x ( i ) x ^ { ( i ) } y ( i ) y ^ { ( i ) } 的线性组合去表达原始形式中的w,b。这种形式的表达可以引入样本内积,减少计算量。

这种形式下要更新的模型参数只有一个 α i = n i η \alpha _ { i } = n _ { i } \eta ,我们每次用一个误分类样本 x ( i ) x ^ { ( i ) } 对参数进行更新,只需要将相应的 n i n _ { i } 加1,即:

α i = η ( n i + 1 ) = α i + η \alpha _ { i } = \eta \left( n _ { i } + 1 \right) = \alpha _ { i } + \eta

注意对偶形式的参数初始化时, α i \alpha _ { i } 被初始化为0(因为 n i n _ { i } 一开始都为0)。

感知机计算实例

这是《统计学习方法》第29页的例2.1。

对正实例点 x 1 = ( 3 , 3 ) T x _ { 1 } = ( 3,3 ) ^ { T } x 2 = ( 4 , 3 ) T x _ { 2 } = ( 4,3 ) ^ { T } ,负实例点 x 3 = ( 1 , 1 ) T x _ { 3 } = ( 1,1 ) ^ { T } ,用感知机学习算法的原始形式求感知机模型 f ( x ) = sign ( w x + b ) f ( x ) = \operatorname { sign } ( w \cdot x + b )

构建最优化问题:

min w , b L ( w , b ) = x i M y i ( w x + b ) \min _ { w , b } L ( w , b ) = - \sum _ { x _ { i } \in M } y _ { i } ( w \cdot x + b )

η = 1 \eta = 1 ,取初值 w 0 = 0 , b 0 = 0 w _ { 0 } = 0 , \quad b _ { 0 } = 0

x 1 = ( 3 , 3 ) T x _ { 1 } = ( 3,3 ) ^ { T } y 1 ( w 0 x 1 + b 0 ) = 0 y _ { 1 } \left( w _ { 0 } \cdot x _ { 1 } + b _ { 0 } \right) = 0 ,未正确分类,更新w、b:

w 1 = w 0 + y 1 x 1 = ( 3 , 3 ) T , b 1 = b 0 + y 1 = 1 w _ { 1 } = w _ { 0 } + y _ { 1 } x _ { 1 } = ( 3,3 ) ^ { \mathrm { T } } , \quad b _ { 1 } = b _ { 0 } + y _ { 1 } = 1

得到更新后的模型:

w 1 x + b 1 = 3 x ( 1 ) + 3 x ( 2 ) + 1 w _ { 1 } \cdot x + b _ { 1 } = 3 x ^ { ( 1 ) } + 3 x ^ { ( 2 ) } + 1

x 1 x _ { 1 } x 2 x _ { 2 } y i ( w 1 x i + b 1 ) > 0 y _ { i } \left( w _ { 1 } \cdot x _ { i } + b _ { 1 } \right) > 0 ,分类正确,不更新w、b。

x 3 = ( 1 , 1 ) T x _ { 3 } = ( 1,1 ) ^ { T } y 3 ( w 1 x 3 + b 1 ) < 0 y _ { 3 } \left( w _ { 1 } \cdot x _ { 3 } + b _ { 1 } \right) < 0 ,分类错误,更新w、b:

w 2 = w 1 + y 3 x 3 = ( 2 , 2 ) T , b 2 = b 1 + y 3 = 0 w _ { 2 } = w _ { 1 } + y _ { 3 } x _ { 3 } = ( 2,2 ) ^ { \mathrm { T } } , \quad b _ { 2 } = b _ { 1 } + y _ { 3 } = 0

得到更新后的模型:

w 2 x + b 2 = 2 x ( 1 ) + 2 x ( 2 ) w _ { 2 } \cdot x + b _ { 2 } = 2 x ^ { ( 1 ) } + 2 x ^ { ( 2 ) }

继续下去,得到:

w 7 = ( 1 , 1 ) T , b 7 = 3 w _ { 7 } = ( 1,1 ) ^ { \mathrm { T } } , \quad b _ { 7 } = - 3

w 7 x + b 7 = x ( 1 ) + x ( 2 ) 3 w _ { 7 } \cdot x + b _ { 7 } = x ^ { ( 1 ) } + x ^ { ( 2 ) } - 3

此时,对于所有数据点都有 y i ( w 7 x i + b 7 ) > 0 y _ { i } \left( w _ { 7 } \cdot x _ { i } + b _ { 7 } \right) > 0 ,没有误分类点,损失函数达到极小值。

则感知机模型函数为:

f ( x ) = sign ( x ( 1 ) + x ( 2 ) 3 ) f ( x ) = \operatorname { sign } \left( x ^ { ( 1 ) } + x ^ { ( 2 ) } - 3 \right)

详细计算过程:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/zgcr654321/article/details/85219184