我正在尝试使用scipy.optimize.curve_fit优化对数据拟合的对数拟合。在实际数据集上尝试之前,我编写了在虚拟数据集上运行的代码。

def do_fitting():
    x = np.linspace(0, 4, 100)
    y = func(x, 1.1, .4, 5)
    y2 = y + 0.2 * np.random.normal(size=len(x))

    popt, pcov = curve_fit(func, x, y2, p0=np.array([2, 0.5, 1]))

    plt.figure()
    plt.plot(x, y, 'bo', label="Clean Data")
    plt.plot(x, y2, 'ko', label="Fuzzed Data")
    plt.plot(x, func(x, *popt), 'r-', label="Fitted Curve")
    plt.legend()
    plt.show()


当然,do_fitting()依赖于func(),它传递给curve_fit。这是问题所在。当我传递包含func()np.log(即我实际上要适应的函数)时,curve_fit声明p0(初始条件)是最优解,并立即以无限协方差返回。

如果使用非对数do_fitting()运行func(),会发生以下情况:

def func(x, a, b, c):
    return a * np.exp(x*b) + c


python - 使用np.log的SciPy curve_fit会立即返回popt = p0,pcov = inf-LMLPHP

popt = [ 0.90894173  0.44279212  5.19928151]
pcov = [[ 0.02044817 -0.00471525 -0.02601574]
        [-0.00471525  0.00109879  0.00592502]
        [-0.02601574  0.00592502  0.0339901 ]]


当我运行对数do_fitting()func()时,会发生以下情况:

def func(x, a, b, c):
    return a * np.log(x*b) + c


python - 使用np.log的SciPy curve_fit会立即返回popt = p0,pcov = inf-LMLPHP

popt = [ 2.   0.5  1. ]
pcov = inf


您会注意到popt的对数解等于我在上述curve_fit中为p0给出的do_fitting()值。对于我尝试过的每个pcov值,都是如此,p0是无限的。

我在这里做错了什么?

最佳答案

问题非常简单-由于x数组中的第一个值为0,因此您采用的日志为0,它等于-inf

x = np.linspace(0, 4, 100)
p0 = np.array([2, 0.5, 1])

print(func(x, *p0).min())
# -inf

关于python - 使用np.log的SciPy curve_fit会立即返回popt = p0,pcov = inf,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32189759/

10-11 08:31