Python实现支持向量机(Support Vector Machine,SVM)算法


以下是一个包含 支持向量机(SVM)算法实现的完整 Python 代码示例。这个代码实现了 SVM 分类任务,并且使用了 sklearn 库来加载数据集、训练模型以及评估模型的性能。为了便于理解,我会将整个过程合并在一起,包括数据加载、模型训练、预测、评估和可视化。

1. 安装依赖

如果你还没有安装 scikit-learnmatplotlib,可以通过以下命令安装它们:

pip install scikit-learn matplotlib

2. 完整代码示例

# 导入必要的库
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA

# 加载鸢尾花数据集
iris = load_iris()
X = iris.data  # 特征数据
y = iris.target  # 标签数据

# 切分数据集,70%训练,30%测试
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 创建支持向量机分类器
svm_clf = SVC(kernel='linear', random_state=42)

# 训练SVM模型
svm_clf.fit(X_train, y_train)

# 在测试集上做预测
y_pred = svm_clf.predict(X_test)

# 打印预测准确度
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy:.4f}')

# 可视化支持向量机决策边界 (仅使用前两个特征进行可视化)
# 使用PCA将数据降到2D,以便于可视化
pca = PCA(n_components=2)
X_2d = pca.fit_transform(X)

# 切分降维后的数据
X_train_2d, X_test_2d, y_train, y_test = train_test_split(X_2d, y, test_size=0.3, random_state=42)

# 创建并训练 SVM 分类器
svm_clf_2d = SVC(kernel='linear', random_state=42)
svm_clf_2d.fit(X_train_2d, y_train)

# 创建网格来绘制决策边界
import numpy as np
xx, yy = np.meshgrid(np.linspace(X_2d[:, 0].min(), X_2d[:, 0].max(), 100),
                     np.linspace(X_2d[:, 1].min(), X_2d[:, 1].max(), 100))

Z = svm_clf_2d.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)

# 绘制决策边界
plt.figure(figsize=(10, 8))
plt.contourf(xx, yy, Z, alpha=0.8)
plt.scatter(X_2d[:, 0], X_2d[:, 1], c=y, edgecolors='k', marker='o', cmap=plt.cm.Paired, s=60)
plt.title("SVM Decision Boundary (using first two PCA components)")
plt.xlabel("PCA Component 1")
plt.ylabel("PCA Component 2")
plt.colorbar()
plt.show()

3. 代码解释

  1. 数据加载与切分:

    • 使用 load_iris() 加载鸢尾花数据集,其中 X 是特征矩阵,y 是标签。
    • 使用 train_test_split() 将数据集切分为 70% 的训练数据和 30% 的测试数据。
  2. SVM 分类器:

    • 创建一个支持向量机分类器 SVC,并指定核函数为 linear(线性核),可以根据需要调整为 rbf 等其他核函数。
    • 使用 fit() 方法在训练集上训练模型。
    • 使用 predict() 方法对测试集进行预测。
  3. 模型评估:

    • 使用 accuracy_score() 计算预测的准确性并输出。
  4. 可视化:

    • 使用 主成分分析(PCA) 将数据降到 2D,以便可视化。PCA 选择前两个主成分作为新的特征进行降维。
    • 创建网格并计算每个点的分类标签,以绘制决策边界。
    • 使用 matplotlib 绘制决策边界,并将样本点按类别标记不同的颜色。

4. 可视化效果

代码将展示 SVM 分类器在降维后的数据上的决策边界,决策边界区域的颜色与分类标签对应,而每个样本点则会根据其真实的类别用不同颜色显示。

5. 总结

这段代码展示了如何在 Python 中使用支持向量机(SVM)进行分类任务,并通过可视化的方式帮助理解 SVM 的决策边界。你可以通过更改 kernel 参数尝试不同类型的核函数,如 rbf(径向基核)或者 poly(多项式核)等,从而优化模型的表现。

以下是一个包含 支持向量机(SVM)算法实现的完整 Python 代码示例。这个代码实现了 SVM 分类任务,并且使用了 sklearn 库来加载数据集、训练模型以及评估模型的性能。为了便于理解,我会将整个过程合并在一起,包括数据加载、模型训练、预测、评估和可视化。

1. 安装依赖

如果你还没有安装 scikit-learnmatplotlib,可以通过以下命令安装它们:

pip install scikit-learn matplotlib

2. 完整代码示例

# 导入必要的库
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA

# 加载鸢尾花数据集
iris = load_iris()
X = iris.data  # 特征数据
y = iris.target  # 标签数据

# 切分数据集,70%训练,30%测试
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 创建支持向量机分类器
svm_clf = SVC(kernel='linear', random_state=42)

# 训练SVM模型
svm_clf.fit(X_train, y_train)

# 在测试集上做预测
y_pred = svm_clf.predict(X_test)

# 打印预测准确度
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy:.4f}')

# 可视化支持向量机决策边界 (仅使用前两个特征进行可视化)
# 使用PCA将数据降到2D,以便于可视化
pca = PCA(n_components=2)
X_2d = pca.fit_transform(X)

# 切分降维后的数据
X_train_2d, X_test_2d, y_train, y_test = train_test_split(X_2d, y, test_size=0.3, random_state=42)

# 创建并训练 SVM 分类器
svm_clf_2d = SVC(kernel='linear', random_state=42)
svm_clf_2d.fit(X_train_2d, y_train)

# 创建网格来绘制决策边界
import numpy as np
xx, yy = np.meshgrid(np.linspace(X_2d[:, 0].min(), X_2d[:, 0].max(), 100),
                     np.linspace(X_2d[:, 1].min(), X_2d[:, 1].max(), 100))

Z = svm_clf_2d.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)

# 绘制决策边界
plt.figure(figsize=(10, 8))
plt.contourf(xx, yy, Z, alpha=0.8)
plt.scatter(X_2d[:, 0], X_2d[:, 1], c=y, edgecolors='k', marker='o', cmap=plt.cm.Paired, s=60)
plt.title("SVM Decision Boundary (using first two PCA components)")
plt.xlabel("PCA Component 1")
plt.ylabel("PCA Component 2")
plt.colorbar()
plt.show()

3. 代码解释

  1. 数据加载与切分:

    • 使用 load_iris() 加载鸢尾花数据集,其中 X 是特征矩阵,y 是标签。
    • 使用 train_test_split() 将数据集切分为 70% 的训练数据和 30% 的测试数据。
  2. SVM 分类器:

    • 创建一个支持向量机分类器 SVC,并指定核函数为 linear(线性核),可以根据需要调整为 rbf 等其他核函数。
    • 使用 fit() 方法在训练集上训练模型。
    • 使用 predict() 方法对测试集进行预测。
  3. 模型评估:

    • 使用 accuracy_score() 计算预测的准确性并输出。
  4. 可视化:

    • 使用 主成分分析(PCA) 将数据降到 2D,以便可视化。PCA 选择前两个主成分作为新的特征进行降维。
    • 创建网格并计算每个点的分类标签,以绘制决策边界。
    • 使用 matplotlib 绘制决策边界,并将样本点按类别标记不同的颜色。

4. 可视化效果

代码将展示 SVM 分类器在降维后的数据上的决策边界,决策边界区域的颜色与分类标签对应,而每个样本点则会根据其真实的类别用不同颜色显示。

5. 总结

这段代码展示了如何在 Python 中使用支持向量机(SVM)进行分类任务,并通过可视化的方式帮助理解 SVM 的决策边界。你可以通过更改 kernel 参数尝试不同类型的核函数,如 rbf(径向基核)或者 poly(多项式核)等,从而优化模型的表现。

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在