繁体   English   中英

如何计算 R 中两个矩阵之间的欧几里得距离

[英]how to calculate Euclidean distance between two matrices in R

我有两个尺寸相等的巨大矩阵。 我想计算它们之间的欧几里得距离。 我知道这是 function:

euclidean_distance <- function(p,q){
  sqrt(sum((p - q)^2))
}

and if these are two matrices:


set.seed(123)
    mat1 <- data.frame(x=sample(1:10000,3), 
                       y=sample(1:10000,3), 
                       z=sample(1:10000,3))
    mat2 <- data.frame(x=sample(1:100,3), 
                       y=sample(1:100,3), 
                       z=sample(1:1000,3))

那么我需要答案是一个新的矩阵 3*3,显示 mat1 和 mat2 的每对值之间的欧几里得距离。

请问有什么建议吗?

您可以使用包pdist

library(pdist)
dists <- pdist(t(mat1), t(mat2))
as.matrix(dists)
         [,1]      [,2]      [,3]
[1,]  9220.40  9260.735  8866.033
[2,] 12806.35 12820.086 12121.927
[3,] 11630.86 11665.869 11155.823

这将为您提供所有对的欧几里得距离: (mat1$x,mat2$x), (mat1$x,mat2$y),..., (mat1$z,mat2$z)

这是基本函数outer

outer(mat1,mat2,Vectorize(euclidean_distance))
x         y         z
x  9220.40  9260.736  8866.034
y 12806.35 12820.086 12121.927
z 11630.86 11665.869 11155.823

通过使用tcrossprod outer组合,您可以在基础 R 中比使用pdist::pdist稍微快一点:

> library(Rfast);library(pdist);library(microbenchmark)
> mat1=matrix(sample(1e4),ncol=10);mat2=matrix(sample(2e4),ncol=10)
> microbenchmark(times=10,dista={Rfast::dista(mat1,mat2)},
+ tcrossprod={sqrt(outer(rowSums(mat1^2),rowSums(mat2^2),"+")-tcrossprod(mat1,2*mat2))},
+ pdist=pdist::pdist(mat1,mat2))
 Unit: milliseconds
       expr      min       lq     mean   median       uq      max neval
      dista 36.54904 36.92631 41.87249 40.65317 44.69080 55.03735    10
 tcrossprod 27.93673 31.27754 37.89734 36.94241 42.85898 52.00793    10
      pdist 37.83836 39.03578 43.54179 44.04779 46.86191 50.45233    10

或者这不是 OP 所要求的,但是如果您有两个具有相同维度的矩阵,它会创建一个矩阵的第一行、矩阵的第二行之间的距离向量,依此类推:

sapply(rowSums((mat1-mat2)^2),sqrt)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM