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

news/2024/9/19 21:16:29 标签: 支持向量机, 算法, 机器学习

📖 【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.niftyadmin.cn/n/5666150.html

相关文章

使用Docker安装 Skywalking(单机版)

使用Docker安装 Skywalking&#xff08;单机版&#xff09; 文章目录 使用Docker安装 Skywalking&#xff08;单机版&#xff09;Skywalking 介绍Skywalking 安装 Skywalking 介绍 Skywalking官网 分布式系统的应用程序性能监视工具&#xff0c;专为微服务、云原生架构和基于容…

【Unity】检测鼠标点击位置是否有2D对象

在这里提供两种方案&#xff0c;一种是射线检测&#xff0c;另一种是非射线检测。 初始准备步骤&#xff1a; 创建2D对象&#xff08;比如2D精灵&#xff09;给要被检测的2D对象添加2D碰撞体&#xff08;必须是2D碰撞体&#xff09;创建一个空对象&#xff0c;再创建一个检测…

简单题35-搜索插入位置(Java and Python)20240919

问题描述&#xff1a; Java&#xff1a; class Solution {public int searchInsert(int[] nums, int target) {int k 0;int i 0;while(i<nums.length){if(nums[i]target){return i;}if(nums[i]<target){k i1;}i;}return k;}}class Solution(object):def searchInsert(…

STM32MP157/linux驱动学习记录(二)

38.Linux INPUT 子系统实验 按键、鼠标、键盘、触摸屏等都属于输入(input)设备&#xff0c;Linux 内核为此专门做了一个叫做 input子系统的框架来处理输入事件。输入设备本质上还是字符设备&#xff0c;只是在此基础上套上了 input 框架&#xff0c;用户只需要负责上报输入事件…

SRE实例的一些结构图

SRE实例的一些结构图 一&#xff1a;直播 二&#xff1a;技术复杂性和运维着力点 对运维质量和运维人员技能提出了更高的要求 如果一个屏幕上十几个窗口&#xff0c;各种刷屏&#xff0c;但却不彻底解决问题&#xff0c;这时就需要用更好的方式——自动化、系统化、工具化的…

【百日算法计划】:每日一题,见证成长(017)

题目 用栈来实现队列 思路1 入队直接入&#xff0c;出队用两个栈来回倒腾。 static class StackToQueue{Stack<Integer> stack new Stack<>();Stack<Integer> tmpStack new Stack<>(); //临时栈public StackToQueue(){}//入队 直接入public void…

[性能]RK芯片平台定时读取ISP延迟

在AI识别中一些高速场景下会比较敏感&#xff0c;ISP处理延迟会造成AI响应滞后&#xff0c;可以使用以下脚本来每隔1秒读取文件/proc/rkispp0&#xff1a; #!/bin/bashwhile true; docat /proc/rkispp0sleep 1 done将以上脚本保存为一个.sh文件&#xff08;例如read_rkispp0.s…

PHP 数组排序类型介绍

在PHP中&#xff0c;数组排序是一项常见且重要的操作&#xff0c;它允许开发者根据一定的规则对数组中的元素进行排序。PHP提供了多种数组排序函数&#xff0c;以适应不同的排序需求。这些函数包括基本的升序和降序排序&#xff0c;以及基于特定键值、自定义排序逻辑等的复杂排…