假设我有以下功能:
import numpy, itertools
def my_func(x):
Z = 0
for y in itertools.product([-1, 1], repeat=10):
Z += numpy.exp(numpy.dot(x,y))
return numpy.log(Z)
该函数适用于不包含“太极端”值的输入向量。但是,如果输入值太极端,在某些时候numpy.exp函数中会出现溢出。这是一个例子:
x = numpy.random.normal(5, 10, 10)
my_func(x)
到目前为止,该功能正常。但是,如果我用x替换一个极值的一个元素,我会得到溢出错误:
x[3] = 6000
my_func(x)
有没有办法重写函数,以避免溢出?我知道溢出出现的地点和原因。不过,我找不到重写函数的方法来避免它。
答案 0 :(得分:1)
NumPy有np.logaddexp(x1, x2)
,它计算CultureInfo culture = CultureInfo.CreateSpecificCulture("en-US");
string dateString = "2017-06-02T00:00:00+05:30";
DateTimeOffset offset = DateTimeOffset.Parse(dateString, culture);
// adjustedDateTime should contain 6/2/2017 12:00:00 AM. There are other properties on offset such as LocalDateTime to provide other options
DateTime adjustedDateTime = offset.DateTime;
。所以你可以把你的循环重写为:
log(exp(x1) + exp(x2))
并跳过对z = np.logaddexp(z, np.dot(x, y))
的最后一次通话。