使用 scikit-learn 中提供的样本生成器 make_blobs、make_classification、make_moons、 make_circles 生成一系列线性或非线性可分的二类别数据;分别将 SVM 中四种核函数(线性核、多项式核、高斯核、S 形核)用于上述四种数据集;通过散点图可视化数据样本,并画出 SVM 模型的决策边界,通过模型评价分类准确率。
时间: 2023-12-19 18:04:26 浏览: 181
使用SVM做分类
好的,下面是使用scikit-learn中提供的样本生成器对四种数据集进行分类实验的示例代码:
首先,我们需要导入必要的库,包括numpy、matplotlib、sklearn等:
``` python
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm, datasets
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
```
接下来,我们可以使用scikit-learn中的四个样本生成器生成线性或非线性可分的二分类数据:
``` python
# 生成数据集
X_blob, y_blob = datasets.make_blobs(n_samples=100, centers=2, random_state=0)
X_class, y_class = datasets.make_classification(n_samples=100, n_features=2, n_redundant=0, n_informative=2, random_state=0, n_clusters_per_class=1)
X_moon, y_moon = datasets.make_moons(n_samples=100, noise=0.1, random_state=0)
X_circle, y_circle = datasets.make_circles(n_samples=100, noise=0.1, factor=0.5, random_state=0)
```
接下来,我们可以定义一个函数,用于训练SVM模型并绘制决策边界和分类结果:
``` python
def plot_svm(kernel, X, y):
# 训练模型
clf = svm.SVC(kernel=kernel)
clf.fit(X, y)
# 绘制决策边界和分类结果
plt.figure(figsize=(10, 8))
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired)
# 绘制决策边界
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02), np.arange(y_min, y_max, 0.02))
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, cmap=plt.cm.Paired, alpha=0.3)
# 设置图像标题
plt.title("Kernel: {}".format(kernel))
# 显示图像
plt.show()
```
最后,我们可以调用上述函数,分别使用四种核函数对四个数据集进行二分类实验,并计算分类精度:
``` python
# 使用四种核函数对四个数据集进行二分类实验
datasets = [(X_blob, y_blob), (X_class, y_class), (X_moon, y_moon), (X_circle, y_circle)]
datasets_names = ["Blobs", "Classification", "Moons", "Circles"]
kernels = ['linear', 'poly', 'rbf', 'sigmoid']
for i in range(4):
print("\nDataset: {}".format(datasets_names[i]))
X, y = datasets[i]
for j in range(4):
plot_svm(kernels[j], X, y)
clf = svm.SVC(kernel=kernels[j])
clf.fit(X, y)
y_pred = clf.predict(X)
acc = accuracy_score(y, y_pred)
print("Kernel: {}, Accuracy: {:.2f}%".format(kernels[j], acc * 100))
```
完整代码如下:
阅读全文