16
Занятие 12. Символьная регрессия и автоматическое дифференцирование Краткое содержание Понятие символьной регрессии Синтаксические деревья и обратная польская запись Понятие генетического алгоритма Символьная регрессия: практический пример Дуальные числа и автоматическое дифференцирование

Занятие 12. Символьная регрессия и ... · 2016. 12. 12. · Занятие 12. Символьная регрессия и автоматическое дифференцирование

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

  • Занятие 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