【ShuQiHere】 支持向量机(SVM)详解:从理论到实践,这一篇就够了
📖 【ShuQiHere】
在现代机器学习课程中,支持向量机(SVM) 是不可或缺的一部分。它不仅在分类任务中有出色表现,还能灵活处理回归问题。尽管看似复杂,SVM 背后的思想却深刻而优雅。今天我们将全面探讨**支持向量机(Support Vector Machine,SVM)**的全部知识点,涵盖其基础概念、数学推导、核函数、分类策略(如 One-vs-One、One-vs-Rest)、回归分析,以及在实际应用中的代码实现。希望这篇博客能帮助你全面深入地理解 SVM!🚀
目录
- 引言
- SVM 的背景与简介
- SVM 的基本概念
- 线性可分与线性不可分数据
- 最大间隔分类器(Maximum Margin Classifier)
- 支持向量(Support Vectors)
- SVM 的数学推导
- 原始问题(Primal Problem)
- 对偶问题(Dual Problem)
- 拉格朗日乘子法(Lagrange Multipliers)
- 核函数与非线性 SVM
- 为什么需要核函数?
- 常见核函数(Kernel Functions)
- 软间隔 SVM(Soft Margin SVM)
- 松弛变量(Slack Variables)
- 惩罚参数 C 的作用
- 多分类 SVM
- One-vs-Rest(OvR,一对多)
- One-vs-One(OvO,一对一)
- 支持向量回归(SVR)
- ε-不敏感损失函数(ε-Insensitive Loss Function)
- SVR 的优化问题
- 案例分析与代码实现
- 分类示例
- 回归示例
- SVM 的优缺点
- 应用场景
- 总结
- 参考资料
引言
在机器学习领域,支持向量机(SVM)是一种强大的工具,广泛应用于分类和回归任务中。它以其坚实的理论基础和卓越的性能,在各种实际问题中得到了成功应用。
SVM 的独特之处在于它通过寻找最佳的分隔超平面来最大化分类间隔,从而实现对未知数据的良好泛化能力。无论是在处理高维数据、非线性问题,还是在应对小样本、复杂数据结构时,SVM 都表现出了强大的适应性。
让我们一起深入了解 SVM 的方方面面,揭开其神秘的面纱吧!🌟
SVM 的背景与简介
什么是支持向量机?
**支持向量机(Support Vector Machine,SVM)**是一种监督学习模型,用于解决分类和回归问题。它的核心思想是找到一个能够以最大间隔将不同类别的数据分开的超平面。
- 主要特点:
- 高效性:在高维空间中仍然表现出色,避免了维度灾难。
- 灵活性:通过核函数处理非线性问题,实现了线性模型在高维特征空间的非线性映射。
- 泛化能力强:基于结构风险最小化原则,减少过拟合,提升对未知数据的预测能力。
历史背景
- 20 世纪 60 年代:SVM 的理论基础由 Vladimir Vapnik 和 Alexey Chervonenkis 提出,他们提出了 VC 维和结构风险最小化原则,为 SVM 奠定了理论基础。
- 20 世纪 90 年代:随着核技巧的发展,SVM 在非线性分类中得到了广泛应用。Cortes 和 Vapnik 在 1995 年提出了软间隔 SVM,使得 SVM 能够处理线性不可分的数据。
- 现今:SVM 已成为机器学习领域的重要算法之一,被广泛应用于文本分类、图像识别、生物信息学等领域。
SVM 的基本概念
线性可分与线性不可分数据
-
线性可分数据(Linearly Separable Data):存在一个线性超平面能够完全正确地分开不同类别的数据点。例如,二维空间中的直线能够将两个类别的数据完全分开。
-
线性不可分数据(Linearly Inseparable Data):不存在一个线性超平面能够完美地分开数据,需要引入非线性方法或允许一定的分类错误。
示例:
- 线性可分:例如,一组红色点和一组蓝色点,可以被一条直线完美分开。
- 线性不可分:如果数据呈现出圆形分布,用直线无法将其分开,此时需要借助非线性方法。
最大间隔分类器(Maximum Margin Classifier)
目标:在所有可能的超平面中,找到那个能够**最大化类别间隔(Margin)**的超平面。
-
间隔(Margin):指超平面到最近数据点(支持向量)的最小距离。间隔越大,模型对未知数据的泛化能力通常越强。
-
为什么要最大化间隔?
- 增强泛化能力:最大化间隔能够降低模型对训练数据的敏感度,减少过拟合,提高对新数据的预测准确性。
- 直观理解:在两类数据之间尽可能地拉开距离,使得模型对边界附近的噪声和异常值不敏感。
数学表达:
- 对于二分类问题,寻找一个满足 $ y_i (w^T x_i + b) \geq 1 $ 的超平面,使得 $ |w| $ 最小化,即最大化间隔。
支持向量(Support Vectors)
-
定义:位于决策边界(超平面)附近、对模型决策起关键作用的样本点。这些点满足 $ y_i (w^T x_i + b) = 1 $。
-
作用:
- 决定超平面的位置和方向:支持向量直接影响到决策边界的确定。
- 模型的核心:SVM 的目标函数只与支持向量有关,其他非支持向量对模型的影响被忽略。
🌟 形象比喻:支持向量就像撑起帐篷的支柱,决定了帐篷(模型)的形状和稳定性。没有这些支柱,帐篷就无法立起来。
SVM 的数学推导
为了深入理解 SVM 的工作原理,我们需要了解其数学推导过程。
原始问题(Primal Problem)
对于一个二分类问题,给定训练数据集 { ( x i , y i ) } i = 1 n \{(x_i, y_i)\}_{i=1}^n {(xi,yi)}i=1n,其中 x i ∈ R n x_i \in \mathbb{R}^n xi∈Rn, y i ∈ { + 1 , − 1 } y_i \in \{+1, -1\} yi∈{+1,−1}。
目标:找到一个决策函数 $ f(x) = w^T x + b $,使得:
-
约束条件:
y i ( w T x i + b ) ≥ 1 , i = 1 , 2 , … , n y_i (w^T x_i + b) \geq 1, \quad i = 1, 2, \dots, n yi(wTxi+b)≥1,i=1,2,…,n
-
优化目标:
min w , b 1 2 ∥ w ∥ 2 \min_{w, b} \ \frac{1}{2} \|w\|^2 w,bmin 21∥w∥2
这里的 ∥ w ∥ \|w\| ∥w∥ 是权重向量的欧几里得范数。目标是最小化 ∥ w ∥ \|w\| ∥w∥,即最大化间隔。
理解:
- 通过约束条件,我们确保所有样本被正确分类,且
离超平面至少有单位距离。
- 优化目标旨在找到一个具有最大间隔的超平面。
对偶问题(Dual Problem)
为了更方便地解决优化问题,我们引入拉格朗日乘子,将原始问题转换为对偶问题。
拉格朗日函数:
L ( w , b , α ) = 1 2 ∥ w ∥ 2 − ∑ i = 1 n α i [ y i ( w T x i + b ) − 1 ] L(w, b, \alpha) = \frac{1}{2} \|w\|^2 - \sum_{i=1}^n \alpha_i [y_i (w^T x_i + b) - 1] L(w,b,α)=21∥w∥2−i=1∑nαi[yi(wTxi+b)−1]
其中 α i ≥ 0 \alpha_i \geq 0 αi≥0 为拉格朗日乘子。
求解过程:
-
对 L ( w , b , α ) L(w, b, \alpha) L(w,b,α) 关于 w w w 和 b b b 求偏导,并令其为零:
-
对 w w w 求偏导:
∂ L ∂ w = w − ∑ i = 1 n α i y i x i = 0 ⟹ w = ∑ i = 1 n α i y i x i \frac{\partial L}{\partial w} = w - \sum_{i=1}^n \alpha_i y_i x_i = 0 \implies w = \sum_{i=1}^n \alpha_i y_i x_i ∂w∂L=w−i=1∑nαiyixi=0⟹w=i=1∑nαiyixi
-
对 b b b 求偏导:
∂ L ∂ b = − ∑ i = 1 n α i y i = 0 ⟹ ∑ i = 1 n α i y i = 0 \frac{\partial L}{\partial b} = -\sum_{i=1}^n \alpha_i y_i = 0 \implies \sum_{i=1}^n \alpha_i y_i = 0 ∂b∂L=−i=1∑nαiyi=0⟹i=1∑nαiyi=0
-
-
将 w w w 和 b b b 的表达式代入拉格朗日函数,得到对偶问题:
max α ∑ i = 1 n α i − 1 2 ∑ i , j = 1 n α i α j y i y j x i T x j \max_{\alpha} \sum_{i=1}^n \alpha_i - \frac{1}{2} \sum_{i,j=1}^n \alpha_i \alpha_j y_i y_j x_i^T x_j αmaxi=1∑nαi−21i,j=1∑nαiαjyiyjxiTxj
约束条件:
{ α i ≥ 0 , i = 1 , 2 , … , n ∑ i = 1 n α i y i = 0 \begin{cases} \alpha_i \geq 0, \quad i = 1, 2, \dots, n \\ \sum_{i=1}^n \alpha_i y_i = 0 \end{cases} {αi≥0,i=1,2,…,n∑i=1nαiyi=0
拉格朗日乘子法(Lagrange Multipliers)
-
作用:将有约束的优化问题转化为无约束的优化问题,通过引入拉格朗日乘子,将约束条件合并到目标函数中。
-
优点:对偶问题通常更容易求解,特别是在引入核函数后,对偶问题只涉及到数据的内积。
-
求解方法:可以使用二次规划(Quadratic Programming,QP)算法求解对偶问题,获得最优的 α i \alpha_i αi 值。
最终决策函数:
-
通过求解对偶问题,得到拉格朗日乘子 α i \alpha_i αi,进而计算权重向量 w w w 和偏置 b b b。
-
决策函数为:
f ( x ) = sgn ( ∑ i = 1 n α i y i x i T x + b ) f(x) = \text{sgn}\left( \sum_{i=1}^n \alpha_i y_i x_i^T x + b \right) f(x)=sgn(i=1∑nαiyixiTx+b)
注意,只有对应于支持向量的 α i \alpha_i αi 不为零。
核函数与非线性 SVM
为什么需要核函数?
当数据线性不可分时,我们需要将数据映射到更高维的空间,使其在高维空间中线性可分。
-
映射函数(Mapping Function): ϕ : R n → R H \phi: \mathbb{R}^n \rightarrow \mathbb{R}^H ϕ:Rn→RH,将原始数据映射到高维特征空间。
-
问题:直接计算高维空间的内积计算量大,可能导致维度灾难。
核技巧(Kernel Trick):通过定义核函数 K ( x i , x j ) = ϕ ( x i ) T ϕ ( x j ) K(x_i, x_j) = \phi(x_i)^T \phi(x_j) K(xi,xj)=ϕ(xi)Tϕ(xj),可以在不显式计算 ϕ ( x ) \phi(x) ϕ(x) 的情况下计算高维空间的内积。
-
优势:
- 降低计算复杂度:避免了高维映射的计算,直接在原始空间中计算核函数。
- 处理非线性问题:通过合适的核函数,可以处理各种非线性可分的数据。
常见核函数(Kernel Functions)
-
线性核(Linear Kernel):
K ( x i , x j ) = x i T x j K(x_i, x_j) = x_i^T x_j K(xi,xj)=xiTxj
- 应用场景:数据线性可分,或高维稀疏数据,如文本分类中的词袋模型。
-
多项式核(Polynomial Kernel):
K ( x i , x j ) = ( x i T x j + c ) d K(x_i, x_j) = (x_i^T x_j + c)^d K(xi,xj)=(xiTxj+c)d
-
参数:
- c c c:常数项,控制多项式的灵活性。
- d d d:多项式的度数,决定了非线性的程度。
-
特点:能够表示特征之间的高阶交互。
-
-
高斯核(Gaussian Kernel)或 RBF 核(Radial Basis Function Kernel):
K ( x i , x j ) = exp ( − γ ∥ x i − x j ∥ 2 ) K(x_i, x_j) = \exp\left(-\gamma \|x_i - x_j\|^2\right) K(xi,xj)=exp(−γ∥xi−xj∥2)
-
参数:
- γ \gamma γ:控制高斯函数的宽度, γ > 0 \gamma > 0 γ>0。
-
特点:具有局部性,能够处理复杂的非线性关系,特征空间是无限维的。
-
-
Sigmoid 核(Sigmoid Kernel):
K ( x i , x j ) = tanh ( κ x i T x j + c ) K(x_i, x_j) = \tanh\left(\kappa x_i^T x_j + c\right) K(xi,xj)=tanh(κxiTxj+c)
-
参数:
- κ \kappa κ:比例因子。
- c c c:偏置项。
-
应用:与神经网络的激活函数有关,但在 SVM 中较少使用。
-
🌟 选择核函数的技巧:
- 了解数据特点:根据数据的分布和性质选择合适的核函数。
- 参数调优:通过交叉验证调整核函数的参数,如 γ \gamma γ、 d d d、 c c c 等。
- 避免过拟合:过于复杂的核函数可能导致模型过拟合,需要平衡模型的复杂度和泛化能力。
软间隔 SVM(Soft Margin SVM)
为什么需要软间隔?
-
现实问题:数据可能线性不可分,或者存在噪声和异常值。
-
解决方案:允许一定的误分类,引入软间隔(Soft Margin),在最大化间隔的同时,最小化分类错误。
松弛变量(Slack Variables)
-
引入松弛变量 ξ i \xi_i ξi:衡量第 i i i 个样本的误分类程度。
-
约束条件修改为:
y i ( w T x i + b ) ≥ 1 − ξ i , ξ i ≥ 0 y_i (w^T x_i + b) \geq 1 - \xi_i, \quad \xi_i \geq 0 yi(wTxi+b)≥1−ξi,ξi≥0
- 当 ξ i = 0 \xi_i = 0 ξi=0 时,第 i i i 个样本被正确分类且在间隔外。
- 当 0 < ξ i ≤ 1 0 < \xi_i \leq 1 0<ξi≤1 时,样本被正确分类但在间隔内。
- 当 ξ i > 1 \xi_i > 1 ξi>1 时,样本被误分类。
惩罚参数 C 的作用
-
优化目标修改为:
min w , b , ξ 1 2 ∥ w ∥ 2 + C ∑ i = 1 n ξ i \min_{w, b, \xi} \ \frac{1}{2} \|w\|^2 + C \sum_{i=1}^n \xi_i w,b,ξmin 21∥w∥2+Ci=1∑nξi
- 第一项 1 2 ∥ w ∥ 2 \frac{1}{2} \|w\|^2 21∥w∥2:最大化间隔。
- 第二项 C ∑ i = 1 n ξ i C \sum_{i=1}^n \xi_i C∑i=1nξi:惩罚误分类样本的损失。
-
参数 C C C:
- 控制模型对误分类的惩罚程度。
- 大 C C C:对误分类惩罚大,间隔小,模型更倾向于减少训练错误,可能过拟合。
- 小 C C C:允许更多误分类,间隔大,模型更注重泛化能力,可能欠拟合。
🌟 直观理解: C C C 就像是老师对学生犯错的容忍度, C C C 大表示严格,容忍度低; C C C 小表示宽松,容忍度高。
求解方法:
- 通过引入松弛变量和惩罚参数,将问题转化为带有约束的优化问题。
- 同样可以使用拉格朗日乘子法,将其转换为对偶问题求解。
多分类 SVM
SVM 本质上是二分类模型,但现实中常常需要处理多分类问题。为此,常用以下策略:
One-vs-Rest(OvR,一对多)
-
思想:将多分类问题拆解为多个二分类问题,每个类别与其他类别进行分类。
-
步骤:
- 对于每个类别 i i i,训练一个 SVM,将该类别的样本作为正类,其他类别的样本作为负类。
- 共训练 k k k 个 SVM 模型, k k k 为类别数量。
- 预测时:将样本输入所有模型,选择输出得分最高的类别。
-
优点:
- 实现简单,计算效率较高。
- 适用于类别数量较多的情况。
-
缺点:
- 当类别不平衡时,可能导致分类性能下降。
- 存在类别之间的偏置问题。
One-vs-One(OvO,一对一)
-
思想:对每一对类别组合,训练一个 SVM 模型。
-
步骤:
- 对于 k k k 个类别,共训练 k ( k − 1 ) 2 \frac{k(k-1)}{2} 2k(k−1) 个 SVM 模型。
- 每个模型在两类样本上训练,忽略其他类别。
- 预测时:采用投票机制,样本分类为得票最多的类别。
-
优点:
- 模型在较小的数据集上训练,速度快。
- 对类别不平衡不敏感。
-
缺点:
- 当类别数量较多时,模型数量急剧增加,计算成本高。
- 预测时需要评估多个模型,可能影响实时性。
🌟 选择策略的建议:
- 当类别数量较少时,优先选择 OvO 策略,准确率更高。
- 当数据类别不平衡或类别数量较多时,考虑使用 OvR 策略,计算效率更高。
支持向量回归(SVR)
SVM 不仅可以用于分类问题,也可以扩展用于回归任务,即支持向量回归(Support Vector Regression,SVR)。
ε-不敏感损失函数(ε-Insensitive Loss Function)
在回归问题中,目标是找到一个函数 $ f(x) $,使其尽可能准确地预测连续的输出值。
-
ε-不敏感损失函数定义:
L ( y , f ( x ) ) = { 0 , if ∣ y − f ( x ) ∣ ≤ ϵ ∣ y − f ( x ) ∣ − ϵ , otherwise L(y, f(x)) = \begin{cases} 0, & \text{if } |y - f(x)| \leq \epsilon \\ |y - f(x)| - \epsilon, & \text{otherwise} \end{cases} L(y,f(x))={0,∣y−f(x)∣−ϵ,if ∣y−f(x)∣≤ϵotherwise
-
直观理解:
- 只关注预测误差超过 ϵ \epsilon ϵ 的部分,对小的误差不予理会。
- 以 ϵ \epsilon ϵ 为阈值,构建一个“ε-不敏感管道”。
SVR 的优化问题
-
目标函数:
min w , b , ξ , ξ ∗ 1 2 ∥ w ∥ 2 + C ∑ i = 1 n ( ξ i + ξ i ∗ ) \min_{w, b, \xi, \xi^*} \ \frac{1}{2} \|w\|^2 + C \sum_{i=1}^n (\xi_i + \xi_i^*) w,b,ξ,ξ∗min 21∥w∥2+Ci=1∑n(ξi+ξi∗)
-
约束条件:
{ y i − w T x i − b ≤ ϵ + ξ i w T x i + b − y i ≤ ϵ + ξ i ∗ ξ i , ξ i ∗ ≥ 0 \begin{cases} y_i - w^T x_i - b \leq \epsilon + \xi_i \\ w^T x_i + b - y_i \leq \epsilon + \xi_i^* \\ \xi_i, \xi_i^* \geq 0 \end{cases} ⎩⎪⎨⎪⎧yi−wTxi−b≤ϵ+ξiwTxi+b−yi≤ϵ+ξi∗ξi,ξi∗≥0
-
参数说明:
- ξ i , ξ i ∗ \xi_i, \xi_i^* ξi,ξi∗:表示预测误差超过 ϵ \epsilon ϵ 的部分,即超出“管道”外的偏差。
- C C C:控制模型对误差的容忍度,权衡模型复杂度和训练误差。
- ϵ \epsilon ϵ:决定了“ε-不敏感管道”的宽度,影响模型的拟合程度。
🌟 形象比喻:SVR 就像是在数据点周围建立一个宽度为 2 ϵ 2\epsilon 2ϵ 的“管道”,尽可能多的点落在管道内,对管道外的点进行惩罚。
求解方法:
- 与分类 SVM 类似,使用拉格朗日乘子法,将优化问题转换为对偶问题求解。
案例分析与代码实现
为了更好地理解 SVM 的应用,我们通过具体的案例进行演示,包括分类和回归任务。
分类示例
我们以经典的鸢尾花数据集(Iris Dataset)为例,演示 SVM 在多分类问题中的应用。
数据准备
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm, datasets
from sklearn.model_selection import train_test_split# 加载数据集
iris = datasets.load_iris()
X = iris.data[:, :2] # 取前两个特征进行可视化
y = iris.target
数据可视化
# 可视化数据分布
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Set1, edgecolor='k')
plt.xlabel('花萼长度 (cm)')
plt.ylabel('花萼宽度 (cm)')
plt.title('鸢尾花数据集 - 前两个特征')
plt.show()
训练模型
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 定义 SVM 模型,使用 One-vs-One 策略
clf = svm.SVC(decision_function_shape='ovo', kernel='linear', C=1.0)
clf.fit(X_train, y_train)
模型评估
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix# 预测
y_pred = clf.predict(X_test)# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"模型准确率:{accuracy * 100:.2f}%")# 分类报告
print("分类报告:")
print(classification_report(y_test, y_pred))# 混淆矩阵
print("混淆矩阵:")
print(confusion_matrix(y_test, y_pred))
结果可视化
# 绘制决策边界
import matplotlib.patches as mpatches# 创建网格以绘制
x_min, x_max = X[:, 0].min() - 0.5, X[:, 0].max() + 0.5
y_min, y_max = X[:, 1].min() - 0.5, X[:, 1].max() + 0.5
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02),np.arange(y_min, y_max, 0.02))# 预测网格中的每个点的类别
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)# 绘制等高线和训练点
plt.contourf(xx, yy, Z, cmap=plt.cm.Pastel2)
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Set1, edgecolor='k')
plt.xlabel('花萼长度 (cm)')
plt.ylabel('花萼宽度 (cm)')
plt.title('SVM 多分类(One-vs-One)决策边界')
plt.show()
解释:
- 我们使用了线性核函数和 One-vs-One 策略来训练多分类 SVM 模型。
- 绘制了决策边界,展示了模型对不同类别的划分。
- 通过分类报告和混淆矩阵,可以评估模型的性能。
参数调优
为了提升模型性能,可以通过网格搜索(Grid Search)进行参数调优。
from sklearn.model_selection import GridSearchCV# 定义参数网格
param_grid = {'C': [0.1, 1, 10],'kernel': ['linear', 'rbf'],'gamma': ['scale', 'auto']
}# 进行网格搜索
grid_search = GridSearchCV(svm.SVC(decision_function_shape='ovo'), param_grid, cv=5)
grid_search.fit(X_train, y_train)# 输出最佳参数
print("最佳参数:", grid_search.best_params_)# 使用最佳参数训练模型
best_clf = grid_search.best_estimator_
y_pred_best = best_clf.predict(X_test)
accuracy_best = accuracy_score(y_test, y_pred_best)
print(f"调优后模型准确率:{accuracy_best * 100:.2f}%")
回归示例
我们使用一个简单的回归问题,演示 SVR 的应用。
数据准备
import numpy as np
import matplotlib.pyplot as plt
from sklearn.svm import SVR# 生成示例数据
np.random.seed(42)
X = np.sort(5 *np.random.rand(100, 1), axis=0)
y = np.sin(X).ravel()# 添加噪声
y[::5] += 3 * (0.5 - np.random.rand(20))
数据可视化
# 绘制散点图
plt.scatter(X, y, color='darkorange', label='数据')
plt.xlabel('数据')
plt.ylabel('目标值')
plt.title('回归示例数据')
plt.show()
训练模型
# 定义 SVR 模型,使用 RBF 核
svr_rbf = SVR(kernel='rbf', C=100, gamma=0.1, epsilon=0.1)# 训练模型
svr_rbf.fit(X, y)
预测与可视化
# 预测
y_rbf = svr_rbf.predict(X)# 绘图
plt.scatter(X, y, color='darkorange', label='数据')
plt.plot(X, y_rbf, color='navy', lw=2, label='RBF SVR')
plt.xlabel('数据')
plt.ylabel('目标值')
plt.title('支持向量回归示例')
plt.legend()
plt.show()
解释:
- 我们使用了 RBF 核函数的 SVR 模型来拟合非线性数据。
- 参数 C C C、 γ \gamma γ、 ϵ \epsilon ϵ 控制模型的复杂度和拟合程度。
- 结果展示了 SVR 模型对数据的拟合曲线,能够捕捉数据的非线性趋势。
参数调优
同样可以使用网格搜索来优化 SVR 的参数。
from sklearn.model_selection import GridSearchCV# 定义参数网格
param_grid = {'C': [1, 10, 100],'gamma': [0.01, 0.1, 1],'epsilon': [0.1, 0.2, 0.5]
}# 进行网格搜索
grid_search = GridSearchCV(SVR(kernel='rbf'), param_grid, cv=5)
grid_search.fit(X, y)# 输出最佳参数
print("最佳参数:", grid_search.best_params_)# 使用最佳参数训练模型
best_svr = grid_search.best_estimator_
y_best = best_svr.predict(X)# 绘图
plt.scatter(X, y, color='darkorange', label='数据')
plt.plot(X, y_best, color='green', lw=2, label='优化后的 SVR')
plt.xlabel('数据')
plt.ylabel('目标值')
plt.title('支持向量回归 - 参数调优后')
plt.legend()
plt.show()
SVM 的优缺点
优点:
-
高效处理高维数据:在高维空间中仍表现良好,适用于大量特征的数据集。
-
避免过拟合:通过最大化间隔,提升泛化能力,减少对训练数据的依赖。
-
灵活的核函数:可以通过选择不同的核函数适应各种数据分布和特征。
-
少量支持向量:模型只依赖于支持向量,计算效率高,存储需求低。
缺点:
-
对参数和核函数敏感:需要精心调节参数(如 C C C、 γ \gamma γ 等)和选择适当的核函数,参数选择不当可能导致模型性能下降。
-
计算复杂度高:对于大型数据集,训练时间较长,内存需求大,尤其是在使用非线性核函数时。
-
缺乏概率估计:SVM 的输出不是直接的概率,需要使用方法(如 Platt Scaling)进行概率估计,增加了模型的复杂度。
-
对缺失数据敏感:SVM 无法直接处理缺失数据,需要预处理。
应用场景
-
文本分类和情感分析:如垃圾邮件检测、新闻分类、评论情感分析。
-
图像识别与分类:如手写数字识别(MNIST 数据集)、人脸识别、物体分类。
-
生物信息学:如基因表达数据分析、蛋白质结构预测、疾病诊断。
-
金融预测:如股票价格预测、信用风险评估、欺诈检测。
-
医学诊断:如癌症检测、医学图像分析、患者分类。
-
语音识别:如语音情感分析、语者识别。
🌟 实际案例:
-
手写数字识别:SVM 在 MNIST 数据集上取得了高准确率,被广泛用于手写体识别系统。
-
人脸检测:使用 SVM 与 Haar 特征结合,实现了快速而准确的人脸检测,被应用于相机、社交媒体等领域。
-
垃圾邮件过滤:SVM 能够有效区分垃圾邮件和正常邮件,提高了邮件系统的安全性。
总结
支持向量机(SVM)作为一种强大的机器学习算法,具有坚实的理论基础和广泛的应用前景。通过最大化间隔和引入核函数,SVM 能够有效地解决线性和非线性问题。在多分类问题中,One-vs-Rest 和 One-vs-One 策略提供了灵活的解决方案。支持向量回归(SVR)扩展了 SVM 的应用范围,使其能够处理回归问题。
在实际应用中,SVM 的性能取决于参数的选择和核函数的设置。通过深入理解 SVM 的原理,并结合数据的特点,我们可以充分发挥 SVM 的优势,解决各种复杂的机器学习问题。
希望这篇博客能够帮助你全面深入地理解 SVM,为你的机器学习之路增添一份助力!😊
参考资料
- 《统计学习方法》,李航著
- Pattern Recognition and Machine Learning,Christopher M. Bishop 著
- Scikit-Learn 官方文档:https://scikit-learn.org/stable/modules/svm.html
- Vladimir Vapnik 的相关论文
- Stanford CS229 Lecture Notes:http://cs229.stanford.edu/
- 机器学习,周志华著
如果你对 SVM 还有任何疑问,欢迎在评论区留言,我们一起讨论!🚀
🎉 感谢阅读!
希望这篇博客对你有所帮助,祝你学习愉快!
相关文章:

