Preskočiť na obsah
coden

Fuzzy zhlukovanie: algoritmus fuzzy c-means a body medzi zhlukmi

K-means a jeho ostré priradenie, fuzzy c-means s príslušnosťami ku všetkým zhlukom, fuzzifikátor m, koeficient rozkladu a Xieho–Beniho index na voľbu počtu zhlukov — a prečo odľahlé body dostanú vysoké príslušnosti.

13 minút Matěj Žalmánek 2026-10-15

Séria Základy AI Diel 36 z 52
  1. Mapa umelej inteligencie: čo je čo a ako to do seba zapadá
  2. Stručná história umelej inteligencie: od Turinga po jazykové modely
  3. Dáta, model, tréning, inferencia: základné pojmy na jednom príklade
  4. Ako čítať matematický zápis: symboly, indexy, sumy a kvantifikátory
  5. Množiny a relácie: stavebnica, z ktorej sa skladajú definície v AI
  6. Funkcie a zobrazenia: prečo je každý model v AI funkcia
  7. Logika a dôkazy: pravidlá, podľa ktorých sa v AI uvažuje
  8. Grafy a stromy: štruktúra, na ktorej stojí hľadanie aj neurónové siete
  9. Lineárna algebra pre strojové učenie: vektory, matice a prečo AI hlavne násobí
  10. Derivácie, gradient a reťazové pravidlo: ako model zistí, ktorým smerom sa učiť
  11. Gradientný zostup: ako sa model učí
  12. Čo je pravdepodobnosť: od hodu kockou ku Kolmogorovovým axiómam
  13. Podmienená pravdepodobnosť a Bayesova veta: ako zmeniť odhad, keď sa dozviete niečo nové
  14. Náhodná premenná a distribučná funkcia: jedna funkcia, ktorá o rozdelení povie všetko
  15. Funkcia hustoty a pravdepodobnostná funkcia: prečo má spojitá premenná v bode pravdepodobnosť nula
  16. Stredná hodnota, rozptyl a kovariancia: kde rozdelenie leží, aké je široké a čo s čím súvisí
  17. Prehľad pravdepodobnostných rozdelení: Bernoulliho, binomické, Poissonovo, rovnomerné, normálne a exponenciálne
  18. Zákon veľkých čísel a centrálna limitná veta: prečo sa priemery správajú tak predvídateľne
  19. Štatistika a odhady parametrov: maximálna vierohodnosť, MAP a intervaly spoľahlivosti
  20. Teória informácie: entropia, krížová entropia a KL divergencia — odkiaľ sa berú stratové funkcie
  21. Prehľadávanie stavového priestoru: BFS, DFS, UCS a A* s animáciami
  22. Hry a protivník: minimax, alfa-beta orezávanie a Monte Carlo tree search
  23. Splňovanie obmedzujúcich podmienok: backtracking, propagácia obmedzení a AC-3 na sudoku a mape krajov
  24. Logika a znalostné systémy: dopredné a spätné reťazenie, rezolúcia a expertné systémy
  25. Plánovanie: STRIPS, svet kociek, heuristiky z relaxácie a plánovanie v AI agentoch
  26. Lokálne hľadanie a simulované žíhanie: obchodný cestujúci cez krajské mestá
  27. Genetické algoritmy: populácia, kríženie, mutácia a výber na batohu na výlet
  28. Evolučné stratégie a genetické programovanie: od pravidla jednej pätiny po Keplerov zákon
  29. Optimalizácia mravčou kolóniou: ako feromónová stopa nájde krátku cestu
  30. Optimalizácia rojom častíc: zotrvačnosť, vlastná skúsenosť a skúsenosť roja
  31. Neuroevolúcia: evolúcia váh aj tvaru neurónových sietí a algoritmus NEAT
  32. Fuzzy množiny a funkcie príslušnosti: ako zapísať „trochu teplo“
  33. Fuzzy logika a pravdepodobnosť: prečo „trochu teplo“ neznamená „pravdepodobne teplo“
  34. Fuzzy logika: t-normy, implikácie a pravidlá AK–TAK
  35. Fuzzy riadenie: Mamdani a Sugeno od ventilátora po kyvadlo na vozíku
  36. Fuzzy zhlukovanie: algoritmus fuzzy c-means a body medzi zhlukmi
  37. Neuro-fuzzy systémy (ANFIS): fuzzy pravidlá, ktoré sa učia z dát
  38. Markovove reťazce: prechodová matica, stacionárne rozdelenie a PageRank
  39. Skryté Markovove modely: Viterbiho algoritmus a nepoctivé kasíno
  40. Bayesovské siete: prečo je tráva mokrá a čo z toho vyplýva pre postrekovač
  41. Kalmanov filter: ako z nepresných meraní odhadnúť, kde auto je a ako rýchlo ide
  42. Druhy strojového učenia: s učiteľom, bez učiteľa, s čiastočným učiteľom a ďalšie
  43. Prompty, kontext a RAG: ako modelu dať správne informácie
  44. Variačné autoenkodéry (VAE): nové obrázky zo spojitého latentného priestoru
  45. Generatívne adversariálne siete (GAN): falšovateľ proti detektívovi
  46. Difúzne modely: ako sa z čistého šumu stane obrázok
  47. Markovove rozhodovacie procesy: stavy, akcie, odmeny a Bellmanove rovnice
  48. Q-learning a DQN: učenie hodnoty akcií od tabuľky po neurónovú sieť
  49. Policy gradient a PPO: učenie priamo stratégie
  50. Ako funguje AI agent: jazykový model v slučke s nástrojmi
  51. Programovanie s AI agentmi: zadanie, testy a kontrola
  52. Vyhodnocovanie a bezpečnosť AI systémov: ako merať a ako strážiť

