我想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