Defining a custom PyMC distribution

前端 未结 1 891
忘掉有多难
忘掉有多难 2021-02-08 07:53

This is perhaps a silly question.

I\'m trying to fit data to a very strange PDF using MCMC evaluation in PyMC. For this example I just want to figure out how to fit to a

1条回答
  •  花落未央
    2021-02-08 08:31

    An easy way is to use the stochastic decorator:

    import pymc as mc
    import numpy as np
    
    data = np.random.normal(-200,15,size=1000)
    
    mean = mc.Uniform('mean', lower=min(data), upper=max(data))
    std_dev = mc.Uniform('std_dev', lower=0, upper=50)
    
    @mc.stochastic(observed=True)
    def custom_stochastic(value=data, mean=mean, std_dev=std_dev):
        return np.sum(-np.log(std_dev) - 0.5*np.log(2) - 
                      0.5*np.log(np.pi) - 
                      (value-mean)**2 / (2*(std_dev**2)))
    
    
    model = mc.MCMC([mean,std_dev,custom_stochastic])
    model.sample(iter=5000)
    
    print "!"
    print(model.stats()['mean']['mean'])
    print(model.stats()['std_dev']['mean'])
    

    Note that my custom_stochastic function returns the log likelihood, not the likelihood, and that it is the log likelihood for the entire sample.

    There are a few other ways to create custom stochastic nodes. This doc gives more details, and this gist contains an example using pymc.Stochastic to create a node with a kernel density estimator.

    0 讨论(0)
提交回复
热议问题