能否给出一个使用Python实现的层次聚类(例如Agglomerative Clustering)算法的数据聚类代码示例,并解释相关的评估指标?
时间: 2024-10-29 19:09:14 浏览: 42
当然可以。这里是一个使用scikit-learn库实现层次聚类(Hierarchical Agglomerative Clustering, HAC)的例子:
```python
import numpy as np
import pandas as pd
from sklearn.cluster import AgglomerativeClustering
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import dendrogram, silhouette_score
# 假设我们有一个二维数据集
data = pd.read_csv('your_data.csv')
X = data.values
# 数据预处理:标准化数据(如果需要)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 实现层次聚类
cluster = AgglomerativeClustering(n_clusters=3, affinity='euclidean', linkage='ward')
labels = cluster.fit_predict(X_scaled)
# 绘制 dendrogram 来可视化聚类过程
plt.figure(figsize=(15, 6))
dendrogram(cluster.dendrogram_, labels=data.columns)
plt.title("Hierarchical Clustering Dendrogram")
plt.xlabel("Samples")
plt.ylabel("Distance")
# 计算轮廓系数(Silhouette Score),评估聚类质量
score = silhouette_score(X_scaled, labels)
print(f"Silhouette Score: {score:.3f}")
```
在这个例子中,`n_clusters`设置为3,表示我们将数据分为3个簇。`affinity`参数决定了相似度计算的方式(这里使用欧氏距离),`linkage`参数指定了合并策略(这里是ward方法,倾向于形成均匀大小的簇)。
**评估指标:**
1. **轮廓系数(Silhouette Score)**:它衡量的是样本与其所在簇的紧密度与与其他簇的分离度之间的平衡。范围从-1到1,数值越高,聚类效果越好。当分数接近0时,表示样本可能不属于其所属的簇;负数则表示样本更接近其他簇。
2. **Dendrogram(树状图)**:通过树状图可以直接观察聚类过程中的聚合顺序,帮助理解数据的自然结构。每个节点代表一个簇,从根部开始,随着聚合的进行,节点越来越小直到达到最终的聚类结果。
阅读全文