gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 08:36:46 24 4
gpt4 key购买 nike

我正在尝试使用用户定义的内核。我知道 kernlab 在 R 中提供用户定义的内核(自定义内核函数)。我使用了包括 kernlab 包在内的垃圾数据。(变量数量=57 示例数量=4061)

我定义了内核的形式,

kp=function(d,e){

as=v*d
bs=v*e
cs=as-bs
cs=as.matrix(cs)

exp(-(norm(cs,"F")^2)/2)
}

class(kp)="kernel"

它是高斯核的变换核,其中v是连续变化的值,是每个变量的标准差向量的倒数,例如:

v=(0.1666667,........0.1666667)

训练集定义了 60% 的垃圾邮件数据(保留不同类别的比例)。

如果数据类型为垃圾邮件,则训练 svm 的数据类型 = 1

m=ksvm(xtrain,ytrain,type="C-svc",kernel=kp,C=10)

但这一步不起作用。它总是在等待响应。

那么,我问你这个问题,为什么?是因为例子太多了吗?是否有其他 R 包可以为用户定义的内核训练 SVM?

最佳答案

首先,您的内核看起来像一个经典的 RBF 内核,其中 v = 1/sigma,那么为什么要使用它呢?您可以使用内置 RBF 内核并只需设置 sigma 参数。特别是 - 您可以在矢量化矩阵上使用经典欧几里得,而不是在矩阵上使用弗罗贝尼乌斯范数。

第二 - 这工作得很好。

> xtrain = as.matrix( c(1,2,3,4) )
> ytrain = as.factor( c(0,0,1,1) )
> v= 0.01
> m=ksvm(xtrain,ytrain,type="C-svc",kernel=kp,C=10)
> m
Support Vector Machine object of class "ksvm"

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


Number of Support Vectors : 4

Objective Function Value : -39.952
Training error : 0

至少有两个原因导致您仍在等待结果:

  • RBF 内核引发了 SVM 优化中最困难的问题(尤其是大型 C)
  • 用户定义的内核的效率远低于内置内核

由于我不确定 ksvm 是否真正优化了用户定义的内核计算(事实上我很确定它没有),您可以尝试构建内核矩阵(K[i,j] = K(x_i,x_j),其中 x_i 是第 i'th 训练向量)并提供ksvm 与它一起。您可以通过以下方式实现此目的

K <- kernelMatrix(kp,xtrain)
m <- ksvm(K,ytrain,type="C-svc",kernel='matrix',C=10)

预计算内核矩阵可能是一个相当长的过程,但优化本身会快得多,因此如果您想测试许多不同的C值(您肯定应该这样做),这是一个很好的方法)。不幸的是,这需要 O(n^2) 内存,因此如果您使用超过 100 000 个向量,您将需要大量的 RAM。

关于R:使用自定义内核(用户定义内核)的 SVM 性能在 kernlab 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12085454/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com