проблема Недавно мне было поручено разработать нелинейный решатель, но мой решатель не сходится к правильному решению.
** Ожидается **: Метод минимизации (x) должен уменьшить мой вектор параметров, x, до минимума.
Наблюдаемый : После того, как я вызываю «minimal (x)», я получаю возвращаемое состояние, которое говорит RelativeErrorTooSmall.
Вопрос : Может кто-нибудь объяснить, что означает значение перечисления?
Документация Единственная доступная документация по классу Эйгена Левенберга Марквардта — это, по сути, файл .h. Вот список перечислений:
enum Status {
NotStarted = -2,
Running = -1,
ImproperInputParameters = 0,
RelativeReductionTooSmall = 1,
RelativeErrorTooSmall = 2,
RelativeErrorAndReductionTooSmall = 3,
CosinusTooSmall = 4,
TooManyFunctionEvaluation = 5,
FtolTooSmall = 6,
XtolTooSmall = 7,
GtolTooSmall = 8,
UserAsked = 9
};
Вот ссылка на файл заголовка: https://eigen.tuxfamily.org/dox/unsupported/NonLinearOptimization_2LevenbergMarquardt_8h_source.html
Вот предыдущий вопрос переполнения стека, в котором есть тестовая программа:
Как использовать реализацию Even без поддержки Левенберга Маркварда?
Поиск в файле .h показывает, что этот код возврата означает, что на каком-то этапе алгоритм не может объявить об успехе, но мало что изменил в настройке параметров на этом этапе.
if (delta <= parameters.xtol * xnorm)
return LevenbergMarquardtSpace::RelativeErrorTooSmall;
Семестр xnorm рассчитывается на лету по алгоритму. Это оценка того, насколько велики параметры в некотором абсолютном смысле. (Хорошей практикой является масштабирование вашей проблемы так, чтобы параметры имели тенденцию быть около единицы в абсолютном значении.) Parameters.xtol это число, которое пользователь может установить как «маленькую» разницу в параметрах. Типичным значением является квадратный корень эффективности машины. Действительно, это значение по умолчанию в коде.
Ошибка сближения при условии правильности кода библиотеки может быть вызвана одним из следующих:
Слишком оптимистичная оценка точности вычисления функции. Попробуйте установить Parameters.xtol несколько больше. использование двойной точность по крайней мере. Убедитесь, что все ваши параметры имеют примерно одинаковый масштаб.
Проблема не очень хорошо обусловлена, что означает, что гессиан в одном направлении в пространстве параметров намного больше, чем другие. Убедитесь, что ваши параметры хорошо масштабированы, и используйте как минимум двойную точность. Возможно, потребуется использовать матрицу кондиционирования. Это слишком глубоко, чтобы войти сюда.
Рассчитанный градиент не является хорошей оценкой градиента функции потерь. Если проблема хорошо обусловлена, либо расчет градиента, либо расчет функции потерь являются ошибочными. Протестируйте их с оценкой конечных разностей для градиента.
У меня есть свои хорошо проверенные и сверхбыстрые решатели. Я хотел бы связаться с вами, но ТАК не заинтересован в этом.
Других решений пока нет …