SMO算法运行到无限循环?

时间:2015-07-15 01:55:27

标签: optimization machine-learning svm

我对构建SVM多类分类器感兴趣,所以我目前正在实现 顺序最小优化SMO。

我的实现基于伪代码 “使用顺序最小优化的支持向量机的快速训练”作者:John C. Platt

我观察到某些训练样例。 Smo可能发散并进入无限循环 主程序中的以下循环

numChanged = 0;

examineAll = 1;

while(numChanged> 0 || examineAll> 0){...}

可能会遇到无限循环。

是否存在阻止smo算法例程进入无限循环的线索或标准?

我想感谢你的回答。 问候

1 个答案:

答案 0 :(得分:0)

如果需要,可以添加最大迭代条件:

while ((numChanged > 0 || examineAll) && iter < MaxIter)

但是对于大多数情况它不应该遇到无限循环,这是完整的Platt伪代码:

while (numChanged > 0 || examineAll)
{
    numChanged = 0;
    // Adding curly brackets for better readability
    if (examineAll)
    {
        loop I over all training examples
        numChanged += examineExample(I);
    }
    else
    {
        loop I over examples where alpha is not 0 & not C
        numChanged += examineExample(I);
    }

    if (examineAll == 1)
    {
        examineAll = 0;
    }
    else 
    {
        examineAll = 1;
    }
}

请注意,它正在执行的是执行迭代来检查示例,而下一个执行迭代只是对于alpha不是0或C的示例。如果在“检查所有”迭代后没有任何更改,则while循环条件将是错误的,因此停止循环。

所以,为了使它处于一个无限循环中,必须有一个极端情况(可能是一个数值误差)引入振荡,使得例子在检查所有阶段期间发生变化,但不会在“仅检查alpha == 0和C”。

通常如果数据在[-1,1]或[0,1]中被归一化并且算法的参数具有合理的值,则这些极端情况将是罕见的。在任何情况下,如果你想要格外小心,你可以放置最大安全网。