【发布时间】:2018-04-16 12:35:34
【问题描述】:
我有一个包含 60,000 个表单示例的数据集:
mu1 mu2 std1 std2
0 -0.745 0.729 0.0127 0.0149
1 -0.711 0.332 0.1240 0.0433
...
它们本质上是二维正态分布的参数。我想要做的是创建一个(NxN)矩阵P,使得P_ij = Normal(mu_i | mean=mu_j,cov=diagonal(std_j)),其中mu_i是数据'i'的(mu1,mu2)。
例如,我可以使用以下代码来做到这一点:
from scipy import stats
import numpy as np
mu_all = data[['mu1', 'mu2']]
std_all = data[['std1', 'std2']]
P = []
for i in range(len(data)):
mu_i = mu_all[i,:]
std_i = std_all[i,:]
prob_i = stats.multivariate_normal.pdf(mu_all, mean=mu_i, cov=np.diag(std_i))
P.append(prob_i)
P = np.array(P).T
但这太贵了(我的机器死机了)。我怎样才能更有效地做到这一点?我的猜测是 scipy 无法一次处理 60000 的计算 pdf。有替代方案吗?
【问题讨论】:
-
scipy 可以在我的计算机中在约 26 毫秒内以 60000 点计算这样的 pdf,执行 60000 次需要约 26 分钟。不幸的是,我的计算机似乎无法分配 60000 x 60000 的 float64 数组。
-
是的,抱歉,这不是问题。大矩阵是问题所在。谢谢
标签: python numpy scipy vectorization