我正在使用顺序蒙特卡罗方法来估算某种财务模型。然而,这种方法实际上在计算上非常昂贵,并且瓶颈归结为从多元高斯分布中采样。假设我使用的样本(粒子)的数量是5000,问题的维数是5.这意味着我将有5000个不同的平均向量与形状(5,),5000个不同的协方差阵列与形状(5,5) ),我需要从5000对中抽取5000个样本。我该如何快速完成?我到目前为止最快的解决方案是:
seeds = np.random.multivariate_normal(np.zeros(5), np.eye(5), size = 5000)
Ls = [np.linalg.cholesky(covs[i]) for i in range(5000)]
results = means + np.einsum('nij,njk->nik', Ls, seeds[:,:,np.newaxis])[:,:,0]
其中np.einsum是numpy中执行爱因斯坦和的函数,而平均值和covs是上面提到的5000对。
我认为在for循环中执行cholesky的步骤非常慢,但在这种情况下我无法找到任何进行矢量化计算的方法。欢迎大家提出意见。