欢迎访问宙启技术站
智能推送

在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库还提供了其他常用的核函数,如多项式核函数、线性核函数等,可以根据具体问题的特征选择合适的核函数来提高分类效果。