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

标签 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:协方差不是正定的。

最佳答案

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 接口(interface)很麻烦。另一方面,如果您计划使用套索回归约束某些参数,提供非二次甚至非对称损失函数,或者您计划进行甚至无法转换为以下形式的优化功能适合,那么低级接口(interface)就是一个好处。

关于python - 如何让 minuit.Minuit 在 Python 中将高斯曲线拟合到我的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22538655/

相关文章:

python - 使用 lmfit 时考虑数据错误

python - scipy.optimize.curve_fit 无法拟合偏移的倾斜高斯曲线

algorithm - 生成只有正数的高斯分布

python - 基于最小二乘法拟合SIR模型

python - models.py 越来越大,最好的方法是什么?

python - np.where 相当于一维数组

python - 如何在Amazon EMR集群上远程提交hadoop MR作业

python - 拟合由两种不同制度组成的数据的曲线

python - 在 python 中绘制 3D 零均值、单位方差高斯会产生意想不到的结果

python - 使用 python 列出服务器上所有可用的 MS SQL 数据库的名称