感知机是二类分类的线性分类模型,输入为实例的特征向量,输出为实例的类别,取+1和-1二值,感知机对应于输入空间(特征空间)中将实例划分为正负两类的分离超平面,属于判别模型。感知机学习旨在求出将训练数据进行线性划分的分离超平面,为此,导入基于误分类的损失函数,利用梯度下降法对损失函数进行极小化,求得感知机模型。
感知机模型:
f(x)=sign(w*x +b)
其中,w和b是感知机的模型参数,w属于Rn,叫做权值或者权值向量。b属于R,叫做偏置,w*x标识w和x的内积,sign是符号函数:x>=0 sign(x)=1;x<0,sign(x)=-1;
感知机几何解释:w*x+b=0;对应一个超平面,w是平面的法向量,b是截距;
感知机学习策略:
线性可分性:
对于一个数据集:T={(x1,y1),(x2,y2).....(xn,yn)} xi属于X,yi属于Y属于{+1,-1},i=1,2,3......n;如果存在超平面S w*x+b=0 能够将数据集的正实例点和负实例点完全正确地划分到超平面的两侧,即对所有yi=+1的实例i,都有w*xi+b>0; 对于所有yi=-1的实例i,都有w*xi+b<0;则称数据集T为线性可分数据集,否则为线性不可分;
感知机学习策略:
目的是求一个超平面能否将正实例和负实例完全正确地分开;为了得到这个平面,需要确定w和b;需要定义一个学习策略,及定义(经验)损失函数并将损失函数极小化;
损失函数的一个自然选择是误分类的点数,但是这样的损失函数不是参数w和b的连续可导函数,不易优化,损失函数的另一个选择是误分类点到超平面的总距离,这是感知机所采用的,为此,首先写出输入空间中任一点x0到超平面S的距离:
对于误分类的数据(xi,yi)来说,;因为w*xi+b>0时,yi=-1,而当w*xi+b<0时,yi=+1,因此,误分类点xi到超平面S的距离是:
假设误分类点集合为M,则误分类点到超平面S的总距离为:
对于训练集T={(x1,y1),(x2,y2).....(xn,yn)} ,不考虑L2范式,损失函数定义为:
其中M为误分类点的集合,这个损失函数就是感知机学习的经验风险函数。
如果没有误分类点,损失函数值是0,而且误分类点越少,误分类点离超平面越近,损失函数就越小。一个特定的样本点的损失函数:在误分类时时参数w,b的线性函数,在正确分类时是0,因此,给定特定训练集T,损失函数L(w,b)是w,b的连续可导函数。
感知机学习算法:
感知机学习问题转化为求解损失函数式的最优化问题 ,最优化的方法是随机梯度下降法。
感知机学习算法的原始形式:
求解参数w,b,使其为以下损失函数极小化问题的解:
感知机学习算方法是误分类驱动的,具体采用随机梯度下降法,首先,任意选一个超平面w0,b0,然后用梯度下降法不断地极小化目标函数。极小化过程中不是一次使M中所有误分类点的梯度下降,而是一次随机选取一个误分类点使其梯度下降。
L(w,b)的梯度由, 给出。
随机选择一个误分类点(xi,yi),对w,b进行更新:
是步长,在统计学习中又称为学习率。这样,通过迭代可以期待损失函数L(w,b)不断减小,直到0.综上所述,得到如下算法:
1、选取初值:w0,b0;
2、在训练集中选取数据(xi,yi);
3、如果yi(w*xi+b)<=0
算法收敛性(这里不再证明了。)
举例子:
正实例点 x1=(3,3),x2=(4,3),负实例点x3=(1,1),试用感知机学习算法的原始形式求感知机模型f(x)=sign(w*x +b),这里w=(w1,w2),x=(x1,x2)
按照如上算法求解w b ,步长=1
1、 w0 = 0 b=0
2、对于x1=(3,3),y1*(w0*x1+b0)=0,未能正确分类,更新w,b
w1 = w0+y1*x1=(3,3),b1=b0+y1=1
w1*x+b1=3x1+3x2+1
3、对于x1,x2 显然 损失函数>0被正确分类,不修改wb;对于x3(1,1)y3*(w1*x3+b1)<0被误分类
w2=w1+y3x3=(2,2),b2=b1+y3=0
得到
w2*x+b2=2x1+2x2
如此继续下去,直到w7*x+b7=x1+x2-3,对于所有点都被正确分类
f(x)=sign(x1+x2-3)
感知机算法对偶形式:
对偶形式的基本想法是,将
和
表示为实例
和标记
的线性组合的形式,通过求解其系数而求得
和
。
通过上面的
和
的更新公式,我们发现,
和
是一个累加的过程。如果令
,
,则
和
可以表示为:
其中,
。
此时的感知机模型就变为:
三、算法流程
- 初始化,
- 计算出
开始感觉不太理解对偶模式,后来自己计算了一下,大概明白了;
其实就是w0=0;b0=0;根据原始形式我们会得到(设步长为t)w=ty1x1+ty2x2+ty1x1+ty3x3
其实这里ai=ni*t;比如a1=2*t,2标识(x1,y1
)被误分类了两次;a2=t标识第二个点误分类一次;其实和原始形式一样,只是另外一种标识方法;
至于那个G矩阵,就是为了得到点与点之间的乘积,然后比较好代码实现而已;
梯度下降