将很小的似然值转换(归一化)为概率


21

我正在编写一种算法,在给定模型的情况下,我计算一组数据集的似然度,然后需要对每种似然度进行标准化(以概率表示)。因此[0.00043,0.00004,0.00321]之类的内容可能会转换为[0.2,0.03,0.77]之类的内容。

我的问题是,我正在使用的对数可能性很小(例如,在对数空间中,值类似于-269647.432,-231444.981等)。在我的C ++代码中,当我尝试添加两个(通过采用它们的指数)时,得到的答案是“ Inf”。我试图将它们添加到日志空间(日志的加法/减法)中,但是再次遇到相同的问题。

谁能对此发表自己的见解?


使用指向涉及的函数时,是否以您的语言使用了该函数?这将使用泰勒展开围绕1.日志⁡(1个+…)log1p
— 尼尔ģ

Answers:


30

从所有日志中减去最大对数。丢弃所有负数的结果,它们将使指数下溢。(实际上,它们的可能性为零。)

事实上,如果要的相对精度ϵ(如ϵ=10−d为d的精度位数)和你有n似然性,扔掉任何结果小于对数ϵ/ñ。然后像往常一样继续对结果值取幂,然后将每个值除以所有指数的和。

λ1个,λ2,…,λñb > 1λñ=最高(λ一世)b>1个

α一世={bλ一世-λñ,λ一世-λñ≥日志⁡(ϵ)-日志⁡(ñ)0除此以外。

归一化的可能性等于, 之所以,是因为将所有其他下溢的替换为零会导致总错误最多为而因为并且所有均为非负数,分母,因此归零替换规则导致的总相对误差严格小于,视需要而定。我= 1 ,2 ,... ,Ñ 。α 我(ñ - 1 )ε / Ñ < ε α Ñ = b λ ñ - λ Ñ = b 0 = 1 α 我甲= Σ Ĵ α Ĵ ≥ 1 ((ñ - 1α一世/∑Ĵ=1个ñαĴ一世=1个,2,…,ñ。α一世(ñ-1个)ϵ/ñ<ϵαñ=bλñ-λñ=b0=1个α一世一种=∑ĴαĴ≥1个((ñ-1个)ϵ/ñ)/一种<ϵ

为避免舍入误差太大,请从的最小值开始计算总和。当第一次按升序排序时,这将自动完成。仅考虑非常大的。λ 我 Ñα一世λ一世ñ

顺便说一句,该规定假设原木的底数大于。对于小于的底数,首先求反所有对数,然后继续进行,就好像底数等于。b 1 1 / b1个b1个1个/b


例

设三个具有对数(例如,自然对数)的值等于和 最后一个是最大的。从每个值中减去它得出和- 231444.981 ,- 231444.699。- 38202.733 ,- 0.282 ,0。-269647.432, -231444.981,-231444.699。-38202.733, -0.282,0。

假设您想要的精度可与IEEE双精度(约16个十进制数字)相比,因此和。(您实际上无法达到此精度,因为仅分配给三个有效数字,但这没关系:我们只是丢弃那些保证不会影响您想要的精度和实际精度更好的值计算。 = = 第一次的三点区别,低于这一点,所以把它扔掉,只留下和 幂他们给 n = 3 − 0.282 log (ϵ / n )log (10 − 16)− log (3 )− 37.93997。- 38202.733 ,- 0.282 0 EXP (- 0.282 )= 0.754 EXP (0 )= 1 0 0.754 /(1 + 0.754 )=ϵ=10-16ñ=3-0.282日志⁡(ϵ/ñ)日志⁡(10-16)-日志⁡(3)-37.93997。-38202.733,-0.2820。经验值⁡(-0.282)=0.754和(当然)。的归一化值是-在order--你扔掉了一个,,和。经验值⁡(0)=1个00.754/(1个+0.754)=0.4301个/(1个+0.754)=0.570


这真是太好了-在事后看来如此简单,如此显而易见。@Ikram,请将此标记为正确答案!(当然,除非您有更好的选择,否则请分享)
— zelanix

2
@whuber我们甚至需要扔掉吗?求幂无论如何都会给我们零,所以它不会对总和作出贡献。−38202.733
— 泰勒
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.