Celá osnova série Hotovo: 52 z 83 tém

Čo si odnesiete
  • Ako funguje k-means a čo zamlčí o bodoch na rozhraní zhlukov.
  • Ako fuzzy c-means počíta príslušnosti a stredy a čo robí fuzzifikátor m.
  • Ako zvoliť počet zhlukov a kde fuzzy c-means zlyháva.

Čo sa hodí vedieť vopred: Fuzzy množiny a funkcie príslušnosti: ako zapísať „trochu teplo“, Druhy strojového učenia: s učiteľom, bez učiteľa, s čiastočným učiteľom a ďalšie

Zhlukovanie hľadá v dátach skupiny, o ktorých vopred nič nevieme: zákazníkov s podobným nákupným správaním, oblasti rovnakého tkaniva na snímke z magnetickej rezonancie, dokumenty s podobnou témou. Klasický algoritmus k-means priradí každý bod práve jednej skupine. Lenže skutočné dáta mávajú body na rozhraní — zákazníka, ktorý nakupuje trochu ako študent a trochu ako rodič, pixel, v ktorom sa stretáva sivá a biela hmota mozgu. Fuzzy zhlukovanie dovolí bodu patriť do viacerých skupín naraz, do každej z nich trochu.

Nadväzuje na diely Fuzzy množiny a funkcie príslušnosti a Druhy strojového učenia, kde sa zhlukovanie objavilo ako typická úloha učenia bez učiteľa.

1. Ostré zhlukovanie: k-means

Definícia — úloha k-means

Nech d ≥ 1 a n ≥ 1 sú prirodzené čísla, x1, …, xn ∈ ℝd body a c ∈ ℕ, 1 ≤ c ≤ n, počet zhlukov. Priradenie je zobrazenie shluk : {1, …, n} → {1, …, c}, ktoré bodu xi priradí číslo jeho zhluku. Pre stredy v1, …, vc ∈ ℝd a priradenie shluk je cena

J(v1, …, vc, shluk) = ∑i=1n ‖xi − vshluk(i)‖2,

kde ‖·‖ je euklidovská vzdialenosť (ďalšia definícia). Úloha k-means je nájsť stredy a priradenie, pre ktoré je J najmenšie možné.

