0

我已经实现了一个简单的贝叶斯分类器,但是在处理大量数据时遇到了一些溢出问题。

为了使数字保持小但仍然准确,我尝试的一种策略是不断减少分子和分母,并为方程的每个部分使用最大公约数。但是,这仅在它们具有公约数时才有效...

请注意,问题是双向的,当我在大多数计算中将分母和分子分开时,我会遇到整数溢出问题,当我使用双算术即时进行大多数计算时,我遇到了各种问题/限制非常小的双精度值(由 IEEE 754 定义)。

我相信你们中的一些人之前已经实现过这个算法,你们是如何处理这些问题的?我不想引入任意精度类型,因为它们成本太高,而且我确信存在不需要它们的解决方案。

谢谢。

4

2 回答 2

3

通常你处理这个问题的方法是获取日志并使用加法,然后如果你想回到概率空间,则执行 exp。

p1 * p2 * p3 * ... * pn = exp(log(p1) + log(p2) + log(p3) + ... log(pn))

您可以通过在日志空间中工作来避免流量不足。

于 2011-11-03T21:04:25.627 回答
0

如果您在两个类别之间进行分类,您可以引入每个类别的概率的对数比率。因此,如果:

log(Pr(cat1) / Pr(cat2)) <=> 0 # positive would favor cat1 and negative cat2

这等于:

log(Pr(cat1)) - log(Pr(cat2)) <=> 0

如果(如在贝叶斯分类器中)类别概率本身就是给定条件下概率的乘积:

log(Pr(cat1|cond1)) + ... <=> log(Pr(cat2|cond1)) + ...

因此,您正在处理求和而不是乘法,并且您将需要大量数据集才能遇到同样的事情。

于 2012-03-06T21:04:03.737 回答