如何从三个二维矩阵(即立方体的三个面)“恢复”一个三维数组(2 x 2 x 2 的立方体)

6

我有这个数组:

    T <- array(c(.25,.1,.1,.1,.05,.1,.1,.2),c(2,2,2))

    # , , 1
    #      [,1] [,2]
    # [1,] 0.25  0.1
    # [2,] 0.10  0.1

    # , , 2
    #      [,1] [,2]
    # [1,] 0.05  0.1
    # [2,] 0.10  0.2

我认为可以将其理解为在第三个维度上切成一种“立方体”形状。它有行(第一维)、列(第二维)和“高度”(第三维),可以这样说...
现在我可以按其中一个维度来对其值进行求和。有三种可能的组合方式:
    Tm1 <- apply(T0,c(1,2),sum)
    Tm2 <- apply(T0,c(1,3),sum)
    Tm3 <- apply(T0,c(2,3),sum)

现在我有这个:
    #> Tm1
    #     [,1] [,2]
    #[1,]  0.3  0.2
    #[2,]  0.2  0.3

    #> Tm2
    #     [,1] [,2]
    #[1,] 0.35 0.15
    #[2,] 0.20 0.30

    #> Tm3
    #     [,1] [,2]
    #[1,] 0.35 0.15
    #[2,] 0.20 0.30

它们是立方体的“面”。

能否从这3个矩阵中恢复原始数组? 换句话说,仅通过查看其“面”,是否可能知道该“立方体”内部的分布情况?

如果可以,如何做到?(我的意思是,“代数方法”和R算法...)


这非常类似于生态推断问题。 - Eduardo Leoni
2个回答

4

以下是我对您问题的解决方案的翻译。首先,构建方程系统,使得 A %*% x = b(其中x是要解决的值,即T0内部的值):

n <- prod(dim(T0))
b <- c(Tm1, Tm2, Tm3)
m <- length(b)
Ti  <- array(seq_along(T0), dim(T0))
Ti1 <- unlist(apply(Ti, c(1,2), list))
Ti2 <- unlist(apply(Ti, c(1,3), list))
Ti3 <- unlist(apply(Ti, c(2,3), list))

A <- matrix(0, nrow = m, ncol = n)
A[cbind(rep(1:m, each = 2), c(Ti1, Ti2, Ti3))] <- 1

cbind(A, b)
#                          b
#  [1,] 1 0 0 0 1 0 0 0 0.30
#  [2,] 0 1 0 0 0 1 0 0 0.20
#  [3,] 0 0 1 0 0 0 1 0 0.20
#  [4,] 0 0 0 1 0 0 0 1 0.30
#  [5,] 1 0 1 0 0 0 0 0 0.35
#  [6,] 0 1 0 1 0 0 0 0 0.20
#  [7,] 0 0 0 0 1 0 1 0 0.15
#  [8,] 0 0 0 0 0 1 0 1 0.30
#  [9,] 1 1 0 0 0 0 0 0 0.35
# [10,] 0 0 1 1 0 0 0 0 0.20
# [11,] 0 0 0 0 1 1 0 0 0.15
# [12,] 0 0 0 0 0 0 1 1 0.30

A 是一个非方阵,因此我使用广义逆矩阵来解决 x

library(MASS)
xsol <- ginv(A) %*% b
Tsol <- array(xsol, dim(T0))
Tsol

# , , 1
# 
#        [,1]   [,2]
# [1,] 0.2375 0.1125
# [2,] 0.1125 0.0875
# 
# , , 2
# 
#        [,1]   [,2]
# [1,] 0.0625 0.0875
# [2,] 0.0875 0.2125

这个解决方案不符合您最初的T0,但您可以检查一下。

apply(Tsol, c(1,2), sum)
#      [,1] [,2]
# [1,]  0.3  0.2
# [2,]  0.2  0.3

apply(Tsol, c(1,3), sum)
#      [,1] [,2]
# [1,] 0.35 0.15
# [2,] 0.20 0.30

apply(Tsol, c(2,3), sum)
#      [,1] [,2]
# [1,] 0.35 0.15
# [2,] 0.20 0.30

结论?不可能恢复您的原始矩阵。另一种表达方式是A矩阵的秩qr(A)$rank7,而您有8个未知数,因此需要一位额外的信息,例如T[1, 1]0.25才能恢复您的原始数组:

A <- rbind(A, c(1, rep(0, n - 1)))
b <- c(b, 0.25)
qr(A)$rank
# [1] 8
xsol <- ginv(A) %*% b
Tsol <- array(xsol, dim(T0))
Tsol
# , , 1

#      [,1] [,2]
# [1,] 0.25  0.1
# [2,] 0.10  0.1

# , , 2

#      [,1] [,2]
# [1,] 0.05  0.1
# [2,] 0.10  0.2

1
这里有一个更一般的代数解释,涉及连续变量,可能有助于理解为什么你做不到。问题在于你不能构建反映射。下面,你可以将积分符号替换为求和符号,尝试找到反矩阵,然后得出 flodel 上面展示的结果。因此,假设 f 在 x、y 和 z 的定义域中是可积的。你最初的表格如下:

$$ w = f(x,y,z) $$

你的转换是:

$$t(x) = \int_x f(x,y,z)dx = g(y,z)$$

你想从 t(x) 到 w 构建一个反映射。这个映射应该是:

$$\frac{\partial t(x)}{\partial x} = \frac{\partial}{\partial x}\left(\int_x f(x,y,z)dx\right) = \frac{\partial}{\partial x}g(y,z) = 0$$

也就是说,一旦你对 x 进行了积分,你就无法从 g(y,z) 中恢复它。


我明白了...关于x的信息已经不存在了,所以导数不会撤销积分所做的事情。但是我在想其他的事情:如果你创建3个新函数——每个函数都是通过一次性地积分来获得一个变量...你将会对原始函数有3个“部分信息片段”(而不仅仅是一个,就像你的例子中那样)。我在想这些新函数的某种组合是否能够逆转这个过程...但是上面的答案表明这也是不可能的。而且这个逻辑与你的答案类似。 - RogerioJB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接