我正在尝试使用用户定义的内核。我知道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%的垃圾邮件数据(保留不同类别的比例)。
如果数据的类型是垃圾邮件,则数据的类型= 1表示列车svm
m=ksvm(xtrain,ytrain,type="C-svc",kernel=kp,C=10)
但这一步不起作用。它总是在等待回复。
所以,我问你这个问题,为什么?是因为例子的数量太大了吗?是否还有其他R软件包可以为用户定义的内核训练SVM?
答案 0 :(得分: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
至少有两个原因让您仍在等待结果:
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。