To validate your clustering results, you can use several approaches:
Quality Metrics: Use sklearn.metrics (e.g., silhouette_score, calinski_harabasz_score, davies_bouldin_score) on the labels. You can also inspect clusterer.membership_strengths_ to see how strongly points belong to their assigned clusters.
Stability Analysis: Run the clustering multiple times with different random_state values to see if the resulting scores are consistent.
from sklearn.metrics import (
silhouette_score,
calinski_harabasz_score,
davies_bouldin_score
)
# Fit the clusterer
labels = clusterer.fit_predict(X)
# Calculate quality metrics
if len(np.unique(labels[labels >= 0])) > 1:
silhouette = silhouette_score(X, labels)
calinski_harabasz = calinski_harabasz_score(X, labels)
davies_bouldin = davies_bouldin_score(X, labels)
print(f"Silhouette Score: {silhouette:.3f}")
print(f"Calinski-Harabasz Score: {calinski_harabasz:.3f}")
print(f"Davies-Bouldin Score: {davies_bouldin:.3f}")
# Analyze membership strengths
strengths = clusterer.membership_strengths_
print(f"Average membership strength: {np.mean(strengths):.3f}")
print(f"Std of membership strengths: {np.std(strengths):.3f}")
# Test clustering stability across random seeds
stability_scores = []
for seed in range(10):
clusterer = EVoC(random_state=seed)
labels = clusterer.fit_predict(X)
if len(np.unique(labels[labels >= 0])) > 1:
score = silhouette_score(X, labels)
stability_scores.append(score)
print(f"Mean stability: {np.mean(stability_scores):.3f}")
print(f"Std stability: {np.std(stability_scores):.3f}")