Problemi con e1071 libsvm?


13

Ho un set di dati con due classi sovrapposte, sette punti in ogni classe, i punti sono nello spazio bidimensionale. In R, e sto correndo svmdal e1071pacchetto per creare un hyperplane di separazione per queste classi. Sto usando il seguente comando:

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

dove xcontiene i miei punti dati e ycontiene le loro etichette. Il comando restituisce un oggetto svm, che uso per calcolare i parametri (vettore normale) (intercetta) dell'iperpiano di separazione.bwb

La figura (a) in basso mostra i miei punti e l'iperpiano restituito dal svmcomando (chiamiamo questo iperpiano quello ottimale). Il punto blu con il simbolo O mostra l'origine dello spazio, le linee tratteggiate mostrano il margine, cerchiate sono punti che hanno zero- ξ (variabili lente).

La figura (b) mostra un altro iperpiano, che è una traduzione parallela dell'ottimale per 5 (b_new = b_optimal - 5). Non è difficile vedere che per questo iperpiano la funzione obiettiva

0.5||w||2+costξi
(che è minimizzata dalla classificazione C svm) avrà un valore inferiore rispetto all'iperpiano ottimale mostrato in figura ( un). Quindi sembra che ci sia un problema con questa svmfunzione? O ho fatto un errore da qualche parte?

inserisci qui la descrizione dell'immagine

Di seguito è riportato il codice R che ho usato in questo esperimento.

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)

Hai ottimizzato il parametro di costo?
Etienne Racine,

Si noti che il tag BUGS si riferisce all'inferenza bayesiana utilizzando il campionamento di Gibbs, non a problemi di software. Ho rimosso il tag.
Sycorax dice di reintegrare Monica il

Risposte:


5

Nella FAQ di libsvm è menzionato che le etichette usate "dentro" l'algoritmo possono essere diverse dalle tue. Questo a volte invertirà il segno dei "coef" del modello.

Ad esempio, se avevi le etichette , la prima etichetta in , che è "-1", sarà classificata come per l'esecuzione di libsvm e, ovviamente, il tuo "+1" verrà classificato come all'interno dell'algoritmo.y + 1 - 1y=[1,+1,+1,1,...]y+11

E ricorda che i coefficienti nel modello svm restituito sono in effetti e quindi il tuo vettore calcolato sarà influenzato a causa dell'inversione del segno di 's. w yαnynwy

Vedi la domanda "Perché il segno delle etichette previste e i valori delle decisioni sono talvolta invertiti?" QUI .


4

Ho riscontrato lo stesso problema utilizzando LIBSVM in MATLAB. Per provarlo, ho creato un set di dati 2D separabile linearmente molto semplice che è stato tradotto lungo un asse fino a circa -100. L'addestramento di uno svm lineare usando LIBSVM ha prodotto un iperpiano la cui intercettazione era ancora intorno allo zero (e quindi il tasso di errore era del 50%, naturalmente). La standardizzazione dei dati (sottraendo la media) ha aiutato, sebbene lo svm risultante non funzionasse ancora perfettamente ... perplesso. Sembra che LIBSVM ruoti l'iperpiano solo attorno all'asse senza tradurlo. Forse dovresti provare a sottrarre la media dai tuoi dati, ma sembra strano che LIBSVM si comporti in questo modo. Forse ci manca qualcosa.

Per quello che vale, la funzione MATLAB integrata ha svmtrainprodotto un classificatore con una precisione del 100%, senza standardizzazione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.