我正在使用 libsvm,我注意到每次调用 svmtrain() 时,我都会创建一个新模型,并且似乎没有将数据放入现有模型的选项。然而,这可能吗?我只是没有在 libsvm 中看到这个方面吗?
是否可以将训练数据附加到现有的 SVM 模型?
听起来您正在寻找“增量”或“在线”学习算法。这些算法使您可以使用新示例更新分类器,而无需从头开始重新训练整个事物。
支持向量机绝对有可能,尽管我相信 libSVM 目前不支持它。可能值得看看其他几个提供它的软件包,包括
- Gert Cauwenbergh 的 2000 NIPS 论文(附代码)http://www.isn.ucsd.edu/svm/incremental/
- Pegasos(可单独使用或作为 dlib 的一部分使用)
- 支持向量机重http://people.eng.unimelb.edu.au/shiltona/svm/
PS:@Bogdanovist:这方面有相当广泛的文献。kNN 显然是增量的。可以通过存储计数而不是概率将(一些)贝叶斯分类器变成增量分类器。STAGGER、AQ* 和一些(但不是全部)ID* 系列决策树算法也是增量式的,我想不到。
大多数在线/增量 SVM 实用程序都用于线性内核,我认为它不像非线性内核那样困难。
当前可用的一些著名的在线/增量 SVM 工具:
+ Leon Bottous 的 LaSVM:它支持线性和非线性内核。C++ 代码
+ Bordes 的 LaRank:它同时支持线性和非线性内核。C++ 代码。现在看来链接已断开:-(
+ Gert Cauwenberghs 的代码增量和减量:支持线性和非线性内核。Matlab 代码。
+ Chris Diehl 的增量 SVM 学习:支持线性和非线性内核。Matlab 代码。
+ Alistair Shilton 的 SVMHeavy : Only Binary classification and regression. C++ 代码
+ Francesco Parrella 的 OnlineSVR: 只有回归。Matlab 和 C++。
+ Pegasos:线性和非线性。C 和 Matlab 代码。一个java接口。
+ Langford 的 Vowpal Wabbit:不确定 :-(
+ Koby Crammer 的 MCSVM:线性和非线性。C 代码
可以在我的 Quora 答案中找到更新的列表。
另一种可能性是alpha-seeding。我不知道 libSVM 是否支持它。这个想法是将大量的训练数据分成块。然后你在第一个块上训练一个 SVM。由于生成的支持向量只不过是数据的一些样本,因此您可以使用它们来训练您的 SVM 和下一个块。此外,您使用该 SVM 计算下一次迭代(播种)的 alpha 值的初始估计。因此,好处是双重的:每个问题都更小,并且通过智能初始化,它们收敛得更快。通过这种方式,您可以将一个巨大的问题简化为按顺序解决一系列更简单的步骤。