12.14笔记

SMO 算法伪代码:

初始化:
α = 0 ∈ R^m
b = 0
计算初始预测值 f(x_i) = 0,对所有 i

重复直到收敛:
选择两个拉格朗日乘子 α_i 和 α_j(启发式选择,如违反KKT条件最严重的)

计算误差:
    E_i = f(x_i) - y_i
    E_j = f(x_j) - y_j

保存旧值:
    α_i_old = α_i
    α_j_old = α_j

计算边界 L 和 H:
    if y_i != y_j:
        L = max(0, α_j - α_i)
        H = min(C, C + α_j - α_i)
    else:
        L = max(0, α_i + α_j - C)
        H = min(C, α_i + α_j)

if L == H:
    continue

计算核函数值:
    η = 2 * K(x_i, x_j) - K(x_i, x_i) - K(x_j, x_j)

if η >= 0:
    continue

更新 α_j:
    α_j = α_j - (y_j * (E_i - E_j)) / η
    α_j = clip(α_j, L, H)  // 将 α_j 限制在 [L, H] 范围内

if |α_j - α_j_old| < ε:
    continue

更新 α_i:
    α_i = α_i + y_i * y_j * (α_j_old - α_j)

更新阈值 b:

    b1 = b - E_i - y_i * (α_i - α_i_old) * K(x_i, x_i) - y_j * (α_j - α_j_old) * K(x_i, x_j)
    b2 = b - E_j - y_i * (α_i - α_i_old) * K(x_i, x_j) - y_j * (α_j - α_j_old) * K(x_j, x_j)

    if 0 < α_i < C:
        b = b1
    else if 0 < α_j < C:
        b = b2
    else:
        b = (b1 + b2) / 2

更新预测值 f(x_k) 对所有 k(可选,用于加速)

返回 α 和 b
说明:
选择 α_i 和 α_j:通常使用启发式方法,如选择违反KKT条件最严重的样本。
clip函数:用于将变量限制在指定范围内。
核函数 K(x_i, x_j):用于处理非线性问题,如高斯核、多项式核等。

简化版 SMO 伪代码

输入:训练集 {(x₁, y₁), ..., (xₘ, yₘ)},C,核函数 K
初始化:α = 0,b = 0

重复直到收敛:
选两个 αᵢ 和 αⱼ(违反KKT条件的)

计算误差:Eᵢ = f(xᵢ) - yᵢ,Eⱼ = f(xⱼ) - yⱼ

保存旧值:αᵢ_old = αᵢ,αⱼ_old = αⱼ

计算边界 L 和 H(根据 yᵢ 和 yⱼ)

计算 η = 2K(xᵢ, xⱼ) - K(xᵢ, xᵢ) - K(xⱼ, xⱼ)

更新 αⱼ:
    αⱼ = αⱼ - yⱼ(Eᵢ - Eⱼ) / η
    αⱼ = clip(αⱼ, L, H)

更新 αᵢ:
    αᵢ = αᵢ + yᵢyⱼ(αⱼ_old - αⱼ)

更新 b(根据 αᵢ 和 αⱼ 是否在 (0, C) 内)

返回 α 和 b

posted @ 2025-12-14 23:13  头发少的文不识  阅读(4)  评论(0)    收藏  举报