[机器学习复习笔记] SVM 支持向量机
SVM 支持向量机
1. 线性 SVM
1.1 线性可分问题
给定一个训练样本集
简单得说,就是最佳划分,能够使得

1.2 划分超平面
有时候问题是二维甚至是多个维度的,而这样一个划分,通常被称为 划分超平面。在样本空间中,划分超平面 可通过如下线性方程去描述:
其中
显然在样本空间
记为
其中
划分超平面 所产生的分类结果是最具鲁棒性的,对未见示例的泛化能力最强。
1.3 支持向量
假设超平面
由于
可以将上述方程组合并:
距离超平面 最近 的几个训练样本点使得上述不等式 等号成立,这些点被称为 支持向量 。

两个 不同类支持向量 到超平面的距离之和为:
1.4 最大化间隔
形式化表述为:
显然,为了最大化间隔(
那么为了方便计算,我们往往会除去的根号,转换成 最小化
这就是基本的 支持向量机
2. 对偶问题
2.1 拉格朗日乘子法求解SVM
前面了解了 最大间隔划分超平面,令:
对于上面的 最大化间隔 问题,也即 最小化
具体来说,对上面的问题中的每条约束添加 拉格朗日乘子
其中
令
可得
将上面的等式带入
由此可以得到 对偶问题:
解出
对于对偶问题解出的
上述过程满足
对于任意样本
当
3. 核函数 SVM
3.1 线性不可分问题
前面我们讨论了SVM求解线性可分问题,然而显示生活中,样本往往是 线性不可分的,即原本的样本空间不存在一个可以正确划分两类样本的划分超平面。


对于 线性不可分 问题,可以将样本空间映射到一个 更高维度 的空间,使得样本在此特征空间内线性可分。
原始样本空间是 有限维 的,那么 一定存在一个高维度空间使得样本可分。
3.2 对偶问题(线性不可分)
令
其对应的 对偶问题 为:
3.3 核函数
在上面求解式中涉及到计算
所以这里可以设想一个函数:
即
由此 对偶问题 可以重写为:
求解后得到:
此处的
然而一般情况下,我们不知道
令
只要一个对称函数对应的核矩阵半正定,其可作为 核函数 使用。
常用核函数:
- 线性核函数
- 多项式核函数
- 高斯核函数(也称径向基RBF函数)
- 拉普拉斯核函数*
核函数*
上述的核函数,也可以通过线性组合等方式,组成新的核函数。
4. 软间隔 SVM
4.1 软间隔
在实际生活中,很少遇到可以完全线性可分的样本。那么如何解决这个问题呢?
此时我们引入 软间隔 (
在前面的讨论中,所有样本都必须划分正确,其实这称为 硬间隔 (

当然,在最大化间隔的时候,应当让不满足的约束尽可能少。优化目标函数如下:
其中
当
4.2 替代损失函数
由于
常见的 替代函数:
损失函数
- 指数损失函数
- 对率损失函数
如采用
引入 松弛变量 (
这就是常用的 软间隔支持向量机
4.3 对偶问题(软间隔)
对于每个样本,都有一个对应的松弛变量,所以此时还需要引入另外一个拉格朗日乘子
其中拉格朗日乘子
令
由此可以得到对应的 对偶问题:
对于 软间隔支持向量机,
对于任意训练样本
若
若
若
若
5. sklearn SVM 调用
import numpy as np
from sklearn import svm
from sklearn.model_selection import train_test_split
from sklearn.metrics import f1_score
X, y = ...
x_train,x_test,y_train,y_test = train_test_split(X,y,random_state=...)
model = svm.SVC(C=1.0, kernel='rbf')
model.fit(x_train, y_train)
# 预测结果
res = model.predict(x_test)
# 进行评估
print("F1: {0:.2f}".format(f1_score(res, y_test, average='micro')))
参考
《机器学习》 周志华
一切都是命运石之门的选择,本文章来源于博客园,作者:MarisaMagic,出处:https://www.cnblogs.com/MarisaMagic/p/17876283.html,未经允许严禁转载
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?