Surya_from_1627

USML2

Aug 18th, 2026
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.29 KB | None | 0 0
  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from sklearn.datasets import make_blobs
  4.  
  5. # Generate sample 2D data
  6. X, _ = make_blobs(n_samples=300, centers=1, cluster_std=1.5, random_state=42)
  7.  
  8. def kmeans(X, k=2, max_iters=100):
  9.     centroids = X[np.random.choice(len(X), k, replace=False)]
  10.     for _ in range(max_iters):
  11.         labels = np.argmin(np.linalg.norm(X[:, np.newaxis] - centroids, axis=2), axis=1)
  12.         new_centroids = np.array([X[labels == i].mean(axis=0) for i in range(k)])
  13.         if np.allclose(centroids, new_centroids):
  14.             break
  15.         centroids = new_centroids
  16.     return centroids, labels
  17.  
  18. def calculate_sse(X, labels, centroids):
  19.     sse = 0.0
  20.     for i in range(len(centroids)):
  21.         cluster_points = X[labels == i]
  22.         sse += np.sum((cluster_points - centroids[i]) ** 2)
  23.     return sse
  24.  
  25. def bisecting_kmeans(X, final_k=4, max_iters=100):
  26.     clusters = [X]
  27.     labels_list = [np.zeros(len(X), dtype=int)]
  28.  
  29.     while len(clusters) < final_k:
  30.         # Choose the cluster with the highest SSE to split
  31.         sse_list = [calculate_sse(clusters[i], labels_list[i], [clusters[i].mean(axis=0)]) for i in range(len(clusters))]
  32.         idx_to_split = np.argmax(sse_list)
  33.  
  34.         cluster_to_split = clusters.pop(idx_to_split)
  35.         _ = labels_list.pop(idx_to_split)
  36.  
  37.         # Run standard k-means with k=2 on the selected cluster
  38.         centroids, labels = kmeans(cluster_to_split, k=2, max_iters=max_iters)
  39.  
  40.         # Split the cluster into two
  41.         clusters.append(cluster_to_split[labels == 0])
  42.         labels_list.append(np.full(np.sum(labels == 0), len(clusters) - 1))
  43.  
  44.         clusters.append(cluster_to_split[labels == 1])
  45.         labels_list.append(np.full(np.sum(labels == 1), len(clusters) - 1))
  46.  
  47.     # Create final labels
  48.     final_labels = np.zeros(len(X), dtype=int)
  49.     current_idx = 0
  50.     for cluster_idx, cluster in enumerate(clusters):
  51.         for point in cluster:
  52.             final_labels[np.all(X == point, axis=1)] = cluster_idx
  53.  
  54.     return final_labels, clusters
  55.  
  56. # Run bisecting k-means
  57. k = 4
  58. labels, clusters = bisecting_kmeans(X, final_k=k)
  59.  
  60. # Plot the result
  61. plt.figure(figsize=(8, 6))
  62. plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='tab10', s=30)
  63. plt.title(f"Bisecting K-Means Clustering (k={k})")
  64. plt.show()
Advertisement
Add Comment
Please, Sign In to add comment