2013-07-28 4 views
0

Я начинаю с PyMC (https://github.com/pymc-devs/pymc) и пытаюсь построить модель с динамическим компонентом, по существу решающим небольшую систему обыкновенных дифференциальных уравнений (ODE) каждый раз, когда модель называется.Динамическая (ODE-based) модель в PyMC

Я искал Google и (устаревшее) PyMC список рассылки в меру своих способностей и придумали структуру модели (pk_model.py) и вызывающего абонента (pk_fit.py) здесь:

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

Запуск pk_fit, похоже, работает сначала, но затем сбрасывает много сообщений об ошибках, связанных с решателем ODE. Отдельная версия ODE и решателя (не интегрированная с PyMC-кодом) отлично работает.

Вставляя различные операторы печати, кажется, что код сначала работает, но затем в какой-то момент аргументы неизвестного параметра (kcp, kpc, ke) изменяются от скаляров до numpy.ndarrays. Это, похоже, является частью проблемы.

Будучи неофитом с PyMC, я ожидаю, что я делаю что-то явно неправильно.

Буду признателен за любую помощь по этому вопросу.

ответ

2

Вы правы: PyMC поставляет стохастические значения параметров в вашу модель как numpy.ndarrays, поэтому все, что вам нужно сделать, это преобразовать обратно в скалярный скаляр (получить первый элемент) перед вычислением дифференциалов.

Например, в коде:

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

Кроме того, если вы имеете дело с большими массивами данных наблюдений, я предлагаю вам посмотреть в преобразовании модели ОДУ в расширение в Python, используя Cython, Boost.Python или похожие. Это значительно ускорит решение, что важно, если вам нужно много раз пробовать в вашем MCMC. Я использовал последний, с библиотекой odeint, для моей модели ODE и смог получить ускорение в 150 раз по сравнению с чистой версией Python.

Смежные вопросы