簡體   English   中英

來自兩個獨立數據幀的距離矩陣

[英]Distance matrix from two separate data frames

我想創建一個矩陣,其中包含從一個數據幀到另一個數據幀的行的歐幾里德距離。 例如,假設我有以下數據框:

a <- c(1,2,3,4,5)
b <- c(5,4,3,2,1)
c <- c(5,4,1,2,3)
df1 <- data.frame(a,b,c)

a2 <- c(2,7,1,2,3)
b2 <- c(7,6,5,4,3)
c2 <- c(1,2,3,4,5)
df2 <- data.frame(a2,b2,c2)

我想創建一個矩陣,其中df1中每行的距離與df2的行相距。

因此矩陣[2,1]應該是df1 [2,]和df2 [1,]之間的歐氏距離。 矩陣[3,2] df [3,]和df2 [2,]等之間的距離。

有誰知道如何實現這一目標?

也許您可以使用fields包:函數rdist可能會執行您想要的操作:

rdist:歐氏距離矩陣
描述:給定兩組位置計算所有配對中的歐幾里德距離矩陣。

> rdist(df1, df2)
     [,1]     [,2]     [,3]     [,4]     [,5]
[1,] 4.582576 6.782330 2.000000 1.732051 2.828427
[2,] 4.242641 5.744563 1.732051 0.000000 1.732051
[3,] 4.123106 5.099020 3.464102 3.316625 4.000000
[4,] 5.477226 5.000000 4.358899 3.464102 3.316625
[5,] 7.000000 5.477226 5.656854 4.358899 3.464102

pdist包類似

pdist:分區矩陣的觀察值之間的距離
描述:計算矩陣X的行與另一個矩陣Y的行之間的歐氏距離。

> pdist(df1, df2)
An object of class "pdist"
Slot "dist":
[1] 4.582576 6.782330 2.000000 1.732051 2.828427 4.242640 5.744563 1.732051
[9] 0.000000 1.732051 4.123106 5.099020 3.464102 3.316625 4.000000 5.477226
[17] 5.000000 4.358899 3.464102 3.316625 7.000000 5.477226 5.656854 4.358899
[25] 3.464102
attr(,"Csingle")
[1] TRUE

Slot "n":
[1] 5

Slot "p":
[1] 5

Slot ".S3Class":
[1] "pdist"

注意:如果您正在尋找行之間的歐幾里德規范,您可能需要嘗試:

> rdist(df1, df2)
         [,1]     [,2]     [,3]
[1,] 6.164414 7.745967 0.000000
[2,] 5.099020 4.472136 6.324555
[3,] 4.242641 5.291503 5.656854

這給出了:

 > rdist(df1, df2) [,1] [,2] [,3] [1,] 6.164414 7.745967 0.000000 [2,] 5.099020 4.472136 6.324555 [3,] 4.242641 5.291503 5.656854 

這是根據我之前的答案改編的。

對於一般的n維歐氏距離,我們可以利用方程(不是R,而是代數):

square_dist(b,a) = sum_i(b[i]*b[i]) + sum_i(a[i]*a[i]) - 2*inner_prod(b,a)

其中總和超過向量ab的維數,對於i=[1,n] 這里, ab分別是來自df1df2一對列。 這里的關鍵是這個方程可以寫成df1df2所有對的矩陣方程。

在代碼中:

d <- sqrt(matrix(rowSums(expand.grid(rowSums(df1*df1),rowSums(df2*df2))),
                 nrow=nrow(df1)) - 
          2. * as.matrix(df1) %*% t(as.matrix(df2)))

筆記:

  1. rowSums計算sum_i(a[i]*a[i])sum_i(b[i]*b[i])為每個adf1bdf2分別。
  2. 然后expand.grid生成df1df2之間的所有對。
  3. rowSums計算所有這些對的sum_i(a[i]*a[i]) + sum_i(b[i]*b[i])
  4. 然后將該結果重新整形為matrix 請注意,此矩陣的行數是df1的行數。
  5. 然后減去所有對的內積的兩倍。 這個內積可以寫成矩陣乘以df1 %*% t(df2) ,其中為了清楚起見我將強制省略到矩陣。
  6. 最后,取平方根。

將此代碼與您的數據一起使用:

print(d)
##         [,1]     [,2]     [,3]     [,4]     [,5]
##[1,] 4.582576 6.782330 2.000000 1.732051 2.828427
##[2,] 4.242641 5.744563 1.732051 0.000000 1.732051
##[3,] 4.123106 5.099020 3.464102 3.316625 4.000000
##[4,] 5.477226 5.000000 4.358899 3.464102 3.316625
##[5,] 7.000000 5.477226 5.656854 4.358899 3.464102

請注意,此代碼適用於任何n > 1 在你的情況下, n=3

暫無
暫無

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

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