大高斯分布的稳定采样
Stable sampling of large Gaussian distributions
我正在尝试对 N
协方差矩阵 P
的高斯分布进行采样 N
,其中 N
非常大(大约 4000 )。
通常会这样进行:
- 计算
P
的 Cholesky 分解:L
,使得 L * L.T = P
- 对正态高斯分布进行采样:
X ~N(0,I_N)
,其中 I_N
是身份,N = 4000
- 从
Y = L * X
获取想要的样本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
。
我正在尝试对 N
协方差矩阵 P
的高斯分布进行采样 N
,其中 N
非常大(大约 4000 )。
通常会这样进行:
- 计算
P
的 Cholesky 分解:L
,使得L * L.T = P
- 对正态高斯分布进行采样:
X ~N(0,I_N)
,其中I_N
是身份,N = 4000
- 从
Y = L * X
获取想要的样本
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
。