错误:非常量表达式无法从类型'npy_intp'缩小为'int'

我正在尝试运行以下模型,但在编译过程中将失败:


import numpy as np

import pymc3 as pm



def sample_data(G=1, K=2):

    # mean proportion ([0,1]) for each g

    p_g = np.random.beta(2, 2, size=G)


    # concentration around each p_g

    c_g = np.random.lognormal(mean=0.5, sigma=1, size=G)


    # reparameterization for standard Beta(a,b)

    a_g = c_g * p_g / np.sqrt(p_g**2 + (1.-p_g)**2)

    b_g = c_g*(1.-p_g) / np.sqrt(p_g**2 + (1.-p_g)**2)


    # for each p_g, sample K proportions

    p_gk = np.random.beta(a_g[:, np.newaxis], b_g[:, np.newaxis], size=(G, K))


    return p_gk


# Data size

G = 3

K = 5


# obtain a G x K array of proportions p_gk in [0,1]

data = sample_data(G, K) 


with pm.Model() as m:


    # Parameters

    p_g = pm.Beta('p_g', 1., 1., shape=G)

    sd_g = pm.HalfNormal('sd_g', sd=1., shape=G)


    # Observed proportions

    p_gk = pm.Beta('p_gk', mu=p_g, sd=sd_g, shape=(G, K), observed=data)


    trace = pm.sample(2000)

我是PyMC3的新手。运行现有的PyMC3示例时,我看不到这些错误。我怀疑看到这些是因为我使用的是多维格式(即(G,K)),因为我还没有看到其他人使用此格式(我可能是对Stan熟悉)。

通常,我很难理解如何实现具有多个维度的多级模型。

知道是什么原因导致了我所看到的错误吗?


千万里不及你
浏览 272回答 2
2回答

哆啦的时光机

一种解决方法是抑制编译错误:import theanotheano.config.gcc.cxxflags = "-Wno-c++11-narrowing"这些错误对程序正确性的影响程度尚不清楚。当我在CentOS 7上编译时,它们不会出现(即使使用显式地检查它们-Wc++11-narrowing)。在Mac OS X上具有抑制错误的采样结果与在CentOS上没有采样结果是可比的。我还是希望看到一个可以解释根本问题的答案。

跃然一笑

是的-您必须对更高尺寸的形状更加明确。该库确实有点“聪明”,但是如果您提供shape参数,它将使用该参数。您的示例在语法上通过设置固定with pm.Model() as m:    # Parameters    p_g = pm.Beta('p_g', 1., 1., shape=(G, 1))    sd_g = pm.HalfNormal('sd_g', sd=1, shape=(G, 1))    # Observed proportions    p_gk = pm.Beta('p_gk', mu=p_g.dot(np.ones((1,K))), sd=sd_g.dot(np.ones((1, K))), shape=(G, K), observed=data)    trace = pm.sample()注意,运行将m.check_test_point()显示p_gk具有0的概率。这是因为sd_g太宽了,PyMC3尝试将其初始化为0.8,这超出了mu, sd参数化beta分布的支持。设置还sd_g = pm.HalfNormal('sd_g', sd=0.1, shape=(G, 1))允许您从模型中采样,尽管这可能不是您想要的!
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python