非线性支持向量机(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()
相关推荐
森焱森1 分钟前
无人机三轴稳定化控制(1)____飞机的稳定控制逻辑
c语言·单片机·算法·无人机
循环过三天5 分钟前
3-1 PID算法改进(积分部分)
笔记·stm32·单片机·学习·算法·pid
闪电麦坤9530 分钟前
数据结构:二维数组(2D Arrays)
数据结构·算法
凌肖战42 分钟前
力扣网C语言编程题:快慢指针来解决 “寻找重复数”
c语言·算法·leetcode
麻雀无能为力1 小时前
CAU数据挖掘 支持向量机
人工智能·支持向量机·数据挖掘·中国农业大学计算机
埃菲尔铁塔_CV算法1 小时前
基于 TOF 图像高频信息恢复 RGB 图像的原理、应用与实现
人工智能·深度学习·数码相机·算法·目标检测·计算机视觉
IT古董1 小时前
【第二章:机器学习与神经网络概述】04.回归算法理论与实践 -(3)决策树回归模型(Decision Tree Regression)
神经网络·机器学习·回归
NAGNIP2 小时前
一文搞懂FlashAttention怎么提升速度的?
人工智能·算法
Codebee2 小时前
OneCode图生代码技术深度解析:从可视化设计到注解驱动实现的全链路架构
css·人工智能·算法