【问题标题】:Curve fitting with large number of data points具有大量数据点的曲线拟合
【发布时间】:2017-04-07 05:34:03
【问题描述】:

这是一个非常具体的问题,我希望社区可以帮助我解决。提前致谢。

所以我有两组数据,一组是实验数据,另一组是基于方程式的。我试图将我的数据点拟合到这条曲线,从而获得我感兴趣的缺失变量。即,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 个点(时间和时刻)时,这段代码可以正常工作。

我得到以下 ab 的值。

数组([ 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

我得到以下值和 ab 的绘图超出了可接受的范围,

数组([-13.76687781, -12.90494196])

我知道这些值是错误的,如果我要手动执行(缓慢调整值以获得适当的拟合),它将在 a=30.1b=0.09时间>。当绘制看起来像这样:

我已尝试更改 a 和 b 的初始猜测值、其他实验数据集以及类似线程中的其他建议。似乎没有一个对我有用。感谢您提供的任何帮助。谢谢。

。 . . .

附加信息

我试图拟合数据的模型来自以下等式:

其中 Dmom = 1 - 2*Psw

a 是 Eb 值,而 b 是 Sigma 值,其中,Eb 具有由概率密度函数确定的值范围和 sigma 值的 4 倍 (即Foursigma)。然后对该分布求和以用于最终方程。

【问题讨论】:

  • 您的 Google 云端硬盘链接似乎受到限制。这是故意的吗?
  • @VlasSokolov 嘿抱歉。我已经更新了链接。请重试。
  • 文件中的矩数据范围从 -3e-5 到 1.65e-5,但在适合 500 点数据集的情况下,范围最多为 1。这是否解释了拟合差异?您是否在拟合它们和在屏幕上绘制它们之间的某个地方对数据进行规范化?
  • @VlasSokolov。哦,我再次非常抱歉。是的,你是对的。我必须使用标准化数据。所以它应该是从 0 到 1。我已经更新了正确的数据。感谢朋友的帮助。

标签: python python-3.x scipy curve-fitting jupyter


【解决方案1】:

看来您毕竟需要对ab 的初始猜测进行尝试。也许您正在拟合的函数表现得不是很好,这就是为什么它很容易因为远离全局最小值的初始猜测而失败。话虽如此,下面是一个如何拟合数据的工作示例:

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])

产生ab 的值:

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()

【讨论】:

    猜你喜欢
    • 2015-06-20
    • 2011-10-14
    • 2020-02-14
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多