R:SVM使用性能定制内核(用户定义内核)未在kernlab工作(R: SVM performanc

2019-09-21 12:06发布

我试图使用用户定义的内核。 我知道我R.使用的数据包括垃圾邮件包kernlab该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包,可以训练为用户自定义内核支持向量机?

Answer 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 performance using custom kernel (user defined kernel) is not working in kernlab