zoukankan      html  css  js  c++  java
  • SVM算法

    SVM算法

    间隔的定义

    在分隔超平面定义为(w^Tx+b=0)时,我们定义点到超平面的距离为(gamma=frac{y(x^Tx+b)}{lVert w Vert_2})

    目标函数与优化

    定义了点到超平面的距离后,我们的目标就是让所有的点到分隔超平面的距离之各最小,我们定义优化函数如下:

    [max frac{1}{lVert w Vert_2} s.t. y_i(w^Tx+b)ge1(i=1,2,..,m) ]

    也就是说,我们在约束条件(y_i(w^Tx+b)ge1(i=1,2,..,m))下,最大化(frac{1}{lVert w Vert_2}),等同于最小化(lVert w Vert_2^2),通过拉格朗日函数,做最优化的求解,引入拉格朗日函数,目标函数如下:

    [L(w,b,alpha)=frac{1}{2}lVert w Vert_2^2-sum_{i=1}^malpha_i[y_i(w^Tx_i+b)-1] s.t. alpha_ige0 ]

    在引入拉格朗日乘子后,我们的优化目标变为:

    [underbracemin_{w,b}underbracemax_{alpha_ige0}L(w,b,alpha) ]

    我们可以先求优化函数对于(b,w)的极小值,再接着求拉格朗日乘子(alpha)的极大值。

    [underbracemax_{alpha_ige0}underbracemin_{w,b}L(w,b,alpha) ]

    先求(L(w,b,alpha))基于(w,b)的极小值,即(min_{w,b}L(w,b,alpha)),可以通过求偏导得到

    [frac{partial L}{partial w}=0Rightarrow w=sum_{i=1}^ma_iy_ix_i \ frac{partial L}{partial b}=0Rightarrowsum_{i=1}^malpha_iy_i=0 ]

    从以下两个式子中可以得到(w)(alpha)r的关系,只要能求出优化函数对应的(alpha)就可以求出(w)了,至于(b),由于上两式不存在(b),所以(b)可以有多个。我们将(w)t和(b)的关系代入优化函数(L(w,b,alpha))消除(w),定义新的函数为:

    [psi(alpha)=underbracemin_{w,b}L(w,b,alpha) ]

    优化函数的推导过程如下:

    [egin{equation} egin{split} psi(alpha)&=frac{1}{2}lVert w Vert_2^2-sum_{i=1}^malpha_i[y_i(w^Tx_i+b)-1] end{split} end{equation} ]

    [egin{equation} egin{split} psi(alpha)&=frac{1}{2}lVert w Vert_2^2-sum_{i=1}^malpha_i[y_i(w^Tx_i+b)-1]\ &=frac{1}{2}w^Tw-sum_{i=1}^malpha_iy_iw^Tx_i-sum_{i=1}^malpha_iy_ib+sum_{i=1}^malpha_iquad展开\ &=frac{1}{2}w^Tsum_{i=1}^malpha_iy_ix_i-sum_{i=1}^malpha_iy_iw^Tx_i-sum_{i=1}^malpha_iy_ib+sum_{i=1}^malpha_iquad替换w\ &=frac{1}{2}w^Tsum_{i=1}^malpha_iy_ix_i-w^Tsum_{i=1}^malpha_iy_ix_i-sum_{i=1}^malpha_iy_ib+sum_{i=1}^malpha_iquad提出公共的\ &=-frac{1}{2}w^Tsum_{i=1}^malpha_iy_ix_i-sum_{i=1}^malpha_iy_ib+sum_{i=1}^malpha_iquad合并同类项\ &=-frac{1}{2}w^Tsum_{i=1}^malpha_iy_ix_i-bsum_{i=1}^malpha_iy_i+sum_{i=1}^malpha_iquad将b提到前面\ &=-frac{1}{2}{(sum_{i=1}^{m}alpha_iy_ix_i)^T}(sum_{i=1}^malpha_iy_ix_i)-bsum_{i=1}^malpha_iy_i+sum_{i=1}^malpha_iquad替换w^T\ &=-frac{1}{2}{sum_{i=1}^{m}alpha_iy_ix_i^T}sum_{i=1}^malpha_iy_ix_i-bsum_{i=1}^malpha_iy_i+sum_{i=1}^malpha_iquad去掉括号\ &=-frac{1}{2}sum_{i=1}^{m}alpha_iy_ix_i^Tsum_{i=1}^malpha_iy_ix_i+sum_{i=1}^malpha_iquad去掉a_iy_i=0的项\ &=-frac{1}{2}sum_{i=1,j=1}^{m}alpha_iy_ix_i^Talpha_jy_jx_j+sum_{i=1}^malpha_iquad去掉双重求和\ &=sum_{i=1}^malpha_i-frac{1}{2}sum_{i=1,j=1}^{m}alpha_ialpha_jy_iy_jx_i^Tx_jquad交换位置\ end{split} end{equation} ]

    在如下推导过程中,用到了范数的定义(Vert w Vert_2^2=w^Tw),和求偏数为0得到的(w=sum_{i=1}^{m}alpha_iy_ix_i)(sum_{i=1}^{m}alpha_iy_i=0),从上述可以看到,通过对(w,b)极小化后,我们的优化函数(psi(alpha))只有(alpha)做为参数,只要我们能够优化(psi(alpha))就能够求出对应的(alpha),进而求出(w,b)

    优化函数的极大化表示如下:

    [egin{equation}egin{split} { underbracemax_alphasum_{i=1}^malpha_i-frac{1}{2}sum_{i=1,j=1}^{m}alpha_ialpha_jy_iy_j(x_icdot x_j)\ s.t. sum_{i=1}^{m}alpha_iy_i=0\ alpha_ige0 i=1,2,...,m } end{split}end{equation} ]

    去掉负号后,将问题转为求最小值的优化问题,表示如下:

    [egin{equation}egin{split} { underbracemin_alphafrac{1}{2}sum_{i=1,j=1}^{m}alpha_ialpha_jy_iy_j(x_icdot x_j)-sum_{i=1}^malpha_i\ s.t. sum_{i=1}^{m}alpha_iy_i=0\ alpha_ige0 i=1,2,...,m } end{split}end{equation} ]

    具体如何求得(alpha)我们可以通过SMO算法,后续再学。

    假设我们通过SMO算法,得到了对应(alpha)(alpha^*),那么,根据(w=sum_{i=1}^{m}alpha_i^*y_ix_i),即可求得了(w^*)

    求b更麻烦一些,对任意支持向量((x_x,y_s))都有

    [y_s(w^Tx_x+b)=y_s(sum_{i=1}^malpha_iy_ix_i^Tx_s+b)=1 ]

    假设我们有s个支持向量,则对应我们求出s个(b^*),理论上这些(b^*)都可以作为最终结果。但我们一般采取更加健壮的解,即求出所有支持向量对应的(b^*),然后取平均值作为最终结果。注意,对于严格线性可分的SVM,b值具有唯一解,也就是说这里求出所有的(b^*)都是一样的。

    如何得到支持向量

    根据KKT条件中的对偶互补条件(alpha_i^*(y_i(w^Tx_i+b)-1)=0),如果有(alpha_igt0)则有(y_i(w^Tx_i+b)=1),即点在支持向量上,否则如果(alpha_i=0)则有(y_i(w^Tx_i+b)ge1),即样本在支持向量上或者已经被正确分类。

    对偶与KKT条件

    对偶就是把求max和min的顺序交换。

    KKT条件

    [egin{equation}egin{split} frac{partial}{partial w_i}L(w^*,alpha^*,eta^*)=0 i=1,2,...,n\ frac{partial}{partial eta_i}L(w^*,alpha^*,eta^*)=0 i=1,2,...,l\ alpha^*g_i(w^*)=0 i=1,2,...,k\ g_i(w^*)le0 i=1,2,...,k\ alphage0 i=1,2,...,k\ end{split}end{equation} ]

    上述条件称为KKT条件,条件表明,如果(alpha^*gt0),那么(g_i(w^*)=0)

    SVM软件间隔最大化模型

    如样本中存在异常点,使得SVM分隔超平面不能够将样本分开,或都泛化性能较差,这时,需要引入松弛因子(xi_i),使得$$y_i(wcdot x_i+b)ge1-xi_i$$,优化目标变为如下:

    [egin{equation}egin{split} min frac{1}{2}lVert w Vert_2^2+Csum_{i=1}^{m}xi_i\ s.t. y_i(w^Tx_i+b)ge1-xi_i i=1,2,...,m\ xi_ige0 i=1,2,...,m end{split}end{equation} ]

    这里的C为惩罚参数,可以人理解为正则化时的参数,C越大,对误分类的惩罚越大,C越小,对误分类的惩罚越小。通过推导后,最终的优化函数结果如下:

    [egin{equation}egin{split} { underbracemin_alphafrac{1}{2}sum_{i=1,j=1}^{m}alpha_ialpha_jy_iy_jx_i^Tx_j-sum_{i=1}^malpha_i\ s.t. sum_{i=1}^{m}alpha_iy_i=0\ 0lealpha_ile C i=1,2,...,m } end{split}end{equation} ]

    这里与前面不加惩罚项时,只有第3个条件不一样,不加惩罚项时为(alpha_ige0 i=1,2,...,m),多了一个(alpha_ile C),如果(alpha_i=C)说明可能是一个异常点。

    SVM另一种解释--合页损失函数

    如果点被正确分类,且函数间隔大于1,损失是0;否则,损失是(1-y(wcdot x+b))

    线性不可分SVM与核函数

    将多项式回归转为线性回归:将高次项用其他一次项未知数代替。

    核心思想:对于低维不可分的数据,将其映射到高维,就可能线性可分。

    注意,由低维向高维映射时,可能产生维度爆炸,那么,核函数是解决该问题的有效手段:

    假设(phi)是一个从低维的输入空间(chi)到高维空间(H)映射,那么存在函数(K(x,z))对于任意的(x,zinchi)都有

    [K(x,z)=phi(x_i)cdot phi(x_j) ]

    我们称(K(x,z))为核函数,其计算是在低维空间进行的,避免了维度爆炸问题。核函数要必须是正定核函数,常用的核函数有以下几个:

    1. 线性核函数

      [K(x,z)=xdot z ]

    2. 多项式核函数

      [K(x,z)=(gamma xcdot z+r)^d ]

    3. 高斯核函数

      [K(x,z)=exp(-gammalVert x-z Vert^2)\ gammagt0 ]

    4. Sigmoid核函数

      [K(x,z)= anh(gamma xcdot z+r) ]

    SVM最终表示

    [egin{equation}egin{split} { underbracemin_alphafrac{1}{2}sum_{i=1,j=1}^{m}alpha_ialpha_jy_iy_jK(x_i,x_j)-sum_{i=1}^malpha_i\ s.t. sum_{i=1}^{m}alpha_iy_i=0\ 0lealpha_ile C i=1,2,...,m } end{split}end{equation} ]

    加入了惩罚项和核函数,得到的解为:

    [alpha_i^*=0Rightarrow y_ig(x_i)ge1\ 0ltalpha_i^*lt CRightarrow y_ig(x_i)=1\ alpha_i^*=CRightarrow y_ig(x_i)le1\ ]

    SMO算法

    为求优化函数的(m个alpha)是比较困难的,SMO采用一种启发式的思想,每次只优化2个变量,其他变量视为常数,由于(sum_{i=1}^malpha_iy_i=0),两个待求变量的关系也就定了。

    只弄清了原理,没有太清楚过程和细节。

    线性支持回归

    SVM回归模型的损失函数度量

    分类模型中,加入松弛变量,我们的目标函数为

    [frac{1}{2}lVert w Vert_2^2+Csum_{i=1}^mxi_i\ s.t.quad y_i(wcdot phi(x_i)+b)ge1-xi_i ]

    回归模型下,让训练集中的每个点尽量拟合到一个线性模型(y_i=wcdot phi(x_i)+b),我们定义一个常量(epsilon)对于某一个点((x_i,y_y))如果(lvert y_i-wcdotphi(x_i)-b vertleepsilon)则完全没有损失,否则,对应的损失为(lvert y_i-wcdotphi(x_i)-b vert-epsilon)

    SVM回归模型求解决

    此问题同样使用KKT条件求解,具体过程略。。。

    scikit-learn支持向量算法使用

    库与函数

    分类算法库:SVC、NuSVC、LinearSVC

    回归算法库:SVR、NuSVR、LinearSVR

    都在sklearn.svm模块里,这三个类的区别是对损失函数的度量方式不同。如果知道数据是线性拟合的,则使用linear,如不知道数据分布,则使用SVC。

    SVM核函数

    1. 线性核函数:(K(x,z)=xcdot z),普通内积,Linear只能使用它。
    2. 多项式核函数:(K(x,z)=(gamma xcdot z+r)^d),其中(gamma ,r,d)都需要调参,比较麻烦。
    3. 高斯核函数:(K(x,z)=exp(-gammalVert x-z Vert^2)),其中(gammagt 0)需要调参。
    4. sigmoid核函数:(K(x,z)= anh(gamma xcdot z+r)),其中(gamma r)需要调参。

    SVM分类算法参数

    1. C惩罚系数
    2. kernel核函数选择:poly多项式,rbf高斯核
    3. penalty正则化参数,只对线性一拟合有意义
    4. 其他。。。。

    SVM算法库要点

    1. 在训练数据之前,数据要归一化
    2. 在特征非常多或样本数远小于特征数时,使用线性核已经效果很好,只需要调惩罚系数C即可。
    3. 选择核函数时,如线性拟合不好,一般推荐使用高斯核'rbf'。这时我们主要对惩罚系数C和核函数参数(gamma)进行调参,可使用交叉验证的方式。
    4. 理论上高斯核不会比线性核差。

    例子

    lsvm = SVC(kernel='linear', C=1.0)
    lsvm = SVC(kernel='poly', degree=3, C=1.0)
    lsvm = SVC(kernel='rbf', gamma=100, C=1.0)
    

    SVM 高斯核(RBF)调参总结

    SVM 分类模型的主要参数是两个:一个是惩罚系数C,另一个是RVF的核函数系数(gamma)

    惩罚系数即松弛变量,它主要是平衡支持向量和误分类两者之间的关系,可以理解为正则化系数,当C较大时,损失函数越大,意味着我们不愿意放弃比较远的离群点。这样会有更多的支持向量,支持向量和超平面越复杂,也容易过拟合。反之,我们选择较少的支持向量,超平面也简单,sklearn默认C取值为1。

    另一个超参数(gamma),在高斯函数(K(x,z)=exp(-gammalVert x-z Vert^2))中定义单个样本对整个分类超平面影响。当(gamma)较小时,单个样本对整个分类影响较小,不容易被选为支持向量,支持向量总数会较少。sklearn默认值是(frac{1}{样本特征数})

    当C较大,(gamma)较大时,我们会有更多的支持向量。

    L1比L2更不容易过拟合

    SVM RBF主要调参方法

    在sklearn中,我们使用GridSearchCV进行交叉验证调参。

    1)estimator:模型选择

    2)param_grid:参数列表

    3)sv:S折交叉的折数,默认是3,样本较多时可以增大该值

    SVM RBF调参例子

    from sklearn.model_selection import GridSearchCV
    from sklearn.svm import SVC
    
    grid = GridSearchCV(SVC(), param_grid={"c": [0.1, 1, 10], "gamma": [1, 0.1, 0.01]}, cv=4)
    grid.fit(x,y)
    print(grid.best_params_,grid.best_score_)
    
  • 相关阅读:
    Leetcode中级算法-二分查找01
    二叉查找树01(c++代码实现)
    Leetcode中级算法-动态规划03(最长上升子序列)
    Leetcode中级算法-动态规划02
    Leetcode中级算法-动态规划01
    Leetcode中级算法-全排列
    使用git获取Linux内核
    Kali 使用proxychains接管全局代理
    kali2020.1安装问题解决【选择并安装软件】
    unzip最常用使用方法
  • 原文地址:https://www.cnblogs.com/guesswhy/p/12882734.html
Copyright © 2011-2022 走看看