Practical 9:clustering
Code:-
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import dendrogram, linkage
from sklearn.cluster import AgglomerativeClustering, KMeans
from sklearn.datasets import load_wine
from sklearn.decomposition import PCA
from sklearn.metrics import silhouette_score
from sklearn.preprocessing import StandardScaler
# 1. Load the Wine Dataset
wine = load_wine()
wine_df = pd.DataFrame(data=wine.data, columns=wine.feature_names)
print("Data Summary:")
print(wine_df.describe())
scaler = StandardScaler()
X_scaled = scaler.fit_transform(wine_df)
# 3. Elbow Method to Find Optimal K
wss = []
for k in range(1, 11):
    kmeans = KMeans(n_clusters=k, random_state=42, n_init=10)
    kmeans.fit(X_scaled)
    wss.append(kmeans.inertia_)
plt.figure(figsize=(8, 4))
plt.plot(range(1, 11), wss, marker="o")
plt.xlabel("Number of clusters k")
plt.ylabel("Total within-cluster sum of squares (Inertia)")
plt.title("Elbow Method for Optimal K")
plt.show()
# 4. K-Means Clustering (Using k=3 since Wine has 3 natural classes)
kmeans = KMeans(n_clusters=3, random_state=42, n_init=10)
wine_df["kmeans_cluster"] = kmeans.fit_predict(X_scaled)
# Calculate Silhouette Score for K-Means
silhouette_avg_kmeans = silhouette_score(X_scaled, wine_df["kmeans_cluster"])
print(
    f"\nMean Silhouette Width for K-Means Clustering: {silhouette_avg_kmeans:.4f}"
)
# 5. Visualize K-Means with PCA (2D Projection)
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)
plt.figure(figsize=(8, 5))
plt.scatter(
    X_pca[:, 0], X_pca[:, 1], c=wine_df["kmeans_cluster"], cmap="viridis", s=50
)
plt.title("K-Means Clustering (PCA Reduced)")
plt.xlabel("Principal Component 1")
plt.ylabel("Principal Component 2")
plt.show()
# 6. Hierarchical Clustering - Dendrogram
linkage_matrix = linkage(X_scaled, method="ward")
plt.figure(figsize=(10, 5))
dendrogram(linkage_matrix)
plt.title("Hierarchical Clustering Dendrogram")
plt.xlabel("Sample Index")
plt.ylabel("Distance")
plt.show()
# 7. Agglomerative Clustering
agglomerative = AgglomerativeClustering(n_clusters=3)
wine_df["hierarchical_cluster"] = agglomerative.fit_predict(X_scaled)
# Calculate Silhouette Score for Hierarchical Clustering
silhouette_avg_hierarchical = silhouette_score(
    X_scaled, wine_df["hierarchical_cluster"]
)
print(
    f"Mean Silhouette Width for Hierarchical Clustering: {silhouette_avg_hierarchical:.4f}"
)
# 8. Visualize Hierarchical Clusters (e.g., Alcohol vs. Malic Acid)
plt.figure(figsize=(8, 5))
plt.scatter(
    wine_df["alcohol"],
    wine_df["malic_acid"],
    c=wine_df["hierarchical_cluster"],
    cmap="viridis",
    alpha=0.8,
    s=50,
)
plt.xlabel("Alcohol")
plt.ylabel("Malic Acid")
plt.title("Hierarchical Clustering (Alcohol vs Malic Acid)")
plt.show()
Output:-