【问题标题】:Python scipy curve_fit Exponential equation not fitting as expectedPython scipy curve_fit 指数方程不符合预期
【发布时间】:2020-06-27 16:12:46
【问题描述】:

我有数据我正在尝试对其进行指数拟合,但该数据并不理想,但是当使用 JMP 的内置曲线拟合函数时,它可以按预期工作,并且我得到了我的数据的一个很好的近似值(请参见下图, JMP 拟合曲线指数 3P)。

JMP Fit Curve Exponential 3P

我知道尝试使用 python 库 scipy.optimize 和 curve_fit 函数来复制它,如here 所述。然而,这会产生非常不同的曲线,请参见下文。

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

df = pd.read_csv('test.csv', sep = ',' ,index_col = None, engine='python')

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

popt, pcov = curve_fit(exponential_3p,df.x,df.y)

a = popt[0] 
b = popt[1]
c = popt[2]

plt.plot(df.x,df.y)
plt.plot(df.x,exponential_3p(df.x, a, b, c))

scipy optimize.curve_fit Exponential

【问题讨论】:

  • 您拟合指数曲线,这通常需要良好的初始猜测才能实现精确拟合。其他方法是记录您正在拟合的功能。
  • 任何想法如何实现良好的初始猜测?对于 Asymptote,平均值应该足够接近,但不确定 b/c 的规模或增长率?

标签: python scipy exponential sas-jmp


【解决方案1】:

您是scipy.optimize.curve_fit 难以理解的愚蠢行为的又一个受害者。

曲线拟合和局部优化问题需要所有变量参数的初始值。它们不是可选的。没有有意义的“默认值”。 scipy.optimize.curve_fit 对您撒谎,并允许您不提供初始值并默默地(甚至没有警告!)假设您的意思是所有初始值都是 1。这是错误的,错误的,错误的。

您必须给出合理的起始值或合适的值。

【讨论】:

  • 感谢您的回复,使用 p) = [-0.26,0.0018,-2.28] 我实现了正确的拟合,但是在我的情况下我需要一种方法来自动实现这些初始值 a/Asymptote a很好的猜测是我想的最后 10 个值的平均值或平均值。 c/增长率的极性可以通过减去 y[-1] - y[0] 来获得,但是它的大小我不确定如何猜测。我也不知如何处理 b/scale。
猜你喜欢
  • 1970-01-01
  • 2012-11-02
  • 1970-01-01
  • 2021-09-25
  • 2021-06-24
  • 2017-07-13
  • 2014-09-05
  • 1970-01-01
  • 2021-03-19
相关资源
最近更新 更多