Символьна регресія і ще один підхід

Символьна регресія вважається дуже цікавою. «Знайди мені функцію, яка буде найкраще підходити для рішення поставленої задачі». І на Хабре я вже зустрічав пост, в якому автор розглядав один з еволюційних алгоритмів у застосуванні до цієї проблеми (ось він).

Генетичне програмування дійсно є потужним методом. Але в цій статті я хочу розглянути інший (не менш цікавий) метод — граматична еволюція. Розповідати про нього довго не буду. Скажу лише те, що метод використовує вільну граматику у формі Бакуса-Наура, а також будь-еволюційний алгоритм як «движка» (я вибрав генетичний алгоритм). І метод дуже крутий!

Перейду відразу до прикладу. В якості робочої конячки я вибрав Осцилятор Дуффинга.

Опишу завдання. Є неоднорідне диференціальне рівняння другого порядку:

image

Робимо з нього однорідне (нефорсированный ОД):

image

Після приведення рівняння до нормальної форми Коші отримаємо наступну систему:

image

image

Вектор початкових умов дорівнюватиме [1,1]. Мета: отримати таку функцію u(t,x), яка за мінімальний час переведе систему зі стану [1,1] [0,0].

Код системи дифур:

Duffing = [
lambda t,x: x[1],
lambda t,x: -x[0] - x[0]**3 + u(t,x)
]

Залишилося розглянути граматику, яку я вибрав для методу:

grammar = {
'<expr>' : [ 
'(<expr>)<op>(<expr>)', '<val>', '<func1>(<expr>)'
],
'<op>' : [ 
'+', '-', '*', '/' 
],
'<val>' : [
'x2', 'x1', '(smallConst)', '(bigConst)' 
],
"<func1>": [
'minus','math.sin',
]
}

Вона примітивна, але дає потрібний результат. Зауважу, що smallConst — константа в інтервалі [0,1], а bigConst — константа в інтервалі [0,200].

Запускаємо генетичний алгоритм з параметрами

Довжина хромосоми(кожне число в хромосомі — цілочисельне значення в інтервалі від 0 до 200) = 10
Довжина популяції = 50.
Число ітерацій (тривалість еволюції) = 200.

Отримуємо наступний результат:

image

За 2.5 секунди система вийшла на задану умову.

u(t,x) = ((minus(x2))-((x1)*((0.69028))))*((11)) (досить зрозумілий вигляд, хоча багато дужок)

Для отримання середнього часу перерегулювання потрібно запускати алгоритм не один раз(це очевидно). Але в цій статті я хотів показати, що алгоритм працює(!!) і дає результат.

Висновок: Граматична еволюція — молодий, але потужний інструмент у вирішенні задач символьної регресії. Так, не існує математично точного методу вибору тієї чи іншої граматики для розв'язуваної задачі. Потрібно спиратися на досвід і проби з помилками. Але метод працює і часто видає прийнятний результат без оптимізованої граматики.

Якщо когось зацікавив ГЕ, то ось стаття авторів цього методу (може бути, незабаром переведу).

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.