线性支持向量机(LinearSVC)示例

线性支持向量机(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模块来生成模拟数据。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485