2013-08-05 26 views
4

我正在写一个算法,其中给定一个模型,我计算数据集列表的可能性,然后需要将每个可能性归一化(概率)。所以像[0.00043,0.00004,0.00321]这样的东西可能会被转换为[0.2,0.03,0.77]。 我的问题是,我正在使用的日志可能性非常小(例如,在日志空间中,值类似-269647.432,-231444.981等)。在我的C++代码中,当我尝试添加其中两个(通过指数)我得到一个“Inf”的答案。我试图将它们添加到日志空间(Summation/Subtraction of log)中,但又一次遇到了同样的问题。正常化一个非常小的双数字(可能性)的列表

有人可以分享他/她的专家意见吗?

感谢

+2

某些东西没有正确的味道。有了这些对数,就会有非常多的零。你计算的东西正确吗?你能展示一些你的代码吗? – John

+0

你能告诉我们一个可管理的代码部分吗,这样我们可以更好地了解你的问题吗? – BrainSteel

+0

因此,要清楚地说明,您需要“正常化”一些6位负数范围内的数字,作为实际值的对数。这会让你乘坐不可能的驾驶带来一场长途旅行。 (hitchhikers.wikia.com/wiki/Infinite_Improbability_Drive)。正如约翰所说,这似乎是错误的......这些数字非常小,以至于在电子高尔夫在宇宙中打球时击中一个原子的可能性更大。 –

回答

4

假设可能性已经被正确地计算,你可以用最大的可能性将每个人。这可以通过从每个对数似然减去最大的对数似然来以对数形式完成。

然后,您可以转换出对数空间。最大值将是1.0,因为它的归一化日志为0.较小的值将分别介于0和1.0之间,并表示为最大值的一部分。

+0

当然,这是假设最大和最小的数字在彼此的合理范围内。在给出的示例数字中,差别大概是34000--即使它是log2并使用80位长双精度,其指数为2^+/- 16383,它仍然是正常浮点数范围之外的很长一段距离。 –

+0

@MatsPetersson这些大比率比小尺寸更麻烦我。贝叶斯方程中有一个标准化常数,通常不会计算,因为它对所有情况都是一样的。所有这些都可能是由于这个原因造成的。 –

+0

感谢您的提示。我会尝试并让你知道 – Ikram

2

这是标准程序。数值稳定的Matlab代码:

LL = [ . . . ]; % vector of log-likelihoods 
M = max(LL); 
LL = LL - M; 
L = exp(LL); 
L = L ./ sum(L);