Машинное обучение: SVM

машинное обучение
Машинное обучение: SVM

Введение

支持向量机(support vector machines,SVM)是一种二分类模型,
它将实例的特征向量映射为空间中的一些点,
SVM 的目的就是想要画出一条线(或者是超平面,到底是直线还是超平面,取决于空间是几维的),
以 “最好地” 区分这两类点,以至如果以后有了新的点,这条线(超平面)也能做出很好的分类。
SVM 适合中小型数据样本、非线性、高维的分类问题。

我们的目的是找到分割超平面,只要计算出来w和b这2个参数,就可以得到分割超平面的表达式。
分割超平面的位置是由支持向量决定的,
而哪些是支持向量又是间隔决定的。
也就是说能得到最大间隔的点就是支持向量,
有了支持向量,那么分割超平面的位置也就确定了。

основные понятия svm

将实例的特征向量(以二维为例)映射为空间中的一些点,如下图的实心点和空心点,它们属于不同的两类。
SVM 的目的就是想要画出一条线(因为这里是二维平面),以“最好地”区分这两类点,以至如果以后有了新的点,这条线也能做出很好的分类。

image.png

Q1:能够画出多少条线对样本点进行区分?
答:线是有无数条可以画的,区别就在于效果好不好,每条线都可以叫做一个划分超平面。
   比如上面的绿线就不好,蓝线还凑合,红线看起来就比较好。
   我们所希望找到的这条效果最好的线就是具有 “最大间隔的划分超平面”。

Q2:为什么要叫作“超平面”呢?
答:因为样本的特征很可能是高维的,此时样本空间的划分就不是一条线了。
   即使是在二维中,为了统一,也称之为分割超平面。

Q3:画线的标准是什么?/ 什么才叫这条线的效果好?/ 哪里好?
答:SVM 将会寻找可以区分两个类别并且能使间隔(margin)最大的分割超平面。
   比较好的分割超平面,样本局部扰动时对它的影响最小、产生的分类结果最鲁棒、
   对未见示例的泛化能力最强。

Q4:间隔(margin)是什么?
答:对于任意一个分割超平面,其两侧数据点都距离它有一个最小距离(垂直距离),
   这两个最小距离的和就是间隔。margin = margin1 + margin2
   比如下图中两条虚线之间的距离就是margin,虚线是由距离中央实线最近的两个点所确定出来的,
   也就是由支持向量决定。
   
   但此时 margin 比较小,如果用第二种方式画,margin 明显变大也更接近我们的目标。

image.png

Q5:为什么要让 margin 尽量大?
答:因为大 margin 犯错的几率比较小,也就是更鲁棒啦,鲁棒性更强,更不容易犯错。

Q6:支持向量是什么?
答:从上图可以看出,虚线上的点到分割超平面的距离都是一样的,
   实际上只有这几个点共同确定了分割超平面的位置,
   因此被称作 “支持向量(support vectors)”,“支持向量机” 也是由此来的。
   也就是说,能决定最佳的分割超平面位置的数据点(向量),就是支持向量。

Q7:如何确定分割超平面
答:为了得到最大的margin,就可以知道哪些数据点是支持向量,
   支持向量决定了分割超平面的位置。

Что линейно различимо против линейно неразличимо

能够用`一条直线`或者`一个平面`对样本点进行分类的属于线性可分(linear separable),
否则为线性不可分(linear inseparable)。
以下3个图都是线性不可区分的:

image.png

image.png

image.png

以下2个图是线性可以区分的: 

image.png

image.png

В случае линейной неразделимости соответствующие векторы набора данных в пространстве не могут быть выделены гиперплоскостью, как с этим быть?

两个步骤来解决:
 <1>利用一个非线性的映射把原数据集中的向量点转化到一个更高维度的空间中(比如下图将二维空间中的点映射到三维空间)
 <2>在这个高维度的空间中找一个线性的超平面来根据线性可分的情况处理

image.png

 比如我想把红点和蓝点变成线性可分的,那么我可以将y = x映射为y = x的平方,这样就线性可分了。
 视觉化演示网址:https://www.youtube.com/watch?v=3liCbRZPrZA

image.png

image.png

что такое функция ядра

核函数就是一种函数,利用数学手段,把数据从低维映射到高维
有:
    线性核函数
    多项式核函数
    高斯核函数
    拉普拉斯核函数
    sigmoid核函数
使用不同的核函数,映射的效果是不同的。

Зачем использовать функцию ядра

所以使用kernel的意义在于:
  1.将向量的维度从低维映射到高维
  2.降低运算复杂度

Особенности алгоритма SVM

训练好的模型的复杂度是由支持向量的个数决定的,而不是由训练数据的维度决定的。
所以SVM不太容易产生over fitting。

SVM训练出来的模型完全依赖于支持向量,即使训练集里面所有非支持向量的点都被去除,重复训练过程,结果仍然会得到完全一样的模型。
一个SVM如果训练得出的支持向量个数比较少,那么SVM训练出的模型比较容易被泛化。
也就是说,支持向量的个数越多,鲁棒性越强,泛化能力越好。

Суммировать

在低维度不能线性可分,那就映射到高维空间,然后再计算分割超平面进行线性可分。