Accord.Net Получить уравнение модели SVM

Я тестировал образцы машин опорных векторов ядра для задач регрессии и хотел бы знать, как вы получаете уравнение модели.

Например, если машина создана с использованием полиномиального ядра (степень = 1), как получить линейное уравнение (mx + b) этой модели. Есть ли какой-либо метод в классе SupportVectorMachine для получения уравнения модели? или есть ли способ вычислить параметры уравнения из переменных, полученных после создания машины.

Заранее спасибо.


person Pablo Gonzalez    schedule 19.01.2017    source источник


Ответы (3)


Похоже, вы можете использовать этот метод ниже:

ToWeights(), который

Преобразует машину с линейным ядром в массив линейных коэффициентов. Первая позиция в массиве — пороговое значение.

Таким образом, на вашем языке первая позиция в массиве — это смещение b, а остальные — ваши линейные коэффициенты m.

person greeness    schedule 25.01.2017
comment
Я не понимаю ответа. Для строки y=x выходной массив равен {0,4,0}. Для строки y = 2x выходной массив равен {0,7,0}. Я только что добавил эту строку double[] linearCoef = svm.ToWeights(); - person Pablo Gonzalez; 26.01.2017
comment
Вы предоставили достаточно обучающих данных? Как вы узнали свою модель? Каковы ваши тренировочные данные? Пожалуйста, будьте конкретны. - person greeness; 26.01.2017
comment
Еще раз спасибо за ваш ответ. Я использую простую демонстрацию 6 пар данных. Для y=x {(0,0), (1,1),...,(5,5)} и для y=2x {(0,0),(1,2),...,( 5,10)} . Я использую демо-образец Kernel Support Vector Machines для задач регрессии, и я создаю машину, используя полиномиальную степень ядра = 1, константу = 1. Графический вывод, показанный моделью, - это то, что я ожидаю (линия, проходящая через все точки данных) с ошибкой = 0. - person Pablo Gonzalez; 02.02.2017
comment
Если у вас есть проблема с двумя переменными, скажем, x и y, разве вы не должны ожидать, что формула будет чем-то вроде z = xa + yb + c вместо y = mx? В этом случае, если фреймворк выдает в качестве вывода массив {0, 4, 0}, это означает c = 0 (первый — порог/смещение), а затем a = 4 и b = 0. - person Cesar; 08.07.2017

Я получил странные коэффициенты от ToWeights() при использовании SequentialMinimalOptimization(), из которых я не мог вывести уравнение гиперплоскости. Однако использование LinearCoordinateDescent() дало полезные коэффициенты для модели в виде [a,b,c...], которые можно было подставить как 0 = a + bx + cy +... Надеюсь, это поможет!

person zrolfs    schedule 06.04.2018

Как отметил @zrolfs, если вы используете Accord.NET с последовательной минимальной оптимизацией, функция ToWeights() в настоящее время не возвращает соответствующие коэффициенты для функции принятия решений. Тем не менее, вы можете рассчитать эти коэффициенты напрямую. Для этого умножьте вектор весов SVM на матрицу опорных векторов, например:

double[] DecisionFunctionCoefficients = new double[dwTotalFeatures];
for (int iFeature = 0; iFeature < dwTotalFeatures; iFeature++) {
     for (int iVector = 0; iVector < SVM.SupportVectors.Length; iVector++) {
         DecisionFunctionCoefficients[iFeature] += (SVM.SupportVectors[iVector][iFeature] * SVM.Weights[iVector]);
     }
}
person Avi Shmidman    schedule 31.12.2020