繁体   English   中英

如何获取minuit.Minuit以使高斯曲线适合Python中的数据?

[英]How do I get minuit.Minuit to fit a gaussian curve to my data in Python?

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

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旨在提供更底层的拟合技术访问。 如果您只对普通的最小二乘感兴趣,则可能会发现Direct-Minuit界面很麻烦。 另一方面,如果您打算通过套索回归约束某些参数,提供非二次甚至非对称损失函数,或者您计划进行甚至无法转化为以下形式的优化:如果功能适合,那么低级接口是有好处的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM