支持向量机

文章目录

  • 1. 支持向量机简介
  • 2. 支持向量机原理
    • 2.1 线性可分支持向量机
      • 2.1.1 函数间隔
      • 2.1.2 几何间隔
      • 2.1.3 算法:最大间隔法(对上面的整个过程进行一个总结)
      • 2.1.4 支持向量
    • 2.2 线性支持向量机
    • 2.3 非线性支持向量机与核函数
  • 3. 支持向量机特点
  • 4. 支持向量机的Python应用
  • 5. 源码仓库地址

1. 支持向量机简介

支持向量机(Support Vector Machine, SVM)是一类按监督学习(supervised learning)方式对数据进行二元分类的广义线性分类器(generalized linear classifier),其决策边界是对学习样本求解的最大边距超平面。对于线性可分两类数据,支持向量机就是条直线(对于高维数据点就是一个超平面), 两类数据点中的的分割线有无数条,SVM就是这无数条中最完美的一条,怎么样才算最完美呢?就是这条线距离两类数据点越远,则当有新的数据点的时候我们使用这条线将其分类的结果也就越可信。

我们需要先找到数据点中距离分割超平面距离最近的点(即找最小),然后尽量使得距离超平面最近的点的距离的绝对值尽量的大(即求最大)。

支持向量机_第1张图片

这里的数据点到超平面的距离就是间隔(margin),当间隔越大,我们这条线(分类器)也就越健壮。那些距离分割平面最近的点就是支持向量(Support Vectors)。

2. 支持向量机原理

支持向量机是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器,核技巧使它成为实质上的非线性分类器。支持向量机一般可分为3类:线性可分支持向量机、线性支持向量机和非线性支持向量机

2.1 线性可分支持向量机

线性可分支持向量机得到一个分离超平面wx+b=0可以将实例分成不同的类,它由法向量w和截距b决定。

对于线性可分的数据,可能有无数个平面能降正负类分开,线性可分支持向量机利用硬间隔最大化求最优分离超平面,这时候解是唯一的。

假设超平面为wx+b=0,对于一个点,wx+b的符号与类标记y的符号是否一致能够表示分类是否正确,点距离超平面的远近∣wx+b∣可以表示分类预测的确信程度,所以,可用y(wx+b)表示分类的正确性与确信度,这也就是函数间隔。

2.1.1 函数间隔

对于给定的训练数据集T和超平面(w,b),定义超平面(w,b)关于样本点的函数间隔为:

在这里插入图片描述

定义超平面(w,b)关于数据集T的函数间隔为:

在这里插入图片描述

然而,仅仅有函数间隔还不够,只要成比例的改变w和b,虽然超平面没有改变,函数间隔却变为原来的两倍,因此要对超平面法向量加一些约束,使间隔是确定的。

2.1.2 几何间隔

对于给定的训练数据集T和超平面(w,b),定义超平面(w,b)关于样本点的几何间隔为:

在这里插入图片描述

定义超平面(w,b)关于数据集T的几何间隔为:

在这里插入图片描述

注意:

(1)几何间隔与函数间隔的关系:

在这里插入图片描述

(2)二者都是有符号的,以几何间隔为例,类标记一般取+1和-1,若样本在法向量正的一侧,距离为在这里插入图片描述
,若样本在法向量负的一侧,距离为在这里插入图片描述

因此,找最大间隔的超平面,直观上也就是以最大的确信度进行分类。可以将这个问题表示为下面的约束优化问题:

支持向量机_第2张图片

接下来就是一步步等价变形,首先目标函数中的γ根据几何间隔和函数间隔的关系可以改成在这里插入图片描述
,约束条件的两边同时乘上||w||,从而变成:

在这里插入图片描述

因为在这里插入图片描述

的取值不影响最优化问题的解,可以取在这里插入图片描述
=1,同时最大化在这里插入图片描述
和最小化在这里插入图片描述
是等价的,从而变成:

在这里插入图片描述

这是一个凸二次规划问题。

2.1.3 算法:最大间隔法(对上面的整个过程进行一个总结)

在这里插入图片描述

(1)构造并求解约束最优化问题

支持向量机_第3张图片

(2)由此得到

在这里插入图片描述

2.1.4 支持向量

训练集中与分离超平面距离最近的样本点的实例称为支持向量,即下图中虚线上的点,也就是使约束条件式等号成立的点,即yi(wxi+b)-1=0。

H1和H2叫间隔边界,二者之间的距离成为间隔,间隔依赖于法向量w,等于在这里插入图片描述

支持向量机_第4张图片

2.2 线性支持向量机

上面【线性可分支持向量机】所设定的【数据集线性可分】的条件太过理想,实际上,大部分的数据达不到的。那么,怎么将其扩展到非线性可分的问题呢?——把原来的硬性条件放宽,改硬为软。

