Нечіткі множини й функції належності: як записати «трохи тепло»
Чітка межа і парадокс купи, нечітка множина і ступінь належності, форми функцій належності, лінгвістична змінна, носій, ядро та α-перерізи, операції Заде і модифікатори «дуже» та «трохи» — на температурі від холоду до спеки.
Серія Основи ШІ Частина 32 з 52
- Мапа штучного інтелекту: що є що і як усе це пов’язано
- Коротка історія штучного інтелекту: від Тюрінга до мовних моделей
- Дані, модель, тренування, інференс: основні поняття на одному прикладі
- Як читати математичний запис: символи, індекси, суми та квантори
- Множини й відношення: конструктор, з якого складаються означення в ШІ
- Функції й відображення: чому кожна модель у ШІ — це функція
- Логіка й доведення: правила, за якими міркують у ШІ
- Графи й дерева: структура, на якій тримаються пошук і нейронні мережі
- Лінійна алгебра для машинного навчання: вектори, матриці й чому ШІ передусім множить
- Похідні, градієнт і правило ланцюжка: як модель дізнається, у якому напрямку вчитися
- Градієнтний спуск: як навчається модель
- Що таке ймовірність: від кидка кубика до аксіом Колмогорова
- Умовна ймовірність і теорема Баєса: як змінити оцінку, коли дізнаєтеся щось нове
- Випадкова величина і функція розподілу: одна функція, яка каже про розподіл усе
- Функція щільності та функція маси ймовірності: чому неперервна величина має в точці ймовірність нуль
- Математичне сподівання, дисперсія і коваріація: де лежить розподіл, наскільки він широкий і що з чим пов’язано
- Огляд розподілів ймовірностей: Бернуллі, біноміальний, Пуассона, рівномірний, нормальний і експоненційний
- Закон великих чисел і центральна гранична теорема: чому середні поводяться так передбачувано
- Статистика й оцінювання параметрів: максимальна правдоподібність, MAP і довірчі інтервали
- Теорія інформації: ентропія, перехресна ентропія і KL-дивергенція — звідки беруться функції втрат
- Пошук у просторі станів: BFS, DFS, UCS і A* з анімаціями
- Ігри та суперник: мінімакс, альфа-бета відсікання і Monte Carlo tree search
- Задоволення обмежень: бектрекінг, поширення обмежень і AC-3 на судоку та мапі чеських країв
- Логіка й системи, засновані на знаннях: пряме і зворотне виведення, резолюція та експертні системи
- Планування: STRIPS, світ кубиків, евристики з релаксації та планування в AI-агентах
- Локальний пошук та імітація відпалу: комівояжер через обласні центри Чехії
- Генетичні алгоритми: популяція, схрещування, мутація і добір на рюкзаку для походу
- Еволюційні стратегії і генетичне програмування: від правила однієї п’ятої до закону Кеплера
- Оптимізація мурашиною колонією: як феромоновий слід знаходить короткий шлях
- Оптимізація роєм частинок: інерція, власний досвід і досвід рою
- Нейроеволюція: еволюція ваг і форми нейронних мереж та алгоритм NEAT
- Нечіткі множини й функції належності: як записати «трохи тепло»
- Нечітка логіка та ймовірність: чому «трохи тепло» не означає «імовірно тепло»
- Нечітка логіка: t-норми, імплікації та правила ЯКЩО–ТО
- Нечітке керування: Мамдані та Суґено від вентилятора до маятника на візку
- Нечітка кластеризація: алгоритм fuzzy c-means і точки між кластерами
- Нейро-нечіткі системи (ANFIS): нечіткі правила, які навчаються з даних
- Марковські ланцюги: матриця переходів, стаціонарний розподіл і PageRank
- Приховані марковські моделі: алгоритм Вітербі й нечесне казино
- Байєсівські мережі: чому трава мокра і що з цього випливає для дощувача
- Фільтр Калмана: як за неточними вимірюваннями оцінити, де авто і як швидко воно їде
- Види машинного навчання: з учителем, без учителя, з частковим залученням учителя та інші
- Промпти, контекст і RAG: як дати моделі правильну інформацію
- Варіаційні автокодувальники (VAE): нові зображення з неперервного латентного простору
- Генеративні змагальні мережі (GAN): фальшувальник проти детектива
- Дифузійні моделі: як із чистого шуму постає зображення
- Марковські процеси ухвалення рішень: стани, дії, винагороди й рівняння Беллмана
- Q-навчання і DQN: як навчитися цінності дій — від таблиці до нейронної мережі
- Policy gradient і PPO: навчання безпосередньо політики
- Як працює ШІ-агент: мовна модель у циклі з інструментами
- Програмування з AI-агентами: завдання, тести й перевірка
- Оцінювання і безпека систем ШІ: як вимірювати і як стежити
Повна програма серії Готово: 52 з 83 тем
- Що таке нечітка множина і чому ступінь належності — не ймовірність.
- Як слова на кшталт «тепло» чи «приємно» записуються функціями належності і як вони перекриваються.
- Як працюють нечіткі перетин, об’єднання й доповнення і чому не справджується закон виключеного третього.
Що варто знати заздалегідь: Множини й відношення: конструктор, з якого складаються означення в ШІ, Функції й відображення: чому кожна модель у ШІ — це функція
Скільки піщинок становлять купу? Мільйон — напевно. Одна — напевно ні. А якщо з купи забрати одну піщинку, це все ще купа — тож за цією логікою навіть одна піщинка була б купою. Цей парадокс знали ще давні греки, і він показує, що багато слів, якими ми говоримо про світ, не мають чіткої межі: високий, тепло, швидко, майже повно. Класична математика дає з ними раду погано, бо елемент або належить множині, або ні. 1965 року Лотфі Заде з Каліфорнійського університету в Берклі запропонував просте розв’язання: дозволити елементові належати множині трохи.
Цією частиною починається модуль про нечітку логіку. Вона продовжує частини Множини й відношення та Функції й відображення.
1. Чітка межа і її проблема
Означення — характеристична функція
Класична (чітка) множина A ⊆ X однозначно задається своєю характеристичною функцією χA : X → {0, 1}, де χA(x) = 1 для x ∈ A і 0 в іншому разі.
Чітка множина — це перелік із ясними «так» і «ні». Скажімо, «тепло» — це від 25 °C і вище. Тоді 25 °C — тепло, а 24,9 °C — ні, хоча різниці ніхто не відчує. Межа в одній точці довільна, і мала зміна входу дає стрибок у результаті.
2. Нечітка множина
Означення — нечітка множина (Заде, 1965)
Нечітка множина A на універсумі X задається функцією належності μA : X → [0, 1]. Число μA(x) — це ступінь належності елемента x до A; формально A = {(x, μA(x)) : x ∈ X}.
Чітка множина — окремий випадок, коли μA набуває лише значень 0 і 1.
Замість «належить, не належить» кожен елемент отримує число від нуля до одиниці: наскільки він належить множині. 28 °C — «тепло» повністю (1), 25 °C — наполовину (0,5), 20 °C — зовсім ні (0). Між ними належність змінюється плавно — жодного стрибка між 24,9 і 25.
Важливо, чим ступінь належності не є: це не ймовірність. Якщо 25 °C — «тепло» на 0,5, це не означає, що з п’ятдесятивідсотковим шансом тепло. Температура відома точно; нечітке саме слово. Різниці між розмитістю слова і невизначеністю випадку присвячено наступну частину.
3. Форми функцій належності
Означення — звичні функції належності
- Трикутна з параметрами a < b < c: зростає лінійно від 0 в a до 1 в b і спадає до 0 в c.
- Трапецієподібна з параметрами a ≤ b ≤ c ≤ d: зростає від a до b, між b і c дорівнює 1, спадає до d.
- Гауссова: μ(x) = e−(x − m)2 / 2s2 — гладкий пагорб із центром m і шириною s.
- Сигмоїдна: μ(x) = 1 / (1 + e−a(x − c)) — плавний перехід від 0 до 1 довкола точки c.
Форму обирають за тим, що природно і що легко обчислювати. На практиці найчастіше перемагають трикутники й трапеції: досить кількох чисел, кожен їх розуміє, а обчислення швидкі. Точна форма зазвичай важить менше, ніж здається, — важливо, де функція починається, де досягає вершини і де закінчується.
μ(x) = max( 0, min( (x − a) / (b − a), (c − x) / (c − b) ) )
- (x − a) / (b − a)
- ліве ребро — пряма, що в a має значення 0, а в b значення 1; ділення на довжину b − a гарантує, що вершина вийде рівно 1 незалежно від ширини
- (c − x) / (c − b)
- праве ребро — дзеркально: у b значення 1, у c значення 0
- min
- вибирає те ребро, яке саме нижче, — ліворуч від b праве ребро вище 1, праворуч від b ліве; тож мінімум «зрізає» вістря рівно в b
- max(0, …)
- поза інтервалом (a; c) ребра вийшли б від’ємними; але ступінь належності не може впасти нижче 0
trojuhelnik нижче. Для «тепло» (22, 28, 34) і 25 °C: min(3/6, 9/6) = 0,5.def trojuhelnik(a, b, c):
return lambda x: max(0.0, min((x - a) / (b - a), (c - x) / (c - b)))
def lichobeznik(a, b, c, d):
def mu(x):
if x < a or x > d:
return 0.0
if x < b:
return (x - a) / (b - a)
return 1.0 if x <= c else (d - x) / (d - c)
return mu
teplo = trojuhelnik(22, 28, 34)
print(teplo(25), teplo(28), teplo(31)) # 0.5 1.0 0.5
4. Лінгвістична змінна
Означення — лінгвістична змінна (Заде, 1975)
Лінгвістична змінна — це змінна, значеннями якої є слова. Вона задається назвою (наприклад, «температура»), універсумом X (0–40 °C) і множиною термів (холодно, приємно, тепло, спекотно), кожен з яких є нечіткою множиною на X.
Слова, якими ми описуємо температуру, перекриваються — і це нормально. 25 °C — трохи «приємно» і трохи «тепло», саме так, як сказала б людина.
Наша температура має чотири терми: холодно — трапеція (0, 0, 6, 14), приємно — трапеція (10, 17, 23, 28), тепло — трикутник (22, 28, 34) і спекотно — трапеція (30, 36, 40, 40). Вертикальна лінія перескакує між прикладовими температурами:
- 12 °C — «холодно» на 0,25 і «приємно» на 0,29: прохолодна весна, коли не можна вирішити.
- 25 °C — «приємно» на 0,6 і «тепло» на 0,5.
- 31 °C — «тепло» на 0,5 і вже «спекотно» на 0,17.
Приклад — належності крок за кроком
На кожному ребрі досить співвідношення «скільки вже пройдено ребром» до «яка довжина ребра»:
12 °C, холодно (0, 0, 6, 14) на спадному ребрі: (14 − 12) / (14 − 6) = 2/8 = 0,25
12 °C, приємно (10, 17, 23, 28) на зростаючому ребрі: (12 − 10) / (17 − 10) = 2/7 ≈ 0,29
25 °C, приємно на спадному ребрі: (28 − 25) / (28 − 23) = 3/5 = 0,6
25 °C, тепло (22, 28, 34) на зростаючому ребрі: (25 − 22) / (28 − 22) = 3/6 = 0,5
31 °C, тепло на спадному ребрі: (34 − 31) / (34 − 28) = 3/6 = 0,5
31 °C, спекотно (30, 36, 40, 40) на зростаючому ребрі: (31 − 30) / (36 − 30) = 1/6 ≈ 0,17
Решта термів має за цих температур належність 0 — температура лежить поза їхнім носієм.
Зверніть увагу, що належності однієї температури не мусять у сумі давати 1 (для 25 °C це 1,1). Нечіткі множини — не частки одного цілого, а незалежні відповіді на запитання «чи холодно?», «чи приємно?»…
5. Носій, ядро та α-перерізи
Означення — носій, ядро, висота, α-переріз
- Носій (support) — це {x : μA(x) > 0}: елементи, що належать A хоча б трохи.
- Ядро (core) — це {x : μA(x) = 1}: елементи, що належать повністю.
- Висота — це supx μA(x); множина з висотою 1 — нормальна.
- α-переріз для α ∈ (0, 1] — це чітка множина Aα = {x : μA(x) ≥ α}. Нечітка множина опукла, якщо всі її α-перерізи є інтервалами.
α-переріз — це «наскільки суворими ми хочемо бути». Переріз на рівні 0,5 містить температури, які приємні хоча б наполовину. З α-перерізів нечітку множину можна скласти назад — це горизонталі пагорба. І завдяки їм чітку математику можна застосувати й до нечітких множин: досить виконати її окремо на кожному рівні α.
Для «приємно» носій — відкритий інтервал (10; 28), ядро — [17; 23], а α-переріз на рівні 0,5 — інтервал [13,5; 25,5]. Множина нормальна (висота 1) і опукла — як усі наші терми. (Супремум sup в означенні висоти — це найменша верхня межа значень; для наших неперервних функцій на замкненому інтервалі це просто максимум.)
Aα = [ a + α (b − a) ; d − α (d − c) ]
- α
- рівень перерізу (на рисунку бурштинова лінія) — скільки належності ми вимагаємо; що він вищий, то далі від країв треба відійти, і переріз звужується
- a
- лівий край носія — звідси піднімається ліве ребро; при α → 0 переріз починається саме тут
- (b − a)
- ширина лівого ребра — на ньому належність зростає від 0 до 1, тож рівня α вона досягає, пройшовши частку α цієї ширини
- d
- правий край носія — звідси відлік іде назад ліворуч
- (d − c)
- ширина правого ребра — дзеркально: від d проходимо ліворуч частку α цієї ширини
Приклад — α-перерізи терма «приємно» (10, 17, 23, 28)
α = 0,5: [10 + 0,5 · 7; 28 − 0,5 · 5] = [13,5; 25,5]
α = 0,8: [10 + 0,8 · 7; 28 − 0,8 · 5] = [15,6; 24]
α = 1: [10 + 7; 28 − 5] = [17; 23] = ядро
Перерізи вкладені один в одного: що вище α, то менший інтервал, і кожен вищий лежить усередині нижчого. Назад нечітка множина складається як μA(x) = sup {α : x ∈ Aα} — належність точки дорівнює найвищому перерізу, до якого вона ще потрапляє.
Коли функцію належності задано не формулою, а, скажімо, виміряними точками, α-переріз обчислюють на густій сітці. Саме так це робить програма, що малює рисунки в цій частині:
def alfa_rez(mu, alfa, od=0.0, do=40.0, kroku=4000):
body = [od + i * (do - od) / kroku for i in range(kroku + 1)]
uvnitr = [x for x in body if mu(x) >= alfa]
return (uvnitr[0], uvnitr[-1]) if uvnitr else None # для опуклої множини — інтервал
prijemne = lichobeznik(10, 17, 23, 28)
print(alfa_rez(prijemne, 0.5)) # (13.5, 25.5)
6. Доповнення, перетин і об’єднання
Означення — операції Заде
μ¬A(x) = 1 − μA(x), μA ∩ B(x) = min(μA(x), μB(x)), μA ∪ B(x) = max(μA(x), μB(x)).
Для чітких множин ці формули дають саме класичні доповнення, перетин і об’єднання.
«Приємно й водночас тепло» настільки істинне, наскільки істинна слабша з обох частин; «приємно або тепло» — наскільки сильніша. Ланцюг міцний, як його найслабша ланка, а коли досить одного з двох, вирішує краще.
За 25 °C «приємно й тепло» дорівнює 0,5, а «приємно або тепло» — 0,6. Перетин сягає найбільше 0,545 близько 25,3 °C, де обидві криві перетинаються, — жодна температура не є і тим, і тим повністю.
μP ∩ T(x) = min( μP(x), μT(x) )
- μP(x)
- наскільки температура x — «приємно» (на рисунку зелена крива)
- μT(x)
- наскільки це «тепло» (бурштинова крива) — обидві належності обчислюються незалежно, кожна своєю функцією
- min
- «і водночас» може бути щонайбільше таким істинним, як слабша частина, — якби було більше, ми стверджували б про температуру більше, ніж витримує одне з двох слів; а для значень 0 і 1 min дає саме класичне «і»
Приклад — де перетин найвищий
Між 23 і 28 °C «приємно» спадає, а «тепло» зростає, тож мінімум найвищий там, де криві перетинаються:
(28 − x) / 5 = (x − 22) / 6
6 (28 − x) = 5 (x − 22) ⇒ 168 − 6x = 5x − 110 ⇒ x = 278/11 ≈ 25,27 °C
μ = (28 − 278/11) / 5 = 6/11 ≈ 0,545
Ліворуч від точки перетину нижче «тепло», праворуч — «приємно», тож мінімум там завжди спадає.
Тут нечіткі множини відрізняються від класичних у чомусь суттєвому. Для них справджуються майже всі відомі правила — комутативність, асоціативність, закони де Моргана, — але не закон виключеного третього. Перетин A ∩ ¬A не мусить бути порожнім: «приємно й водночас не приємно» за 13,5 °C має значення 0,5. Для розмитих слів це правильно: про температуру, яка приємна наполовину, можна водночас наполовину сказати, що вона не приємна. Інші варіанти перетину й об’єднання (так звані t-норми) з’являться в частині про нечітку логіку.
Теорема — закони де Моргана справджуються, виключене третє — ні
Для довільних нечітких множин A, B на X і кожного x ∈ X з операціями Заде справджується
- ¬(A ∩ B) = ¬A ∪ ¬B і ¬(A ∪ B) = ¬A ∩ ¬B,
- μA ∩ ¬A(x) ≤ ½ і μA ∪ ¬A(x) ≥ ½, причому рівність — тоді й лише тоді, коли μA(x) = ½.
Доведення. (1) Позначмо p = μA(x), q = μB(x) і без втрати загальності p ≤ q. Тоді 1 − min(p, q) = 1 − p, а оскільки 1 − p ≥ 1 − q, то й max(1 − p, 1 − q) = 1 − p. Другий закон — так само з переставленими min і max.
(2) Числа p і 1 − p у сумі дають 1, тож менше з них щонайбільше ½, а більше — щонайменше ½. ∎
Класичний закон виключеного третього вимагає A ∪ ¬A = X, тобто значення 1 всюди. Для нечіткої множини він справджується лише там, де μA дорівнює 0 або 1; найгірше — у точках із належністю ½: для «приємно» за 13,5 і 25,5 °C, де A ∩ ¬A і A ∪ ¬A мають значення 0,5.
Перевірка на числі: за 25 °C ¬(P ∩ T) = 1 − min(0,6; 0,5) = 0,5 і ¬P ∪ ¬T = max(0,4; 0,5) = 0,5.
7. Дуже тепло, трохи тепло
Означення — лінгвістичні модифікатори (Заде, 1972)
Концентрація («дуже»): μдуже A(x) = μA(x)2. Розтягування («трохи», «більш-менш»): μтрохи A(x) = √μA(x).
Піднесення числа між 0 і 1 до квадрата його зменшує — і тим більше, чим воно менше: 0,5 стає 0,25, але 1 лишається 1. Тому «дуже тепло» вужче й суворіше, ніж «тепло». Квадратний корінь, навпаки, множину розширює: 25 °C — «тепло» на 0,5, «трохи тепло» на 0,71 і «дуже тепло» лише на 0,25.
Означення — включення нечітких множин
Нечітка множина A є підмножиною B (A ⊆ B), якщо μA(x) ≤ μB(x) для кожного x ∈ X. Для чітких множин це звичайне включення: де χA = 1, там мусить бути й χB = 1.
μ(x)2 ≤ μ(x) ≤ √μ(x) для μ(x) ∈ [0, 1]
- μ2
- «дуже» (червона крива) — множення на число, не більше за 1, ніколи не збільшує, тож квадрат лежить під початковою кривою; найбільше забирає в середніх значень, нуль і одиницю лишає
- μ
- саме «тепло» (бурштинова крива) — вихідний терм, який модифікатори лише деформують; ні носій, ні ядро не змінюються
- √μ
- «трохи» (фіолетова крива) — корінь обернений до квадрата, тож піднімає те, що квадрат притискає: √0,25 = 0,5
Приклад — наскільки «дуже» звужує, а «трохи» розширює
α-переріз на рівні 0,5 для «тепло» (22, 28, 34) — це [25; 31]. Для модифікованих термів досить перевести рівень назад на початкове μ:
дуже тепло: μ² ≥ 0,5 ⇔ μ ≥ √0,5 ≈ 0,707 → [22 + 0,707 · 6; 34 − 0,707 · 6] ≈ [26,24; 29,76]
трохи тепло: √μ ≥ 0,5 ⇔ μ ≥ 0,25 → [22 + 0,25 · 6; 34 − 0,25 · 6] = [23,5; 32,5]
Інтервал «хоча б наполовину» має 6 °C для «тепло», близько 3,5 °C для «дуже тепло» і 9 °C для «трохи тепло».
8. Нечіткі множини на практиці
- Нечітке керування. Метро в японському Сендаї з 1987 року їздить із нечітким регулятором, який розганяє й гальмує плавніше, ніж людина. Близько 1990 року в Японії настала хвиля нечітких пральних машин, камер і кондиціонерів. Як такий регулятор працює, пояснить частина про нечітке керування.
- Обробка зображень і кластеризація. Піксель на межі двох областей може трохи належати обом; нечітка кластеризація відносить точки до кількох кластерів одночасно.
- Машинне навчання. М’які виходи класифікаторів або техніка label smoothing (замість упевненого «це кіт» — ціль «кіт на 0,9») не є нечіткими множинами в розумінні Заде, але поділяють із ними думку, що належність до класу не мусить бути лише 0 або 1.
- Мова. Мовні моделі щодня працюють зі словами на кшталт «доволі», «майже» чи «радше ні». Нечіткі множини — один із небагатьох інструментів, що надають таким словам точного, перевірного значення.
9. Підсумок
- Нечітка множина приписує кожному елементові ступінь належності з інтервалу [0, 1]; чітка множина — окремий випадок зі значеннями 0 і 1.
- Функції належності зазвичай мають форму трикутника, трапеції, гауссового пагорба або сигмоїди.
- Значеннями лінгвістичної змінної є слова — терми, які можуть перекриватися; 25 °C — «приємно» на 0,6 і «тепло» на 0,5.
- Носій, ядро та α-перерізи описують форму нечіткої множини чіткими множинами.
- Доповнення — це 1 − μ, перетин — мінімум, об’єднання — максимум; закон виключеного третього не справджується. Модифікатор «дуже» — це μ², «трохи» — √μ.
Хочете спробувати самі? Попросіть ШІ-агента намалювати функції належності для слів, якими ви описуєте власний день, — «рано», «пізно», «довго», — і спитайте кількох людей, де межу провели б вони.
Маєте іншу думку? Напишіть на support@coden-app.com.