Мне очень нужен пример задачи классификации с использованием LibSVM в python. Я не знаю, как должен выглядеть вход и какая функция отвечает за обучение, а какая - для тестирования. . Спасибо.Пример использования привязок python для библиотеки SVM, LIBSVM
ответ
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])
Этот пример демонстрирует один класс 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 я получаю: «Traceback (последний последний звонок): Файл«
Кроме того, для шага 6 я получил 'TypeError: __init __() получил неожиданный аргумент ключевого слова 'kernel_type''. –
Я получаю тот же TypeError. – elec3647
Вы могли бы рассмотреть возможность использования
http://scikit-learn.sourceforge.net/
Это имеет большой питон связывание libsvm и должна быть легко установить
примеров кода, перечисленных здесь не работают с 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])
Добавление к @shinNoNoir:
param.kernel_type представляет тип функции ядра, который вы хотите использовать, 0: Линейный 1: Полином 2: RBF 3: сигмовидной
также иметь в виду, что, svm_problem (у, х): здесь у не классовые меток и х экземпляров класса и х и у могут быть только списки, кортежи и словари. (без NumPy массива)
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/
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
Вот фиктивный пример 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()
Этот код, как представляется, не работает на последней версии libsvm. Мне кажется, svm_parameter требует разных ключевых слов. – JeremyKun
@JeremyKun У меня была такая же проблема, как и в [libsvm python documentation] (https://github.com/cjlin1/libsvm/tree/master/python) вместо этого используется 'from svmutil import *'. См. Ответ @ ShinNoNoir ниже. – jonchar