Я пытаюсь реализовать структуру из движения в Python и не могу понять, как эта функция минимизации работает именно с моей остаточной функцией. Если я передам массив аргументов для представления положений камеры и положений наблюдаемых точек, как они будут обработаны моей функцией невязки? Будут ли их кормить ряд за рядом (в чем логика)? Но когда я печатаю ввод из своей остаточной функции, я вижу, что все строки есть. Я также использую внешние функции в своей остаточной функции, которые выполняют декомпозицию кватернионов, и они, похоже, недовольны тем, что lmfit представляет массив аргументов сразу.
Как функции минимизации() и остатка() работают вместе в lmfit
Ответы (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)
Вся необходимая информация может быть получена из результатов (проверьте документы).
Надеюсь, это поможет, но я не могу комментировать, чтобы задавать вопросы о том, что вы спрашиваете.