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