Performance 在循环中使用kernlab包中的rbfdot时性能不佳

Performance 在循环中使用kernlab包中的rbfdot时性能不佳,performance,r,Performance,R,我的缓慢工作代码的简化示例(函数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)} }

我的缓慢工作代码的简化示例(函数
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)}
               }
install.packages('kernlab'))
库('kernlab')

rbf如果
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)
}
然后将
rbf\u loop\u cmp(m,n)
的计时与之前的计时进行比较



相反,简化步骤更容易看到。如果你
(x-y)^2
你会得到
x^2-2*x*y+y^2
,它减去
rbf
函数中的内容。

使用kernelMatrix()函数, 它应该是几个数量级 比在内核函数上循环更快:

library(kernlab)

rbf <- rbfdot(sigma=1)

kernelMatrix(rbf, 1:5, 1:10)
库(kernlab)

rbf您的循环很短,并且您预先分配了结果矩阵,因此瓶颈可能是
rbf
函数。您需要分析该函数以确定如何(如果可能)使其更快。在
kernlab
中没有
rbf
函数。请仔细检查您所指的功能。例如,
rbf尝试测量函数占用的时间百分比(请参见
?Rprof
)的结果可能确实是rbf如果函数真的简化为您所拥有的,您可以将其与
外部
一起使用。这非常令人印象深刻,多亏了Richie的洞察力,我成功地实现了巨大的性能提升。实际上,该函数简化为Richie所说的,它看起来一目了然(它们给出的输出完全相同,但我必须再次检查)。这使我能够使用outer()来提高速度<代码>系统时间({测试感谢一百万里奇·科顿和约书亚·乌尔里奇!!嗨,里奇,你能分享一下你是如何简化的:从
sigma*(2*i*j-i^2-j^2)
-sigma*(x-y)^2
。它们都给出了相同的结果(前者稍微快一些)但我很好奇你是如何一步一步地简化它的。你能帮我把它布置一下吗。
library(kernlab)

rbf <- rbfdot(sigma=1)

kernelMatrix(rbf, 1:5, 1:10)