线性支持向量机(LinearSVC)是一种用于分类的机器学习算法。它通过寻找一个超平面来最大化不同类别之间的间隔。在某些情况下,可能需要获取这些支持向量,即那些位于分类边界上的样本点。本文将介绍如何在使用LinearSVC时获取这些支持向量。
首先,需要导入必要的库。将使用matplotlib来绘制图形,numpy来处理数学运算,以及sklearn库中的datasets和svm模块来生成数据和创建LinearSVC模型。
import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import make_blobs
from sklearn.inspection import DecisionBoundaryDisplay
from sklearn.svm import LinearSVC
接下来,将生成一些模拟数据。将使用make_blobs函数来创建两个类别的数据点。
X, y = make_blobs(n_samples=40, centers=2, random_state=0)
现在,将创建LinearSVC模型,并使用不同的正则化参数C来训练模型。正则化参数C控制着模型的复杂度,较小的C值会导致更平滑的决策边界,而较大的C值则会使模型更倾向于拟合训练数据。
plt.figure(figsize=(10, 5))
for i, C in enumerate([1, 100]):
clf = LinearSVC(C=C, loss="hinge", random_state=42).fit(X, y)
decision_function = clf.decision_function(X)
support_vector_indices = np.where(np.abs(decision_function) <= 1 + 1e-15)[0]
support_vectors = X[support_vector_indices]
在上述代码中,首先训练了LinearSVC模型,然后使用decision_function方法来获取决策函数的值。支持向量是那些决策函数值的绝对值小于或等于1的样本点。
接下来,将使用matplotlib来绘制分类边界和支持向量。将为每个正则化参数C绘制一个子图。
plt.subplot(1, 2, i + 1)
plt.scatter(X[:, 0], X[:, 1], c=y, s=30, cmap=plt.cm.Paired)
ax = plt.gca()
DecisionBoundaryDisplay.from_estimator(clf, X, ax=ax, grid_resolution=50, plot_method="contour", colors="k", levels=[-1, 0, 1], alpha=0.5, linestyles=["--", "-", "--"])
plt.scatter(support_vectors[:, 0], support_vectors[:, 1], s=100, linewidth=1, facecolors="none", edgecolors="k")
plt.title("C=" + str(C))
plt.tight_layout()
plt.show()
在这段代码中,首先绘制了数据点,并根据它们的类别为它们着色。然后,使用DecisionBoundaryDisplay.from_estimator方法来绘制分类边界。最后,绘制了支持向量,并将它们标记为较大的点,以便与普通数据点区分开来。
通过这种方式,可以直观地看到不同正则化参数C对分类边界和支持向量的影响。较小的C值会导致更平滑的决策边界,而较大的C值则会使模型更倾向于拟合训练数据,从而导致更复杂的决策边界。
总的来说,这个示例展示了如何在使用线性支持向量机时获取支持向量,并可视化分类边界和支持向量。这有助于理解线性支持向量机的工作原理,以及如何通过调整正则化参数C来控制模型的复杂度。
运行上述代码将生成两个子图,分别对应不同的正则化参数C。每个子图中,数据点根据它们的类别着色,分类边界以等高线的形式绘制,支持向量以较大的点标记。通过比较这两个子图,可以直观地看到不同正则化参数C对分类边界和支持向量的影响。
这个示例使用了sklearn库中的LinearSVC类来创建线性支持向量机模型,并使用了matplotlib库来绘制图形。还使用了numpy库来处理数学运算,以及sklearn库中的datasets模块来生成模拟数据。