Numpy 在标量除法中遇到无效值以及 exp 中溢出

问题描述 投票:0回答:1

这是我正在尝试计算的:

def prob(a1, a2, a3, phi):
    de = np.exp(phi * (a1 - a2)) + 1 + np.exp(phi*(a3-a2))
    p1 = np.exp(phi * (a1 - a2)) / de
    p2 = 1 / de
    p3 = np.exp(lamda * (a3 - a2)) / de
    return p1, p2, p3

a1
位于
6
20
之间,
a2
位于
12
18
之间,
a3
位于
0
30
之间,
phi
位于
 之间0
 1

我有时会

RuntimeWarning: overflow encountered in exp p3 = np.exp(phi * (a3 - a2)) / de

RuntimeWarning: invalid value encountered in scalar divide p3 = np.exp(phi * (a3 - a2)) / de

RuntimeWarning: overflow encountered in exp
  de = np.exp(phi * (a1 - a2)) + 1 + np.exp(phi*(a3-a2))

我想这不是因为

de
为零,而是因为
de
太大了。 我尝试设置
float128
但出现错误
TypeError: data type 'float128' not understood
。经过一番搜索,我认为
float128
在 M1 mac 中不可用。

我的问题是如何在不放弃精度的情况下解决问题。

python numpy apple-m1 integer-overflow
1个回答
0
投票

您可以修改函数以使用对数和而不是指数。这个链接提供了一些很好的例子,并详细介绍了数学基础。

摘自文章:

>>> x = np.array([1000, 1000, 1000])
>>> np.exp(x)
array([inf, inf, inf])

即使指数为 1000,该值也会溢出。然后他们添加一个功能:

def logsumexp(x):
    c = x.max()
    return c + np.log(np.sum(np.exp(x - c)))

这允许您间接计算指数

>>> logsumexp(x)
1001.0986122886682
>>> np.exp(x - logsumexp(x))
array([0.33333333, 0.33333333, 0.33333333])
© www.soinside.com 2019 - 2024. All rights reserved.