05-支持向量机 (SVM) 下
Posted 机器学习算法和人工智能
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了05-支持向量机 (SVM) 下相关的知识,希望对你有一定的参考价值。
综述
支持向量机是一种二分类模型, 基本模型是定义在特征空间上的间隔最大的线性分类器. 间隔最大使得有别于感知机模型. 学习策略是求解凸二次规划问题, 使得间隔最大化. SVM 通常有以下几种情况:
训练数据线性可分->硬间隔支持向量机
训练数据近似线性可分->软间隔支持向量机
训练数据线性不可分->非线性支持向量机(核技巧)
注: 学习都是在特征空间进行, 所以需要将输入空间映射到特征空间
1. SVM算法特性:
训练好的模型的算法复杂度是由支持向量的个数决定的, 而不是由数据的维度决定的. 所以SVM不太容易产生overfitting.
SVM训练出来的模型完全依赖于支持向量(Support Vectors), 即使训练集里面所有非支持向量的点都被去除, 重复训练过程, 结果仍然会得到完全一样的模型.
一个SVM如果训练得出的支持向量个数比较小, SVM训练出的模型比较容易被泛化.
2. 线性不可分(linearly inseparable case)
2.1 数据集在空间中对应的向量不可被一个超平面区分开
2.2 两个步骤来解决:
利用一个非线性的映射把原数据集中的向量点转化到一个更高维度的空间中
在这个高维度的空间中找一个线性的超平面来根据线性可分的情况处理
可视化 SVM (非线性回归)
2.3 如何利用非线性映射把原始数据转化到高维中?
2.3.1 例子 :
1.0 3维输入向量:
2.0 转化到6维空间Z中:
3.0 新的决策超平面(线性): 其中W和Z是向量
4.0 解出W和b之后, 并且带入回原方程:
2.3.2 思考问题:
如何选择合理的非线性转化把数据转到高纬度中?
如何解决计算内积时算法复杂度非常高的问题?
2.3.3 使用核方法(kernel trick)
3. 核方法(kernel trick)
3.1 动机
在线性SVM中转化为最优化问题时求解的公式计算都是以内积(dot product)的形式出现的 . 其中 是把训练集中的向量点转化到高维的非线性映射函数,因为内积的算法复杂度非常大,所以我们利用核函数来取代计算非线性映射函数的内积.
3.1 以下核函数和非线性映射函数的内积等同
3.2 常用的核函数(kernel functions):
h度多项式核函数(polynomial kernel of degree h):
高斯径向基核函数(Gaussian radial basis function kernel):
S型核函数(Sigmoid function kernel):
如何选择使用哪个kernel?
根据先验知识,如图像分类,通常用RBF,文字不用RBF.
尝试不同的kernel,根据结果准确度而定
3.3 核函数举例:
假设定义两个向量: 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)
SVM 的应用-下
实践:人脸识别 (非线性可分)
项目代码及运行结果:
运行结果:
本文项目中所用到的数据集是通过 SKLearn 库中下载得到的, 执行完第一个模块中的代码, 当前路径下会有一个代码产生的文件 : sckit_learn_data.
如有错误, 欢迎大家指出和改正.....
以上是关于05-支持向量机 (SVM) 下的主要内容,如果未能解决你的问题,请参考以下文章