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

1、SVM是什么

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

1-1 线性可分

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

在二维空间上,两类点被一条直线彻底分开叫作线性可分。函数

严格的数学定义是:优化

1-2 最大间隔超平面

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

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

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

2、 Support Vector & Margin

2.1 定义及思想

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

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

因此咱们能够看到,所谓的支撑向量机,最初就是一个线性分类器,只不过这个线性分类器不只能把样本分对,能够最大化Marginci

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

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

而后咱们去找决策边界的表达式:

3、巧妙的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中则使用了更加巧妙的方法。

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

相关文章
相关标签/搜索