DBSCAN

DBSCAN (Density-Based Spatial Clustering of Applications with Noise) to jeden z popularnych algorytmów grupowania (ang. clustering) danych. Jego głównym celem jest automatyczne odnajdywanie grup (ang. clusters) w danych i wydzielenie z nich punktów odstających (ang. outliers). Algorytm DBSCAN działa na podstawie gęstości punktów w przestrzeni danych, co sprawia, że jest odporny na szum i zniekształcenia w danych.

Oto jak działa algorytm DBSCAN:

  1. Użytkownik określa dwa parametry: Eps (promień sąsiedztwa) oraz MinPts (minimalna liczba punktów w sąsiedztwie).
  2. Algorytm przechodzi przez każdy punkt danych i sprawdza, ile innych punktów znajduje się w jego promieniu Eps. Jeśli liczba tych punktów jest większa lub równa MinPts, punkt jest oznaczany jako “gęsty”.
  3. Punkty oznaczone jako “gęste” są traktowane jako punkty centralne i algorytm rekurencyjnie dodaje do nich wszystkie inne punkty w ich promieniu Eps. Te punkty również są oznaczane jako “gęste” i proces jest kontynuowany, aż do momentu, gdy nie można już dodać żadnych nowych punktów. W ten sposób powstaje grupa (ang. cluster).
  4. Punkty, które nie zostały oznaczone jako “gęste” i nie zostały dodane do żadnej grupy, są oznaczane jako punkty odstające (ang. outliers).

Przykład:

from sklearn.cluster import DBSCAN
import numpy as np

# Przygotowanie danych - tworzenie macierzy 2D z losowymi punktami
X = np.random.rand(50, 2)

# Tworzenie modelu DBSCAN
dbscan = DBSCAN(eps=0.5, min_samples=3)

# Fitting modelu do danych
dbscan.fit(X)

# Wynik - etykiety grup
labels = dbscan.labels_

# Wydzielenie punktów odstających (outliers)
outliers = np.where(labels == -1)

# Wydzielenie pozostałych punktów
inliers = np.where(labels != -1)

print("Outliers:", X[outliers])
print("Inliers:", X[inliers])

W powyższym kodzie tworzymy macierz 2D z losowymi punktami (X) i tworzymy model DBSCAN z Eps=0.5 i MinPts=3. Następnie fitujemy model do danych i pobieramy etykiety grup (labels). Etykieta -1 oznacza punkt odstający, więc wydzielamy je za pomocą funkcji np.where() i wyświetlamy na ekranie.