2015-06-02 19 views
0

最近,我一直在尝试使用Platt(1998)使用顺序最小优化来学习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是“新的”拉格朗日乘数和α2是“旧”之一。我不太明白这条线是干什么的。我所知道的是,在这个函数中:首先它试图找到2个拉格朗日乘子,用一些条件(即y1 * alpha1 + y2 * alph2 = const)使目标函数最小化(或最大化,如第二个链接)那么它必须根据KKT条件进行检查(2个alpha必须放在一个盒子里(0,C)(0,C))。它通过找到一阶导数消失的点来实现,然后检查该点的二阶导数以确定它是否是最小值,如果不是,则检查边界处的目标函数(L和H中的文件)。 SMO会将拉格朗日乘子移动到具有最低目标函数值的终点。

下面是从第一纸张的摘录:

“如果目标函数是在两端具有相同的(一个小的ε为舍入误差内)和内核服从Mercer的条件,则该接头最小化不能使进展。” (第8页)

我想这是描述行的意思,但我不明白它是如何工作的!

2)(19):6页复杂的公式在第8页,第一篇论文:我不明白他们的意思。 非常感谢!

回答

0

12.3的伪代码读取

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

eps是ε,小量,小舍入误差。因此,如果绝对(正)差过小,则下一行会产生一个微小的值

a1 = alph1+s*(alph2-a2) 

所以函数终止,因为该功能不能用这么小的增量前进。

+0

但为什么不只是| a2 - alph2 | <???为什么不简单?当我将第一个不等式换成第二个不等式时,我得到:: s *(alpha2-a2)