2009-11-23 13 views

risposta

8

LibSVM include un wrapper python che funziona via SWIG.

Esempio svm-test.py dalla loro distribuzione:

#!/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

Poiché il sito Web oi documenti di LibSVM non lo menzionano esplicitamente, ho inviato una e-mail a Chih-Jen Lin, chiedendo informazioni sul supporto per l'apprendimento incrementale/online. La sua risposta è stata: "Purtroppo no, il motivo è che non vediamo ancora un'impostazione standard per l'apprendimento incrementale/decrescente". – Cerin

+0

Ciò che mostra il codice di esempio non è l'apprendimento online. – mrgloom

4

non ho sentito di uno. Ma hai davvero bisogno dell'apprendimento online? Sto usando SVM da un po 'di tempo e non ho mai riscontrato un problema in cui dovevo usare l'apprendimento online. Di solito ho impostato una soglia sul numero di modifiche degli esempi di addestramento (forse 100 o 1000) e quindi su tutto il gruppo.

Se il problema è su una scala, in cui è assolutamente necessario utilizzare l'apprendimento online, è possibile dare un'occhiata a vowpal wabbit.

ripubblicato sotto, dopo il commento:

Olivier Grisel suggerito di utilizzare un wrapper ctypes intorno LaSVM. Dal momento che non conoscevo LaSVM prima e sembra abbastanza bello, sono incuriosito di provarlo per i miei problemi :).

Se sei limitato a utilizzare il Python-VM solo (dispositivi embedded, robot), suggerirei di utilizzare votato/media perceptron, che svolge nei pressi di uno SVM, ma è facile da implementare e "on-line" per impostazione predefinita.

Appena visto che Elefant ha un codice online-SVM.

+0

Ne ho bisogno per l'apprendimento di rinforzo. –

+0

Qualcuno è stato in grado di costruire VW su Linux? Ho installato boost, ma VW sembra presumere una versione molto più vecchia. – Cerin

+0

LaSVM sembra essere il vincitore qui. Ha una piccola base di codice. Supporta esplicitamente l'apprendimento online. Compila facilmente (testato su Ubuntu 9.10). Non ha un'API Python diretta, ma crea due semplici utility a riga di comando che possono essere facilmente chiamate da Python per creare il modello (la_svm) e utilizzare il modello (la_test). – Cerin

0

Perché vorresti allenarlo online? L'aggiunta di istanze di formazione di solito richiederebbe di risolvere nuovamente il problema di programmazione quadratica associato all'SVM.

Un modo per gestire questo è di addestrare un SVM in modalità batch e quando sono disponibili nuovi dati, controllare se questi punti di dati si trovano nel margine [-1, +1] dell'iperplano. In tal caso, riqualificare SVM utilizzando tutti i vecchi vettori di supporto e i nuovi dati di allenamento che rientrano nel margine.

Naturalmente, i risultati possono essere leggermente diverse rispetto alla formazione batch su tutti i vostri dati, come alcuni punti possono essere scartati che sarebbe vettori di supporto in seguito. Quindi, ancora una volta, perché vuoi eseguire la formazione online di te SVM?

+1

Ho già risposto alla prima domanda. Lo sto usando per un progetto di rafforzamento dell'apprendimento, quindi ha bisogno di imparare online. –

+0

Attenzione che la modalità batch può essere pessima che casuale, se implementata in modo ingenuo. – Davide

+0

Questa metodologia non si ridimensiona. Il risanamento dell'intero set di dati per ogni nuovo record avrebbe prestazioni esponenziali nel migliore dei casi. L'apprendimento online avrebbe prestazioni costanti o lineari, a seconda dell'implementazione. – Cerin

1

Mentre non ci sono collegamenti Python, l'algoritmo descritto in http://leon.bottou.org/projects/sgd viene addestrato in modalità online ed è facilmente reimplementato utilizzando, ad es. NumPy.

+1

La discesa gradiente stocastica (SGD) è anche implementata in scikit-learn (http://scikit-learn.sourceforge.net/). Sebbene l'adattamento on-line dei classificatori basati su SGD non sia ancora stato esposto, sarà nei prossimi 6 mesi. –

1

Pegasos è un algoritmo SVM on-line che esegue molto bene. È anche abbastanza facile da implementare, anche senza uno specifico collegamento Python. C'è un C implementation sul sito dell'autore che è adattabile o anche integrabile.

Problemi correlati