【问题标题】:How do minimize() and residual() functions work together in lmfitlmfit 中最小化()和残差()函数如何协同工作
【发布时间】:2015-09-16 16:16:01
【问题描述】:

我正在尝试在 Python 中实现运动结构,但无法真正理解此最小化函数如何与我的残差函数完全配合。如果我传递一组参数来表示相机位置和观察点的位置,我的残差函数将如何处理它们?他们会逐行喂食吗(这将是逻辑)?但是当我从残差函数中打印输入时,我看到所有行都在那里。我还在我的残差函数中使用了外部函数来进行四元数分解,他们似乎对 lmfit 一次呈现参数数组并不满意。

【问题讨论】:

    标签: python optimization lmfit


    【解决方案1】:

    我不确定我是否理解您是如何提出问题的,但是,您想知道 minimize() 方法是如何工作的?另外,我假设残差函数指的是“目标”函数,它返回一个展平的残差数组。

    可以将目标函数视为您尝试拟合数据的任何其他函数,不同之处在于您不必在调用函数时明确指定参数的顺序(它们是嵌入的在参数类中)并且可以使用多种最小化算法(levenberg marquardt、模拟退火等)。因此,它可以通过参数类轻松地用于全局(共享参数)拟合(具有多个数据集)。所有这些函数评估都返回残差(模型 - 数据),它们被组合并作为单个残差数组输出。

    因此,对您而言,如果您的参数是要在四元数函数中使用的“相机位置”,则这些参数将被优化以产生模型对数据最小化(模型 - 数据)的最佳拟合。您可以在目标函数中使用您想要的任何外部函数,只要该函数的输出是一个展平的残差数组 - lmfit 会负责其余的工作。

    您唯一需要做的事情是: 1) 识别要拟合的参数并将它们包含在参数类中 2) 编写返回残差数组的目标函数(使用您想要的任何外部函数)。

    这是一个例子:

    如果这是一个要评估的简单模型:

    #in this example x,y are the data that are collected, and model contains a function that uses x in fitting to obtain a model y-value.
    
    #create model to evaluate and fit to data
    def model(params, x):
    
        dGA = params['dGA'].value
        dGB = params['dGB'].value
        dGS = params['dGS'].value
    
        return (((dGA*x) + dGb)*dGS) 
    
    #create parameter class
    params = lmfit.Parameters()
    params.add('dGA', value = 2.9)
    params.add('dGB', value = 2.89)
    params.add('dGS', value = 3.6)
    
    #now setup objective function which uses the model function
    def objective(params):
    
        finalresid = []
    
        dGA = params['dGA'].value
        dGB = params['dGB'].value
        dGS = params['dGS'].value
    
        #can setup loop or anything for multiple data sets (y below)
        #if multiple, just have to lump all residuals into a 
        #single flattened array. You could do this by setting up a loop over
        #all data sets, and combine the residuals at the end
    
        resid = (y - model(params, x))
    
    return resid.flatten() 
    
    #now call mimimize() over the objective function with respect to the parameters
    result = lmfit.minimize(objective, params)
    

    所有相关信息都可以从结果中获得(查看文档)。

    希望这会有所帮助,但我无法就您所问的问题发表评论。

    【讨论】:

      猜你喜欢
      • 2018-03-14
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多