Python指数曲线拟合

问题描述

添加了 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,'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()

解决方法

由于您使用对数图绘制数据,因此您对数据和拟合的看法与“小”相比更强调“小”。拟合使用失配的平方和来确定最佳拟合。对于 y 值为 ~2e-5 的数据的百分之几的失配将完全淹没 y 值为 1.e-11 的数据的 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) 中的不确定性对于 x 和 {{ 1}}。