编码自定义似然 Pymc3
Posted
技术标签:
【中文标题】编码自定义似然 Pymc3【英文标题】:Coding Custom Likelihood Pymc3 【发布时间】:2021-10-30 07:13:09 【问题描述】:我正在努力在 pymc3 中实现具有自定义可能性的线性回归。
我之前在 CrossValidated 上发布了这个问题,建议在此处发布,因为该问题更面向代码(已关闭帖子 here)
假设您有两个自变量 x1、x2 和一个目标变量 y,以及一个称为 delta 的指标变量。
当 delta 为 0 时,似然函数为标准最小二乘法 当 delta 为 1 时,只有当目标变量大于预测值时,似然函数才是最小二乘贡献观察数据的示例 sn-p:
x_1 x_2 ???? observed_target
10 1 0 100
20 2 0 50
5 -1 1 200
10 -2 1 100
有谁知道如何在 pymc3 中实现这一点?作为起点...
model = pm.Model()
with model as ttf_model:
intercept = pm.Normal('param_intercept', mu=0, sd=5)
beta_0 = pm.Normal('param_x1', mu=0, sd=5)
beta_1 = pm.Normal('param_x2', mu=0, sd=5)
std = pm.HalfNormal('param_std', beta = 0.5)
x_1 = pm.Data('var_x1', df['x1'])
x_2 = pm.Data('var_x2', df['x2'])
mu = (intercept + beta_0*x_0 + beta_1*x_1)
【问题讨论】:
我认为switch
函数可以做到这一点。这是一个示例用法:discourse.pymc.io/t/…
嗯 - 你能举个例子来说明如何将 switch 函数与自定义可能性一起使用吗?
愚蠢的问题:delta 与拥有第三个独立变量 x_3 有何不同?你不能用 3 个自变量得到准确的预测吗?
【参考方案1】:
如果这有帮助,从阅读文档来看,这些方面的内容可能会起作用,但我无法对其进行测试,而且评论太长了。
model = pm.Model()
with model as ttf_model:
intercept = pm.Normal('param_intercept', mu=0, sd=5)
beta_0 = pm.Normal('param_x1', mu=0, sd=5)
beta_1 = pm.Normal('param_x2', mu=0, sd=5)
std = pm.HalfNormal('param_std', beta = 0.5)
x_1 = pm.Data('var_x1', df['x1'])
x_2 = pm.Data('var_x2', df['x2'])
delta = pm.Data('delta', df['delta']) # Or whatever this column is
target = pm.Data('target', df['observed_target'])
ypred = (intercept + beta_0*x_0 + beta_1*x_1) # Intermediate result
target_ge_ypred = pm.math.ge(target, ypred) # Compare target to intermediate result
zero = pm.math.constant(0) # Use this if delta==1 and target<ypred
# EDIT: Check delta
alternate = pm.math.switch(target_ge_ypred, ypred, zero) # Alternative result
mu = pm.math.switch(pm.math.eq(delta, zero), ypred, alternate) # Actual result wanted?
【讨论】:
我想知道使用pm.Deterministic
定义ypred
是否会有所帮助。此外,与其将alternate
等同于zero
,不如将其设置为target
(当target_ge_ypred
时);这可能会达到预期的效果。以上是关于编码自定义似然 Pymc3的主要内容,如果未能解决你的问题,请参考以下文章