任何允许在线学习的python支持向量机库?
Posted
技术标签:
【中文标题】任何允许在线学习的python支持向量机库?【英文标题】:Any python Support Vector Machine library around that allows online learning? 【发布时间】:2010-12-19 12:18:40 【问题描述】:我确实知道有一些库允许从 python 代码中使用支持向量机,但我正在寻找允许在线教授它的库(即,无需一次提供所有数据) .
有吗?
【问题讨论】:
【参考方案1】:Pegasos 是一种在线 SVM 算法,性能非常好。即使没有特定的 Python 绑定,它也很容易实现。作者的网站上有一个C implementation,它也可以自适应或嵌入。
【讨论】:
【参考方案2】:虽然那里没有 python 绑定,但描述的算法在 http://leon.bottou.org/projects/sgd 以在线方式进行培训,并且很容易使用例如重新实现。麻木。
【讨论】:
随机梯度下降 (SGD) 也在 scikit-learn (scikit-learn.sourceforge.net) 中实现。虽然基于 SGD 的分类器的在线拟合尚未公开,但将在未来 6 个月内公开。【参考方案3】:为什么要在线训练它?添加训练实例通常需要重新解决与 SVM 相关的二次规划问题。
解决此问题的一种方法是在批处理模式下训练 SVM,当有新数据可用时,检查这些数据点是否在超平面的 [-1, +1] 边距内。如果是这样,请使用所有旧的支持向量和落在边缘的新训练数据重新训练 SVM。
当然,与对所有数据进行批量训练相比,结果可能会略有不同,因为某些点可能会被丢弃,这些点稍后会成为支持向量。再说一遍,你为什么要对你的 SVM 进行在线训练?
【讨论】:
我已经回答了你上面的第一个问题。我将它用于强化学习项目,因此需要在线学习。 请注意,如果实施得天真,批处理模式可能比随机模式更糟糕。 这种方法无法扩展。对每条新记录的整个数据集进行重新训练最多会产生指数级的性能。在线学习将具有恒定或线性的性能,具体取决于实施。【参考方案4】:没听说过。但是你真的需要在线学习吗?我使用 SVM 已经有一段时间了,从来没有遇到过必须使用在线学习的问题。通常我会为训练示例的更改次数设置一个阈值(可能是 100 或 1000),然后对所有示例进行批量重新训练。
如果您的问题规模很大,您绝对必须使用在线学习,那么您可能想看看vowpal wabbit。
以下重新编辑,评论后:
Olivier Grisel 建议在 LaSVM 周围使用 ctypes 包装器。因为我以前不知道 LaSVM,而且它看起来很酷,所以我很想在我自己的问题上尝试一下 :)。
如果您仅限于使用 Python-VM(嵌入式设备、机器人),我建议使用投票/平均感知器,它的性能接近 SVM,但易于实现和“在线”默认。
刚刚看到Elefant 有一些在线 SVM 代码。
【讨论】:
有人能在 Linux 上构建 VW 吗?我安装了 boost,但 VW 似乎采用了更旧的版本。 LaSVM 似乎是这里的赢家。它有一个小的代码库。明确支持在线学习。轻松编译(在 Ubuntu 9.10 上测试)。它没有直接的 Python API,但它创建了两个简单的命令行实用程序,可以轻松地从 Python 调用以构建模型 (la_svm) 并使用模型 (la_test)。【参考方案5】:LibSVM 包含一个通过 SWIG 工作的 python 包装器。
发行版中的 svm-test.py 示例:
#!/usr/bin/env python
from svm import *
# a three-class problem
labels = [0, 1, 1, 2]
samples = [[0, 0], [0, 1], [1, 0], [1, 1]]
problem = svm_problem(labels, samples);
size = len(samples)
kernels = [LINEAR, POLY, RBF]
kname = ['linear','polynomial','rbf']
param = svm_parameter(C = 10,nr_weight = 2,weight_label = [1,0],weight = [10,1])
for k in kernels:
param.kernel_type = k;
model = svm_model(problem,param)
errors = 0
for i in range(size):
prediction = model.predict(samples[i])
probability = model.predict_probability
if (labels[i] != prediction):
errors = errors + 1
print "##########################################"
print " kernel %s: error rate = %d / %d" % (kname[param.kernel_type], errors, size)
print "##########################################"
param = svm_parameter(kernel_type = RBF, C=10)
model = svm_model(problem, param)
print "##########################################"
print " Decision values of predicting %s" % (samples[0])
print "##########################################"
print "Numer of Classes:", model.get_nr_class()
d = model.predict_values(samples[0])
for i in model.get_labels():
for j in model.get_labels():
if j>i:
print "%d, %d = %9.5f" % (i, j, d[i,j])
param = svm_parameter(kernel_type = RBF, C=10, probability = 1)
model = svm_model(problem, param)
pred_label, pred_probability = model.predict_probability(samples[1])
print "##########################################"
print " Probability estimate of predicting %s" % (samples[1])
print "##########################################"
print "predicted class: %d" % (pred_label)
for i in model.get_labels():
print "prob(label=%d) = %f" % (i, pred_probability[i])
print "##########################################"
print " Precomputed kernels"
print "##########################################"
samples = [[1, 0, 0, 0, 0], [2, 0, 1, 0, 1], [3, 0, 0, 1, 1], [4, 0, 1, 1, 2]]
problem = svm_problem(labels, samples);
param = svm_parameter(kernel_type=PRECOMPUTED,C = 10,nr_weight = 2,weight_label = [1,0],weight = [10,1])
model = svm_model(problem, param)
pred_label = model.predict(samples[0])
【讨论】:
由于 LibSVM 网站或文档没有明确提及,我给 Chih-Jen Lin 发了电子邮件,询问增量/在线学习支持。他的回答是:“很遗憾,没有。原因是我们还没有看到增量/减量学习的标准设置。”以上是关于任何允许在线学习的python支持向量机库?的主要内容,如果未能解决你的问题,请参考以下文章