大高斯分布的稳定采样

时间:2018-07-24 14:46:47

标签: numpy eigen gaussian

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

通常情况下,这样:

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

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

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

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

如果输入矩阵实际上是正定的,则​​Cholesky分解应该非常稳定。如果矩阵是(近)半定数或无限定的,则可能会出现问题。 在这种情况下,您可以改用LDLT分解。对于输入A,它计算置换P,单位对角三角形L和对角线D,这样

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

然后当然不用Y = L * X乘以Y = sqrt(D) * L * X,其中sqrt(D)是逐元素的sqrt(我不知道它的python语法)。

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

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

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

您基本上可以执行与上述相同的操作。 (请注意,对于一元矩阵,V^{-1}只是V的伴随物,即在实值情况下,V^{-1} = V^T。)