聚类分析做完之后,怎么知道每个样本数据属于哪一类
聚类完成后,给每条样本贴上“类别标签”只需要一句话:把聚类算法输出的簇分配向量(cluster label)原封不动地并回原始数据框即可。下面给出通用做法与常见误区,全程不出现任何表格。
- 获取簇标签
无论用 Python 的 scikit-learn 还是 R 的 stats::kmeans,拟合完后都会返回一个与样本数等长的整数向量,位置顺序与输入矩阵的行一一对应。
- Python:
kmeans.fit(X)
labels = kmeans.labels_ # 这就是簇编号 - R:
km <- kmeans(scale(X), centers=3)
labels <- km$cluster # 同样是簇编号
- 把标签挂回原数据
保持顺序不变,直接新增一列即可。
- Python:
df_raw = pd.read_csv('manuf_samples.csv')
df_raw['cluster_id'] = labels - R:
df_raw$cluster_id <- labels
此后,用 df_raw$cluster_id(R)或 df_raw['cluster_id'](Python)即可知道每条样本属于哪一类。若想只看第 i 类,直接按 cluster_id 过滤即可,例如
df_raw[df_raw['cluster_id'] == 0]
- 顺序一致性是唯一易错点
聚类前若做过行筛选、缺失值删除或 shuffle,一定确保“输入矩阵 X 的行号”与“原始数据框的行号”能对上。最安全的办法是:
- 聚类完把 labels 映射回 id,再 merge。
- 聚类结果不是“永久性真理”
每次随机初始化可能得到不同编号,甚至簇内成员也会小幅变动。若需复现,固定随机种子;若需跨时间比较,可把簇质心保存下来,下次用 predict 进行“分配”而非重新聚类。
一句话总结:聚类输出的 labels 向量就是样本→簇的“身份证”,只要按原顺序挂回原始数据框,就能随时查到每个样本归属。