Množiny a relace: stavebnice, ze které se skládají definice v AI
Množiny, podmnožiny, operace, kartézský součin, relace, ekvivalence a uspořádání — s Vennovými diagramy, maticí relace a tím, k čemu je to všechno v umělé inteligenci.
Série Základy AI Díl 5 z 83
- Mapa umělé inteligence: co je co a jak to do sebe zapadá
- Stručná historie umělé inteligence: od Turinga po jazykové modely
- Data, model, trénink, inference: základní pojmy na jednom příkladu
- Jak číst matematický zápis: symboly, indexy, sumy a kvantifikátory
- Množiny a relace: stavebnice, ze které se skládají definice v AI
- Funkce a zobrazení: proč je každý model v AI funkce
- Logika a důkazy: pravidla, podle kterých se v AI uvažuje
- Grafy a stromy: struktura, na které stojí hledání i neuronové sítě
- Lineární algebra pro strojové učení: vektory, matice a proč AI hlavně násobí
- Derivace, gradient a řetízkové pravidlo: jak model zjistí, kterým směrem se učit
- Gradientní sestup: jak se model učí
- Co je pravděpodobnost: od hodu kostkou ke Kolmogorovovým axiomům
- Podmíněná pravděpodobnost a Bayesova věta: jak změnit odhad, když se dozvíte něco nového
- Náhodná veličina a distribuční funkce: jedna funkce, která o rozdělení řekne všechno
- Funkce hustoty a pravděpodobnostní funkce: proč má spojitá veličina v bodě pravděpodobnost nula
- Střední hodnota, rozptyl a kovariance: kde rozdělení leží, jak je široké a co s čím souvisí
- Přehled pravděpodobnostních rozdělení: Bernoulli, binomické, Poisson, rovnoměrné, normální a exponenciální
- Zákon velkých čísel a centrální limitní věta: proč se průměry chovají tak předvídatelně
- Statistika a odhady parametrů: maximální věrohodnost, MAP a intervaly spolehlivosti
- Teorie informace: entropie, křížová entropie a KL divergence — odkud se berou ztrátové funkce
- Prohledávání stavového prostoru: BFS, DFS, UCS a A* s animacemi
- Hry a protivník: minimax, alfa-beta ořezávání a Monte Carlo tree search
- Splňování omezujících podmínek: backtracking, propagace omezení a AC-3 na sudoku a mapě krajů
- Logika a znalostní systémy: dopředné a zpětné řetězení, rezoluce a expertní systémy
- Plánování: STRIPS, svět kostek, heuristiky z relaxace a plánování v AI agentech
- Lokální hledání a simulované žíhání: obchodní cestující přes krajská města
- Genetické algoritmy: populace, křížení, mutace a výběr na batohu na výlet
- Evoluční strategie a genetické programování: od pravidla jedné pětiny po Keplerův zákon
- Optimalizace mravenčí kolonií: jak feromonová stopa najde krátkou cestu
- Optimalizace hejnem částic: setrvačnost, vlastní zkušenost a zkušenost hejna
- Neuroevoluce: evoluce vah i tvaru neuronových sítí a algoritmus NEAT
- Fuzzy množiny a funkce příslušnosti: jak zapsat „trochu teplo“
- Fuzzy logika a pravděpodobnost: proč „trochu teplo“ neznamená „pravděpodobně teplo“
- Fuzzy logika: t-normy, implikace a pravidla KDYŽ–PAK
- Fuzzy řízení: Mamdani a Sugeno od ventilátoru po kyvadlo na vozíku
- Fuzzy shlukování: algoritmus fuzzy c-means a body mezi shluky
- Neuro-fuzzy systémy (ANFIS): fuzzy pravidla, která se učí z dat
- Markovovy řetězce: přechodová matice, stacionární rozdělení a PageRank
- Skryté Markovovy modely: Viterbiho algoritmus a nepoctivé kasino
- Bayesovské sítě: proč je tráva mokrá a co z toho plyne pro postřikovač
- Kalmanův filtr: jak z nepřesných měření odhadnout, kde auto je a jak rychle jede
- Druhy strojového učení: s učitelem, bez učitele, s částečným učitelem a další
- Přeučení a regularizace: proč model, který zná data nazpaměť, selže
- Vyhodnocení modelu: křížová validace, F1 a křivka ROC
- Shlukování a snížení dimenze: k-means, PCA a t-SNE
- Klasifikace a regrese: dvě úlohy učení s učitelem
- Lineární regrese: nejmenší čtverce geometricky i maticově
- Polynomiální a nelineární regrese: jak přímku ohnout
- Logistická regrese: sigmoida, šance a křížová entropie
- Vícetřídní klasifikace a softmax: od dvou tříd k mnoha
- Naivní Bayesův klasifikátor: spamový filtr, který funguje lépe, než by měl
- Ztrátové funkce: co přesně model minimalizuje
- Rozhodovací stromy a k nejbližších sousedů: modely bez vzorců
- Ansámbly: náhodný les a gradient boosting
- SVM a jádrový trik: nejširší hranice a jak ji ohnout
- Signál a vzorkování: proč platí Nyquistův teorém
- Fourierova transformace: rozklad signálu na frekvence
- Filtry a konvoluce: vyhlazení, hrany a odstranění šumu
- Zvuk a řeč: spektrogram, melová škála a MFCC
- Obraz jako signál: pixely, barvy, konvoluce a hrany
- Perceptron a umělý neuron: nejjednodušší neuronová síť a co neumí
- Neuronová síť od nuly: zpětné šíření chyby krok za krokem
- Aktivace, inicializace a normalizace: drobnosti, na kterých hluboká síť stojí
- Konvoluční sítě: jak síť poznává obrázky
- Rekurentní sítě: paměť pro posloupnosti a mizející gradient
- LSTM a GRU: brány, které rozhodují, co si síť zapamatuje
- Autoenkodéry: síť, která se učí data stlačit a zase rozbalit
- Embeddingy a word2vec: jak se slovo stane vektorem
- Mechanismus pozornosti: jak se model naučí, kam se dívat
- Transformery a velké jazykové modely: architektura krok za krokem
- Tokenizace: jak se text rozseká na kousky pro model
- Předtrénování a škálování: proč větší model a víc dat funguje
- Doladění a RLHF: jak se z doplňovače textu stane asistent
- Prompty, kontext a RAG: jak modelu dát správné informace
- Variační autoenkodéry (VAE): nové obrázky ze spojitého latentního prostoru
- Generativní adversariální sítě (GAN): padělatel proti detektivovi
- Difúzní modely: jak se z čistého šumu stane obrázek
- Markovovy rozhodovací procesy: stavy, akce, odměny a Bellmanovy rovnice
- Q-learning a DQN: učení hodnoty akcí od tabulky po neuronovou síť
- Policy gradient a PPO: učení přímo strategie
- Jak funguje AI agent: jazykový model ve smyčce s nástroji
- Programování s AI agenty: zadání, testy a kontrola
- Vyhodnocení a bezpečnost AI systémů: jak měřit a jak hlídat
Celá osnova série 83 z 83 témat hotovo
- Co je množina, podmnožina a kartézský součin — a proč podmnožin roste exponenciálně.
- Co je relace, jaké má vlastnosti a jak ji nakreslit jako matici a jako graf.
- Proč je klasifikace rozklad na třídy ekvivalence a model funkce — zvláštní relace.
Co se hodí znát předem: Jak číst matematický zápis: symboly, indexy, sumy a kvantifikátory
Množiny a relace jsou stavebnice, ze které se skládá skoro každá definice v AI. Stavový prostor je množina stavů, přechody mezi nimi jsou relace, trénovací data jsou množina dvojic a klasifikace rozděluje vstupy do tříd. Kdo rozumí těmhle dvěma pojmům, čte definice v dalších dílech jako běžný text.
Zápis symbolů (∈, ⊆, ∪, ×) jsme probrali v předchozím díle. Tady půjdeme pod povrch: co přesně znamenají, jaké mají vlastnosti a k čemu jsou v umělé inteligenci dobré.
1. Co je množina
Definice — množina a prvek
Množina je výchozí pojem, který se dál nerozkládá (podobně jako bod v geometrii): je to soubor navzájem různých objektů, kterým říkáme její prvky. Pro množinu A a libovolný objekt x píšeme
x ∈ A — „x je prvkem A“, x ∉ A :⇔ ¬(x ∈ A) — „x není prvkem A“.
Od množiny požadujeme dvě věci:
- pro každý objekt x platí právě jedno z tvrzení x ∈ A, x ∉ A — o členství je vždy jednoznačně rozhodnuto;
- množina je plně určena svými prvky — nic dalšího (pořadí, počet opakování) k ní nepatří; přesně to říká definice rovnosti níže.
Množina je pytel, do kterého něco dáte. Zajímá nás jen to, co v pytli je — ne v jakém pořadí jste to tam dali, ani kolikrát. Dvě kuličky téže barvy jsou pro množinu jedna barva.
Množinu zapíšeme buď výčtem prvků ve složených závorkách — A = {1, 2, 3} nebo {↑, →, ↓, ←} — nebo vlastností, kterou prvky splňují: {x ∈ ℕ : x je sudé}. Pro A = {1, 2, 3} platí 2 ∈ A a 5 ∉ A. Zápis vlastností umí popsat i nekonečné množiny a v AI se používá skoro vždy: „množina všech stavů, ze kterých se dá dojít do cíle“.
Definice — rovnost množin
Nechť A a B jsou množiny. A a B jsou si rovny, píšeme A = B, právě když
∀x : (x ∈ A ⇔ x ∈ B).
Množiny jsou tedy stejné, právě když mají přesně tytéž prvky.
Dva pytle jsou stejné, když je v nich totéž. Proto {1, 2, 2} = {2, 1} = {1, 2}: na pořadí ani na opakování nezáleží.
Definice — mohutnost a prázdná množina
Prázdná množina ∅ je množina, pro kterou platí
∀x : x ∉ ∅,
tj. nemá žádný prvek. Podle definice rovnosti je jen jedna.
Nechť A je množina. A je konečná, právě když A = ∅, nebo existují n ∈ ℕ a navzájem různé objekty a1, …, an (ai ≠ aj pro i ≠ j) takové, že A = {a1, …, an}. Mohutnost konečné množiny je číslo
|A| := n, |∅| := 0,
tedy počet jejích prvků.
Mohutnost je odpověď na otázku „kolik toho je v pytli“: |{1, 2, 3}| = 3. Prázdná množina je prázdný pytel — pořád je to množina, jen v ní nic není.
2. Podmnožiny a potenční množina
Z jedné množiny můžeme vybírat menší. K tomu potřebujeme tři pojmy, které na sebe navazují: podmnožinu, vlastní podmnožinu a potenční množinu.
Definice — podmnožina
Nechť A a B jsou množiny. A je podmnožinou B, píšeme A ⊆ B, právě když
∀x : (x ∈ A ⇒ x ∈ B).
Každý prvek A je tedy i prvkem B. Zápor píšeme A ⊄ B; podle negace kvantifikátorů to znamená ∃x : x ∈ A ∧ x ∉ B.
Podmnožina je výběr z pytle: vezmete některé věci z B a dáte je do menšího pytle A. Nic, co v B není, do A přidat nesmíte. Tak {1, 3} ⊆ {1, 2, 3}, ale {1, 4} ⊄ {1, 2, 3}, protože 4 v původní množině není. Každá množina je podmnožinou sama sebe a prázdná množina je podmnožinou každé množiny.
Definice — vlastní podmnožina
Nechť A a B jsou množiny. A je vlastní podmnožinou B, píšeme A ⊂ B, právě když
A ⊆ B ∧ A ≠ B.
V B tedy existuje aspoň jeden prvek, který v A není. (Některé učebnice píší ⊂ i pro obyčejnou podmnožinu; v této sérii znamená ⊂ vždy vlastní podmnožinu.)
Vlastní podmnožina je výběr, ve kterém aspoň něco chybí. {1, 3} ⊂ {1, 2, 3}, ale {1, 2, 3} vlastní podmnožinou sebe sama není — vzali jste úplně všechno.
Definice — potenční množina
Nechť A je množina. Potenční množina množiny A je množina
𝒫(A) := {S : S je množina ∧ S ⊆ A}.
Jejími prvky jsou tedy právě všechny podmnožiny A (vždy i ∅ a A sama).
Věta. Nechť A je konečná množina. Pak |𝒫(A)| = 2|A| (důkaz níže).
Potenční množina je seznam všech výběrů, které se z pytle dají udělat — včetně prázdného výběru a výběru všeho. Proč jich je 2n: u každého prvku se rozhodnete, jestli ho do výběru dáte, nebo ne. To jsou dvě možnosti pro každý prvek, pro tři prvky 2 · 2 · 2 = 23 = 8, pro deset prvků už 210 = 1024 (barvy podle vzorce níže).
Pro A = {a, b, c} je 𝒫(A) = {∅, {a}, {b}, {c}, {a, b}, {a, c}, {b, c}, {a, b, c}} — celkem 8 podmnožin. Tenhle exponenciální růst potkáte v AI na každém kroku. Model, který si má vybrat, které z 50 příznaků použije, má na výběr 250 — přes biliardu možností. Proto se výběr příznaků nedělá zkoušením všech kombinací.
|𝒫(A)| = 2|A|
- |𝒫(A)|
- počet všech podmnožin — kolik různých výběrů z A existuje; to chceme spočítat
- 2
- u každého prvku jsou právě dvě možnosti, „ve výběru je“ a „ve výběru není“ — proto základ 2
- |A|
- počet prvků = počet nezávislých rozhodnutí; nezávislé volby se násobí, a n krát vynásobená dvojka je mocnina
Věta — počet podmnožin (s důkazem)
Věta. Nechť n ∈ ℕ a A = {a1, …, an}, kde prvky a1, …, an jsou navzájem různé (tj. |A| = n). Pak |𝒫(A)| = 2n. (Pro A = ∅ je 𝒫(∅) = {∅} a |𝒫(∅)| = 1 = 20.)
Důkaz. Každé podmnožině S ⊆ A přiřadíme charakteristický vektor (b1, …, bn) ∈ {0, 1}n, kde bi = 1, právě když ai ∈ S. Různé podmnožiny mají různé vektory a každý vektor nějaké podmnožině patří — přiřazení je vzájemně jednoznačné. Podmnožin je tedy stejně jako vektorů z nul a jedniček délky n, a těch je 2 · 2 · … · 2 = 2n. ∎
Z důkazu rovnou plyne postup, jak všechny podmnožiny vypsat: projdeme čísla 0 až 2n − 1 a jejich zápis ve dvojkové soustavě čteme jako charakteristický vektor.
def vsechny_podmnoziny(prvky): # prvky = [a1, ..., an]
n = len(prvky)
for k in range(2 ** n): # k = 0, 1, ..., 2^n − 1
yield {prvky[i] for i in range(n)
if (k >> i) & 1} # i-tý bit čísla k: je a_i ve výběru?
Příklad — podmnožina číslo 5 z {a, b, c}
5 = 1 · 20 + 0 · 21 + 1 · 22, tedy bity (b1, b2, b3) = (1, 0, 1).
Bit 1 u a a u c, bit 0 u b ⇒ podmnožina {a, c}.
Číslo 0 dá ∅, číslo 7 = 1112 dá celé {a, b, c} — a mezi tím je dohromady 8 čísel, tedy 8 podmnožin.
3. Operace s množinami
Definice — sjednocení, průnik, rozdíl, doplněk
Nechť A a B jsou množiny. Definujeme množiny
- sjednocení A ∪ B := {x : x ∈ A ∨ x ∈ B},
- průnik A ∩ B := {x : x ∈ A ∧ x ∈ B},
- rozdíl A ∖ B := {x : x ∈ A ∧ x ∉ B}.
Prvek tedy leží v A ∪ B, právě když leží aspoň v jedné z množin, v A ∩ B, právě když leží v obou, a v A ∖ B, právě když leží v A, ale ne v B. Množiny s A ∩ B = ∅ se nazývají disjunktní.
Nechť navíc U je množina (základní množina, „vesmír“) a A ⊆ U. Doplněk množiny A vzhledem k U je množina
Ac := U ∖ A = {x ∈ U : x ∉ A}.
Věta (De Morganovy zákony). Nechť U je množina a A, B ⊆ U. Pak (A ∪ B)c = Ac ∩ Bc a (A ∩ B)c = Ac ∪ Bc (doplňky vzhledem k U).
Sjednocení je „buď, nebo, nebo obojí“, průnik „obojí zároveň“, rozdíl „tohle, ale ne tamto“ a doplněk „všechno ostatní“. De Morganův zákon říká, že „není pravda, že prší nebo sněží“ je totéž jako „neprší a nesněží“.
V praxi AI se s průniky počítá třeba při hodnocení modelu. Když P je množina e-mailů, které model označil jako spam, a S množina e-mailů, které spam skutečně jsou (obě konečné a neprázdné), pak přesnost (precision) je |P ∩ S|/|P| — kolik z označených byl opravdu spam — a úplnost (recall) |P ∩ S|/|S| — kolik spamu model zachytil.
přesnost = |P ∩ S|/|P| úplnost = |P ∩ S|/|S|
- |P ∩ S|
- zásahy — e-maily, které model označil a spam opravdu jsou; v čitateli obou vzorců, protože obě míry počítají jen úspěchy
- |P|
- všechno, co model označil; dělíme tím, když se ptáme „můžu označení věřit?“ — falešné poplachy zvětší jmenovatel a přesnost klesne
- |S|
- všechen skutečný spam; dělíme tím, když se ptáme „nic neuteklo?“ — přehlédnutý spam zvětší jmenovatel a úplnost klesne
Věta — princip inkluze a exkluze (s důkazem)
Věta. Nechť A a B jsou konečné množiny. Pak |A ∪ B| = |A| + |B| − |A ∩ B|.
Důkaz. A ∪ B se skládá ze tří disjunktních částí: A ∖ B, A ∩ B a B ∖ A. Přitom |A| = |A ∖ B| + |A ∩ B| a |B| = |B ∖ A| + |A ∩ B|. Součet |A| + |B| tedy obsahuje všechny tři části, ale průnik dvakrát; jedno odečtení |A ∩ B| to napraví. ∎
|A ∪ B| = |A| + |B| − |A ∩ B|
- |A ∪ B|
- kolik prvků je aspoň v jedné z množin — to chceme
- |A|
- započítá všechno z A, včetně společné části
- |B|
- započítá všechno z B — a společnou část podruhé
- − |A ∩ B|
- oprava: průnik jsme sečetli dvakrát, tak ho jednou odečteme, aby každý prvek platil jednou
Příklad — přesnost, úplnost a Jaccardův index
Model označil |P| = 50 e-mailů, skutečného spamu je |S| = 40 a v obou množinách je |P ∩ S| = 36 e-mailů.
Barvy podle vzorce přesnosti a úplnosti:
přesnost = 36/50 = 0,72 — 14 označených e-mailů byl falešný poplach,
úplnost = 36/40 = 0,90 — 4 spamy model propustil.
Podle inkluze a exkluze (barvy podle jejího vzorce) |P ∪ S| = 50 + 40 − 36 = 54. Poměr průniku a sjednocení je Jaccardův index (v počítačovém vidění IoU, „intersection over union“, kterým se hodnotí, jak dobře rámeček detektoru sedí na objekt): pro konečné množiny P, S, z nichž aspoň jedna je neprázdná,
J(P, S) := |P ∩ S|/|P ∪ S| = 36/54 = 2/3 ≈ 0,667.
4. Kartézský součin a n-tice
Definice — uspořádaná dvojice a kartézský součin
Nechť a, b jsou libovolné objekty. Uspořádaná dvojice (a, b) je objekt s první složkou a a druhou složkou b, pro který platí: pro všechny objekty a, b, c, d
(a, b) = (c, d) ⇔ a = c ∧ b = d.
Na rozdíl od množiny {a, b} = {b, a} tedy na pořadí záleží. (Čistě množinově se dvojice zavádí jako (a, b) := {{a}, {a, b}} — Kuratowského definice, která právě tuhle vlastnost má.)
Nechť A a B jsou množiny. Kartézský součin A a B je množina
A × B := {(a, b) : a ∈ A ∧ b ∈ B}.
Jsou-li A, B konečné, platí |A × B| = |A| · |B|.
Obecně: nechť n ∈ ℕ a A1, …, An jsou množiny. n-tice (a1, …, an) má vlastnost (a1, …, an) = (b1, …, bn) ⇔ ∀i ∈ {1, …, n} : ai = bi a
A1 × … × An := {(a1, …, an) : ai ∈ Ai pro i = 1, …, n}, An := A × … × A (nkrát).
Kartézský součin je tabulka všech kombinací. Tři trička a dvoje kalhoty dávají 3 · 2 = 6 oblečení. Souřadnice bodu v rovině jsou dvojice z ℝ × ℝ = ℝ2.
Kartézský součin je v AI všude. Trénovací data s učitelem jsou podmnožina X × Y — dvojice (vstup, správná odpověď). Fotka 28 × 28 pixelů je bod v ℝ784. A u úlohy prohledávání je přechodová funkce definovaná na S × A — na dvojicích (stav, akce).
Příklad — kolik je dvojic (stav, akce)
Robot na mřížce 3 × 3 má |S| = 9 stavů (políček) a |A| = 4 akce {↑, →, ↓, ←}.
|S × A| = |S| · |A| = 9 · 4 = 36.
Tabulka, která má pro každou dvojici (stav, akce) jedno číslo — třeba odhad, jak dobrá je ta akce v tom stavu — má tedy 36 políček. Proč se počty násobí: ke každému z 9 stavů lze přidat kteroukoli ze 4 akcí, takže dvojice tvoří 9 řádků po 4.
5. Relace
Definice — relace
Nechť A a B jsou množiny. Binární relace mezi A a B je libovolná množina R, pro kterou
R ⊆ A × B.
Pro a ∈ A a b ∈ B píšeme a R b :⇔ (a, b) ∈ R a čteme „a je v relaci R s b“.
Relace mezi A a A, tj. R ⊆ A × A, se nazývá relace na množině A.
Relace je seznam dvojic, které „k sobě patří“. Kdo je čí rodič, které město má přímé spojení s kterým, který stav vede do kterého. Nic víc — jen seznam dvojic.
Relaci na malé množině můžeme nakreslit dvěma způsoby. Vezměme relaci „a dělí b“ (b je násobkem a) na množině {1, …, 6}. Jako matici: v řádku a a sloupci b je tečka, když a dělí b. A jako orientovaný graf: šipka z a do b.
matice: řádek a, sloupec b
graf: šipka a → b (bez smyček a → a)
Relace má 14 dvojic. V AI potkáte obě podoby: matice relace je to, s čím počítá počítač (matice sousednosti grafu, matice podobnosti), graf je to, co si nakreslí člověk. Přechody mezi stavy v prohledávání jsou relace na množině stavů a graf k nejbližších sousedů ze šíření štítků je relace „je mezi nejbližšími“.
Definice — matice relace
Nechť n ∈ ℕ, A = {a1, …, an} je množina s navzájem různými prvky a1, …, an a R ⊆ A × A relace na A. Matice relace R (vzhledem k tomuto očíslování prvků) je tabulka M ∈ {0, 1}n×n o n řádcích a n sloupcích s prvky
Mij := 1, je-li ai R aj, Mij := 0 jinak, pro i, j = 1, …, n.
Počet dvojic v relaci je počet jedniček v matici: ∑i=1n ∑j=1n Mij = |R|.
Věta — kolik je relací
Věta. Nechť A a B jsou konečné množiny. Pak mezi A a B existuje přesně 2|A| · |B| relací.
Důkaz. Relace je libovolná podmnožina A × B, relací je tedy |𝒫(A × B)| = 2|A × B| = 2|A| · |B|. ∎
Na {1, …, 6} je 6 · 6 = 36 možných dvojic a 236 = 68 719 476 736 relací. „Dělí“ je jedna z nich — ta se 14 jedničkami v matici.
6. Vlastnosti relací
Definice — vlastnosti relace na množině
Nechť A je množina a R ⊆ A × A relace na A. Relace R je
- reflexivní, právě když ∀a ∈ A : a R a;
- symetrická, právě když ∀a, b ∈ A : (a R b ⇒ b R a);
- antisymetrická, právě když ∀a, b ∈ A : ((a R b ∧ b R a) ⇒ a = b);
- tranzitivní, právě když ∀a, b, c ∈ A : ((a R b ∧ b R c) ⇒ a R c).
Antisymetrie není opak symetrie: relace „=“ je symetrická i antisymetrická zároveň.
Reflexivní: každý je v relaci sám se sebou. Symetrická: funguje to oběma směry. Antisymetrická: oběma směry jen tehdy, když jde o totéž. Tranzitivní: když vede cesta z a do b a z b do c, vede i přímo z a do c.
Pro relace na množině {1, …, 6} to vypadá takto — a z kombinace vlastností se pozná, o jaký druh relace jde:
| Relace | Reflexivní | Symetrická | Antisymetrická | Tranzitivní |
|---|---|---|---|---|
| a ≤ b | ano | ne | ano | ano |
| a dělí b | ano | ne | ano | ano |
| stejný zbytek po dělení 3 | ano | ano | ne | ano |
| |a − b| = 1 („sousedé“) | ne | ano | ne | ne |
Příklad — jak se vlastnost ověří nebo vyvrátí
Na matici relace se vlastnosti čtou přímo: reflexivní ⇔ na diagonále jsou samé jedničky (Mii = 1), symetrická ⇔ matice je souměrná podle diagonály (Mij = Mji), antisymetrická ⇔ mimo diagonálu nikdy nejsou jedničky na obou místech Mij a Mji.
Abychom vlastnost vyvrátili, stačí jediný protipříklad. „Sousedé“ nejsou tranzitivní: 1 R 2 (|1 − 2| = 1) a 2 R 1, ale 1 R 1 neplatí (|1 − 1| = 0). Nejsou ani reflexivní (1 R 1 neplatí) ani antisymetrické (1 R 2 a 2 R 1, přitom 1 ≠ 2).
Abychom ji dokázali, musíme projít všechny případy. „Dělí“ je tranzitivní: když b = ka a c = lb, pak c = (kl)a, takže a dělí c.
Definice — skládání relací a tranzitivní uzávěr
Nechť A je množina a R, Q ⊆ A × A jsou relace na A. Složení relací R a Q je relace
R ∘ Q := {(a, c) ∈ A × A : ∃b ∈ A : a R b ∧ b Q c}
— „z a se dá jedním krokem R a pak jedním krokem Q dojít do c“. (Pozor, pořadí v zápisu se v literatuře liší; u funkcí znamená g ∘ f „nejdřív f“, tady R ∘ Q „nejdřív R“.)
Mocniny relace R definujeme pro k ∈ ℕ rekurzí R1 := R, Rk+1 := Rk ∘ R. Tranzitivní uzávěr relace R je relace
R+ := ⋃k=1∞ Rk = R ∪ (R ∘ R) ∪ (R ∘ R ∘ R) ∪ …
Tedy a R+ c, právě když existují k ∈ ℕ a prvky b0, …, bk ∈ A s b0 = a, bk = c a bi−1 R bi pro i = 1, …, k — z a vede do c cesta po šipkách R délky aspoň 1.
Věta. Nechť R je relace na množině A. Pak R+ je nejmenší tranzitivní relace na A, která obsahuje R: platí R ⊆ R+, R+ je tranzitivní a pro každou tranzitivní relaci T na A s R ⊆ T je R+ ⊆ T.
Relace říká, kam se dá dojít jedním krokem, uzávěr, kam se dá dojít vůbec. V prohledávání je to rozdíl mezi „sousední stav“ a „dosažitelný stav“.
Uzávěr se počítá Warshallovým algoritmem: postupně povolí každý prvek k jako mezizastávku a doplní všechny zkratky i → k → j.
def tranzitivni_uzaver(A, M): # M[i][j] = 1, když i R j
for k in A: # k smí být mezizastávkou
for i in A:
for j in A:
if M[i][k] and M[k][j]: # cesta i → k → j ...
M[i][j] = 1 # ... dává dvojici (i, j)
return M # n^3 kroků pro n prvků
Pro „sousedy“ na {1, …, 6} vyjde uzávěr se všemi 36 dvojicemi: po krocích o jedna se dá z každého čísla dojít do každého, i zpátky do sebe (1 → 2 → 1). Relace „dělí“ už tranzitivní je, takže se uzávěrem nezmění — zůstane 14 dvojic.
7. Ekvivalence a rozklad na třídy
Definice — ekvivalence a rozklad
Nechť A je množina a R ⊆ A × A relace na A. R je ekvivalence, právě když je reflexivní, symetrická a tranzitivní. Je-li R ekvivalence a a ∈ A, je třída ekvivalence prvku a množina
[a] := {x ∈ A : x R a}.
Nechť A je množina. Rozklad množiny A je množina 𝒮 ⊆ 𝒫(A) podmnožin A (jejím prvkům říkáme části nebo třídy), která splňuje
- ∀S ∈ 𝒮 : S ≠ ∅ — žádná část není prázdná;
- ∀S, T ∈ 𝒮 : (S ≠ T ⇒ S ∩ T = ∅) — různé části jsou disjunktní;
- ⋃S ∈ 𝒮 S = A, tj. ∀x ∈ A ∃S ∈ 𝒮 : x ∈ S — části pokryjí celé A.
Každý prvek A tedy leží v právě jedné části.
Věta. Nechť A je množina.
- Je-li R ekvivalence na A, pak množina tříd {[a] : a ∈ A} je rozklad A.
- Je-li 𝒮 rozklad A, pak relace x ∼ y :⇔ ∃S ∈ 𝒮 : x ∈ S ∧ y ∈ S („patří do stejné části“) je ekvivalence na A a její třídy jsou právě části 𝒮.
Ekvivalence je „je v něčem stejný jako“ — stejná barva, stejný zbytek, stejná třída. Taková relace vždycky rozdělí množinu na přihrádky, které se nepřekrývají a dohromady pokryjí všechno. Každý prvek je přesně v jedné přihrádce.
[a] = {x ∈ A : x R a}
- [a]
- třída prvku a — přihrádka, do které a patří; jméno dostane podle libovolného svého člena
- x ∈ A
- kandidáti se berou jen z rozkládané množiny — přihrádky dělí A, nic jiného
- x R a
- podmínka členství: do přihrádky k a patří právě to, co je s a „stejné“
Věta — třídy se nepřekrývají (s důkazem)
Věta. Nechť A je množina, R ekvivalence na A a a, b ∈ A. Pak platí buď [a] = [b], nebo [a] ∩ [b] = ∅. Navíc a ∈ [a] pro každé a ∈ A.
Důkaz. Předpokládejme, že [a] ∩ [b] ≠ ∅, a ukážeme [a] = [b]. Pak existuje z ∈ [a] ∩ [b], tedy z R a a z R b. Ze symetrie a R z a z tranzitivity a R b. Pro každé x ∈ [a] je x R a a a R b, tedy x R b a x ∈ [b]; stejně naopak. Takže [a] = [b]. Reflexivita navíc dává a ∈ [a] — žádná třída není prázdná a každý prvek v nějaké je. ∎
Příklad — třídy zbytků po dělení 3
Na A = {0, …, 8} je x R a :⇔ x mod 3 = a mod 3, kde x mod 3 je zbytek po celočíselném dělení x třemi.
[4] = {x ∈ {0, …, 8} : x mod 3 = 4 mod 3 = 1} = {1, 4, 7} (barvy podle vzorce výše).
[1] = [7] = {1, 4, 7} — tatáž třída pod jiným jménem. Dohromady vzniknou 3 třídy po 3 prvcích: {0, 3, 6}, {1, 4, 7}, {2, 5, 8}; 3 + 3 + 3 = 9 = |A|.
Tohle je přesně to, co dělá klasifikace: rozdělí množinu všech možných vstupů na třídy — spam a ne-spam, pes, kočka a papoušek. A shlukování hledá rozklad dat, aniž by mu někdo řekl, jaké třídy jsou. Výsledek k-means z dílu o druzích učení je rozklad bodů na tři třídy.
8. Uspořádání
Definice — částečné a lineární uspořádání
Nechť A je množina a R ⊆ A × A relace na A. R je částečné uspořádání, právě když je reflexivní, antisymetrická a tranzitivní. Dvojici (A, R) pak říkáme částečně uspořádaná množina.
Prvky a, b ∈ A jsou srovnatelné, právě když a R b ∨ b R a. Částečné uspořádání R je lineární (úplné), právě když jsou srovnatelné všechny dvojice:
∀a, b ∈ A : a R b ∨ b R a.
Uspořádání říká, co je „před“ čím. U čísel podle velikosti se dá porovnat cokoliv s čímkoliv. U částečného uspořádání ne vždycky: 4 a 6 se navzájem nedělí, takže podle dělitelnosti nevíme, které je „menší“.
Částečné uspořádání se kreslí Hasseovým diagramem: menší prvky dole, větší nahoře a čára jen mezi bezprostředními sousedy — zbytek plyne z tranzitivity. Tady dělitelé čísla 12 uspořádaní dělitelností:
Definice — ostré uspořádání a pokrytí
Nechť A je množina a ≤ částečné uspořádání na A. Ostré uspořádání příslušné k ≤ je relace < na A daná pro a, b ∈ A předpisem
a < b :⇔ a ≤ b ∧ a ≠ b.
Prvek b ∈ A pokrývá prvek a ∈ A, píšeme a ⋖ b, právě když
a < b ∧ ¬∃c ∈ A : (a < c ∧ c < b),
tj. a je ostře pod b a mezi nimi neleží žádný další prvek. Hasseův diagram konečné částečně uspořádané množiny kreslí čáru (zdola nahoru) právě mezi dvojicemi a ⋖ b.
a ⋖ b ⇔ a < b ∧ ¬∃c ∈ A : a < c < b
- a ⋖ b
- „mezi a a b nakreslím čáru“ — to, co definujeme
- a < b
- ostře menší: a musí být pod b, a ne totéž — smyčky a ≤ a platí vždy, tak je nekreslíme
- ¬∃c ∈ A : a < c < b
- nic mezi nimi: kdyby tam nějaké c bylo, vztah a < b už plyne z tranzitivity přes c a čára by byla zbytečná
def hasseuv_diagram(A, mensi): # mensi(a, b) znamená a < b
cary = []
for a in A:
for b in A:
if mensi(a, b) and not any(mensi(a, c) and mensi(c, b) for c in A):
cary.append((a, b)) # b pokrývá a
return cary # patro prvku = nejdelší řetězec pod ním
Z diagramu je vidět, že 1 dělí všechno a 12 je dělitelné vším — ale 4 a 6 ani 2 a 3 srovnat nejde. Ostrých dvojic a < b je mezi šesti děliteli 12, diagram jich ale kreslí jen 7. Zbylých 5 — 1 < 4, 1 < 6, 1 < 12, 2 < 12 a 3 < 12 — se dají vyčíst po čarách, třeba 1 → 2 → 4. V AI se uspořádání objevují všude, kde se něco řadí nebo plánuje: pořadí výsledků vyhledávání, priority v okraji algoritmu A*, nebo závislosti mezi kroky plánu („nejdřív otevři dveře, pak projdi“). Graf návazností modulů v osnově této série je mimochodem také částečné uspořádání.
9. Funkce jako zvláštní relace
Definice — funkce
Nechť A a B jsou množiny. Funkce (zobrazení) z A do B, psáno f : A → B, je relace f ⊆ A × B, pro kterou platí
∀a ∈ A ∃! b ∈ B : (a, b) ∈ f,
kde ∃! čteme „existuje právě jedno“. Každý prvek a ∈ A je tedy v relaci s právě jedním prvkem b ∈ B; ten se značí f(a). Podrobněji o funkcích v dílu Funkce a zobrazení.
Funkce je relace, která na každou otázku odpoví právě jednou odpovědí. „Je rodičem“ funkce není — člověk může mít víc dětí. „Má matku“ funkce je — každý má právě jednu.
Příklad — funkcí je mezi relacemi málo
Na A = {1, 2, 3} je 23 · 3 = 29 = 512 relací. Funkce musí každému ze 3 prvků vybrat právě jeden ze 3 obrazů, nezávisle na ostatních: 3 · 3 · 3 = 33 = 27 funkcí.
V matici relace to znamená: v každém řádku je právě jedna jednička. Matice „dělí“ funkcí není — v řádku 1 má šest jedniček.
Tím se kruh uzavírá: model ve strojovém učení je funkce f : X → Y, tedy zvláštní relace mezi vstupy a výstupy. Funkcím a jejich vlastnostem se věnuje další díl osnovy.
10. Shrnutí
- Množina je soubor prvků bez pořadí a bez opakování; podmnožin n-prvkové množiny je 2n.
- Sjednocení, průnik, rozdíl a doplněk jsou „nebo“, „a“, „ale ne“ a „všechno ostatní“; na průnicích stojí přesnost a úplnost modelu.
- Kartézský součin dělá dvojice — z nich se skládají data (vstup, odpověď) i přechody (stav, akce).
- Relace je množina dvojic. Ekvivalence rozkládá množinu na třídy (klasifikace, shlukování), uspořádání určuje, co je před čím.
- Funkce je relace s právě jednou odpovědí — a model je funkce.
Máte na to jiný názor? Napište na support@coden-app.com.