2009-11-23 37 views

回答

8

LibSVM包括蟒蛇包装,通过SWIG工作。从它们的分布

例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]) 
+0

由于LIBSVM网站或文档中没有明确提到它,我通过电子邮件发送芷仁莲,问增量/在线学习支持。他的回答是,“不幸的是否定的。原因是,我们没有看到涨/跌学习标准的制定还没有。” – Cerin 2010-04-02 17:51:49

+0

什么是示例代码显示不是在线学习。 – mrgloom 2013-05-23 07:37:45

4

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

如果你的问题是在一个规模,你绝对必须使用在线学习,那么你可能想看看vowpal wabbit

下面重新编辑,注释后:

Olivier Grisel建议使用一个ctypes包装周围LaSVM。由于我之前不知道LaSVM,它看起来很酷,所以我很想去尝试一下我自己的问题:)。

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

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

+0

我需要它的强化学习。 – 2009-11-23 16:41:50

+0

有没有人能够在Linux上构建VW?我有提升安装,但大众似乎假设一个更老的版本。 – Cerin 2010-04-02 18:50:36

+0

LaSVM似乎是这里的赢家。它有一个小的代码库。明确支持在线学习。轻松编译(在Ubuntu 9.10上测试)。它没有直接的Python API,但它创建了两个简单的命令行实用程序,可以轻松地从Python中调用以构建模型(la_svm)并使用模型(la_test)。 – Cerin 2010-04-02 19:07:19

0

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

来处理这一点的方法是培养以批处理模式SVM,并且当新数据可用时,检查是否这些数据点是在[-1,+ 1]的超平面的余量。如果是这样,请使用所有旧的支持向量重新训练SVM,以及落入边界的新训练数据。

当然,其结果可能比你所有的数据批次的训练稍有不同,如一些点可以被丢弃,这将是支持向量以后。那么,为什么你想要对SVM进行在线培训?

+1

我已经解答了您的第一个问题。我将它用于强化学习项目,因此需要在线学习。 – 2009-11-29 23:33:10

+0

要小心批处理模式可能会比随机模式更糟糕,如果天真地执行。 – Davide 2009-12-06 05:58:06

+0

这种方法不会缩放。重新整理每个新记录的整个数据集最多只会有指数级的表现。在线学习将具有不变或线性的性能,具体取决于实施。 – Cerin 2010-02-16 16:21:31

1

虽然在那里没有python绑定,但在 http://leon.bottou.org/projects/sgd处描述的算法是以在线方式训练的,并且可以很容易地用例如在线方式重新实现。 numpy的。

+1

随机梯度下降(SGD)也在scikit-learn(http://scikit-learn.sourceforge.net/)中实现。尽管基于SGD的分类器的在线装配尚未公开,但仍将在未来6个月内完成。 – 2011-01-24 20:00:44

1

Pegasos是一个在线SVM算法执行相当不错。即使没有特定的Python绑定,也很容易实现。在作者的网站上有一个C implementation,它也是可适应的或可嵌入的。