Python 3.x PYMC3 VALUERROR:质量矩阵在对角线上包含零。有些导数可能总是零

Python 3.x PYMC3 VALUERROR:质量矩阵在对角线上包含零。有些导数可能总是零,python-3.x,pymc3,Python 3.x,Pymc3,我在使用PYMC3计算后验概率时遇到此错误: with pm.Model() as model: p = pm.Gamma('p', alpha=1, beta=3, shape=regions.shape[0]) q = pm.Gamma('q', alpha=1, beta=3, shape=regions.shape[0]) m = pm.Lognormal('m', mu=np.log(total_M), sd=.25, shape=regions.shape[0

我在使用PYMC3计算后验概率时遇到此错误:

with pm.Model() as model:
    p = pm.Gamma('p', alpha=1, beta=3, shape=regions.shape[0])
    q = pm.Gamma('q', alpha=1, beta=3, shape=regions.shape[0])
    m = pm.Lognormal('m', mu=np.log(total_M), sd=.25, shape=regions.shape[0])
    t = pm.Uniform('t', lower=0, upper=100, observed=sales.t)
    cid = pm.Categorical('cid', p=np.repeat(1./sales.shape[0], sales.shape[0]), observed=sales.region )
    sigma = pm.Gamma('sigma', alpha=1, beta=3)
    mu = m[cid]*(((p[cid]+q[cid])**2)/p[cid])*((np.exp(-(p[cid]+q[cid])*t))/((1+(q[cid]/p[cid])*np.exp(-(p[cid]+q[cid])*t))**2))
    Y_obs = pm.Normal('Ft', mu= mu, sd=sigma, observed= sales.sales)
    trace = pm.sample(100000,init = 'adapt_diag', progressbar = True, tune  = 1000) 

我曾尝试将mu=mu更改为mu=np.log(mu),它解决了错误,但与我的其他同伴相比,它给了我糟糕的结果。

我尝试使用各种选项更改init方法,并并行运行它们。 它已经解决了问题,但在过去48小时内一直在运行。 有没有人能提供一些建议和反馈

下面是我的代码,最后几行有更改:

 1. 

with pm.Model() as model:
    p = pm.Gamma('p', alpha=1, beta=3, shape=regions.shape[0])
    q = pm.Gamma('q', alpha=1, beta=3, shape=regions.shape[0])
    m = pm.Lognormal('m', mu=np.log(total_M), sd=.375, shape=regions.shape[0])
    t = pm.Uniform('t', lower=0, upper=100, observed=sales.t)
   # p1 = pm.Deterministic('p1', np.repeat(1./sales.shape[0],sales.shape[0]))
   # cid = pm.Categorical('cid', p=p1, observed=sales.region )
    cid = pm.Categorical('cid', p=np.repeat(1./sales.shape[0], sales.shape[0]), observed=sales.region )
    sigma = pm.Gamma('sigma', alpha=1, beta=3)
    mu = m[cid]*(((p[cid]+q[cid])**2)/p[
        cid])*((np.exp(-(p[cid]+q[cid])*t))/((1+(q[cid]/p[cid])*np.exp(-(p[cid]+q[cid])*t))**2))
    Y_obs = pm.Normal('Ft', mu=mu, sd=sigma, observed=sales.sales)
    **trace = pm.sample(init = 'advi+adapt_diag', tune  = 1000)**

 2. 

with pm.Model() as model:
    p = pm.Gamma('p', alpha=1, beta=3, shape=regions.shape[0])
    q = pm.Gamma('q', alpha=1, beta=3, shape=regions.shape[0])
    m = pm.Lognormal('m', mu=np.log(total_M), sd=.375, shape=regions.shape[0])
    t = pm.Uniform('t', lower=0, upper=100, observed=sales.t)
   # p1 = pm.Deterministic('p1', np.repeat(1./sales.shape[0],sales.shape[0]))
   # cid = pm.Categorical('cid', p=p1, observed=sales.region )
    cid = pm.Categorical('cid', p=np.repeat(1./sales.shape[0], sales.shape[0]), observed=sales.region )
    sigma = pm.Gamma('sigma', alpha=1, beta=3)
    mu = m[cid]*(((p[cid]+q[cid])**2)/p[
        cid])*((np.exp(-(p[cid]+q[cid])*t))/((1+(q[cid]/p[cid])*np.exp(-(p[cid]+q[cid])*t))**2))
    Y_obs = pm.Normal('Ft', mu=mu, sd=sigma, observed=sales.sales)
    **trace = pm.sample(200000, init = 'advi', tune  = 1000)**

 3. 

with pm.Model() as model:
    p = pm.Gamma('p', alpha=1, beta=3, shape=regions.shape[0])
    q = pm.Gamma('q', alpha=1, beta=3, shape=regions.shape[0])
    m = pm.Lognormal('m', mu=np.log(total_M), sd=.375, shape=regions.shape[0])
    t = pm.Uniform('t', lower=0, upper=100, observed=sales.t)
   # p1 = pm.Deterministic('p1', np.repeat(1./sales.shape[0],sales.shape[0]))
   # cid = pm.Categorical('cid', p=p1, observed=sales.region )
    cid = pm.Categorical('cid', p=np.repeat(1./sales.shape[0], sales.shape[0]), observed=sales.region )
    sigma = pm.Gamma('sigma', alpha=1, beta=3)
    mu = m[cid]*(((p[cid]+q[cid])**2)/p[
        cid])*((np.exp(-(p[cid]+q[cid])*t))/((1+(q[cid]/p[cid])*np.exp(-(p[cid]+q[cid])*t))**2))
    Y_obs = pm.Normal('Ft', mu=mu, sd=sigma, observed=sales.sales)
    **start = pm.find_MAP() 
    step = pm.NUTS(scaling=start)
    trace = pm.sample(5000, step, start = start, progressbar=True)**

您能否提供一个可复制的示例(即
地区
销售
的示例)?如果您在最后调用
pm.sample()
,它是否有效?自动初始化(
jitter+adapt_diag
)可能会做得更好,使用
NUTS
采集100000个样本,除非您有充分的理由@colcarroll:我已经尝试过pm.sample()。它给出了同样的错误。地区是国家名称,销售额是数字形式的销售额。这是用于预测销售额的Bass扩散模型。同样处理类似的问题,我只能想象模型应该更好地指定,也许pymc网站上的这篇论坛帖子可以给你一些想法,