在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))
请注意,我已关闭缩放,因为我不确定如何在内核矩阵上执行缩放。
据我了解,svp1
和 svp2
应该返回相同的模型。然而,我观察到这对于一些数据集来说并非如此,例如来自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 中不起作用