2

我已经在支持向量机上工作了大约 2 个月了。我自己编写了 SVM,对于 SVM 的优化问题,我使用了 John Platt 博士的序列最小优化(SMO)。

现在我正处于进行网格搜索以找到我的数据集的最佳 C 值的阶段。(请在此处找到我的项目应用程序和数据集详细信息的详细信息SVM 分类 - 每个类的最小输入集数

我已经成功检查了我自定义实现的 SVM 对从 2^0 到 2^6 的 C 值的准确性。但是现在我在 C> 128 的 SMO 收敛方面遇到了一些问题。就像我试图找到 C=128 的 alpha 值一样,它需要很长时间才能真正收敛并成功给出 alpha 值。

对于 C=100,SMO 收敛所需的时间约为 5 小时。我认为这个巨大(因为 SMO 应该很快。)虽然我得到了很好的准确性?我搞砸了,不是因为我无法测试更高 C 值的准确性。

实际上,我正在显示在 SMO 的每次传递中更改的 alpha 数量,并获得 10、13、8... alpha 连续变化。KKT 条件确保收敛,那么这里发生了什么奇怪的事情?

请注意,尽管执行时间很长,但我的实现对于 C<=100 的精度很高。

请就这个问题给我意见。

谢谢你和干杯。

4

2 回答 2

5

对于大多数 SVM 实现,训练时间会随着 C 值的增加而显着增加。要了解在一个相当好的 SMO 实现中如何使用 C 扩展训练时间,请查看下图中 libSVM 的对数刻度线.

SVM 训练时间与 C - 来自 Sentelle 等人的A Fast Revised Simplex Method for SVM Training

替代文字 http://dmcer.net/StackOverflowImages/svm_scaling.png

您可能有两种简单的方法和一种不太容易的方法来加快速度。

让我们从简单的东西开始。首先,您可以尝试放宽收敛标准。像 epsilon = 0.001 这样的严格标准将需要更长的时间来训练,而通常会导致模型不比像 epsilon = 0.01 这样的宽松标准更好。其次,您应该尝试分析您的代码以查看是否存在任何明显的瓶颈。

不太容易的解决方法是切换到不同的优化算法(例如,来自 Sentelle 等人的上述论文的 SVM-RSQP)。但是,如果您有一个 SMO 的有效实现,您可能应该只将其作为最后的手段。

于 2010-04-02T01:25:25.553 回答
1

如果想要完全收敛,特别是C很大的话,需要很长的时间。可以考虑定义一个大的停止准则,并给出最大迭代次数,Libsvm中默认为1000000,如果迭代次数较多, 时间会成倍增加,但是损失不值这个代价,但是结果可能不完全满足KKT条件,部分支持向量在带内,非支持向量在带外,但误差小且可以接受。在我看来,如果精度更高,建议使用其他二次规划算法而不是 SMO 算法

于 2021-03-25T11:15:58.453 回答