Lloydov algoritmus (približné riešenie úlohy k-means). Vstup: body x1, …, xn ∈ ℝd a počet zhlukov c. Výstup: stredy v1, …, vc a priradenie shluk. Kroky:

  1. Za počiatočné stredy zvoľ c navzájom rôznych bodov z x1, …, xn (náhodne).
  2. Priradenie: pre každé i = 1, …, n zvoľ shluk(i) ∈ argminj ∈ {1, …, c} ‖xi − vj‖2; ak je najbližších stredov viac a je medzi nimi doterajší stred bodu, ponechaj bod v jeho zhluku.
  3. Zastavenie: ak sa priradenie oproti predchádzajúcemu prechodu nezmenilo, skonči a vráť stredy a priradenie.
  4. Stredy: pre každé j = 1, …, c označ Sj = {i : shluk(i) = j} a ak Sj ≠ ∅, polož vj = 1/|Sj| ∑i ∈ Sj xi (priemer bodov zhluku; prázdny zhluk stred nemení).
  5. Pokračuj krokom 2.
Laicky povedané

Rozmiestnite do dát pár „vlajok“. Každý bod sa pridá k tej najbližšej. Potom sa každá vlajka presťahuje doprostred svojich bodov. Body sa znovu pridajú k najbližšej vlajke — a tak ďalej, kým sa nič nemení. Každý krok J zmenší, takže algoritmus určite skončí, aj keď nie nutne v najlepšom možnom rozklade.

Definícia — euklidovská vzdialenosť

Nech d ≥ 1 a x = (x1, …, xd), v = (v1, …, vd) ∈ ℝd. Euklidovská vzdialenosť bodov x a v je nezáporné číslo

‖x − v‖ = √∑r=1d (xr − vr)2.

V rovine (d = 2) je to obyčajná dĺžka úsečky, napríklad od bodu M1 = (4,5; 2,5) k stredu zhluku A (1,73; 2,31), ako ho nižšie nájde fuzzy c-means: √2,772 + 0,192 ≈ 2,78. Zhlukovanie pracuje so štvorcom ‖·‖2 — odpadne odmocnina a vzdialené body sa trestajú viac.

def kmeans(X, c):
    V = c náhodne vybraných bodov z X              # počiatočné stredy
    while True:
        shluk = [argmin_j ‖x − V[j]‖² for x in X]  # krok priradenia
        if shluk sa nezmenil: return V, shluk
        for j in range(c):                         # krok stredov
            V[j] = priemer bodov x, pre ktoré shluk(x) = j
Veta — Lloydov algoritmus skončí

Nech x1, …, xn ∈ ℝd, 1 ≤ c ≤ n a Lloydov algoritmus beží podľa definície vyššie (vrátane pravidla, že pri rovnakej vzdialenosti zostane bod vo svojom zhluku). Potom

  1. žiadny krok priradenia ani krok stredov nezväčší hodnotu J;
  2. algoritmus skončí po konečne mnohých prechodoch.

Dôkaz: Priradenie: každý člen ‖xi − vshluk(i)‖2 sa nahradí najmenším zo všetkých ‖xi − vj‖2, takže sa nezväčší. Stredy: pre neprázdnu množinu indexov S jedného zhluku s priemerom x̄ = 1/|S| ∑i∈S xi a ľubovoľné v ∈ ℝd platí rozklad

∑i∈S ‖xi − v‖2 = ∑i∈S ‖xi − x̄‖2 + |S| · ‖x̄ − v‖2

(zmiešaný člen 2 ∑ (xi − x̄) · (x̄ − v) je nulový, pretože ∑ (xi − x̄) = 0). Súčet je teda najmenší pre v = x̄. Rozkladov n bodov do c zhlukov je konečne veľa a J pri každej zmene priradenia ostro klesne (pri rovnakej vzdialenosti necháme bod v jeho zhluku), takže sa žiadny rozklad nezopakuje. ∎

Veta nehovorí nič o tom, či nájdený rozklad je ten s najmenším J — len že algoritmus nebude cykliť.

Naše dáta: tri skupiny po 40 bodoch — A vľavo dole, B vpravo a C hore —, štyri body na rozhraní (M1–M4) a dva odľahlé body ďaleko od všetkého (O1, O2). K-means sa ustálil po štyroch iteráciách:

00551010 príznak x₁ (bez jednotky) príznak x₂ (bez jednotky) M1 M2 M3 M4 O1 O2
k-means: každý bod patrí práve jednému zhluku

