在python中使用sklearn.svm模块进行非线性分类
发布时间:2023-12-15 21:59:07
在Python中,使用scikit-learn库的SVM模块可以进行非线性分类。支持向量机(SVM)是一种分类算法,可以根据数据的特征将其划分为不同的类别。SVM可以处理非线性分类问题,通过使用核函数将数据映射到高维空间,从而使得数据在新的空间中线性可分。下面将介绍如何在Python中使用sklearn.svm模块进行非线性分类,并通过一个示例进行演示。
首先,需要导入必要的库和模块:
import numpy as np from sklearn import svm from sklearn.datasets import make_moons import matplotlib.pyplot as plt
接下来,我们使用make_moons函数创建一个非线性分类问题的示例数据集。make_moons函数可以生成两个半月形状的数据集,其中有一些噪音点。
X, y = make_moons(n_samples=100, noise=0.15)
然后,我们使用散点图将数据可视化,其中蓝色表示类别0,红色表示类别1。
plt.scatter(X[:, 0], X[:, 1], c=y) plt.show()
接下来,我们使用支持向量机模型进行非线性分类。在sklearn的SVM模块中,SVC类可以用于实现SVM分类器,通过设置kernel参数为某个核函数,可以实现非线性分类。这里我们选择使用高斯径向基函数(RBF)作为核函数。
model = svm.SVC(kernel='rbf', gamma=10) model.fit(X, y)
训练完成后,我们可以利用训练好的模型进行预测。
y_pred = model.predict(X)
为了可视化分类效果,我们可以绘制决策边界和支持向量。
# 生成一个网格,用于绘制决策边界 xx, yy = np.meshgrid(np.linspace(-1.5, 2.5, 100), np.linspace(-1, 1.5, 100)) Z = model.decision_function(np.c_[xx.ravel(), yy.ravel()]) Z = Z.reshape(xx.shape) # 绘制决策边界和支持向量 plt.contourf(xx, yy, Z, levels=np.linspace(Z.min(), 0, 7), cmap=plt.cm.PuBu) plt.contour(xx, yy, Z, levels=[0], linewidths=2, colors='darkred') plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired, edgecolors='k') plt.scatter(model.support_vectors_[:, 0], model.support_vectors_[:, 1], facecolors='none', edgecolors='k') plt.show()
上述代码首先生成一个网格用于绘制决策边界,然后使用decision_function函数计算每个网格点到决策边界的距离,并根据距离绘制决策边界,同时使用散点图将数据集和支持向量绘制出来。
最后,我们可以通过比较预测结果和实际标签来评估分类的准确性。
accuracy = np.mean(y_pred == y)
print("Accuracy:", accuracy)
以上就是使用sklearn.svm模块进行非线性分类的示例。通过使用支持向量机模型和合适的核函数,我们可以有效地应对非线性分类问题。除了高斯径向基函数(RBF),scikit-learn库还提供了其他常用的核函数,如多项式核函数、线性核函数等,可以根据具体问题的特征选择合适的核函数来提高分类效果。
