Занятие 12. Символьная регрессия и ... · 2016. 12. 12. ·...
TRANSCRIPT
-
Занятие 12. Символьная регрессия и автоматическое дифференцирование
Краткое содержание• Понятие символьной регрессии• Синтаксические деревья и обратная польская запись• Понятие генетического алгоритма• Символьная регрессия: практический пример• Дуальные числа и автоматическое дифференцирование
-
Часть 1. Символьная регрессия
2
-
Символьная регрессия - метод построения регрессионных моделей путём перебора суперпозиций заранее заданного набора функций
Достоинства:1. Возможно использовать в том случае, когда неизвестен вид
моделиНедостатки:1. Ресурсоёмкость2. Нередко полученные модели избыточно сложны
Для поиска оптимальной модели применяют так называемыегенетические алгоритмы.Привычная для нас запись формул сложна и неудобна дляиспользования в генетических алгоритмах (из-за разного приоритетаопераций, скобок и т.п.)
3
-
Синтаксическое дерево
𝒚 = 𝒙𝟐 − 𝟑𝒙 + 𝟐
^
𝒙 𝟐 𝟑 𝒙
∗
𝟐−
+
• Обычно получают в ходесинтаксического анализа формул
• Не требуется задание приоритетаопераций в самом дереве
• Расчёт с помощью рекурсии (т.е.спуск по поддеревьям)
4
-
Обратная польская запись
Традиционная (инфиксная) записьОбратная польская (постфиксная) запись
2*(3+5) – (6+7)/(8-9)3 5 + 2 * 6 7 + 8 9 - / -
3+5 = 8; 8*2 = 16
6+7 = 13; 8-9 = -1
13/-1 = -13;
16 – (-13) = 29
Вход
Стек
3 5 + 2 * 6 7 + 8 9 - / -
3 5
Вход
Стек
+ 2 * 6 7 + 8 9 - / -
8 2
Вход
Стек
* 6 7 + 8 9 - / -
16 6 7
Вход
Стек
+ 8 9 - / -
16 13 8 9
Вход
Стек
- / -
16 13 -1
Вход
Стек
/ -
16 -13
Вход
Стек
-
29
Вычисление выражения Вычисление выражения
Особенности обратной польской записи:• У операций отсутствует приоритет• Не нужны скобки• Все операции записываются
единообразно
Особенности работы со стеком1. Новые значения добавляются на
его вершину2. Операции берут значения с
вершины стека и помещают результат на вершину
5
-
Генетические алгоритмы
Генерация исходной (случайной) популяции
Отбор части популяции с использованием целевой
функции
Получение недостающей части популяции скрещиванием и
мутациями
Желаемый результат
достигнут?
Вернуть результат
ДА
НЕТ
Генетические алгоритмы –алгоритмы нелинейной оптимизации. Ключевые характеристики:• Работа с большим количеством
потенциальных решений («популяцией»)
• Использование целевой функции для отбора членов популяции
• Получение новых членов популяции операциями «скрещивания» (комбинированием) и «мутациями» (случайные изменения)
Ср. с процессом эволюции в живойприроде (идея генетическогоалгоритма была взята именно избиологии)
6
-
Пример символьной регрессии
Базовые операции1. Поместить в стек x2. Поместить в стек число3. Сложение и вычитание4. Умножение и деление (в виде
𝑥/(𝑦 + 𝛿))5. Возведение в степень (в виде
𝑥 𝑦)6. Унарный минус
Внимание! Они должны возвращать корректный результат при любых входных данных!
Члены популяцииВыражения в обратной польской
записи
СкрещиваниеШаг 1. Взять два случайных члена популяцииШаг 2. Разделить каждое выражение на две части и поменять их местамиA B + C D + * => (A+B)*(C+D)
C D / B A ^ + => (C/D)+B^A
Результат
A B + C / B A ^ + => (A+B)/C+B^A
C D D + * => C*(D+D)
Шаг 3. Внести случайные изменения («мутации» в коэффициенты и операции)
Функция приспособленности
𝑅𝑆𝑆 =
𝑖
𝑦𝑖 − ො𝑦𝑖2
7
-
Пример символьной регрессии
Результат регрессииX [-1.0409] + U- [2.0115] ^ [3.8315] [0.3417] ^ [0.6995] / [0.6995] ^ +
Упрощенный результат регрессии(X – 1.0409)^2.0115 + (3.8315^0.3417/0.6995)^0.6995 =
= (X – 1.0409)^2.0115 + 1.7701
𝑦 = 𝑥2 − 2𝑥 + 3
8
-
Часть 2. Автоматическое дифференцирование
9
-
Дифференцирование функции
Численное
𝑓′(𝑥) ≈𝑓 𝑥 + Δ𝑥 − 𝑓(𝑥)
Δ𝑥
Символьное
Преобразование выражений
Автоматическое
Использование дуальных чисел и особой
арифметики
Преимущества:• Нет ограничений на вид
функции (напр., допустимы методы Монте-Карло, бисекции и т.п.)
• ПростотаНедостатки:• Высокая погрешность
Преимущества:• Низкая погрешностьНедостатки:• Сложность• Функция должна быть
одним выражением
Преимущества:• Низкая погрешность• Относительная
простота• Допустимы циклы и
ветвления в функцииНедостатки:• Некоторые
ограничения на вид функции 10
-
Дуальные числа
Пусть 𝜀 ≠ 0 такое, что 𝜀2 = 0, а 𝑎 и 𝑏 – действительные числа. Тогда 𝑐 = 𝑎 + 𝑏𝜀 – дуальное число (англ. dual number)
Арифметические действия над дуальными числами• 𝑎 + 𝑏𝜀 + 𝑐 + 𝑑𝜀 = 𝑎 + 𝑐 + 𝑏 + 𝑑 𝜀• 𝑎 + 𝑏𝜀 𝑐 + 𝑑𝜀 = 𝑎𝑐 + 𝑎𝑑𝜀 + 𝑏𝑐𝜀 + 𝑏𝑑𝜀2 = 𝑎𝑐 + 𝑏𝑐 + 𝑎𝑑 𝜀
•𝑎+𝑏𝜀
𝑐+𝑑𝜀=
(𝑎+𝑏𝜀)(𝑐−𝑑𝜀)
(𝑐+𝑑𝜀)(𝑐−𝑑𝜀)=
𝑎𝑐−𝑎𝑑𝜀+𝑏𝑐𝜀−𝑏𝑑𝜀2
𝑐2−𝑐𝑑𝜀+𝑐𝑑𝜀−𝑑2𝜀2=
𝑎𝑐+ 𝑏𝑐−𝑎𝑑 𝜀
𝑐2=
𝑎
𝑐+
𝑏𝑐−𝑎𝑑
𝑐2𝜀
• 𝑎 + 𝑏𝜀 𝑛 = exp 𝑛 ln 𝑎 + 𝑏𝜀 = exp 𝑛 ln 𝑎 +𝑛𝑏
𝑎𝜀 =𝑎𝑛 + 𝑏𝑛𝑎𝑛−1𝜀
Функция от дуального числа𝑓 𝑎 + 𝑏𝜀 = 𝑓 𝑎 + 𝑏𝑓′ 𝑎 ⋅ 𝜀Доказательство: через ряд Тейлора
𝑓 𝑎 + 𝑏𝜀 = 𝑓 𝑎 +𝑓′ 𝑎
1!𝑏𝜀 +
𝑓′′ 𝑎
2!𝑏𝜀 2
=0
+⋯ = 𝑓 𝑎 + 𝑏𝑓′ 𝑎 ⋅ 𝜀
11
-
Автоматическое дифференцирование
Автоматическое дифференцирование сводится к арифметике дуальных чисел. Алгоритм нахождения частной производной:
• Константы и параметры остаются действительными числами• Переменная, по которой ведется дифференцирование, заменяется
дуальным числом: 𝑥 = 𝑥(0) + 𝜀 (т.к. 𝜕𝑥
𝜕𝑥= 1).
• Результат – дуальное число. Действительная часть – значение функции,
мнимая (т.е. с 𝜀) – значение производной в точке 𝑥(0)
Пример𝑓 𝑥 = 6 5𝑥 + 2 2; 𝑥(0) = 2
Способ 1. Аналитический расчёт производной
𝑓′ 𝑥 = 60 5𝑥 + 2 = 300𝑥 + 120; 𝑓′ 𝑥 0 = 720
Способ 2. Автоматическое дифференцирование6 5 2 + 𝜀 + 2 2 = 6 12 + 5𝜀 2 = 6 144 + 120𝜀 + ถ25𝜀2
=0
= ต864𝑓(2)
+ ต720𝑓′(2)
𝜀
12
-
Автоматическое дифференцирование
Программная реализация
Преобразователи исходных текстов функций
Введение дуальных чисел как типа данных
Преимущества:• Высокое быстродействие кода• Применимо к любому языку
программированияНедостатки:• Автоматическая генерация кода• Низкая наглядность
Преимущества:• Простота и наглядность• Функции легко переделать
вручнуюНедостатки:• Язык должен поддерживать ООП
и перегрузку операторов (C++, MATLAB, Python, Ruby, Fortran-90 и др.)
• Снижение скорости за счет пользовательского типа данных
13
-
Понятие о классе в программировании
Класс – тип данных, состоящий из полей (переменных) и методов (функций)
classdef DualNumber % Имя класса
properties % Поля класса
a
b
end
methods % Методы (функции) класса
function obj = DualNumber(a, b) % Конструктор
obj.a = a; obj.b = b;
end
function r = log(o1) % Метод; o1 – экземпляр класса
r = DualNumber(builtin('log', o1.a), o1.b./o1.a);
end
function r = times(o1, o2) % Перегруженный оператор .*
r = DualNumber(o1.a.*o2.a, o1.b.*o2.a + o1.a.*o2.b);
end
% … КОД ПРОПУЩЕН …
end
end14
-
Класс для автоматического дифференцирования
>> x=DualNumber.CreateXValue(2)
x =
1 x 1 DualNumber matrix
(@ means epsilon)
2.0000+1.0000@
>> x.a
2
>> x.b
3
>> 0.5.*(2.*x + 3).^4
1 x 1 DualNumber matrix
(@ means epsilon)
1.00e+03 *
1.2005+1.3720@
>> 4*(2*2+3)^3
1372
Создание переменной
Нахождение производной
Внимание! Требуется Octave 4.0 или выше или MATLAB 7.6 и выше (для classdef)
Работа с матрицами
>> x=DualNumber.CreateXValue([0.5
1; 1.5 2])
x =
2 x 2 DualNumber matrix
(@ means epsilon)
0.5000+1.0000@ 1.0000+1.0000@
1.5000+1.0000@ 2.0000+1.0000@
>> (2.*x+3).^(3.*x-1)
ans =
2 x 2 DualNumber matrix
(@ means epsilon)
1.00e+05 *
0.0000+0.0001@ 0.0003+0.0014@
0.0053+0.0346@ 0.1681+1.2212@
15
-
Класс для автоматического дифференцирования
xv = DualNumber.CreateXValue(-3:0.01:3);
f = xv.^3;
close all;
plot(xv.a, f.b, 'k-', 'LineWidth', 2);
hold on;
plot(xv.a, f.a, 'r-', 'LineWidth', 2);
hold off;
legend('f''(x)', 'f(x)');
16