首页 > 解决方案 > pm.Simulator 不接受单参数向量函数

问题描述

我正在尝试进行一些近似的贝叶斯计算,并且能够使用pm.Simulator该类来估计具有 2 个或更多参数的函数(其中每个参数实际上是多个值的数组)。但是,当我尝试估计单个参数函数的值时,会出现错误。

最简单的工作示例(大致基于实际代码):

# 2 parameter pm.Simulator snippet that *works*
import pymc3 as pm 
import numpy as np 

def get_mean_sig2(mu,sigma):
    multi_var = np.random.normal(mu,sigma)
    return multi_var
# create the observed data
obs2 = get_mean_sig2(np.array([10,5,2,1]), np.array([0.5,1,2,1]))

with pm.Model() as m91:
    mu = pm.Uniform('mu', lower=1, upper=15, shape=obs2.shape[0])
    sigma = pm.Uniform('sigma',lower=0.25, upper=3,shape=obs2.shape[0])
    sim = pm.Simulator('sim', get_mean_sig2,params=(mu,sigma),observed=obs2)
    jj = pm.sample_smc(kernel='ABC')

当我删除“sigma”参数并将问题简化为仅使用此代码估计平均值时:

# 1 parameter pm.Simulator snippet that doesn't work

def get_only_mean(mu):
    multi_var = np.random.normal(mu,0.2)
    return multi_var
obs = get_only_mean(np.array([10,5,2,1]))

with pm.Model() as m90:
    mu = pm.Uniform('mu', lower=1, upper=15, shape=obs.shape[0])
    sim = pm.Simulator('sim', get_only_mean,params=(mu),observed=obs)
    jj = pm.sample_smc(kernel='ABC')

我收到错误消息ValueError: Length of mu ~ Uniform cannot be determined。我已经尝试过输入shape=(1,obs.shape[0])或手动设置shape=4“形状”参数输入的变体 - 但失败了。

我无法理解为什么这个问题突然出现 - 任何帮助将不胜感激。

我的环境/系统配置是:

操作系统:Linux Mint 19.2

蟒蛇 3.8.5

numpy 1.19.5

pymc3 3.11.0 theano 1.1.0

标签: pythonnumpytheanobayesianpymc3

解决方案


当变量/s 放入列表而不是元组时,错误消失。

对于单参数示例,使用params=[mu]而不是params=(mu)解决问题。

列表也是多参数情况的有效数据类型 - 例如。params=(mu, sigma)相当于params=[mu, sigma]


推荐阅读