当前位置: 首页 > news >正文

机器学习——支持向量机(SVM)实战案例

SVM的 核函数超参数 介绍

机器学习——支持向量机(SVM)-CSDN博客https://blog.csdn.net/2302_78022640/article/details/150073569


支持向量机(SVM)实战案例:鸢尾花部分数据 二分类与决策边界可视化

支持向量机(Support Vector Machine,SVM)是一种常用的监督学习分类算法,核心思想是找到一个能够最大化类别间隔的超平面,实现数据的分类。本案例将通过鸢尾花数据集(Iris)构建一个二分类模型,并绘制决策边界和支持向量。


1. 数据准备与选择特征

from sklearn.datasets import load_iris
from sklearn.svm import SVC
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]# 加载鸢尾花数据集
iris = load_iris()
data = iris.data
target = iris.target# 只取前两类(setosa 和 versicolor)以及两个特征:花萼长度(0)和花瓣长度(2)
X = data[0:100, [0, 2]]
y = target[0:100]

说明:

  • 鸢尾花数据集共有 150 个样本、3 个类别(0、1、2)。

  • 为了便于二维可视化,这里取前两类(标签 0 和 1),并且只用两个特征(便于画二维平面)。


2. 构建并训练 SVM 模型

# 线性核函数,C=∞ 相当于硬间隔 SVM
model = SVC(kernel='linear', C=float('inf'), random_state=100)
model.fit(X, y)

核心参数解释:

  • kernel='linear':使用线性核函数,适用于线性可分的情况。

  • C=float('inf'):惩罚因子 C 越大,对误分类的容忍度越低,这里取无限大相当于硬间隔最大化

  • random_state:随机种子,保证结果可复现。


3. 数据可视化

# 绘制两类数据的散点图
plt.scatter(X[0:50, 0], X[0:50, 1], c='r', marker='o', label='类别0')
plt.scatter(X[50:100, 0], X[50:100, 1], c='g', marker='+', label='类别1')
  • 类别 0(红色圆点)

  • 类别 1(绿色加号)


4. 绘制决策边界和间隔线

# 获取超平面参数 w 和 b
w = model.coef_[0]
b = model.intercept_[0]# 决策边界:w1*x1 + w2*x2 + b = 0
x1 = np.linspace(0, 10, 100)
x2 = -(w[0] * x1 + b) / w[1]# 间隔边界:w1*x1 + w2*x2 + b = ±1
x3 = (1 - (w[0] * x1 + b)) / w[1]
x4 = (-1 - (w[0] * x1 + b)) / w[1]# 绘制
plt.plot(x1,x2,c='b',label='决策边界')
plt.plot(x1,x3,c='b',linestyle='--',label='间隔边界')
plt.plot(x1,x4,c='b',linestyle='--',label='间隔边界')
  • 实线:决策边界

  • 虚线:两条间隔边界,支持向量位于这两条线上。


5. 标记支持向量

# 获取支持向量
vets = model.support_vectors_
plt.scatter(vets[:, 0], vets[:, 1], s=100, facecolors='none', edgecolors='b', label='支持向量')

支持向量是离决策边界最近的样本点,SVM 的优化目标就是最大化这些点到边界的间隔。

model.support_vectors_ 是一个 numpy.ndarray,形状为 (n_support_vectors, n_features)

每一行就是一个支持向量在训练时使用的特征空间坐标(即训练时输入给 SVM 的特征,若训练前做过 StandardScaler/PCA 等变换,则这里是变换后的坐标)。

  • vets[:, 0], vets[:, 1]

    • 取支持向量矩阵的第 0 列和第 1 列作为 x、y 坐标 —— 前提是数据确实是二维若维度 >2,需要先降维(PCA/t-SNE)再画图。

  • s=100

    • 标记大小,注意:s 表示点的面积(points^2),不是半径。s=100 比较显眼;需要更大更明显可以改成 s=150s=300

  • facecolors='none'

    • 使标记内部不填充(空心),这样可以“圈出”点而不遮挡原来的颜色/形状。常用于突出某些点(比如支持向量)。

  • edgecolors='b'

    • 标记边缘颜色设为蓝色('b')。当 facecolors='none' 且 marker 是可填充(如 'o')时,会画成蓝色空心圆。

  • label='支持向量'

    • 用于图例显示。


6. 显示结果

plt.legend()
plt.show()

运行结果:

  • 红色圆点和绿色加号分别代表两类样本。

  • 蓝色实线是决策边界,虚线是最大间隔线。

  • 蓝色圈出的点是支持向量。


7. 结果与分析

