如何使用 R 生成具有零约束的随机对称正定矩阵?
例如,我想生成一个 4 x 4 随机对称正定矩阵,我们知道。我怎么能在 R 中做到这一点?
我想到的是类似于 Cholesky 分解,其中行和行如果是正交的。可能通过拉格朗日乘数求解。但我不确定如何实现这一点。或者,如果这是可能的。
如何使用 R 生成具有零约束的随机对称正定矩阵?
例如,我想生成一个 4 x 4 随机对称正定矩阵,我们知道。我怎么能在 R 中做到这一点?
我想到的是类似于 Cholesky 分解,其中行和行如果是正交的。可能通过拉格朗日乘数求解。但我不确定如何实现这一点。或者,如果这是可能的。
每个对称正(半)定矩阵可以被分解为
其中是一个正交矩阵,是一个对角矩阵,其中包含非负(正)项 (始终是某个变量分布将是其相关矩阵;是边际分布的标准差。)
让我们解释一下这个公式。 (项是和列的点积乘以 因此,上的零约束列的点积的正交约束。
(请注意,正定矩阵的所有对角线条目都必须是非零的,所以我假设零约束都在对角线之外。我还将条目入口,以确保结果的对称性。)
施加这种约束的一种(完全通用的)方法是按顺序生成 使用您喜欢的任何方法来创建初始值的矩阵。在步骤更改的所有需要与其正交的列上对其进行回归并保留残差。将这些结果归一化,使它们的点积(平方和)一致。即列。
创建以任何您喜欢的方式随机生成的对角线(如在https://stats.stackexchange.com/a/215647/919密切相关的答案中所讨论的)。
以下R
函数默认rQ
使用iid标准正态变量作为初始值。我已经用维度到系统地检查了预期的约束是否成立。我还用 Poisson变量对其进行了测试,因为它们很可能是零,所以会产生非常有问题的初始解决方案。
的主要输入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
的对角线作为第二个参数传递给. 它的第三个参数必须是一个随机数生成器(或任何其他返回长度为 的数值向量的函数)。rQ
f
f(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)
}
我不确定这是否是您想要的,但是对于您给出的具体示例(这不一定很容易概括为任意零约束,因为代数可能会变得混乱!)
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。