线性不可分意味着某些样本点(xi,yi)不能满足函数间隔大于等于1的约束条件,所以对每个样本点引入一个松弛变量ξi≥0,使函数间隔加上松弛变量大于等于1。约束条件变为:

在这里插入图片描述

同时,对每个松弛变量ξi要支付一个代价,目标函数变为:

在这里插入图片描述

此处,C是惩罚参数,C值大时对误分类的惩罚增大;C值小时对误分类的惩罚减小。目标函数有两层含义:
(1)在这里插入图片描述
尽量小,即间隔尽量大
(2)误分类点的个数尽量小,C是调和二者之间的系数

综上,线性不可分的线性支持向量机的学习问题:

在这里插入图片描述

2.3 非线性支持向量机与核函数

核技巧:通过一个非线性变换将输入空间对应于一个特征空间,使得在输入空间中的超曲面模型对应于特征空间中的超平面模型。

常用核函数有:线性核函数、多项式核函数、高斯核函数等。
(1)线性核函数,最基本的核函数,平面上的直线,三维的面,多维的超平面,可以使用对偶svm利用二次规划库直接计算。这是我们第一个需要考虑的,简单有效,但是如果是线性不可分的训练集则无法使用。
(2)多项式核函数,优点是阶数Q可以灵活设置;缺点是当Q很大时,K的数值范围波动很大,而且参数个数较多,难以选择合适的值,超平面是多项式的曲面
(3)高斯核函数,优点是边界更加复杂多样,能最准确地区分数据样本,数值计算K值波动较小,而且只有一个参数,容易选择;缺点是由于特征转换到无限维度中,w没有求解出来,而且可能会发生过拟合。

实际上核函数代表的是两个样本x和x’,特征变换后的相似性即内积。

3. 支持向量机特点

优点:
(1)支持向量机算法可以解决小样本情况下的机器学习问题,简化了通常的分类和回归等问题。
(2)由于采用核函数方法克服了维数灾难和非线性可分的问题,所以向高维空间映射时没有增加计算的复杂性。换句话说,由于支持向量计算法的最终决策函数只由少数的支持向量所确定,所以计算的复杂性取决于支持向量的数目,而不是样本空间的维数。
(3)支持向量机算法利用松弛变量可以允许一些点到分类平面的距离不满足原先要求,从而避免这些点对模型学习的影响。

缺点:
(1)支持向量机算法对大规模训练样本难以实施。这是因为支持向量机算法借助二次规划求解支持向量,这其中会涉及m阶矩阵的计算,所以矩阵阶数很大时将耗费大量的机器内存和运算时间。
(2)经典的支持向量机算法只给出了二分类的算法,而在数据挖掘的实际应用中,一般要解决多分类问题,但支持向量机对于多分类问题解决效果并不理想。
(3)SVM算法效果与核函数的选择关系很大,往往需要尝试多种核函数,即使选择了效果比较好的高斯核函数,也要调参选择恰当的γ参数。另一方面就是现在常用的SVM理论都是使用固定惩罚系数C,但正负样本的两种错误造成的损失是不一样的。

4. 支持向量机的Python应用

sklearn中对于支持向量机提供了很多模型:LinearSVC, LinearSVR, NuSVC, NuSVR, SVC, SVR。

下面以核函数为linear的SVM支持向量机为例,测试代码如下:

#导入numpy
import numpy as np
#导入画图工具
import matplotlib.pyplot as plt
#导入支持向量机svm
from sklearn import svm
#导入数据集生成工具
from sklearn.datasets import make_blobs
 
#先创建50个数据点,让他们分为两类
X,y = make_blobs(n_samples=50,centers=2,random_state=6)
#创建一个线性内核的支持向量机模型
clf = svm.SVC(kernel = 'linear',C=1000)
clf.fit(X,y)
#把数据点画出来
plt.scatter(X[:, 0],X[:, 1],c=y,s=30,cmap=plt.cm.Paired)
 
#建立图像坐标
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()
#生成两个等差数列
xx = np.linspace(xlim[0],xlim[1],30)
yy = np.linspace(ylim[0],ylim[1],30)
YY,XX = np.meshgrid(yy,xx)
xy = np.vstack([XX.ravel(),YY.ravel()]).T
Z = clf.decision_function(xy).reshape(XX.shape)
 
#把分类的决定边界画出来
ax.contour(XX,YY,Z,colors='k',levels=[-1,0,1],alpha=0.5,linestyles=['--','-','--'])
ax.scatter(clf.support_vectors_[:, 0],clf.support_vectors_[:, 1],s=100,linewidth=1,facecolors='none')
plt.show()

效果如下:

支持向量机_第5张图片

5. 源码仓库地址

图像处理、机器学习的常用算法汇总

你可能感兴趣的:(机器学习,支持向量机,机器学习,人工智能,python)