SMO算法运行陷入死循环?
SMO algorithm running into infinite loop?
我有兴趣构建 SVM 多 class classifier,所以我目前正在实施
顺序最小优化 SMO。
我的实现是基于伪代码
John C. Platt 的“使用顺序最小优化的支持向量机快速训练”
我观察到某些训练示例。 Smo 可能发散 运行 进入无限循环
主程序中的以下循环
numChanged = 0;
examineAll = 1;
while (numChanged > 0 || examineAll >0) {…}
可能运行陷入死循环。
有没有什么线索或准则可以防止smo算法程序运行陷入死循环?
非常感谢您的回答。
问候
如果需要,您可以添加最大迭代条件:
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 的示例执行相同的操作。如果 "examine all" 迭代后没有任何变化, while 循环条件将为假,因此停止循环。
因此,对于处于无限循环中的那个,必须有一个极端情况(可能是数字错误),它会引入振荡,使示例在检查所有阶段发生变化,但在 "examine only alpha == 0 and C" 中不会发生变化。
通常,如果数据在 [-1,1] 或 [0,1] 中归一化并且算法的参数具有合理的值,则这些极端情况将很少见。无论如何,如果您想格外小心,可以放置 max-iter 安全网。
我有兴趣构建 SVM 多 class classifier,所以我目前正在实施 顺序最小优化 SMO。
我的实现是基于伪代码 John C. Platt 的“使用顺序最小优化的支持向量机快速训练”
我观察到某些训练示例。 Smo 可能发散 运行 进入无限循环 主程序中的以下循环
numChanged = 0;
examineAll = 1;
while (numChanged > 0 || examineAll >0) {…}
可能运行陷入死循环。
有没有什么线索或准则可以防止smo算法程序运行陷入死循环?
非常感谢您的回答。 问候
如果需要,您可以添加最大迭代条件:
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 的示例执行相同的操作。如果 "examine all" 迭代后没有任何变化, while 循环条件将为假,因此停止循环。
因此,对于处于无限循环中的那个,必须有一个极端情况(可能是数字错误),它会引入振荡,使示例在检查所有阶段发生变化,但在 "examine only alpha == 0 and C" 中不会发生变化。
通常,如果数据在 [-1,1] 或 [0,1] 中归一化并且算法的参数具有合理的值,则这些极端情况将很少见。无论如何,如果您想格外小心,可以放置 max-iter 安全网。