帮我用鸢尾花(Iris)数据集中的两个特征在python环境下实现线性可分SVM和线性SVM;三个特征实现非线性SVM,计算分类结果的准确率并可视化数据点和分类边界
时间: 2024-10-06 20:05:40 浏览: 40
SVM对鸢尾花(Iris)数据集进行分类的Python代码
在Python环境中,我们可以使用scikit-learn库来实现鸢尾花数据集(Iris dataset)中的线性和非线性支持向量机(SVM)。首先,我们需要加载数据、划分训练集和测试集,并进行预处理。
**线性可分SVM(Linear SVM)示例:**
```python
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
import matplotlib.pyplot as plt
# 加载鸢尾花数据集
iris = datasets.load_iris()
X = iris.data[:, :2] # 取前两个特征
y = iris.target
# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.3, random_state=42)
# 线性SVM模型
linear_svm = SVC(kernel='linear')
linear_svm.fit(X_train, y_train)
predictions = linear_svm.predict(X_test)
# 计算准确率
accuracy_linear = (predictions == y_test).mean() * 100
print(f"线性SVM分类准确率为:{accuracy_linear:.2f}%")
# 可视化
plt.scatter(X_train[y_train==0, 0], X_train[y_train==0, 1], color='red', label='Setosa')
plt.scatter(X_train[y_train==1, 0], X_train[y_train==1, 1], color='blue', label='Versicolor')
plt.scatter(X_train[y_train==2, 0], X_train[y_train==2, 1], color='green', label='Virginica')
plt.plot(X_train[:, 0], X_train[:, 1], 'k-', lw=3, alpha=0.8) # 分类边界的预测线
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.legend(loc="best")
plt.show()
```
**非线性SVM(Non-linear SVM)示例(例如用RBF核):**
```python
# 非线性SVM(RBF kernel)
nonlinear_svm = SVC(kernel='rbf')
nonlinear_svm.fit(X_train, y_train)
predictions_nonlinear = nonlinear_svm.predict(X_test)
# 计算准确率
accuracy_nonlinear = (predictions_nonlinear == y_test).mean() * 100
print(f"非线性SVM分类准确率为:{accuracy_nonlinear:.2f}%")
# 可视化同上,只需更改线性边界的绘制方式
```
**相关问题--:**
1. SVM的`kernel='linear'`和`kernel='rbf'`分别代表什么?
2. 还有哪些常用的核函数可以在SVM中选择?
3. 怎样优化SVM中的正则化参数C?
阅读全文