如何在Python中使用Minuit来拟合高斯曲线到我的数据?

2024-06-26 07:51:06 发布

您现在位置: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

它发出一个错误: 微小误差:协方差不是正定的。在


Tags: 数据函数importnumpy参数asnparray
1条回答
网友
1楼 · 发布于 2024-06-26 07:51:06

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

相关问题 更多 >