Интерпретировать модель результата из 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)