在R中构造距离矩阵,但是从多个输入矩阵构造

时间:2013-10-02 23:30:42

标签: 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的距离矩阵(即行是观察值,我希望获得{{行之间的成对距离) 1}})。但是,我用来计算距离的函数不仅仅依赖于输入矩阵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) 是3乘3,x将给出prep_matrices$A, prep_matrices$B, prep_matrices$C的派生矩阵。现在假设两行x之间的距离计算为(例如,第1行和第2行):

x

此示例仅供参考,但我希望您能了解距离的计算方法。我意识到,可能无法将列表(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)) )传递给某些R函数并直接获得距离,因为涉及更多的额外计算,最重要的是,距离不是基于输入矩阵,而是在很多派生矩阵上......

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

1 个答案:

答案 0 :(得分: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需要矢量化函数。