使用顺序最小优化在支持向量机的论文中混淆细节

时间:2015-06-02 09:53:22

标签: c++ machine-learning svm

最近,我一直在尝试使用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个复杂的公式,第一篇论文:我真的不明白它们的含义。 非常感谢你!

1 个答案:

答案 0 :(得分:0)

12.3 Psuedo代码读取

if (|a2 - alph2| < eps*(a2+alpa2+eps))
    return 0;

eps是ε, epsilon ,小的舍入误差。因此,如果绝对(正)差异变得太小,那么下一行将产生一个微小的值

a1 = alph1+s*(alph2-a2)

因此函数终止,因为函数无法以如此小的增量进行。