gpt4 book ai didi

performance - 在循环中使用 kernlab 包中的 rbfdot 性能不佳

转载 作者:行者123 更新时间:2023-12-02 06:40:37 24 4
gpt4 key购买 nike

我的缓慢工作代码的简化示例(函数 rbf 来自 kernlab 包)需要加速:

install.packages('kernlab')       
library('kernlab')

rbf <- rbfdot(sigma=1)

test <- matrix(NaN,nrow=5,ncol=10)
for (i in 1:5) {
for (j in 1:10) { test[i,j] <- rbf(i,j)}
}

我试过 outer()但它不起作用,因为 rbf函数不返回所需的长度 (50)。我需要加快这段代码的速度,因为我有大量数据。我读过矢量化将是加快速度的 chalice ,但我不知道如何。

你能指出我正确的方向吗?

最佳答案

如果 rbf确实是调用 rbfdot 的返回值,然后 body(rbf)看起来像

{
if (!is(x, "vector"))
stop("x must be a vector")
if (!is(y, "vector") && !is.null(y))
stop("y must a vector")
if (is(x, "vector") && is.null(y)) {
return(1)
}
if (is(x, "vector") && is(y, "vector")) {
if (!length(x) == length(y))
stop("number of dimension must be the same on both data points")
return(exp(sigma * (2 * crossprod(x, y) - crossprod(x) -
crossprod(y))))
}
}

由于其中大部分由检查功能组成,而 crossprod当你只传递标量时简化,我认为你的函数简化为
rbf <- function(x, y, sigma = 1)
{
exp(- sigma * (x - y) ^ 2)
}

为了进一步加快速度,请使用 compiler包(需要 R-2.14.0 或更高版本)。
rbf_loop <- function(m, n)
{
out <- matrix(NaN, nrow = m, ncol = n)
for (i in seq_len(m))
{
for (j in seq_len(n))
{
out[i,j] <- rbf(i,j)
}
}
out
)

library(compiler)
rbf_loop_cmp <- cmpfun(rbf_loop)

然后比较 rbf_loop_cmp(m, n)的时间与你以前的一样。

简化步骤更容易反过来看。如果您 expand (x - y) ^ 2你得到 x ^ 2 - 2 * x * y + y ^ 2 ,减去 rbf 中的内容功能。

关于performance - 在循环中使用 kernlab 包中的 rbfdot 性能不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8760632/

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