【ShuQiHere】 支持向量机(SVM)详解:从理论到实践,这一篇就够了
📖 【ShuQiHere】 在现代机器学习课程中,支持向量机(SVM) 是不可或缺的一部分。它不仅在分类任务中有出色表现,还能灵活处理回归问题。尽管看似复杂,SVM 背后的思想却深刻而优雅。今天我们将全面探讨**支持…...

log4j2线程级动态日志级别
详见 参考 着重说明: DynamicThresholdFilter: 配置长这样:配置解释链接 <DynamicThresholdFilter key"logLevel" defaultThreshold"ERROR" onMatch"ACCEPT" onMismatch"DENY"><KeyVa…...

百度Android IM SDK组件能力建设及应用
作者 | 星途 导读 移动互联网时代,随着社交媒体、移动支付、线上购物等行业的快速发展,对即时通讯功能的需求不断增加。对于各APP而言,接入IM SDK(即时通讯软件开发工具包)能够大大降低开发成本、提高开发效率&#…...

CSS-Grid布局详解
前言 Grid 栅格布局 是 CSS 语言中非常强大的种布局,它提供了丰富的工具属性,可以轻松实现复杂且灵活的布局设计,因此想要完美使用CSS Grid 也有一定的难度和复杂性,我自己也是花了不少时间才真正掌握它的使用,在这篇…...

