支持向量机(SVM)是一种广泛使用的监督学习算法,主要用于分类问题。它通过在特征空间中寻找一个最优的决策边界来区分不同类别的数据点。这个决策边界被称为最大间隔超平面,它能够最大化两个类别之间的间隔。SVM的一个关键特性是它可以使用不同的核函数来处理非线性可分的数据。
在本文中,将探讨如何使用Python的scikit-learn库来实现一个简单的SVM分类器,并使用自定义核函数来处理Iris数据集中的数据。Iris数据集是一个经典的多类分类问题,包含了150个样本,每个样本有四个特征,分别对应于鸢尾花的萼片长度、萼片宽度、花瓣长度和花瓣宽度。
首先,需要导入必要的库。matplotlib用于数据可视化,numpy用于数值计算,而scikit-learn则提供了SVM的实现和数据集。
import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, svm
from sklearn.inspection import DecisionBoundaryDisplay
接下来,加载Iris数据集,并只取前两个特征以简化问题。然后,定义一个自定义核函数,该函数将输入的特征向量进行线性变换,并计算变换后的特征向量与目标向量的点积。这个自定义核函数将用于SVM分类器。
iris = datasets.load_iris()
X = iris.data[:, :2] # 只取前两个特征
Y = iris.target
def my_kernel(X, Y):
M = np.array([[2, 0], [0, 1.0]])
return np.dot(np.dot(X, M), Y.T)
设置一个较小的步长h来创建一个网格,这个网格将用于绘制决策边界。然后,创建一个SVM分类器实例,并使用自定义核函数来拟合数据。
h = 0.02 # 网格步长
clf = svm.SVC(kernel=my_kernel)
clf.fit(X, Y)
ax = plt.gca()
DecisionBoundaryDisplay.from_estimator(clf, X, cmap=plt.cm.Paired, ax=ax, response_method="predict", plot_method="pcolormesh", shading="auto")
最后,绘制训练点,并设置图表的标题和轴。通过这种方式,可以直观地看到SVM分类器是如何使用自定义核函数来区分不同类别的数据点的。
plt.scatter(X[:, 0], X[:, 1], c=Y, cmap=plt.cm.Paired, edgecolors='k')
plt.title("使用自定义核函数的三类支持向量机分类")
plt.axis("tight")
plt.show()
整个脚本的运行时间非常短,仅为0.093秒。这表明使用SVM进行分类是非常高效的。此外,还可以通过改变核函数或调整其他参数来进一步优化分类器的性能。