【问题标题】:Python exponential curve fittingPython指数曲线拟合
【发布时间】:2021-06-14 09:36:51
【问题描述】:

我添加了 excel 图,从中我得到指数方程,我正在尝试在 Python 中对其进行曲线拟合。

当我使用它来预测 y 数据时,我的拟合方程与我提供的经验数据并不接近,预测给出 f(-25)= 5.30e-11,而经验数据 f(-25)给出 = 5.3e-13

如何改进代码以接近经验数据的预测,或者我在代码中犯了错误??

python fitted plot

![][2]




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

pd.set_option('precision', 14)

def f(x,A,B):
    return A * np.exp((-B) * (x))

y_data= [2.156e-05,  1.85e-07,  1.02e-10 , 1.268e-11,  5.352e-13]
x=  [-28.8,  -27.4,  -26 , -25.5,  -25]
p, pcov = optimize.curve_fit(f,  x,   y_data,   p0=[10**(-59),4],    maxfev=5000)

plt.figure()
plt.plot(x, y_data, 'ko', label="Empirical BER")
plt.plot(x, f(x, *p ), 'g-', label="Fitted BER" )
plt.title(" BER  ")
plt.xlabel('Power Rx (dB)')
plt.ylabel('')
plt.legend()
plt.grid()
plt.yscale("log")
plt.show()

【问题讨论】:

  • 你的问题是什么?
  • 当我比较图表和代码时,您似乎在代码中混淆了xy
  • @mkrieger1,感谢您格式化问题,问题是拟合没有预测正确的 y_data 集数据。我想知道我哪里出错了?新鲜的眼睛可能会发现我的错误
  • @John Coleman,谢谢,你能进一步解释一下混乱在哪里
  • 我不知道它在预测什么以及你期望它预测什么。

标签: python curve exponential


【解决方案1】:

由于您使用对数图绘制数据,因此您对数据和拟合的看法强调“微小”与“小”相比。拟合使用失配的平方和来确定最佳拟合。对于 y 值为 1.e-11 的数据,百分之几的 y 值为 ~2e-5 的数据失配将完全淹没 10 倍甚至 100 倍的失配。你的情节与此一致。

有两种可能的方法可以更好地适应:

a) 如果您对 y 值有不确定性,请使用它们。 y~2e-5 数据中的不确定性很可能远大于 y~1.e-11 日期中的不确定性,并按不确定性进行缩放,以便最小化平方和(data-model)/uncertainty 将有助于更好地拟合低价值数据。 OTOH,如果误差是恒定的,绘制这些不确定性可能会表明您所拥有的拟合实际上并没有那么糟糕 - y~1.e-11 只有 1.e-10 的不拟合。

b) 意识到您正在通过绘制数据的对数来评估拟合质量,并接受该观察,以便将log(data) 拟合到log(model)。对于简单的指数函数来说,该模型的对数是线性的,因此您可以对数据的对数进行线性回归。

奖金回合:认识到选项 a) 和 b) 是相关的。由于拟合使Sum[ ((data-model)/uncertainty)**2] 最小化,因此不提供uncertainty 的值实际上是说xy 的所有值具有相同的不确定性(实际上=1.0)。如果您将模型的日志拟合到数据的日志中,Sum[ (log(data) - log(model))**2] 实际上是在说log(data) 中的不确定性对于xy 的所有值都是相同的。

【讨论】:

  • @M Newville 非常感谢您对数据的澄清和解释
猜你喜欢
  • 2014-09-08
  • 2023-04-09
  • 2018-11-13
  • 2016-02-13
  • 1970-01-01
  • 2015-03-22
  • 2015-06-20
  • 2021-01-30
  • 2013-11-08
相关资源
最近更新 更多