2014-09-01 29 views
-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以对两个数据进行分类。

回答

0

use_step_method中的第二个参数是指应用step方法的随机数,而不是数据本身。

+0

感谢您的回复!我改变了作为PyMCMC模块的TruncatedNormal分布的步骤方法,并且在'testmod'中,我仅使用了样本作为父项。统计随机(logprob)仍然存在一些问题。我认为它是因为我将四个分布绑定为一个数组(我希望传递给logprob)。此外,有没有可能找出stepprob提出的值给logprob? – 2014-09-04 07:26:18

相关问题