最近,我一直在尝试使用Platt(1998)的Sequential Minimal Optimization来学习Suppor向量机。这是他们的原始论文:
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/
(但是,代码不会运行,因为drand_48()函数的某些问题仅在Linux上可用,但我已经拥有该函数的源代码,并且代码运行不会花费很长时间)
然而,在实施过程中有一些奇怪且令人困惑的细节: 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个复杂的公式,第一篇论文:我真的不明白它们的含义。 非常感谢你!
答案 0 :(得分:0)
12.3 Psuedo代码读取
if (|a2 - alph2| < eps*(a2+alpa2+eps))
return 0;
eps
是ε, epsilon ,小的舍入误差。因此,如果绝对(正)差异变得太小,那么下一行将产生一个微小的值
a1 = alph1+s*(alph2-a2)
因此函数终止,因为函数无法以如此小的增量进行。