使用pymc3中的自定义可能性从后部进行采样

时间:2017-04-10 14:00:30

标签: bayesian pymc3

我正在尝试使用pymc3创建自定义可能性。该分布称为广义最大似然(GEV),其具有位置(loc),比例(比例)和形状(c)参数。 主要的意思是选择β分布作为比例参数之前,并在GEV可能性中确定位置和比例参数。 GEV分布不包含在pymc3标准分布中,因此我必须创建自定义可能性。我用Google搜索并发现我应该使用 densitydist 方法,但我不知道为什么它不正确。

请参阅以下代码:

import pymc3 as pm
import numpy as np
from theano.tensor import exp

data=np.random.randn(20)

with pm.Model() as model:
    c=pm.Beta('c',alpha=6,beta=9)
    loc=1
    scale=2
    gev=pm.DensityDist('gev', lambda value: exp(-1+c*(((value-loc)/scale)^(1/c))), testval=1)
    modelo=pm.gev(loc=loc, scale=scale, c=c, observed=data)
    step = pm.Metropolis()
    trace = pm.sample(1000, step)
pm.traceplot(trace)

如果这是一个愚蠢的问题,我很抱歉,但我无法弄明白。

我正在研究年度最大流量,我正在尝试实施“广义最大似然广义极值”中描述的方法 水文数据的分位数估计“由Martins和Stedinger编写。

1 个答案:

答案 0 :(得分:2)

如果你的意思是广义极值分布(https://en.wikipedia.org/wiki/Generalized_extreme_value_distribution),那么这样的东西应该有效(对于c!= 0):

import pymc3 as pm
import numpy as np
import theano.tensor as tt
from pymc3.distributions.dist_math import bound

data = np.random.randn(20)


with pm.Model() as model:
    c = pm.Beta('c', alpha=6, beta=9)
    loc = 1
    scale = 2

    def gev_logp(value):
        scaled = (value - loc) / scale
        logp = -(scale
                 + ((c + 1) / c) * tt.log1p(c * scaled)
                 + (1 + c * scaled) ** (-1/c))
        alpha = loc - scale / c
        bounds = tt.switch(value > 0, value > alpha, value < alpha)
        return bound(logp, bounds, c != 0)

    gev = pm.DensityDist('gev', gev_logp, observed=data)
    trace = pm.sample(2000, tune=1000, njobs=4)
pm.traceplot(trace)

您的logp功能无效。 python中的指数为**,部分表达式对负值无效。