Существуют ли какие-либо библиотеки SVM, которые поддерживают пользовательские ядра, которые можно использовать с Visual Studio C ++?

Кажется, что каждая библиотека SVM для C ++ либо

  1. Запрещение пользовательских ядер или
  2. Linux эксклюзив и будет святой болью для использования с Visual Studio.

Существуют ли в настоящее время какие-либо библиотеки SVM, которые поддерживают собственные ядра и могут использоваться в Visual Studio (в частности, в 2010 году)?

4

Решение

Как я уже сказал, легко изменить libsvm для того, что вам нужно, и вот объяснение: http://www.csie.ntu.edu.tw/~cjlin/libsvm/faq.html#f418

Поскольку я не знаком с этими двумя ядрами, я просто скопировал формулы из Google. Я надеюсь, что я понял их правильно: D

A. Ядро пересечения гистограммы (очень плохо, SO не рендерит латекс): SUM (min (x_i, y_i)) -> мы можем просто изменить линейное ядро ​​и преобразовать его в это, поэтому, в основном, в версии 3.12 (последняя версия), в svm.cpp:

-> строка 233 возвращает точку (x [i], x [j]); — вам просто нужно скопировать код из метода Kernel :: dot и соответственно изменить его, так что-то вроде этого:

double sum = 0;
while(x->index != -1 && y->index != -1)
{
if(x->index == y->index)
{
sum += min(x->value, y->value);
++x;
++y;
}
else
{
if(x->index > y->index)
++x;
else
++y;
}
}
return sum;

(для обычных тестовых файлов x должен иметь ту же длину, что и y. Я думаю, что ветвь else существует для особых случаев, когда тестовый или модельный файл содержит атрибуты со значением 0, которые можно опустить, но если libsvm выдает ожидаемые результаты с линейное ядро, то с этим модифицированным тоже будет нормально работать)

-> строка 322 возвращает точку (x, y); — так же, как и выше

B. Ядро хи-квадрат: SUM ((2 x_i y_i) / (x_i + y_i)) — хорошо, давайте посмотрим … Я думаю, что мы можем попытаться снова изменить линейное ядро ​​(может быть, некоторые из оптимизаций для RBF могут быть эксплуатируется в этом случае, но давайте пока проигнорируем это):

-> строка 233 становится:

double sum = 0;
while(x->index != -1 && y->index != -1)
{
if(x->index == y->index)
{
sum += 2 * x->value * y->value / (x->value + y->value);
++x;
++y;
}
else
{
if(x->index > y->index)
++x;
else
++y;
}
}
return sum;

-> строка 322 — такая же, как выше

PS: приведенный выше код написан в блокноте и не проверен. Пожалуйста, не убивайте меня, если это не сработает, и вам придется потратить две недели на отладку загадочного C-кода. [sarcasm] Для меня это сработало с первой попытки. [/ sarcasm] Тем не менее, вы можете легко отладить его, как только поймете рабочий процесс, поставив точки останова в этих двух местах. Если у вас возникнут проблемы, я с радостью предоставлю дополнительную помощь, поэтому просто дайте мне знать, если вы застряли.

9

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]