共计 2346 个字符,预计需要花费 6 分钟才能阅读完成。
层次化聚类基础概念
层次化聚类(Hierarchical Clustering)是一种通过构建树状结构(树状图)来展示数据点之间关系的聚类方法。与 K -means 等划分式聚类不同,层次化聚类不需要预先指定聚类数量,而是通过自底向上(凝聚式)或自顶向下(分裂式)的方式逐步合并或拆分簇。

- 凝聚式(Agglomerative):从单个数据点开始,逐步合并最相似的簇,直到所有点合并为一个簇。
- 分裂式(Divisive):从所有数据点为一个簇开始,逐步分裂为更小的簇,直到每个点为一个簇。
层次化聚类的优势在于:
- 不需要预先指定聚类数量(k 值)。
- 通过树状图直观展示数据层次结构。
- 适用于小规模数据集,结果易于解释。
传统 k 值确定方法的局限性
在层次化聚类中,确定最佳 k 值(聚类数量)是一个关键问题。传统方法如肘部法则(Elbow Method)或轮廓系数(Silhouette Score)虽然常用,但存在以下局限性:
- 肘部法则主观性强 :依赖人工观察拐点,缺乏客观标准。
- 轮廓系数计算量大 :对于大规模数据集,计算所有可能的 k 值轮廓系数耗时较长。
- 忽略层次结构 :传统方法未充分利用层次化聚类生成的树状图信息。
基于 agg 算法的 k 值优化方案
1. 轮廓系数分析
轮廓系数衡量了数据点与同簇和其他簇的相似度,取值范围为 [-1, 1],值越大表示聚类效果越好。
- 步骤 :
- 对不同的 k 值计算轮廓系数。
- 选择轮廓系数最大的 k 值作为最佳聚类数量。
2. 树状图切割技术
树状图切割是一种基于层次化聚类树状结构的方法,通过切割树状图的高度(距离阈值)来确定 k 值。
- 步骤 :
- 绘制树状图(Dendrogram)。
- 观察树状图的垂直高度,选择合适的高度切割线。
- 切割线相交的簇数量即为最佳 k 值。
Python 代码实现
以下是使用 scikit-learn 实现 agg 层次化聚类并确定最佳 k 值的完整代码:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import AgglomerativeClustering
from sklearn.metrics import silhouette_score
from scipy.cluster.hierarchy import dendrogram, linkage
# 生成示例数据
np.random.seed(42)
X = np.random.randn(100, 2)
# 层次化聚类
linked = linkage(X, method='ward')
# 绘制树状图
plt.figure(figsize=(10, 7))
dendrogram(linked, orientation='top', distance_sort='descending', show_leaf_counts=True)
plt.title('Dendrogram')
plt.xlabel('Sample Index')
plt.ylabel('Distance')
plt.show()
# 基于轮廓系数确定最佳 k 值
k_range = range(2, 10)
silhouette_scores = []
for k in k_range:
clusterer = AgglomerativeClustering(n_clusters=k, affinity='euclidean', linkage='ward')
cluster_labels = clusterer.fit_predict(X)
silhouette_avg = silhouette_score(X, cluster_labels)
silhouette_scores.append(silhouette_avg)
# 绘制轮廓系数图
plt.figure(figsize=(10, 7))
plt.plot(k_range, silhouette_scores, marker='o')
plt.xlabel('Number of Clusters (k)')
plt.ylabel('Silhouette Score')
plt.title('Silhouette Score for Different k Values')
plt.show()
# 选择最佳 k 值
best_k = k_range[np.argmax(silhouette_scores)]
print(f'Best k value based on Silhouette Score: {best_k}')
性能对比测试结果
我们在多个数据集上对比了轮廓系数和树状图切割方法的性能:
- 小规模数据集(100-1000 个样本):两种方法效果接近,轮廓系数略优。
- 中等规模数据集(1000-10000 个样本):树状图切割计算速度更快,但轮廓系数更稳定。
- 大规模数据集(10000+ 样本):树状图切割方法显优势,轮廓系数计算成本过高。
生产环境中的最佳实践
- 数据预处理 :标准化或归一化数据,避免量纲影响距离计算。
- 距离度量选择 :根据数据类型选择合适的距离度量(如欧氏距离、余弦相似度等)。
- 并行计算 :对于大规模数据,使用并行化工具(如 joblib)加速轮廓系数计算。
- 可视化验证 :始终通过树状图和轮廓系数图验证 k 值选择的合理性。
常见问题解决方案
- 轮廓系数为负值 :可能是聚类数量过多或数据本身不适合聚类。
- 树状图过于密集 :尝试使用不同的链接方法(如 single、complete、average 等)。
- k 值不稳定 :检查数据是否有噪声或异常值,考虑使用鲁棒性更强的距离度量。
开放性问题
- 不同的距离度量(如曼哈顿距离、马氏距离)如何影响层次化聚类的效果?
- 在超高维数据中,层次化聚类的表现如何?是否有改进方法?
- 如何结合领域知识优化 k 值的选择?
希望这篇文章能帮助你更好地理解和使用 agg 层次化聚类确定最佳 k 值。如果你有更多问题或想法,欢迎在评论区讨论!
正文完
