Machine learning 支持向量机序列最小优化的收敛性问题

Machine learning 支持向量机序列最小优化的收敛性问题,machine-learning,smo,classification,svm,convex-optimization,Machine Learning,Smo,Classification,Svm,Convex Optimization,我已经在支持向量机上工作了大约两个月了。我自己编写了SVM,对于SVM的优化问题,我使用了John Platt博士的序列最小优化(SMO) 现在我正处于网格搜索阶段,为我的数据集找到最佳的C值。(请在此处查找我的项目应用程序和数据集详细信息) 我已经成功地检查了自定义实现的SVM对2^0到2^6的C值的准确性。但是现在我有一些关于C>128的SMO收敛性的问题。 就像我试图找到C=128的alpha值一样,在它真正收敛并成功给出alpha值之前需要很长时间 对于C=100,SMO收敛所需的时间约

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

现在我正处于网格搜索阶段,为我的数据集找到最佳的C值。(请在此处查找我的项目应用程序和数据集详细信息)

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

对于C=100,SMO收敛所需的时间约为5小时。我认为这是巨大的(因为SMO应该很快。)尽管我的精确度很高? 我是正确的,不是因为我不能测试更高的C值的准确性

我实际上显示了在SMO的每个过程中更改的字母数,得到10,13,8。。。字母在不断变化。KKT条件确保了收敛,那么这里发生了什么奇怪的事情


请注意,对于大多数SVM实现,我的实现在C上运行良好。对于大多数SVM实现,训练时间会随着C值的增大而显著增加。要了解SMO的合理良好实现中的训练时间是如何用C衡量的,请查看下图中libSVM的对数刻度线

SVM训练时间与C-来自Sentelle等人

你可能有两个简单的方法和一个不那么简单的方法来让事情更快

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


不那么容易的解决办法是切换到不同的优化算法(例如,上文Sentelle等人的论文中的SVM-RSQP)。但是,如果你有一个SMO的工作实现,你可能只会真正做到这一点。

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

我想我之前问过你的另一个问题,但你为什么不使用现有的SVM包?我想我提到了我自己实现SVM的原因。我是技术学士的学生,我的学院不允许我使用任何支持向量机的现成实现。坦白地说,如果我使用任何支持向量机,我将无法了解有关支持向量机的大部分内容。不过,将其与您的实现进行比较是值得的。如果libsvm在这方面也很慢,那么您肯定没有做错任何事情。