簡體   English   中英

如何使用apply函數計算兩個矩陣之間的距離

[英]How to use apply function to calculate the distance between two matrices

我正在嘗試計算兩個矩陣之間的歐氏距離。 我已經實現了使用2 for循環但嘗試向量化計算以加速。 如果距離計算正確,我使用pdist作為基准來有效。

感謝這篇文章, https://medium.com/@souravdey/l2-distance-matrix-vectorization-trick-26aa3247ac6c ,我嘗試使用此代碼在r中實現相同的功能:

dist <- sqrt(rowSums(xtest**2)+rowSums(xtrain**2)-2*xtrain %*% t(xtest))

但結果與pdist的結果不同。 我不確定這有什么問題。

這是一些代碼

創建一些數據

xtest=matrix(cbind(c(0,0),c(1,31)),2,2,byrow=TRUE)
xtrain=matrix(cbind(c(9,2),c(4,15),c(7,8),c(-22,-2)),4,2,byrow=TRUE)

使用雙循環計算

mydist <- function(xtest,xtrain) {
  euc.dist <- function(x1, x2) sqrt(sum((x1 - x2) ^ 2))
  dist <- matrix(,nrow=nrow(xtrain),ncol=nrow(xtest))
  for (i in 1:nrow(xtrain)){
    for (j in 1:nrow(xtest)){
      dist[i,j] <- euc.dist(xtrain[i,], xtest[j,])
    }
  }
  return (dist)
}
> mydist(xtest,xtrain)
          [,1]     [,2]
[1,]  9.219544 30.08322
[2,] 15.524175 16.27882
[3,] 10.630146 23.76973
[4,] 22.090722 40.22437

結果與使用pdist相同

> libdists <- pdist(xtrain,xtest)
> as.matrix(libdists)
          [,1]     [,2]
[1,]  9.219544 30.08322
[2,] 15.524175 16.27882
[3,] 10.630146 23.76973
[4,] 22.090721 40.22437

但如果我使用矩陣乘法,那就錯了

> mydist2 <- function(xtest,xtrain) {
+   dist <- sqrt(rowSums(xtest**2)+rowSums(xtrain**2)-2*xtrain %*% t(xtest))
+   return (dist)
+ }
> mydist2(xtest,xtrain)
          [,1]     [,2]
[1,]  9.219544      NaN
[2,] 34.684290 16.27882
[3,] 10.630146      NaN
[4,] 38.078866 40.22437

我也試過使用mapply函數

> mydist3 <- function(xtest,xtrain) {
+   euc.dist <- function(x1, x2) sqrt(sum((x1 - x2) ^ 2))
+   dist <- mapply(euc.dist, xtest,xtrain)
+   return (dist)
+ }
> mydist3(xtest,xtrain)
[1]  9  3  7 53  2 14  8 33

我認為它是元素明智的,而不是將每一行作為向量來計算兩個向量之間的距離。

任何建議將不勝感激!

使用兩個apply實例,第二個嵌套在第一個:

d1 <- apply(xtest, 1, function(x) apply(xtrain, 1, function(y) sqrt(crossprod(x-y))))

檢查pdist

library(pdist)
d2 <- as.matrix(pdist(xtrain, xtest))

all.equal(d1, d2, tolerance = 1e-7)
## [1] TRUE

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM