scipy.optimize.leastsq使用NaN调用目标函数

时间:2015-03-31 17:50:05

标签: python numpy scipy mathematical-optimization

我正在使用scipy.optimize.leastsq尝试在存在噪声的情况下将大量参数拟合到实际数据中。偶尔会从minpack中使用NaN调用目标函数。这是scipy.optimize.leastsq的预期行为吗?有没有比在这种条件下返回NaN残差更好的选择?

以下代码演示了该行为:

import scipy.optimize
import numpy as np

xF = np.array([1.0, 2.0, 3.0, 4.0]) # Target value for fit
NOISE_LEVEL = 1e-6 # The random noise level
RETURN_LEN = 1000  # The objective function return vector length

def func(x):
    if np.isnan(np.sum(x)):
        raise ValueError('Invalid x: %s' % x)
    v = np.random.rand(RETURN_LEN) * NOISE_LEVEL
    v[:len(x)] += xF - x
    return v

iteration = 0
while (1):
    iteration += 1
    x = np.zeros(len(xF))
    y, cov = scipy.optimize.leastsq(func, x)
    print('%04d %s' % (iteration, y))

Jacobian正在以数字方式计算。在生产代码中,优化通常有效,除非起始估计太好,表面非常平坦,并且噪声超过用于数值计算雅可比行列的增量。在这种情况下,目标函数的残差看起来像上面的代码示例中的随机噪声,我不希望优化收敛。

在此代码示例中,小的NOISE_LEVEL值(< 1e-10)总是收敛。在1e-6,ValueError通常在几百次尝试中抛出。

一种可能的解决方法是返回高度惩罚的残差(NaN或INF),例如:

v = np.empty(RETURN_LEN)
v.fill(np.nan)
return v

如果脏,这种解决方法似乎很有效。是否有更好的替代品或方法来预防NaNs?

在Windows 7上运行的Python 2.7.9 x32中观察到此行为。

0 个答案:

没有答案