首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在kernlab包的ksvm中定制内核函数?

如何在kernlab包的ksvm中定制内核函数?
EN

Stack Overflow用户
提问于 2013-06-12 08:47:42
回答 1查看 3.3K关注 0票数 7

我有纬度和经度,所以我需要将RBF内核重新定义为exp(-1/2||sophere distrance|^2),这意味着我需要自己重写内核函数。我写我的内核如下:

代码语言:javascript
运行
复制
round.kernel <- function(x,y){
  sigma <- 1
  #R <- 6371
  R <- 1
  a <- (sin( (x[1]-y[1])/2 ))^2+cos(x[1])*cos(y[1])*(sin((x[2]-y[2])/2))^2
  c <- 2*atan2(sqrt(a),sqrt(1-a))
  d <- R*c
  res <- exp(-d^2/(2*sigma))
  return (res)
}
class(round.kernel) <- "kernel"

我测试了函数,内核应该是正确的。但是使用下面的训练命令,我得到了错误:

代码语言:javascript
运行
复制
fit <- ksvm(y=train[,2],x=train[,3:4],kernel=round.kernel,type='eps-svr')

Error in .local(x, ...) : 
  List interface supports only the stringdot kernel.

更棘手的是,我尝试了ksvm文档中的示例代码:

代码语言:javascript
运行
复制
k <- function(x,y) {(sum(x*y) +1)*exp(-0.001*sum((x-y)^2))}
class(k) <- "kernel"

但是我得到了同样的错误。

有人知道如何正确定义内核函数吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-13 06:17:58

我的问题解决如下:内核代码是正确的,我应该直接定义一个函数(x,y),并将它的类声明为" kernel“。问题是,即使在文档中,ksvm也支持x,y样式,它们实际上不起作用。将其更改为公式数据样式最终可以让它运行起来:

代码语言:javascript
运行
复制
fit <- ksvm(Freq~lat+lon,data=train[,2:4],kernel=roundrbf,type='eps-svr')

此外,我还阅读了rbfdot的源代码,以及内核实验室中定义的其他内核。注意他们的代码样式是这样的:

代码语言:javascript
运行
复制
function(params){
  val <- function(x,y){
  # True kernel defined here
  }
  return (new ("kernel_name",.Data=val,kpar=list(params)))
}

但说真的,我试过了,用这种方式编写内核函数是行不通的。工作方式直接类似于这样的风格:

代码语言:javascript
运行
复制
k <- function(x,y){
  #calculate the result
}
class(k) <- "kernel"
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17056080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档