我在很多地方看到过(例如,在这里的rbfdot
函数和这里),人们使用以下公式来计算两个向量的距离的平方范数
在R
编程语言中,这变成了
crossprod(x) - 2*crossprod(x, y) + crossprod(y)
在上述链接中,以及在许多其他地方,人们使用上面的r
公式来计算两个向量的距离的平方范数。然而,我尝试将其与简单地对条目进行平方并求和进行基准测试,即
sum( (x-y)^2 )
在我看来,基础R版本似乎更快:
# 创建可复制的向量set.seed(123)n <- 10^7x <- rnorm(n)y <- rnorm(n)
system.time(crossprod(x) - 2*crossprod(x, y) + crossprod(y))# user system elapsed # 0.054 0.000 0.054
system.time(sum( (x-y)^2 ))# user system elapsed # 0.027 0.024 0.051
我错过了什么?
我想知道哪个选项更快,因为我正在尝试编写代码以使用RBF函数获得核矩阵。
回答:
crossprod()
是一个非常棒的函数,它的存在相对隐蔽,应该被更多地使用。要比较计算时间,您应该使用一个能够更精确地做到这一点的包。
我们可以使用microbenchmark
包来比较计算时间:
set.seed(123)n <- 10^8x <- rnorm(n)y <- rnorm(n)microbenchmark::microbenchmark(crossprod(x) - 2*crossprod(x, y) + crossprod(y), crossprod(x-y), sum((x-y)^2))Unit: milliseconds expr min lq mean median uq max neval cld crossprod(x) - 2 * crossprod(x, y) + crossprod(y) 470.7079 491.7889 537.0879 502.9029 525.2929 1392.929 100 a crossprod(x - y) 533.9799 575.4948 870.1463 588.7248 615.8091 4524.261 100 b sum((x - y)^2) 542.8631 589.2234 1087.4885 610.5433 1220.1261 5423.189 100 b