机器学习——支持向量机SVM(Support Vector Machine)(下)
1、SVM算法特征
(1)训练好的模型的算法复杂度是由支持向量的个数决定的,而不是由数据的维度决定。所以,SVM不太容易产生overfitting。
(2)SVM训练出来的模型完全依赖于支持向量(Support Vectors),即使训练集里面所有非支持向量的点都被去除,重复训练过程,结果仍然会得到完全一样的模型。
(3)一个SVM如果训练得出的支持向量个数比较小,SVM训练出的模型比较容易被泛化。
2、线性不可分情况(linearly inseparable case)
(1)数据集在空间中对应的向量不可能被一个超平面分开。
(2)两个解决的步骤:
利用一个非线性的映射把原数据集中的向量点转化到一个更高维的空间中。
在这个更高维的空间中找到一个线性的超平面来根据线性可分的情况处理。
(3)简单举例
在一维空间中,有两类点分布在一条直线上,如下图,没有办法找到一条直线将其实现分类。
建立一个映射 f(x)=x^2,由原先一维空间转换到二维空间上的曲线上,这是很容易找到一条直线(超平面)将两类示例分开。
(4)非线性映射将低维空间转换到高维空间的视觉化演示:http://www.youtobe.com/watch?v=3liCbRZPrZA
3、如何利用非线性映射把原始数据转化到高维空间中?
(1)简单举例
3维输入向量:,转化到6维空间Z中去:
此时,新的决策超平面为:,这个超平面是线性的,其中W和Z是向量。
解出W和b之后,并且带入回原方程:
(2)关键问题:
如何选择合理的非线性的转化把数据传到高维空间中?
如何解决內积时算法复杂度非常高的问题?即:使用核方法(kernel trick)
4、核方法(kernel trick)
(1)目的(动机)
在线性SVM中转化为最优化的问题时,求解的公式计算都是以內积(dot product)的形式出现的,
其中,是把训练集中的向量点转化到高维的非线性映射函数,因为內积的算法复杂度非常大,所以我们利用
核函数来取代计算非线性映射的內积。
(2)定义
以下核函数和非线性映射函数的內积等同:
(3)常用的核函数(kernel function)
h度多项式核函数(polynomial kernel of degree h):
高斯径向基核函数(Gaussian radial basis function kernal):
S型核函数(Signmoid function kernel):
核函数的使用:根据先验经验,如图像分类通常使用高斯径向基核函数(RBF),文字通常不使用RBF;
尝试不同的kernel,根据结果准确度而定。
(4)核函数举例:
假设定义两个向量,;
定义方程:
核函数:
假设;
则;
其內积为:
利用核函数计算:
所以,对于同样的结果,用kernel方法计算容易的很多。
5、SVM扩展可解决多个类别的分类问题
上面讨论的只是二分类的问题,现实生活中大多数解决的不仅是二分类问题,而是多分类的问题,如何解决多类问题,
对于每个类,有一个当前类和其他类的二分器(one-vs-rest),假设目前有10类,可以设置10个分类器,第1个分类器只关心
是否为第一类和剩下类(第一个分类器区分第1类和第2至第10类,第1类为一类剩下的第2至第10类为另一类),同理,
第2个分类器只关心是否为第2类以及剩下的第1类和第3至第10类,依此类推,每一个分类器中区分当前类其余剩下的类。
最后再根据多数投票的原则或距离远近等其他方向实现最终分类。总结:多分类的问题可以转化成多个二分类问题进行处理。