- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一些观测数据想估计参数,我认为这是试用 PYMC3 的好机会。
我的数据结构为一系列记录。每条记录都包含一对与固定的一小时时间段相关的观察结果。一项观察是给定时间内发生的事件总数。另一个观察结果是该时间段内的成功次数。因此,例如,一个数据点可能指定在给定的 1 小时内,总共有 1000 个事件,而这 1000 个事件中有 100 个是成功的。在另一个时间段内,可能总共有1000000个事件,其中120000个是成功的。观察的方差不是恒定的,取决于事件的总数,我想控制和建模的部分原因是这种影响。
我这样做的第一步是估计潜在的成功率。我准备了下面的代码,旨在通过使用 scipy 生成两组“观察到的”数据来模拟这种情况。但是,它无法正常工作。
我希望它找到的是:
相反,模型收敛得非常快,但却得到了意想不到的答案。
traceplot(由于声誉低于 10,我无法发布)相当无趣 - 快速收敛,并且在与输入数据不对应的数字处有尖锐的峰值。我很好奇我所采用的方法是否存在根本性的错误。应如何修改以下代码以提供正确/预期的结果?
from pymc import Model, Uniform, Normal, Poisson, Metropolis, traceplot
from pymc import sample
import scipy.stats
totalRates = scipy.stats.norm(loc=120, scale=20).rvs(size=10000)
totalCounts = scipy.stats.poisson.rvs(mu=totalRates)
successRate = 0.1*totalRates
successCounts = scipy.stats.poisson.rvs(mu=successRate)
with Model() as success_model:
total_lambda_tau= Uniform('total_lambda_tau', lower=0, upper=100000)
total_lambda_mu = Uniform('total_lambda_mu', lower=0, upper=1000000)
total_lambda = Normal('total_lambda', mu=total_lambda_mu, tau=total_lambda_tau)
total = Poisson('total', mu=total_lambda, observed=totalCounts)
loss_lambda_factor = Uniform('loss_lambda_factor', lower=0, upper=1)
success_rate = Poisson('success_rate', mu=total_lambda*loss_lambda_factor, observed=successCounts)
with success_model:
step = Metropolis()
success_samples = sample(20000, step) #, start)
plt.figure(figsize=(10, 10))
_ = traceplot(success_samples)
最佳答案
除了任何贝叶斯 MCMC 分析的缺陷外,您的方法没有任何根本性错误:(1) 不收敛,(2) 先验,(3) 模型。
不收敛:我找到了一个如下所示的轨迹图:
这不是一件好事,为了更清楚地了解原因,我会更改跟踪图代码以仅显示跟踪的后半部分,traceplot(success_samples[10000:])
:
先验:收敛的一个主要挑战是您在 total_lambda_tau
上的先验,这是贝叶斯建模中的一个典型陷阱。尽管使用之前的 Uniform('total_lambda_tau', lower=0, upper=100000)
可能显得信息量不大,其效果是说您非常确定 total_lambda_tau
很大。例如,它小于 10 的概率是 .0001。改变之前
total_lambda_tau= Uniform('total_lambda_tau', lower=0, upper=100)
total_lambda_mu = Uniform('total_lambda_mu', lower=0, upper=1000)
生成更有希望的跟踪图:
然而,这仍然不是我在跟踪图中寻找的内容,为了获得更令人满意的结果,我建议使用“顺序扫描 Metropolis”步骤(这是 PyMC2 对类似模型的默认设置)。您可以按如下方式指定:
step = pm.CompoundStep([pm.Metropolis([total_lambda_mu]),
pm.Metropolis([total_lambda_tau]),
pm.Metropolis([total_lambda]),
pm.Metropolis([loss_lambda_factor]),
])
这会生成一个看起来可以接受的轨迹图:
模型:正如@KaiLondenberg 回应的那样,您在 total_lambda_tau
上采用的先验方法和 total_lambda_mu
不是标准方法。您描述的事件总数差异很大(一小时 1,000,下一小时 1,000,000),但您的模型假定它呈正态分布。在空间流行病学中,我看到的类似数据的方法是一个更像这样的模型:
import pymc as pm, theano.tensor as T
with Model() as success_model:
loss_lambda_rate = pm.Flat('loss_lambda_rate')
error = Poisson('error', mu=totalCounts*T.exp(loss_lambda_rate),
observed=successCounts)
我敢肯定,还有其他研究社区似乎更熟悉的其他方法。
关于python - pymc3 : Multiple observed values,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24242660/
我尝试移植简单的生存模型 from here (the first one in introduction)从 PyMC 2 到 PyMC 3。但是,我没有找到任何等效于“观察到”的装饰器,并且我尝试
我使用了基于 Clojure 的“圣公会”,我认为这对我不利。糟糕的文档和太小的社区无法寻求帮助。此外,我仍然无法熟悉基于 Scheme 的语言。所以我想将语言更改为基于 Python 的语言。 也许
我想对我在不使用 pymc 的情况下生成的示例使用 pymc 诊断和摘要功能。例如,我想在我自己的一组示例中使用 pymc 的 mc_error 例程。 一些 pymc 诊断函数可以采用 np.arr
我正在尝试在PyMC3中采样多个链。在PyMC2中,我将执行以下操作: for i in range(N): model.sample(iter=iter, burn=burn, thin =
有关如何使用PyMC将两个正态分布拟合到数据的信息,请参见a question on CrossValidated。 Cam.Davidson.Pilon的答案是使用伯努利分布将数据分配给两个法线之一
我正在尝试使用最大后验估计来估计泊松过程的速率,其中速率随时间变化。这是一个速率线性变化的简化示例 (λ = ax+b): import numpy as np import pymc # Obser
我正在用一个简单的多级模型尝试 PyMC3。当同时使用假数据和真实数据时,随机效应分布的轨迹会相互移动(见下图),并且似乎是同一轨迹的偏移量。这是 NUTS 的预期产物还是表明我的模型存在问题? 这是
我试图在通过 PyMC 的 MCMC 方法拟合变量时设置约束 例如,我在 PyMC 中定义了以下随机模型 import pymc as pm a=pm.Uniform('a',lower=0.,upp
尝试通过 conda 安装 pymc 时,我收到以下信息: C:\Anaconda>conda install -c https://conda.binstar.org/pymc pymc 正在获取包
如何在 PyMC3 中定义自定义似然?在 PyMC2 中,我可以使用 @pymc.potential .我尝试使用 pymc.Potential然而,在 PyMC3 中,似乎 bool 运算不能应用于
我正在尝试从随机 Petri 网模型中估计速率。我不明白为什么,但我得到了零概率错误,即使在给定我为速率定义的初始值的情况下,将数据数据与预期的观察次数完全对应。 例如,以下比率 [0.01, 2,
我正在尝试从 Infer.NET 移植一个模型,但我正在努力如何制作在 pymc3 中观察到的确定性变量? M,L ~ 伯努利 # doesn't work ... Deterministic("U
我已经开始试用 pymc3 并且需要实现多项逻辑回归模型。我研究了 twiecki 的教程,并且了解他对层次回归模型的实现(请参阅 https://twiecki.github.io/blog/201
我正在尝试使用 PyMC 实现一个非常简单的大数定律示例。目标是生成不同大小样本的许多样本平均值。例如,在下面的代码中,我重复采集 5 个样本组 (samples_to_average = 5),计算
这是 PyMC: Parameter estimation in a Markov system 的后续内容 我有一个由每个时间步的位置和速度定义的系统。系统的行为定义为: vel = vel + d
型号 我有以下统计模型: r_i ~ N(r | mu_i, sigma) mu_i = w . Q_i w ~ N(w | phi, Sigma) prior(phi, Sigma) = Norma
我正在尝试将负二项式混合物与 PyMC 拟合。看来我做错了什么,因为预测看起来与输入数据并不相似。问题可能出在负二项式参数的先验上。有什么建议吗? from sklearn.cluster i
我有三个关于装饰器的问题,我无法找到答案: Q1)PyMC 中装饰器的参数(@Deterministic,@Stochastic)表示什么? Q2) @pymc.stochastic(dtype=in
我正在使用an example of linear regression from bayesian methods for hackers但无法将其扩展到我的用途。 我对一个随机变量进行了观察,对该
我正在尝试拟合共享相同截距的多条线。 import numpy as np import pymc # Observations a_actual = np.array([[2., 5., 7.]])
我是一名优秀的程序员,十分优秀!