首页 > 代码库 > 从Loagistic 到 SVM算法

从Loagistic 到 SVM算法

       SVM(支持向量机),一种二类分类器,之所以称之为向量机,是因为它本身就产生一个二值决策结果,即使一种决策“机”,支持向量机的泛化错误低(具有结构风险最小),具有很强的学习能力,因此很多人认为它是最好的监督学习算法。

SVM与Logistic回归的联系:

       logistic回归的目的就是从特征值中学习出一个0/1分类模型。而这个模型的输入是将特征的线性组合作为自变量,由于sigmod函数的自变量具有从负无穷到正无穷的输入范围,因此它可以把任何一个输入映射到0/1

sigmod函数的形式化表示: Hθ(x) = g(θTx) = 1/(1 + e-θTx  ),x代表n为特征向量,函数g就是logistic函数

假设函数就是特征属于y = 1 的概率

P(y=1|x;θ) = Hθ(x) ;

p(y =0|x;θ) = 1 -  Hθ(x)

当需要判断一个输入特征向量输入那个类时,只需要求θTx,如果θTx> 0,P(y=1|x;θ)  > 0.5 ,则表示属于类1.否则就是类0,所以logistic也可以看做一个概率估计问题。

因此在logistic回归求解过程中,关键是通过训练样本求解出θ,

          假设 θ = θ0 * x0+ θ1*x1 + θ2 * x2.......+ θn * xn

对于θ的求解,可以使用梯度上升法,梯度上升法基于的思想就是要找到某函数的最大值,最好的方法就是沿着函数梯度方向探寻。(求解最大值使用梯度上升法,而梯度下降法用来求解函数的最小值)

梯度上升法的伪代码如下:

每个回归系数初始化为1

重复R次:

  计算整个数据集的梯度

  使用alpha * gradient更新回归系数的向量

返回回归系数。

使用logistic回归判决时,决定权在意θTx,当θTx >>0使,则H(θTx) = 1,反正H(θTx) = 0,如果我们只是从θT出发

希望模型的达到的目的无非就是让训练样本数据中y = 1 的特征θTx >> 0,而y = 0 的的特征

θTx <<0,logistic的目标就是学习θ,使得y = 1 的特征远大于1, y = 0的特征远小于0,

强调在全部的训练实例上达到这个目标。

假设中间就是那条曲线θTx = 0,logistic回归就是强调所有点尽可能的远离中间那条线,学习出的结过也是θTx = 0 这条曲线

考虑上面3个点A,B,C,从图中可以看到A是确定的X类,然而C是不大确定的,这样就可以得到一个结论,我们应该找到那么一条直接,使得靠近曲线

的分割点,让他们尽可能的远离中间的那条线,而不是所有的点都必须远离中间的曲线。因为那样的话,就等于使得一部分的点靠近中间的曲线,

而另一部分的点,更加远离分割线,这需要权衡两部分的点。这也是logistic回归和SVM的一个重要的区别,SVM考虑的是应该使得那些靠近分割线的点(支持向量)

远离分割面,所以可以这么说,logistic是全局考虑所有的点距离最大化,而SVM则是局部考虑支持向量的距离最大化。

 SVM

SVM 的目的就是找出一个超平面尽可能的把两类数据分开,希望找到离分割面的距离最近的点,确保它们离超平面尽可能的远,这里把点到分割面的距离称为间隔,所以把SVM称为最大间隔法。支持向量就是指离超平面最近的那些点。所以,SVM的目标就是最大化支持向量到分割面的距离,

假设超平面的形式可以写成 WTx + b ,要计算点A到分割面的距离,必须先找出点到分割面的法线或垂线的距离,根据点到直线的距离公式

有 |WTA + b/|W||。这里的b理解为截距。把向量W和常数b一起描述了所给数据的分割线。

 现在的目标就是要找到W和b,为此,我们必须找到具有最小间隔的数据点,而这些点就是支持向量。一旦找到这些支持向量,就需要对该间隔进行最大化,所以

方程可以写成 

        arg maxw,b {minn(yi *(wTx + b)}/||w||}  (1)

令r = yi *(wTx + b),定义几何距离,假设令所有支持向量的距离等于1.那么就可以求解||w||-1最大值得到最终的结果,但是,本非所以的点到超平面的距离都等于1,只要那些

距离最近的点才是1,那些远离超平面的点的距离大于。公式中的最小值就是找出那些支持向量,最大值就是使得那些支持向量离超平面的距离最大化,所以求||w||-1最大值,是在约束条件 yi *(wTx + b)  >= 1的条件,这是一个极值优化问题,可以利用拉格朗日乘子去求解

