我正在尝试用Python中的动作实现结构,并且不能真正理解这个最小化函数如何与我的残余函数完全一致。如果我传递一组参数来表示摄像机位置和观察点的位置,我的剩余函数将如何处理它们?他们会逐行喂食(这将是逻辑)吗?但是当我从剩余函数中打印输入时,我看到所有行都在那里。我还在剩余函数中使用外部函数进行四元数分解,他们似乎对lmfit一次性提出参数数组感到满意。
答案 0 :(得分:2)
我不确定我是如何理解你的问题,但是,你想知道minim()方法是如何工作的?另外,我假设剩余功能你指的是"目标"返回平坦的残差数组的函数。
目标函数可以被认为是您尝试适应数据的任何其他函数,不同之处在于您在调用函数时不必明确指定参数的顺序(它们嵌入在参数类中)并且可以使用多个最小化算法(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)
所有相关信息均可从结果中获取(查看文档)。
希望这会有所帮助,但我无法发表评论,询问您的问题。