标签:模型 最优 python 存在 优点 cat png case 集中
目录
更新、更全的《机器学习》的更新网站,更有python、go、数据结构与算法、爬虫、人工智能教学等着你:https://www.cnblogs.com/nickchen121/
感知机在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()
从左图中也可以看出总能找到一条直线将男孩和女孩分开,即男孩和女孩在操场上的分布是线性可分的,此时该分隔直线为
\[
\omega{x}+b=0
\]
其中\(\omega,b\)是参数,\(x\)是男孩和女孩共有的某种特征。
如果某个男孩不听话跑到女孩那边去了,如下图右图所示,则无法通过一条直线能够把所有的男孩和女孩分开,则称男孩和女孩在操场上的分布是线性不可分的,即无法使用感知机算法完成该分类过程。
上述整个过程其实就是感知机实现的一个过程。
感知机是一个二分类线性模型,即输出为实例的类别,一般为其中一类称为正类\((+1)\),另一类称为负类\((-1)\)。可以把上图所示的男孩\((+1)\)称为正类,女孩\((-1)\)称为负类。
假设有\(m\)个实例\(n\)维特征并且数据线性可分的数据集
\[
T = \{(x_1,y_1),(x_2,y_2),\cdots,(x_m,y_m)\}
\]
它的输出空间即\(y\)的取值是\(y=\{+1,-1\}\)。
由于数据线性可分,如果是二维空间,则总能找到一条直线将二维空间中的数据集分为两类,如上图所示的\(\omega{x}+b=0\),如果是三维空间,则能找到一个平面把三维空间中的数据集分为两类。对于上述的假设的数据集\(T\),则总能找到一个超平面\(S\)将该数据集分成两类,该超平面\(S\)可以记作
\[
\omega_1x_1 + \omega_2x_2 + \cdots + \omega_nx_n + b = 0
\]
其中如果假设\(\omega_0=b,x_0=1\),则超平面为
\[
\omega_0x_0 + \omega_1x_1 + \omega_2x_2 + \cdots + \omega_nx_n =0
\]
如果把上述公式使用向量来表示,则超平面为
\[
\omega^Tx = 0
\]
其中\(\omega,x\)都为\(n+1\)维的向量。
如果把\(\omega^Tx > 0\)内的数据集看成一类;把\(\omega^Tx < 0\)内的数据集看成另一类,即通过\(\omega^Tx=0\)成功将数据集分为两类。为了将两个类别符号化,我们可以使用\(sign\)函数,由此即可得到感知机的模型为
\[
sign(\omega^Tx)=
\begin{cases}
1, \quad \omega^Tx > 0 \-1, \quad \omega^Tx < 0
\end{cases}
\]
假设有一个线性可分的数据集
\[
T = \{(x_1,y_1),(x_2,y_2),\cdots,(x_i,y_i),\cdots,(x_m,y_m)\}
\]
则数据集中的样本\(x_i\)到超平面\(S\)的距离为
\[
{\frac{|\omega^Tx_i|}{||\omega||}}
\]
其中\(||\omega||\)为L2范数。
该距离公式源自于数学中点\((x_0,y_0)\)到面\(Ax+By+C=0\)的公式
\[
\frac{Ax_0+By_0+C}{\sqrt{A^2+B^2}}
\]
假设存在一个误分类的样本\((x_i,y_i)\),对有误分类的样本都存在\(- y_i(\omega^Tx_i) > 0\)。因为误分类时当\(\omega^Tx_i = 1\)时\(y_i = -1\);当\(\omega^Tx_i = -1\)时\(y_i = 1\)。因此\(|\omega^Tx_i| = -y_i(\omega^Tx_i)\),则误分类点到超平面\(S\)的距离即损失函数为
\[
-{\frac{y_i(\omega^Tx_i)}{||\omega||}}
\]
假设误分类点的集合为\(M\),那么所有误分类点到超平面\(S\)的距离即感知机的目标函数为
\[
J(\omega)=\sum_{{x_i}\in{M}} -{\frac{y_i(\omega^Tx_i)}{||\omega||}}
\]
给定了所有误分类点到超平面的距离,我们的目的就是优化上述公式,即最小化目标函数。
由于\(\omega^Tx_i=\omega_1x_1 + \omega_2x_2 + \cdots + \omega_nx_n + b\),如果\(\omega\)和\(b\)成比例的增加,即分子的\(\omega\)和\(b\)扩大\(n\)倍时,分母的L2范数也将扩大\(n\)倍,也就是说分子和分母有固定的倍数关系,即可以将分子或分母固定为\(1\),然后求分子自己或分母的倒数的最小化作为新的目标函数。(此处讲解拿出\(b\),事实上\(b\)对结果的影响很小,后续会继续用向量的方式,并且忽略\(b\))。
感知机将分母\(||\omega||\)固定为\(1\),然后将分子的最小化作为目标函数,因此感知机的目标函数更新为
\[
J(\omega)=-\sum_{{x_i}\in{M}}y_i(\omega^Tx_i)
\]
多说一嘴,支持向量机则是将分子固定位\(1\),然后将分母的倒数最小化作为目标函数。
对于给定的目标函数\(J(\omega)\),如果没有误分类点,目标函数值为0;如果误分类点越少,则目标函数值越小;如果误分类点越多,则目标函数值越大。
求出目标函数的最小值便可得到误分类点少的感知机模型,并且从目标函数中也可以看出目标函数中未知的变量只有\(\omega\),因此需要求出能使目标函数值最小的\(\omega\)。
假设感知机的目标函数为
\[
J(\omega)=-\sum_{{x_i}\in{M}}y_i(\omega^Tx_i)
\]
为了求该函数的最小值一般使用梯度下降算法,首先通过该目标函数可以求出目标函数对\(\omega\)的偏导为
\[
\Delta_\omega{J(\omega)} = -\sum_{x_i\in{M}}x_iy_i
\]
在训练集中选取一个数据\((x_i, y_i)\),设定\(\omega=0\),如果\(-y_i(\omega^Tx_i)>0\),则对\(\omega\)使用随机梯度下降的迭代更新
\[
\omega = \omega + \alpha{x_iy_i}
\]
其中\(\alpha(0<\alpha\leq1)\)是自定义的超参数称为学习率(learning rate)
。
通过对\(\omega\)不断地更新直到训练集中没有误分类的点时更新停止。即可求出目标函数\(J(\omega)\)的最小值,则该\(\omega\)即最后感知机模型的最优\(\omega\)。
这种学习算法可以理解成,当实例点被误分类后,则调整\(\omega\)的值,使超平面向靠误分类点的一侧移动,因此减少该误分类点与超平面间的距离,直至超平面越过该误分类点将其分类正确;当实例点分类正确,则不会更新\(\omega\)。
通过随机梯度下降算法可以得到了一个较好的感知机模型,但是如果样本特征较多或者误分类的数据较多,计算将成为该算法的最大的一个麻烦,接下来将介绍计算量较少的感知机最小化目标函数的对偶形式,通过该方法,将极大地减少计算量。
假设误分类点\((x_i,y_i)\)通过梯度下降算法修改\(\omega\)共\(n_i\)次,误分类点每次增量\(\alpha{x_i}y_i\),则\(\omega\)的增量是\(\alpha{n_i}x_iy_i\),而正确分类点的\(n_i\)则初始化为\(0\),因此所有实例的总增量为
\[
\omega = \sum_{i=1}^m\alpha{n_i}x_iy_i
\]
其中\(n_i\)初始值为\(0\),每当误分类点因误分类而梯度更新时则\(n_i+1\)。
通过误分类点的总增量公式即可得到一个新的感知机目标函数为
\[
J(\alpha{n_i}) = \sum_{x=1}^my_i(\alpha{n_i}x_iy_ix) =\sum_{x=1}^m\alpha{n_i}x_ix
\]
对目标函数使用梯度下降法求最小化目标函数,即对\(\alpha{n_i}\)求偏导得
\[
\Delta_{\alpha{n_i}}{J(\alpha{n_i})} = -\sum_{x=1}^m\alpha
\]
在训练集中选取一个点\((x_j, y_j)\),设定\(\alpha=0, n_i=0, \quad (i=1,2,\cdots,m)\),如果\(-y_i(\alpha{n_i}x_ix_j)>0\),则对\(\alpha{n_i}\)使用随机梯度下降的迭代更新
\[
\begin{align}
& \alpha{n_i} = \alpha{n_i} + \alpha \& n_i = n_i + 1
\end{align}
\]
通过对\(\alpha{n_i}\)不断地更新直到训练集中没有误分类的点时更新停止。即可求出目标函数\(J(\alpha{n_i})\)的最小值,同时可以得到最优的\(\sum_{i=1}^m\alpha{n_i}x_iy_i\),由于\(\omega = \sum_{i=1}^m\alpha{n_i}x_iy_i\)即也可以得到感知机模型的最优\(\omega\)。
对偶形式中在判断误分类点的时候是计算\(x_i,x_j\)两个样本的内积,因此为了方便可以预先将训练集中样本之间的内积计算出来并以矩阵的形式存储,这个矩阵就是所谓的Gram矩阵(Gram matrix)
,这也正是对偶形式比原始形式计算速度更快的原因之一。
感知机算法中所有误分类点到超平面的总距离为
\[
-{\frac{1}{||w||_2}}\sum_{{x_i}\in{M}}y_i(w^Tx_i)
\]
通常情况下默认\(||w||_2\)为1(注:支持向量机会讲到为什么为1),即存在满足条件\(||\hat{w}_{opt}||=1\)的超平面\(\hat{w}_{opt}^T\hat{x}=0\)将数据集完全正确分开,即当\(\hat{w}_{opt}^T\hat{x}>0\),则\(y_i>0\);当\(\hat{w}_{opt}^T\hat{x}<0\),则\(y_i<0\)。因此一定存在\(\gamma>0\),对任何一个样本\((x_i,y_i)\)都有
\[
y_i(\hat{w}_{opt}^T\hat{x})\geq\gamma
\]
当\(1\geq{i}\leq{n}\)时\(R=max||\hat{x_i}||\),则感知机算法在训练集上的误分类次数\(k\)满足
\[
k\leq{\frac{R}{\gamma}}^2
\]
有\(m\)个实例\(n\)维特征的数据集
\[
T=\{(x_1,y_1),(x_2,y_2),\cdots,(x_m,y_m)\}
\]
其中\(x_i\)是实例的特征向量即\(({x_i}^{(1)},{x_i}^{(2)},\cdots,{x_i}^{(n)})\)。
\(\omega\)和感知机模型\(f(x)=sign(\omega^Tx)\)。
感知机算法最大的前提则是数据集需要线性可分,这也正是感知机算法最大的局限性。为了解决线性不可分数据的分类问题,因此在此感知机算法的基础上发明了非线性支持向量机、神经网络等机器学习算法。
感知机算法虽然现在用的很少了,但是如果能深刻了解感知机算法的对偶形式为什么比原始形式更快的做到算法收敛会让你未来学习其他的机器学习算法轻松不少。
感知机其实用到了部分线性模型知识,至于线性模型是什么,下一篇即会揭晓——线性回归。
标签:模型 最优 python 存在 优点 cat png case 集中
原文地址:https://www.cnblogs.com/nickchen121/p/11686790.html