【问题标题】:scipy.minimize maximum return valuescipy.minimize 最大返回值
【发布时间】:2017-10-06 11:28:08
【问题描述】:

我正在使用 scipy 优化功能并为其提供自定义最小化功能。我用

调用最小化器
result = op.minimize(calc_chi2, start_list, args=())

calc_chi2() 函数看起来像

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

此函数测试是否在某些先验中的参数,如果不是,它应该返回一个非常大的 chi^2。我使用math.inf,但这会导致最小化器将参数向量放在任何地方,所以我猜最小化器不喜欢math.inf???如果我只是使用大量的一切工作正常...我只是想知道这里的正确方法是什么?

【问题讨论】:

    标签: python scipy


    【解决方案1】:

    考虑抛出/捕获异常来处理无限 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
    

    【讨论】:

    • 但返回无限chi^2的是我……我不需要抓住那个?如果参数超出先验范围,我只是在寻找比在大 chi^2 中硬编码更好的解决方案...
    • 你能解释一下当无限气发生时你想发生什么吗?
    • 我返回无限 chi^2 因为我希望最小化算法知道这个参数集在先验之外,因此应该具有零似然性
    • 明白了,但是最小化算法需要有一种机制来“知道”一个参数集在先验之外。所以我的问题不是关于你的意图,而是关于你的算法——当无限气发生时,你希望你的 算法 做什么?这就是您通过填写“在这里做某事”部分来回答的问题。 (很可能,您希望删除这些值而不是将它们设置为 Inf。但这取决于您的问题。)
    • 无论如何我都必须返回一个值,对吧? scipy.minimize 函数确实需要返回值吗?我只想返回一些保证算法不会将其视为最小值的东西......没有在值中进行硬编码
    猜你喜欢
    • 2022-01-15
    • 2015-09-11
    • 1970-01-01
    • 2017-02-26
    • 2022-01-21
    • 2018-03-20
    • 2020-03-08
    • 2016-07-17
    • 1970-01-01
    相关资源
    最近更新 更多