首页 文章

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

提问于
浏览
3

我正在尝试使用用户定义的内核 . 我知道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?

1 回答

  • 2

    首先,你的内核看起来像一个经典的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 是否实际上优化了用户定义的内核计算(事实上我很确定它确实是 not ),你可以尝试构建内核矩阵( K[i,j] = K(x_i,x_j) ,其中 x_ii'th 训练向量)并提供 ksvm 它 . 你可以实现这个目标

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

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

相关问题