我对构建SVM多类分类器感兴趣,所以我目前正在实现 顺序最小优化SMO。
我的实现基于伪代码 “使用顺序最小优化的支持向量机的快速训练”作者:John C. Platt
我观察到某些训练样例。 Smo可能发散并进入无限循环 主程序中的以下循环
numChanged = 0;
examineAll = 1;
while(numChanged> 0 || examineAll> 0){...}
可能会遇到无限循环。
是否存在阻止smo算法例程进入无限循环的线索或标准?
我想感谢你的回答。 问候
答案 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]中被归一化并且算法的参数具有合理的值,则这些极端情况将是罕见的。在任何情况下,如果你想要格外小心,你可以放置最大安全网。