AW Dev Rethought

βœ‚οΈ Perfection is achieved not when there is nothing more to add, but when there is nothing left to take away - Antoine de Saint-ExupΓ©ry

🧠 AI with Python – πŸπŸ“ˆπŸ“Š Elbow Method to Find Optimal k


Description:

Clustering is a powerful unsupervised learning technique, but one common challenge is deciding the number of clusters (k) to use.

The Elbow Method provides a simple, visual way to determine the optimal k for K-Means clustering.


Why Do We Need the Elbow Method?

  • K-Means requires k in advance.
  • Too few clusters β†’ underfitting (broad, meaningless groups).
  • Too many clusters β†’ overfitting (clusters lose interpretability).
  • The Elbow Method strikes a balance by analyzing how clustering performance improves with increasing k.

How It Works

The Elbow Method uses inertia (also called Within-Cluster Sum of Squares, WCSS):

  • Inertia measures how tightly grouped the points are within each cluster.
  • As k increases, inertia decreases because points are closer to their centroids.
  • At some point, adding more clusters yields only marginal improvement β†’ this is the elbow point.

Applying the Elbow Method

We try different values of k and calculate inertia for each.

inertia = []
for k in range(1, 11):
    kmeans = KMeans(n_clusters=k, n_init=10, random_state=42)
    kmeans.fit(X_scaled)
    inertia.append(kmeans.inertia_)

Then we plot inertia against k to visualize the curve.

plt.plot(range(1, 11), inertia, marker="o", linestyle="--")
plt.xlabel("Number of clusters (k)")
plt.ylabel("Inertia (WCSS)")
plt.title("Elbow Method for Optimal k")
plt.show()

Sample Output

The resulting plot looks like this:

Elbow Method for Optimal k

Figure: Elbow Method for Optimal k.

πŸ“Š At first, inertia drops steeply. πŸ“Š After a certain k, the curve flattens. πŸ“Š That bend β€” the elbow point β€” suggests the optimal number of clusters.

In the demo dataset, the elbow occurs around k = 2 or 3.


Key Takeaways

  • The Elbow Method is a quick, intuitive way to estimate k.
  • Works best when clusters are well separated.
  • Should be combined with other methods (e.g., Silhouette Score) for confirmation.
  • Helps avoid overfitting by not adding unnecessary clusters.

Code Snippet:

# Core libraries
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans


# Demo dataset
data = {
    "CustomerID": range(1, 21),
    "AnnualIncome_k$": [15, 16, 17, 18, 20, 22, 25, 28, 30, 33, 60, 62, 65, 68, 70, 72, 75, 78, 80, 85],
    "SpendingScore":   [18, 20, 22, 25, 28, 30, 35, 40, 42, 45, 55, 58, 60, 62, 65, 66, 68, 70, 72, 75],
}
df = pd.DataFrame(data)

features = ["AnnualIncome_k$", "SpendingScore"]
X = df[features].values

# Standardize features
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)


inertia = []

# Try k from 1 to 10
for k in range(1, 11):
    kmeans = KMeans(n_clusters=k, n_init=10, random_state=42)
    kmeans.fit(X_scaled)
    inertia.append(kmeans.inertia_)


plt.figure(figsize=(7, 5))
plt.plot(range(1, 11), inertia, marker="o", linestyle="--", color="b")
plt.title("Elbow Method for Optimal k")
plt.xlabel("Number of clusters (k)")
plt.ylabel("Inertia (WCSS)")
plt.xticks(range(1, 11))
plt.grid(True)
plt.show()

Link copied!

Comments

Add Your Comment

Comment Added!