Iris数据集一共包含150个样本,分为3类,每类50个数据,每个数据包含4个属性:花萼长度,花萼宽度,花瓣长度,花瓣宽度4个属性。选择花萼长度,花萼宽度作为特征,使用支持向量机模型对其中前两个类别的花卉进行线性分类,并绘制了数据散点图和决策边界。修改SVM 模型的参数 C 为0.001,绘制了数据和决策边界。
时间: 2024-04-06 10:32:15 浏览: 81
好的,我来回答你的问题。以下是代码和结果。
首先,我们需要导入所需的库和数据集:
``` python
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm, datasets
# 导入 Iris 数据集
iris = datasets.load_iris()
X = iris.data[:, :2] # 取前两个特征
y = iris.target
```
接下来,我们使用支持向量机模型对其中前两个类别的花卉进行线性分类,并绘制了数据散点图和决策边界:
``` python
# 创建支持向量机模型
C = 1.0 # SVM 正则化参数
svc = svm.SVC(kernel='linear', C=C).fit(X, y)
# 绘制数据散点图和决策边界
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired)
# 设定坐标轴的最大值和最小值
x_min, x_max = X[:, 0].min() - 0.1, X[:, 0].max() + 0.1
y_min, y_max = X[:, 1].min() - 0.1, X[:, 1].max() + 0.1
xx, yy = np.meshgrid(np.linspace(x_min, x_max, 100),
np.linspace(y_min, y_max, 100))
# 绘制决策边界和间隔边界
Z = svc.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contour(xx, yy, Z, colors='k', levels=[-1, 0, 1], alpha=0.5,
linestyles=['--', '-', '--'])
# 绘制支持向量
plt.scatter(svc.support_vectors_[:, 0], svc.support_vectors_[:, 1], s=100,
linewidth=1, facecolors='none', edgecolors='k')
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.show()
```
运行结果如下所示:
![Linear SVM result](https://img-blog.csdnimg.cn/20220204185128568.png)
现在,我们将修改SVM模型的参数C为0.001,并绘制了数据和决策边界:
``` python
# 修改 SVM 模型的参数 C 为 0.001
C = 0.001
svc = svm.SVC(kernel='linear', C=C).fit(X, y)
# 绘制数据散点图和决策边界
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired)
# 设定坐标轴的最大值和最小值
x_min, x_max = X[:, 0].min() - 0.1, X[:, 0].max() + 0.1
y_min, y_max = X[:, 1].min() - 0.1, X[:, 1].max() + 0.1
xx, yy = np.meshgrid(np.linspace(x_min, x_max, 100),
np.linspace(y_min, y_max, 100))
# 绘制决策边界和间隔边界
Z = svc.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contour(xx, yy, Z, colors='k', levels=[-1, 0, 1], alpha=0.5,
linestyles=['--', '-', '--'])
# 绘制支持向量
plt.scatter(svc.support_vectors_[:, 0], svc.support_vectors_[:, 1], s=100,
linewidth=1, facecolors='none', edgecolors='k')
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.show()
```
运行结果如下所示:
![Linear SVM result with C=0.001](https://img-blog.csdnimg.cn/20220204185501131.png)
通过比较两幅图像,我们可以看到,当 C 值较小时,模型的间隔边界更宽,支持向量更少,分类错误的样本更多。
阅读全文