【问题标题】:Wrapping pymc3 model in a function在函数中包装 pymc3 模型
【发布时间】:2021-03-06 16:01:05
【问题描述】:

有人知道在标准 Python 3 函数中存储pymc3 模型的方法吗?

我希望将此函数存储在本地,以便在 Jupyter 环境中多次调用,其功能旨在在模型实例化后返回视觉效果。该函数接受一个控制和实验条件,并在执行建模之前将它们转换为numpy 数组和MCMC

    def bayesian_ab_test(x ,y):

       y1 = x
       y2 = y

       data = pd.DataFrame(dict(value=np.r_[y1, y2], group=np.r_[['y2']*len(y2), 
       ['y1']*len(y1)]))
    
       μ_m = data.value.mean()
       μ_s = data.value.std() * 2
    
       σ_low = sd_low
       σ_high = sd_high
    
       group1_std = pm.Uniform('group1_std', lower=σ_low, upper=σ_high)
       group2_std = pm.Uniform('group2_std', lower=σ_low, upper=σ_high)
    
       ν = pm.Exponential('ν_minus_one', 1/29.) + 1
    
       λ1 = group1_std**-2
       λ2 = group2_std**-2

       group1 = pm.StudentT('Control_1', nu=ν, mu=group1_mean, lam=λ1, observed=y1)
       group2 = pm.StudentT('NBA', nu=ν, mu=group2_mean, lam=λ2, observed=y2)
    
       diff_of_means = pm.Deterministic('difference of means', group2_mean - group1_mean)
       diff_of_stds = pm.Deterministic('difference of stds', group2_std - group1_std)
       effect_size = pm.Deterministic('effect size', diff_of_means / np.sqrt((group1_std**2 + 
       group2_std**2) / 2))
    
       trace = pm.sample(1000)

    return trace 

我得到的错误是:

TypeError: No model on context stack, which is needed to instantiate distributions. Add variable inside a 'with model:' block, or use the '.dist' syntax for a standalone distribution.

【问题讨论】:

    标签: python function modeling pymc


    【解决方案1】:

    你可以的

    def bayesian_ab_test(x ,y):
    
       y1 = x
       y2 = y
    
       data = pd.DataFrame(dict(value=np.r_[y1, y2], group=np.r_[['y2']*len(y2), 
           ['y1']*len(y1)]))
        
       μ_m = data.value.mean()
       μ_s = data.value.std() * 2
        
       σ_low = sd_low
       σ_high = sd_high
    
       with pm.Model():
        
           group1_std = pm.Uniform('group1_std', lower=σ_low, upper=σ_high)
           group2_std = pm.Uniform('group2_std', lower=σ_low, upper=σ_high)
        
           ν = pm.Exponential('ν_minus_one', 1/29.) + 1
        
           λ1 = group1_std**-2
           λ2 = group2_std**-2
    
           group1 = pm.StudentT('Control_1', nu=ν, mu=group1_mean, lam=λ1, observed=y1)
           group2 = pm.StudentT('NBA', nu=ν, mu=group2_mean, lam=λ2, observed=y2)
        
           diff_of_means = pm.Deterministic('difference of means', group2_mean - group1_mean)
           diff_of_stds = pm.Deterministic('difference of stds', group2_std - group1_std)
           effect_size = pm.Deterministic('effect size', diff_of_means / np.sqrt((group1_std**2 + 
           group2_std**2) / 2))
        
           trace = pm.sample(1000)
    
        return trace 
    
    

    这将在每次调用函数时创建一个模型并从中采样。或者,要让函数扩展现有模型,请执行以下操作:

    def bayesian_ab_test(x ,y, model):
    
       with model:
    
           y1 = x
           y2 = y
    
           data = pd.DataFrame(dict(value=np.r_[y1, y2], group=np.r_[['y2']*len(y2), 
           ['y1']*len(y1)]))
        
           μ_m = data.value.mean()
           μ_s = data.value.std() * 2
        
           σ_low = sd_low
           σ_high = sd_high
        
           group1_std = pm.Uniform('group1_std', lower=σ_low, upper=σ_high)
           group2_std = pm.Uniform('group2_std', lower=σ_low, upper=σ_high)
        
           ν = pm.Exponential('ν_minus_one', 1/29.) + 1
        
           λ1 = group1_std**-2
           λ2 = group2_std**-2
    
           group1 = pm.StudentT('Control_1', nu=ν, mu=group1_mean, lam=λ1, observed=y1)
           group2 = pm.StudentT('NBA', nu=ν, mu=group2_mean, lam=λ2, observed=y2)
        
           diff_of_means = pm.Deterministic('difference of means', group2_mean - group1_mean)
           diff_of_stds = pm.Deterministic('difference of stds', group2_std - group1_std)
           effect_size = pm.Deterministic('effect size', diff_of_means / np.sqrt((group1_std**2 + 
           group2_std**2) / 2))
        
           trace = pm.sample(1000)
    
        return trace 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-05
      • 2021-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多