在kernlab中的SVM训练之外的内核矩阵计算

Posted

技术标签:

【中文标题】在kernlab中的SVM训练之外的内核矩阵计算【英文标题】:kernel matrix computation outside SVM training in kernlab 【发布时间】:2015-02-15 23:12:44 【问题描述】:

我正在开发一种新算法,该算法会生成一个修改过的核矩阵,用于使用 SVM 进行训练,但遇到了一个奇怪的问题。

出于测试目的,我比较了使用 kernelMatrix 接口和普通内核接口学习的 SVM 模型。例如,

# Model with kernelMatrix computation within ksvm
svp1 <- ksvm(x, y, type="C-svc", kernel=vanilladot(), scaled=F)
# Model with kernelMatrix computed outside ksvm
K <- kernelMatrix(vanilladot(), x)
svp2 <- ksvm(K, y, type="C-svc")
identical(nSV(svp1), nSV(svp2))

请注意,我已关闭缩放,因为我不确定如何在内核矩阵上执行缩放。

据我了解,svp1svp2 应该返回相同的模型。然而,我观察到这对于一些数据集来说并非如此,例如来自KEEL 的glass0

我在这里错过了什么?

【问题讨论】:

你能发布你用来加载 x 和 y 的代码吗?我只是用玩具数据尝试了这个,这两个对我来说是相同的。 @Aabglov 使用 glass0 数据集我发现 OP 发布了相同的错误。 【参考方案1】:

我认为这与here 发布的同一问题有关。当显式使用 vanilladot() 时,kernlab 似乎以不同的方式处理 ksvm 的计算,因为它的类是“vanillakernel”而不是“内核”。

如果您使用“kernel”类而不是“vanillakernel”类定义自己的 vanilladot 内核,则两者的代码将是等效的:

kfunction.k <- function()
   k <- function (x,y)crossprod(x,y)
   class(k) <- "kernel"
   k
l<-0.1 ; C<-1/(2*l)

svp1 <- ksvm(x, y, type="C-svc", kernel=kfunction.k(), scaled=F)

K <- kernelMatrix(kfunction.k(),x)

svp2 <- ksvm(K, y, type="C-svc", kernel='matrix', scaled=F)

identical(nSV(svp1), nSV(svp2))

值得注意的是,svp1 和 svp2 都与它们在原始代码中的值不同,因为这种变化。

【讨论】:

以上是关于在kernlab中的SVM训练之外的内核矩阵计算的主要内容,如果未能解决你的问题,请参考以下文章

帮助在 R 中对 kernlab 的 SVM 使用 predict()?

R:使用自定义内核(用户定义内核)的 SVM 性能在 kernlab 中不起作用

Hu矩SVM训练及检测-----OpenCV

R 理解来自 kernlab 的 caret train(tuneLength = ) 和 SVM 方法

SVM 每行训练矩阵的长度

在 R 中绘制由 caret 包训练的 SVM 线性模型