python中pandas数据的指数曲线拟合

Posted

技术标签:

【中文标题】python中pandas数据的指数曲线拟合【英文标题】:Exponential curve fitting of pandas data in python 【发布时间】:2021-01-30 23:13:35 【问题描述】:

我正在尝试将指数曲线拟合到由 pandas 数据框表示的一些数据。数据如下所示:

我用于曲线拟合的代码:

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
from scipy.optimize import curve_fit

t = df['time'].values
ym = df['value'].values

def func(t, c0, c1, c2, c3):
    return c0 + c1*t - c2*np.exp(-c3*t)

p0 = [6e6, 0.01, 100, 0.01]
c, cov = curve_fit(func, t, ym, p0)

print(c) # Output: [-5.46019366e+06  3.19567938e+03  1.00000000e+08  1.00000000e+06]

yp = func(t, c[0], c[1], c[2], c[3])

plt.figure()
plt.plot(t/60, ym)
plt.plot(t/60, yp)

然而,拟合曲线似乎总是像这样是线性的:

我尝试了在网上找到的不同方法,并且总是得到相同的线性结果。我的数据框是这样的,Cycle_id 对应“时间”,峰值对应“值”:

非常感谢任何关于如何拟合这些数据的建议,因为我在查看代码时似乎找不到任何错误,因此没有进一步说明。..

【问题讨论】:

你为什么要尝试用线性曲线拟合指数曲线? @fendrbud 恕我直言,您的代码本身没有问题。很可能是curve_fit 的常见收敛问题。更好的起始值可能会有所帮助,尽管对于curve_fit 来说,将极大值和极小值与 exp 结合起来通常很困难。参数c1 也应该不超过1,而c3 不应该低于1 - 你可以限制每个参数with bounds()的范围 另一种选择是 lmfit - m-newville 有一大堆答案,为什么这应该优于 scipy。 @Mr.T 我尝试更改初始猜测参数,也使用您说的边界,但它返回相同的结果。 @AksimElnik 你是什么意思?函数 c0 + c1*t - c2*np.exp(-c3*t) 不是线性的。 【参考方案1】:

抱歉,回答不佳。在实际使用中我对 Python 的了解不够。此外,不可能从图片中获得足够正确的数据。扫描提供的数据用于以下微积分,但结果可能不准确。

我猜你所面临的困难来自于从参数的“猜测”值开始迭代的微积分方法。

如果我们使用不需要初始猜测值的非迭代方法,则微积分通常更稳健。本文解释了这种方法:https://fr.scribd.com/doc/14674814/Regressions-et-equations-integrales

它们是论文中的大量数值示例,但不幸的是,您的函数没有得到详细处理。使该方法适应这种情况并不困难:见下文。结果是:

也许你可以在更经典的方法中使用上述 p,a,b,c 的值作为参数的初始值。

信息:

非迭代回归的方法使用一个方便的积分方程,将非线性回归转换为线性回归。在本例中,积分方程为:

【讨论】:

赞成的不仅是方法和详细的解释,而且还支持从图片中提取数据的额外努力。起首。话虽如此 - 如果没有使用 Python 库的实现,这可能对 fendrbud 没有帮助。

以上是关于python中pandas数据的指数曲线拟合的主要内容,如果未能解决你的问题,请参考以下文章

绘制/计算指数曲线的问题(python、matplotlib、pandas)

Python - 根据记录值拟合指数衰减曲线

origin8.0中怎么在一条拟合好的曲线图上再添加一条拟合曲线?

autocad中怎么 把几条直线拟合成曲线

excel散点图:如何用多组数据拟合一条曲线

急!MATLAB中用cftool工具数据拟合之后,拟合结果好坏判断