TensorFlow. Решение систем нелинейных уравнений |
||||||||||||||||||||||||||||||||
МЕНЮ Искусственный интеллект Поиск Регистрация на сайте Помощь проекту ТЕМЫ Новости ИИ Искусственный интеллект Разработка ИИГолосовой помощник Городские сумасшедшие ИИ в медицине ИИ проекты Искусственные нейросети Слежка за людьми Угроза ИИ ИИ теория Внедрение ИИКомпьютерные науки Машинное обуч. (Ошибки) Машинное обучение Машинный перевод Реализация ИИ Реализация нейросетей Создание беспилотных авто Трезво про ИИ Философия ИИ Big data Работа разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика
Генетические алгоритмы Капсульные нейросети Основы нейронных сетей Распознавание лиц Распознавание образов Распознавание речи Техническое зрение Чат-боты Авторизация |
2018-12-06 04:00 В прошлой статье мы рассмотрели, как можно решать системы линейных алгебраических уравнений, однако возможности TensorFlow этим не ограничиваются. Несмотря на то, что в явном виде библиотека не содержит инструментария для решения нелинейных систем, в ней есть множество инструментов для решения оптимизационных задач, а численное решение сиcтемы уравнений сводится как раз к такой задаче. Идея решения Для получения решения необходимо выполнить следующие действия:
В целом, как видно алгоритм не сложный, однако позволяет решать системы практически любой сложности. Пример решения задачи Для большей ясности изложения решения, рассмотрим его на примере следующей системы: [ Инициализация переменных (начальных условий) Импортируем пакет tensorflow Python
Создаем интерактивную сессию Python
Далее объявляем инициализаторы. Одним из простейших вариантов является использование случайного равномерного распределения для инициализации переменных. Python
Теперь создаем переменные и передаем им объект инициализатора Python
Запустим для демонстрации 5 раз и выведем начальные значения переменных. Для запуска выполняем инициализацию всех переменных sess.run(tf.global_variables_initializer()) и вычисление начальных значений sess.run([x,y]) Python
Заметим, что вывод, скорее всего, будет другой, так как значения инициализируются случайным образом. Построение графа системы нелинейных уравнений Следующим шагом является создание графа, реализующего левую часть системы (в правой части должны быть 0). Граф формируется на базе созданных ранее переменных (x) и (y). При необходимости использования математических функций, их можно найти в пакете tf.math, например, квадратный корень. Так как в нашем случае использование функций необязательно, можно использовать обычные операторы умножения, сложения и др., предусмотрительно уже перегруженные для тензоров. Python
Выведем значения уравнений при последних значениях переменных, заданных ранее: Python
Поиск одиночного решения Теперь можно перейти к процессу поиска решения системы уравнений. По определению, необходимо, чтобы значений выражений левых частей (в нашем случае eq1 и eq2) были равны 0, а на практике имели минимальное отклонение от 0. Первым делом необходимо задать функцию потерь (E) и выбрать тип оптимизатора. Будем использовать среднеквадратичное отклонение в качестве функции потери и градиентный спуск в качестве оптимизатора. Python
Зададим (epsilon) меньше которого должна быть ошибка решения $latex E < epsilon Python
Предварительно инициализируем переменными новыми значениями и выполним оптимизацию. Python
Поиск всех решений Теперь, когда мы научились находить один какой-то корень, можно перейти к нахождению всех корней в рассматриваемой области. Для решения этой задачи необходимо запустить множество поисков корней, при разных начальных условиях. Для удобства сделаем функцию поиска корня, возвращающую историю поиска: Python
Тогда для каждого корня можно получить траекторию: Python
Теперь запустим поиск множество (100) раз, сохраняя найденные корни для дальнейшего анализа и построим траектории для получаемых корней. Python
На данный момент мы имеем 100 пар корней, среди которых, естественно, есть повторяющиеся. Теперь необходимо найти повторяющиеся корни. Предварительно выполним округление до десятых, т.к. шаг алгоритма оптимизации и целевая ошибка была 1 сотая. Кроме того, сразу сделаем NumPy массив из корней. Python
Следующей командой найдем уникальные корни, получив тем самым ответ:
Таким образом у системы имеется три решения в рассматриваемой области: ([-1.7, -0.3], [-1.6, 0.5], [1, 1]) Заключение Приведенные способ хоть и решает поставленную задачу, он не является единственно верным и оптимальным. Так, например, для решения систем с одним корнем не обязательно делать перебор. Кроме того, случайная инициализация вектора начальных условий не всегда является оптимальной. В целом подобным способом можно решать нелинейные системы алгебраических уравнений практически любой сложности с соответствующими оговорками. Код и статья в формате Jupiter Notebook. Источник: digiratory.ru Комментарии: |
|||||||||||||||||||||||||||||||