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_)
    
  • 相关阅读:
    爬取校园新闻首页的新闻的详情,使用正则表达式,函数抽离
    网络爬虫基础练习
    Mysql 使用 select into outfile
    Mysql 使用CMD 登陆
    使用Clean() 去掉由函数自动生成的字符串中的双引号
    Get Resultset from Oracle Stored procedure
    获取引用某个主键的所有外键的表
    Entity Framework 丢失数据链接的绑定,在已绑好的EDMX中提示“Choose Your Data Connection”
    添加MySql Metat Database 信息
    at System.Data.EntityClient.EntityConnection.GetFactory(String providerString)
  • 原文地址:https://www.cnblogs.com/guesswhy/p/12882734.html
Copyright © 2011-2022 走看看