所以 minn(yi *(wTx + b)}/||w||    => 等价于  {   min{1/2 * ||w||},   ( yi *(wTx + b)  >= 1) 

 (2)

转为极值问题之后,对w求导 dL/dw = 0. 有 w = sumi αi  * yi * xi。   且 sumi αi  * yi = 0;

 对公式1的最小问题可以 转换为  (3)

公式3中的内

这里得到最大化相对于 求解 max{L(w,b,a)},所以求解w和b相对于求解alphas的值,求最大化L(w,b,a),这是一个二次规划的问题,使用SMO(sequential Minimal Optimization)算法来快速的求解alpha的值。

  SMO算法的目标就是求解出一系列的alpha值和b,一旦求解这些alpha,就很容易求解w,从而构造出超平面。SMO算法的原理:每次循环中选择两个alpha进行优化处理,一点找到一对合适的alpha,那么就会有其中一个增大,例外一个减少,这里所谓的合适,就是指两个alpha必须符合条件,条件满足KKT条件。就是这两个alpha必须都在间隔边界之外,而第二个条件就是这两个alpha还咩有进行过区间化处理或者不在边界上。

  从公式3 可以到,有个两个特征向量的内积形式,这里用到了核技巧。因为我们知道不是所有的数据都是线性可分的,当数据在低维不可分或者分割面不明显时,可以把低维特征值映射到高维,核函数的作用就是把一个特征空间映射到另一个特征空间,通常情况下都是低维映射到高维空间。通常应用最广泛的就是径向基函数(radial basis function) ,核函数的选择必须满足核函数矩阵式半正定的。那么任意一个核函数就会对于一个特征映函数Φ(x)TΦ(y)相乘。

核函数的而一个优势在于不需要知道具体的空间变化函数Φ(x),当计算两个Φ(x)TΦ(y)相乘时,可以直接利用核函数求解,SVM 优化中一个特别好的地方就是可以把所以的运算都可以写成内积形式,这样我们就可以把内积运算转换为核函数的方法,称为核技巧(kernel trick)。这样,一般在低维不可分的数据在映射到高维上,都具有较好的分割效果。

支持向量的数目存在一个最优值,SVM的优点就是它能对数据进行高效分类,如果支持向量太少,就可能得到一个很差的决策边界,如果支持向量过多,也就相当于每次都利用整个数据集来进行分类,这种方法称为K邻近。

    本质上来说,SVM是一个两类分类器,其分类结果不是1就是-1,可以使用SVM两类分类器扩展到多类分类器(参考:A Comparison of Methods for Muticlass Support Vector Machines)。

SVM 算法最初是为二值分类问题设计的,当处理多类问题时,就需要构造合适的多类分类器。目前,构造SVM多类分类器的方法主要有两类:一类是直接法,直接在目标函数上进行修改,将多个分类面的参数求解合并到一个最优化问题中,通过求解该最优化问题“一次性”实现多类分类。这种方法看似简单,但其计算复杂度比较高,实现起来比较困难,只适合用于小型问题中;另一类是间接法,主要是通过组合多个二分类器来实现多分类器的构造,常见的方法有one-against-one和one-against-all两种。

a.一对多法(one-versus-rest,简称OVR SVMs)。训练时依次把某个类别的样本归为一类,其他剩余的样本归为另一类,这样k个类别的样本就构造出了k个SVM。分类时将未知样本分类为具有最大分类函数值的那类。

假如我有四类要划分(也就是4个Label),他们是A、B、C、D。于是我在抽取训练集的时候,分别抽取A所对应的向量作为正集,B,C,D所对应的向量作为负集;B所对应的向量作为正集,A,C,D所对应的向量作为负集;C所对应的向量作为正集, A,B,D所对应的向量作为负集;D所对应的向量作为正集,A,B,C所对应的向量作为负集,这四个训练集分别进行训练,然后的得到四个训练结果文件,在测试的时候,把对应的测试向量分别利用这四个训练结果文件进行测试,最后每个测试都有一个结果f1(x),f2(x),f3(x),f4(x).于是最终的结果便是这四个值中最大的一个。

note:这种方法有种缺陷,因为训练集是1:M,这种情况下存在biased.因而不是很实用.

b.一对一法(one-versus-one,简称OVO SVMs或者pairwise)。其做法是在任意两类样本之间设计一个SVM,因此k个类别的样本就需要设计k(k-1)/2个SVM。当对一个未知样本进行分类时,最后得票最多的类别即为该未知样本的类别。Libsvm中的多类分类就是根据这个方法实现的。

还是假设有四类A,B,C,D四类。在训练的时候我选择A,B; A,C; A,D; B,C; B,D;C,D所对应的向量作为训练集,然后得到六个训练结果,在测试的时候,把对应的向量分别对六个结果进行测试,然后采取投票形式,最后得到一组结果。

投票是这样的.
A=B=C=D=0;
(A, B)-classifier 如果是A win,则A=A+1;otherwise,B=B+1;
(A,C)-classifer 如果是A win,则A=A+1;otherwise, C=C+1;
...
(C,D)-classifer 如果是A win,则C=C+1;otherwise,D=D+1;
The decision is the Max(A,B,C,D)

notw:这种方法虽然好,但是当类别很多的时候,model的个数是n*(n-1)/2,代价还是相当大的.

c.层次支持向量机(H-SVMs)。层次分类法首先将所有类别分成两个子类,再将子类进一步划分成两个次级子类,如此循环,直到得到一个单独的类别为止。