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. .)
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
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