2

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

4

1 回答 1

2

我不确定我是否理解您是如何提出问题的,但是,您想知道 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)

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

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

于 2015-09-17T12:25:22.150 回答