Zhluky našiel dobre, ale body na rozhraní musel rozhodnúť: M1, M3 a M4 dal do B, M2 do A. Bod M3 pritom leží takmer presne medzi B a C — k-means o tom nepovie nič. A oba odľahlé body padli do zhluku C, akoby k nemu patrili rovnako ako jeho jadro.

2. Fuzzy c-means

Definícia — fuzzy c-means (Dunn 1973, Bezdek 1981)

Nech x1, …, xn ∈ ℝd sú body, c ∈ ℕ, 2 ≤ c < n, počet zhlukov a m ∈ ℝ, m > 1, fuzzifikátor. Matica príslušností je matica U = (uij) typu n × c (i = 1, …, n čísluje body, j = 1, …, c zhluky), ktorá spĺňa

  1. uij ∈ [0, 1] pre všetky i, j;
  2. ∑j=1c uij = 1 pre každé i — každý bod rozdelí celkovú príslušnosť 1 medzi zhluky;
  3. 0 < ∑i=1n uij < n pre každé j — žiadny zhluk nie je prázdny a žiadny nepohltí všetky body úplne.

Pre maticu príslušností U a stredy V = (v1, …, vc) ∈ (ℝd)c je cena

Jm(U, V) = ∑i=1n ∑j=1c uijm ‖xi − vj‖2.

Fuzzy c-means je úloha nájsť U a V s najmenšou cenou Jm a tento algoritmus na jej približné riešenie. Vstup: body, c, m, presnosť ε > 0 a najvyšší počet iterácií. Výstup: U a V. Kroky:

  1. Zvoľ počiatočné stredy v1, …, vc (napr. c rôznych náhodných bodov).
  2. Príslušnosti: pre všetky i, j vypočítaj dij = ‖xi − vj‖ (predpokladáme dij > 0) a uij = 1/∑k=1c (dij/dik)2/(m−1).
  3. Zastavenie: ak sa od predchádzajúceho prechodu žiadne uij nezmenilo o ε alebo viac, alebo bol vyčerpaný počet iterácií, skonči (po prvom prechode sa nekončí) a vráť U a V.
  4. Stredy: pre každé j = 1, …, c polož vj = ∑i=1n uijm xi/∑i=1n uijm a pokračuj krokom 2.

Oba výpočtové kroky vyplývajú z podmienok optimality (veta nižšie): každý minimalizuje Jm pri pevnej druhej skupine premenných.

Laicky povedané

Každý bod rozdelí svoju jednotku medzi všetky zhluky — viac tomu, ku ktorému má bližšie. Stred zhluku je vážený priemer všetkých bodov: body, ktoré k zhluku patria silno, ho ťahajú viac, body z iných zhlukov len nepatrne. Vzorec pre príslušnosť porovnáva vzdialenosti: ak je bod k jednému stredu dvakrát bližšie než k druhému, dostane (pri m = 2) štyrikrát väčšiu príslušnosť.

Jm = ∑i=1n ∑j=1c uijm ‖xi − vj‖2,    ∑j uij = 1

Jm
celková „cena“ rozkladu — algoritmus ju minimalizuje; je malá, keď body patria hlavne k stredom, ktoré majú blízko
∑i ∑j
každý bod sa počíta ku každému zhluku — na rozdiel od k-means, kde sa bral len jeden zhluk na bod
uij
príslušnosť bodu i k zhluku j — váha, s akou sa vzdialenosť do ceny započíta
m
fuzzifikátor — bez mocniny (m = 1) by sa oplatilo dať celú jednotku najbližšiemu stredu a vyšlo by opäť k-means; s m > 1 sa deliť oplatí: bod rovnako ďaleko od dvoch stredov zaplatí pri m = 2 a rozdelení napoly len (½2 + ½2) · d2 = ½d2 namiesto d2
‖xi − vj‖2
štvorec vzdialenosti — čo stojí mať bod „pri“ tomto strede; vzdialený stred vyjde draho
∑j uij = 1
podmienka — bez nej by minimum bolo triviálne: všetky uij = 0 a cena nula

uij = 1/∑k=1c ( dij/dik )2/(m−1)

