【问题标题】:Defining a custom PyMC distribution定义自定义 PyMC 分布
【发布时间】:2013-07-11 21:34:33
【问题描述】:

这可能是一个愚蠢的问题。

我正在尝试使用 PyMC 中的 MCMC 评估将数据拟合到一个非常奇怪的 PDF 中。对于这个例子,我只想弄清楚如何适应我手动输入正常 PDF 的正态分布。我的代码是:

data = []; 
for count in range(1000): data.append(random.gauss(-200,15));

mean = mc.Uniform('mean', lower=min(data), upper=max(data))
std_dev = mc.Uniform('std_dev', lower=0, upper=50)

# @mc.potential
# def density(x = data, mu = mean, sigma = std_dev):
#   return (1./(sigma*np.sqrt(2*np.pi))*np.exp(-((x-mu)**2/(2*sigma**2))))

mc.Normal('process', mu=mean, tau=1./std_dev**2, value=data, observed=True)

model = mc.MCMC([mean,std_dev])
model.sample(iter=5000)

print "!"
print(model.stats()['mean']['mean'])
print(model.stats()['std_dev']['mean'])

我发现的示例都使用 mc.Normal 或 mc.Poisson 之类的东西,但我想适应注释掉的密度函数。

任何帮助将不胜感激。

【问题讨论】:

    标签: python machine-learning pymc


    【解决方案1】:

    一个简单的方法是使用随机装饰器:

    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'])
    

    请注意,我的 custom_stochastic 函数返回对数似然,而不是似然,它是整个样本的对数似然。

    还有其他几种方法可以创建自定义随机节点。这个doc 提供了更多详细信息,这个gist 包含一个使用 pymc.Stochastic 创建具有核密度估计器的节点的示例。

    【讨论】:

    • @jcrudy。在尝试定义自己的简单先验时,我遇到了您的答案。为了避免污染这个问题,我开始了自己的here,我想知道您是否可以对此有所了解。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-11
    • 1970-01-01
    • 2021-05-13
    • 2016-05-31
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    相关资源
    最近更新 更多