有一些 R 函数可以通过输入矩阵/数据框 ( x
) 并指定距离度量 (例如Euclidean
) 来构造距离矩阵,例如 R 包中的dist
函数stats
(默认)。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)
结果距离矩阵表明(例如)第 1 行和第 2 行之间的距离x
为 2.32,可以手动计算为sum(x[1,]*x[2,])
。请注意,该函数f
有两个参数x
和y
,它们本质上是函数中输入矩阵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 函数?非常感谢!