2017-10-06 122 views
0

我正在使用scipy优化功能并为其提供自定义最小化功能。我打电话跟scipy.minimize最大返回值

result = op.minimize(calc_chi2, start_list, args=()) 

calc_chi2()功能看起来像极小

def calc_chi2(parameters): 
    if within_priors(parameters): 
     # calculate chi2 
    else: 
     return math.inf 

此功能测试是否某些先验内的参数,如果没有它应该返回一个非常大的志^ 2。我使用math.inf,然而导致最小化者将参数向量设置为nan,所以我猜最小值不喜欢math.inf?如果我只是使用大量数据,一切正常......我只是想知道这里的正确方法是什么?

回答

0

考虑抛出/捕获一个异常来处理无限chi^2的情况 - 如果不是你描述的NaN行为,并不清楚你期望会发生什么,并且处理异常会让你变得明确关于你想要发生什么。

class InfiniteChiException(Exception): 
    """This exception is raised under certain conditions, yadda yadda yadda""" 
    pass 

def calc_chi2(parameters): 
    if within_priors(parameters): 
     # calculate chi2 
    else: 
     raise InfiniteChiException 

try: 
    result = op.minimize(calc_chi2, start_list, args=()) 
catch InfiniteChiException: 
    # do something here 
+0

但它是我谁返回无限的chi^2我不需要捕捉那个?我只是寻找一个更好的解决方案,而不仅仅是一个很大的chi^2中的硬编码,如果参数超出了先前的范围... – carl

+0

你能解释一下当无限chi发生时你想要发生什么吗? – charlesreid1

+0

因为我想要最小化算法知道这个参数集在先验之外,因此应该有零可能性 – carl