支撑向量机,SVM(Support Vector Machine),其实就是一个线性分类器。算法
首先咱们先来了解下什么是线性可分。dom
在二维空间上,两类点被一条直线彻底分开叫作线性可分。函数
严格的数学定义是:优化
从二维扩展到多维空间中时,将D0 和D1 彻底正确地划分开的 wx+b = 0就成了一个超平面。设计
为了使这个超平面更具鲁棒性,咱们会去找最佳超平面,以最大间隔把两类样本分开的超平面,也称之为最大间隔超平面。3d
两类样本分别分割在该超平面的两侧; 两侧距离超平面最近的样本点到超平面的距离被最大化了。code
将最优决策边界向上&下平移,在遇到第一个点时停下来,这个点被称为支撑向量Support Vector;支撑向量到决策边界的距离是d;这两条平移后的直线的间隔(2d)被称为最大间隔Margin。blog
支撑向量就是支撑着两条平移边界的点,咱们只须要重点研究这几个支撑向量便可,这也是SVM名称的由来;**Margin **就是分界面能够移动的范围,范围越大表示容错能力越强。ip
因此咱们能够看到,所谓的支撑向量机,最初就是一个线性分类器,只不过这个线性分类器不只能把样本分对,能够最大化Margin。ci
到目前为止,咱们就将SVM转换为了一个最优化问题,下面的工做就是求出Margin的数学表达式,即将支撑向量机思想转化为数学问题。
而后咱们去找决策边界的表达式:
以前介绍的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中则使用了更加巧妙的方法。
在低维空间中线性不可能的数据,能够转化成高维度数据,使得数据更具备分析性;而后使用核函数,其在高维空间上的运算等价于低维空间,从而解决了运算量大的问题。