Fuzzy shlukování: algoritmus fuzzy c-means a body mezi shluky
K-means a jeho ostré přiřazení, fuzzy c-means s příslušnostmi ke všem shlukům, fuzzifikátor m, koeficient rozkladu a Xieův–Beniho index pro volbu počtu shluků — a proč odlehlé body dostanou vysoké příslušnosti.
Série Základy AI Díl 36 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
- Jak funguje k-means a co zamlčí o bodech na rozhraní shluků.
- Jak fuzzy c-means počítá příslušnosti a středy a co dělá fuzzifikátor m.
- Jak zvolit počet shluků a kde fuzzy c-means selhává.
Co se hodí znát předem: Fuzzy množiny a funkce příslušnosti: jak zapsat „trochu teplo“, Druhy strojového učení: s učitelem, bez učitele, s částečným učitelem a další
Shlukování hledá v datech skupiny, o kterých předem nic nevíme: zákazníky s podobným nákupním chováním, oblasti stejné tkáně na snímku z magnetické rezonance, dokumenty o podobném tématu. Klasický algoritmus k-means přiřadí každý bod právě jedné skupině. Jenže skutečná data mívají body na rozhraní — zákazníka, který nakupuje trochu jako student a trochu jako rodič, pixel, ve kterém se potkává šedá a bílá hmota mozku. Fuzzy shlukování dovolí bodu patřit do víc skupin najednou, každé z nich trochu.
Navazuje na díly Fuzzy množiny a funkce příslušnosti a Druhy strojového učení, kde se shlukování objevilo jako typická úloha učení bez učitele.
1. Ostré shlukování: k-means
Definice — úloha k-means
Nechť d ≥ 1 a n ≥ 1 jsou přirozená čísla, x1, …, xn ∈ ℝd body a c ∈ ℕ, 1 ≤ c ≤ n, počet shluků. Přiřazení je zobrazení shluk : {1, …, n} → {1, …, c}, které bodu xi přiřadí číslo jeho shluku. Pro středy v1, …, vc ∈ ℝd a přiřazení shluk je cena
J(v1, …, vc, shluk) = ∑i=1n ‖xi − vshluk(i)‖2,
kde ‖·‖ je euklidovská vzdálenost (další definice). Úloha k-means je najít středy a přiřazení, pro které je J nejmenší možné.
Lloydův algoritmus (přibližné řešení úlohy k-means). Vstup: body x1, …, xn ∈ ℝd a počet shluků c. Výstup: středy v1, …, vc a přiřazení shluk. Kroky:
- Za počáteční středy zvol c navzájem různých bodů z x1, …, xn (náhodně).
- Přiřazení: pro každé i = 1, …, n zvol shluk(i) ∈ argminj ∈ {1, …, c} ‖xi − vj‖2; je-li nejbližších středů víc a je mezi nimi dosavadní střed bodu, ponech bod v jeho shluku.
- Zastavení: pokud se přiřazení oproti předchozímu průchodu nezměnilo, skonči a vrať středy a přiřazení.
- Středy: pro každé j = 1, …, c označ Sj = {i : shluk(i) = j} a je-li Sj ≠ ∅, polož vj = 1/|Sj| ∑i ∈ Sj xi (průměr bodů shluku; prázdný shluk střed nemění).
- Pokračuj krokem 2.
Rozmístíte do dat pár „vlajek“. Každý bod se přidá k té nejbližší. Pak se každá vlajka přestěhuje doprostřed svých bodů. Body se znovu přidají k nejbližší vlajce — a tak dál, dokud se nic nemění. Každý krok J zmenší, takže algoritmus jistě skončí, i když ne nutně v nejlepším možném rozkladu.
Definice — euklidovská vzdálenost
Nechť d ≥ 1 a x = (x1, …, xd), v = (v1, …, vd) ∈ ℝd. Euklidovská vzdálenost bodů x a v je nezáporné číslo
‖x − v‖ = √∑r=1d (xr − vr)2.
V rovině (d = 2) je to obyčejná délka úsečky, třeba od bodu M1 = (4,5; 2,5) ke středu shluku A (1,73; 2,31), jak ho níže najde fuzzy c-means: √2,772 + 0,192 ≈ 2,78. Shlukování pracuje se čtvercem ‖·‖2 — odpadne odmocnina a vzdálené body se trestají víc.
def kmeans(X, c):
V = c náhodně vybraných bodů z X # počáteční středy
while True:
shluk = [argmin_j ‖x − V[j]‖² for x in X] # krok přiřazení
if shluk se nezměnil: return V, shluk
for j in range(c): # krok středů
V[j] = průměr bodů x, pro které shluk(x) = j
Věta — Lloydův algoritmus skončí
Nechť x1, …, xn ∈ ℝd, 1 ≤ c ≤ n a Lloydův algoritmus běží podle definice výše (včetně pravidla, že při shodné vzdálenosti zůstane bod ve svém shluku). Pak
- žádný krok přiřazení ani krok středů nezvětší hodnotu J;
- algoritmus skončí po konečně mnoha průchodech.
Důkaz: Přiřazení: každý člen ‖xi − vshluk(i)‖2 se nahradí nejmenším ze všech ‖xi − vj‖2, takže se nezvětší. Středy: pro neprázdnou množinu indexů S jednoho shluku s průměrem x̄ = 1/|S| ∑i∈S xi a libovolné v ∈ ℝd platí rozklad
∑i∈S ‖xi − v‖2 = ∑i∈S ‖xi − x̄‖2 + |S| · ‖x̄ − v‖2
(smíšený člen 2 ∑ (xi − x̄) · (x̄ − v) je nulový, protože ∑ (xi − x̄) = 0). Součet je tedy nejmenší pro v = x̄. Rozkladů n bodů do c shluků je konečně mnoho a J při každé změně přiřazení ostře klesne (při shodné vzdálenosti necháme bod v jeho shluku), takže se žádný rozklad nezopakuje. ∎
Věta neříká nic o tom, zda nalezený rozklad je ten s nejmenším J — jen že algoritmus nebude cyklit.
Naše data: tři skupiny po 40 bodech — A vlevo dole, B vpravo a C nahoře —, čtyři body na rozhraní (M1–M4) a dva odlehlé body daleko od všeho (O1, O2). K-means se ustálil po čtyřech iteracích:
Shluky našel dobře, ale body na rozhraní musel rozhodnout: M1, M3 a M4 dal do B, M2 do A. Bod M3 přitom leží skoro přesně mezi B a C — k-means o tom neřekne nic. A oba odlehlé body spadly do shluku C, jako by k němu patřily stejně jako jeho jádro.
2. Fuzzy c-means
Definice — fuzzy c-means (Dunn 1973, Bezdek 1981)
Nechť x1, …, xn ∈ ℝd jsou body, c ∈ ℕ, 2 ≤ c < n, počet shluků a m ∈ ℝ, m > 1, fuzzifikátor. Matice příslušností je matice U = (uij) typu n × c (i = 1, …, n čísluje body, j = 1, …, c shluky), která splňuje
- uij ∈ [0, 1] pro všechna i, j;
- ∑j=1c uij = 1 pro každé i — každý bod rozdělí celkovou příslušnost 1 mezi shluky;
- 0 < ∑i=1n uij < n pro každé j — žádný shluk není prázdný a žádný nepohltí všechny body úplně.
Pro matici příslušností U a středy V = (v1, …, vc) ∈ (ℝd)c je cena
Jm(U, V) = ∑i=1n ∑j=1c uijm ‖xi − vj‖2.
Fuzzy c-means je úloha najít U a V s nejmenší cenou Jm a tento algoritmus pro její přibližné řešení. Vstup: body, c, m, přesnost ε > 0 a nejvyšší počet iterací. Výstup: U a V. Kroky:
- Zvol počáteční středy v1, …, vc (např. c různých náhodných bodů).
- Příslušnosti: pro všechna i, j spočítej dij = ‖xi − vj‖ (předpokládáme dij > 0) a uij = 1/∑k=1c (dij/dik)2/(m−1).
- Zastavení: pokud se od předchozího průchodu žádné uij nezměnilo o ε nebo víc, nebo byl vyčerpán počet iterací, skonči (po prvním průchodu se nekončí) a vrať U a V.
- Středy: pro každé j = 1, …, c polož vj = ∑i=1n uijm xi/∑i=1n uijm a pokračuj krokem 2.
Oba výpočetní kroky plynou z podmínek optimality (věta níže): každý minimalizuje Jm při pevné druhé skupině proměnných.
Každý bod rozdělí svou jedničku mezi všechny shluky — víc tomu, ke kterému má blíž. Střed shluku je vážený průměr všech bodů: body, které ke shluku patří silně, ho táhnou víc, body z jiných shluků jen nepatrně. Vzorec pro příslušnost porovnává vzdálenosti: je-li bod k jednomu středu dvakrát blíž než k druhému, dostane (při m = 2) čtyřikrát větší příslušnost.
Jm = ∑i=1n ∑j=1c uijm ‖xi − vj‖2, ∑j uij = 1
- Jm
- celková „cena“ rozkladu — algoritmus ji minimalizuje; malá je, když body patří hlavně ke středům, které mají blízko
- ∑i ∑j
- každý bod se počítá ke každému shluku — na rozdíl od k-means, kde se bral jen jeden shluk na bod
- uij
- příslušnost bodu i ke shluku j — váha, s jakou se vzdálenost do ceny započte
- m
- fuzzifikátor — bez mocniny (m = 1) by se vyplatilo dát celou jedničku nejbližšímu středu a vyšlo by zase k-means; s m > 1 se dělit vyplatí: bod stejně daleko od dvou středů zaplatí při m = 2 a rozdělení napůl jen (½2 + ½2) · d2 = ½d2 místo d2
- ‖xi − vj‖2
- čtverec vzdálenosti — co stojí mít bod „u“ tohoto středu; vzdálený střed vyjde draho
- ∑j uij = 1
- podmínka — bez ní by minimum bylo triviální: všechny uij = 0 a cena nula
uij = 1/∑k=1c ( dij/dik )2/(m−1)
- uij
- nová příslušnost bodu i ke shluku j při pevných středech
- dij/dik
- poměr vzdáleností — kolikrát je střed j dál než střed k; poměr (ne rozdíl) dělá výsledek nezávislým na měřítku dat
- exponent 2/m − 1
- jak ostře poměr rozhoduje — pro m = 2 je to 2, takže dvakrát bližší střed dostane čtyřikrát víc; pro m → 1 exponent roste nade všechny meze a vše dostane nejbližší střed
- ∑k
- srovnání se všemi středy včetně j samotného (člen k = j je 1) — díky tomu se příslušnosti bodu sečtou přesně na 1
Věta — odkud se oba kroky berou
Nechť x1, …, xn ∈ ℝd, c a m > 1 jsou jako v definici fuzzy c-means. Pak:
- Pro pevné středy v1, …, vc, pro které jsou všechny vzdálenosti dij = ‖xi − vj‖ kladné, nabývá Jm na množině matic s uij ≥ 0 a ∑j uij = 1 minima právě pro uij = 1/∑k=1c (dij/dik)2/(m−1).
- Pro pevnou matici U, ve které ∑i uijm > 0 pro každé j, nabývá Jm minima přes v1, …, vc ∈ ℝd právě pro vj = ∑i uijm xi/∑i uijm.
Důkaz. Příslušnosti při pevných středech. Jm je součet přes body a podmínky se týkají vždy jednoho řádku U, takže stačí pro jeden bod i minimalizovat ∑j uijm dij2 za podmínky ∑j uij = 1. Lagrangeova funkce je L = ∑j uijm dij2 − λ (∑j uij − 1). Z ∂L/∂uij = m uijm−1 dij2 − λ = 0 plyne uij = (λ/m)1/(m−1) · dij−2/(m−1). Dosazením do podmínky součtu se neznámá λ vykrátí a zbude
uij = dij−2/(m−1)/∑k dik−2/(m−1) = 1/∑k (dij/dik)2/(m−1).
Vyšla kladná čísla, takže podmínku uij ≥ 0 není třeba hlídat zvlášť. Funkce u ↦ um d2 je pro m > 1 a d > 0 na [0, 1] ostře konvexní, takže tento jediný stacionární bod je minimum. (Leží-li bod přesně ve středu, dij = 0, dostane k tomu shluku příslušnost 1; naše implementace to řeší tak, že vzdálenost nikdy neklesne pod 10−12.)
Středy při pevných příslušnostech. Jm je ve vj konvexní kvadratická funkce (ostře konvexní, protože ∑i uijm > 0) a ∂Jm/∂vj = −2 ∑i uijm (xi − vj) = 0 dává vj = ∑i uijm xi/∑i uijm. ∎
Každý krok tedy Jm při pevné druhé skupině proměnných minimalizuje a nemůže ho zvětšit — stejný argument jako u k-means. Bezdek a kol. (1987, oprava původní věty Bezdeka z roku 1980) ukázali, že posloupnost má hromadné body ve stacionárních bodech Jm (ne nutně v globálním minimu).
import numpy as np
def fcm(X, c, m=2.0, iteraci=100, eps=1e-5):
U = np.random.dirichlet(np.ones(c), size=len(X)) # náhodné příslušnosti, řádek = 1
for _ in range(iteraci):
W = U ** m
V = (W.T @ X) / W.sum(axis=0)[:, None] # středy jako vážené průměry
D = np.linalg.norm(X[:, None, :] - V[None, :, :], axis=2) + 1e-12
nove = 1 / ((D[:, :, None] / D[:, None, :]) ** (2 / (m - 1))).sum(axis=2)
if np.abs(nove - U).max() < eps:
return V, nove
U = nove
return V, U
3. Fuzzy c-means na našich datech
Barva bodu je teď směs barev shluků podle příslušností: čistě zelený bod patří jen do A, bod „mezi“ zelenou a oranžovou je zčásti v A a zčásti v B. Tečkované čáry ukazují, jak se středy stěhovaly — algoritmus se ustálil po devíti iteracích:
| Bod | k-means | A | B | C |
|---|---|---|---|---|
| M1 (4,5; 2,5) | B | 0,41 | 0,45 | 0,15 |
| M2 (3,3; 4,5) | A | 0,43 | 0,18 | 0,38 |
| M3 (5,8; 5) | B | 0,12 | 0,44 | 0,45 |
| M4 (4,6; 4) | B | 0,28 | 0,40 | 0,32 |
Teď je vidět, co k-means zamlčel. M1 je skoro napůl mezi A a B; M3 je vlastně o chlup víc v C než v B, ačkoli ho k-means dal do B; a M4 uprostřed trojúhelníku patří trochu do všech tří. Body v jádrech shluků mají příslušnost ke svému shluku blízko jedné. Středy vyšly prakticky stejně jako u k-means — fuzzy c-means nemění, kde shluky jsou, ale dodá k nim informaci, jak jistě do nich který bod patří.
Příklad — příslušnosti bodu M1 = (4,5; 2,5)
Středy po devíti iteracích: A ≈ (1,73; 2,31), B ≈ (7,12; 2,87), C ≈ (4,51; 7,11). Pro m = 2 stačí převrácené čtverce vzdáleností (barvy podle zjednodušeného vzorce pro m = 2 v popisku výše):
| Shluk | d2 | 1/d2 | u = 1/d2/0,3190 |
|---|---|---|---|
| A | 2,772 + 0,192 ≈ 7,72 | 0,1296 | 0,41 |
| B | 2,622 + 0,372 ≈ 7,03 | 0,1423 | 0,45 |
| C | 0,012 + 4,612 ≈ 21,25 | 0,0471 | 0,15 |
| součet | 0,3190 | 1,00 |
M1 je ke středům A a B skoro stejně daleko (7,72 proti 7,03), a proto se mezi ně dělí téměř napůl; C je třikrát dál (ve čtverci), a tak dostane jen zbytek.
4. Fuzzifikátor m
Definice — koeficient rozkladu
Nechť n ≥ 1, c ≥ 2 a U = (uij) je matice typu n × c s uij ∈ [0, 1] a ∑j=1c uij = 1 pro každé i (matice příslušností). Koeficient rozkladu (partition coefficient) je číslo
PC(U) = 1/n ∑i=1n ∑j=1c uij2.
Vždy platí 1/c ≤ PC(U) ≤ 1, přičemž
- PC(U) = 1, právě když je rozklad ostrý: v každém řádku je jedno uij = 1 a ostatní 0;
- PC(U) = 1/c, právě když uij = 1/c pro všechna i, j — každý bod patří do všech shluků stejně.
(Pro každý řádek je ∑j uij2 ≤ ∑j uij = 1 s rovností jen pro hodnoty 0 a 1, a podle Cauchyovy–Schwarzovy nerovnosti ∑j uij2 ≥ 1/c (∑j uij)2 = 1/c s rovností jen pro stejné hodnoty.)
Jedno číslo, které říká, jak „ostrý“ rozklad je. Pro tři shluky leží mezi 1/3 (všechno je rozmazané) a 1 (každý bod má jasný domov).
PC = 1/n ∑i ∑j uij2
- PC
- ostrost celého rozkladu, číslo z [1/c; 1]
- 1/n ∑i
- průměr přes body — aby šly porovnat datové sady různé velikosti
- ∑j uij2
- ostrost jednoho bodu — čtverec „odmění“ soustředěnou příslušnost: (1, 0, 0) dá 1, (⅓, ⅓, ⅓) jen ⅓; při pevném součtu 1 je součet čtverců nejmenší, když jsou všechny díly stejné
Pro m blízko 1 se fuzzy c-means blíží k-means: koeficient rozkladu je 0,98 a bod M4 patří ze 0,79 do B. Pro m = 2 je koeficient 0,84 a pro m = 5 jen 0,42 — barvy se slévají a i bod z jádra shluku A má k A příslušnost jen 0,45. Pro m → ∞ by všechny příslušnosti šly k 1/3. Nejčastěji se používá m = 2: dostatečně měkké, aby body na rozhraní byly vidět, a dost ostré, aby shluky zůstaly zřetelné.
Příklad — bod dvakrát blíž k jednomu ze dvou středů
Bod má ke středu 1 vzdálenost 1 a ke středu 2 vzdálenost 2. Ve vzorci pro příslušnost je člen k = 1 roven 1 a člen k = 2 má poměr 1/2, takže u1 = 1/1 + (1/2)2/(m−1) (barvy podle vzorce pro uij výše):
- m = 1,2: exponent 10, u1 = 1/1 + 1/1 024 ≈ 0,999 — prakticky ostré přiřazení,
- m = 2: exponent 2, u1 = 1/1 + 1/4 = 0,8,
- m = 5: exponent 0,5, u1 = 1/1 + 0,707 ≈ 0,586,
- m → ∞: exponent → 0, (1/2)0 = 1 a u1 → 1/2.
Obecně: pro m → 1+ jde exponent 2/m − 1 do nekonečna, poměry dij/dik < 1 jdou k nule a ty > 1 do nekonečna, takže nejbližší střed dostane 1 a ostatní 0 (k-means). Pro m → ∞ jde exponent k nule, všech c členů součtu jde k 1 a uij → 1/c.
5. Kolik shluků?
Počet shluků musíme algoritmu zadat. Když ho nevíme, pustíme ho pro různá c a porovnáme kvalitu rozkladů. K tomu se hodí koeficient rozkladu a Xieův–Beniho index.
Definice — Xieův–Beniho index
Nechť x1, …, xn ∈ ℝd, c ≥ 2, m > 1, U = (uij) matice příslušností typu n × c a v1, …, vc ∈ ℝd navzájem různé středy (typicky výsledek fuzzy c-means). Xieův–Beniho index je číslo
XB(U, V) = ∑i=1n ∑j=1c uijm ‖xi − vj‖2/n · minj ≠ k ‖vj − vk‖2.
Jmenovatel je kladný, protože středy jsou různé. Xie a Beni (1991) index zavedli s exponentem 2 (tj. pro m = 2); s obecným m se běžně používá ve stejném tvaru. Při porovnání rozkladů je lepší ten s menším XB.
Čitatel měří, jak těsně jsou body u svých středů; jmenovatel, jak daleko od sebe jsou dva nejbližší středy. Dobrý rozklad má kompaktní shluky, které jsou od sebe daleko.
XB = ∑i ∑j uijm ‖xi − vj‖2/n · minj ≠ k ‖vj − vk‖2
- XB
- poměr rozptylu uvnitř shluků ku vzdálenosti mezi nimi — menší je lepší
- ∑ ∑ uijm ‖xi − vj‖2
- kompaktnost — přesně hodnota Jm, kterou algoritmus minimalizoval
- n
- počet bodů — z čitatele dělá průměr na bod, aby index nerostl s velikostí dat
- minj ≠ k ‖vj − vk‖2
- oddělenost — rozhoduje nejbližší dvojice středů; samotné Jm s přibývajícími shluky jen klesá, a tenhle člen trestá rozklad, který jeden skutečný shluk rozštípne na dva blízké
Příklad — Xieův–Beniho index pro c = 3
Po skončení algoritmu je J2 ≈ 166,73. Čtverce vzdáleností středů: A–B ≈ 29,4, A–C ≈ 30,8, B–C ≈ 24,79 (nejbližší jsou B a C). Pro n = 126 bodů (barvy podle vzorce výše):
XB = 166,73/126 · 24,79 = 166,73/3 124 ≈ 0,053.
| Počet shluků c | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|
| Koeficient rozkladu (větší je lepší) | 0,745 | 0,841 | 0,748 | 0,661 | 0,609 |
| Xieův–Beniho index (menší je lepší) | 0,228 | 0,053 | 0,298 | 0,682 | 0,529 |
Oba ukazatele se shodnou na třech shlucích, které jsme do dat vložili. U skutečných dat taková shoda není samozřejmá a ukazatele jsou spíš vodítkem než verdiktem.
6. Kde fuzzy c-means selhává
Podívejte se na odlehlé body: O1 vpravo nahoře má k C příslušnost 0,45 a k B 0,39; O2 vlevo nahoře dokonce 0,58 k C. Přitom do žádného shluku nepatří. Vinu nese podmínka ∑j uij = 1: bod musí svou jedničku někomu rozdat, i když je daleko od všech. Příslušnost tu znamená spíš „ke komu má nejblíž“ než „jak dobře sem patří“.
Příklad — proč O2 = (0,2; 9,5) „patří“ do C
Čtverce vzdáleností ke středům: A ≈ 54,07, B ≈ 91,88, C ≈ 24,29. I od nejbližšího středu C je tedy 4,9 daleko — přes šestinásobek směrodatné odchylky 0,8, se kterou jsou body shluků rozházené kolem středů. Podle vzorce pro m = 2 (barvy podle popisku u vzorce pro uij) dají převrácené hodnoty 1/54,07 ≈ 0,0185, 1/91,88 ≈ 0,0109 a 1/24,29 ≈ 0,0412 součet 0,0706 a příslušnosti
uA = 0,0185/0,0706 ≈ 0,26, uB = 0,0109/0,0706 ≈ 0,15, uC = 0,0412/0,0706 ≈ 0,58.
Vzorec vidí jen poměry vzdáleností, ne jejich velikost: čím dál by bod ležel, tím víc by se poměry blížily 1 a příslušnosti 1/3 — ale k nule by nešly nikdy.
Definice — posibilistické c-means (Krishnapuram a Keller, 1993)
Nechť x1, …, xn ∈ ℝd, c ≥ 1, m > 1, v1, …, vc ∈ ℝd středy, dij = ‖xi − vj‖ a η1, …, ηc > 0 předem zvolené parametry (obvykle odhadnuté z výsledku fuzzy c-means). Posibilistické c-means hledá matici U = (uij) typu n × c s uij ∈ [0, 1] — bez podmínky ∑j uij = 1 — a středy, které minimalizují cenu
J(U, V) = ∑i=1n ∑j=1c uijm dij2 + ∑j=1c ηj ∑i=1n (1 − uij)m.
Druhý člen brání triviálnímu řešení U = 0. Při pevných středech je minimum v
uij = 1/1 + (dij2/ηj)1/(m−1),
středy se počítají stejně jako u fuzzy c-means. ηj je „poloměr“ shluku j: bod ve vzdálenosti d2 = ηj má příslušnost 1/2, pro m = 2 bod s d2 = 9ηj jen 1/1 + 9 = 0,1. Příslušnost teď závisí na vzdálenosti k jedinému středu, ne na poměru k ostatním — odlehlý bod dostane malé hodnoty všude.
- Posibilistické c-means (Krishnapuram a Keller, 1993) podmínku součtu ruší — odlehlý bod pak dostane malé příslušnosti ke všem shlukům.
- Tvar shluků. Euklidovská vzdálenost dělá kulaté shluky. Algoritmus Gustafsona a Kessela (1979) dává každému shluku vlastní matici vzdálenosti a najde i protáhlé elipsy.
- Počáteční poloha. Stejně jako k-means může skončit v horším lokálním minimu — v praxi se pouští víckrát z různých startů.
7. Fuzzy shlukování v praxi
- Lékařské snímky. Segmentace snímků mozku z magnetické rezonance na šedou hmotu, bílou hmotu a mozkomíšní mok je klasické použití: pixel na rozhraní tkání opravdu obsahuje obě.
- Segmentace zákazníků. Zákazník může patřit zčásti do více skupin a marketing s tím může počítat.
- Pravděpodobnostní příbuzný. Gaussovské směsi učené algoritmem EM také přiřazují body do shluků „měkce“ — jenže pravděpodobností, ne příslušností. Výsledky bývají podobné, výklad se liší přesně tak, jak to popsal díl o fuzzy logice a pravděpodobnosti.
- Embeddingy. Texty převedené jazykovým modelem na vektory se dají shlukovat stejně; měkké přiřazení pak ukáže dokumenty, které leží mezi tématy.
8. Shrnutí
- K-means přiřadí každý bod právě jednomu shluku a o bodech na rozhraní nic neřekne.
- Fuzzy c-means hledá příslušnosti uij se součtem 1 a středy jako vážené průměry; střídá dva jednoduché kroky.
- Na našich datech našel stejné středy jako k-means a navíc ukázal, že body M1–M4 patří do dvou nebo tří shluků zároveň.
- Fuzzifikátor m řídí, jak měkký rozklad je; koeficient rozkladu a Xieův–Beniho index pomohou zvolit počet shluků.
- Podmínka součtu 1 dává odlehlým bodům vysoké příslušnosti; posibilistické varianty to řeší.
Chcete si to osahat? Nechte AI agenta pustit fuzzy c-means na barvy pixelů vlastní fotky a obarvit ji podle shluků — a podívejte se, které pixely leží „mezi“ barvami.
Máte na to jiný názor? Napište na support@coden-app.com.