0

我是 PyMC ( https://github.com/pymc-devs/pymc ) 的初学者,我正在尝试构建一个带有动态组件的模型,基本上每次模型都是求解一个小型常微分方程 (ODE) 系统叫。

我尽我所能搜索了谷歌和(已弃用的)PyMC 邮件列表,并在此处提出了模型结构(pk_model.py)和调用者(pk_fit.py):

https://gist.github.com/gyromagnetic/6097271

运行 pk_fit 一开始似乎可以工作,但随后会转储许多与 ODE 求解器相关的错误消息。ODE 和求解器的独立版本(未与 PyMC 代码集成)可以正常工作。

放入各种打印语句,看起来代码开始工作,但在某些时候,未知参数参数(kcp,kpc,ke)从标量变为 numpy.ndarrays。这似乎是问题的一部分。

作为 PyMC 的新手,我希望我做的事情显然是错误的。

我将不胜感激任何帮助。

4

1 回答 1

2

您是对的:PyMC 将随机参数值作为 numpy.ndarrays 提供给您的模型,因此您需要做的就是在计算差异之前转换回 python 标量(获取第一项)。

例如,在您的代码中:

dcc_dt = k1.item() * y_cp - (k2.item() + k3.item()) * y_cc
dcp_dt = k2.item() * y_cc - k1.item() * y_cp

此外,如果您正在处理大量观察到的数据,我建议您考虑使用 Cython、Boost.Python或类似工具将您的 ODE 模型转换为 Python 扩展。它将显着加快求解速度,如果您需要在 MCMC 中进行数千次采样,这一点很重要。我将后者与odeint库一起用于我的 ODE 模型,并且能够获得比纯 Python 版本快 150 倍的速度。

于 2013-09-23T00:58:36.857 回答