Machine Learning Academy · Lektion

DBSCAN: Kärnpunkter, gränspunkter och brus

Ni kommer att konfigurera eps och min_samples, identifiera kärn-, gräns- och brus­punkter i en halvmåneformad datamängd och se DBSCAN upptäcka icke-konvexa kluster som K-Means missar.

Lektion 3 av 413 steg

DBSCAN: Kärnpunkter, gränspunkter och brus är en gratis lektion i Machine Learning Academy på CoddyKit. Detta är lektion 3 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Machine Learning Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Machine Learning Academy innehåller totalt 4 lektioner.

Varför K-Means misslyckas med godtyckliga former

K-Means förutsätter att klustren är konvexa och ungefär sfäriska. Algoritmen misslyckas med halvmåneformade, ringformade eller utdragna strukturer eftersom den delar upp data utifrån avståndet till centroiderna. DBSCAN (Density-Based Spatial Clustering of Applications with Noise) löser detta genom att definiera kluster som täta regioner separerade av områden med låg täthet och därmed upptäcka kluster av godtycklig form.

Två viktiga hyperparametrar: eps och min_samples

DBSCAN styrs av två parametrar: eps (epsilon) definierar radien för ett grannskap runt en punkt, och min_samples anger det minsta antalet punkter (inklusive punkten själv) som måste finnas inom denna radie för att området ska betraktas som en tät region. Tillsammans avgör de vilka punkter som är kärnpunkter, gränspunkter eller brus.

Kärnpunkter: de täta områdenas ankare

En punkt är en kärnpunkt om minst min_samples punkter (inklusive punkten själv) ligger inom avståndet eps. Kärnpunkter är de frön som kluster växer från. Varje punkt inom kärnpunktens grannskap är direkt nåbar från den – grunden för att utöka klustret.

from sklearn.neighbors import BallTree
import numpy as np

X = np.array([[0, 0], [0.3, 0], [0.6, 0],
              [5, 5], [10, 10]])
eps = 1.0
min_samples = 3

tree = BallTree(X)
counts = tree.query_radius(X, r=eps, count_only=True)
core_mask = counts >= min_samples
print('Core points:', np.where(core_mask)[0])  # indices 0, 1, 2

Randpunkter och täthetsnåbarhet

En randpunkt har färre än min_samples grannar inom eps, men ligger inom en kärnpunkts eps-grannskap. Den tillhör kärnpunktens kluster, men utökar inte klustret vidare. En punkt är täthetskopplad till en annan om det finns en kedja av direkt nåbara steg som länkar samman dem via kärnpunkter.

Bruspunkter: identifiera avvikare utan extra kostnad

Punkter som är varken kärn- eller randpunkter – isolerade punkter med för få grannar – märks som brus (etiketten = -1 i scikit-learn). Det gör DBSCAN till en naturlig avvikardetektor: avvikelser som inte tillhör något tätt kluster markeras automatiskt som brus utan någon extra konfiguration.

Köra DBSCAN i scikit-learn

Använd sklearn.cluster.DBSCAN. Efter träningen innehåller db.labels_ heltals-ID:n för klustren som börjar på 0, och -1 för brus. db.core_sample_indices_ anger vilka observationer som är kärnpunkter. Antalet kluster bestäms automatiskt – inget k behöver anges i förväg.

from sklearn.cluster import DBSCAN
from sklearn.datasets import make_moons
import numpy as np

X, _ = make_moons(n_samples=200, noise=0.05, random_state=0)

db = DBSCAN(eps=0.3, min_samples=5)
db.fit(X)

n_clusters = len(set(db.labels_)) - (1 if -1 in db.labels_ else 0)
n_noise = (db.labels_ == -1).sum()

print('Clusters found:', n_clusters)
print('Noise points:', n_noise)
print('Labels (first 10):', db.labels_[:10])

DBSCAN på icke-konvexa former

DBSCAN fungerar utmärkt på dataset som två sammanflätade månar eller koncentriska ringar – former där K-Means misslyckas fullständigt. Eftersom DBSCAN utökar kluster längs täthetskedjor följer algoritmen naturligt datas kurvformade mångfald. Detta är en grundläggande algoritmisk fördel för geospatiala data, biologiska cellkluster och dataset med inbäddade avvikelser.

import matplotlib.pyplot as plt
from sklearn.cluster import DBSCAN, KMeans
from sklearn.datasets import make_moons

X, _ = make_moons(n_samples=300, noise=0.05, random_state=0)

db_labels = DBSCAN(eps=0.25, min_samples=5).fit_predict(X)
km_labels = KMeans(n_clusters=2, random_state=0, n_init=10).fit_predict(X)

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 4))
ax1.scatter(X[:, 0], X[:, 1], c=db_labels, cmap='tab10')
ax1.set_title('DBSCAN')
ax2.scatter(X[:, 0], X[:, 1], c=km_labels, cmap='tab10')
ax2.set_title('K-Means')
plt.show()

