Я новичок в байесовском выводе. Я пытаюсь адаптировать код поиска по сетке, который я написал, для байесовского подхода Монте-Карло Маркова, и я использую PyMC3. Моя проблема в том, что код должен вызывать функцию, которую нельзя переписать в синтаксисе theano. (Эта функция основана на фрагменте кода Fortran в оболочке f2py.)
Вот код, с которым я работаю:
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, которая упреждающе моделирует смещение земной поверхности по параметрам очага землетрясения. Есть ли способ скомпилировать не-теано-код в теано-форму? Есть ли другой способ сделать это?
Поскольку я новичок в этом и не могу найти много хороших примеров для просмотра, в коде вполне могут быть другие ошибки. Есть ли другие ошибки, которые я делаю?