支持向量机在进行决策的时候,所选取的决策边界需要满足一个条件,也就是距离两个分类中最近点的距离是最长的。也可以理解为我们用支持向量机进行分类的时候,要做的就是将能够区分不同类别的数据的决策边界距离最近的点的距离最大化
这么说可能比较难理解,首先介绍一下在支持向量机中求解点到平面的距离,这里可以阅读一下高中的立体几何加深理解哦,但是不同的是维度不仅限于高中的二维平面,有兴趣的读者可以翻阅一下高中的数学课本加深一下理解,下面用几个图来加强一下理解
,
这个平面可以理解为你所要求的决策边界,求解图中x点到平面的距离,我们要借助平面的法向量,也就是图中的W向量
可以知道,平面的方程如下:
点x到平面的距离
在这里首先讲述了在支持向量机中如何求解点到平面的距离问题。
利用支持向量机解决一个简单分类问题的时候,借助于上面那个图像来理解。在这个平面上方与下方分别存在着两种不同的数据类别,可以肯定的是在这两个数据类别之中肯定各存在一个点,分别是在这两个数据类别中距离这个平面最近的点。
本文简单介绍一下利用支持向量机解决简单的线性分类问题,也就是用一条直线将两种不同的数据类型分离开,使得这条直线到两个分类数据点中最近的距离最长。根据上面讲的内容,此时决策边界换成了一条直线,而不是一个平面。
首先需要解释一点,在决策边界方程中W与X均是向量,向量中元素的个数取决于你所定义的特征个数,也可以理解几个维度,因为本文中只用到了线性分类只有两个特征分量,二维空间,所以W与X在这个方程中都只有两个元素。
下面的程序实现了一个简单的二分类问题,并将离决策边界最近的点用不同的颜色标记出来了,同时还用两条虚线用来体现向量机实现了最近的点离边界的距离最大化。下面是实现的程序:
import matplotlib.pyplot as plt
import numpy as np
from sklearn.svm import SVC
def plot_svc_decision_boundary(clf, xmin, xmax, sv=True):
w = clf.coef_
print(w)
b = clf.intercept_
print(b)
x0 = np.linspace(xmin, xmax, 200)
decision_boundary = -w[0][0]/w[0][1]*x0 - b/w[0][1]
margin = 1/w[0][1]
gutter_up = decision_boundary + margin
gutter_down = decision_boundary - margin
if sv:
svs = clf.support_vectors_
plt.scatter(svs[:, 0], svs[:, 1], s=180, facecolors='#FFAAAA')
plt.plot(x0, decision_boundary, 'k-', linewidth=2)
plt.plot(x0, gutter_up, 'k--', linewidth=2)
plt.plot(x0, gutter_down, 'k--', linewidth=2)
plt.show()
X = np.array([[-1.0, -1.0], [-1.5, -1.5], [-5, -5],[-4, -4], [-2.0, -1.0], [1.0, 1.0], [2.0, 1.0], [3.0, 2.0], [1.0, 2.0], [4.0, 3.0], [3.0, 3.0]])
y = [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2]# X数据对应的标签值
x0 = [X[0][0], X[1][0], X[2][0], X[3][0], X[4][0], X[5][0], X[6][0], X[7][0], X[8][0], X[9][0], X[10][0]]
y0 = [X[0][1], X[1][1], X[2][1], X[3][1], X[4][1], X[5][1], X[6][1], X[7][1], X[8][1], X[9][1], X[10][1]]
x1 = [X[0][0], X[1][0], X[2][0], X[3][0], X[4][0]]
y1 = [X[0][1], X[1][1], X[2][1], X[3][1], X[4][1]]
plt.figure(figsize=(7, 5))
plt.scatter(x1, y1, s=70, marker='$\clubsuit$')
x2 = [X[5][0], X[6][0], X[7][0], X[8][0], X[9][0], X[10][0]]
y2 = [X[5][1], X[6][1], X[7][1], X[8][1], X[9][1], X[10][1]]
y3 = [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5]
y4 = [-0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5]
plt.scatter(x2, y2, s=70, marker='^')
plt.plot(x0, y3)
plt.plot(x0, y4)
clf = SVC(kernel='linear', C=float('inf'))
clf.fit(X, y)
plot_svc_decision_boundary(clf, -5, 5)
plt.show()
print(clf.predict([[3, 2]]))
这是实现的效果图:
同时还有两个不同颜色的线,这个可以理解为传统的分类方法实现的决策直线。
最后一句命令print(clf.predict([[3, 2]]))实现了对所给数据进行预测的结果值,结果值是属于所定义的标签范围中。