【Machine Learning】笔记:SVM

来源:互联网 发布:捷通华声语音合成软件 编辑:程序博客网 时间:2024/06/06 17:09

课程来自 Coursera 上 Andrew Ng 的 machine learning 第7周的内容。

代价函数

Logistic regression 要做的事情是:

minθ1mi=1m[y(i)(loghθ(x(i)))+(1y(i))(log(1hθ(x(i))))]+λ2mi=1nθ2j

从它出发,将代价函数 cost function 换掉,移除 m(不影响最优化后得到的 θ),再将 Regularization 的系数 λ 变为在代价函数前面的 C(如果 C=1λ,则就是原来的等式)。现在,SVM 要做的事情是:

minθCi=1m[y(i)cost1(θTx(i))+(1y(i))cost0(θTx(i))]+12i=1nθ2j(*)

cost1(z) 的函数表示,当 z<1 时,它与 logistic regression 中的 loghθ(x(i)) 很接近,当 z1 时,它为0. 而 cost0(z) 正好反过来,当 z>1 时,它与 logistic regression 中的 loghθ(x(i)) 很接近,当 z1 时,它为0.

Large Margin Classifier

如果 C 取非常大的值,就会使得 (???) 中的第一项很接近于0,(???) 式就会变为:

minθs.t.12i=1mθ2jθTx(i)1,θTx(i)1,if y(i)=1if y(i)=0

此时,SVM 就相当于最大间隔分类器,但这样的分类器对异常值很敏感。

C 不是非常大的时候,它就会比较稳健,会忽略一些异常值的影响,在非线性可分的样本中也可以作出比较好的分类。

Kernal

如果要训练出一个非线性边界,可能将会使用 θ0+θ1x1+θ2x2+θ3x1x2+θ4x21+0 来表示 y=1,可以将这样的形式一般化为 θ0+θ1f1+θ2f2+θ3f3+,但我们怎样才能知道我们选定的 f1,f2, 究竟好不好呢?能否找出一些更好的选择呢?

核函数

下面是一个构造 fi 的方法,选出一些点(称为 landmarks) l(1),l(2),l(3),,对于一个新的样本 x,将新的特征 fi 定义为它“和 l(i) 的相似度”:

fi=similarity(x,l(i))=exp(xl(i)22σ2)

这里的 similarity(x,l(i)) 又叫 kernal function,可以记为 k(x,l(i)),这里的核函数是高斯核函数。xl(i) 越接近,k(x,l(i)) 越接近于1,越不接近,k(x,l(i)) 越接近于0.

但是,我们怎么得到这些 landmarks?怎么选择这些 landmarks?还有没有其他的相似度函数?

怎样选择 landmarks?

一种方法是,将训练集中每一个样本点都作为一个 landmarks,这样就有 m 个 landmarks,原来的样本点有 n+1 个特征(加上 x0=1),在经过核函数的变换之后,变成了有 m+1 个特征(加上 f0=1),且 x(i) 对应的 f(i) 中,第 i 个维度 f(i)i (衡量 x(i) 和自己的相似度)是1.

在核函数下的优化目标

在经过特征转换之后,SVM 的优化目标是:

minθCi=1m[y(i)cost1(θTf(i))+(1y(i))cost0(θTf(i))]+12i=1mθ2j

这里的 θ 已经是 m维向量,不再是 n 维的,i=1mθ2j其实就是去掉 θ0 之后的 θTθ,大多数 SVM 在实现的时候,会将 θTθ 变为 θTMθ,其中 M 与核函数有关,这样可以使其在数据量很大的时候更有效率。

为什么不能将核函数应用到其他一些算法如 logistic regression 上?如果用了,会使它的运行变得很慢,只有在 SVM 中,才会有一些计算技巧,可以提高效率。

实现 SVM

老师推荐直接用成熟的软件包,如 liblinear、libsvm 等来实现。在使用时,需要提供这些一些信息:

  • 参数 C
  • 核函数,有这样一些选择:

    1. 可以选择不用核函数,相当于是 linear kernal,当在高维空间中,数据量又不够时,可以用它,会使边界尽量简单。
    2. 高斯核函数,当特征数不太多而数据量足够时,可以使用。一些软件可能需要自己实现一个核函数并传入。在使用高斯核函数之前,如果不同特征的数值相差很大,最好使用 feature scaling 归一化.
    3. Polynomial kernal:k(x,l)=(xTl+constant)degree,通常只用于当 xl 的每个维度都大于0时。
    4. String kernal. 当输入是字符串时,可能会用。
    5. Chi-square kernal.
    6. Histogram intersection kernal.

不是随便写一个核函数都是有效的,所有的核函数都要满足 Mercer’s Theorem,否则 SVM 算法无法有效求解。一般只有线性核函数和高斯核函数比较常用,其他核函数极少使用。

还有一些细节,比如在多分类任务中该怎么作出两两分类之间的边界?
一般来说,软件包中都有内置的多分类算法,如果没有,可以用 one-vs.-all 的做法,对每个分类 i 都使用一次 SVM 得出 θ(i),最后取 θTx 最大的那个 θ(i).

Logistic regression vs. SVM

什么时候用 logistic regression?什么时候用 SVM?

  • 当特征数很大(相对于样本个数来说)的时候,用 logistic regression 或线性核函数的 SVM.
  • 当特征数比较小,样本个数大小适中时,用高斯核函数可能会工作得很好。
  • 当特征数比较小,样本非常多(比如10万以上)的时候,此时用高斯核函数的 SVM 可能会运行得非常慢,可以尝试再手动添加一些特征,然后用 logistic regression 或线性核函数的 SVM.

对以上所有的问题,都可以用神经网络来解决,但神经网络的缺点是运行得比较慢,而 SVM 可以运行很快,且神经网络需要担心局部最优问题,而 SVM 是一个凸优化问题,必定会得到全局最优。

原创粉丝点击