scipy.optimize.curve_fit 的替代方案

Posted

技术标签:

【中文标题】scipy.optimize.curve_fit 的替代方案【英文标题】:Alternative to scipy.optimize.curve_fit 【发布时间】:2015-09-25 19:28:24 【问题描述】:

我正在尝试使用 matplotlib 绘制一些可视化,并且在我的一个函数中,我检查波是否是对数的。这是我目前的工作版本:

import numpy as np
def is_logarithmic(waves):

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

    wcopy = list(waves)
    wcopy.sort()

    # If the ratio of x-max : x-min < 10, don't use a logarithmic scale
    # (at least in matplotlib)
    if (wcopy[-1] / wcopy[0]) < 10:
        return False

    # Take a guess at whether it is logarithmic by seeing how well the x-scale
    # fits an exponential curve
    diffs = []
    for ii in range(len(wcopy) - 1):
        diffs.append(wcopy[ii + 1] - wcopy[ii])

    # Fit the diffs to an exponential curve
    x = np.arange(len(wcopy)-1)
    try:
        popt, pcov = curve_fit(expfunc, x, diffs)
    except Exception as e:
        print e
        popt = [0.0, 0.0, 0.0]
        pcov = np.inf

    # If a > 0.5 and covsum < 1000.0
    # use a logarithmic scale.
    if type(pcov) == float:
        # It's probably np.inf
        covsum = pcov
    else:
        covsum = pcov.diagonal().sum()
    res = (covsum < 1000.0) & (popt[0] > 0.5)
    return res

我正在尝试寻找 scipy 的 curve_fit() 的替代品,因为我不想安装这么大的库只是为了使用那个功能。有没有其他我可以使用的东西,或者理想情况下仅使用 numpy 和 matplotlib 的其他功能的组合,以获得类似的结果?

【问题讨论】:

好吧,curve_fit 使用Levenberg-Marquardt 算法来最小化错误。你总是可以自己实现它。 除非您使用嵌入式系统,否则 scipy 的 46 MB(安装在 linux 上)并没有那么多。相比之下,Matplotlib 是 72 MB 【参考方案1】:

Numpy 可以进行线性 (numpy.linalg.lstsq) 和多项式拟合 (numpy.polyfit)。一般来说,您需要 scipy 来适应您自己定义的函数(scipy 使用 fortran minpack,而 numpy 仅使用 C 构建)。

但是,对于您的示例,您可以使用与 this 问题类似的方法来拟合 exp。基本上,取等式两边的对数并使用numpy.polyfit

【讨论】:

由于a*np.exp(b*x) + c中的常数项c,在这种情况下取​​双方的log将不起作用。【参考方案2】:

您也可以使用lmfit.models 库,它有很多预定义的模型。

https://lmfit.github.io/lmfit-py/

https://lmfit.github.io/lmfit-py/builtin_models.html#exponential-and-power-law-models

它还支持自定义函数。

【讨论】:

提问者的目标是避免为单个函数安装像 scipy 这样的大型库。 lmfit 并没有真正满足这个要求,因为它需要 scipy 作为依赖项。

以上是关于scipy.optimize.curve_fit 的替代方案的主要内容,如果未能解决你的问题,请参考以下文章

scipy.optimize.curve_fit ValueError:具有多个元素的数组的真值不明确

使用 scipy.optimize.curve_fit - ValueError 和 minpack.error 拟合 2D 高斯函数

使用 Pyside2 QThread 线程化时,Scipy curve_fit 崩溃

通过更改python中的模型函数进行通用曲线拟合

如何从curve_fit获得置信区间

如何对 SciPy 曲线拟合施加约束?