簡體   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