小编soz*_*zen的帖子

pymc3:多个观察值

我有一些观察数据,我想估计参数,我认为这是一个尝试PYMC3的好机会.

我的数据结构为一系列记录.每条记录包含一对与固定的一小时周期相关的观察结果.一个观察结果是在给定小时内发生的事件总数.另一个观察是该时期内的成功数量.因此,例如,数据点可能指定在给定的1小时内,总共有1000个事件,而1000个事件中的100个是成功的.在另一个时间段内,总共可能有1000000个事件,其中120000个是成功的.观测值的方差不是恒定的,取决于事件的总数,部分是我想要控制和建模的效果.

我这样做的第一步是估计潜在的成功率.我已经准备好了下面的代码,用于通过使用scipy生成两组"观察"数据来模拟这种情况.但是,它无法正常工作.
我期望它能找到的是:

  • loss_lambda_factor大约是0.1
  • total_lambda(和total_lambda_mu)大约是120.

相反,模型收敛速度非常快,但意外的回答.

  • total_lambda和total_lambda_mu分别是5e5附近的尖峰.
  • loss_lambda_factor大致为0.

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 = …
Run Code Online (Sandbox Code Playgroud)

python poisson pymc pymc3

8
推荐指数
1
解决办法
3931
查看次数

标签 统计

poisson ×1

pymc ×1

pymc3 ×1

python ×1