Войти
ФлеймФорумПрограммирование

Нелинейный МНК, алгоритм Левенберга-Маркгвардта

Advanced: Тема повышенной сложности или важная.

#0
(Правка: 22:31) 22:23, 5 мая 2019

На входе эспериментальные данные с шумом, на разных моделях оценивается 5-16 параметров
Пилю сабж по формуле

dP=inv[JT*J+Klm*diag(JT*J)]*Grad

Посоветуйте хороших алгоритмов обновления коэфф Klm,
если просто увеличивать при неудачном шаге и уменьшать при удачном, то в конце алгоритм начинает осцилировать.
Подумалось что должно быть что-то с привязкой к MSE или R2 score, но такого не нагуглилось.
Наивное Klm=a*(1-R^2) или Klm=a*MSE вроде даже работает, а вдруг здесь что-то умнее подскажут


#1
(Правка: 22:07) 22:00, 6 мая 2019

В оригинальной статье есть эмпирические правила подбора. Ещё в какой-то статье делалась оценка параметра на основе более более высокой степени аппроксимации. А мы не стали заморачиваться и считали три или пять раз для разных коэффициентов 0.5 1 2. Потом смотрели лучшее приближение и монотонность. Если монотонность не удовлетворялась, делили все на 2 и опять считали. Градиент пересчитывать не надо, только целевую функцию и обращение матрицы. Все зависит от стоимости вычисления целевой функции. Это кстати очень похоже на алгоритм выбора шага в оригинальной статье левенберга
Что до осцилляции, то это беда всех градиентных методов.
Кстати этот вариант для овражных функций, у меня с единичной матрицей регуляризации быстрее и стабильнее сходился метод.

#2
(Правка: 22:14) 22:03, 6 мая 2019

А что модные нынче Адам, ададельта и т.п?
И где тут используется нелинейность?
Против осцилляции есть методы с инерцией, Нестеров вроде и моиентум.

#3
(Правка: 23:32) 23:31, 6 мая 2019

Mr_Jack
> А что модные нынче Адам, ададельта и т.п?
Эти штуки юзают нейросетки, там тысячи параметров поэтому  используют стохастический градиентный спуск.
У меня не нейросетка, а мат модель с небольшим кол-вом параметров - Якобиан считается аналитически, можно даже психануть и посчитать аналитически Гессиан(но это жестоко).

> И где тут используется нелинейность?
нелинейна сама мат модель
> Против осцилляции есть методы с инерцией, Нестеров вроде и моиентум.
это все вариации градиентного спуска

Вроде нагуглил несколько хороших док, курю
http://people.duke.edu/~hpgavin/ce281/lm.pdf
http://www.imm.dtu.dk/~pcha/LSDF/NonlinDataFit.pdf

#4
(Правка: 7 мая 2019, 0:00) 23:39, 6 мая 2019

Mr_Jack
> мы не стали заморачиваться и считали три или пять раз для разных
> коэффициентов 0.5 1 2.
я хочу выбрать оптимальный и максимально быстрый метод, а сэкономленое время потратить на прогоны с разными начальными значениями параметров модели.

> Кстати этот вариант для овражных функций, у меня с единичной матрицей
> регуляризации быстрее и стабильнее сходился метод.
У меня параметры имеют очень разный масштаб - считай овражная ф-я, с еденичной матрицей естественно все или улетает или стоит на месте.

#5
(Правка: 14:46) 6:06, 18 мая 2019

Запилил Гессиан, из за шума с ним получается хуже чем без него.

Далее мне не совсем понятно по этой формуле

dP=inv[JT*J+Klm*diag(JT*J)]*Grad
В доках сказано что при больших Klm метод стремится к градиентному спуску, но не сказано что при этом будет очень малый шаг ~1/Klm(после инверсии матрицы). Что ИМХО не есть хорошо.

Если потребовать независимость масштаба шага от Klm получается

dP=(1+Klm)*inv[JT*J+Klm*diag(JT*J)]*Grad
Запилил по этой формуле из пары стартоовых точек красным, синим градиентный спуск из тех же точек. критерий останова, порог на скорость изменения ошибки
Gaus+ | Нелинейный МНК, алгоритм Левенберга-Маркгвардта
Добавил линейный поиск на каждом шаге в оба алгоритма, начальные точки те же.
Gaus1+ | Нелинейный МНК, алгоритм Левенберга-Маркгвардта
Почти конфетка)

#6
(Правка: 21:45) 21:42, 18 мая 2019

Немного тюнинга и конфетка)
Klm сейчас вычисляется не как в описании алгоритма, а как функция от кси^2.
Походу градиентный спуск хоть и требует больше итераций, но выигрывает по выч. затратам.
Gaus2+ | Нелинейный МНК, алгоритм Левенберга-Маркгвардта
Осталось линейный поиск заменить на бинарный.

ФлеймФорумПрограммирование