首页 > 解决方案 > 将两个列表传递给 Python 函数

问题描述

我正在尝试运行 python 包pyabc近似贝叶斯计算)以在两个值列表之间进行模型选择,即model_1=[2,3,4,5]model_2=[3,4,2,5]。pyabc 的主要功能是ABCSMC,它指出

Definition : ABCSMC(models: Union[List[Model], Model], parameter_priors:
Union[List[Distribution], Distribution, Callable], distance_function: Union[Distance,
Callable]=None, population_size: Union[PopulationStrategy, int]=100, summary_statistics:
Callable[[model_output], dict]=identity, model_prior: RV=None)

我不知道在下面提到的代码中在哪里定义和传递我的两个列表model_1model_2。我尝试了几次,但由于我是 Python 新手,所以无法做到。我正在关注下面提到的示例及其代码。

import os
import tempfile
import scipy.stats as st  
import pyabc

# Define a gaussian model 
sigma = .5

def model(parameters):
    # sample from a gaussian
    y = st.norm(parameters.x, sigma).rvs()
    # return the sample as dictionary
    return {"y": y}

# We define two models, but they are identical so far
models = [model, model]


# However, our models' priors are not the same.
# Their mean differs.
mu_x_1, mu_x_2 = 0, 1
parameter_priors = [
    pyabc.Distribution(x=pyabc.RV("norm", mu_x_1, sigma)),
    pyabc.Distribution(x=pyabc.RV("norm", mu_x_2, sigma))
]
abc = pyabc.ABCSMC(
    models, parameter_priors,
    pyabc.PercentileDistance(measures_to_use=["y"]))

db_path = ("sqlite:///" +
           os.path.join(tempfile.gettempdir(), "test.db"))
history = abc.new(db_path, {"y": y_observed})
print("ABC-SMC run ID:", history.id)
# We run the ABC until either criterion is met
history = abc.run(minimum_epsilon=0.2, max_nr_populations=5)

标签: pythonlistfunctiondictionarybayesian

解决方案


pyABC 中的模型选择旨在在不同的候选模型中决定哪个模型最好地描述一组常见的观察数据。在上面的代码中,您通常会在模型列表中使用不同的模型models = [model1, model2]。我不确定您所说的模型选择列表是什么意思?

对于它试图解决的底层算法和问题,另见原始论文https://doi.org/10.1093/bioinformatics/btp619


推荐阅读