-1
我对PyMC比较陌生,整体而言,我的概率知识较少。就我所了解的MCMC算法而言,其主要任务是向模型提供参数样本(迭代),直到模型的概率最大化(如果我的理解错误,请纠正我)。例如让我定义一个模型为PyMC:采样器将哪个参数传递给模型?如何查找自定义采样器传递的值?
----------------------------------- testmodel-- ---------------------------------------------
import numpy as np
import scipy.stats as ss
from pymc import *
N = 50
data = np.array([ss.gamma.rvs(2, scale=50) for i in range(N)])
labels = np.random.randint(0, 2, 50)
@ stochastic
def logprob(samples=[2, 50, 2, 50], data=data, labels=labels, value= -10000):
a, b, c, d = samples
data1, data2 = data[(labels == 0)], data[(labels == 1)]
pdf1 = ss.gamma.logpdf(data1, a, scale=b)
pdf2 = ss.gamma.logpdf(data2, c, scale=d)
pdf1[(pdf1 == -np.inf)] = -500
pdf2 [(pdf2 == -np.inf)] = -500
return np.sum(pdf1)+np.sum(pdf2)
数据是我们的观察结果,并且已知它遵循伽玛分布。
允许假设所有四个参数遵循正态分布作为 A,C〜N(2,0.2) B,D〜N(50,5) 我想创建提出了随机的自定义步骤方法从这些分布中得出的变量。我试图创建一些,但在应用程序时遇到错误。
class StandardNormal(Gibbs):
def __init__(self, stochastic, verbose=None):
Gibbs.__init__(self, stochastic, verbose=verbose)
def step(self):
self.stochastic.value = [TruncatedNormal(2, 0.2),
TruncatedNormal(50, 5),
TruncatedNormal(2, 0.2),
TruncatedNormal(50, 5)]
import testmod
M=MCMC(testmod)
M.use_step_method(StandardNormal, samples)
它说“样本”没有定义。如果我将模型中的“样本”定义为正态分布,那么“样本”的痕迹是否与样本提出的相同?
我尝试不创建自定义步骤方法它的工作,但我想获取默认样本提供给模型的样本的值。由于我的程序的下一部分需要这些值,因此可以最大化数据模型的pdf以对两个数据进行分类。
感谢您的回复!我改变了作为PyMCMC模块的TruncatedNormal分布的步骤方法,并且在'testmod'中,我仅使用了样本作为父项。统计随机(logprob)仍然存在一些问题。我认为它是因为我将四个分布绑定为一个数组(我希望传递给logprob)。此外,有没有可能找出stepprob提出的值给logprob? – 2014-09-04 07:26:18