老药铺的掌柜有一杆祖传大天平,柜台上堆着数百枚小砝码。每次配药,他都要给每味药材称出合适的重量,让天平达到最佳平衡。年轻的学徒以为:把所有砝码全部拿下来,重新列一张“两两关系表”,一次性算出每个砝码的重量,才是正道。可掌柜只是笑笑——样品越多,这张表越大,大到药柜都放不下,计算更是慢得让人打瞌睡。 掌柜的秘诀是:每次只动两个砝码,其余全部按住不动。因为天平有一条铁律,左右力矩必须抵消;只要这两个砝码沿着同一条轨道一增一减,整体就会一直保持平衡。于是,他只需反复挑出“最不守规矩”的砝码,再配一个最合适的搭档,用纸笔就能算清每一步。推完一轮又一轮,直到整杆天平纹丝不动。 这个故事,就是支持向量机(SVM)训练加速算法——序列最小优化(SMO)的真实轮廓。传统方法把 N 个样本的权重当成一个巨大方程组整体求解,而 SMO 说:一次只优化两个拉格朗日乘子,其余固定,反复迭代直到收敛。它让 SVM 从“看起来很贵”变成“中等规模数据也能上生产”,也让你真正看懂 libsvm 这类工具的内部引擎。

岗位关联

学会 SMO,等于拆开 libsvm 等 SVM 库的引擎盖,理解大规模分类模型为什么能快速训练,是进阶算法工程师的重要一步。

目录
  1. 可视化演示
  2. SVM训练痛点
  3. SMO核心思想
  4. 启发式选点
  5. 解析更新公式
  6. 算法流程
  7. 复杂度优势
  8. 工程实践
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示SMO算法两变量解析优化与约束裁剪、KKT条件违反检测与乘子选择策略、以及目标函数收敛过程,揭示SVM训练的底层实现原理。

本节配有交互动效(进入视口后自动加载,约 3KB)。

两变量解析优化与约束裁剪 等式约束下alpha1由alpha2线性表示 未裁剪最优值经L和H边界裁剪 a2_new=clip(a2_unc,L,H) 解析求解避免数值二次规划

SVM训练痛点

老掌柜学徒时,师傅教的是“笨办法”:把 N 个砝码全部拿下来,先称出所有砝码两两之间的关系,列一张巨型表格,再一次性算出全部重量。样品少时还能凑合,样品一多,光是表格就塞满半个药柜。

在支持向量机里,这个“巨型表格”就是 N×N 的核矩阵 K。每个样本 x_i 对最终分类面的影响,由一个非负权重——拉格朗日乘子 α_i 控制。SVM 的对偶问题要在所有样本权重的组合中找最优解,数学上是一个带约束的二次规划(QP)问题。

传统 QP 要一次性把所有 α 解出来,时间和内存复杂度高达 O(n³) 与 O(n²)。样本到一万时,核矩阵就有上亿个格子,普通电脑直接宕机。这正是老掌柜不让学徒用笨办法的原因——不是笨办法不对,而是它贵得离谱。

