我正在尝试对P
乘以N
的协方差矩阵N
的高斯分布进行采样,其中N
非常大(大约4000)。
通常情况下,这样:
P
的{{1}}的Cholesky分解,使得L
L * L.T = P
,其中X ~N(0,I_N)
是身份,I_N
N = 4000
获得所需的样本Y
这里的障碍在于Y = L * X
的计算。对于如此大的矩阵,该算法似乎不稳定,因为计算出的Cholesky分解不满足L
。
在计算L * L.T != P
的Cholesky分解(除以其最大值)之前,我试图进行归一化,但无济于事。我正在使用C ++库Eigen,并且我也注意到了numpy的问题。
有什么建议吗?
答案 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
。)