使用 R 生成具有零约束的随机正定矩阵

机器算法验证 r 矩阵
2022-03-02 16:42:20

如何使用 R 生成具有零约束的随机对称正定矩阵?

例如,我想生成一个 4 x 4 随机对称正定矩阵,我们知道我怎么能在 R 中做到这一点?ΩR4×4Ω1,2=Ω2,1=Ω1,3=Ω3,1=0


我想到的是类似于 Cholesky 分解,其中行和行如果是正交的。可能通过拉格朗日乘数求解。但我不确定如何实现这一点。或者,如果这是可能的。LLT=ΩLiLjΩij=0

3个回答

每个对称正(半)定矩阵可以被分解为d×dΣ

Σ=ΛQQΛ

其中是一个正交矩阵,是一个对角矩阵,其中包含非负(正)项始终是某个变量分布将是其相关矩阵;是边际分布的标准差。)QΛλ1,,λd.Σ dQQλi

让我们解释一下这个公式。 (列的点积乘以 因此,上的零约束列的点积的正交约束。(i,j)Σi,jijQλiλj.ΣQ.

(请注意,正定矩阵的所有对角线条目都必须是非零的,所以我假设零约束都在对角线之外。我还将条目入口,以确保结果的对称性。)(i,j)(j,i)

施加这种约束的一种(完全通用的)方法是按顺序生成Q 使用您喜欢的任何方法来创建初始值的矩阵。在步骤更改的所有需要​​与其正交的列上对其进行回归并保留残差。将这些结果归一化,使它们的点积(平方和)一致。列。d×di=1,2,,d,i1,2,,i1QiQ.

创建以任何您喜欢的方式随机生成的对角线(如在https://stats.stackexchange.com/a/215647/919密切相关的答案中所讨论的)。Q,Λ

以下R函数默认rQ使用iid标准正态变量作为初始值。我已经用维度系统地检查了预期的约束是否成立。我还用 Poisson变量对其进行了测试,因为它们很可能是零,所以会产生非常有问题的初始解决方案。d=1200,(0.1)

的主要输入rQ是一个逻辑矩阵,指示要在何处应用零约束。这是问题中指定的约束的示例。

set.seed(17)
Q <- matrix(c(FALSE, TRUE, TRUE, FALSE,
              TRUE, FALSE, FALSE, FALSE,
              TRUE, FALSE, FALSE, FALSE,
              FALSE, FALSE, FALSE, FALSE), 4)
Lambda <- rexp(4)
zapsmall(rQ(Q, Lambda))
         [,1]      [,2]      [,3]      [,4]
[1,] 2.646156  0.000000  0.000000  2.249189
[2,] 0.000000  0.079933  0.014089 -0.360013
[3,] 0.000000  0.014089  0.006021 -0.055590
[4,] 2.249189 -0.360013 -0.055590  4.167296

的对角线作为第二个参数传递给. 它的第三个参数必须是一个随机数生成器(或任何其他返回长度为 的数值向量的函数)。ΛrQff(n)n

rQ <- function(Q, Lambda, f=rnorm) {
  normalize <- function(x) {
    v <- zapsmall(c(1, sqrt(sum(x * x))))[2]
    if (v == 0) v <- 1
    x / v
  }
  Q <- Q | t(Q)                    # Force symmetry by applying all constraints
  d <- nrow(Q) 
  if (missing(Lambda)) Lambda <- rep(1, d)
  R <- matrix(f(d^2), d, d)        # An array of column vectors
  for (i in seq_len(d)) {
    j <- which(Q[seq_len(i-1), i]) # Indices of the preceding orthogonal vectors
    R[, i] <- normalize(residuals(.lm.fit(R[, j, drop=FALSE], R[, i])))
  }
  R <- R %*% diag(Lambda)
  crossprod(R)
}

我不确定这是否是您想要的,但是对于您给出的具体示例(这不一定很容易概括为任意零约束,因为代数可能会变得混乱!)

  • 如果是对角线上具有正值的下三角矩阵,则是正定的(要求对角线为正对于正定来说不是必需的,但会使分解独一无二:参见 Pinheiro 和 Bates 1996 “方差-协方差矩阵的无约束参数化”)。LΩ=LL
  • Ω12=L11L21因此,我认为在不进一步丧失一般性的情况下,具有正对角线且的下三角矩阵将为您提供所需的约束模式。(设置会给你一个奇异矩阵。)Ω13=L11L31L21=L31=0L11=0
  • “随机”非常模糊。(你没有说“统一”......)我们可以例如选择(对于不等于)。θiiU(0,20)θijU(10,10)ij{i,j}{2,1}{3,1}
set.seed(101)
m <- matrix(0, 4, 4)
diag(m) <- runif(4, max=20)
m[lower.tri(m)] <- runif(6, min=-10, max=10)
m[2,1] <- m[3,1] <- 0
S <- m %*% t(m)
S
         [,1]       [,2]       [,3]       [,4]
[1,] 55.41265  0.0000000   0.000000  12.634888
[2,]  0.00000  0.7682458  -2.919309   2.138861
[3,]  0.00000 -2.9193087 212.553839   4.881917
[4,] 12.63489  2.1388607   4.881917 182.698471

eigen(S)$values

[1] 213.387898 183.174454  54.170033   0.700823

首先,生成随机对称矩阵。其次,应用ledoit wolf正则化使其成为SPD。