首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >pymc3:具有多个强求变量的层次模型

pymc3:具有多个强求变量的层次模型
EN

Stack Overflow用户
提问于 2015-11-11 22:28:25
回答 1查看 1.5K关注 0票数 7

我有一个简单的层次模型,有很多个人,我有一个正态分布的小样本。这些分布的平均值也服从正态分布。

代码语言:javascript
运行
复制
import numpy as np

n_individuals = 200
points_per_individual = 10
means = np.random.normal(30, 12, n_individuals)
y = np.random.normal(means, 1, (points_per_individual, n_individuals))

我想使用PyMC3来计算样本中的模型参数。

代码语言:javascript
运行
复制
import pymc3 as pm
import matplotlib.pyplot as plt

model = pm.Model()
with model:
    model_means = pm.Normal('model_means', mu=35, sd=15)

    y_obs = pm.Normal('y_obs', mu=model_means, sd=1, shape=n_individuals, observed=y)

    trace = pm.sample(1000)

pm.traceplot(trace[100:], vars=['model_means'])
plt.show()

我原以为model_means的后部看起来像我最初的分布方式。但它似乎收敛于30,即手段的平均值。如何从pymc3模型恢复均值的原始标准差(在我的示例中为12)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-13 09:09:13

这个问题是我为PyMC3的概念而奋斗的。

我需要n_individuals观察到的随机变量来建模yn_individual随机变量来建模means。它们还需要先验hyper_meanhyper_sigma作为它们的参数。sigmasy标准差的优先项。

代码语言:javascript
运行
复制
import matplotlib.pyplot as plt

model = pm.Model()
with model:
    hyper_mean = pm.Normal('hyper_mean', mu=0, sd=100)
    hyper_sigma = pm.HalfNormal('hyper_sigma', sd=3)

    means = pm.Normal('means', mu=hyper_mean, sd=hyper_sigma, shape=n_individuals)
    sigmas = pm.HalfNormal('sigmas', sd=100)

    y = pm.Normal('y', mu=means, sd=sigmas, observed=y)

    trace = pm.sample(10000)

pm.traceplot(trace[100:], vars=['hyper_mean', 'hyper_sigma', 'means', 'sigmas'])
plt.show()

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33661064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档