ML Atlas

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órK-średnich (prawdziwe k)DBSCAN: wyroczniaDBSCAN: heurystykaHDBSCAN (min_cluster_size=10)
Dwa półksiężyce (500 punktów)0,4721,0000,5291,000
Palmer Penguins (342, 4 cechy)0,7990,8180,6430,646
Iris (150, 4 cechy)0,6200,5680,5440,564
Wine (178, 13 cech)0,8970,354≈ 00,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.predict działa od ręki; DBSCAN nie ma predict — 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

Zobacz też