python - SciPy curve_fit with np.log 立即返回 popt = p0, pcov = inf

标签 python numpy scipy curve-fitting logarithm

我正在尝试使用 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。这就是问题所在。当我传递包含 np.logfunc() 时,即我实际想要拟合的函数,curve_fit 声明 p0(初始条件)是最优解并立即以无限协方差返回。

下面是如果我使用非对数 func() 运行 do_fitting() 会发生什么:

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

exponential fit

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 ]]

这是当我使用对数 func() 运行 do_fitting() 时发生的情况:

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

logarithmic fit

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

您会注意到 popt 的对数解等于我在上面的 中为 p0 提供的 curve_fit 值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 - SciPy curve_fit with np.log 立即返回 popt = p0, pcov = inf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32189759/

相关文章:

python - numpy.genfromtxt 没有解包

python - 清理、调整和验证数据的最佳方式

python - 如何排列打印元组中的内容

python - np.linspace 和 np.arange 有什么区别?

Python 和 PyDev 未使用的导入 - 可以在包级别禁用吗?

python - np.where( ) 不改变所有的值

python - 根据条件在 Pandas、Python 中编辑计划文件的顺序和内容

python - 安装 scipy 和 scikit 时出现错误 1 ​​代码失败

python - Scipy b 样条基函数

python - 为什么 scipy.optimize.curve_fit 不能使用 numpy.sinc 函数拟合我的数据?