如何在R中的kernlab包的ksvm中加权核函数?

时间:2017-03-23 13:54:28

标签: r model kernel svm

我正在重写RBF内核函数:

 install.packages("kernlab")
 library(kernlab)

 rbf <- function(x, y) {
  gamma<-0.5
  exp(-0.5*norm((as.matrix(x)-as.matrix(y)),"f")) 
   }
class(rbf) <- "kernel"

我正在使用的数据(10个观察值,3个变量,第4列是目标):

    data<-matrix(1:40,nrow=10,ncol=4)
    train<-data[1:(0.6*nrow(data)), ]
    test<-data[((0.6*nrow(data))+1):nrow(data), ]

使用ksvm和预测使用自定义内核函数进行建模:

k_rbf <- ksvm(train[,ncol(train)]~.,data=train,C=0.1,type="eps-svr",epsilon=0.01,kernel=rbf)
ksvm_rbf<-predict(k_rbf, test)

到目前为止,该函数运行良好,但我想进一步设计自定义rbf内核添加相似性函数。通常,我们有如下RBF内核:

enter image description here

增加了我设计的季节性的RBF内核如下所示: enter image description here

其中x_i和x_j是分别代表时间戳t_i和t_j的时间序列的两个对象, S 是季节性时间段

所以,添加一个包含每行索引的新列:

    t<-1:nrow(data)
    data_t<-cbind(t,data)
    train_t<-data_t[1:(0.6*nrow(data_t)), ]
    test_t<-data_t[((0.6*nrow(data_t))+1):nrow(data_t), ]

在我构建的内核中添加相似性部分:

      sea_rbf <- function(x, y) {
      gamma<-0.5
      S<-3
      n_x<-x[1] # row ID of X
      n_y<-y[1] # row ID of y
      x<-x[2:4]
      y<-y[2:4]
      d<-abs((n_x-n_y)%% S)
      sea<-min(d,S-d)
      value <-exp(-0.5*norm((as.matrix(x)-as.matrix(y)),"f"))*exp(-sea^2) 
      return (value )}
      class(sea_rbf) <- "kernel"

      k_rbf_t <-           ksvm(train_t[,ncol(train_t)]~.,data=train_t,C=0.1,type="eps-svr",epsilon=0.01,kernel=sea_rbf)
      ksvm_rbf_t<-predict(k_rbf_t, test_t)

在训练和预测期间没有错误,但是当我运行debug()来查看进程详细信息时,这不是我所期望的!例如,&#34; n_x&lt; -x 1&#34;的代码函数中的函数从未从原始数据中获取行ID :(。

我对使用ksvm函数的内核函数用法有一个错误的理解:(((

欢迎任何帮助!

非常感谢!!!

0 个答案:

没有答案