编码自定义似然 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的主要内容,如果未能解决你的问题,请参考以下文章

手把手教你Tableau自定义地理编码(十九)

编码和解码自定义对象

Alamofire 自定义参数编码

wps如何设置自定义编码

Golang RPC 编码自定义函数

解析编码自定义错误响应