max⁡α  W(α)=∑i=1nαi−12∑i=1n∑j=1nαiαjyiyjK(xi,xj)s.t.0≤αi≤C,∑i=1nyiαi=0\displaystyle\begin{aligned}\max_{\alpha}\; W(\alpha) &= \sum_{i=1}^{n}\alpha_i - \frac{1}{2}\sum_{i=1}^{n}\sum_{j=1}^{n}\alpha_i\alpha_j y_i y_j K(\mathbf{x}_i,\mathbf{x}_j)\\\text{s.t.}\quad 0\le \alpha_i\le C,\quad &\sum_{i=1}^{n}y_i\alpha_i=0\end{aligned}
这个式子说明:你既要让每个样本权重的总和尽量大,又不能忍受两两样本之间的重叠惩罚太大;同时,正负样本的力矩必须互相抵消。
  1. 目标函数 W(α)在可行域内寻找一组权重,使分类间隔最大。
    W(α)W(\alpha)
  2. 一次项所有样本权重的总和,权重越大,模型越倾向于让每个样本都“说话”。
    ∑i=1nαi\sum_{i=1}^{n}\alpha_i
  3. 二次项权重两两配对的惩罚,核函数 K 衡量两个样本有多“像”;太像还同时给高权重,间隔就会被压缩。
    12∑i=1n∑j=1nαiαjyiyjK(xi,xj)\frac{1}{2}\sum_{i=1}^{n}\sum_{j=1}^{n}\alpha_i\alpha_j y_i y_j K(\mathbf{x}_i,\mathbf{x}_j)
  4. 边界约束每个砝码的重量被限制在 0 到 C 之间,C 越大,允许单个样本影响的“力度”越大。
    0≤αi≤C0\le\alpha_i\le C
  5. 等式约束正样本与负样本的加权力矩必须抵消,这是 SMO 必须成对更新的根本原因。
    ∑i=1nyiαi=0\sum_{i=1}^{n}y_i\alpha_i=0

SMO核心思想

掌柜想出一个省力的规矩:每次只动两个砝码,其他砝码按在柜台上一动不动。因为天平要求总力矩抵消,若只动一个砝码,天平立刻失衡;但若同时动两个,让它们沿着同一条“轨道”一增一减,平衡就永远不破。

这个规矩就是“序列最小优化”的名字由来。SMO 不一次性求解所有乘子,而是每次只挑一对 (α_i, α_j) 做解析优化,其余 n−2 个乘子全部冻结。因为只有两个变量在变,原始问题被压成一条直线上的单变量优化,可以用公式直接算出最优值,而不需要调用庞大的二次规划求解器。

固定住其他乘子后,目标函数关于两个变量只剩一个自由度。掌柜只需沿着这条“轨道”找到最优位置,再检查砝码是不是越过了药柜的隔板。一次两步,反复迭代,天平便会一点点趋于平衡。

\displaystyley_i\alpha_i^{\text{new}} + y_j\alpha_j^{\text{new}}= y_i\alpha_i^{\text{old}} + y_j\alpha_j^{\text{old}}
这条等式意味着:不管两个砝码怎么移动,它们贡献给总力矩的那部分始终保持不变,这是 SMO 所有推导的地基。
  1. y_i 与 y_j样本标签,正样本为 +1,负样本为 -1,表示砝码放在天平的哪一侧。
    yi,  yjy_i,\; y_j
  2. α_i、α_j两个被选中优化的拉格朗日乘子,也就是两个砝码的重量。
    αi,  αj\alpha_i,\; \alpha_j
  3. new 与 old更新前与更新后的值,表示这一步前后状态的变化。
    αiold→αinew\alpha_i^{\text{old}} \to \alpha_i^{\text{new}}
  4. 等式成立更新前后总力矩贡献相同;这是由原问题的等式约束直接推出来的,不能违反。
    yiαinew+yjαjnew=yiαiold+yjαjoldy_i\alpha_i^{\text{new}} + y_j\alpha_j^{\text{new}} = y_i\alpha_i^{\text{old}} + y_j\alpha_j^{\text{old}}

启发式选点

光有更新公式还不够——每次该动哪两个砝码?掌柜的原则是:先挑最不守规矩的,再找一个最能“配合”的搭档。

在 SVM 里,“守不守规矩”由 KKT 条件判断。KKT 条件是最优解必须满足的一组规则,它把每个样本分成三种状态:被正常分类且影响力为零、正好在间隔边界上、或者已经被允许越过间隔边界。

SMO 的外层循环扫描全体样本,找出最违反 KKT 条件的 α_i 作为第一个乘子;内层循环再找一个让 |E_i - E_j| 最大的 α_j。这里的 E 表示当前模型的预测误差。直觉上,找误差相差最大的两个砝码,这一步能“挪动”的距离最大,收敛最快。

