聚类基础:K-Means 与层级聚类
聚类是无监督学习的核心任务:在没有真实标签时,把相似样本归到同一组。K-Means 以速度快著称,层级聚类则以树状结构保留细分关系。理解二者差异,才能为数据选对方法。
K-Means 怎么做
K-Means 先随机选 K 个质心,反复执行「把样本分到最近质心」与「用簇内均值更新质心」两步,直到质心稳定。目标是最小化簇内平方误差和(SSE)。
from sklearn.cluster import KMeans
km = KMeans(n_clusters=3, random_state=0, n_init=10)
labels = km.fit_predict(X)
print(km.inertia_) # 簇内平方误差和
层级聚类怎么算
层级聚类从每个样本各自成簇开始,反复合并最相近的两个簇,直到只剩一个根;或自顶向下分裂。结果是一棵 dendrogram,可在任意高度「横切」得到不同粒度的簇,无需预先指定 K。
from sklearn.cluster import AgglomerativeClustering
ac = AgglomerativeClustering(n_clusters=3, linkage="ward")
labels = ac.fit_predict(X)
怎么选簇数
K-Means 常用「肘部法」看 inertia 随 K 变化的拐点,或借助轮廓系数。层级聚类则靠观察树状图的高度。数据量大时 K-Means 更省内存,层级聚类多用于中小规模或需要层次关系的场景。
小结
K-Means 快但需给定 K、对球形簇友好;层级聚类无需预设 K、给出层次结构却开销大。先想清要稳定分组还是要可解释的树,再选方法。
参考与延伸阅读
- scikit-learn 聚类用户指南。已核验。https://scikit-learn.org/stable/modules/clustering.html
- scikit-learn KMeans 文档。已核验。https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html
本文累计阅读 — 次