05 · Bez nadzoru · 5 min czytania · aktualizacja
K-means czy DBSCAN — który algorytm klastrowania wybrać?
W skrócie
K-średnich dzieli dane na k zwartych, kulistych grup i przypisuje każdy punkt. DBSCAN szuka gęstych obszarów dowolnego kształtu i odrzuca punkty-szum.
Co to jest
K-średnich (k-means) wybierz, gdy spodziewasz się zwartych, mniej więcej kulistych grup podobnej wielkości, znasz (lub możesz sensownie dobrać) ich liczbę i każdy punkt ma trafić do jakiejś grupy; DBSCAN — gdy grupy mogą mieć dowolny kształt, ich liczba jest nieznana, a w danych jest szum, który należy odrzucić. DBSCAN zawodzi, gdy gęstość grup jest bardzo różna albo wymiarów jest dużo.
K-średnich pyta: „gdzie postawić k środków, żeby punkty były jak najbliżej swojego środka?”. DBSCAN pyta: „które punkty mają wokół siebie dość sąsiadów, żeby uznać je za wnętrze skupiska, i jak te wnętrza łączą się ze sobą?”. Pierwsze pytanie zakłada kształt grup, drugie — próg gęstości.
W praktyce oba algorytmy wymagają decyzji, której dane same nie podpowiedzą: k w k-średnich, promień ε i minimalna liczba sąsiadów w DBSCAN. To one, a nie wybór algorytmu, najczęściej rozstrzygają o wyniku.
Mechanizm — dlaczego tak działa
K-średnich minimalizuje sumę kwadratów odległości do środków. Algorytm na przemian przypisuje punkty do najbliższego środka i przesuwa środki do średniej przypisanych punktów. Granice między grupami to zawsze proste (hiperpłaszczyzny) w połowie drogi między środkami, więc grupy są wypukłe. Wydłużone, zakrzywione czy zagnieżdżone kształty zostaną pocięte. Każdy punkt, także odstający, trafia do jakiejś grupy i przesuwa jej środek.
DBSCAN łączy gęste sąsiedztwa. Punkt jest rdzeniowy, gdy w promieniu ε ma co najmniej min_samples sąsiadów. Rdzenie leżące w swoim zasięgu tworzą jedną grupę, punkty brzegowe dołączają do grupy rdzenia, w którego zasięgu leżą, a resztę oznacza się jako szum. Kształt grupy może być dowolny, bo liczy się tylko ciągłość gęstości. Liczba grup wychodzi sama.
Słabości DBSCAN. Jedno ε dla całego zbioru oznacza jeden próg gęstości. Gdy jedna grupa jest gęsta, a druga rzadka, żadne ε nie pasuje do obu. Dwie grupy połączone choćby wąskim pomostem gęstych punktów zleją się w jedną. W wielu wymiarach odległości między punktami się wyrównują i trudno znaleźć ε, które oddziela „blisko” od „daleko”. Rozwiązaniem części tych problemów jest HDBSCAN, który bada wszystkie progi gęstości naraz.
Słabości k-średnich. Trzeba podać k. Wynik zależy od inicjalizacji (stąd wielokrotne starty, n_init). Algorytm faworyzuje grupy o podobnym rozmiarze i rozproszeniu. Oba algorytmy działają na odległościach euklidesowych, więc wymagają standaryzacji cech.
Na przykładzie
Zgodność z prawdziwymi etykietami mierzę skorygowanym indeksem Randa (ARI: 1 = idealnie, 0 = jak losowo). Cechy standaryzowane. Dla DBSCAN podaję dwa wyniki: „wyrocznię” (najlepsze ε i min_samples z siatki wybrane przy znajomości etykiet, czyli nieosiągalne w praktyce) oraz heurystykę: min_samples = 2 × liczba wymiarów, ε = 90. percentyl odległości do min_samples-tego sąsiada.
| Zbiór | K-średnich (prawdziwe k) | DBSCAN: wyrocznia | DBSCAN: heurystyka | HDBSCAN (min_cluster_size=10) |
|---|---|---|---|---|
| Dwa półksiężyce (500 punktów) | 0,472 | 1,000 | 0,529 | 1,000 |
| Palmer Penguins (342, 4 cechy) | 0,799 | 0,818 | 0,643 | 0,646 |
| Iris (150, 4 cechy) | 0,620 | 0,568 | 0,544 | 0,564 |
| Wine (178, 13 cech) | 0,897 | 0,354 | ≈ 0 | 0,263 |
Na półksiężycach DBSCAN wygrywa: każde ε od 0,2 do 0,4 daje idealny podział, a k-średnich tnie oba kształty prostą. Ale heurystyka wybrała tu za małe ε (0,13) i pocięła półksiężyce na 7 kawałków — bezbłędny okazał się dopiero HDBSCAN. Na pingwinach DBSCAN z wyrocznią przebija k-średnich, ale za cenę 9,9% punktów-szumu i parametrów, których bez etykiet nie da się wybrać; heurystyka i HDBSCAN znajdują dwie grupy: pingwiny białobrewe osobno, pingwiny Adeli i maskowe razem. Na Wine, w 13 wymiarach, DBSCAN się rozsypuje: najlepsze ustawienie odrzuca 39% win jako szum, a przy min_samples=5 i ε do 1,0 wszystkie wina są szumem.
Uczciwe zastrzeżenie: k-średnich dostał prawdziwą liczbę grup. Gdy k wybrać według współczynnika sylwetki, wychodzi k = 2 na pingwinach i irysach — dokładnie tyle, ile widzą algorytmy gęstościowe. Na Wine sylwetka wskazuje poprawne k = 3.
Dane: Iris (irysy Fishera) Palmer Penguins (pingwiny z Antarktydy) Wine (wina z Piemontu)
W praktyce
Reguła wyboru:
- Grupy zwarte, liczba znana lub do sprawdzenia, potrzebne przypisanie każdego punktu →
make_pipeline(StandardScaler(), KMeans(n_clusters=k, n_init=10, random_state=0)); k sprawdzaj sylwetką (silhouette_score) i sensem merytorycznym. - Kształty nieregularne, szum, nieznana liczba grup, mało wymiarów (do ok. 10) →
DBSCAN(eps=eps, min_samples=2 * X.shape[1]); ε odczytaj z kolana posortowanych odległości do k-tego sąsiada (NearestNeighbors(n_neighbors=k).fit(X).kneighbors(X)). - Różne gęstości grup →
HDBSCAN(min_cluster_size=10)(scikit-learn 1.3+); jedynym ważnym parametrem jest minimalny rozmiar grupy. - Wiele wymiarów → najpierw redukcja (PCA do kilku–kilkunastu składowych), dopiero potem klastrowanie gęstościowe.
- Grupy eliptyczne o różnej wielkości i potrzeba prawdopodobieństw przynależności →
GaussianMixture(n_components=k). - Nowe punkty:
KMeans.predictdziała od ręki; DBSCAN nie mapredict— trzeba przypisywać do najbliższego punktu rdzeniowego (core_sample_indices_) ręcznie.
Najczęstsze pytania
- Jak dobrać ε w DBSCAN bez etykiet?
- Policz dla każdego punktu odległość do k-tego najbliższego sąsiada (k = `min_samples`), posortuj i narysuj. Miejsce, w którym krzywa gwałtownie rośnie („kolano”), to dobry kandydat na ε. Schubert i in. (2017) zalecają `min_samples` równe dwukrotności liczby wymiarów jako punkt startowy.
- Czy DBSCAN nadaje się do wykrywania anomalii?
- Częściowo: punkty oznaczone jako szum to naturalni kandydaci na anomalie. Wynik zależy jednak mocno od ε, a algorytm nie daje stopnia „nietypowości”. Do wykrywania anomalii lepsze są metody, które to wprost mierzą, np. Isolation Forest czy Local Outlier Factor.
- Który algorytm jest szybszy?
- K-średnich jest bardzo szybki i skaluje się liniowo z liczbą punktów, a `MiniBatchKMeans` radzi sobie z milionami. DBSCAN z indeksem przestrzennym działa dobrze w niskich wymiarach, ale w wysokich i przy dużym ε może potrzebować czasu i pamięci rosnących kwadratowo.
Źródła
- Ester M., Kriegel H.-P., Sander J., Xu X. „A Density-Based Algorithm for Discovering Clusters in Large Spatial Databases with Noise”, KDD 1996, s. 226–231.
- Lloyd S. P. „Least squares quantization in PCM”, IEEE Transactions on Information Theory 28(2), 1982, s. 129–137.
- Schubert E., Sander J., Ester M., Kriegel H.-P., Xu X. „DBSCAN Revisited, Revisited: Why and How You Should (Still) Use DBSCAN”, ACM Transactions on Database Systems 42(3), 2017.
- Campello R. J. G. B., Moulavi D., Sander J. „Density-Based Clustering Based on Hierarchical Density Estimates”, PAKDD 2013.
- Dokumentacja scikit-learn, „Clustering”: https://scikit-learn.org/stable/modules/clustering.html