Skip to main content
Back to Blog
AI/MLData Analysis
13 August 20266 min readUpdated 13 August 2026

Understanding K-Means Clustering

K Means Clustering is a method used to group similar data points into clusters without the need for labeled data. It helps in discovering hidden patterns by organizing data base...

Understanding K-Means Clustering

K-Means Clustering is a method used to group similar data points into clusters without the need for labeled data. It helps in discovering hidden patterns by organizing data based on similarities.

  • Identifies Natural Groupings: Useful for finding natural clusters in unlabeled datasets.
  • Operates on Distance: Groups points based on their proximity to cluster centers.
  • Applications: Frequently used in customer segmentation, image compression, and pattern discovery.
  • Data Structuring: Effective in organizing raw, unstructured data into meaningful formats.

How K-Means Clustering Works

Imagine having a dataset with items characterized by certain features, represented as vectors. The goal is to classify these items into groups, which can be achieved using the K-means algorithm. The variable "k" denotes the number of clusters you want to create.

The algorithm categorizes items into "k" clusters based on similarity, which is measured using the Euclidean distance. Here’s how it works:

  1. Initialization: Randomly select "k" cluster centroids.
  2. Assignment Step: Assign each data point to the nearest centroid, forming clusters.
  3. Update Step: Recalculate the centroid of each cluster by averaging the points within it.
  4. Repeat: Continue the process until the centroids stabilize or a set number of iterations is reached.

The aim is to partition the dataset into "k" clusters so that data points within each cluster are more similar to each other than to those in different clusters.

Choosing the right number of clusters is crucial for meaningful segmentation. The Elbow Method is a graphical tool used to determine the optimal number of clusters (k).

Mathematical Formulation

1. Euclidean Distance

The distance between a data point ( x ) and a centroid ( c ) is calculated as:

[ d(x, c) = \sqrt{\sum_{i=1}^{n}(x_i - c_i)^2} ]

Where:

  • ( x_i ) is the ( i^{th} ) feature of the data point.
  • ( c_i ) is the ( i^{th} ) feature of the centroid.
  • ( n ) is the number of features.

2. Centroid Update

After assigning all data points to clusters, each centroid is updated as the mean of all points belonging to that cluster:

[ c_j = \frac{1}{|C_j|}\sum_{x_i \in C_j}x_i ]

Where:

  • ( C_j ) is the set of points assigned to the ( j^{th} ) cluster.
  • ( |C_j| ) is the number of points in that cluster.

Applications of K-Means Clustering

K-Means is widely used due to its simplicity and efficiency:

  1. Data Segmentation: Commonly used for segmenting data into distinct groups, such as customer behavior analysis.
  2. Image Compression: Reduces image complexity by grouping similar pixels, aiding in storage and processing.
  3. Anomaly Detection: Identifies outliers by finding data points that don't fit into any cluster.
  4. Document Clustering: Groups similar documents in natural language processing, useful in recommendation systems.
  5. Managing Large Datasets: Helps organize large datasets into smaller, manageable groups based on similarity.

Implementing K-Means Clustering

Here’s how to implement K-Means using Python with a synthetic dataset.

Step 1: Import Libraries

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs

Step 2: Create Custom Dataset

Generate a synthetic dataset with make_blobs.

X, y = make_blobs(n_samples=500, n_features=2, centers=3, random_state=23)
plt.scatter(X[:, 0], X[:, 1])
plt.show()

Step 3: Feature Scaling

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
X = scaler.fit_transform(X)

Step 4: Initialize Random Centroids

Randomly initialize centroids for K-Means clustering.

k = 3
clusters = {}
np.random.seed(23)

for idx in range(k):
    center = 2 * (2 * np.random.random((X.shape[1],)) - 1)
    clusters[idx] = {'center': center, 'points': []}

Step 5: Plot Data Points with Random Centers

Plot the data points and initial centroids.

plt.scatter(X[:, 0], X[:, 1])
for i in clusters:
    center = clusters[i]['center']
    plt.scatter(center[0], center[1], marker='*', c='red')
plt.show()

Step 6: Define Euclidean Distance

Define a function to calculate distance between points.

def distance(p1, p2):
    return np.sqrt(np.sum((p1 - p2) ** 2))

Step 7: Assign and Update Clusters

Define functions to assign points to centroids and update centroids.

def assign_clusters(X, clusters):
    for idx in range(X.shape[0]):
        dist = [distance(X[idx], clusters[i]['center']) for i in range(k)]
        curr_cluster = np.argmin(dist)
        clusters[curr_cluster]['points'].append(X[idx])
    return clusters

def update_clusters(X, clusters):
    for i in range(k):
        points = np.array(clusters[i]['points'])
        if points.shape[0] > 0:
            clusters[i]['center'] = points.mean(axis=0)
            clusters[i]['points'] = []
    return clusters

Step 8: Predict Clusters

Create a function to predict the cluster for each data point.

def pred_cluster(X, clusters):
    pred = []
    for i in range(X.shape[0]):
        dist = [distance(X[i], clusters[j]['center']) for j in range(k)]
        pred.append(np.argmin(dist))
    return pred

Step 9: Iterate to Convergence

Repeat the assign and update steps until convergence.

max_iters = 100

for _ in range(max_iters):
    old_centers = [clusters[i]['center'].copy() for i in range(k)]
    clusters = assign_clusters(X, clusters)
    clusters = update_clusters(X, clusters)
    new_centers = [clusters[i]['center'] for i in range(k)]
    if np.allclose(old_centers, new_centers):
        break

pred = pred_cluster(X, clusters)

Step 10: Plot Results

Plot the data points colored by their predicted clusters and the final centroids.

plt.scatter(X[:, 0], X[:, 1], c=pred)
for i in clusters:
    center = clusters[i]['center']
    plt.scatter(center[0], center[1], marker='^', c='red')
plt.show()

Challenges

  • Choosing the Right Number of Clusters: Selecting the appropriate number of clusters can be challenging.
  • Sensitivity to Initial Centroids: The final clusters depend on the initial placement of centroids.
  • Non-Spherical Clusters: Assumes clusters are spherical and equally sized, which may not be the case.
  • Outliers: Sensitive to outliers, which can distort centroids and clusters.