Solving inverse problems with PyMC

前端 未结 2 1468
Happy的楠姐
Happy的楠姐 2020-12-15 00:43

Suppose we\'re given a prior on X (e.g. X ~ Gaussian) and a forward operator y = f(x). Suppose further we have observed y

相关标签:
2条回答
  • 2020-12-15 01:17

    The problem is that your function, $y = x^2$, is not one-to-one. Specifically, because you lose all information about the sign of X when you square it, there is no way to tell from your Y values whether you originally used 2 or -2 to generate the data. If you create a histogram of your trace for X after just the first iteration, you will see this:histogram of trace after first iteration

    This distribution has 2 modes, one at 2 (your true value) and one at -2. At the next iteration, x.mean() will be close to zero (averaging over the bimodal distribution), which is obviously not what you want.

    0 讨论(0)
  • 2020-12-15 01:20

    The functionality purposed by @user1572508 is now part of PyMC under the name stochastic_from_data() or Histogram(). The solution to this thread then becomes:

    from pymc import *
    import matplotlib.pyplot as plt
    
    xtrue = 2 # unknown in the real application
    prior = rnormal(0,1,10000) # initial guess is inaccurate
    for i in range(5):
      x = stochastic_from_data('x', prior)
      y = x*x
      obs = Normal('obs', y, 0.1, xtrue*xtrue + rnormal(0,1), observed=True)
    
      model = Model([x,y,obs])
      mcmc = MCMC(model)
      mcmc.sample(10000)
    
      Matplot.plot(mcmc.trace('x'))
      plt.show()
    
      prior = mcmc.trace('x')[:]
    
    0 讨论(0)
提交回复
热议问题