任何python支持向量机库,允许在线学习?

时间:2009-11-23 15:03:30

标签: python artificial-intelligence machine-learning svm

我知道有一些库允许从python代码中使用支持向量机,但我正在寻找允许在线教授它的库(这是,不必一次性提供所有数据)

有没有?

5 个答案:

答案 0 :(得分:8)

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])   

答案 1 :(得分:4)

没有听说过。但你真的需要在线学习吗?我使用SVM已经有一段时间了,从来没有遇到过我必须使用在线学习的问题。通常我会根据训练样例的变化次数设置一个阈值(可能是100或1000),然后再批量重新训练。

如果您的问题达到了一定程度,您绝对必须使用在线学习,那么您可能需要查看vowpal wabbit

在评论之后在下面注释:

Olivier Grisel建议在LaSVM周围使用ctypes包装器。由于我以前不了解LaSVM并且它看起来很酷,我很想在我自己的问题上尝试它:)。

如果您仅限于使用Python-VM(嵌入式设备,机器人),我建议使用投票/平均感知器,其执行接近SVM,但易于实现和“在线”默认值。

刚看到Elefant有一些在线SVM代码。

答案 2 :(得分:1)

虽然那里没有python绑定,但算法描述于 http://leon.bottou.org/projects/sgd以在线方式进行培训,并且可以使用例如电子邮件轻松重新实现。 numpy的。

答案 3 :(得分:1)

Pegasos是一种在线SVM算法,运行得非常好。即使没有特定的Python绑定,它也很容易实现。作者网站上有一个C implementation,也可以适应或嵌入。

答案 4 :(得分:0)

为什么要在线训练?添加训练实例通常需要重新解决与SVM相关的二次规划问题。

处理此问题的方法是以批处理模式训练SVM,当有新数据可用时,检查这些数据点是否位于超平面的[-1,+ 1]边距内。如果是这样,请使用所有旧的支持向量以及落在边缘的新训练数据重新训练SVM。

当然,与对所有数据进行批量训练相比,结果可能略有不同,因为有些点可能会被丢弃,以后会成为支持向量。那么,您为什么要对SVM进行在线培训?