uij
nová príslušnosť bodu i k zhluku j pri pevných stredoch
dij/dik
pomer vzdialeností — koľkokrát je stred j ďalej než stred k; pomer (nie rozdiel) robí výsledok nezávislým od mierky dát
exponent 2/m − 1
ako ostro pomer rozhoduje — pre m = 2 je to 2, takže dvakrát bližší stred dostane štyrikrát viac; pre m → 1 exponent rastie nad všetky medze a všetko dostane najbližší stred
∑k
porovnanie so všetkými stredmi vrátane samotného j (člen k = j je 1) — vďaka tomu sa príslušnosti bodu sčítajú presne na 1
Pre m = 2 sa vzorec zjednoduší na uij = 1/dij2/∑k 1/dik2: príslušnosť je úmerná prevrátenému štvorcu vzdialenosti.
Veta — odkiaľ sa oba kroky berú

Nech x1, …, xn ∈ ℝd, c a m > 1 sú ako v definícii fuzzy c-means. Potom:

  1. Pre pevné stredy v1, …, vc, pre ktoré sú všetky vzdialenosti dij = ‖xi − vj‖ kladné, nadobúda Jm na množine matíc s uij ≥ 0 a ∑j uij = 1 minimum práve pre uij = 1/∑k=1c (dij/dik)2/(m−1).
  2. Pre pevnú maticu U, v ktorej ∑i uijm > 0 pre každé j, nadobúda Jm minimum cez v1, …, vc ∈ ℝd práve pre vj = ∑i uijm xi/∑i uijm.

Dôkaz. Príslušnosti pri pevných stredoch. Jm je súčet cez body a podmienky sa týkajú vždy jedného riadka U, takže stačí pre jeden bod i minimalizovať ∑j uijm dij2 za podmienky ∑j uij = 1. Lagrangeova funkcia je L = ∑j uijm dij2 − λ (∑j uij − 1). Z ∂L/∂uij = m uijm−1 dij2 − λ = 0 vyplýva uij = (λ/m)1/(m−1) · dij−2/(m−1). Dosadením do podmienky súčtu sa neznáma λ vykráti a zostane

uij = dij−2/(m−1)/∑k dik−2/(m−1) = 1/∑k (dij/dik)2/(m−1).

Vyšli kladné čísla, takže podmienku uij ≥ 0 netreba strážiť zvlášť. Funkcia u ↦ um d2 je pre m > 1 a d > 0 na [0, 1] ostro konvexná, takže tento jediný stacionárny bod je minimum. (Ak leží bod presne v strede, dij = 0, dostane k tomu zhluku príslušnosť 1; naša implementácia to rieši tak, že vzdialenosť nikdy neklesne pod 10−12.)

Stredy pri pevných príslušnostiach. Jm je vo vj konvexná kvadratická funkcia (ostro konvexná, pretože ∑i uijm > 0) a ∂Jm/∂vj = −2 ∑i uijm (xi − vj) = 0 dáva vj = ∑i uijm xi/∑i uijm. ∎

Každý krok teda Jm pri pevnej druhej skupine premenných minimalizuje a nemôže ho zväčšiť — rovnaký argument ako pri k-means. Bezdek a kol. (1987, oprava pôvodnej Bezdekovej vety z roku 1980) ukázali, že postupnosť má hromadné body v stacionárnych bodoch Jm (nie nutne v globálnom minime).

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é príslušnosti, riadok = 1
    for _ in range(iteraci):
        W = U ** m
        V = (W.T @ X) / W.sum(axis=0)[:, None]             # stredy ako vážené priemery
        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 dátach

Farba bodu je teraz zmes farieb zhlukov podľa príslušností: čisto zelený bod patrí len do A, bod „medzi“ zelenou a oranžovou je sčasti v A a sčasti v B. Bodkované čiary ukazujú, ako sa stredy sťahovali — algoritmus sa ustálil po deviatich iteráciách:

00551010 príznak x₁ (bez jednotky) príznak x₂ (bez jednotky) M1 M2 M3 M4 O1 O2
Fuzzy c-means (m = 2): farba je zmes podľa prí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

Teraz je vidieť, čo k-means zamlčal. M1 je takmer napoly medzi A a B; M3 je vlastne o chlp viac v C než v B, hoci ho k-means dal do B; a M4 uprostred trojuholníka patrí trochu do všetkých troch. Body v jadrách zhlukov majú príslušnosť k svojmu zhluku blízko jednej. Stredy vyšli prakticky rovnako ako pri k-means — fuzzy c-means nemení, kde zhluky sú, ale pridá k nim informáciu, ako isto do nich ktorý bod patrí.

