机器学习算法(十)—— SVM支持向量机

这一生的挚爱 提交于 2020-04-30 00:10:03

一、SVM是什么

支撑向量机,SVM(Support Vector Machine),其实就是一个线性分类器。

1-1 线性可分

首先我们先来了解下什么是线性可分。

在二维空间上,两类点被一条直线完全分开叫做线性可分。

严格的数学定义是:

1-2 最大间隔超平面

从二维扩展到多维空间中时,将D0 和D1 完全正确地划分开的 wx+b = 0就成了一个超平面。

为了使这个超平面更具鲁棒性,我们会去找最佳超平面,以最大间隔把两类样本分开的超平面,也称之为最大间隔超平面。

两类样本分别分割在该超平面的两侧; 两侧距离超平面最近的样本点到超平面的距离被最大化了。

二、 Support Vector & Margin

2.1 定义及思想

将最优决策边界向上&下平移,在遇到第一个点时停下来,这个点被称为支撑向量Support Vector;支撑向量到决策边界的距离是d;这两条平移后的直线的间隔(2d)被称为最大间隔Margin

支撑向量就是支撑着两条平移边界的点,我们只需要重点研究这几个支撑向量即可,这也是SVM名称的由来;**Margin **就是分界面可以移动的范围,范围越大表示容错能力越强。

所以我们可以看到,所谓的支撑向量机,最初就是一个线性分类器,只不过这个线性分类器不仅能把样本分对,可以最大化Margin

到目前为止,我们就将SVM转换为了一个最优化问题,下面的工作就是求出Margin的数学表达式,即将支撑向量机思想转化为数学问题。

2.2 转化为最优化问题(核心)

然后我们去找决策边界的表达式:

三、巧妙的Kernel Trick

之前介绍的SVM,本质上就是个线性分类器,保证Margin最大。实际上都是线性SVM,包括Soft Margin解决的也不是线性不可分问题,而是解决在线性可分问题下存在噪点、异常点等问题。那么如何解决一个线性不可分问题呢?

处理非线性数据最典型的思路就是使用多项式的方式:扩充原本数据,制造新的多项式特征。

准备数据: import numpy as np import matplotlib.pyplot as plt from sklearn import datasets

X, y = datasets.make_moons(noise=0.20,random_state=123)

plt.scatter(X[y==0,0], X[y==0,1])
plt.scatter(X[y==1,0], X[y==1,1])
plt.show()

下面使用多项式特征,用SVM算法进行分类:

from sklearn.preprocessing import PolynomialFeatures, StandardScaler
from sklearn.svm import LinearSVC
from sklearn.pipeline import Pipeline

def PolynomialSVC(degree, C=1.0):
	return Pipeline([
		("poly", PolynomialFeatures(degree=degree)),
		("std_scaler", StandardScaler()),
		("linearSVC", LinearSVC(C=C))
	])

poly_svc = PolynomialSVC(degree=3)
poly_svc.fit(X,y)

然后我们使用之前用到的plot_decision_boundary方法绘制决策边界。

通过多项式的方式,让决策边界不再是一条直线了,而是一条曲线。 对于SVM算法来说,可以不使用多项式PolynomialFeatures的方式。而是使用一种巧妙的方法。

可以将数据从原始空间映射到Feature Space中去,就可以解决原本的线性不可分问题。那么如何做映射呢?

其实我们并不用特意地去设计映射(实际上我们也很难在高维空间去设计映射),而是使用固定的几种映射方法即可。这些映射方法就是核函数。

SVM算法作为数据挖掘领域十大经典算法之一,其中设计了很多精妙的思想。在这篇文章中,我们首先回顾了如何使用多项式来解决非线性问题。但在SVM中则使用了更加巧妙的方法。

在低维空间中线性不可能的数据,可以转化成高维度数据,使得数据更具有分析性;然后使用核函数,其在高维空间上的运算等价于低维空间,从而解决了运算量大的问题。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!