zoukankan      html  css  js  c++  java
  • [机器学习&数据挖掘]SVM---核函数

    1、核函数概述:

    核函数通俗的来说是通过一个函数将向量的低维空间映射到一个高维空间,从而将低维空间的非线性问题转换为高维空间的线性问题来求解,从而再利用之前说的一系列线性支持向量机,常用的核函数如下:

    多项式核函数:

                

    高斯核函数:

                

    比如硬间隔种的目标函数为:

                

    而核函数替换后的目标函数为:

                 

    从这个两个目标函数找共同点,其实会发现核函数是作用在特征向量上,开始的目标函数一次计算是利用了两个特征向量,而接下来的核函数是对两个特征向量做函数运算,假如将核函数利用在一次运算利用三个特征向量的计算,这时核函数就会对这三个特征向量做核函数,其实就是一个替换的问题,将两个特征向量点积运算换成一个核函数的值,仅此而已。

    2、SMO算法概述:

    因此接下来的处理还是求解拉格朗日乘子、w、b,因此引入SMO(序列最小最优化算法)

     首先SMO算法要解决的对偶问题如下:

                 

    SMO算法是一种启发式算法,基本思路:如果所有变量的解都满足此最优化问题的KKT条件,那么这个最优化的问题的解就得到了,SMO算法其实就是在求解拉格朗日算子。SMO算法子问题:先选择两个变量,然后固定其他变量,针对此两个变量构建二次规划问题,子问题由两个变量,一个是违反KKT条件最严重的变量,另一个由约束条件自动确定,然后对此子问题求解,当此两个变量都满足KKT条件,则子问题求解完成。SMO算法就是将问题不断的分解为此子问题,直到所有的变量的解都满足此问题的KKT条件,从而结束算法

    通过以上的对偶问题可以将子问题写成(此处假定选择两个变量alpha1、alpha2):

                  

                  

    注意:此子问题的目标函数是从上面的对偶问题得来,在推导的过程中会发现有一些项没有,是因为这个时候只有alpha1和alpha2是变量,其他的都看作固定的值,就类似求min(f(x))和min(f(x)+C)的解x是一样的(C为常数)

    3、alpha计算公式:

    接下来几个公式用于每次计算:

                  

    注:Ei是g(x)对xi的预测值对yi的值之差

                   

                  

    此计算的是alpha2未经过处理的值,因为各个alpha都由一个范围的,具体如下分段函数:

                  

    通过alpha2可以求得alpha1的新值如下:

                  

    4、变量选择:

    (1)首先面临的是第一个变量的选择,在SMO算法的概述中我也介绍过,就是最不满足此问题的KKT条件,KKT条件为何看如下(KKT是相对于每个样本点来说的即(xi,yi)):

                      

                      g(xi)如上述的式子

    第一个变量的选择是SMO的外层循环,在检验过程中,首先遍历所有满足0<alpha<C条件的样本点,即在间隔边界上的支持向量点,检验其是否满足KKT条件,如果都满足,则遍历整个训练集是否满足KKT条件,选择最不满足的点为第一个变量。

    (2)其次是第二个变量的选择:第二个变量的选择是SMO的内层循环,首先假定已经选定了第一个变量,第二个变量的选择是希望能使alpha2有足够大的变化,一种简单的做法是其对应的|E1-E2|最大。在特殊的情况下,通过以上方法不能使目标函数有足够的下降,则采用向下启发规则继续选择alpha2,遍历所有的间隔边界上的支持向量点,依次将其作为alpha2试用,直到目标函数有足够的下降,若找不到则便利整个训练集;若仍找不到,则放弃alpha1,通过外层循环继续选择另外的alpha1.

    (3)计算b和差值Ei

    因为在每次完成两个变量的优化之后,都需要重新计算b和Ei,主要是Ei的计算需要用的b,公式如下:

          

          

          

  • 相关阅读:
    维特比算法 实现中文分词 python实现
    最大匹配算法进行分词 前向 后向 python实现
    动态规划 编辑距离问题(Edit Distance Problem)
    “RuntimeError: Trying to backward through the graph a second time, but the buffers have already been freed. Specify retain_graph=True when calling backward the first time”
    PCA主成分分析 原理讲解 python代码实现
    卷积的理解 python代码实现 pytorch 多输入多输出通道的理解
    AdaBoost python代码实现
    随机森林 python实现
    Apache配置转发
    JS 由前端保存到文件
  • 原文地址:https://www.cnblogs.com/fantasy01/p/4668419.html
Copyright © 2011-2022 走看看