Введение 3
Постановка задачи 5
1. Обзор 6
1.1. Технология Kotlin Multiplatform и проект KMath 6
1.2. Статический алгоритм Левенберга-Марквардта 8
2. Реализация статической версии 12
2.1. Входные данные 12
2.2. Описание хода алгоритма 12
3. Результаты тестирования на разных платформах 14
4. Поточная версия 18
4.1. Реализация 18
4.2. Тестирование 20
Заключение 22
Список литературы 23
Быстрый рост объемов данных в сегодняшнюю цифровую эпоху произвел революцию в области алгоритмов оптимизации, создав новые задачи и возможности для решения крупномасштабных задач в режиме реального времени. В частности, методы нелинейной оптимизации, используемые для оценки параметров нелинейной математической модели путем минимизации разницы между наблюдаемыми данными и предсказаниями модели, играют решающую роль в различных областях науки и техники, от компьютерного зрения и машинного обучения до обработки сигналов и систем управления, где модели демонстрируют нелинейное поведение.
Одним из известных методов нелинейной оптимизации методом наименьших квадратов является алгоритм Левенберга-Марквардта. Алгоритм Левенберга-Марквардта, представляющий собой слияние методов градиентного спуска и методов Гаусса-Ньютона, демонстрирует замечательные свойства сходимости, что делает его популярным выбором для решения сложных задач оптимизации. Однако, использование столь полезного алгоритма может быть затруднено, поскольку существующие реализации есть лишь на нескольких языках и не могут быть запущены на многих платформах. В современном технологическом мире появляется много приложений алгоритмов, каждое из которых может нуждаться в своей платформе для запуска, поэтому вопрос наличия вычислительных методов, которые могут адаптироваться и использовать разные платформы, очень актуален. Одним из проектов, занимающихся разработкой мультиплатформенной математической библиотеки, является проект KMath. Библиотека KMath разработана для решения разнообразных задач, связанных с математикой и научными вычислениями и ее мультиплаформенность достигается благодаря использовании технологии Kotlin Multiplatform. В рамках этой дипломной работы был разработан алгоритм Левенберга-Марквардта на языке Kotlin и внедрен в кодовую базу проекта KMath с дальнейшим возможным использованием алгоритма любым пользователем этой библиотеки на различных платформах.
Традиционный алгоритм Левенберга-Марквардта описан в первую очередь для обработки статических наборов данных, и в эпоху больших данных, когда данные генерируются и обновляются с беспрецедентной скоростью, возникает потребность в методах оптимизации, которые могут справиться с динамичными потоковыми данными.В этой работе также представлена поточная версия алгоритма Левенберга-Марквардта, которая является адаптацией, предназначенной для обработки динамических данных, предлагающая значительные преимущества для приложений, которые получают данные в реальном времени.
В ходе работы были достигнуты следующие результаты:
1. Выполнен обзор предметной области. Подробно рассмотрено устройство алгоритма Левенберга-Марквардта.
2. Реализована статическая версия алгоритма Левенберга-Марквардта на языке Kotlin в рамках проекта KMath. Полученная реализация может быть использована на различных платформах.
3. Проведено тестирование алгоритма на платформах: JS, JVM и Native. Результаты тестирования показали работоспособность полученной реализации. Среди использованных платформ наилучшую производительность показала JVM.
4. Реализована поточная версия алгоритма Левенберга-Маквардта. Проведено тестирование поточной версии на примере сложной функции. Результаты тестирования показали, что в случае, когда потоковые данные меняются не сильно, время подсчета параметров для каждого следующего набора данных значительно сокращается относительно времени, которое требуется на первый подсчет.
Код реализации открыт и доступен в репозитории 5.
[1] Gavin Henri P. The Levenberg-Marquardt algorithm for nonlinear least squares curve-fitting problems // Department of Civil and Environmental Engineering, Duke University. — 2019. — Vol. 19.
[2] Kotlin docs Asynchronous Flow.— https://kotlinlang.org/docs/ flow.html. — Accessed: 2023.
[3] Marquardt Donald W. An Algorithm for Least-Squares Estimation of Nonlinear Parameters // Journal of the Society for Industrial and Applied Mathematics.— 1963.— Vol. 11, no. 2.— P. 431-441.— https://doi.org/10.1137/0111030.
[4] Nozik Alexander. Kotlin language for science and Kmath library // AIP Conference Proceedings / AIP Publishing LLC. — Vol. 2163. — 2019. — P. 040004.