支持向量机(Support Vector Machine):
支持向量机简称SVM,与逻辑回归和神经网络相比,在学习复杂的非线性方程时,提供了一种更为清晰、更加强大的方式。
先来看假设函数:
if y=1, we want ,
.
if y=0, we want ,
.
那么类似的代价函数:
:
:
我们根据逻辑回归的代价函数变形得到SVM的代价函数:
Logistic regression:
SVM:
相当于式子乘上了, 对于求全局最小值没有影响,那么
.
那么假设函数定义为:
宏观上了解SVM的工作机制:
SVM会优先寻找一个最大间距的分类器,如下图黑线,那么其与蓝线的间距被称为margin .
为什么SVM总是寻找最大间距:
向量内积(vector inner product):
现在有两个向量u、v:
u和v的内积,即.
定义 (范数符号)表示向量u的长度, 那么
p表示向量v在u上的投影长度(可能是负实数).得到:
下面通过一个例子来理解SVM求解最大间距的过程,当C特别大,那么在求解时代价函数第一部分会尽量被计算为0,那么代价函数求解问题就可以看作:
如果从简单问题入手,,那么:
, 如果
也同理。
s.t.(subject to/约束条件):
与
的图像意义:
对于不是最大margin的分类器,相对较小,
相对较大:
对于SVM找到的最大margin的分类器,相对上图更大,
更小,对于求最小theta问题显然更优:
核函数(kernels):
核函数可以用来构造复杂的非线性方程。
先来看一个简单的变换,一个多项式特征变量:
...
变为:
...(
)
高斯核函数(相似度函数/Gaussian Kennels):
给出x,如果x接近,那么
接近1,否则接近0,即:
if : x is far from ,
现在来看看对核的影响:
一个三个标记点的分类器举例:
如此,标记点更多时,还会构成更复杂的分类器。实际上我们会把每一个训练样本作为一个标记点。
最终的代价函数:
给定训练集:(,
)...(
,
)
选定:
for training example: (,
),
:
Hypothesis: given x, compute features , also
进一步转化代价函数:
如何选择参数:
总结SVM计算过程:
1.选择一个软件包(e.g. liblinear,libsvm,...)来计算SVM。
2.选择参数C。
3.选择一个核函数(相似度函数)。例如高斯核,或者没有核(也叫线性核,if y=1,直接就是).
当n很大,m很小,偏向于选择线性核,因为在没有足够多的训练数据的时候,会导致过度拟合。
当n较小,m很大,偏向于选择高斯核,高斯核在拟合一个复杂的非线性判定边界时会很有用。
不是所有的函数都可以作为核函数并使得核函数都有用,首先需要满足莫塞尔定理。
还有其它很多中核函数可供选择:
polynomial kernel(多项式核函数), string kernel(字符串核函数), chi-square kernel(卡方核函数), histogram intersection kernel(直方图交叉核函数),...
4.如果是高斯核,还需要选择一个.
5.对输入x归一化。
与逻辑回归问题一样,如果有K个分类,那么就要训练K个SVM分类器。
如何选择使用逻辑回归还是使用SVM:
if n is large (relative to m): e.g. n >= m, n=10000, m=10/1000
use logistic regression, or SVM without a kernel("linear kernel")
if n is small, m is intermediate: e.g. n=1~1000, m=10~10000
use SVM with gaussian kernel.
if n is small, m is large: e.g. n=1~1000, m=50000~1000000+
create/add more features, then use logistic regression, or use SVM without a kernel.
在最后这种情况,使用逻辑回归和SVM无核是相似的,SVM的优势需要随着核函数的选择而发挥出来。
最后,神经网络的效果可能比以上选择会更好,但是其一个缺点就是训练过程比SVM慢很多,而且不一定是全局最小(虽然局部最小也很接近,而且可以多次训练缓解问题),但是SVM总是能找到全局最小。