\displaystyley_i f(\mathbf{x}_i)\;\begin{cases}\ge 1, & \alpha_i=0\\= 1, & 0<\alpha_i<C\\\le 1, & \alpha_i=C\end{cases}
KKT 条件就像药铺的“称药规范”:每个砝码该有多重,必须和它所在的位置匹配,否则天平就不是最优平衡。
  1. f(x_i)当前模型对这个样本的打分,也就是超平面给出的原始输出。
    f(xi)f(\mathbf{x}_i)
  2. y_i f(x_i)带符号的间隔值,大于 1 是“安全”,小于 1 是“越界”。
    yif(xi)y_i f(\mathbf{x}_i)
  3. 第一种情况权重为 0,说明这个样本不影响分类面,要求它被正确且自信地分类。
    αi=0⇒yif(xi)≥1\alpha_i=0 \Rightarrow y_i f(\mathbf{x}_i)\ge 1
  4. 第二种情况权重在开区间,样本正好躺在间隔边界上,必须满足等号。
    0<αi<C⇒yif(xi)=10<\alpha_i<C \Rightarrow y_i f(\mathbf{x}_i)= 1
  5. 第三种情况权重顶到上限 C,说明它被允许越过边界,间隔值可以小于 1。
    αi=C⇒yif(xi)≤1\alpha_i=C \Rightarrow y_i f(\mathbf{x}_i)\le 1

解析更新公式

选定搭档后,SMO 用解析式直接算出两个乘子的新值。先定义两个工具量:预测误差 E 和曲率 η。

算出的 α_j 不能直接用,还要裁到 [L, H] 区间内。若 y_i 与 y_j 同号,则 L=max(0, α_i+α_j−C)、H=min(C, α_i+α_j);若异号,则 L=max(0, α_j−α_i)、H=min(C, C+α_j−α_i)。裁剪完成后,用 α_i 的新值更新两个乘子。

最后,还要重新校准天平的“零点”,也就是阈值 b。更新规则是:若 0<α_i<C,取 b1;若 0<α_j<C,取 b2;若两个都在边界上,取两者平均。

一个砝码变重,搭档按比例变化,两步合成一步;隔板保证它们不越界,标尺保证读数不偏。SMO 的每一次迭代,就是把这套手工活完整做一遍。

Ei=f(xi)−yiη=Kii+Kjj−2Kijαj(new,unc)=αj(old)+yj(Ei−Ej)ηαi(new)=αi(old)+yiyj(αj(old)−αj(new))\displaystyle\begin{aligned}E_i &= f(\mathbf{x}_i)-y_i\\\eta &= K_{ii}+K_{jj}-2K_{ij}\\\alpha_j^{\text{(new,unc)}} &= \alpha_j^{\text{(old)}} + \frac{y_j(E_i-E_j)}{\eta}\\\alpha_i^{\text{(new)}} &= \alpha_i^{\text{(old)}} + y_i y_j\left(\alpha_j^{\text{(old)}}-\alpha_j^{\text{(new)}}\right)\end{aligned}
阈值 b 就像天平的读数零点:砝码位置变了,标尺也要跟着校正,否则整体偏移一个常数,分类面就歪了。
  1. b1用第一个样本的误差来校正旧阈值,适合 α_i 不在边界时使用。
    b1=b−Ei−yi(αinew−αiold)Kii−yj(αjnew−αjold)Kijb_1 = b - E_i - y_i(\alpha_i^{\text{new}}-\alpha_i^{\text{old}})K_{ii} - y_j(\alpha_j^{\text{new}}-\alpha_j^{\text{old}})K_{ij}
  2. b2同理,用第二个样本的误差来校正阈值。
    b2=b−Ej−yi(αinew−αiold)Kij−yj(αjnew−αjold)Kjjb_2 = b - E_j - y_i(\alpha_i^{\text{new}}-\alpha_i^{\text{old}})K_{ij} - y_j(\alpha_j^{\text{new}}-\alpha_j^{\text{old}})K_{jj}
  3. 选择规则优先相信“位于间隔边界上”的样本给出的校正值。
    b=b1  或  b2  或  (b1+b2)/2b = b_1 \;\text{或}\; b_2 \;\text{或}\; (b_1+b_2)/2

