我怎么得到它?用Python对我的数据进行高斯曲线拟合



我正在尝试使用分钟拟合高斯到一些简单的数据。但它不会改变任何参数。如果有人能帮忙,我将非常感激。

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是一个最小化器,但您给了它一个适合函数,而不是一个目标函数。(这个函数实际上不是正定的,所以错误消息是合适的。)

要得到你真正想要的,这样做:

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界面很麻烦。另一方面,如果您计划用lasso回归约束一些参数,提供非二次甚至非对称损失函数,或者如果您计划进行甚至不能转换为函数拟合形式的优化,那么低级接口是一个好处。

最新更新