有一些 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
有两个参数 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 函数吗?非常感谢!
最佳答案
根据距离函数的复杂程度,您可以忘记 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/