Пример использования привязок Python для библиотеки SVM, LIBSVM - PullRequest
24 голосов
/ 18 ноября 2010

Мне очень нужен пример задачи классификации с использованием LibSVM в python.Я не знаю, как должен выглядеть ввод, и какая функция отвечает за обучение, а какая за тестирование. Спасибо

Ответы [ 8 ]

24 голосов
/ 18 июля 2011

Приведенные здесь примеры кода не работают с LibSVM 3.1, поэтому я более или менее перенес пример с 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])
21 голосов
/ 18 ноября 2010

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

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

  import numpy as NP
    from svm import *

Шаг 2: Создание синтетических данных: для этого примера 500 точек в пределах заданной границы (примечание: на LIBSVM * 1020 предоставлено довольно много реальных наборов данных* 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: Далее произвольно разделить данные по этой границе решения:

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

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


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

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

px = svm_problem(rx, Data)

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

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

pm = svm_parameter(kernel_type=RBF)

Шаг 7: Обучить классификатор, вызвав svm_model , передаваяв описании проблемы (px) & kernel (pm)

v = svm_model(px, pm)

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

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

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

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

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

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

13 голосов
/ 18 ноября 2010

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


5 голосов
/ 28 декабря 2010

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

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

Имеет отличную привязку Python к libsvm и должен легко устанавливаться

3 голосов
/ 29 ноября 2011

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

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

Также имейте в видучто, svm_problem (y, x): здесь y - метки класса, а x - экземпляры класса, а x и y могут быть только списками, кортежами и словарями (без массива)

1 голос
/ 16 октября 2016

SVM через SciKit-learn:

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

1 голос
/ 29 ноября 2013
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') принимает только один аргумент .

В моем случае 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/

0 голосов
/ 25 декабря 2017

Вот фиктивный пример, который я запутал:

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

...