1.SVM算法特性:
1.1 训练好的模型的算法复杂度是由支持向量的个数决定的,而不是由数据的维度决定的。所以SVM不太容易·产生overfitting。
1.2 SVM训练出来的模型完全依赖于支持向量(Support Vectors),及时训练集里面所有非支持向量的点都被去除,重复训练过程,结果仍然会得到完全一样的模型。
1.3 一个SVM如果训练得出的支持向量的个数比较小,SVM训练得出的模型比较容易被泛化。
2.线性不可分的情况(linearly inseparable case)
2.1 数据集在空间中对应的向量不可被一个超平面区分开
2.2 两个步骤来解决:
2.2.1 利用一个非线性的映射把原始数据集中的向量点转化到一个更高维度的空间中
2.2.2 在这个高维度的空间中找一个线性的超平面来根据线性可分的情况处理
2.2.3 视觉化演示 http://www.maiziedu.com/course/373-3831/
2.3 如何利用非线性映射把原始数据转化到高维中?
2.3.1 例子:
3维输入向量:
转化到6维空间Z中去:
新的决策超平面:
其中W和Z是向量,这个超平面是线性的。解出W和b之后,并且带回原方程:
2.3.2 思考问题:
2.3.2.1 如何选择合理的非线性转化把数据转到高纬度中?
2.3.2.2 如何解决计算内积时算法复杂度非常高的问题?
2.3.3 使用核方法(kernel trick)
3.核方法(kernel trick)
3.1 动机
在线性SVM中转化为最优问题时求解的公式计算都是以内积(dot product)的形式出现的
其中,是把训练集中的向量点转化到高维的非线性映射函数,因为内积的算法复杂度非常大,所以我们利用核函数来取代计算非线性映射函数的内积。
3.2 以下核函数和非线性映射函数的内积等同:
3.3 常用的核函数(kernel functions)
h度多项式核函数(polynomial kernel of degree h):
高斯径向基核函数(Gaussian radial basis function kernel ):
S型核函数(Sigmoid function kernel):
那么问题来了:如何选择使用哪个kernel?(通常没有固定的答案)
1.根据先验知识,比如图像分类,通常使用RBF,文字不使用RBF
2.尝试不同的kernel,根据结果准确度而定
3.4 核函数举例:
假设定义两个向量:x = (x1,x2,x3);y = (y1,y2,y3)
定义方程:f(x) = (x1x1,x1x2,x1x3,x2x1,x2x2,x2x3,x3x1,x3x2,x3x3)
k(x,y) = (<x,y>)^2
假设x = (1,2,3);y = (4,5,6).
f(x) = (1,2,3,2,4,6,3,6,9) f(y) = (16,20,24,20,25,36,24,30,36)
<f(x),f(y)> = 16 + 40 + 72 +40 + 100 + 180 + 72 + 180 + 324 = 1024
k(x,y) = (4 + 10 + 18) ^ 2 = 32 ^ 2 = 1024
同样的结果,使用kernel方法计算容易很多。
4. SVM扩展可解决多个类别分类问题:
对于每个类,有一个当前类和其他类的二类分类器(one-vs-rest)