1.源码
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import AgglomerativeClustering
from scipy.cluster.hierarchy import dendrogram, linkage
from sklearn.decomposition import PCA
from sklearn.metrics import silhouette_score, adjusted_rand_score
# 加载数据集
iris = load_iris()
X = iris.data
y = iris.target
# 数据预处理(标准化)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 聚类
agg_clustering = AgglomerativeClustering(n_clusters=3)
y_pred = agg_clustering.fit_predict(X_scaled)
# 使用 PCA 降维到 2 个主成分以便可视化
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)
# 绘制原始数据的二维 PCA 投影
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y, cmap='rainbow', edgecolor='k', s=50)
plt.title('Original Iris Data (PCA)')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
# 绘制聚类结果
plt.subplot(1, 2, 2)
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y_pred, cmap='rainbow', edgecolor='k', s=50)
plt.title('Agglomerative Clustering Results (PCA)')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.show()
# 绘制层次聚类树状图(dendrogram)
linked = linkage(X_scaled, 'ward')
plt.figure(figsize=(10, 7))
dendrogram(linked, orientation='top', distance_sort='descending', show_leaf_counts=True)
plt.title('Dendrogram (Iris Dataset)')
plt.show()
# 计算并打印聚类质量指标
silhouette_avg = silhouette_score(X_scaled, y_pred)
ari = adjusted_rand_score(y, y_pred)
print(f'Silhouette Score: {silhouette_avg:.3f}')
print(f'Adjusted Rand Index: {ari:.3f}')
# 绘制每个簇的分布直方图
plt.figure(figsize=(12, 6))
for i in range(4):
plt.subplot(2, 2, i+1)
plt.hist(X[:, i], bins=20, color='blue', edgecolor='black')
plt.title(iris.feature_names[i])
plt.suptitle('Feature Distributions')
plt.show()
# 绘制聚类结果的散点矩阵图
from pandas.plotting import scatter_matrix
import pandas as pd
df = pd.DataFrame(X, columns=iris.feature_names)
df['Cluster'] = y_pred
scatter_matrix(df, alpha=0.8, figsize=(12, 12), diagonal='kde', c=y_pred, cmap='rainbow', marker='o')
plt.suptitle('Scatter Matrix of Clustering Results')
plt.show()
2.运行结果