【机器学习应用】【Python】支持向量机——SVM
线性模型在分类问题上的应用,可看作用一条线或一个超平面在二维或三维空间将数据类别区分开,存在局限性。**支持向量机(support vector machine)**是更为复杂的模型,可解决线性或超平面无法解决的分类问题(线性不可分),应用于更高维度的数据。
理解支持向量机
支持向量
在分类问题中,线性模型的决策分界线即在数据之间的一条线,但这条线可以在很多位置。
如何确定分界线的最佳位置?就去找两个类别最边缘的数据点,这两种边缘点的的切线就形成了一个分类间隔。那么确定分界线的位置也就是找到分类间隔的中线。
这个最边缘的数据点组合,也就是我们说的支持向量(support vector).
硬间隔不允许分类间隔间存在数据点;
软间隔允许分类间隔中存在数据点。
总结一下,其实我们是先找到了两个类别距离最小的数据点,确定了分类间隔,才确定了分界线的位置,也可以说这是寻找一个全局最小值的过程。
非线性支持向量机 (non-linear SVM)
但在实际应用中,更多的是线性不可分的问题,假设对于一组二维数据,线性模型的分类决策分界线如下图:
一条线无法将数据类别区分,而数据也只有两个特征,在此情况下,我们可以增加一个新的特征,转化为三维数据,试看能否用平面区分数据。
from sklearn.datasets import make_blobs
import numpy as np
X, y = make_blobs(centers=4, random_state=0)
y = y%2 # rescale class value to 0 and 1
X_new = np.hstack([X, X[:,1:]**2])
lin_svm_3d = LinearSVC().fit(X_new, y)
coef, intercept = lin_svm_3d.coef_.ravel(), lin_svm_3d.intercept_.ravel()
# plot decision boundary plane
...
在三维空间中我们就找到了可以划分数据的平面。
小结:在原数据中增加非线性特征