我想minimize經由SciPy的輸出chi-square功能,找到畝,西格瑪,normc提供了高斯覆蓋最合適的。如何將參數傳遞給其他函數(通常和通過scipy)?
from math import exp
from math import pi
from scipy.integrate import quad
from scipy.optimize import minimize
from scipy.stats import chisquare
import numpy as np
# guess intitial values for minimized chi-square
mu, sigma = np.mean(mydata), np.std(mydata) # mydata is my data points
normc = 1/(sigma * (2*pi)**(1/2))
gauss = lambda x: normc * exp((-1) * (x - mu)**2/(2 * (sigma **2))) # Gaussian Distribution
# assume I have pre-defined bin-boundaries as a list called binbound
def expvalperbin(binbound,mu,sigma,normc):
# calculates expectation value per bin
ans = []
for index in range(len(binbound)):
if index != len(binbound)-1:
ans.append(quad(gauss, binbound[index], binbound[index+1])[0])
return ans
expvalguess = expvalperbin(binbound,mu,sig,normc)
obsval = countperbin(binbound,mydata)
arglist = [mu,sig,norm]
def chisquareopt(obslist,explist):
return chisquare(obslist,explist)[0]
chisquareguess = chisquareopt((obsval,expvalguess), expvalguess, args=arglist)
result = minimize(chisquareopt(obsval,expvalguess), chisquareguess )
print(result)
運行該代碼爲我提供了這個錯誤:
TypeError: chisquareopt() got an unexpected keyword argument 'args'
我有幾個問題:
1)我如何寫一個函數允許參數通過傳遞我函數chisquareopt?
2)I如何判斷SciPy的將優化參數微米,西格瑪,normc]爲得到最小卡方?我怎麼能從優化中找到這些參數?
3)很難知道我是否在這裏取得進展。我在正確的軌道上嗎?
編輯:如果它是相關的,我有一個函數輸入[mu,sigma,normc]並輸出一個子列表,每個子列表包含[mu,sigma,normc]涵蓋指定範圍內的所有可能的參數組合)。
在函數expvalperbin中,'args =(mu,sigma))[0] * N)'是做什麼的?我猜測它複製了一個(mu,sigma)的元組N次,但下標[0]讓我相信我沒有看到完整的圖片(類似於'chisquareopt'中的參數)?至於不是pythonic,我願意接受建議。 – mikey
這和你的'ans.append(quad(gauss,binbound [index],binbound [index + 1])[0])'是一樣的。但是我也將'mu'和'lambda'傳遞給'gauss'函數。最後,爲了從必須乘以N的概率中獲得預期的**計數**,觀測的總數(我已經告訴過你)。 –
啊,我現在看到它!感謝您的幫助。 – mikey