算法流程

SMO 的完整流程并不神秘,掌柜每天打的算盘就是这个套路:

1. 初始化:所有 α_i 设为 0,阈值 b 设为 0。此时天平空载,还没有任何砝码。

2. 外层循环:先扫描非边界样本(0<α_i<C),再扫描全部样本,寻找违反 KKT 条件最严重的第一个乘子。

3. 内层循环:为第一个乘子挑选第二个乘子,计算误差、更新、裁剪,并同步更新阈值 b。

4. 收敛判断:如果一轮完整扫描下来没有任何乘子被更新,就记一次“空转”;连续若干轮空转,说明所有 KKT 条件都已满足,停止迭代。

整个过程很像掌柜每天打烊前的例行检查:先扫一遍柜台,看哪个砝码碍眼;找到后,再从隔壁抽屉挑一个最匹配的搭档;两人配合调整完,重新校准标尺。第二天再来,直到整杆天平四平八稳。

为什么要“连续”空转才停?因为一次扫描可能因为随机性漏掉某个样本,多轮都无变化,才能说明所有砝码都真正守规矩了。

复杂度优势

和传统 QP 相比,SMO 最大的优势是把“一次解决所有变量”的笨办法,换成“每次只解两个变量”的精细活。计算量和内存占用因此大幅下降。

老掌柜的账本写得很清楚:以前要备一整柜子“两两关系表”,现在只拿一张纸、一支笔,算到哪写到哪。正因如此,SVM 才真正具备了处理中等规模数据的实战能力。

传统QP: O(n3) 时间, O(n2) 内存;SMO: O(n) 内存, 每步 O(1)∼O(n) 时间\displaystyle\text{传统QP: } O(n^3)\text{ 时间},\ O(n^2)\text{ 内存};\qquad\text{SMO: } O(n)\text{ 内存},\ \text{每步 }O(1)\sim O(n)\text{ 时间}
复杂度从“平方内存”降到“线性内存”,意味着同样的内存条,SMO 能装下比传统方法大得多的数据集。
  1. O(n³)传统二次规划的时间复杂度随样本量立方增长,样本翻十倍,时间慢千倍。
    O(n3)O(n^3)
  2. O(n²)传统方法要保存完整的核矩阵,内存随样本量平方增长。
    O(n2)O(n^2)
  3. 线性内存SMO 不需要全套核矩阵,只按需计算单个 K_ij,内存随样本量线性增长。
    O(n)O(n)
  4. 每步开销SMO 每一步只更新两个乘子,计算量小;选点扫描偶尔需要 O(n),但整体远优于暴力 QP。
    O(1)∼O(n)O(1)\sim O(n)

工程实践

SMO 最著名的工程化身是 libsvm。打开 libsvm 的源码,你会发现它的训练核心正是 SMO 的工业化变体:加入了更聪明的选点策略、缓存机制和数值稳定性处理,但骨架仍是“每次选一对乘子,解析更新”。

工程实践中还有两个必须懂的旋钮。第一个是惩罚参数 C,它是每个砝码重量的上限,也是“允许越界”的预算。C 越大,模型越不愿放过训练错误,容易过拟合;C 越小,模型越保守,间隔更宽但可能欠拟合。第二个是核函数,SMO 只需要计算 K_ij,因此换核函数只改 K 的计算方式,主循环完全不用动。这就像老掌柜的大天平:托盘可以放不同药材,但“每次动两个砝码”的规矩不变。

从理论到生产,SMO 让支持向量机从一门数学艺术,变成一行 svm.train() 就能跑起来的实用工具。理解它,你便不再只把 SVM 当成黑盒。

AI 应用场景

大规模文本分类

阶段:模型训练 / 算法优化

