Přeskočit na obsah
coden

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.

13 minut Matěj Žalmánek 2026-10-15

Série Základy AI Díl 36 z 83
  1. Mapa umělé inteligence: co je co a jak to do sebe zapadá
  2. Stručná historie umělé inteligence: od Turinga po jazykové modely
  3. Data, model, trénink, inference: základní pojmy na jednom příkladu
  4. Jak číst matematický zápis: symboly, indexy, sumy a kvantifikátory
  5. Množiny a relace: stavebnice, ze které se skládají definice v AI
  6. Funkce a zobrazení: proč je každý model v AI funkce
  7. Logika a důkazy: pravidla, podle kterých se v AI uvažuje
  8. Grafy a stromy: struktura, na které stojí hledání i neuronové sítě
  9. Lineární algebra pro strojové učení: vektory, matice a proč AI hlavně násobí
  10. Derivace, gradient a řetízkové pravidlo: jak model zjistí, kterým směrem se učit
  11. Gradientní sestup: jak se model učí
  12. Co je pravděpodobnost: od hodu kostkou ke Kolmogorovovým axiomům
  13. Podmíněná pravděpodobnost a Bayesova věta: jak změnit odhad, když se dozvíte něco nového
  14. Náhodná veličina a distribuční funkce: jedna funkce, která o rozdělení řekne všechno
  15. Funkce hustoty a pravděpodobnostní funkce: proč má spojitá veličina v bodě pravděpodobnost nula
  16. Střední hodnota, rozptyl a kovariance: kde rozdělení leží, jak je široké a co s čím souvisí
  17. Přehled pravděpodobnostních rozdělení: Bernoulli, binomické, Poisson, rovnoměrné, normální a exponenciální
  18. Zákon velkých čísel a centrální limitní věta: proč se průměry chovají tak předvídatelně
  19. Statistika a odhady parametrů: maximální věrohodnost, MAP a intervaly spolehlivosti
  20. Teorie informace: entropie, křížová entropie a KL divergence — odkud se berou ztrátové funkce
  21. Prohledávání stavového prostoru: BFS, DFS, UCS a A* s animacemi
  22. Hry a protivník: minimax, alfa-beta ořezávání a Monte Carlo tree search
  23. Splňování omezujících podmínek: backtracking, propagace omezení a AC-3 na sudoku a mapě krajů
  24. Logika a znalostní systémy: dopředné a zpětné řetězení, rezoluce a expertní systémy
  25. Plánování: STRIPS, svět kostek, heuristiky z relaxace a plánování v AI agentech
  26. Lokální hledání a simulované žíhání: obchodní cestující přes krajská města
  27. Genetické algoritmy: populace, křížení, mutace a výběr na batohu na výlet
  28. Evoluční strategie a genetické programování: od pravidla jedné pětiny po Keplerův zákon
  29. Optimalizace mravenčí kolonií: jak feromonová stopa najde krátkou cestu
  30. Optimalizace hejnem částic: setrvačnost, vlastní zkušenost a zkušenost hejna
  31. Neuroevoluce: evoluce vah i tvaru neuronových sítí a algoritmus NEAT
  32. Fuzzy množiny a funkce příslušnosti: jak zapsat „trochu teplo“
  33. Fuzzy logika a pravděpodobnost: proč „trochu teplo“ neznamená „pravděpodobně teplo“
  34. Fuzzy logika: t-normy, implikace a pravidla KDYŽ–PAK
  35. Fuzzy řízení: Mamdani a Sugeno od ventilátoru po kyvadlo na vozíku
  36. Fuzzy shlukování: algoritmus fuzzy c-means a body mezi shluky
  37. Neuro-fuzzy systémy (ANFIS): fuzzy pravidla, která se učí z dat
  38. Markovovy řetězce: přechodová matice, stacionární rozdělení a PageRank
  39. Skryté Markovovy modely: Viterbiho algoritmus a nepoctivé kasino
  40. Bayesovské sítě: proč je tráva mokrá a co z toho plyne pro postřikovač
  41. Kalmanův filtr: jak z nepřesných měření odhadnout, kde auto je a jak rychle jede
  42. Druhy strojového učení: s učitelem, bez učitele, s částečným učitelem a další
  43. Přeučení a regularizace: proč model, který zná data nazpaměť, selže
  44. Vyhodnocení modelu: křížová validace, F1 a křivka ROC
  45. Shlukování a snížení dimenze: k-means, PCA a t-SNE
  46. Klasifikace a regrese: dvě úlohy učení s učitelem
  47. Lineární regrese: nejmenší čtverce geometricky i maticově
  48. Polynomiální a nelineární regrese: jak přímku ohnout
  49. Logistická regrese: sigmoida, šance a křížová entropie
  50. Vícetřídní klasifikace a softmax: od dvou tříd k mnoha
  51. Naivní Bayesův klasifikátor: spamový filtr, který funguje lépe, než by měl
  52. Ztrátové funkce: co přesně model minimalizuje
  53. Rozhodovací stromy a k nejbližších sousedů: modely bez vzorců
  54. Ansámbly: náhodný les a gradient boosting
  55. SVM a jádrový trik: nejširší hranice a jak ji ohnout
  56. Signál a vzorkování: proč platí Nyquistův teorém
  57. Fourierova transformace: rozklad signálu na frekvence
  58. Filtry a konvoluce: vyhlazení, hrany a odstranění šumu
  59. Zvuk a řeč: spektrogram, melová škála a MFCC
  60. Obraz jako signál: pixely, barvy, konvoluce a hrany
  61. Perceptron a umělý neuron: nejjednodušší neuronová síť a co neumí
  62. Neuronová síť od nuly: zpětné šíření chyby krok za krokem
  63. Aktivace, inicializace a normalizace: drobnosti, na kterých hluboká síť stojí
  64. Konvoluční sítě: jak síť poznává obrázky
  65. Rekurentní sítě: paměť pro posloupnosti a mizející gradient
  66. LSTM a GRU: brány, které rozhodují, co si síť zapamatuje
  67. Autoenkodéry: síť, která se učí data stlačit a zase rozbalit
  68. Embeddingy a word2vec: jak se slovo stane vektorem
  69. Mechanismus pozornosti: jak se model naučí, kam se dívat
  70. Transformery a velké jazykové modely: architektura krok za krokem
  71. Tokenizace: jak se text rozseká na kousky pro model
  72. Předtrénování a škálování: proč větší model a víc dat funguje
  73. Doladění a RLHF: jak se z doplňovače textu stane asistent
  74. Prompty, kontext a RAG: jak modelu dát správné informace
  75. Variační autoenkodéry (VAE): nové obrázky ze spojitého latentního prostoru
  76. Generativní adversariální sítě (GAN): padělatel proti detektivovi
  77. Difúzní modely: jak se z čistého šumu stane obrázek
  78. Markovovy rozhodovací procesy: stavy, akce, odměny a Bellmanovy rovnice
  79. Q-learning a DQN: učení hodnoty akcí od tabulky po neuronovou síť
  80. Policy gradient a PPO: učení přímo strategie
  81. Jak funguje AI agent: jazykový model ve smyčce s nástroji
  82. Programování s AI agenty: zadání, testy a kontrola
  83. 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 si odnesete
  • 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:

  1. Za počáteční středy zvol c navzájem různých bodů z x1, …, xn (náhodně).
  2. 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.
  3. Zastavení: pokud se přiřazení oproti předchozímu průchodu nezměnilo, skonči a vrať středy a přiřazení.
  4. 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í).
  5. Pokračuj krokem 2.
