python - 定义自定义 PyMC 发行版

标签 python machine-learning pymc

这可能是个愚蠢的问题。

我正在尝试使用 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 或诸如此类的东西,但我想适应注释掉的密度函数。

如有任何帮助,我们将不胜感激。

最佳答案

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

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 创建具有核密度估计器的节点的示例。

关于python - 定义自定义 PyMC 发行版,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17603935/

相关文章:

python - Cassandra 查询制作 - 无法执行此查询,因为它可能涉及数据过滤,因此可能具有不可预测的性能

machine-learning - tensorflow 中的batch_loss和total_loss=tf.get_total_loss()

python - pymc 对多个变量进行观察

python - pymc3 中的后采样

python - 如何使用 Ajax 检查 django-celery 任务的状态和结果?

python - 为每个问题生成一次随机值 Python

Python替换,使用数组中的模式

machine-learning - 使用 LSTM Keras 的序列数据进行多类分类不起作用

machine-learning - 使用开发集或训练集

python - python - 无法满足的错误 : The following specifications were found to be in conflict