具有离散先验的 beta 分布的归一化常数:R 代码查询
Normalizing constant for beta distribution with discrete prior : R code query
我目前正在学习 Jim Albert 的 Bayesian Thinking with R。我有一个关于他的例子的代码的查询,他的例子有 beta 可能性和离散先验。他计算后验的代码是:
pdisc <- function (p, prior, data)
s = data[1] # successes
f = data[2] # failures
#############
p1 = p + 0.5 * (p == 0) - 0.5 * (p == 1)
like = s * log(p1) + f * log(1 - p1)
like = like * (p > 0) * (p < 1) - 999 * ((p == 0) * (s >
0) + (p == 1) * (f > 0))
like = exp(like - max(like))
#############
product = like * prior
post = product/sum(product)
return(post)
}
我的问题是关于计算可能性的高亮部分代码及其背后的逻辑(书中未解释)。我知道 beta 分布的 pdf,并且对数似然与 s * log(p1) + f * log(1 - p1)
成正比,但不清楚以下两行在做什么 - 我想这与归一化常数有关,但是书中也没有对此的解释。
行
like = like * (p > 0) * (p < 1) - 999 * ((p == 0) * (s >
0) + (p == 1) * (f > 0))
处理先验概率为 0 或 1 的边缘情况。基本上,如果 p=0 并且观察到任何成功,则 like=-999,如果 p=1 并且观察到任何失败,则 like= -999。我宁愿使用 -Inf 而不是 -999,因为在这些情况下,对数似然就是这样。
第二行
like = exp(like - max(like))
当只有记录值的相对差异很重要时,
是一种数值稳定的取幂方法。如果 like 真的很小,例如你有很多成功和失败,那么 exp(like) 可能会在计算机中表示为 0 向量。这里只有相对差异很重要,因为在构建后验概率时,您将乘积重新归一化为总和为 1。
我目前正在学习 Jim Albert 的 Bayesian Thinking with R。我有一个关于他的例子的代码的查询,他的例子有 beta 可能性和离散先验。他计算后验的代码是:
pdisc <- function (p, prior, data)
s = data[1] # successes
f = data[2] # failures
#############
p1 = p + 0.5 * (p == 0) - 0.5 * (p == 1)
like = s * log(p1) + f * log(1 - p1)
like = like * (p > 0) * (p < 1) - 999 * ((p == 0) * (s >
0) + (p == 1) * (f > 0))
like = exp(like - max(like))
#############
product = like * prior
post = product/sum(product)
return(post)
}
我的问题是关于计算可能性的高亮部分代码及其背后的逻辑(书中未解释)。我知道 beta 分布的 pdf,并且对数似然与 s * log(p1) + f * log(1 - p1)
成正比,但不清楚以下两行在做什么 - 我想这与归一化常数有关,但是书中也没有对此的解释。
行
like = like * (p > 0) * (p < 1) - 999 * ((p == 0) * (s >
0) + (p == 1) * (f > 0))
处理先验概率为 0 或 1 的边缘情况。基本上,如果 p=0 并且观察到任何成功,则 like=-999,如果 p=1 并且观察到任何失败,则 like= -999。我宁愿使用 -Inf 而不是 -999,因为在这些情况下,对数似然就是这样。
第二行
like = exp(like - max(like))
当只有记录值的相对差异很重要时,
是一种数值稳定的取幂方法。如果 like 真的很小,例如你有很多成功和失败,那么 exp(like) 可能会在计算机中表示为 0 向量。这里只有相对差异很重要,因为在构建后验概率时,您将乘积重新归一化为总和为 1。