Как функции минимизации() и остатка() работают вместе в lmfit

Я пытаюсь реализовать структуру из движения в Python и не могу понять, как эта функция минимизации работает именно с моей остаточной функцией. Если я передам массив аргументов для представления положений камеры и положений наблюдаемых точек, как они будут обработаны моей функцией невязки? Будут ли их кормить ряд за рядом (в чем логика)? Но когда я печатаю ввод из своей остаточной функции, я вижу, что все строки есть. Я также использую внешние функции в своей остаточной функции, которые выполняют декомпозицию кватернионов, и они, похоже, недовольны тем, что lmfit представляет массив аргументов сразу.


person Mehdi    schedule 16.09.2015    source источник


Ответы (1)


Я не уверен, что понимаю, как вы сформулировали свой вопрос, но вам интересно, как работает метод сворачивания()? Кроме того, я предполагаю, что по остаточной функции вы имеете в виду «целевую» функцию, которая возвращает сглаженный массив остатков.

Целевую функцию можно рассматривать как любую другую функцию, которую вы пытаетесь подогнать к данным, с той разницей, что вам не нужно явно указывать порядок параметров при вызове функции (они встроены в параметр класс) и может использовать несколько алгоритмов минимизации (левенберг-марквардт, имитация отжига и т. д.). Таким образом, его можно легко использовать для глобального (общий параметр) подбора (с несколькими наборами данных) через класс параметров. Все эти вычисления функций возвращают остатки (модель-данные), которые объединяются и выводятся в виде единого массива остатков.

Итак, для вас, если ваши параметры представляют собой «положения камеры», которые будут использоваться в функциях кватерниона, они будут оптимизированы, чтобы обеспечить наилучшее соответствие модели минимизации данных (модель-данные). Вы можете использовать любые внешние функции внутри целевой функции, но только до тех пор, пока результат этой функции представляет собой сглаженный остаточный массив — 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)

Вся необходимая информация может быть получена из результатов (проверьте документы).

Надеюсь, это поможет, но я не могу комментировать, чтобы задавать вопросы о том, что вы спрашиваете.

person XtremeJake    schedule 17.09.2015