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

Posted

技术标签:

【中文标题】R:使用自定义内核(用户定义内核)的 SVM 性能在 kernlab 中不起作用【英文标题】:R: SVM performance using custom kernel (user defined kernel) is not working in kernlab 【发布时间】:2012-08-18 14:30:23 【问题描述】:

我正在尝试使用用户定义的内核。我知道 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% 的垃圾邮件数据(保留不同类别的比例)。

如果数据的类型是垃圾邮件,那么对于 train svm,数据的类型 = 1

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

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

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

【问题讨论】:

我也在寻找那个答案。使用内核实验室,但无法正确定义自定义内核函数。 【参考方案1】:

首先,你的内核看起来像一个经典的 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_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。

【讨论】:

以上是关于R:使用自定义内核(用户定义内核)的 SVM 性能在 kernlab 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

SVM 的自定义内核,何时应用它们?

如何使用自定义 SVM 内核?

如何为 sklearn.svm.SVC 定义自定义内核函数?

sklearn SVM 自定义内核

scikit-learn 中自定义内核 SVM 的交叉验证

SVM 自定义 RBF 内核 IndexError