Интерпретировать модель результата из svnlight

Я хочу разделить некоторые точки двух классов в 3D плоскостью и подумал, что это возможно с помощью машины опорных векторов (SVM).

Поэтому я настроил следующий файл данных (data.txt) для анализа с помощью svmlight:

-1 1:1 2:1 3:0
 1 1:1 2:2 3:0
-1 1:3 2:2 3:0
 1 1:3 2:3 3:0
-1 1:5 2:3 3:0
 1 1:5 2:4 3:0
-1 1:7 2:4 3:0
 1 1:7 2:5 3:0
-1 1:1 2:1 3:2
 1 1:1 2:2 3:2
-1 1:3 2:2 3:2
 1 1:3 2:3 3:2
-1 1:5 2:3 3:2
 1 1:5 2:4 3:2
-1 1:7 2:4 3:2
 1 1:7 2:5 3:2

выполнить:

./svm_learn data.txt model

К сожалению, я не знаю, как интерпретировать модель и как описывается разделительная плоскость.

Вы можете помочь?

1 ответ

В результате ваш файл модели должен выглядеть так:

SVM-light Version V6.02
0 # kernel type
3 # kernel parameter -d 
1 # kernel parameter -g 
1 # kernel parameter -s 
1 # kernel parameter -r 
empty# kernel parameter -u 
3 # highest feature index 
16 # number of training documents 
17 # number of support vectors plus 1 
0.85699902 # threshold b, each following line is a SV (starting with alpha*y)
-0.035708292619498309405923208714739 1:5 2:3 3:0 #
-0.035708292619498309405923208714739 1:1 2:1 3:2 #
0.035708292619498309405923208714739 1:1 2:2 3:0 #
-0.035708292619498309405923208714739 1:1 2:1 3:0 #
0.035708292619498309405923208714739 1:7 2:5 3:2 #
-0.035708292619498309405923208714739 1:7 2:4 3:2 #
0.035708292619498309405923208714739 1:1 2:2 3:2 #
-0.035708292619498309405923208714739 1:5 2:3 3:2 #
0.035708292619498309405923208714739 1:3 2:3 3:0 #
0.035708292619498309405923208714739 1:7 2:5 3:0 #
-0.035708292619498309405923208714739 1:7 2:4 3:0 #
0.035708292619498309405923208714739 1:3 2:3 3:2 #
-0.035708292619498309405923208714739 1:3 2:2 3:0 #
0.035708292619498309405923208714739 1:5 2:4 3:0 #
-0.035708292619498309405923208714739 1:3 2:2 3:2 #
0.035708292619498309405923208714739 1:5 2:4 3:2 #

Это все параметры вашей модели. Первые 9 значений - это конфигурация вашей модели (используемое ядро ​​и т. Д.).

Вы можете прочитать всю информацию о параметрах, выполнив ./svm_learn --helpВ частности, kernel=0 означает, что это линейное ядро ​​(которое вы хотели использовать).

Файл модели содержит список векторов поддержки, которые являются точками из обучающего набора, которые "ближе всего" к разделяющей гиперплоскости, это основная идея svm - "поддерживать" границу вашего решения только подмножеством ваших данных. Этих векторов достаточно, чтобы определить разделение, просто используя взвешенное среднее их значений. Эти веса alpha параметры, найденные в процессе оптимизации (и находящиеся также в файле). Для простоты эти веса уже умножены на соответствующие метки (+1 или же -1), чтобы различить, с какой "стороны" разделяющей гиперплоскости они находятся.

Для линейного ядра интерпретация следующих опорных векторов довольно проста. у вас 17 параметров, во-первых, есть b значение, свободный параметр вашей гиперплоскости, а затем - 16 векторов поддержки. Для преобразования векторов поддержки в форму

alphay_i 1:s_i_1 2:s_i_2 3:s_i_3

просто рассчитать сумму

w = SUM_i alphay_i (s_i_1,s_i_2,s_i_3) = SUM_i alphay_i s_i

что приводит к уравнению разделяющей нормали гиперплоскости (перпендикулярного вектора). Все уравнение вашей разделяющей гиперплоскости теперь имеет вид:

<w,x> + b = 0

где w это сумма, и b предварительно определенный параметр "перехват" (0.85699902 в вашем случае) и <w,x> является стандартным скалярным произведением.

Так что для линейного ядра это упрощает

w'x + b = 0

В общем случае, когда вы используете более сложное ядро ​​(например, RBF или даже полином), вы не можете получить фактические параметры гиперплоскости, поскольку этот объект находится в пространстве признаков (поэтому для случая RBF он имеет бесконечно много измерений). Вы можете иметь только его функциональную форму

<w,x> = SUM_i alphay_i K(s_i, x)
Другие вопросы по тегам