解决的问题:文本经过 TF-IDF 或词向量转换后特征维度极高,样本量常达数万甚至数十万。传统二次规划需要构造 N×N 核矩阵,内存和时间都无法承受;SMO 每次只算一对样本的核值,内存需求线性增长,让 SVM 训练真正落地。

具体案例:某电商平台对 50 万条评论做情感二分类,特征维度约 10 万。使用 libsvm 内置的 SMO 算法训练线性 SVM,在一台 16GB 内存的机器上几十分钟内完成;而如果用传统 QP 实现,仅核矩阵就需要约 100GB 内存。

高维小样本生物信息分类

阶段:特征学习 / 分类建模

解决的问题:基因表达谱、蛋白质序列等数据通常“样本少、特征多”,且类别边界高度非线性,非常适合核 SVM。SMO 配合 RBF 核,能在内存可控的前提下寻找非线性分类面,而不需要完整的核矩阵。

具体案例:某研究组用 2000 个病人的基因表达数据预测耐药性,特征约 2 万维。采用 SMO 实现的 SVM 分类器,用 RBF 核捕捉非线性关系,训练完成后筛选出的支持向量帮助医生定位关键基因。

Python 演示

python87 行
import random  def dot(a, b):    return sum(x * y for x, y in zip(a, b))  def simplified_smo(X, y, C=1.0, tol=1e-4, max_passes=20):    n = len(X)    K = [[dot(X[i], X[j]) for j in range(n)] for i in range(n)]    alpha = [0.0] * n    b = 0.0    passes = 0     while passes < max_passes:        num_changed = 0        for i in range(n):            Ei = sum(alpha[k] * y[k] * K[k][i] for k in range(n)) + b - y[i]            if (y[i] * Ei < -tol and alpha[i] < C) or (y[i] * Ei > tol and alpha[i] > 0):                j = random.randrange(n)                while j == i:                    j = random.randrange(n)                 Ej = sum(alpha[k] * y[k] * K[k][j] for k in range(n)) + b - y[j]                ai_old, aj_old = alpha[i], alpha[j]                 if y[i] == y[j]:                    L = max(0.0, ai_old + aj_old - C)                    H = min(C, ai_old + aj_old)                else:                    L = max(0.0, aj_old - ai_old)                    H = min(C, C + aj_old - ai_old)                 if L == H:                    continue                 eta = K[i][i] + K[j][j] - 2.0 * K[i][j]                if eta <= 0:                    continue                 aj_new = aj_old + y[j] * (Ei - Ej) / eta                if aj_new < L:                    aj_new = L                elif aj_new > H:                    aj_new = H                 if abs(aj_new - aj_old) < 1e-5:                    continue                 ai_new = ai_old + y[i] * y[j] * (aj_old - aj_new)                 b1 = (b - Ei - y[i] * (ai_new - ai_old) * K[i][i]                      - y[j] * (aj_new - aj_old) * K[i][j])                b2 = (b - Ej - y[i] * (ai_new - ai_old) * K[i][j]                      - y[j] * (aj_new - aj_old) * K[j][j])                 if 0 < ai_new < C:                    b = b1                elif 0 < aj_new < C:                    b = b2                else:                    b = (b1 + b2) / 2.0                 alpha[i], alpha[j] = ai_new, aj_new                num_changed += 1         if num_changed == 0:            passes += 1        else:            passes = 0     return alpha, b  if __name__ == "__main__":    X = [[1.0, 3.0], [2.0, 2.0], [3.0, 3.0],         [1.0, 0.0], [2.0, 0.0], [0.0, 1.0]]    y = [1, 1, 1, -1, -1, -1]     alpha, b = simplified_smo(X, y)    n = len(X)    w = [sum(alpha[i] * y[i] * X[i][d] for i in range(n)) for d in range(2)]     print("weights:", [round(v, 4) for v in w])    print("bias:", round(b, 4))    sv = [(X[i], round(alpha[i], 4)) for i in range(n) if alpha[i] > 1e-5]    print("support vectors:", sv)
目的:用简化版 SMO 训练一个线性可分的小数据集,打印出分类超平面的权重、偏置和支持向量。
  1. K = [[dot(X[i], X[j]) for j in range(n)] for i in range(n)]预计算核矩阵,方便后续所有 K_ij 的调用。
  2. Ei = sum(alpha[k] * y[k] * K[k][i] for k in range(n)) + b - y[i]计算当前模型对第 i 个样本的预测误差。
  3. if (y[i] * Ei < -tol and alpha[i] < C) or (y[i] * Ei > tol and alpha[i] > 0)判断第 i 个乘子是否违反 KKT 条件。
  4. aj_new = aj_old + y[j] * (Ei - Ej) / eta解析更新第二个乘子的未裁剪值。
  5. if aj_new < L: aj_new = L把新值裁剪回 [L, H] 区间。
  6. ai_new = ai_old + y[i] * y[j] * (aj_old - aj_new)利用等式约束回推第一个乘子的新值。
  7. if 0 < ai_new < C: b = b1当第一个乘子落在开区间时,用 b1 更新阈值。
  8. if num_changed == 0: passes += 1一轮没有任何更新,空转计数加一,用于判断收敛。

