Любая библиотека поддержки векторной машины python, которая позволяет онлайн-обучение?

Я знаю, что есть несколько библиотек, которые позволяют использовать векторные машины Support из кода python, но я ищу специально для библиотек, которые позволяют ему обучать его онлайн (это значит, что без необходимости передавать сразу все данные).

Есть ли?

Ответ 1

LibSVM включает оболочку python, которая работает через 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])   

Ответ 2

Не слышал об одном. Но вам действительно нужно онлайн-обучение? Я использую SVM в течение некоторого времени и никогда не сталкивался с проблемой, когда мне приходилось использовать онлайн-обучение. Обычно я устанавливаю порог числа изменений примеров обучения (возможно, 100 или 1000), а затем просто переустанавливаю все.

Если ваша проблема в масштабе, где вам абсолютно необходимо использовать онлайн-обучение, вы можете взглянуть на vowpal wabbit.

Подтверждено ниже, после комментария:

Olivier Grisel предложил использовать обертку ctypes вокруг LaSVM. Так как я раньше не знал о LaSVM, и это выглядит довольно круто, я заинтригован, чтобы попробовать его по своим собственным проблемам:).

Если вы ограничены только использованием Python-VM (встроенное устройство, робот), я бы предложил использовать проголосовавший/усредненный персептрон, который работает близко к SVM, но его легко реализовать и "онлайн" с помощью по умолчанию.

Просто увидел, что Elefant содержит код онлайн-SVM.

Ответ 3

Пока нет связок python, алгоритм, описанный в http://leon.bottou.org/projects/sgd обучается онлайн-моду и легко переопределяется с использованием, например, NumPy.

Ответ 4

Pegasos - это онлайн-алгоритм SVM, который работает довольно хорошо. Это также довольно легко реализовать, даже без конкретной привязки Python. На веб-сайте автора есть C-реализация, которая также может быть адаптирована или встраиваема.

Ответ 5

Почему вы хотите обучить его онлайн? Добавление экземпляров тренингов обычно требует повторного решения проблемы квадратичного программирования, связанной с SVM.

Способ справиться с этим состоит в том, чтобы обучать SVM в пакетном режиме, и когда новые данные доступны, проверьте, находятся ли эти точки данных в поле [-1, +1] гиперплоскости. Если это так, переустановите SVM, используя все старые векторы поддержки, и новые данные обучения, которые попадают в поле.

Конечно, результаты могут быть немного разными по сравнению с пакетным обучением по всем вашим данным, так как некоторые моменты могут быть отброшены, что позже будет поддерживать векторы. Итак, почему вы хотите выполнить онлайн-тренинг для вас SVM?