Laicky řečeno

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

  1. žádný krok přiřazení ani krok středů nezvětší hodnotu J;
  2. 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:

00551010 příznak x₁ (bez jednotky) příznak x₂ (bez jednotky) M1 M2 M3 M4 O1 O2
k-means: každý bod patří právě jednomu shluku

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

  1. uij ∈ [0, 1] pro všechna i, j;
  2. ∑j=1c uij = 1 pro každé i — každý bod rozdělí celkovou příslušnost 1 mezi shluky;
  3. 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:

  1. Zvol počáteční středy v1, …, vc (např. c různých náhodných bodů).
  2. 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).
  3. 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.
  4. 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.

Laicky řečeno

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
Pro m = 2 se vzorec zjednoduší na uij = 1/dij2/∑k 1/dik2: příslušnost je úměrná převrácenému čtverci vzdálenosti.
Věta — odkud se oba kroky berou

Nechť x1, …, xn ∈ ℝd, c a m > 1 jsou jako v definici fuzzy c-means. Pak:

  1. 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).
  2. 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:

00551010 příznak x₁ (bez jednotky) příznak x₂ (bez jednotky) M1 M2 M3 M4 O1 O2
Fuzzy c-means (m = 2): barva je směs podle příslušností
Bodk-meansABC
M1 (4,5; 2,5)B0,410,450,15
M2 (3,3; 4,5)A0,430,180,38
M3 (5,8; 5)B0,120,440,45
M4 (4,6; 4)B0,280,400,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):

Shlukd21/d2u = 1/d2/0,3190
A2,772 + 0,192 ≈ 7,720,12960,41
B2,622 + 0,372 ≈ 7,030,14230,45
C0,012 + 4,612 ≈ 21,250,04710,15
součet0,31901,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ž

  1. PC(U) = 1, právě když je rozklad ostrý: v každém řádku je jedno uij = 1 a ostatní 0;
  2. 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.)

Laicky řečeno

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é
Bod M1 s příslušnostmi (0,41; 0,45; 0,15) přispívá 0,412 + 0,452 + 0,152 ≈ 0,39; body z jader shluků skoro 1 — průměr všech 126 bodů je 0,84.
00551010 příznak x₁ (bez jednotky) příznak x₂ (bez jednotky) m = 1,2 m = 2 m = 5 M1 M2 M3 M4 O1 O2
Fuzzy c-means pro m = 1,2; 2 a 5

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.

Laicky řečeno

Č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ů c23456
Koeficient rozkladu (větší je lepší)0,7450,8410,7480,6610,609
Xieův–Beniho index (menší je lepší)0,2280,0530,2980,6820,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.

Agent na vašem počítači, ovládaný z telefonu