r - 在 R 中构造距离矩阵,但来自多个输入矩阵

标签 r distance

有一些 R 函数可以通过输入矩阵/数据框 ( x ) 并指定距离度量(例如 Euclidean )来构造距离矩阵,例如 dist函数位于 stats R 包(默认)。 proxy R 包有一个 dist扩展 stats:dist 的函数(是的,同名) :它有参数 method用户可以从中传递函数、注册表项或引用邻近度度量的助记符字符串。如果用户将自己的距离测量编程为函数,这将非常方便。例如(来自 proxy 中的帮助文档):

## input matrix
x <- matrix(rnorm(16), ncol = 4)
## custom distance function
f <- function(x, y) sum(x * y)
dist(x, f)

生成的距离矩阵表示(例如)x 的第 1 行和第 2 行之间的距离是2.32,可以手动计算为sum(x[1,]*x[2,]) 。请注意,函数 f有两个参数 xy ,本质上是输入矩阵 x 的两行在 proxy:dist功能。换句话说,距离计算完全依赖于输入矩阵x独自一人。

这是我的问题:我还想计算输入矩阵 x 的距离矩阵(即行是观察值,我想获得 x 行之间的成对距离)。但是,我用来计算距离的函数不仅仅依赖于输入矩阵 x但实际上是在源自 x 的一些矩阵上。我将必要的矩阵存储在名为 prep_matrices 的列表中,由三个矩阵组成:A,B,C (我编造这些是为了获得可重现的结果):

set.seed(111)
A = matrix(rnorm(9), nr=3)
set.seed(222)
B = matrix(rnorm(9), nr=3)
set.seed(333)
C = matrix(rnorm(9), nr=3)

显然是输入矩阵x是 3×3 和 prep_matrices$A, prep_matrices$B, prep_matrices$C将给出 x 的导出矩阵。现在假设两行之间的距离 x计算如下(例如,第 1 行和第 2 行):

m1 = diag(A[1, ])
m2 = diag(A[2, ])
b1 = B[1, ]
b2 = B[2, ]
c1 = C[1, ]
c2 = C[2, ]
distance = mean(m1 %*% ( (diag(b1)-diag(b2)) %*% (diag(c1)-diag(c2)) %*% m2))

此示例仅用于说明目的,但我希望您能了解如何计算距离。然后我意识到,将列表( prep_matrices )传递给某些 R 函数并直接获取距离可能是不可能的,因为涉及更多额外的计算,最重要的是,距离不是基于输入矩阵,而是基于相反,在许多派生矩阵上...

在这种情况下,有没有办法在 R 中有效地编码以获得距离矩阵?或者我们可以修改现有的 R 函数吗?非常感谢!

最佳答案

根据距离函数的复杂程度,您可以忘记 dist 并编写一个函数,该函数接受行号 i,j 并计算这些行的距离两行。因此,对于您的示例,它看起来像这样:

ff<-function(i,j) mean(diag(A[i,]) %*% ( (diag(B[i,])-diag(B[j,])) %*% (diag(C[i,])-diag(C[j,])) %*% diag(A[j,])))

然后您可以通过将其应用于 1:nrow(x) 来获得距离矩阵,在本例中为

distMatrix<-outer(1:3,1:3,Vectorize(ff))

Vectorize 是必要的,因为 outer 需要一个矢量化函数。

关于r - 在 R 中构造距离矩阵,但来自多个输入矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19148473/

相关文章:

python - 我可以找到相似的条目并将它们组合在一起吗?

python - 如何查找数据框中距基坐标点的距离?

r - kernlab 中的 kernelMatrix 函数不返回任何内容

matlab - 计算 3D 点的距离矩阵

r - R 中数据帧的智能转置

r - FUN(X[[i]], ...) 错误 : object not found when adding geom_text with facet

algorithm - 如何在同一像素组中找到距离另一个像素最远的像素

r - 如何使用 R 计算 Tanimoto/Jacquard Score 作为距离矩阵

r - 如何在r中的许多数据帧中的列上循环函数

r - 在 R 中安装 kernlab 包