【ShuQiHere】 支持向量机(SVM)详解:从理论到实践,这一篇就够了

📖 【ShuQiHere】

在现代机器学习课程中,支持向量机(SVM) 是不可或缺的一部分。它不仅在分类任务中有出色表现,还能灵活处理回归问题。尽管看似复杂,SVM 背后的思想却深刻而优雅。今天我们将全面探讨**支持向量机(Support Vector Machine,SVM)**的全部知识点,涵盖其基础概念、数学推导、核函数、分类策略(如 One-vs-One、One-vs-Rest)、回归分析,以及在实际应用中的代码实现。希望这篇博客能帮助你全面深入地理解 SVM!🚀


目录

  1. 引言
  2. SVM 的背景与简介
  3. SVM 的基本概念
    • 线性可分与线性不可分数据
    • 最大间隔分类器(Maximum Margin Classifier)
    • 支持向量(Support Vectors)
  4. SVM 的数学推导
    • 原始问题(Primal Problem)
    • 对偶问题(Dual Problem)
    • 拉格朗日乘子法(Lagrange Multipliers)
  5. 核函数与非线性 SVM
    • 为什么需要核函数?
    • 常见核函数(Kernel Functions)
  6. 软间隔 SVM(Soft Margin SVM)
    • 松弛变量(Slack Variables)
    • 惩罚参数 C 的作用
  7. 多分类 SVM
    • One-vs-Rest(OvR,一对多)
    • One-vs-One(OvO,一对一)
  8. 支持向量回归(SVR)
    • ε-不敏感损失函数(ε-Insensitive Loss Function)
    • SVR 的优化问题
  9. 案例分析与代码实现
    • 分类示例
    • 回归示例
  10. SVM 的优缺点
  11. 应用场景
  12. 总结
  13. 参考资料

引言

在机器学习领域,支持向量机(SVM)是一种强大的工具,广泛应用于分类和回归任务中。它以其坚实的理论基础和卓越的性能,在各种实际问题中得到了成功应用。

SVM 的独特之处在于它通过寻找最佳的分隔超平面来最大化分类间隔,从而实现对未知数据的良好泛化能力。无论是在处理高维数据、非线性问题,还是在应对小样本、复杂数据结构时,SVM 都表现出了强大的适应性。

让我们一起深入了解 SVM 的方方面面,揭开其神秘的面纱吧!🌟


SVM 的背景与简介

什么是支持向量机?

**支持向量机(Support Vector Machine,SVM)**是一种监督学习模型,用于解决分类和回归问题。它的核心思想是找到一个能够以最大间隔将不同类别的数据分开的超平面。

  • 主要特点
    • 高效性:在高维空间中仍然表现出色,避免了维度灾难。
    • 灵活性:通过核函数处理非线性问题,实现了线性模型在高维特征空间的非线性映射。
    • 泛化能力强:基于结构风险最小化原则,减少过拟合,提升对未知数据的预测能力。

历史背景

  • 20 世纪 60 年代:SVM 的理论基础由 Vladimir VapnikAlexey 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 xiRn 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 21w2

    这里的 ∥ 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,α)=21w2i=1nαi[yi(wTxi+b)1]

其中 α i ≥ 0 \alpha_i \geq 0 αi0 为拉格朗日乘子。

求解过程

  1. 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 wL=wi=1nαiyixi=0w=i=1nα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 bL=i=1nαiyi=0i=1nαiyi=0

  2. 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=1nαi21i,j=1nα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} {αi0,i=1,2,,ni=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=1nαiyixiTx+b)

    注意,只有对应于支持向量的 α i \alpha_i αi 不为零。


核函数与非线性 SVM

为什么需要核函数?

当数据线性不可分时,我们需要将数据映射到更高维的空间,使其在高维空间中线性可分。

  • 映射函数(Mapping Function) ϕ : R n → R H \phi: \mathbb{R}^n \rightarrow \mathbb{R}^H ϕ:RnRH,将原始数据映射到高维特征空间。

  • 问题:直接计算高维空间的内积计算量大,可能导致维度灾难。

