我目前正在接受Jim Albert的贝叶斯思维与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)
成正比,但不清楚以下2行是做什么的 - 我想它是什么的使用归一化常数,但在书中没有对此进行解释。
答案 0 :(得分:2)
该行
like = like * (p > 0) * (p < 1) - 999 * ((p == 0) * (s >
0) + (p == 1) * (f > 0))
当先前概率为0或1时,处理边缘情况。基本上,如果p = 0并且观察到任何成功,那么类似于= -999并且如果p = 1并且观察到任何失败,那么就像= -999 。我宁愿使用-Inf而不是-999,因为这是那些情况下的对数可能性。
第二行
like = exp(like - max(like))
当只有记录值的相对差异很重要时,是一种数值稳定的取幂方法。如果喜欢真的很小,例如你有很多成功和失败,那么exp(like)可能会在计算机中表示为0向量。只有相对差异在这里很重要,因为在构造后验概率时,将产品重新归一化为总和为1.