问题描述
我添加了 excel 图,从中我得到了指数方程,我试图在 Python 中拟合曲线。
当我用它来预测 y 数据时,我的拟合方程不太接近我提供的经验数据,预测给出 f(-25)= 5.30e-11,而经验数据 f(-25)给出 = 5.3e-13
如何改进代码以接近经验数据进行预测,或者我在代码中犯了错误??
![][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
的值实际上是说 x
和 y
的所有值都具有相同的不确定性(实际上=1.0)。如果您将模型的对数拟合到数据的对数,就像 Sum[ (log(data) - log(model))**2]
有效地表示 log(data)
中的不确定性对于 x
和 {{ 1}}。