我是新手做贝叶斯推理。我正在尝试调整我写的贝叶斯蒙特卡罗马尔可夫链方法的网格搜索代码,我正在使用PyMC3。我的问题是代码必须调用一个无法在theano语法中重写的函数。 (该函数依赖于f2py包装器中的一段Fortran代码。)
这是我正在使用的代码:
with pm.Model() as model:
# Independent parameters
x = pm.Normal('x', sx, sd=incx*float(nrangex)/2.0)
y = pm.Normal('y', sy, sd=incy*float(nrangey)/2.0)
depth = pm.Normal('depth', sdepth, sd=incdepth*float(nrangedepth)/2.0)
length = pm.Normal('length', slength, sd=inclength*float(nrangelength)/2.0)
width = pm.Normal('width', swidth, sd=incwidth*float(nrangewidth)/2.0)
strike = pm.Normal('strike', sstrike, sd=incstrike*float(nrangestrike)/2.0)
dip = pm.Normal('dip', sdip, sd=incdip*float(nrangedip)/2.0)
rake = pm.Normal('rake', srake, sd=incrake*float(nrangerake)/2.0)
# Model (This is the part that doesn't work.)
los_disp = zne2los(getdisp(lon2km(dsidata['lon'], x), lat2km(dsidata['lat'], y), depth, length, width, strike, dip, rake))
# Likelihood
odisp = pymc3.Normal('los_disp', mu = los_disp, sd = 0.5, observed = dsidata['disp'])
# Sampling
trace = pm.sample(100)
此代码尝试执行的操作是从地面位移数据中反转地震源参数。 dsidata数据帧包含作为纬度和经度函数的地面位移数据。我正在尝试解决八个地震源参数,这些参数最适合这种地表位移。
getdisp函数根本无法为theano重写,因为它调用了一块Fortran,它可以从地震源参数中模拟地面位移。有没有办法将非theano代码编译成theano形式?还有其他办法吗?
由于我是新手,我找不到很多很好的例子,但代码中可能还有其他错误。我还有其他错误吗?