大量数据点的曲线拟合
Curve fitting with large number of data points
这是一个非常具体的问题,我希望社区可以帮助我解决。提前致谢。
所以我有两组数据,一组是实验数据,另一组是基于方程式。我试图将我的数据点拟合到这条曲线上,从而获得我感兴趣的缺失变量。即 Ebfit 函数中的 a 和 b。
代码如下:
%matplotlib notebook
import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as spys
from scipy.optimize import curve_fit
time = [60,220,520,1840]
Moment = [0.64227262,0.468318916,0.197100772,0.104512508]
Temperature = 25 # Bake temperature in degrees C
Nb = len(Moment) # Number of bake measurements
Baketime_a = time #[s]
N_Device = 10000 # No. of devices considered in the array
T_ambient = 273 + Temperature
kt = 0.0256*(T_ambient/298) # In units of eV
f0 = 1e9 # Attempt frequency
def Ebfit(x,a,b):
Eb_mean = a*(0.0256/kt) # Eb at bake temperature
Eb_sigma = b*Eb_mean
Foursigma = 4*Eb_sigma
Eb_a = np.linspace(Eb_mean-Foursigma,Eb_mean+Foursigma,N_Device)
dEb = Eb_a[1] - Eb_a[0]
pdfEb_a = spys.norm.pdf(Eb_a,Eb_mean,Eb_sigma)
## Retention Time
DMom = np.zeros(len(x),float)
tau = (1/f0)*np.exp(Eb_a)
for bb in range(len(x)):
DMom[bb]= (1 - 2*(sum(pdfEb_a*(1 - np.exp(np.divide(-x[bb],tau))))*dEb))
return DMom
a = 30
b = 0.10
params,extras = curve_fit(Ebfit,time,Moment)
x_new = list(range(0,2000,1))
y_new = Ebfit(x_new,params[0],params[1])
plt.plot(time,Moment, 'o', label = 'data points')
plt.plot(x_new,y_new, label = 'fitted curve')
plt.legend()
我遇到的主要问题是,当我使用大量点时,数据与函数的拟合不起作用。在上面的代码中,当我使用 4 个点(时间和时刻)时,这段代码工作正常。
我得到以下 a 和 b 的值。
数组([ 29.11832766, 0.13918353])
a 的预期值为 (23-50),b 为 (0.06 - 0.15)。所以这些值都在可接受的范围内。这是对应的情节:
但是,当我使用我的实际实验归一化数据时,大约有 500 个点。
编辑:此数据:
标准化数据
https://www.dropbox.com/s/64zke4wckxc1r75/Normalized%20Data.csv?dl=0
原始数据
https://www.dropbox.com/s/ojgse5ibp59r8nw/Data1.csv?dl=0
我得到以下值并绘制 a 和 b 超出可接受范围的值,
数组([-13.76687781, -12.90494196])
我知道这些值是错误的,如果我手动执行(慢慢调整值以获得合适的值),它将在 a=30.1 和 [=61 左右=]b=0.09。绘制时看起来像这样:
我已经尝试更改 a 和 b 的初始猜测值、其他实验数据集以及类似线程中的其他建议。 None 似乎对我有用。感谢您提供的任何帮助。谢谢。
。
.
.
.
附加信息
我尝试将数据拟合到的模型来自以下等式:
其中 Dmom = 1 - 2*Psw
a是Eb值,而b是Sigma值,其中Eb的取值范围由概率密度函数决定和 4 倍的西格玛值(即四西格玛)。然后对该分布求和以用于最终方程。
看来您确实需要尝试一下 a
和 b
的初始猜测。也许您正在拟合的功能表现不佳,这就是为什么它很容易因远离全局最小值的初始猜测而失败。话虽这么说,但这是一个如何拟合数据的工作示例:
import pandas as pd
data_df = pd.read_csv('data.csv')
time = data_df['Time since start, Time [s]'].values
moment = data_df['Signal X direction, Moment [emu]'].values
params, extras = curve_fit(Ebfit, time, moment, p0=[40, 0.3])
产生 a
和 b
的值:
In [6]: params
Out[6]: array([ 30.47553689, 0.08839412])
这导致函数的对齐很好。
x_big = np.linspace(1, 1800, 2000)
y_big = Ebfit(x_big, params[0], params[1])
plt.plot(time, moment, 'o', alpha=0.5, label='all points')
plt.plot(x_big, y_big, label = 'fitted curve')
plt.legend()
plt.show()
这是一个非常具体的问题,我希望社区可以帮助我解决。提前致谢。
所以我有两组数据,一组是实验数据,另一组是基于方程式。我试图将我的数据点拟合到这条曲线上,从而获得我感兴趣的缺失变量。即 Ebfit 函数中的 a 和 b。
代码如下:
%matplotlib notebook
import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as spys
from scipy.optimize import curve_fit
time = [60,220,520,1840]
Moment = [0.64227262,0.468318916,0.197100772,0.104512508]
Temperature = 25 # Bake temperature in degrees C
Nb = len(Moment) # Number of bake measurements
Baketime_a = time #[s]
N_Device = 10000 # No. of devices considered in the array
T_ambient = 273 + Temperature
kt = 0.0256*(T_ambient/298) # In units of eV
f0 = 1e9 # Attempt frequency
def Ebfit(x,a,b):
Eb_mean = a*(0.0256/kt) # Eb at bake temperature
Eb_sigma = b*Eb_mean
Foursigma = 4*Eb_sigma
Eb_a = np.linspace(Eb_mean-Foursigma,Eb_mean+Foursigma,N_Device)
dEb = Eb_a[1] - Eb_a[0]
pdfEb_a = spys.norm.pdf(Eb_a,Eb_mean,Eb_sigma)
## Retention Time
DMom = np.zeros(len(x),float)
tau = (1/f0)*np.exp(Eb_a)
for bb in range(len(x)):
DMom[bb]= (1 - 2*(sum(pdfEb_a*(1 - np.exp(np.divide(-x[bb],tau))))*dEb))
return DMom
a = 30
b = 0.10
params,extras = curve_fit(Ebfit,time,Moment)
x_new = list(range(0,2000,1))
y_new = Ebfit(x_new,params[0],params[1])
plt.plot(time,Moment, 'o', label = 'data points')
plt.plot(x_new,y_new, label = 'fitted curve')
plt.legend()
我遇到的主要问题是,当我使用大量点时,数据与函数的拟合不起作用。在上面的代码中,当我使用 4 个点(时间和时刻)时,这段代码工作正常。
我得到以下 a 和 b 的值。
数组([ 29.11832766, 0.13918353])
a 的预期值为 (23-50),b 为 (0.06 - 0.15)。所以这些值都在可接受的范围内。这是对应的情节:
但是,当我使用我的实际实验归一化数据时,大约有 500 个点。
编辑:此数据:
标准化数据
https://www.dropbox.com/s/64zke4wckxc1r75/Normalized%20Data.csv?dl=0
原始数据
https://www.dropbox.com/s/ojgse5ibp59r8nw/Data1.csv?dl=0
我得到以下值并绘制 a 和 b 超出可接受范围的值,
数组([-13.76687781, -12.90494196])
我知道这些值是错误的,如果我手动执行(慢慢调整值以获得合适的值),它将在 a=30.1 和 [=61 左右=]b=0.09。绘制时看起来像这样:
我已经尝试更改 a 和 b 的初始猜测值、其他实验数据集以及类似线程中的其他建议。 None 似乎对我有用。感谢您提供的任何帮助。谢谢。
。 . . .
附加信息
我尝试将数据拟合到的模型来自以下等式:
其中 Dmom = 1 - 2*Psw
a是Eb值,而b是Sigma值,其中Eb的取值范围由概率密度函数决定和 4 倍的西格玛值(即四西格玛)。然后对该分布求和以用于最终方程。
看来您确实需要尝试一下 a
和 b
的初始猜测。也许您正在拟合的功能表现不佳,这就是为什么它很容易因远离全局最小值的初始猜测而失败。话虽这么说,但这是一个如何拟合数据的工作示例:
import pandas as pd
data_df = pd.read_csv('data.csv')
time = data_df['Time since start, Time [s]'].values
moment = data_df['Signal X direction, Moment [emu]'].values
params, extras = curve_fit(Ebfit, time, moment, p0=[40, 0.3])
产生 a
和 b
的值:
In [6]: params
Out[6]: array([ 30.47553689, 0.08839412])
这导致函数的对齐很好。
x_big = np.linspace(1, 1800, 2000)
y_big = Ebfit(x_big, params[0], params[1])
plt.plot(time, moment, 'o', alpha=0.5, label='all points')
plt.plot(x_big, y_big, label = 'fitted curve')
plt.legend()
plt.show()