支持向量机(SVM)是一种常用的监督学习算法,用于分类和回归分析。本文将通过鸢尾花数据集(Iris dataset)来演示SVM的工作原理。鸢尾花数据集包含了150个样本,每个样本有4个特征,分别代表鸢尾花萼片和花瓣的长度和宽度。目标是使用SVM对这些样本进行分类。
首先,需要导入必要的库,包括matplotlib用于数据可视化,numpy用于数值计算,以及sklearn中的datasets和svm模块。使用sklearn.datasets中的load_iris()函数来加载鸢尾花数据集。然后,从数据集中提取特征和标签,并对其进行预处理,例如去除某些类别的数据,以及对数据进行随机打乱。
import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, svm
iris = datasets.load_iris()
X = iris.data
y = iris.target
# 只保留类别0和1的数据
X = X[y != 0, :2]
y = y[y != 0]
n_sample = len(X)
np.random.seed(0)
order = np.random.permutation(n_sample)
X = X[order]
y = y[order].astype(float)
# 划分训练集和测试集
X_train = X[:int(0.9 * n_sample)]
y_train = y[:int(0.9 * n_sample)]
X_test = X[int(0.9 * n_sample):]
y_test = y[int(0.9 * n_sample):]
接下来,使用SVM的三种不同核函数(linear、rbf和poly)来训练模型。对于每种核函数,都使用相同的gamma值(10),并绘制出对应的决策边界。决策边界是SVM模型中的一个重要概念,它将数据集分割为不同的类别。在二维空间中,决策边界是一条直线;在更高维空间中,决策边界可能是一个超平面。
# 训练SVM模型并绘制决策边界
for kernel in ("linear", "rbf", "poly"):
clf = svm.SVC(kernel=kernel, gamma=10)
clf.fit(X_train, y_train)
plt.figure()
plt.clf()
plt.scatter(X[:, 0], X[:, 1], c=y, zorder=10, cmap=plt.cm.Paired, edgecolor="k", s=20)
# 圈出测试数据
plt.scatter(X_test[:, 0], X_test[:, 1], s=80, facecolors="none", zorder=10, edgecolor="k")
plt.axis("tight")
x_min, x_max = X[:, 0].min(), X[:, 0].max()
y_min, y_max = X[:, 1].min(), X[:, 1].max()
XX, YY = np.mgrid[x_min:x_max:200j, y_min:y_max:200j]
Z = clf.decision_function(np.c_[XX.ravel(), YY.ravel()])
# 将结果放入颜色图
Z = Z.reshape(XX.shape)
plt.pcolormesh(XX, YY, Z > 0, cmap=plt.cm.Paired)
plt.contour(XX, YY, Z, colors=["k", "k", "k"], linestyles=["--", "-", "--"], levels=[-0.5, 0, 0.5])
plt.title(kernel)
plt.show()
通过上述代码,可以看到不同核函数下的决策边界。在实际应用中,可以根据具体问题选择合适的核函数,以达到最佳的分类效果。此外,还可以通过调整gamma值等参数来优化模型的性能。
总的来说,SVM是一种强大的分类算法,适用于各种不同的数据集和问题。通过选择合适的核函数和参数,可以利用SVM实现高效的数据分类。本文通过鸢尾花数据集的示例,展示了SVM的基本原理和使用方法。希望这些信息对有所帮助。