我有一个非常小的指数值列表(例如exp(n)
,带有n<-300
),它们是从高斯PDF生成的。
我想计算它们中的每一个与总和成比例,例如像下面类似python的伪代码那样:
s = 0 # sum of all values
for n in exponents:
s += exp(n)
for n in exponents:
k = exp(n)/s # I want to compute k for each n
问题是,由于n
的值都非常小,有时总和s
为零,我会得到除零错误。
我知道我可以做的一件事是向所有n
添加一个常量值(比如300)以防止下溢,但在其他情况下会导致溢出。
我该如何解决这个问题?
我不知道我是否已经表达了自己,如果其中任何一个没有意义或任何语法错误,请纠正我。 提前谢谢。
答案 0 :(得分:1)
正如您已经观察到的那样,您可以通过从所有m
中减去常量值n
来实现。
为避免溢出,请勿选择固定的m
,例如m = - 300
。相反,请选择m
作为所有n
的最大值。那么每个归一化的指数值最多为1
,因此归一化的和最多只是指数的数量,这应该相当小。