在kernlab中,使用自定义内核的SVM性能无法正常工作

5

我希望使用用户定义的内核。我知道在R中,kernlab提供了用户定义的内核(自定义内核函数)。我使用了包含kernlab软件包的spam数据。 (变量数量= 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%的垃圾邮件数据(保持不同类别的比例)。

如果数据类型是垃圾邮件,则将数据类型设置为1以训练SVM。

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

但是这一步骤并没有起作用。它总是在等待响应。
因此,我向您询问这个问题,为什么?是因为示例数量太多了吗?是否有其他的R包可以训练用户定义内核的SVM?

1
我也在寻找答案。使用kernlab,但无法正确定义自定义核函数。 - Yitong Zhou
1个回答

3
首先,你的内核看起来像是一个经典的RBF内核,其中v = 1 / sigma,那么为什么要使用它呢?你可以使用内置的RBF内核,只需设置sigma参数即可。特别地-你可以使用向量化矩阵上的经典欧几里得距离,而不是在矩阵上使用Frobenius范数。
其次-这个工作做得很好。
> 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个训练向量),并将其提供给ksvm。您可以通过以下方式实现:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接