大高斯分布的稳定采样

Stable sampling of large Gaussian distributions

我正在尝试对 N 协方差矩阵 P 的高斯分布进行采样 N,其中 N 非常大(大约 4000 )。

通常会这样进行:

  1. 计算 P 的 Cholesky 分解:L,使得 L * L.T = P
  2. 对正态高斯分布进行采样:X ~N(0,I_N),其中 I_N 是身份,N = 4000
  3. Y = L * X
  4. 获取想要的样本Y

这里的障碍在于 L 的计算。该算法对于如此大的矩阵似乎并不稳定,因为计算的 Cholesky 分解不满足 L * L.T != P.

我试图在计算其 Cholesky 分解(除以其最大值)之前对 P 进行归一化,但无济于事。我正在使用 C++ 库 Eigen,我也注意到了 numpy 的这个问题。

有什么建议吗?

Cholesky 分解应该是相当稳定的,如果输入矩阵实际上是正定的。如果矩阵是(接近)半定或不确定的,它可能会有问题。 在这种情况下,您可以改用 LDLT 分解。对于输入 A,它计算排列 P、单位对角三角形 L 和对角线 D,使得

 A = P.T*L*D*L.T*P

然后你当然需要 Y = sqrt(D) * L * X 而不是乘 Y = L * X,其中 sqrt(D) 是一个元素明智的 sqrt(我不知道 python 的语法那)。

请注意,您可以忽略排列,因为排列相同独立分布的随机数的向量仍然是 i.i.d 的向量。数字。

如果仍然无效,请尝试使用 SelfAdjointEigenSolver-分解。 这将计算特征值 D 的对角矩阵和特征向量的一元矩阵 V,这样

A = V * D * V^{-1}

你可以做与上面基本相同的事情。 (请注意,对于一元矩阵,V^{-1} 只是 V 的伴随,即实值情况下的 V^{-1} = V^T