我试图使用pymc3推断随机动力系统的参数。我有一个似乎没有错误的theano表达,但我似乎无法编译它,我希望这样做以生成适合的玩具数据。我的模特是
dx / dt = ax(t) - x(t)^ 3 + epsilon(即epsilon是一些状态噪声)
epsilon~Normal(0,sigma ^ 2)
计划是在pymc3中设置先前分布的epsilon
,sigma
和a
,并使用theano.scan
来积分微分方程。然后我需要生成一些数据,我想通过将scan
的输出编译成python函数可以做到这一点,我将使用sigma
,a
和{的固定值运行{1}}。到目前为止我在这里:
x(0)
最后一行给了我
MissingInputError:("图表的输入,用于计算{cpu,scan_fn}(Elemwise {Cast {int32}}。0,IncSubtensor {Set;:int64:}。0,sigma,a ,dt,epsilon),未提供且未给出值。使用Theano标志exception_verbosity =' high',有关此错误的更多信息。",epsilon)
(详细标志无效)。
我不确定的一件事是pymc3随机变量在import theano.tensor as T
import theano
import pymc3 as mc
with mc.Model() as model:
# Time-related variables for performing the integration
dt = T.fscalar('dt')
tau = T.fscalar('tau')
steps = T.cast(tau / dt, 'int32')
x = mc.Uniform('x', lower=-10, upper=10)
a = mc.Gamma('a', 1, 1)
sigma = mc.Gamma('sigma', mu=1, sd=1)
epsilon = mc.Normal('epsilon', mu=0, sd=sig_s)
# Symbolic loop through Euler updates
xout, updates = theano.scan(fn=lambda x, sigma, a, dt: x + dt * (a * x - x**3) + T.sqrt(dt) * epsilon,
outputs_info=x,
non_sequences=[sigma, a, dt],
n_steps=steps)
simulation = theano.function(inputs=[x, sigma, a, dt, tau],
outputs=xout,
updates=updates,
allow_input_downcast=True)
内是如何工作的。如果我为scan
提供值,sigma
会在循环的每次迭代中绘制一个新的随机值吗?我需要给epsilon
一个大小吗?