2010-11-18 2 views

ответ

12

LIBSVM считывает данные из кортежа, содержащего два списка. Первый список содержит классы, а второй список содержит входные данные. создайте простой набор данных с двумя возможными классами , вам также нужно указать, какое ядро ​​вы хотите использовать, создав svm_parameter.

 

>> from libsvm import * 
>> prob = svm_problem([1,-1],[[1,0,1],[-1,0,-1]]) 
>> param = svm_parameter(kernel_type = LINEAR, C = 10) 
    ## training the model 
>> m = svm_model(prob, param) 
#testing the model 
>> m.predict([1, 1, 1]) 
 

+3

Этот код, как представляется, не работает на последней версии libsvm. Мне кажется, svm_parameter требует разных ключевых слов. – JeremyKun

+0

@JeremyKun У меня была такая же проблема, как и в [libsvm python documentation] (https://github.com/cjlin1/libsvm/tree/master/python) вместо этого используется 'from svmutil import *'. См. Ответ @ ShinNoNoir ниже. – jonchar

20

Этот пример демонстрирует один класс SVM классификатор; это примерно так же просто, насколько возможно, при этом показывая полный рабочий процесс LIBSVM.

Шаг 1: Импорт NumPy & LIBSVM

import numpy as NP 
    from svm import * 

Шаг 2: Генерация синтетических данных: для этого примера, 500 точек в пределах заданной границы (примечание: очень немногие реальные наборы данных приведены на LIBSVM website)

Data = NP.random.randint(-5, 5, 1000).reshape(500, 2) 

Шаг 3: Теперь выбрать некоторую нелинейную границу решения для один класса классификатора:

rx = [ (x**2 + y**2) < 9 and 1 or 0 for (x, y) in Data ] 

Шаг 4: Далее, произвольно разделить данные ш/r/t эта граница решения:

  • Класс I: те, которые лежат на или в пределах произвольный круг

  • Класс II: все точки за пределами решение граничной (окружности)


Здесь начинается модельное здание СВМ; все шаги перед этим были только для подготовки синтетических данных.

Шаг 5: Построить описание в проблеме по телефону svm_problem, переходящему в граничной функции решения и данных, затем связать этот результат переменного.

px = svm_problem(rx, Data) 

Шаг 6: Выберите функцию ядра для нелинейного отображения

Для этого exmaple, я выбрал почечный кровоток (радиальная базисная функция), как моя функция ядра

pm = svm_parameter(kernel_type=RBF) 

Шаг 7: Поезд классификатор, по телефону svm_model, переходящая в описании к проблемы (пикс) & ядро ​​ (вторая половина дня)

v = svm_model(px, pm) 

Шаг 8: Наконец , проверьте подготовленный классификатор, позвонив предскажите на обученный объект модели ('v')

v.predict([3, 1]) 
# returns the class label (either '1' or '0') 

Для приведенного выше примера, я использовал версию 3.0 из LIBSVM (текущий стабильный выпуск на момент этот ответ была опубликована).

Наконец, ш/г/т на части вашего вопроса о выборе ядра функции, опорные векторы Машина не для конкретной функции ядра - например, я мог бы выбрать другие ядро (гауссовское, многочленное и т. д.).

LIBSVM включает в себя все наиболее часто используемых функций ядра - что это большая помощь, потому что вы можете увидеть все возможные альтернативы и выбрать один для использования в вашей модели, это просто вопрос вызова svm_parameter и переходя в значение для kernel_type (трехбуквенная аббревиатура для выбранного ядра).

Наконец, функция ядра, которую вы выбираете для обучения, должна соответствовать функции ядра, используемой против данных тестирования.

+5

На шаге 5 я получаю: «Traceback (последний последний звонок): Файл« », строка 1, в Файл« /usr/lib/pymodules/python2.7/svm.py », строка 83 , в __init__ tmp_xi, tmp_idx = gen_svm_nodearray (xi, isKernel = isKernel) Файл "/usr/lib/pymodules/python2.7/svm.py ", строка 51, в gen_svm_nodearray raise TypeError ('xi должен быть словарем, списком или tuple') TypeError: xi должен быть словарем, списком или кортежем ' – cnvzmxcvmcx

+0

Кроме того, для шага 6 я получил 'TypeError: __init __() получил неожиданный аргумент ключевого слова 'kernel_type''. –

+0

Я получаю тот же TypeError. – elec3647

5

Вы могли бы рассмотреть возможность использования

http://scikit-learn.sourceforge.net/

Это имеет большой питон связывание libsvm и должна быть легко установить

22

примеров кода, перечисленных здесь не работают с LibSVM 3,1, так что я «ве более или менее портирована the example by mossplix:

from svmutil import * 
svm_model.predict = lambda self, x: svm_predict([0], [x], self)[0][0] 

prob = svm_problem([1,-1], [[1,0,1], [-1,0,-1]]) 

param = svm_parameter() 
param.kernel_type = LINEAR 
param.C = 10 

m=svm_train(prob, param) 

m.predict([1,1,1]) 
3

Добавление к @shinNoNoir:

param.kernel_type представляет тип функции ядра, который вы хотите использовать, 0: Линейный 1: Полином 2: RBF 3: сигмовидной

также иметь в виду, что, svm_problem (у, х): здесь у не классовые меток и х экземпляров класса и х и у могут быть только списки, кортежи и словари. (без NumPy массива)

1
param = svm_parameter('-s 0 -t 2 -d 3 -c '+str(C)+' -g '+str(G)+' -p '+str(self.epsilon)+' -n '+str(self.nu)) 

Я не знаю, о более ранних версиях, но в LibSVM 3.xx метод svm_parameter('options') будет t akes только один аргумент.

В моем случае C, G, p и nu - это динамические значения. Вы вносите изменения в соответствии с вашим кодом.


Варианты:

-s svm_type : set type of SVM (default 0) 
     0 -- C-SVC  (multi-class classification) 
     1 -- nu-SVC  (multi-class classification) 
     2 -- one-class SVM 
     3 -- epsilon-SVR (regression) 
     4 -- nu-SVR  (regression) 
    -t kernel_type : set type of kernel function (default 2) 
     0 -- linear: u'*v 
     1 -- polynomial: (gamma*u'*v + coef0)^degree 
     2 -- radial basis function: exp(-gamma*|u-v|^2) 
     3 -- sigmoid: tanh(gamma*u'*v + coef0) 
     4 -- precomputed kernel (kernel values in training_set_file) 
    -d degree : set degree in kernel function (default 3) 
    -g gamma : set gamma in kernel function (default 1/num_features) 
    -r coef0 : set coef0 in kernel function (default 0) 
    -c cost : set the parameter C of C-SVC, epsilon-SVR, and nu-SVR (default 1) 
    -n nu : set the parameter nu of nu-SVC, one-class SVM, and nu-SVR (default 0.5) 
    -p epsilon : set the epsilon in loss function of epsilon-SVR (default 0.1) 
    -m cachesize : set cache memory size in MB (default 100) 
    -e epsilon : set tolerance of termination criterion (default 0.001) 
    -h shrinking : whether to use the shrinking heuristics, 0 or 1 (default 1) 
    -b probability_estimates : whether to train a SVC or SVR model for probability estimates, 0 or 1 (default 0) 
    -wi weight : set the parameter C of class i to weight*C, for C-SVC (default 1) 
    -v n: n-fold cross validation mode 
    -q : quiet mode (no outputs) 

Источник документации: https://www.csie.ntu.edu.tw/~cjlin/libsvm/

1

SVM через SciKit учиться:

from sklearn.svm import SVC 
X = [[0, 0], [1, 1]] 
y = [0, 1] 
model = SVC().fit(X, y) 

tests = [[0.,0.], [0.49,0.49], [0.5,0.5], [2., 2.]] 
print(model.predict(tests)) 
# prints [0 0 1 1] 

Для получения более подробной информации здесь: http://scikit-learn.org/stable/modules/svm.html#svm

0

Вот фиктивный пример I пюре:

import numpy 
import matplotlib.pyplot as plt 
from random import seed 
from random import randrange 

import svmutil as svm 

seed(1) 

# Creating Data (Dense) 
train = list([randrange(-10, 11), randrange(-10, 11)] for i in range(10)) 
labels = [-1, -1, -1, 1, 1, -1, 1, 1, 1, 1] 
options = '-t 0' # linear model 
# Training Model 
model = svm.svm_train(labels, train, options) 


# Line Parameters 
w = numpy.matmul(numpy.array(train)[numpy.array(model.get_sv_indices()) - 1].T, model.get_sv_coef()) 
b = -model.rho.contents.value 
if model.get_labels()[1] == -1: # No idea here but it should be done :| 
    w = -w 
    b = -b 

print(w) 
print(b) 

# Plotting 
plt.figure(figsize=(6, 6)) 
for i in model.get_sv_indices(): 
    plt.scatter(train[i - 1][0], train[i - 1][1], color='red', s=80) 
train = numpy.array(train).T 
plt.scatter(train[0], train[1], c=labels) 
plt.plot([-5, 5], [-(-5 * w[0] + b)/w[1], -(5 * w[0] + b)/w[1]]) 
plt.xlim([-13, 13]) 
plt.ylim([-13, 13]) 
plt.show() 

enter image description here