【问题标题】:SMO algorithm running into infinite loop?SMO算法陷入无限循环?
【发布时间】:2015-10-03 21:26:06
【问题描述】:

我对构建 SVM 多类分类器很感兴趣,因此我目前正在实施 顺序最小优化 SMO。

我的实现是基于 John C. Platt 的“使用序列最小优化的支持向量机的快速训练”

我在某些训练示例中观察到了这一点。 Smo 可能会发散并陷入无限循环 主程序中的以下循环

numChanged = 0;

检查所有 = 1;

while (numChanged > 0 || 检查所有 >0) {…}

可能会陷入无限循环。

是否有防止smo算法例程陷入死循环的线索或标准?

感谢您的回答。 问候

【问题讨论】:

    标签: optimization machine-learning svm


    【解决方案1】:

    您可以根据需要添加最大迭代条件:

    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] 中归一化并且算法的参数具有合理的值,那么这些极端情况将很少见。在任何情况下,如果您想格外小心,您可以放置​​ max-iter 安全网。

    【讨论】:

    • 感谢您的建议
    • @user3048838 随时:)
    猜你喜欢
    • 2020-05-13
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    • 2021-02-15
    • 2022-01-23
    相关资源
    最近更新 更多