python中熊猫数据的指数曲线拟合

问题描述

我正在尝试对熊猫数据框表示的某些数据拟合指数曲线。数据如下:

enter image description here

我用于曲线拟合的代码

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)

但是,拟合曲线总是看起来像这样的线性:

enter image description here

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

enter image description here

任何有关如何拟合此数据的建议都将受到赞赏,因为在检查代码后似乎无法在代码中发现任何错误,因此无法进一步解决

解决方法

很抱歉答案很差。我对Python的实际使用了解不足。此外,不可能从图片中获得足够正确的数据。扫描提供了以下演算中使用的数据,但结果可能不准确。

我想您面临的困难来自微积分方法,该方法是从参数的“猜测”值开始迭代的。

如果我们使用不需要初始猜测值的非迭代方法,则演算通常会更健壮。本文介绍了这种方法:https://fr.scribd.com/doc/14674814/Regressions-et-equations-integrales

在本文中,它们是许多数字示例,但不幸的是,您的函数未得到详细介绍。使方法适应这种情况并不困难:请参见下文。结果是:

enter image description here

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

enter image description here

信息:

非迭代回归方法使用方便的积分方程,将非线性回归转换为线性回归。在当前情况下,积分方程为:

enter image description here