Проблема з e1071 libsvm?


13

У мене є набір даних з двома класами, що перекриваються, по сім балів у кожному класі, точки - у двовимірному просторі. У R, і я біжу svmвід e1071пакета, щоб побудувати роздільну гіперплан для цих класів. Я використовую таку команду:

svm(x, y, scale = FALSE, type = 'C-classification', kernel = 'linear', cost = 50000)

де xмістяться мої точки даних та yїх мітки. Команда повертає об’єкт svm, який я використовую для обчислення параметрів (нормальний вектор) і (перехоплення) розділової гіперплани.bwb

На малюнку (а) нижче показані мої точки та гіперплан, повернутий svmкомандою (назвемо цю гіперплану оптимальною). Синя точка з символом O показує початок простору, пунктирними лініями відображається межа, окружні - точки, які мають ненульовий (слабкі змінні).ξ

На рисунку (b) показано ще одну гіперплану, яка є паралельним перекладом оптимального на 5 (b_new = b_optimal - 5). Не важко побачити, що для цієї гіперплани цільова функція (яка мінімізована С-класифікацією svm) матиме нижче значення, ніж для оптимальної гіперплани, показаної на рисунку ( а). Так виглядає проблема з цією функцією? Або я десь помилився?

0.5||w||2+costξi
svm

введіть тут опис зображення

Нижче наведено код R, який я використав у цьому експерименті.

library(e1071)

get_obj_func_info <- function(w, b, c_par, x, y) {
    xi <- rep(0, nrow(x))

    for (i in 1:nrow(x)) {
        xi[i] <- 1 - as.numeric(as.character(y[i]))*(sum(w*x[i,]) + b)
        if (xi[i] < 0) xi[i] <- 0
    }

    return(list(obj_func_value = 0.5*sqrt(sum(w * w)) + c_par*sum(xi), 
                    sum_xi = sum(xi), xi = xi))
}

x <- structure(c(41.8226593092589, 56.1773406907411, 63.3546813814822, 
66.4912298720281, 72.1002963174962, 77.649309469458, 29.0963054665561, 
38.6260575252066, 44.2351239706747, 53.7648760293253, 31.5087701279719, 
24.3314294372308, 21.9189647758150, 68.9036945334439, 26.2543850639859, 
43.7456149360141, 52.4912298720281, 20.6453186185178, 45.313889181287, 
29.7830021158501, 33.0396571934088, 17.9008386892901, 42.5694092520593, 
27.4305907479407, 49.3546813814822, 40.6090664454681, 24.2940422573947, 
36.9603428065912), .Dim = c(14L, 2L))

y <- structure(c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L), .Label = c("-1", "1"), class = "factor")

a <- svm(x, y, scale = FALSE, type = 'C-classification', kernel = 'linear', cost = 50000)

w <- t(a$coefs) %*% a$SV;
b <- -a$rho;

obj_func_str1 <- get_obj_func_info(w, b, 50000, x, y)
obj_func_str2 <- get_obj_func_info(w, b - 5, 50000, x, y)

Ви налаштували параметр вартості?
Етьєн Расін

Зауважте, що тег BUGS посилається на байєсівський умовивід використання Gibbs Sampling, а не на проблеми з програмним забезпеченням. Я видалив тег.
Sycorax повідомляє, що повернеться Моніка

Відповіді:


5

У FAQ щодо libsvm згадується, що мітки, використовувані алгоритмом "всередині", можуть відрізнятися від ваших. Це іноді переверне знак "кофе" моделі.

Наприклад, якщо ви мали етикетки , то перша мітка в , що "-1", буде класифікуватися як для запуску libsvm і, очевидно, ваш "+1" буде класифікований як всередині алгоритму.у + 1 - 1y=[1,+1,+1,1,...]y+11

І нагадайте, що коефіцієнти у поверненій моделі svm дійсно є і тому ваш обчислений вектор буде впливати через реверсію знака . w yαnynwy

Дивіться питання "Чому знак передбачуваних міток та значень рішення іноді змінюється на зворотній стороні?" тут .


4

Я зіткнувся з тією ж проблемою, використовуючи LIBSVM в MATLAB. Щоб перевірити це, я створив дуже простий, 2D лінійно відокремлений набір даних, який, здавалося, був переведений по одній осі на -100. Навчання лінійного svm за допомогою LIBSVM дало гіперплан, перехоплення якого все ще було прямо біля нуля (і, таким чином, швидкість помилок становила 50%, природно). Стандартизація даних (віднімання середнього) допомогла, хоча отриманий svm все ще не був ідеальним ... здивування. Схоже, LIBSVM лише обертає гіперплан навколо осі, не перекладаючи її. Можливо, вам слід спробувати відняти середнє значення зі своїх даних, але здається дивним, що LIBSVM поводитиметься так. Можливо, нам чогось не вистачає.

Для чого варто, вбудована функція MATLAB svmtrainстворила класифікатор зі 100% точністю, без стандартизації.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.