Välja eps: k-avståndsdiagrammet

Ett praktiskt sätt att välja eps är att rita k-avståndsdiagrammet: beräkna varje punkts avstånd till dess k:te närmaste granne (där k = min_samples), sortera dessa avstånd och leta efter knäpunkten. Avståndet vid knäpunkten är en bra kandidat för eps. Punkter ovanför knäpunkten ligger i glesa områden (brus), medan punkter under den ligger i täta områden.

from sklearn.neighbors import NearestNeighbors
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons

X, _ = make_moons(n_samples=200, noise=0.05, random_state=0)
min_samples = 5

nn = NearestNeighbors(n_neighbors=min_samples)
nn.fit(X)
distances, _ = nn.kneighbors(X)
k_distances = np.sort(distances[:, -1])[::-1]

plt.plot(k_distances)
plt.xlabel('Points sorted by distance')
plt.ylabel(f'{min_samples}-th nearest neighbour distance')
plt.title('K-Distance Plot for eps selection')
plt.show()

Hur eps och min_samples påverkar resultaten

Om eps ökas slås kluster samman (så småningom blir allt ett enda kluster). Om eps minskas skapas fler kluster och mer brus. Om min_samples ökas krävs tätare kärnor, vilket gör det svårare att bilda kluster och genererar fler brus­punkter. Båda parametrarna måste justeras tillsammans – k-avståndsdiagrammet vägleder valet av eps, medan min_samples vanligtvis sätts till datas dimensionalitet plus ett som startvärde.

DBSCAN jämfört med K-Means: när ska respektive algoritm användas

Använd DBSCAN när klustren har oregelbundna former, när k inte är känt i förväg, när avvikardetektering är viktig eller när data har varierande täthet. Använd K-Means när klustren är ungefär sfäriska, när datasetet är mycket stort (DBSCAN skalas som O(n log n) med ett spatialt index) eller när ni behöver ett specifikt antal kluster av affärsmässiga skäl, till exempel marknadssegmentering i exakt 5 regioner.

DBSCAN för geospatial klustring

DBSCAN är särskilt populärt för geospatial klustring (att hitta hotspots i GPS-data), eftersom algoritmen naturligt identifierar täta stadsområden och samtidigt markerar glesa landsbygdspunkter som brus. Använd metric='haversine' och konvertera koordinaterna till radianer för att klustra utifrån storcirkelavstånd på jordens yta. Resultatet blir geografiskt meningsfulla kluster utan att deras antal behöver anges.

import numpy as np
from sklearn.cluster import DBSCAN

# Sample GPS coords: (lat, lon) in radians
coords = np.radians([
    [40.7128, -74.0060],  # NYC
    [40.6892, -74.0445],  # nearby
    [40.7282, -73.7949],  # Queens
    [51.5074, -0.1278],   # London
])

# eps in radians: 1km / earth radius
eps_rad = 1.0 / 6371.0
db = DBSCAN(eps=eps_rad, min_samples=2, metric='haversine')
db.fit(coords)
print('Cluster labels:', db.labels_)

Snabbtest

Testa er förståelse av DBSCAN-begreppen från den här lektionen.

Sammanfattning av lektionen

I den här lektionen lärde ni er att DBSCAN klassificerar punkter som kärna, rand eller brus utifrån eps-radien och tröskeln min_samples, att algoritmen hittar kluster med godtycklig form genom att kedja samman täthetsnåbara kärnpunkter, samt att bruspunkter (etikett -1) automatiskt blir avvikare – en funktion som K-Means inte erbjuder. Härnäst tillämpar vi klustring från början till slut i ett projekt för kundsegmentering.

Gratis att börja

Lär dig Python med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
30
Lektioner
120

Vanliga frågor

Är lektionen ”DBSCAN: Kärnpunkter, gränspunkter och brus” gratis?

Ja – hela texten till ”DBSCAN: Kärnpunkter, gränspunkter och brus” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Machine Learning Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i Machine Learning Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”DBSCAN: Kärnpunkter, gränspunkter och brus”?

Ni kommer att konfigurera eps och min_samples, identifiera kärn-, gräns- och brus­punkter i en halvmåneformad datamängd och se DBSCAN upptäcka icke-konvexa kluster som K-Means missar. Ni övar på Machine Learning Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Machine Learning Academy?

Du behöver inga förkunskaper. Utbildningen i Machine Learning Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 4.

Hur lång tid tar lektionen ”DBSCAN: Kärnpunkter, gränspunkter och brus”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Machine Learning Academy-lektionen?

Ja. Varje Machine Learning Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. K-Means: Centroider, tilldelning och uppdateringssteg
  2. Välja K: Armbågsmetoden och silhuettpoäng
  3. DBSCAN: Kärnpunkter, gränspunkter och brus
  4. Klustring för kundsegmentering: Ett exempel från början till slut
← Tillbaka till Machine Learning Academy