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)