【发布时间】:2015-08-16 01:13:11
【问题描述】:
最近我一直在尝试使用 Platt (1998) 的 Sequential Minimal Optimization 来学习支持向量机。这是他们的原始论文:
http://research.microsoft.com/apps/pubs/?id=68391
这是另一个链接:
http://www.cs.iastate.edu/~honavar/smo-svm.pdf
第二个链接描述了原论文的实现细节,包括一个可以从这里下载的 C++ 源代码: ftp://www.ai.mit.edu/pub/users/tlp/projects/svm/svm-smo/
(但是,由于仅在 Linux 上可用的 drand_48() 函数存在一些问题,该代码无法运行,但我已经拥有该函数的源代码,代码运行不会花费很长时间)
但是在它们的实现中有一些奇怪和令人困惑的细节: 1) 在第一个链接,第 10 页,过程 takeStep (i1,i2) 中,有一行:
if |a2 - alpha2 | < eps* (a2 + alpha2 + eps)
return 0;
其中 a2 是“新”拉格朗日乘数,而 alpha2 是“旧”乘数。我真的不明白这条线是做什么的。我所知道的是,在这个函数中:首先它试图找到 2 个拉格朗日乘数,以最小化(或最大化,如在第二个链接中)目标函数,具有一些条件(即 y1 * alpha1 + y2 * alph2 = const)然后必须根据 KKT 条件检查它(2 个 alpha 必须在一个框 (0,C)(0,C) 中)。它通过找到一阶导数消失的点来做到这一点,然后检查该点的二阶导数以查看它是否真的是最小值,如果不是,则检查边界处的目标函数(L 和 H 在文件)。 SMO 会将拉格朗日乘数移动到具有最低值的端点 目标函数。
这是第一篇论文的摘录:
“如果两端的目标函数相同(舍入误差在较小的 ε 内)并且内核服从 Mercer 条件,则联合最小化无法取得进展。” (第8页)
我认为这就是描述该行的含义,但我就是无法理解它是如何工作的!
2) 第 8 页的 (19) :6 复杂公式,第一篇论文:我不太明白它们的意思。 非常感谢!
【问题讨论】:
标签: c++ machine-learning svm