核技巧(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)

  1. 线性核(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

    • 应用场景:数据线性可分,或高维稀疏数据,如文本分类中的词袋模型。
  2. 多项式核(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:多项式的度数,决定了非线性的程度。
    • 特点:能够表示特征之间的高阶交互。

  3. 高斯核(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(γxixj2)

    • 参数

      • γ \gamma γ:控制高斯函数的宽度, γ > 0 \gamma > 0 γ>0
    • 特点:具有局部性,能够处理复杂的非线性关系,特征空间是无限维的。

  4. 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,ξi0

    • ξ i = 0 \xi_i = 0 ξi=0 时,第 i i i 个样本被正确分类且在间隔外。
    • 0 < ξ i ≤ 1 0 < \xi_i \leq 1 0<ξi1 时,样本被正确分类但在间隔内。
    • ξ 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 21w2+Ci=1nξi

    • 第一项 1 2 ∥ w ∥ 2 \frac{1}{2} \|w\|^2 21w2:最大化间隔。
    • 第二项 C ∑ i = 1 n ξ i C \sum_{i=1}^n \xi_i Ci=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,一对多)

  • 思想:将多分类问题拆解为多个二分类问题,每个类别与其他类别进行分类。

  • 步骤

    1. 对于每个类别 i i i,训练一个 SVM,将该类别的样本作为正类,其他类别的样本作为负类。
    2. 共训练 k k k 个 SVM 模型, k k k 为类别数量。
    3. 预测时:将样本输入所有模型,选择输出得分最高的类别。
  • 优点

    • 实现简单,计算效率较高。
    • 适用于类别数量较多的情况。
  • 缺点

    • 当类别不平衡时,可能导致分类性能下降。
    • 存在类别之间的偏置问题。

One-vs-One(OvO,一对一)

  • 思想:对每一对类别组合,训练一个 SVM 模型。

  • 步骤

    1. 对于 k k k 个类别,共训练 k ( k − 1 ) 2 \frac{k(k-1)}{2} 2k(k1) 个 SVM 模型。
    2. 每个模型在两类样本上训练,忽略其他类别。
    3. 预测时:采用投票机制,样本分类为得票最多的类别。
  • 优点

    • 模型在较小的数据集上训练,速度快。
    • 对类别不平衡不敏感。
  • 缺点

    • 当类别数量较多时,模型数量急剧增加,计算成本高。
    • 预测时需要评估多个模型,可能影响实时性。

🌟 选择策略的建议

  • 当类别数量较少时,优先选择 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,yf(x)ϵ,if yf(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 21w2+Ci=1n(ξ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} yiwTxibϵ+ξiwTxi+byiϵ+ξiξi,ξi0

  • 参数说明

    • ξ 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 的优缺点

优点

  1. 高效处理高维数据:在高维空间中仍表现良好,适用于大量特征的数据集。

  2. 避免过拟合:通过最大化间隔,提升泛化能力,减少对训练数据的依赖。

  3. 灵活的核函数:可以通过选择不同的核函数适应各种数据分布和特征。

  4. 少量支持向量:模型只依赖于支持向量,计算效率高,存储需求低。

缺点

  1. 对参数和核函数敏感:需要精心调节参数(如 C C C γ \gamma γ 等)和选择适当的核函数,参数选择不当可能导致模型性能下降。

  2. 计算复杂度高:对于大型数据集,训练时间较长,内存需求大,尤其是在使用非线性核函数时。

  3. 缺乏概率估计:SVM 的输出不是直接的概率,需要使用方法(如 Platt Scaling)进行概率估计,增加了模型的复杂度。

  4. 对缺失数据敏感:SVM 无法直接处理缺失数据,需要预处理。


应用场景

  • 文本分类和情感分析:如垃圾邮件检测、新闻分类、评论情感分析。

  • 图像识别与分类:如手写数字识别(MNIST 数据集)、人脸识别、物体分类。

  • 生物信息学:如基因表达数据分析、蛋白质结构预测、疾病诊断。

  • 金融预测:如股票价格预测、信用风险评估、欺诈检测。

  • 医学诊断:如癌症检测、医学图像分析、患者分类。

  • 语音识别:如语音情感分析、语者识别。

🌟 实际案例

  • 手写数字识别:SVM 在 MNIST 数据集上取得了高准确率,被广泛用于手写体识别系统。

  • 人脸检测:使用 SVM 与 Haar 特征结合,实现了快速而准确的人脸检测,被应用于相机、社交媒体等领域。

  • 垃圾邮件过滤:SVM 能够有效区分垃圾邮件和正常邮件,提高了邮件系统的安全性。


总结

支持向量机(SVM)作为一种强大的机器学习算法,具有坚实的理论基础和广泛的应用前景。通过最大化间隔和引入核函数,SVM 能够有效地解决线性和非线性问题。在多分类问题中,One-vs-Rest 和 One-vs-One 策略提供了灵活的解决方案。支持向量回归(SVR)扩展了 SVM 的应用范围,使其能够处理回归问题。

在实际应用中,SVM 的性能取决于参数的选择和核函数的设置。通过深入理解 SVM 的原理,并结合数据的特点,我们可以充分发挥 SVM 的优势,解决各种复杂的机器学习问题。

希望这篇博客能够帮助你全面深入地理解 SVM,为你的机器学习之路增添一份助力!😊


参考资料

  1. 《统计学习方法》,李航著
  2. Pattern Recognition and Machine Learning,Christopher M. Bishop 著
  3. Scikit-Learn 官方文档:https://scikit-learn.org/stable/modules/svm.html
  4. Vladimir Vapnik 的相关论文
  5. Stanford CS229 Lecture Notes:http://cs229.stanford.edu/
  6. 机器学习,周志华著

如果你对 SVM 还有任何疑问,欢迎在评论区留言,我们一起讨论!🚀

🎉 感谢阅读!

希望这篇博客对你有所帮助,祝你学习愉快!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/879464.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python VS Golng 谁更胜一筹?

今天我们聊聊Python和Golang这俩到底谁更胜一筹。 这个话题我已经在各种技术论坛上看到无数次了&#xff0c;每次都能引起一波热烈的讨论。作为一个多年写代码的老程序员&#xff0c;今天就站在我的角度&#xff0c;和大家掰扯掰扯这两个语言各自的优缺点。 1. 性能与并发模型…

小程序渗透 | 利用ce修改器挖掘内存修改漏洞

CE修改器原理 ce修改器可以修改内存数值&#xff0c;因为有些程序会把一些值放在本地&#xff0c;然后改动的时候访问的本地的值&#xff0c;修改之后&#xff0c;客户端服务器再次发生交互的时候&#xff0c;把修改的值发出去&#xff0c;可能会影响到服务器的数据&#xff0…

【sgCreateCallAPIFunction】自定义小工具:敏捷开发→调用接口方法代码生成工具

<template><div :class"$options.name" class"sgDevTool"><sgHead /><div class"sg-container"><div class"sg-start"><div style"margin-bottom: 10px">调用接口方法定义列表</div…

五种数据库特性对比(Redis/Mysql/SQLite/ES/MongoDB)

做后端开发的程序员基本都要学会数据库的相关知识。 1、关系型数据 今天就着这段时间了解大模型的事需要牵扯到是我们接触最多的、也是入门后端必学的关系型数据库。在关系型数据库中&#xff0c;数据以表的形式进行组织和存储&#xff0c;每个表就像一个 Excel 表格&#xf…

superset 解决在 mac 电脑上发送 slack 通知的问题

参考文档: https://superset.apache.org/docs/configuration/alerts-reports/ 核心配置: FROM apache/superset:3.1.0USER rootRUN apt-get update && \apt-get install --no-install-recommends -y firefox-esrENV GECKODRIVER_VERSION0.29.0 RUN wget -q https://g…

Windows 常用的键盘快捷键总结

在日常工作或学习中&#xff0c;使用键盘快捷键不仅能够显著提高操作速度&#xff0c;还可以减少对鼠标的依赖&#xff0c;提升整体工作效率。Windows 操作系统为用户提供了众多功能强大的键盘快捷键&#xff0c;覆盖了不同方面&#xff0c;下面就给大家总结了常用的键盘快捷键…

工业互联网网络集成与实训系统解决方案

随着工业4.0时代的到来和信息技术的高速发展&#xff0c;工业互联网已成为推动产业升级的重要力量。本方案旨在通过构建高度仿真的实训环境&#xff0c;帮助学生全面掌握工业互联网技术&#xff0c;为未来的职业生涯奠定坚实基础。 一、设计理念 在设计理念上&#xff0c;本方…

如何在 Visual Studio Code 中反编译具有正确行号的 Java 类?

优质博文&#xff1a;IT-BLOG-CN 问题 我在 macOS 中使用 vscode 版本 1.92.2&#xff0c;并安装了Java 扩展包v0.29.0。当我打开command click或right click->Go to definition一个没有源代码的类时&#xff0c;vscode 会使用 FernFlower 反编译器打开 .class 文件。但…

【算法】滑动窗口—最小覆盖子串

题目 ”最小覆盖子串“问题&#xff0c;难度为Hard&#xff0c;题目如下&#xff1a; 给你两个字符串 S 和 T&#xff0c;请你在 S 中找到包含 T 中全部字母的最短子串。如果 S 中没有这样一个子串&#xff0c;则算法返回空串&#xff0c;如果存在这样一个子串&#xff0c;则可…

思通数科开源产品:免费的AI视频监控卫士安装指南

准备运行环境&#xff1a; 确保您的服务器或计算机安装了Ubuntu 18.04 LTS操作系统。 按照产品要求&#xff0c;安装以下软件&#xff1a; - Python 3.9 - Java JDK 1.8 - MySQL 5.5 - Redis 2.7 - Elasticsearch 8.14 - FFmpeg 4.1.1 - RabbitMQ 3.13.2 - Minio &#xff08;…

MySQL_表的基本操作

课 程 推 荐我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448;入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448;虚 拟 环 境 搭 建 &#xff1a;&#x1…

Java 入门指南:JVM(Java虚拟机)垃圾回收机制 —— 新一代垃圾回收器 ZGC 收集器

文章目录 垃圾回收机制垃圾收集器垃圾收集器分类ZGC 收集器ZGC 的性能优势复制算法指针染色读屏障 ZGC 的工作过程Stop-The-World 暂停阶段并发阶段 垃圾回收机制 垃圾回收&#xff08;Garbage Collection&#xff0c;GC&#xff09;&#xff0c;顾名思义就是释放垃圾占用的空…

2011年全国硕士研究生入学统一考试计算机科学与技术

1. 试卷背景&#xff1a; 试题&#xff1a;2011年全国硕士研究生入学统一考试计算机科学与技术学科联考中的计算机学科专业基础综合试题。难点&#xff1a;该问题的研究难点在于试题涵盖了计算机科学与技术的多个方面&#xff0c;包括数据结构、算法、计算机组成原理、操作系统…

直流无刷电机霍尔线序自学习解释

直流无刷电机霍尔线序自学习 步骤详解 1. 初始连接 连接电机的三相线&#xff1a;A、B、C。连接霍尔传感器线&#xff1a;HA、HB、HC。 2. 输入电压组合与霍尔信号记录 电机的电压输入组合和霍尔信号记录是电机控制系统中至关重要的一部分&#xff0c;它们决定了电机的运转…

图书馆座位预约系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;图书馆管理&#xff0c;座位信息管理&#xff0c;预约选座管理&#xff0c;签到信息管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;论坛&#xf…

「C++系列」异常处理

【人工智能教程】&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。 点击跳转到网站&#xff1a;【人工智能教程】 文章目录 一、异常处理1. 基本概念2. 示例代码3. 注意事项 二、常见的异常类…

Linux进程间通信——探索共享内存—— 剖析原理, 学习接口应用

前言&#xff1a;本节内容主要讲解进程间通信的&#xff0c; systemV版本下的共享内存。 共享内存&#xff0c;顾名思义&#xff0c; 其实就是一块内存&#xff0c; 它不同于管道是一个文件。 所以它的传输速度是很快的。 因为管道是文件&#xff0c;有缓冲区&#xff0c; 而共…

【新手上路】衡石分析平台使用手册-租户管理

租户管理​ 衡石系统支持服务一个平台方和多个企业客户的租户模式&#xff0c;平台方管理租户&#xff0c;为租户提供数据&#xff0c;租户在系统内进行数据分析。 衡石系统增加工作空间的设计&#xff0c;在平台方和租户之间提供单向的传递通道&#xff0c;平台厂商可以轻松…

时序数据库 TDengine 的入门体验和操作记录

时序数据库 TDengine 的学习和使用经验 什么是 TDengine &#xff1f;什么是时序数据 &#xff1f;使用RPM安装包部署默认的网络端口 TDengine 使用TDengine 命令行&#xff08;CLI&#xff09;taosBenchmark服务器内存需求删库跑路测试 使用体验文档纠错 什么是 TDengine &…

C# 使用代码清理 以及禁用某个代码清理

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…