1. 支持向量(Support Vectors)

  • 定义:支持向量是离分类边界最近的样本点,它们位于最大间隔边界上。

  • 作用

    1. 唯一决定分类超平面的位置和方向。

    2. 不是所有样本都会影响分类结果,只有支持向量才会参与优化计算。

    3. 如果移除非支持向量,模型的分类结果不会变;但如果移除支持向量,边界会发生变化。

  • 在图中:蓝色圈出来的点,就是支持向量。


2. 决策边界(Decision Boundary)

  • 数学形式

    这是模型最终找到的最佳分类超平面,它能最大化两类样本的间隔。

  • 作用

    • 处在该线上的点,SVM 判断它们属于哪一类的概率是五五开(分类决策值为 0)。

    • 决策边界左侧的点判为一类,右侧的点判为另一类(对于二维空间而言)。

  • 在图中:蓝色实线是决策边界。


3. 间隔边界(Margin Boundaries)

  • 数学形式

    这两条线表示离决策边界等距离的两条平行线。

  • 作用

    1. 间隔(Margin)是这两条虚线之间的区域,SVM 会努力让这个区域尽可能宽。

    2. 支持向量正好落在这两条虚线上。

  • 在图中

    • 蓝色虚线是最大间隔边界。

    • 其中一条虚线紧贴类别 0 的支持向量,另一条紧贴类别 1 的支持向量。


8. 完整代码

from sklearn.datasets import load_iris
from sklearn.svm import SVC
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]iris = load_iris()
data = iris.data
X = data[0:100,[0,2]]
y = iris.target[0:100]
model = SVC(kernel='linear', C=float('inf'), random_state=100)
model.fit(X, y)plt.scatter(X[0:50,0],X[0:50,1],c='r',marker='o',label='类别0')
plt.scatter(X[50:100,0],X[50:100,1],c='g',marker='+',label='类别1')w = model.coef_[0]
b = model.intercept_[0]x1 = np.linspace(0,10,100)
x2 = -(w[0]*x1+b)/w[1]
x3 = (1-(w[0]*x1+b))/w[1]
x4 = (-1-(w[0]*x1+b))/w[1]plt.plot(x1,x2,c='b',label='决策边界')
plt.plot(x1,x3,c='b',linestyle='--',label='间隔边界')
plt.plot(x1,x4,c='b',linestyle='--',label='间隔边界')vets = model.support_vectors_
plt.scatter(vets[:,0],vets[:,1],s=100,facecolors='none', edgecolors='b',label='支持向量')plt.legend()
plt.show()

http://www.dtcms.com/a/321196.html

相关文章:

  • 操作系统-实验-进程
  • 机器学习之支持向量机(原理)
  • svm的一些应用
  • 怎么查看Linux I2C总线挂载了那些设备?
  • springboot整合rabbitMQ的示例
  • Elasticsearch:在向量搜索中使用 Direct IO
  • 解码华为云安全“铁三角”:用“分层防御”化解安全挑战
  • 微软披露Exchange Server漏洞:攻击者可静默获取混合部署环境云访问权限
  • 企业AI的双层技术栈架构:融合社区创新与企业级管控的设计蓝图
  • Git 使用场景笔记
  • DuoPlus支持导入文件批量配置云手机参数,还优化了批量操作和搜索功能!
  • 数据结构--哈希表
  • QAGenerationChain从知识库生成大模型应用测试的问题对
  • LeetCode算法日记 - Day 5: 长度最小的子数组、无重复字符的最长子串
  • 【uni-app】解决在 h5 环境下会出现双标题问题
  • 内核的调试和优化
  • Netty-Rest搭建笔记
  • 微算法科技(NASDAQ:MLGO)使用循环QSC和QKD的量子区块链架构,提高交易安全性和透明度
  • 降低程序运行时CPU和GPU峰值占用的技术方案
  • 基于深度学习的鸟类检测识别系统(yolo11、yolov8、yolov5+UI界面+Python项目源码+模型+标注好的数据集)
  • ROHM推出适用于Zone-ECU的高性能智能高边开关!
  • 【unitrix数间混合计算】2.3 标准化处理系统(src/number/normalize/mod.rs)
  • Alkimi 与 Sui 合作,修复「破碎」的广告生态
  • HarmonyOS多设备资源文件管理以及resources资源引用方式
  • 交换机100G模块远距离连接踩坑记录
  • 强制用户更改WordPress密码的重要性及实现方法
  • Pinterest视觉营销自动化:亚矩阵云手机实例与多分辨率适配技术
  • 在 Elasticsearch/Kibana (ELK Stack) 中搜索包含竖线 (|)​​ 这类特殊字符的日志消息 (msg 字段) ​确实需要转义
  • proteus实现简易DS18B20温度计(stm32)
  • python学智能算法(三十五)|SVM-软边界拉格朗日方程乘子非负性理解