如何让minuit.Minuit在Python中为我的数据拟合高斯曲线?

时间:2014-03-20 16:04:14

标签: python curve-fitting gaussian

我试图使用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:协方差不是肯定的。

1 个答案:

答案 0 :(得分:2)

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数组,但是如果你结合了minimizer和fit函数,你应该可以通过ufunc来实现它。

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