计算指数数的数值问题(来自高斯PDF)
Numerical problems of computing exponential numbers (from Gaussian PDFs)
我有一个非常小的指数值列表(例如 exp(n)
,n<-300
),它们是从高斯 PDF 生成的。
我想计算它们中的每一个与总和成正比的程度,例如像下面的 python-like 伪代码:
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)以防止下溢,但在其他情况下会导致溢出。
我该如何解决这个问题?
不知道自己表达清楚没有,有什么不明白或者语法错误的地方,还请大家指正。
提前致谢。
正如您已经观察到的,您可以通过从所有 n
.
中减去一个常数值 m
来实现
为避免溢出,请勿选择固定的m
,例如m = - 300
。相反,选择 m
作为所有 n
中的最大值。然后每个归一化指数值最多为 1
,因此归一化总和最多为指数数,应该相当小。
我有一个非常小的指数值列表(例如 exp(n)
,n<-300
),它们是从高斯 PDF 生成的。
我想计算它们中的每一个与总和成正比的程度,例如像下面的 python-like 伪代码:
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)以防止下溢,但在其他情况下会导致溢出。
我该如何解决这个问题?
不知道自己表达清楚没有,有什么不明白或者语法错误的地方,还请大家指正。 提前致谢。
正如您已经观察到的,您可以通过从所有 n
.
m
来实现
为避免溢出,请勿选择固定的m
,例如m = - 300
。相反,选择 m
作为所有 n
中的最大值。然后每个归一化指数值最多为 1
,因此归一化总和最多为指数数,应该相当小。