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)