也许这个答案将有助于实现它:
具有这种非负定性特性的一类矩阵是Wishart 分布。并且来自 ~W() 的样本使得所有非对角线条目都在某些范围 [l,u] 之间将适合您的问题。但是,我不认为这与 [l,u] 中所有具有非对角线的正定矩阵的分布相同。
在维基百科页面上,有一个从 ~W() 计算的算法。
一个更简单的、骇人听闻的解决方案(可能近似于此)是:
(假设 u>l 且 l>0)
- 从多元正态图中提取,其中 Sigma = mean(l,u)。
- 然后取样本,计算其相关矩阵 => C
- 这个矩阵会有一些随机性(模糊),但它有多少模糊的数学有点超出我的计算范围。此 C 矩阵中的非对角线的值以 [-1,1] 为界,均值为 mean(l,u)。通过眼球,我猜测某种贝塔/指数。在任何情况下,除非 (l,u) = [-1,1],否则 C 中关闭诊断的连续分布保证它不会表现并位于边界 (l,u) 内。
- 您可以通过增加/减少步骤 1 中样本的长度来调整“模糊”的数量。我敢打赌(未经证实)C 的奇数对数的方差量与数量的平方根成正比样品。
因此,要真正回答这似乎并非易事!
正如其他海报所建议的那样,您可以从 Wishart 生成,然后保留您想要的属性为真的那些,但您可能会采样很长时间!如果你排除那些 0-确定的(那是一个词吗?),那么这应该可以很好地生成好的矩阵。然而,这并不是所有 pos-def 矩阵的真实分布,其 off-diags 在 [l,u] 中。
上面提出的哑采样方案的代码(在 R 中)
sigma1 <- function(n,sigma) {
out <- matrix(sigma,n,n)
diag(out) <- 1
return (out)
}
library(mvtnorm)
sample_around_sigma <- function(size, upper,lower, tight=500) {
# size: size of matrix
# upper, lower: bounds on the corr, should be > 0
# tight: number of samples to use. ideally this
# would be calcuated such that the odd-diags will
# be "pretty likely" to fall in [lower,upper]
sigma <- sigma1(size,mean(c(upper,lower)))
means <- 0*1:size
samples <- rmvnorm(n=tight, mean=means,sigma=sigma)
return (cor(samples))
}
> A <- sample_around_sigma(5, .3,.5)
> A
[,1] [,2] [,3] [,4] [,5]
[1,] 1.0000000 0.3806354 0.3878336 0.3926565 0.4080125
[2,] 0.3806354 1.0000000 0.4028188 0.4366342 0.3801593
[3,] 0.3878336 0.4028188 1.0000000 0.4085453 0.3814716
[4,] 0.3926565 0.4366342 0.4085453 1.0000000 0.3677547
[5,] 0.4080125 0.3801593 0.3814716 0.3677547 1.0000000
>
> summary(A[lower.tri(A)]); var(A[lower.tri(A)])
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.3678 0.3808 0.3902 0.3947 0.4067 0.4366
[1] 0.0003949876