2015-11-19 3 views
4

J'ai trouvé un comportement déroutant dans le paquet kernlab: estimer des SVM qui sont mathématiquement identiques produit des résultats différents dans le logiciel.Kernlab kraziness: résultats incohérents pour des problèmes identiques

Cet extrait de code prend simplement les données de l'iris et en fait un problème de classification binaire par souci de simplicité. Comme vous pouvez le voir, j'utilise des noyaux linéaires dans les deux SVM.

library(kernlab) 
library(e1071) 

data(iris) 
x <- as.matrix(iris[, 1:4]) 
y <- as.factor(ifelse(iris[, 5] == 'versicolor', 1, -1)) 
C <- 5.278031643091578 

svm1 <- ksvm(x = x, y = y, scaled = FALSE, kernel = 'vanilladot', C = C) 

K <- kernelMatrix(vanilladot(), x) 
svm2 <- ksvm(x = K, y = y, C = C, kernel = 'matrix') 

svm3 <- svm(x = x, y = y, scale = FALSE, kernel = 'linear', cost = C) 

Cependant, les informations de résumé des SVM1 et SVM2 sont considérablement différents: rapports de kernlab complètement différents comptes de vecteur de soutien, les taux d'erreur de formation, et des valeurs de fonction objectives entre les deux modèles.

> svm1 
Support Vector Machine object of class "ksvm" 

SV type: C-svc (classification) 
parameter : cost C = 5.27803164309158 

Linear (vanilla) kernel function. 

Number of Support Vectors : 89 

Objective Function Value : -445.7911 
Training error : 0.26 
> svm2 
Support Vector Machine object of class "ksvm" 

SV type: C-svc (classification) 
parameter : cost C = 5.27803164309158 

[1] " Kernel matrix used as input." 

Number of Support Vectors : 59 

Objective Function Value : -292.692 
Training error : 0.333333 

Pour des raisons de comparaison, je également calculé en utilisant le même modèle e1071, qui fournit une interface de R pour le paquet libsvm.

svm3 

Call: 
svm.default(x = x, y = y, scale = FALSE, kernel = "linear", cost = C) 


Parameters: 
    SVM-Type: C-classification 
SVM-Kernel: linear 
     cost: 5.278032 
     gamma: 0.25 

Number of Support Vectors: 89 

It reports 89 support vectors, the same as svm1. 

Ma question est de savoir s'il y a des bogues connus dans le paquetage kernlab qui peuvent expliquer ce comportement inhabituel. (Kernlab pour R est un solveur SVM qui permet d'utiliser une des fonctions du noyau préemballées, ou une matrice de noyau fournie par l'utilisateur.) La sortie est une estimation d'une machine de vecteur de support pour les hyperparamètres fournis par l'utilisateur. .)

+2

Très intéressant. J'ai regardé cela pendant un moment et je suis toujours coincé. Je n'arrive pas à comprendre ce qui se passe dans [le code] (https://github.com/cran/kernlab/blob/efd7d91521b439a993efb49cf8e71b57fae5fc5a/src/svm.cpp#L4025). Peut-être que la matrice "Q" (voir [ici] (https://github.com/cran/kernlab/blob/efd7d91521b439a993efb49cf8e71b57fae5fc5a/src/svm.cpp#L463)) est légèrement différente lorsqu'on lui donne une matrice de noyau précalculée? Au moins, c'est là que je commencerais à déboguer. Pour autant que je sache, les fonctions qui récupèrent les produits scalaires précalculés fonctionnent correctement. – kdauria

+0

Une question différente, mais connexe [http://stackoverflow.com/questions/17691036/in-r-why-is-result-of-ksvm-using-user-defined-linear-kernel-different-from- tha). – kdauria

Répondre

2

Revoir une partie du code, il semble que ce soit la ligne incriminée:

https://github.com/cran/kernlab/blob/efd7d91521b439a993efb49cf8e71b57fae5fc5a/src/svm.cpp#L4205

C'est, dans le cas d'une matrice du noyau fourni par l'utilisateur, le ksvm est simplement regarder deux dimensions, plutôt que quelle que soit la dimensionnalité de l'entrée. Cela semble étrange, et est probablement un hold-over de certains tests ou autres. Les tests du noyau linéaire avec des données de deux dimensions seulement produisent le même résultat: remplacez 1:4 par 1:2 ci-dessus et la sortie et les prédictions sont toutes d'accord.