常见误区

误区SMO 无非是每次随机挑两个样本,调一堆参数然后迭代,反正迟早会收敛。

正解随机选择只出现在教学用简化版里。真实 SMO 的外层循环会选择违反 KKT 条件最严重的乘子,内层循环会选择让 |E_i-E_j| 最大的搭档。这就像掌柜先挑最碍眼的砝码,再配最能“借力”的搭档,而不是闭眼乱抓。

为何常见:很多入门教程用随机选 j 来简化代码,容易让人误以为启发式选点不重要。

误区C 是惩罚参数,调大 C 让模型“更用力”优化训练集,所以训练速度应该更快。

正解C 决定正则化强度,不是速度旋钮。C 太大时,大量样本的 α 被顶到边界 C,支持向量数量增加,SMO 需要反复扫描更多边界样本,通常反而更慢,还容易过拟合。

为何常见:误把超参数的“强度”理解成“效率”,忽略了边界样本对算法循环的影响。

误区既然每次只改两个变量,原来的 `∑yα=0` 约束就被绕过了,可以随意更新。

正解恰恰相反,SMO 必须成对更新,正是为了维护这个约束。两个变量沿同一条可行轨道移动,本质上是在“约束允许的范围”内做解析优化。

为何常见:只看到“两个变量”的表面,忘记了它是由原问题约束推导出来的必然结果。

误区只有被误分类或“硬顶”到上界的样本才是支持向量,所以支持向量都是 α=C 的样本。

正解只要 α>0,样本就是支持向量。其中 0<α<C 的样本落在间隔边界上,α=C 的样本是允许越界的边界样本。两者都会影响分类面,缺一不可。

为何常见:把软间隔中的“边界支持向量”和“越界支持向量”混为一谈,忽略了 KKT 条件的三种状态。

面试题

Q1. SMO 每轮最多优化几个拉格朗日乘子?

单选题 · easy

  • A.一个
  • B.两个← 正确答案
  • C.三个
  • D.全部

答案:B。SMO 的核心是“序列最小优化”,每轮只选两个乘子做解析更新,其余全部固定。只选一个会破坏线性约束,选三个以上又退化成小规模 QP,失去解析解的优势。

Q2. SMO 为什么必须成对更新乘子?

单选题 · easy

  • A.保持约束和为零← 正确答案
  • B.提高数据读取速度
  • C.减少内存占用
  • D.让核矩阵更稀疏

答案:A。对偶问题中存在 ∑yα=0 的等式约束。若只更新一个 α,总和必然改变;成对更新可以让两个变量的变化相互抵消,像天平两端同时调整,始终保持平衡。

Q3. 传统 QP 训练 SVM 时,内存复杂度通常是?

