这是我正在尝试计算的:
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 中不可用。
我的问题是如何在不放弃精度的情况下解决问题。
您可以修改函数以使用对数和而不是指数。这个链接提供了一些很好的例子,并详细介绍了数学基础。
摘自文章:
>>> 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])