寻求可识别多聚类分析结果中始终同簇元素组的算法
识别多聚类结果中始终同簇的元素组
当然有方法可以实现这个需求,核心是基于元素对在所有聚类结果中的共现情况来筛选,下面是几种直接实用的方案:
1. 共现矩阵+连通分量分析
这是最直接的思路:
- 先构建一个样本数×样本数的共现矩阵,矩阵中
cooccur[i,j]代表样本i和j在多少次聚类中被分到同一簇。 - 因为你要的是“始终同簇”,所以设定阈值为总聚类次数——只有当
cooccur[i,j]等于总次数时,认为i和j是稳定同簇的。 - 把满足条件的元素对转化为图的边,然后找这个图的连通分量,每个连通分量就是一组在所有聚类结果中都同属一簇的元素。
举个例子:如果你跑了5种聚类(average、single、complete、ward层次聚类+1种HDBSCAN),那只有当两个样本在这5次聚类里全部分到同一簇,才会被连边,最终连通起来的集合就是你要的稳定簇。
2. 硬投票+传递闭包合并
如果不想构建完整矩阵,也可以用更轻量化的方式:
- 遍历所有样本对,统计它们同簇的次数,直接筛选出同簇次数等于总聚类数的样本对。
- 再通过传递闭包把这些样本对合并成最大的集合:比如如果i和j稳定同簇,j和k稳定同簇,那i、j、k就属于同一组。
这种方法逻辑简单,不需要复杂的矩阵运算,适合样本量不大的场景。
实现示例(Python)
用基础工具就能快速实现,比如结合numpy和networkx:
import numpy as np import networkx as nx # 假设cluster_results是存储所有聚类标签的列表,每个元素是一维数组(每个值对应样本的簇ID) total_clusters = len(cluster_results) n_samples = len(cluster_results[0]) # 初始化共现矩阵 cooccur_matrix = np.zeros((n_samples, n_samples), dtype=int) # 填充共现矩阵 for labels in cluster_results: # 遍历所有样本对 for i in range(n_samples): for j in range(i + 1, n_samples): if labels[i] == labels[j]: cooccur_matrix[i, j] += 1 cooccur_matrix[j, i] += 1 # 构建只包含100%共现边的图 stable_graph = nx.Graph() for i in range(n_samples): for j in range(i + 1, n_samples): if cooccur_matrix[i, j] == total_clusters: stable_graph.add_edge(i, j) # 获取所有稳定簇 stable_groups = list(nx.connected_components(stable_graph))
注:如果你的聚类结果中存在噪声点(比如HDBSCAN的-1标签),需要提前处理——比如把噪声点排除在分析外,或者明确规则(比如只要某次被标记为噪声,就不纳入稳定簇)。
内容的提问来源于stack exchange,提问作者Ivan Z
相关产品推荐
相关产品推荐

