pymc3中的后验取样

时间:2013-11-01 20:46:32

标签: python pymc

1:23 PM(20分钟前) 您好,

尝试学习pymc3(从未学过pymc2,所以跳进新的东西),我怀疑有一个非常简单的例子/伪代码用于我正在尝试做的事情。想知道是否有人可以帮助我,因为过去几个小时我没有取得多大进展......

我的问题是以相当直接的方式从后方采样。设“x”为矢量,“t(x)”是该矢量的函数(R ^ n→R ^ n映射),“D”是某些观测数据。我想从

中抽取矢量x

P(x | D)\ propto P(D | x)P(x)

通常贝叶斯的东西。使用NUTS如何做到这一点的一个例子将是壮观的!我的主要问题似乎是使函数t(x)正常工作,并使模型从后验(而不是先验)返回样本。

任何和所有帮助/提示表示赞赏。与此同时,我将继续尝试。

最佳,

TJ

1 个答案:

答案 0 :(得分:1)

你的符号对我来说有点混乱,但如果我理解正确,你想要从可能性(参数和数据的某些功能)中抽样一次。我同意 - 这是典型的贝叶斯东西。

我认为贝叶斯逻辑回归是一个很好的例子,因为我们无法通过分析解决它。假设我们的模型如下:

B~Normal(0,sigma2 * I)

p(y_i | B)= p_i ^ {y_i}(1 - p_i)^ {1 - y_i}

观察到y_i且p_i = 1 /(1 + exp(-z_i))和

z_i = B_0 + B_1 * x_i

我们假设sigma2已知。在我们将数据加载到numpy数组x和y之后,我们可以从后面采样以下内容:

with pm.Model() as model:
    #Priors
    b0 = pm.Normal("b0", mu=0, tau=1e-6)
    b1 = pm.Normal("b1", mu=0, tau=1e-6)
    #Likelihood
    yhat = pm.Bernoulli("yhat", 1 / (1 + t.exp(-(b0 + b1*x))), observed=y)
    # Sample from the posterior
    trace = pm.sample(10000, pm.NUTS(), progressbar=False)

要查看完整示例,请查看此iPython笔记本:

http://nbviewer.ipython.org/gist/jbencook/9295751c917941208349

pymc3也有一个很好的glm语法。你可以在这里看到它是如何工作的:

http://jbencook.github.io/portfolio/bayesian_logistic_regression.html