Príklad — príslušnosti bodu M1 = (4,5; 2,5)

Stredy po deviatich iteráciách: A ≈ (1,73; 2,31), B ≈ (7,12; 2,87), C ≈ (4,51; 7,11). Pre m = 2 stačia prevrátené štvorce vzdialeností (farby podľa zjednodušeného vzorca pre m = 2 v popise vyššie):

Zhlukd21/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
súčet0,31901,00

M1 je od stredov A a B takmer rovnako ďaleko (7,72 oproti 7,03), a preto sa medzi ne delí takmer napoly; C je trikrát ďalej (v štvorci), a tak dostane len zvyšok.

4. Fuzzifikátor m

Definícia — koeficient rozkladu

Nech n ≥ 1, c ≥ 2 a U = (uij) je matica typu n × c s uij ∈ [0, 1] a ∑j=1c uij = 1 pre každé i (matica prí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, pričom

  1. PC(U) = 1 práve vtedy, keď je rozklad ostrý: v každom riadku je jedno uij = 1 a ostatné 0;
  2. PC(U) = 1/c práve vtedy, keď uij = 1/c pre všetky i, j — každý bod patrí do všetkých zhlukov rovnako.

(Pre každý riadok je ∑j uij2 ≤ ∑j uij = 1 s rovnosťou len pre hodnoty 0 a 1, a podľa Cauchyho–Schwarzovej nerovnosti ∑j uij2 ≥ 1/c (∑j uij)2 = 1/c s rovnosťou len pre rovnaké hodnoty.)

Laicky povedané

Jedno číslo, ktoré hovorí, aký „ostrý“ je rozklad. Pre tri zhluky leží medzi 1/3 (všetko je rozmazané) a 1 (každý bod má jasný domov).

PC = 1/n ∑i ∑j uij2

PC
ostrosť celého rozkladu, číslo z [1/c; 1]
1/n ∑i
priemer cez body — aby sa dali porovnať dátové množiny rôznej veľkosti
∑j uij2
ostrosť jedného bodu — štvorec „odmení“ sústredenú príslušnosť: (1, 0, 0) dá 1, (⅓, ⅓, ⅓) len ⅓; pri pevnom súčte 1 je súčet štvorcov najmenší, keď sú všetky diely rovnaké
Bod M1 s príslušnosťami (0,41; 0,45; 0,15) prispieva 0,412 + 0,452 + 0,152 ≈ 0,39; body z jadier zhlukov takmer 1 — priemer všetkých 126 bodov je 0,84.
00551010 príznak x₁ (bez jednotky) príznak x₂ (bez jednotky) m = 1,2 m = 2 m = 5 M1 M2 M3 M4 O1 O2
Fuzzy c-means pre m = 1,2; 2 a 5

Pre m blízko 1 sa fuzzy c-means blíži k-means: koeficient rozkladu je 0,98 a bod M4 patrí z 0,79 do B. Pre m = 2 je koeficient 0,84 a pre m = 5 len 0,42 — farby sa zlievajú a aj bod z jadra zhluku A má k A príslušnosť len 0,45. Pre m → ∞ by všetky príslušnosti išli k 1/3. Najčastejšie sa používa m = 2: dostatočne mäkké, aby body na rozhraní boli vidieť, a dosť ostré, aby zhluky zostali zreteľné.

Príklad — bod dvakrát bližšie k jednému z dvoch stredov

Bod má k stredu 1 vzdialenosť 1 a k stredu 2 vzdialenosť 2. Vo vzorci pre príslušnosť je člen k = 1 rovný 1 a člen k = 2 má pomer 1/2, takže u1 = 1/1 + (1/2)2/(m−1) (farby podľa vzorca pre uij vyššie):

  • m = 1,2: exponent 10, u1 = 1/1 + 1/1 024 ≈ 0,999 — prakticky ostré priradenie,
  • 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.

Všeobecne: pre m → 1+ ide exponent 2/m − 1 do nekonečna, pomery dij/dik < 1 idú k nule a tie > 1 do nekonečna, takže najbližší stred dostane 1 a ostatné 0 (k-means). Pre m → ∞ ide exponent k nule, všetkých c členov súčtu ide k 1 a uij → 1/c.

5. Koľko zhlukov?

Počet zhlukov musíme algoritmu zadať. Keď ho nevieme, spustíme ho pre rôzne c a porovnáme kvalitu rozkladov. Na to sa hodí koeficient rozkladu a Xieho–Beniho index.

Definícia — Xieho–Beniho index

Nech x1, …, xn ∈ ℝd, c ≥ 2, m > 1, U = (uij) matica príslušností typu n × c a v1, …, vc ∈ ℝd navzájom rôzne stredy (typicky výsledok fuzzy c-means). Xieho–Beniho index je číslo

XB(U, V) = ∑i=1n ∑j=1c uijm ‖xi − vj‖2/n · minj ≠ k ‖vj − vk‖2.

Menovateľ je kladný, pretože stredy sú rôzne. Xie a Beni (1991) index zaviedli s exponentom 2 (t. j. pre m = 2); so všeobecným m sa bežne používa v rovnakom tvare. Pri porovnaní rozkladov je lepší ten s menším XB.

Laicky povedané

Čitateľ meria, ako tesne sú body pri svojich stredoch; menovateľ, ako ďaleko od seba sú dva najbližšie stredy. Dobrý rozklad má kompaktné zhluky, ktoré sú od seba ďaleko.

XB = ∑i ∑j uijm ‖xi − vj‖2/n · minj ≠ k ‖vj − vk‖2

XB
pomer rozptylu vnútri zhlukov k vzdialenosti medzi nimi — menší je lepší
∑ ∑ uijm ‖xi − vj‖2
kompaktnosť — presne hodnota Jm, ktorú algoritmus minimalizoval
n
počet bodov — z čitateľa robí priemer na bod, aby index nerástol s veľkosťou dát
minj ≠ k ‖vj − vk‖2
oddelenosť — rozhoduje najbližšia dvojica stredov; samotné Jm s pribúdajúcimi zhlukmi len klesá, a tento člen trestá rozklad, ktorý jeden skutočný zhluk rozštiepi na dva blízke
Príklad — Xieho–Beniho index pre c = 3

Po skončení algoritmu je J2 ≈ 166,73. Štvorce vzdialeností stredov: A–B ≈ 29,4, A–C ≈ 30,8, B–C ≈ 24,79 (najbližšie sú B a C). Pre n = 126 bodov (farby podľa vzorca vyššie):

XB = 166,73/126 · 24,79 = 166,73/3 124 ≈ 0,053.

Počet zhlukov c23456
Koeficient rozkladu (väčší je lepší)0,7450,8410,7480,6610,609
Xieho–Beniho index (menší je lepší)0,2280,0530,2980,6820,529

Oba ukazovatele sa zhodnú na troch zhlukoch, ktoré sme do dát vložili. Pri skutočných dátach taká zhoda nie je samozrejmá a ukazovatele sú skôr vodidlom než verdiktom.

6. Kde fuzzy c-means zlyháva

Pozrite sa na odľahlé body: O1 vpravo hore má k C príslušnosť 0,45 a k B 0,39; O2 vľavo hore dokonca 0,58 k C. Pritom do žiadneho zhluku nepatria. Vinu nesie podmienka ∑j uij = 1: bod musí svoju jednotku niekomu rozdať, aj keď je ďaleko od všetkých. Príslušnosť tu znamená skôr „ku komu má najbližšie“ než „ako dobre sem patrí“.

Príklad — prečo O2 = (0,2; 9,5) „patrí“ do C

Štvorce vzdialeností k stredom: A ≈ 54,07, B ≈ 91,88, C ≈ 24,29. Aj od najbližšieho stredu C je teda 4,9 ďaleko — viac než šesťnásobok smerodajnej odchýlky 0,8, s ktorou sú body zhlukov rozhádzané okolo stredov. Podľa vzorca pre m = 2 (farby podľa popisu pri vzorci pre uij) dajú prevrátené hodnoty 1/54,07 ≈ 0,0185, 1/91,88 ≈ 0,0109 a 1/24,29 ≈ 0,0412 súčet 0,0706 a prí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í len pomery vzdialeností, nie ich veľkosť: čím ďalej by bod ležal, tým viac by sa pomery blížili 1 a príslušnosti 1/3 — ale k nule by nešli nikdy.

Definícia — posibilistické c-means (Krishnapuram a Keller, 1993)

Nech x1, …, xn ∈ ℝd, c ≥ 1, m > 1, v1, …, vc ∈ ℝd stredy, dij = ‖xi − vj‖ a η1, …, ηc > 0 vopred zvolené parametre (obvykle odhadnuté z výsledku fuzzy c-means). Posibilistické c-means hľadá maticu U = (uij) typu n × c s uij ∈ [0, 1] — bez podmienky ∑j uij = 1 — a stredy, ktoré minimalizujú cenu

J(U, V) = ∑i=1n ∑j=1c uijm dij2 + ∑j=1c ηj ∑i=1n (1 − uij)m.

Druhý člen bráni triviálnemu riešeniu U = 0. Pri pevných stredoch je minimum v

uij = 1/1 + (dij2/ηj)1/(m−1),

stredy sa počítajú rovnako ako pri fuzzy c-means. ηj je „polomer“ zhluku j: bod vo vzdialenosti d2 = ηj má príslušnosť 1/2, pre m = 2 bod s d2 = 9ηj len 1/1 + 9 = 0,1. Príslušnosť teraz závisí od vzdialenosti k jedinému stredu, nie od pomeru k ostatným — odľahlý bod dostane malé hodnoty všade.

  • Posibilistické c-means (Krishnapuram a Keller, 1993) podmienku súčtu rušia — odľahlý bod potom dostane malé príslušnosti ku všetkým zhlukom.
  • Tvar zhlukov. Euklidovská vzdialenosť vytvára okrúhle zhluky. Algoritmus Gustafsona a Kessela (1979) dáva každému zhluku vlastnú maticu vzdialenosti a nájde aj pretiahnuté elipsy.
  • Počiatočná poloha. Rovnako ako k-means môže skončiť v horšom lokálnom minime — v praxi sa spúšťa viackrát z rôznych štartov.

7. Fuzzy zhlukovanie v praxi

  • Lekárske snímky. Segmentácia snímok mozgu z magnetickej rezonancie na sivú hmotu, bielu hmotu a mozgovomiechový mok je klasické použitie: pixel na rozhraní tkanív naozaj obsahuje obe.
  • Segmentácia zákazníkov. Zákazník môže patriť sčasti do viacerých skupín a marketing s tým môže počítať.
  • Pravdepodobnostný príbuzný. Gaussovské zmesi učené algoritmom EM tiež priraďujú body do zhlukov „mäkko“ — lenže pravdepodobnosťou, nie príslušnosťou. Výsledky bývajú podobné, výklad sa líši presne tak, ako to opísal diel o fuzzy logike a pravdepodobnosti.
  • Embeddingy. Texty prevedené jazykovým modelom na vektory sa dajú zhlukovať rovnako; mäkké priradenie potom ukáže dokumenty, ktoré ležia medzi témami.

8. Zhrnutie

  • K-means priradí každý bod práve jednému zhluku a o bodoch na rozhraní nič nepovie.
  • Fuzzy c-means hľadá príslušnosti uij so súčtom 1 a stredy ako vážené priemery; strieda dva jednoduché kroky.
  • Na našich dátach našiel rovnaké stredy ako k-means a navyše ukázal, že body M1–M4 patria do dvoch alebo troch zhlukov zároveň.
  • Fuzzifikátor m riadi, aký mäkký je rozklad; koeficient rozkladu a Xieho–Beniho index pomôžu zvoliť počet zhlukov.
  • Podmienka súčtu 1 dáva odľahlým bodom vysoké príslušnosti; posibilistické varianty to riešia.

Chcete si to vyskúšať? Nechajte AI agenta pustiť fuzzy c-means na farby pixelov vlastnej fotky a zafarbiť ju podľa zhlukov — a pozrite sa, ktoré pixely ležia „medzi“ farbami.

Máte na to iný názor? Napíšte na support@coden-app.com.

Agent na vašom počítači, ovládaný z telefónu