在机器学习领域,支持向量机(SVM)是一种常用的分类算法。它通过寻找一个最优的超平面来区分不同类别的数据点。在某些情况下,可能需要使用自定义的核函数来提高分类的准确性。本文将介绍如何使用Python的scikit-learn库来实现这一过程,并展示如何绘制决策边界和支持向量。
在scikit-learn中,可以通过定义一个自定义核函数来扩展SVM的功能。下面是一个简单的自定义核函数的示例,它将输入数据的前两个特征进行线性组合,以生成一个新的特征空间。
import numpy as np
def my_kernel(X, Y):
M = np.array([[2, 0], [0, 1.0]])
return np.dot(np.dot(X, M), Y.T)
这个核函数通过矩阵乘法将输入数据转换为一个新的特征空间,其中第一个特征被放大,而第二个特征保持不变。这种转换可以帮助SVM更好地区分数据点,尤其是在原始特征空间中线性不可分的情况下。
在定义了自定义核函数之后,可以使用scikit-learn中的SVM类来训练一个分类器。以下是一个使用鸢尾花数据集进行分类的示例。
from sklearn import datasets, svm
from sklearn.inspection import DecisionBoundaryDisplay
import matplotlib.pyplot as plt
iris = datasets.load_iris()
X = iris.data[:, :2] # 只取前两个特征
Y = iris.target
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")
plt.scatter(X[:, 0], X[:, 1], c=Y, cmap=plt.cm.Paired, edgecolors="k")
plt.title("使用自定义核的SVM三类分类")
plt.axis("tight")
plt.show()
在这个示例中,首先加载了鸢尾花数据集,并只取了前两个特征。然后,创建了一个SVM分类器,并使用自定义核函数进行训练。接着,使用DecisionBoundaryDisplay类来绘制决策边界和支持向量。最后,使用matplotlib库来显示分类结果。
通过上述代码,可以得到一个包含决策边界和支持向量的图形,这有助于直观地理解SVM是如何在特征空间中划分不同类别的。在这个图形中,不同的颜色代表不同的类别,而边界线则表示SVM找到的最优超平面。支持向量则被标记在边界附近,它们是SVM进行分类的关键数据点。