python-3.x - 运行 PyMC3 模型时如何解决内存错误
问题描述
我有以下 pymc3 (3.8) 分层模型,其中
- y(因变量)是 1313x1
- x(1 级预测变量)是 1313x2
- z(2 级预测变量)是一个 1313x3 矩阵
with pm.Model() as model:
gamma_0_0 = pm.Normal("gamma_0_0", mu=0, sigma=10)
gamma_k_0 = pm.Normal("gamma_k_0", mu=0, sigma=10, shape=x.shape[1])
gamma_0_j = pm.Normal("gamma_0_j", mu=0, sigma=10, shape=z.shape[1])
gamma_k_j = pm.Normal("gamma_k_j", mu=0, sigma=10, shape=(z.shape[1], x.shape[1]))
# Model error
u_0_j = pm.Normal("u_0_j", mu=0, sigma=10)
u_k_j = pm.Normal("u_k_j", mu=0, sigma=10, shape=x.shape[1])
r_ij = pm.Gamma("r_ij", alpha=9, beta=4)
beta_0_j = pm.math.dot(z, gamma_0_j) + gamma_0_0 + u_0_j
beta_k_j = pm.math.dot(z, gamma_k_j) + gamma_k_0 + u_k_j
y_hat = pm.math.dot(x, beta_k_j.T) + beta_0_j
# Likelihood
y_like = pm.Normal("y_like", mu=y_hat, sigma=r_ij, observed=y)
with model:
step = pm.NUTS()
trace = pm.sample(draws=500, chains=2, tune=200, discard_tuned_samples=True, random_seed=SEED, step=step)
当我从后部仅抽取 200 个样本(tune=100)时,模型运行良好。但是,当我将样本增加到 500(tune=200)时,会出现以下错误:
numpy.core._exceptions.MemoryError:无法为形状为(2、500、1313、1313)且数据类型为 float64 的数组分配 12.8 GiB
没有模型不再运行的问题,我不明白为什么错误报告中的数组形状是(2、500、1313、1313)。2 可以是链数,500 是样本数,1313 是 y 的长度。但为什么不是 (2, 500, 1313)?
我知道这个错误可能可以通过分配更多内存来解决,如此处所述(无法分配具有形状和数据类型的数组),但我正在寻求更可持续的解决方案。
我使用 Windows10 (32GB RAM)、Anaconda 3 和 Python 3.8
解决方案
推荐阅读
- c++ - 获取 CComPtr 参数
- php - Vue JS 对分页 Laravel 结果的实时客户端搜索过滤器
- javascript - 单击外部选择列表时,防止 Google 放置自动完成关闭选择列表(pac-container)
- c# - 在 dotnet webapi 5 中发布文件时出现 405 错误
- c++ - Clang 无法在非标准位置找到头文件
- python - 将开始和结束时间转换为密度/职业
- c - 为什么递归会搞砸,最终陷入无限循环?
- architecture - 使用 Tesseract 从 PDF 中解析带有特殊字符的文本的一般方法?
- c++ - IO 完成端口的接收缓冲区始终为空
- javascript - 过滤多个数组 ngrx