单选题 · easy

  • A.O(1)
  • B.O(n)
  • C.O(n log n)
  • D.O(n²)← 正确答案

答案:D。传统方法需要保存 n×n 的核矩阵,内存复杂度是 O(n²)。SMO 不需要完整核矩阵,按需计算 K_ij,才把内存降到 O(n)。

Q4. 传统二次规划训练 SVM 的主要瓶颈是?

单选题 · mid

  • A.需要存储 n×n 核矩阵← 正确答案
  • B.需要人工设计核函数
  • C.需要对样本做归一化
  • D.需要调整惩罚参数

答案:A。最核心瓶颈是核矩阵的平方级存储和立方级求解。后三者虽然也是工程问题,但不是传统 QP 被 SMO 取代的决定性原因。

Q5. SMO 外层循环通常优先选择哪个乘子?

单选题 · mid

  • A.随机选择任意一个
  • B.违反 KKT 最严重者← 正确答案
  • C.离超平面最近样本
  • D.当前值最大的乘子

答案:B。外层循环先扫描非边界样本、再扫描全部样本,找出最违反 KKT 条件的样本作为第一个乘子。这能让每一步都向最优解迈出最大一步,而不是盲目随机。

Q6. SMO 内层循环选择第二个乘子时,常见策略有哪些?

多选题 · mid

  • A.找 |E_i-E_j| 最大的 j← 正确答案
  • B.随机选即可无需筛选
  • C.优先尝试非边界乘子← 正确答案
  • D.必须要求 y_i y_j=1

答案:AC。内层循环通常选择使两个误差差最大的 j,以最大化本次更新幅度;若失败,再优先尝试非边界样本。“随机选”只是教学简化,而 y_i y_j=1 并不是选择搭档的必要条件。

Q7. 乘子更新时为什么要做边界裁剪?

单选题 · mid

  • A.为了满足 0≤α≤C 约束← 正确答案
  • B.为了减少过拟合
  • C.为了让核矩阵对称
  • D.为了计算 b1 和 b2

答案:A。解析解是在无约束条件下求出的,但拉格朗日乘子必须落在 [0,C] 区间内,所以要把未裁剪值投影到 [L,H]。这就像砝码再重也不能超出药柜的隔板。

Q8. 下列哪些 KKT 条件与 SMO 选点有关?

多选题 · mid

  • A.α_i=0 时要求 y_i f(x_i)≥1← 正确答案
  • B.α_i 在开区间时要求 y_i f(x_i)=1← 正确答案
  • C.α_i=C 时要求 y_i f(x_i)≤1← 正确答案
  • D.要求所有 α_i 都等于 C

答案:ABC。KKT 条件把样本分成三种状态:零权重、边界内权重、顶到上界权重,分别对应三种间隔要求。D 显然错误,因为大部分样本的 α 都为 0。

Q9. 若 0<α_i<C 且 α_j 在边界上,更新阈值 b 应取?

单选题 · hard

  • A.b1← 正确答案
  • B.b2
  • C.(b1+b2)/2
  • D.旧 b 不变

答案:A。当 α_i 严格落在开区间时,它位于间隔边界上,KKT 条件最确定,因此优先用 b1。若 α_j 也严格在开区间,则取 b2;两个都在边界时,才用平均。

Q10. 当 y_i≠y_j 时,裁剪区间 [L,H] 的正确形式是?

单选题 · extreme

  • A.L=max(0,αi−αj), H=min(C,αi+αj)
  • B.L=max(0,αj−αi), H=min(C,C+αj−αi)← 正确答案
  • C.L=max(0,αi+αj−C), H=min(C,αi+αj)
  • D.L=max(0,αj−αi), H=min(C,C+αi−αj)

答案:B。当标签异号时,约束变成 α_i−α_j=常数,因此下界关注 α_j−α_i,上界则要考虑 C 的平移:H=min(C, C+α_j−α_i)。A、C、D 都来自对同号公式的误用或符号混淆。