【发布时间】: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 - 你可以限制每个参数withbounds()的范围 -
另一种选择是
lmfit- m-newville 有一大堆答案,为什么这应该优于 scipy。 -
@Mr.T 我尝试更改初始猜测参数,也使用您说的边界,但它返回相同的结果。
-
@AksimElnik 你是什么意思?函数 c0 + c1*t - c2*np.exp(-c3*t) 不是线性的。
标签: python scikit-learn scipy curve-fitting