我正在做家庭作业,我注意到当均值和协方差的维数非常高时,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
这真的是一个错误还是我错过了什么?
答案 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)。