非线性支持向量机(SVM)

理论知识推导

支持向量机(SVM)是一种用于分类和回归分析的监督学习模型。在处理非线性数据时,线性SVM可能无法很好地分离数据。为了解决这个问题,我们使用核函数将低维空间的非线性数据映射到高维空间,使得在高维空间中可以线性分离。

核函数

非线性SVM的目标函数

目标是找到最优分离超平面,使得分类间隔最大。其优化问题如下:

实施步骤与参数解读

  1. 导入库
  2. 生成多维数据集
  3. 数据标准化
  4. 分割数据集
  5. 训练未优化的非线性SVM模型
  6. 预测并评估未优化模型
  7. 优化模型(调整核函数和参数)
  8. 训练优化后的非线性SVM模型
  9. 预测并评估优化后的模型
  10. 可视化结果
python 复制代码
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.metrics import classification_report, accuracy_score

# 设置全局字体为楷体
plt.rcParams['font.family'] = 'KaiTi'

# 生成多维数据集
X, y = datasets.make_classification(n_samples=500, n_features=5, n_informative=3, n_redundant=2, random_state=42)

# 数据标准化
scaler = StandardScaler()
X = scaler.fit_transform(X)

# 数据集划分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 未优化模型
clf_unoptimized = SVC(kernel='rbf')
clf_unoptimized.fit(X_train, y_train)
y_pred_unoptimized = clf_unoptimized.predict(X_test)

# 输出未优化模型的结果
print("未优化模型的分类报告:")
print(classification_report(y_test, y_pred_unoptimized))
print("未优化模型的准确率:", accuracy_score(y_test, y_pred_unoptimized))

# 优化后的模型
clf_optimized = SVC(kernel='rbf', C=10, gamma=0.1)
clf_optimized.fit(X_train, y_train)
y_pred_optimized = clf_optimized.predict(X_test)

# 输出优化后的模型的结果
print("优化后的模型的分类报告:")
print(classification_report(y_test, y_pred_optimized))
print("优化后的模型的准确率:", accuracy_score(y_test, y_pred_optimized))

# 可视化
plt.figure(figsize=(12, 6))

# 选取二维特征进行可视化
X_vis = X_test[:, :2]
y_vis = y_test

# 未优化模型的可视化
plt.subplot(1, 2, 1)
plt.scatter(X_vis[y_vis == 0][:, 0], X_vis[y_vis == 0][:, 1], color='blue', label='Class 0')
plt.scatter(X_vis[y_vis == 1][:, 0], X_vis[y_vis == 1][:, 1], color='red', label='Class 1')
plt.title('未优化模型')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.legend()

# 优化后的模型的可视化
plt.subplot(1, 2, 2)
plt.scatter(X_vis[y_vis == 0][:, 0], X_vis[y_vis == 0][:, 1], color='blue', label='Class 0')
plt.scatter(X_vis[y_vis == 1][:, 0], X_vis[y_vis == 1][:, 1], color='red', label='Class 1')
plt.title('优化后的模型')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.legend()

plt.show()
相关推荐
林泽毅3 分钟前
PyTRIO:当强化学习不再需要本地GPU
人工智能·python·深度学习·机器学习
小陈phd13 分钟前
QAnything 阅读优化策略05——检索
人工智能·python·机器学习
稚南城才子,乌衣巷风流26 分钟前
ST 表(Sparse Table)算法详解:原理、实现与应用
算法
hold?fish:palm31 分钟前
9 找到字符串中所有字母异位词
c++·算法·leetcode
Sw1zzle1 小时前
算法入门(六):贪心算法 - 基础入门(Leetcode 121/455/860/376/738)
算法·leetcode·贪心算法
青山木1 小时前
Hot 100 --- 岛屿数量
java·数据结构·算法·leetcode·深度优先·广度优先
不会就选b1 小时前
算法日常・每日刷题--<归并排序>1
数据结构·算法
危桥带雨2 小时前
排序算法(快排、归并、计数、基数排序)
数据结构·算法·排序算法
啦啦啦啦啦zzzz2 小时前
算法:回溯算法
c++·算法·leetcode