在线性支持向量机(LinearSVC)中,与基于LIBSVM的SVC不同,它不直接提供支持向量。本例展示了如何在LinearSVC中获取支持向量。支持向量是机器学习中支持向量机(SVM)算法的核心概念,它们是定义决策边界并影响模型预测的关键数据点。
首先,使用make_blobs
函数生成一组样本数据,这些数据将用于训练LinearSVC模型。接着,通过调整正则化参数C的值来观察不同C值对支持向量的影响。C值较小时,模型对误分类的惩罚较小,可能会导致更多的数据点成为支持向量;而C值较大时,模型对误分类的惩罚增加,支持向量的数量可能会减少。
在下面的代码示例中,首先导入了必要的库,包括matplotlib用于绘图,numpy用于数学运算,以及sklearn中的相关模块用于数据生成和模型训练。然后,生成了40个样本点,分为两个类别,并使用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
# 生成样本数据
X, y = make_blobs(n_samples=40, centers=2, random_state=0)
# 绘制图形
plt.figure(figsize=(10, 5))
for i, C in enumerate([1, 100]):
# 使用"hinge"损失函数
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]
# 绘制子图
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()
在上述代码中,首先创建了一个图形窗口,并为两个不同的C值绘制了子图。在每个子图中,使用不同的颜色和标记来区分不同的类别,并使用等高线来表示决策边界。支持向量被特别标记出来,以便可以清楚地看到它们在数据集中的位置。
通过调整C值,可以观察到支持向量的数量和位置如何随着正则化强度的变化而变化。这种可视化方法有助于理解SVM模型的工作原理,以及支持向量在定义决策边界中的作用。