1. 什么是支持向量机(SVM)?
支持向量机(Support Vector Machine,SVM)是一种分类算法,也可用于回归问题。它的核心思想是找到一个超平面,能够将不同类别的数据集分隔开来,并且能够使得分类边界到最近的数据点距离最大。
SVM的基本思想是将数据转化到高维空间,再寻求一个最优超平面使得这些数据得到最好的线性划分。
SVM在分类问题中的优化目标是:在所有可分的数据中,寻找距离分类超平面最近的数据点(距离叫做“间隔”),使得这些点的“间隔”最大化。这些最近点叫做“支持向量点”,因此SVM的名称就来自于此。
2. SVM 如何工作?
2.1 线性分类
在线性分类问题中,支持向量机会寻找一条直线将两种分类分开。这称之为二分类问题。在实际应用中,支持向量机会构建一个能够将数据点分开的一条线。例如,我们可以使用鸢尾花数据集来演示这个问题。
import seaborn as sns
iris = sns.load_dataset('iris')
import matplotlib.pyplot as plt
sns.scatterplot('sepal_length', 'sepal_width', hue='species', data=iris)
plt.show()
以上代码可以获得一个鸢尾花数据集的图表。
现在我们需要找到一条直线来将图中的三种鸢尾花分离开来。我们需要使用支持向量机算法来求得这条直线。
from sklearn.svm import SVC
X = iris[['sepal_length', 'sepal_width']]
y = iris['species']
svc = SVC(kernel='linear', C=1)
svc.fit(X, y)
# 绘制决策边界
import numpy as np
import matplotlib.pyplot as plt
plt.scatter(X['sepal_length'], X['sepal_width'], c=y, s=50, cmap='autumn')
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()
# 创建网格来评估模型
xx = np.linspace(xlim[0], xlim[1], 30)
yy = np.linspace(ylim[0], ylim[1], 30)
YY, XX = np.meshgrid(yy, xx)
xy = np.vstack([XX.ravel(), YY.ravel()]).T
Z = svc.decision_function(xy).reshape(XX.shape)
# 绘制决策边界和间隔
ax.contour(XX, YY, Z, colors='k', levels=[-1, 0, 1], alpha=0.5,
linestyles=['--', '-', '--'])
ax.scatter(svc.support_vectors_[:, 0], svc.support_vectors_[:, 1], s=100,
linewidth=1, facecolors='none', edgecolors='k')
plt.show()
以上代码可以获得一个使用支持向量机分类的鸢尾花图表。
我们可以看到使用SVM算法得出了一个好的分界线,并且最大化了分类间隔。
2.2 非线性分类
SVM算法不仅仅可以用于线性分类,还可以用于非线性分类。
举个例子,我们来看看这个数据集。
from sklearn.datasets import make_circles
X, y = make_circles(100, factor=.1, noise=.1)
plt.scatter(X[:,0], X[:,1], c=y, s=50, cmap='autumn')
plt.show()
以上代码可以获得一个使用make_circles函数生成的数据集图表。
这个数据集不是线性可分的,但是我们可以在高维空间中将其转换为线性可分的。下面的代码使用SVM算法在高维空间中找到了一个球形的分界线。
from mpl_toolkits import mplot3d
r = np.exp(-(X ** 2).sum(1))
from sklearn.svm import SVC
clf = SVC(kernel='linear')
clf.fit(X, y)
fig = plt.figure()
ax = plt.subplot(111, projection='3d')
ax.scatter3D(X[:, 0], X[:, 1], r, c=y, s=50, cmap='autumn')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
ax.view_init(elev=30, azim=30)
# 绘制分界线
def plot_3D(elev=30, azim=30, X=X, y=y):
ax.view_init(elev=elev, azim=azim)
plt.scatter(X[:, 0], X[:, 1], r, c=y, s=50, cmap='autumn', edgecolors='k')
plt.xlabel('x')
plt.ylabel('y')
plt.show()
plot_3D()
以上代码可以获得一个高维空间中的分界线。
3. SVM 与其他算法的比较
我们现在来看看SVM算法与其他常见算法的比较。
3.1 SVM 与逻辑回归
与逻辑回归(Logistic Regression,LR)算法相比,SVM算法在非线性分类中更为优秀。但是在小型线性分类问题中,逻辑回归算法更快,所以在实际应用中需要根据具体情况选择。
3.2 SVM 与决策树
SVM算法的最大优点在于它可以处理高维数据,并且在处理高维数据时能够做到非常高的准确性。但是与决策树算法相比,SVM算法会更耗时。
因此,在处理高维数据时使用SVM算法是最好的选择,而对于较小的数据集,使用决策树算法更为合适。
4. 总结
支持向量机是一种分类算法,在分类问题中的优化目标是最大化分类边界到最近数据点的距离。支持向量机不仅仅适用于线性分类,还可以处理非线性分类。在处理高维数据时,SVM算法的准确性非常高,并且比决策树算法更适合处理这种情况。