在R语言中计算两个向量距离的平方范数时,应使用crossprod还是基础函数?

我在很多地方看到过(例如,在这里的rbfdot函数这里),人们使用以下公式来计算两个向量的距离的平方范数

norm

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

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注