在机器学习领域,支持向量机(SVM)是一种常用的分类算法,它通过在特征空间中寻找一个最优的分隔超平面来区分不同的类别。随机梯度下降(SGD)是一种优化算法,可以用来训练SVM分类器。本文将介绍如何使用Python的scikit-learn库中的SGDClassifier来训练一个线性SVM分类器,并绘制出在两个类别可分数据集中的最大分隔超平面。
首先,需要生成一个包含两个类别的数据集。这里使用scikit-learn库中的make_blobs函数来生成50个可分的点,每个类别的中心点数为2,随机状态设置为0,以确保结果的可重复性。
from sklearn.datasets import make_blobs
X, Y = make_blobs(n_samples=50, centers=2, random_state=0, cluster_std=0.60)
接下来,使用SGDClassifier来训练模型。在初始化SGDClassifier时,指定损失函数为hinge,正则化参数alpha为0.01,最大迭代次数为200。然后,使用fit方法来训练模型。
from sklearn.linear_model import SGDClassifier
clf = SGDClassifier(loss="hinge", alpha=0.01, max_iter=200)
clf.fit(X, Y)
为了可视化分隔超平面,首先创建一个网格,然后计算每个点的决策函数值。接着,使用matplotlib库中的contour函数来绘制分隔超平面,使用scatter函数来绘制数据点。
import numpy as np
import matplotlib.pyplot as plt
xx = np.linspace(-1, 5, 10)
yy = np.linspace(-1, 5, 10)
X1, X2 = np.meshgrid(xx, yy)
Z = np.empty(X1.shape)
for (i, j), val in np.ndenumerate(X1):
x1 = val
x2 = X2[i, j]
p = clf.decision_function([[x1, x2]])
Z[i, j] = p[0]
levels = [-1.0, 0.0, 1.0]
linestyles = ["dashed", "solid", "dashed"]
colors = "k"
plt.contour(X1, X2, Z, levels, colors=colors, linestyles=linestyles)
plt.scatter(X[:, 0], X[:, 1], c=Y, cmap=plt.cm.Paired, edgecolor="black", s=20)
plt.axis("tight")
plt.show()
运行上述代码后,可以得到一个图表,其中显示了数据点和分隔超平面。分隔超平面清晰地将两个类别的数据点分开,展示了线性SVM分类器的有效性。