gpt4 book ai didi

r - 如何在 kernlab 包的 ksvm 中自定义内核函数?

转载 作者:行者123 更新时间:2023-12-04 11:54:16 26 4
gpt4 key购买 nike

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

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"

我测试了功能,内核应该是正确的。但是使用以下训练命令,我收到错误消息:
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 文档中的示例代码:
k <- function(x,y) {(sum(x*y) +1)*exp(-0.001*sum((x-y)^2))}
class(k) <- "kernel"

但我遇到了同样的错误。

任何人都知道如何正确定义核函数?

最佳答案

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

fit <- ksvm(Freq~lat+lon,data=train[,2:4],kernel=roundrbf,type='eps-svr')

此外,我还阅读了 rbfdot 的源代码,以及在 kernlab 本身中定义的其他内核。注意他们的代码风格是这样的:
function(params){
val <- function(x,y){
# True kernel defined here
}
return (new ("kernel_name",.Data=val,kpar=list(params)))
}

但说真的,我试过了,用这种风格制作内核函数是行不通的。工作方式直接是这样的:
k <- function(x,y){
#calculate the result
}
class(k) <- "kernel"

关于r - 如何在 kernlab 包的 ksvm 中自定义内核函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17056080/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com