📚 সমস্ত অধ্যায় দেখুন
অধ্যায়/ফেজ 2 · Phase 2 · Algorithms
2.8২০ মিনিট পড়া18 / 68

Clustering — K-Means, DBSCAN

Clustering

Unsupervised grouping এর algorithm।

Hook — দোকানে ক্রেতার দল

একটি shopping mall এ ক্রেতারা আপনাআপনি কিছু group এ পড়ে — কেউ student, কেউ family, কেউ premium shopper। কেউ আগে থেকে label করে দেয়নি। এই “লুকানো group” বের করাই Clustering এর কাজ।

Concept — তিনটি প্রধান algorithm

  • K-Means — পরিচিত K এর জন্য centroid-based।
  • DBSCAN — density-based, K লাগে না, noise detect করে।
  • Hierarchical (Agglomerative) — dendrogram, যেকোনো level এ cut।

Math — K-Means Objective

J = Σ_k Σ_(x ∈ Cₖ) ||x − μₖ||²

Alternating optimization: (১) প্রতি point কে nearest centroid এ assign, (২) প্রতি cluster এর centroid update। যতক্ষণ না convergence।

Elbow Method

K বাড়ালে inertia কমতে থাকে। যেখানে কমার হার হঠাৎ ধীর হয় — সেটাই সম্ভাব্য K।

Silhouette Score

s = (b − a) / max(a, b), s ∈ [−1, 1]

Real-world Use

  • Customer segmentation।
  • Document/topic clustering।
  • Image compression (color quantization)।
  • Anomaly detection (DBSCAN)।

Code — তিনটি algorithm এক জায়গায়

clustering_compare.py
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons, make_blobs
from sklearn.cluster import KMeans, DBSCAN, AgglomerativeClustering
from sklearn.preprocessing import StandardScaler

X, _ = make_moons(n_samples=400, noise=0.08, random_state=42)
X = StandardScaler().fit_transform(X)

algos = {
    "K-Means (k=2)": KMeans(n_clusters=2, n_init=10, random_state=42),
    "DBSCAN":        DBSCAN(eps=0.25, min_samples=5),
    "Agglomerative": AgglomerativeClustering(n_clusters=2, linkage="ward"),
}

fig, ax = plt.subplots(1, 3, figsize=(12, 4))
for i, (name, algo) in enumerate(algos.items()):
    labels = algo.fit_predict(X)
    ax[i].scatter(X[:, 0], X[:, 1], c=labels, cmap="viridis", s=10)
    ax[i].set_title(name)
plt.show()

Elbow + Silhouette

elbow.py
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
from sklearn.datasets import make_blobs

X, _ = make_blobs(n_samples=500, centers=4, random_state=42)

for k in range(2, 9):
    km = KMeans(n_clusters=k, n_init=10, random_state=42).fit(X)
    print(f"k={k}  inertia={km.inertia_:.1f}  silhouette={silhouette_score(X, km.labels_):.3f}")

Common Mistakes

সাবধান

Scaling ছাড়া clustering — বড় scale এর feature dominate করে cluster বানিয়ে দেয়।

  • K এর জন্য random guess — Elbow/Silhouette দেখো।
  • Non-spherical data এ K-Means চাপানো — DBSCAN চেষ্টা করো।
  • DBSCAN এ eps tune না করা — সব noise হয়ে যেতে পারে।
  • Cluster কে label এর মত interpret করা — মানে domain knowledge দিয়ে দিতে হয়।

Practice Tasks

  • Task 1: make_moons এ K-Means vs DBSCAN visually তুলনা।
  • Task 2: Mall customer dataset এ ৫ cluster বের করো ও describe।
  • Task 3: Hierarchical এর dendrogram (scipy) plot করো।

Mini Project — Image Color Compression

একটি image এর সব pixel কে RGB vector হিসাবে নিয়ে K-Means (k=16) চালাও। প্রতিটি pixel কে তার nearest centroid দিয়ে replace করে compressed image বানাও। Original vs compressed তুলনা করো।

Summary

এক নজরে

Clustering = label ছাড়া group খুঁজে বের করা। K-Means দ্রুত, DBSCAN noise-aware, Hierarchical interpretable।