2

有一些 R 函数可以通过输入矩阵/数据框 ( x) 并指定距离度量 (例如Euclidean) 来构造距离矩阵,例如 R 包中的dist函数stats(默认)。proxyR 包有一个扩展 :的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有两个参数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 函数?非常感谢!

4

1 回答 1

4

根据距离函数的复杂程度,您可以忘记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需要一个矢量化函数。

于 2013-10-02T23:53:19.063 回答