Give azure openai an encyclopedia of information
题意:给 Azure OpenAI 提供一部百科全书式的信息 问题背景: I am currently dabbling in the Azure OpenAI service. I want to take the default model and knowledge base and now add on to it my own unique information. So, for example, for mak…...

Nginx越界读取缓存漏洞(CVE-2017-7529)
漏洞原理: 影响版本内默认配置模块的Nginx只需要开启缓存,攻击者可以通过发送包含恶意构造range域的header请求进行远程攻击造成信息泄露。 影响范围: Nginx 0.5.6 – 1.13.2 漏洞复现: 开启靶场,访问8080端口 中间…...

【MySQL】查询语句之inner、left、right、full join 的区别
前言: INNER JOIN 和 OUTER JOIN 是SQL中常用的两种连接方式,用于从两表活多表中提取相关的数据。两者区别主要在于返回的 结果集 如何处理 匹配 与 不匹配 的行。 目录 1、INNER JOIN 2、OUTER JOIN 3、总结 1、INNER JOIN 称为内连接,只…...

Submariner 部署全过程
Submariner 部署全过程 部署集群配置 broker 集群: pod-cidr:11.244.0.0/16 service-cidr 11.96.0.0/12 broker 172.100.0.109 node 172.100.0.108 集群 1( pve3 ): pod-cidr:10.244.0.0/16 service-…...

