Kernlab kraziness:对于相同问题的结果不一致

问题描述:

我在kernlab软件包中发现了一些令人费解的行为:估计在数学上相同的SVM在软件中产生不同的结果。Kernlab kraziness:对于相同问题的结果不一致

此代码片段只是为了简单起见,需要虹膜数据并使其成为二元分类问题。正如你所看到的,我在两个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) 

然而,SVM1和SVM2的汇总信息,大幅不同:这两种模式之间kernlab报告完全不同的支持向量数,训练误差率和目标函数值。

> 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 

为了比较起见,我还计算使用e1071相同的模型,它提供了LIBSVM包的R接口。

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. 

我的问题是在kernlab软件包中是否有任何已知的错误可以解释这种不寻常的行为。 (Kernlab for R是一种SVM解算器,允许用户使用几种预封装的内核函数或用户提供的内核矩阵之一,输出是用户提供的超参数的支持向量机的估计值。)

+2

非常有趣。我看了一会儿,仍然陷入了僵局。我无法弄清楚[代码]中发生了什么(https://github.com/cran/kernlab/blob/efd7d91521b439a993efb49cf8e71b57fae5fc5a/src/svm.cpp#L4025)。给定预先计算的内核矩阵时,可能“Q”矩阵(见[这里](https://github.com/cran/kernlab/blob/efd7d91521b439a993efb49cf8e71b57fae5fc5a/src/svm.cpp#L463))略有不同?至少这是我将开始调试的地方。据我所知,检索预计算点产品的功能正常工作。 – kdauria

+0

一个不同的,但相关的[问题](http://*.com/questions/17691036/in-r-why-is-result-of-ksvm-using-user-defined-linear-kernel-different-from- THA)。 – kdauria

回顾某些代码,看来这是有问题的行:

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

即,在用户提供的内核矩阵的情况下,ksvm只是看两个维度,而不是输入的维度。这看起来很奇怪,而且可能是一些测试或其他方面的阻碍。用两维数据测试线性内核产生相同的结果:在上面替换1:41:2,并且输出和预测都一致。