有一些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
的距离矩阵(即行是观察值,我希望获得{{行之间的成对距离) 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函数?非常感谢!
答案 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
需要矢量化函数。