复现SMO算法:序列最小优化的启发式方法【三、算法原理揭秘-2】

2024-05-01 11:44

本文主要是介绍复现SMO算法:序列最小优化的启发式方法【三、算法原理揭秘-2】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

接下来的内容将转向SMO算法的第二个核心组成部分——选择要优化的乘数的启发式方法。在这篇博客中,我们将探讨算法如何通过启发式选择策略高效地识别更新拉格朗日乘数。通过对比直接优化的分析方法和启发式方法的策略选择,我们能够更全面地理解SMO算法在解决支持向量机(SVM)优化问题中的独特优势。

二、选择要优化的乘数的启发式方法

SMO算法包含两个主要步骤:选择需要优化的拉格朗日乘数对和优化这些乘数。算法采用启发式方法选择乘数对,加快收敛速度并确保选择的对最可能迅速改善模型性能。

1.外层循环 - 选择 α 1 \alpha_1 α1

  • 遍历所有训练样本,识别违反KKT条件最严重的样本作为 α 1 \alpha_1 α1
  • 如果某个样本不满足以下条件之一,它就被认为违反了KKT条件:
    • 如果 α i = 0 \alpha_i = 0 αi=0,则要求 y i u i ≥ 1 y_i u_i \geq 1 yiui1
    • 如果 0 < α i < C 0 < \alpha_i < C 0<αi<C,则要求 y i u i = 1 y_i u_i = 1 yiui=1
    • 如果 α i = C \alpha_i = C αi=C,则要求 y i u i ≤ 1 y_i u_i \leq 1 yiui1
  • 如果所有在边界上的支持向量满足KKT条件,则扩展搜索至整个训练集。

2.内层循环 - 选择 α 2 \alpha_2 α2

  • 选择使得 ∣ E 1 − E 2 ∣ |E_1 - E_2| E1E2 最大的 α 2 \alpha_2 α2,其中 E i = u i − y i E_i = u_i - y_i Ei=uiyi 是样本 i i i 的预测误差,这有助于实现 α 2 \alpha_2 α2 的最大变化。

3. 计算和更新 α 1 \alpha_1 α1 α 2 \alpha_2 α2

推导过程,请见博客:复现SMO算法:深入探索序列最小优化的分析方法【三、算法原理揭秘-1】

在SMO算法中, α 1 \alpha_1 α1 α 2 \alpha_2 α2 的优化是算法的核心。这两个乘数的更新是通过解析方法完成的,目的是最大化SVM的目标函数。这一过程可以分为几个步骤:

  1. 计算误差差值
    E 1 = u 1 − y 1 , E 2 = u 2 − y 2 E_1 = u_1 - y_1, \quad E_2 = u_2 - y_2 E1=u1y1,E2=u2y2
    其中, u i u_i ui 是模型对第 i i i 个样本的预测输出, y i y_i yi 是实际标签。

  2. 计算二乘数的上下界
    为了满足约束条件 0 ≤ α i ≤ C 0 \leq \alpha_i \leq C 0αiC ∑ i = 1 N α i y i = 0 \sum_{i=1}^{N} \alpha_i y_i = 0 i=1Nαiyi=0,我们需要计算 α 2 \alpha_2 α2 的上下界(L 和 H)。

    • 如果 y 1 ≠ y 2 y_1 \neq y_2 y1=y2
      L = max ⁡ ( 0 , α 2 o l d − α 1 o l d ) , H = min ⁡ ( C , C + α 2 o l d − α 1 o l d ) L = \max(0, \alpha_2^{old} - \alpha_1^{old}), \quad H = \min(C, C + \alpha_2^{old} - \alpha_1^{old}) L=max(0,α2oldα1old),H=min(C,C+α2oldα1old)
    • 如果 y 1 = y 2 y_1 = y_2 y1=y2
      L = max ⁡ ( 0 , α 1 o l d + α 2 o l d − C ) , H = min ⁡ ( C , α 1 o l d + α 2 o l d ) L = \max(0, \alpha_1^{old} + \alpha_2^{old} - C), \quad H = \min(C, \alpha_1^{old} + \alpha_2^{old}) L=max(0,α1old+α2oldC),H=min(C,α1old+α2old)
  3. 计算 α 2 \alpha_2 α2 的新值
    α 2 \alpha_2 α2 的新值由下式给出:
    α 2 n e w = α 2 o l d + y 2 ( E 1 − E 2 ) η \alpha_2^{new} = \alpha_2^{old} + \frac{y_2 (E_1 - E_2)}{\eta} α2new=α2old+ηy2(E1E2)
    其中, η \eta η 是核函数 K ( x 1 , x 2 ) K(x_1, x_2) K(x1,x2) 的二阶导数,可以理解为对问题的“曲率”或调整步幅的影响因子。

  4. 剪辑 α 2 \alpha_2 α2
    α 2 n e w \alpha_2^{new} α2new 需要在其界限 L 和 H 之间被剪辑:
    α 2 n e w , c l i p p e d = min ⁡ ( max ⁡ ( α 2 n e w , L ) , H ) \alpha_2^{new, clipped} = \min(\max(\alpha_2^{new}, L), H) α2new,clipped=min(max(α2new,L),H)

  5. 更新 α 1 \alpha_1 α1
    根据 α 2 \alpha_2 α2 的变化更新 α 1 \alpha_1 α1
    α 1 n e w = α 1 o l d + y 1 y 2 ( α 2 o l d − α 2 n e w , c l i p p e d ) \alpha_1^{new} = \alpha_1^{old} + y_1 y_2 (\alpha_2^{old} - \alpha_2^{new, clipped}) α1new=α1old+y1y2(α2oldα2new,clipped)

