重写函数以避免numpy.exp中的溢出

时间:2017-05-23 16:06:07

标签: python numpy

假设我有以下功能:

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)

有没有办法重写函数,以避免溢出?我知道溢出出现的地点和原因。不过,我找不到重写函数的方法来避免它。

1 个答案:

答案 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)) 的最后一次通话。