【发布时间】:2019-08-07 23:21:12
【问题描述】:
我正在尝试理解函数stats::mahalanobis。这是它的来源,但请只关注最后一行,或者更具体地说,rowSums(x %*% cov * x) 部分。
> mahalanobis
function (x, center, cov, inverted = FALSE, ...)
{
x <- if (is.vector(x))
matrix(x, ncol = length(x))
else as.matrix(x)
if (!isFALSE(center))
x <- sweep(x, 2L, center)
if (!inverted)
cov <- solve(cov, ...)
setNames(rowSums(x %*% cov * x), rownames(x))
}
这里x 是一个n×p 矩阵,而cov 是一个p×p 矩阵。他们的内容对于这个问题的目的并不重要。
根据文档,mahalanobis 计算 x 中所有行的平方马氏距离。我将此作为提示,并找到了rowSums(X %*% C * X) 和apply 的对应项。 (如果你不知道我在说什么也没关系;这一段只是解释我是如何想出apply 表格的)
> X = matrix(rnorm(1:6), nrow = 3)
> C = matrix(rnorm(1:4), nrow = 2)
> rowSums(X %*% C * X)
[1] -0.03377298 0.49306538 -0.16615078
> apply(X, 1, function(row) {
+ t(row) %*% C %*% row
+ })
[1] -0.03377298 0.49306538 -0.16615078
现在问题变成了为什么它们是等价的?我想人们需要做一些巧妙的矩阵划分来理解等价背后的基本原理,但我还不够开明。
【问题讨论】:
-
我的建议是创建一个更小的 2x2 矩阵
X并手动进行计算。应该很明显为什么它们是相同的。 -
@RuiBarradas 感谢您的建议!这有点工作,但现在我的大脑充满了所有这些算术细节,无法理解这种形式背后的重要概念。我更希望得到更高层次的答案。
标签: r math matrix vectorization matrix-multiplication