更新偏置 b b b 和误差 E i E_i Ei

  • 根据新的乘数值重新计算偏置 b b b
    b n e w = b o l d − Δ b b_{new} = b_{old} - \Delta b bnew=boldΔb
  • Δ b \Delta b Δb 根据 α 1 \alpha_1 α1 α 2 \alpha_2 α2 的变化量及其对应样本的 y i y_i yi E i E_i Ei 值计算得出。
  • 重新计算所有样本的误差 E i E_i Ei
    E i = ( w T x i + b ) − y i E_i = (\mathbf{w}^T \mathbf{x}_i + b) - y_i Ei=(wTxi+b)yi
  • 更新权重向量 w \mathbf{w} w
    w = ∑ j = 1 m α j y j x j \mathbf{w} = \sum_{j=1}^m \alpha_j y_j \mathbf{x}_j w=j=1mαjyjxj

关键问题解析

问题一:如何判定违反KKT条件最严重?

违反KKT条件的程度是通过样本的乘数 α i \alpha_i αi 和它们的函数间隔 y i u i y_i u_i yiui 的关系来判定的。具体方法如下:

  • α i = 0 \alpha_i = 0 αi=0 的样本:理论上应满足 y i u i ≥ 1 y_i u_i \geq 1 yiui1。如果 y i u i < 1 − ϵ y_i u_i < 1 - \epsilon yiui<1ϵ,这种违反被视为严重。
  • 0 < α i < C 0 < \alpha_i < C 0<αi<C 的样本:应精确满足 y i u i = 1 y_i u_i = 1 yiui=1。偏

离1超过 ϵ \epsilon ϵ 的情况被认为违反严重。

  • α i = C \alpha_i = C αi=C 的样本:应满足 y i u i ≤ 1 y_i u_i \leq 1 yiui1。如果 y i u i > 1 + ϵ y_i u_i > 1 + \epsilon yiui>1+ϵ,同样视为严重违反。
问题二:计算 ∣ E 1 − E 2 ∣ |E_1 - E_2| E1E2 最大的 α 2 \alpha_2 α2
  • 误差 E i E_i Ei 的计算公式为:
    E i = ( ∑ j = 1 m α j y j K ( x j , x i ) + b ) − y i E_i = (\sum_{j=1}^m \alpha_j y_j K(x_j, x_i) + b) - y_i Ei=(j=1mαjyjK(xj,xi)+b)yi
  • 选择 α 2 \alpha_2 α2 通过寻找最大化 ∣ E 1 − E 2 ∣ |E_1 - E_2| E1E2 α j \alpha_j αj 实现,即:
    j = arg ⁡ max ⁡ j ∣ E 1 − E j ∣ j = \arg\max_j |E_1 - E_j| j=argjmaxE1Ej

伪代码实现

初始化所有乘数 alpha_i = 0
为所有 i 初始化误差 E_i
k = 0重复直至收敛:// 外部循环选择 alpha_1对每个样本 i:计算 u_i = sum(alpha_j * y_j * K(x_j, x_i)) + b检查KKT条件如果违反:alpha_1 = alpha_iE_1 = E_i// 内部循环选择 alpha_2找到最大化 |E_1 - E_j| 的 jalpha_2 = alpha_jE_2 = E_j// 优化 alpha_1 和 alpha_2更新 alpha_1 和 alpha_2更新 b 重新计算误差k += 1检查收敛条件

这篇关于复现SMO算法:序列最小优化的启发式方法【三、算法原理揭秘-2】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/951603

相关文章

Nginx设置连接超时并进行测试的方法步骤

《Nginx设置连接超时并进行测试的方法步骤》在高并发场景下,如果客户端与服务器的连接长时间未响应,会占用大量的系统资源,影响其他正常请求的处理效率,为了解决这个问题,可以通过设置Nginx的连接... 目录设置连接超时目的操作步骤测试连接超时测试方法:总结:设置连接超时目的设置客户端与服务器之间的连接

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Linux使用nload监控网络流量的方法

《Linux使用nload监控网络流量的方法》Linux中的nload命令是一个用于实时监控网络流量的工具,它提供了传入和传出流量的可视化表示,帮助用户一目了然地了解网络活动,本文给大家介绍了Linu... 目录简介安装示例用法基础用法指定网络接口限制显示特定流量类型指定刷新率设置流量速率的显示单位监控多个

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

C#中读取XML文件的四种常用方法

《C#中读取XML文件的四种常用方法》Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具,下面我们就来看看C#中读取XML文件的方法都有哪些吧... 目录XML简介格式C#读取XML文件方法使用XmlDocument使用XmlTextReader/XmlTextWr

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

oracle DBMS_SQL.PARSE的使用方法和示例

《oracleDBMS_SQL.PARSE的使用方法和示例》DBMS_SQL是Oracle数据库中的一个强大包,用于动态构建和执行SQL语句,DBMS_SQL.PARSE过程解析SQL语句或PL/S... 目录语法示例注意事项DBMS_SQL 是 oracle 数据库中的一个强大包,它允许动态地构建和执行