gpt4 book ai didi

python - 将参数传递给确定性变量,pymc

转载 作者:行者123 更新时间:2023-12-01 05:33:00 26 4
gpt4 key购买 nike

我正在尝试使用 PyMC 实现一个非常简单的大数定律示例。目标是生成不同大小样本的许多样本平均值。例如,在下面的代码中,我重复采集 5 个样本组 (samples_to_average = 5),计算它们的平均值,然后找到结果迹线的 95% CI。

下面的代码运行,但我想做的是将samples_to_average修改为一个列表,以便我可以在一次传递中计算一系列不同样本大小的置信区间。

import scipy.misc
import numpy as np
import pymc as mc

samples_to_average = 5
list_of_samples = mc.DiscreteUniform("response", lower=1, upper=10, size=1000)

@mc.deterministic
def sample_average(x=list_of_samples, n=samples_to_average):
samples = int(n)
selected = x[0:samples]
total = np.sum(selected)
sample_average = float(total) / samples
return sample_average

def getConfidenceInterval():
responseModel = mc.Model([samples_to_average, list_of_samples, sample_average])
mapRes = mc.MAP(responseModel)
mapRes.fit()
mcmc = mc.MCMC(responseModel)
mcmc.sample( 10000, 5000)
upper = np.percentile(mcmc.trace('sample_average')[:],95)
lower = np.percentile(mcmc.trace('sample_average')[:],5)
return (lower, upper)


print getConfidenceInterval()

我见过的大多数使用确定性装饰器的示例都使用全局随机变量。然而,为了实现我的目标,我认为我需要做的是在 getConfidenceInterval() 中创建一个随机变量(具有正确的长度),并将其传递给sample_average(而不是使用全局/默认参数提供sample_average)。

如何将 getConfidenceInterval() 中创建的变量传递到sample_average() 中,或者,我可以使用不同的samples_to_average 值评估多个模型的另一种方法是什么?如果可能的话,我想避免全局变量。

最佳答案

在解决您的问题之前,我想简化一下sample_average的编写方式,使其更紧凑且更易于理解。

sample_average = mc.Lambda('sample_average', lambda x=list_of_samples, n=samples_to_average: np.mean(x[:n]))

现在您可以将其推广到样本到平均值是参数数组的情况:

samples_to_average = np.arange(5, 25, 5)

sample_average = mc.Lambda('sample_average', lambda x=list_of_samples, n=samples_to_average: [np.mean(x[:t]) for t in n])

getConfidenceInterval 函数也必须进行如下更改:

def getConfidenceInterval():
responseModel = mc.Model([samples_to_average, list_of_samples, sample_average])
mapRes = mc.MAP(responseModel)
mapRes.fit()
mcmc = mc.MCMC(responseModel)
mcmc.sample( 10000, 5000)
average = np.vstack((t for t in mcmc.trace('sample_average')))
upper = np.percentile(average, 95, axis = 0)
lower = np.percentile(average, 5, axis = 0)
return (lower, upper)

我使用 vstack 将样本平均值聚合到二维数组中,然后使用 Numpy 百分位数函数中的 axis 选项来计算每列的百分位数。

关于python - 将参数传递给确定性变量,pymc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19787928/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com