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
浙公网安备 33010602011771号