纯python实现感知机(梯度下降法)

为什么会用纯Python来实现呢?这种陶(hao)冶(wu)情(yong)操(chu)的做法肯定也不是我自己闲着蛋疼搞着玩的。。。  明明有更好的科学计算库不用,非要纯手写正面硬刚,除了老师用挂科作为威胁还能有谁?

下面是一大纯手打的堆理推导... 写的逻辑有些混乱,后续有时间再慢慢整理 觉得麻烦的小伙伴就不用看了,反正我代码里也写的有注释,代码稍后传上github后更新连接

----------------------------------------------------------------------------------------------------

感知机(梯度下降法实现)

有Xn个样本,对应有Yn个对应的标签,正样本用+1,负样本用-1,二元分类需要找一个评价函数法f(x),当f(x)为+1时,为正样本,当f(x)为-1时,为负样本,目的就是从训练集中找到f(x)的表达式,从测试集中找一个x,带入f(x)中就可得到是正样本还是负样本。

Xi为一个n维向量。

分割超平面为一个n-1维的字空间,

平面中的直线方程表达式:ax+by+c=0,Xi可以看作是一个向量包含x,y写作[x0,x1]转置,W看作另一个向量包括a,b,c用b来表示,所以直线方程就可以写作W*X+b=0。

 

当W*X+b>=0为正样本,当W*X+b<=0为负样本,f(x)可以表示为sign(W*X+b),所以要确定W和b才能确定f(x)

 

评价函数(损失函数)的确定

当正样本判别为负样本时:Yi=1,f(Xi)=-1。所以当Yi(W*X+b)<0时,则为错误分类。

利用错误分类点到分割超平面的距离即可很好的表示损失函数,用错误分类点的个数则导致损失函数不连续,不能用梯度下降法求导。

 

因为点到面的距离计算公式为:(本例为一个二维向量)

https://csdnimg.cn/release/phoenix/outside_default.png  

所以得到F(x)= 1||w|||w⋅xi+b| ,损失函数

 

W始终垂直于分割超平面上的任意一个向量WX1 = WX2 = -b

纯python实现感知机(梯度下降法)_第1张图片

推导:在分割超平面W*X+b=0上任取一点x,假设错误分类点为xi,则要求向量xi-x在分割超平面法向量W的上的投影,用向量内积来算,两个向量的内积等于两个向量的模乘以一个cosθ ,公式:a*b=a*b*cosθ ,等价于向量a在向量b方向上投影的长度再乘以一个cos角度,所以(Xi-x)* W = |di| * ||W||,di = W(Xi-x)||W|| ,=WXi-Wx||W|| ,因为WX+b=0所以=WXi+b||W||

因为WXi+b是有正负的,但是距离始终都是正值,因为错误分类点的WXi+b与Yi(真实值是相反),所以要得到错误分类点的‘正’距离则可以表示为di=-YiWXi+b||W|| ,把所有错误分类点的距离加起来就得到了损失函数L=i=0n-Yi(WXi+b||W||) ,要是损失函数最小,就是求所有错误分类点的距离最小。当对分割超平面w⋅xi+b对它进行缩放的时候,实际上并不改变分割超平面的本身,所以损失函数可以进一步简化为L=i=0n-Yi(WXi+b)

 

如何是使得损失函数最小?

使用随机梯度下降(SGD)的方式来解决(传统的梯度下降每次更新都需要遍历所有data,当数据量太大或者一次无法获取全部数据时,这种方法并不可行。随机梯度下降方法解决这个问题基本思路是:只通过一个随机选取的数据(xn,yn) 来获取“梯度”,以此对w 进行更新。)

步骤:来了一个Xi先判断Yi(WXi+b) 是否小于0,如果小于0则是错误分类,使用梯度下降方法L=- Yi(WXi+b) 【去掉累加,针对某一个】

 

什么是梯度?当自变量X发生一个很小的值变化时,Y的变化趋势。当X变大时Y也变大它的梯度就是正的,当X变大时Y变小它的梯度就是负的,当Y变大的越多,梯度就越大,Y变大的越小梯度就越小,当梯度趋近于0时Y的梯度就没有变化了

梯度的方向是函数在这点增长最快的方向

∂L∂W=-YiXi  更新W时,对W求偏导,把W看作是自变量,其他的就为常数 。

∂L∂b=-Yi 更新b时,对b求偏导,把b看作是自变量,其他的就为常数

每次出现误分类时w或b分别减去它们各自在该误分类点的梯度值

因为要往梯度的负方向W=W-η(-YiXi) ,b=b-η(-Yi) ,学习率过大不收敛,来回震荡【错误分类点才执行】

最终 W=W+η(YiXi) , b=b+ηYi

 

步骤:

  1. 来了一个x点,先判断是不是错误分类点,如果是就更新W和b,
  2. 更新更新W和b

当所有数据集遍历过了之后,如果没有错误分类点,则找到或者损失函数的值已经很小了再迭代已经无意义了

 

感知机的对偶形式:

如果W和X的维度很大的时候,第一步判断是否为错误分类点将会非常耗时,如果解决这个问题?

W=i=0n-1ai η Yi Xi ,b=i=0n-1ai Yi ,ai是第i个点更新的次数,最终的W和b为多次更新的累加和,所以分割超平面可以表示为i=0n-1ai η Yi Xi *X+i=0n-1ai η Yi Xi  

对偶形式的好处,可以提前算出xixj

 

 

 

 

你可能感兴趣的:(深度学习)