python - 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
解决方案
当变量/s 放入列表而不是元组时,错误消失。
对于单参数示例,使用params=[mu]
而不是params=(mu)
解决问题。
列表也是多参数情况的有效数据类型 - 例如。params=(mu, sigma)
相当于params=[mu, sigma]
。
推荐阅读
- laravel - 从 Laravel/Eloquent 中的连接表中选择列
- vue.js - Vue路由器中的确切路径匹配?
- javascript - 选择选项默认值加载时不显示,选择其他选项时不显示
- sas - 将宏变量名称作为值
- reactjs - 使用反应延迟加载时在 Edge 上出现 SCRIPT1028 错误
- python - 根据列表过滤熊猫数据框以丢弃
- javascript - 如果没有可显示的内容,隐藏 AJAX 附加?
- scala - 传递依赖没有被拉入 build.sbt
- django - 是否可以访问在我的本地主机上运行的 Django 应用程序以供其他网络上的另一台计算机访问?
- regex - The passing of a string (incl. regex parameters) to a block of code