【问题标题】:How do I get minuit.Minuit to fit a gaussian curve to my data in Python?如何让 minuit.Minuit 将高斯曲线拟合到 Python 中的数据?
【发布时间】:2014-04-27 15:12:28
【问题描述】:

我正在尝试使用 minuit.Minuit 函数将高斯拟合到一些简单的数据,但它不会改变我的任何参数。如果有人能提供帮助,我将不胜感激。

import numpy as np
import minuit

xCurve = np.array([0,1,2,3,4,5,6,7,8,9])
yCurve = np.array([0,1,2,3,4,5,4,3,2,1])


def Gaus(a,b,c):
    return a*np.exp(-((xCurve-b)**2)/(2*c**2))

m = minuit.Minuit(Gaus,a=4.5,b=5,c=0.4)
m.printMode=1
m.migrad()
m.printMode=0
m.values()

a = m.values['a']
b = m.values['b']
c = m.values['c']
d = m.values['d']
print a
print b
print c
print d

它吐出一个错误: minuit.MinuitError:协方差不是正定的。

【问题讨论】:

    标签: python curve-fitting gaussian


    【解决方案1】:

    Minuit 是一个最小化器,但您给了它一个拟合函数,而不是一个目标函数。 (这个函数实际上不是正定的,所以错误信息是恰当的。)

    要获得您真正想要的,请执行以下操作:

    def gauss(x, a,b,c):
        return a*np.exp(-((x-b)**2/(2*c**2)))
    
    def minimizeMe(a,b,c):
        return sum((gauss(x, a,b,c) - y)**2 for x, y in zip(xCurve, yCurve))
    
    m = minuit.Minuit(minimizeMe, a=4.5, b=5, c=0.4)
    m.printMode = 1
    m.migrad()
    

    这并不能有效地利用你的 Numpy 数组,但是如果你结合最小化和拟合函数,你应该可以通过 ufunc 来做到这一点。

    PyMinuit 旨在提供对拟合技术的更多低级访问。如果您只对普通最小二乘感兴趣,您可能会发现直接 Minuit 接口很麻烦。另一方面,如果您计划使用 lasso 回归约束某些参数,提供非二次甚至非对称损失函数,或者您计划进行甚至无法转换为形式的优化一个函数适合,那么低级接口是一个好处。

    【讨论】:

      猜你喜欢
      • 2018-12-10
      • 2017-11-12
      • 1970-01-01
      • 2016-08-22
      • 2020-04-03
      • 2021-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多