Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用pyminuit将函数拟合到数据_Python_Curve Fitting_Pyminuit - Fatal编程技术网

Python 使用pyminuit将函数拟合到数据

Python 使用pyminuit将函数拟合到数据,python,curve-fitting,pyminuit,Python,Curve Fitting,Pyminuit,我编写了一个Python(2.7)程序来评估一些科学数据。其主要任务是将此数据拟合到某个函数(1)。由于这是相当多的数据,程序使用多处理将作业(“适合一组数据”)分配到多个核。在第一次尝试中,我使用scipy.optimize中的curve_fit实现了拟合过程,该方法非常有效 到目前为止,一切顺利。然后我们看到数据更精确地由函数(1)和高斯分布的卷积来描述。其思想是首先将数据拟合到函数(1),得到由此产生的猜测值,然后将数据再次拟合到卷积中。由于数据非常嘈杂,我试图用七个参数的卷积来拟合它,这

我编写了一个Python(2.7)程序来评估一些科学数据。其主要任务是将此数据拟合到某个函数(1)。由于这是相当多的数据,程序使用多处理将作业(“适合一组数据”)分配到多个核。在第一次尝试中,我使用scipy.optimize中的curve_fit实现了拟合过程,该方法非常有效

到目前为止,一切顺利。然后我们看到数据更精确地由函数(1)和高斯分布的卷积来描述。其思想是首先将数据拟合到函数(1),得到由此产生的猜测值,然后将数据再次拟合到卷积中。由于数据非常嘈杂,我试图用七个参数的卷积来拟合它,这次的结果相当糟糕。特别是高斯参数在某种程度上是不可能的

因此,我尝试在PyMinuit中实现拟合过程,因为它允许将参数限制在某些边界内(如正振幅)。因为我以前从未使用过Minuit,我尝试从小事做起,所以我重写了装配过程的第一个(“简单”)部分。执行此任务的代码段如下所示(简化):

其中,efunc()是函数(1)。参数d是固定的,因为我现在不使用它。

最后,实际的问题来了:当运行脚本时,Minuit会打印几乎所有适合的内容

VariableMetricBuilder: Tolerance is not sufficient - edm is 0.000370555 requested 1e-05 continue the minimization
为edm设置不同的值。fit仍然可以正常工作,但打印会大大降低程序的速度。我试图增加fit.tol,但有很多数据集返回更高的edm。然后我尝试使用实际有效的方法隐藏fit.migrad()的输出。现在有些奇怪的事情发生了:在程序中间的某个地方,所有内核上的进程同时失败。不是在第一次拟合,而是在整个数据集的中间。我唯一改变的是

with suppress_stdout_stderr():
    fit.migrad()
我知道这是一个相当长的介绍,但我认为当您了解整个框架时,它会对您帮助更多。如果有人知道如何解决这个问题,我将不胜感激


注意:功能(1)定义为

def efunc(x,a,b,c,d):
    if x < c:
        return a*np.exp(b*x**d)
    else:
        return a*np.exp(b*c**d)   # therefore constant
efunc = np.vectorize(efunc)
def efunc(x、a、b、c、d):
如果x
尝试另一种最小化方法。
def efunc(x,a,b,c,d):
    if x < c:
        return a*np.exp(b*x**d)
    else:
        return a*np.exp(b*c**d)   # therefore constant
efunc = np.vectorize(efunc)