尺寸过高时出现numpy multivariate_normal错误

时间:2016-10-18 05:39:28

标签: python numpy

我正在做家庭作业,我注意到当均值和协方差的维数非常高时,multivariate_normal将永远占用所有CPU,而不会产生任何结果。

示例代码段

cov_true  = np.eye(p)
mean_true = np.zeros(p)
beta_true = multivariate_normal(mean_true, cov_true, size=1).T

p=5000时,这将永远运行。 环境,python3.4和python3.5,numpy 1.11.0

这真的是一个错误还是我错过了什么?

1 个答案:

答案 0 :(得分:2)

需要花费多少时间?

要考虑协方差矩阵的变量NumPy computes the singular value decomposition之间的关系,这需要花费大部分时间(underlying GESDD一般为Θ(n 3 ), 5000 3 已经有点了。

如何加速?

在所有变量独立的最简单情况下,您可以使用random.normal

from numpy.random import normal

sample = normal(means, deviations, len(means))

否则,如果您的协方差矩阵恰好是满秩(因此是正定的),则通常用cholesky取代svd(仍然是Θ(n 3 ),但是有一个较小的常数):

from numpy.random import standard_normal
from scipy.linalg import cholesky

l = cholesky(covariances, check_finite=False, overwrite_a=True)
sample = means + l.dot(standard_normal(len(means)))

如果矩阵可能是单数(有时就是这种情况),那么要么换SPSTRF,要么考虑帮助scipy#6202

Cholesky可能明显更快,但如果这还不够,那么你可以进一步研究是否不可能分析分解矩阵,或尝试使用不同的基础库(如ACML,MKL或cuSOLVER)。