驼峰命名法
一、驼峰命名法简介 驼峰命名法(Camel Case)是一种在编程和人类语言中广泛使用的书写方式,通过将单词连接在一起,并使每个单词的首字母大写来表示复合词或短语。这种命名法有小驼峰法和大驼峰法两种变种。 二、小驼峰命名法&…...

Android IME输入法启动显示隐藏流程梳理
阅读Android AOSP 12版本代码,对输入法IME整体框架模块进行学习梳理,内容包含输入法框架三部分IMM、IMMS、IMS的启动流程、点击弹出流程、显示/隐藏流程,以及常见问题和调试技巧。 1. IME整体框架 IME整体分为三个部分…...

Java 入门指南:JVM(Java虚拟机)——类的生命周期与加载过程
文章目录 类的生命周期类加载过程1)载入(Loading)2)验证(Verification)文件格式验证符号引用验证 3)准备(Preparation)4)解析(Resolution…...

Unity射击游戏开发教程:(36)敌人关卡生成器的设计和开发
丰富多样地游戏关卡生成器能自动生成不同的关卡地图和游戏内容,以增加游戏的可玩性和挑战性。关卡生成可以基于随机算法或者预设的规则生成不同的地图布局、敌人位置、道具位置等。 定义关卡生成器WaveSpawner 如何设置通用的 Wave Spawner?我将此 Wave Spawner 脚本附加到…...

AI对汽车行业的冲击和比亚迪新能源汽车市场占比
人工智能(AI)对汽车行业的冲击正在迅速改变该行业的面貌,从智能驾驶到生产自动化,再到个性化的消费者体验,AI带来的技术革新在各个层面影响着汽车产业。与此同时,新能源汽车市场,特别是以比亚迪…...

2024年中国电子学会青少年软件编程(Python)等级考试(一级)核心考点速查卡
考前练习: 2024年06月中国电子学会青少年软件编程(Python)等级考试试卷(一级)答案 解析-CSDN博客 2024年03月中国电子学会青少年软件编程(Python)等级考试试卷(一级)答…...

游戏开发引擎__游戏场景(灯光,摄像机)
1.灯光 重要参数介绍 类型: 控制灯光的类型,有“定向”“点”“区域”和“聚光”4种模式。颜色: 控制灯光的颜色。模式: 控制灯光的光照模式,有“实时”“混合”和“烘焙”3种模式。强度: 控制灯光的明亮程度。间接乘数: 改变间接光的强度。阴影类型: …...

2024 Snap 新款ar眼镜介绍
2024 snap 新款ar眼镜介绍 2024 Snap 新款ar眼镜介绍 咨询合作 DataBall 项目,欢迎加以下微信。 助力快速掌握数据集的信息和使用方式。...

uni-app生命周期
目录 一、页面生命周期 1、onLoad 【常用】 2、onShow【常用】 3、onReady【常用】 4、onHide【常用】 5、onPullDownRefresh【常用】 6、onReachBottom【常用】 二、应用生命周期 1、onLaunch【常用】 2、onShow【常用】 3、onHide【常用】 三、组件生命周期 1、…...

LabVIEW机械产品几何精度质检系统
随着制造业的发展,对产品质量的要求越来越高,机械产品的几何精度成为衡量其品质的重要指标。为了提高检测效率和精度,开发了一套基于LabVIEW的几何精度质检系统,该系统不仅可以自动化地进行几何尺寸的测量,而且能实时分…...

java 检测图片链接有没有效
实际需求:发送调用微信图片发送接口前检验图片有效性。 在 Java 中,检测图片链接是否有效可以通过发送 HTTP 请求来判断服务器返回的状态码。通过 HttpURLConnection 类,可以轻松地实现这个功能。以下是一个简单的示例代码来检测图片链接是否…...

测试工程师学历路径:从功能测试到测试开发
现在软件从业者越来越多,测试工程师的职位也几近饱和,想要获得竞争力还是要保持持续学习。基本学习路径可以从功能测试-自动化测试-测试开发工程师的路子来走。 功能测试工程师: 1、软件测试基本概念: 学习软件测试的定义、目的…...

JavaEE---Spring IOC(2)
DI之三种注入 属性注入 构造方法注入 Setter注入 当程序中同一个类有多个对象的时候会报错解决方法如下: AutoWired和Resource的区别...

Oracle字符集
select userenv(language) from dual;如果显示如下,一个汉字占用两个字节 SIMPLIFIED CHINESE_CHINA.ZHS16GBK如果显示如下,一个汉字占用三个字节 SIMPLIFIED CHINESE_CHINA.AL32UTF8可以用以下语句查询一个汉字占用的字节长度 select lengthb(你) fr…...

RabbitMQ 常见使用模式详解
RabbitMQ 常见使用模式详解 RabbitMQ 是一个强大的消息队列中间件,支持多种消息通信模式,能够适应不同的业务场景。在这篇文章中,我们将详细介绍 RabbitMQ 的几种常见使用方法及其对应的场景。 1. 发布/订阅(Publish/Subscribe&a…...

JavaEE初阶——初识EE(Java诞生背景,CPU详解)
阿华代码,不是逆风,就是我疯,你们的点赞收藏是我前进最大的动力!!希望本文内容能帮到你! 目录 零:Java的发展背景介绍 一:EE的概念 二:计算机的构成 1:CU…...

iOS界面布局:屏幕尺寸与安全区域全面指南
引言 随着iPhone和iPad的更新迭代,iOS设备的屏幕尺寸和设计也在不断变化。无论是iPhone X系列的刘海屏,还是最新的iPhone 14,开发者都需要面对适配不同设备布局的问题。在项目开发中,导航栏、状态栏、TabBar的高度以及安全区域的…...

javascript-代码执行原理
js 是解释型语言 js 引擎执行流程 分为两个阶段: 语法分析执行阶段执行阶段涉及的数据结构: 调用栈。处理执行上下文和执行代码内存堆。给对象分配内存任务队列。暂存待执行的任务,分为宏任务队列和微任务队列语法分析 词法分析 > 语法分析 > 代码生成(字节码) …...

【C++ | tips】const Date* operator() const中这两个const有什么区别?他们的作用是什么?
const Date* operator&() const { return this; } 我们要明白operator&()这个函数是做什么的。 在C中,&操作符通常用于获取一个对象的地址。但是,有时候我们想要自定义这个行为,比如说,我们想要控制别人怎么获取…...

开放的数据时代:Web3和个人隐私的未来
在数字化和信息化的时代,数据隐私成为了公众关注的焦点。随着Web3技术的兴起,个人隐私保护进入了一个新的阶段。Web3作为去中心化的互联网架构,提出了对数据控制和隐私保护的新方案。本文将探讨Web3如何影响个人隐私的未来,并分析…...

Kafka 安全机制详解及配置指南
个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] 📱…...

渗透测试综合靶场 DC-2 通关详解
一、准备阶段 准备工具如Kali Linux,下载并设置DC-2靶场机。确保攻击机和靶机在同一网络段,通常设置为桥接模式或NAT模式。 1.1 靶机描述 Much like DC-1, DC-2 is another purposely built vulnerable lab for the purpose of gaining experience in …...