支持向量机(SVM)原理与应用

server/2025/3/14 10:37:14/

背景

      支持向量机(Support Vector Machine, SVM)是一种经典的监督学习算法,广泛应用于分类和回归问题。SVM以其强大的数学基础和优异的性能在机器学习领域占据了重要地位。本文将详细介绍SVM的原理、核函数的作用以及如何在Python中使用SVM解决实际问题。

1. 什么是支持向量机

      支持向量机是一种二分类模型,其基本思想是找到一个超平面,将不同类别的样本分开,并且使得两类样本到超平面的间隔最大化。SVM不仅可以处理线性可分问题,还可以通过核函数处理非线性问题。

1.1 超平面与间隔

       在SVM中,超平面是一个决策边界,用于将数据分为两类。对于线性可分的数据,超平面可以表示为:

其中:

间隔(Margin):是指两类样本中距离超平面最近的样本点到超平面的距离。SVM的目标是最大化这个间隔。

1.2 支持向量

      支持向量是距离超平面最近的样本点,它们决定了超平面的位置和方向。SVM的优化目标就是找到这些支持向量,并基于它们构建最优超平面。

 2. SVM的数学原理

SVM的优化问题可以表示为以下约束优化问题:

约束条件为:

其中:

通过拉格朗日乘子法,可以将上述问题转化为对偶问题,从而高效求解。

 3. 核函数:处理非线性问题

对于非线性可分的数据,SVM通过核函数将数据映射到高维空间,使得数据在高维空间中线性可分。常用的核函数包括:

核函数的选择对SVM的性能有很大影响,通常需要通过交叉验证来确定最佳核函数。

实例

使用SVM对鸢尾花数据集进行分类与可视化

1. 数据集介绍

       鸢尾花数据集(Iris Dataset)是机器学习领域中最经典的数据集之一。它包含150个样本,每个样本有4个特征:花萼长度、花萼宽度、花瓣长度和花瓣宽度。数据集分为3类,每类50个样本。本文中,我们只使用前两类数据进行二分类任务。

---

2. 加载数据

首先,我们使用`pandas`加载数据集,并将数据集分为训练集和测试集。


import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split# 加载数据集
data = pd.read_csv('iris.csv', header=None)# 提取特征和标签
x = data.iloc[:, :-1]
y = data.iloc[:, -1]# 划分训练集和测试集
x_train, x_test, y_train, y_test = \train_test_split(x, y, test_size=0.2, random_state=20)

3. 数据可视化

     为了更好地理解数据,我们可以将训练集和测试集的特征进行可视化。这里我们选择第2列(花萼宽度)和第4列(花瓣宽度)作为可视化的特征。


# 可视化训练集和测试集
plt.scatter(x_train[1], x_train[3], marker='+', label='Train')
plt.scatter(x_test[1], x_test[3], marker='o', label='Test')
plt.xlabel('Sepal Width')
plt.ylabel('Petal Width')
plt.legend()
plt.show()

4. 使用SVM进行分类

       接下来,我们使用SVM对数据进行分类。这里我们选择线性核函数,并将正则化参数`C`设置为无穷大,以确保模型能够找到最大间隔超平面。

from sklearn.svm import SVC# 选择特征
X = x_train.iloc[:, [1, 3]]
y = y_train# 训练SVM模型
svm = SVC(kernel='linear', C=float('inf'), random_state=0)
svm.fit(X, y)

 5. 可视化决策边界和支持向量

为了更直观地理解SVM的分类结果,我们可以绘制决策边界和支持向量。


import numpy as np# 获取模型参数
w = svm.coef_[0]
b = svm.intercept_[0]# 生成x1的值
x1 = np.linspace(0, 7, 300)# 计算决策边界
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, linewidth=2, color='r', label='Decision Boundary')
plt.plot(x1, x3, linewidth=1, color='r', linestyle='--', label='Margin')
plt.plot(x1, x4, linewidth=1, color='r', linestyle='--')# 设置坐标轴范围
plt.xlim(4, 7)
plt.ylim(0, 5)# 绘制支持向量
vets = svm.support_vectors_
plt.scatter(vets[:, 0], vets[:, 1], c='b', marker='x', label='Support Vectors')# 显示图例
plt.legend()
plt.show()

 6. 运行结果

总结

SVM的优缺点

优点
- 在高维空间中表现优异。
- 适用于小样本数据集。
- 通过核函数可以处理非线性问题。
- 泛化能力强。

缺点:
- 对大规模数据训练速度较慢。
- 对参数和核函数的选择敏感。
- 难以直接解释模型的结果。

       


http://www.ppmy.cn/server/174860.html

相关文章

无人机第三方安全风险评估技术详解

无人机第三方安全风险评估技术是一项复杂且重要的工作,它涉及对无人机系统及其运行环境进行全面的分析和评估,以确定潜在的安全风险,并提出相应的风险管理措施。以下是对无人机第三方安全风险评估技术的详细解析: 一、无人机第三…

【每日学点HarmonyOS Next知识】类型判断、刘海高度、隐私弹窗、滑动下一页效果、清楚缓存

1、HarmonyOS instanceof判断错误? ArkTS部分支持instanceof,可参考文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/typescript-to-arkts-migration-guide-V5 instanceof运算符在传递的过程中可能会发生以下情况&…

【A2DP】蓝牙音频编解码器互操作性要求详解

目录 一、音频编解码器互操作性:核心要点总览 二、必选与可选编解码器互操作性要求大盘点 2.1 必选与可选的编解码器支持 2.2 必选编解码器要求 2.3 可选编解码器要求 2.4 厂商自定义(Vendor Specific)A2DP编解码器互操作性要求 2.5 不…

品铂科技高精度UWB定位系统助力2018年北京冬奥会

UWB定位技术在冬奥会大放异彩 UWB技术满足冬奥会的哪些需求? 作为一项性能优秀的定位技术,UWB的定位精度可以达到厘米级,可以实现对移动人员与物品的轨迹追踪。 那么UWB技术究竟能够在本届冬奥会上扮演什么样的角色呢? 第一&a…

DeepSeek-R1:开源大模型的技术革命与行业影响分析

一、发布背景与开发者定位 DeepSeek-R1由幻方量化旗下AI公司深度求索(DeepSeek)于2025年1月20日正式发布,标志着中国AI公司在生成式大模型领域取得突破性进展。该模型的推出具有多重战略意义: 技术突破性:作为全球首…

Flink 中RocksDB 为什么将每个键和值的限制为 2^31 字节

你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益: 了解大厂经验拥有和大厂相匹配的技术等 希望看什么,评论或者私信告诉我! 文章目录 1…

高效自动化测试:打造Python+Requests+Pytest+Allure+YAML的接口测试框架

一、背景 在快节奏的开发周期中,如何确保接口质量?自动化测试是关键。通过构建标准化、可复用的测试框架,能显著提升测试效率与准确性,为项目质量保驾护航[1][7]。 二、目标 ✅ 核心目标: ● 实现快速、高效的接口测试…

学习计划:第四阶段(第十周)

目录 第四阶段:特殊方法与高级特性 第 10 周:综合复习与实践 周一 周二 周三 周四 周五 总结 一、项目设计与实现 二、问题与解决 三、学习成果 四、后续展望 第四阶段:特殊方法与高级特性 第 10 周:综合复习与实践 …