You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻求可识别多聚类分析结果中始终同簇元素组的算法

识别多聚类结果中始终同簇的元素组

当然有方法可以实现这个需求,核心是基于元素对在所有聚类结果中的共现情况来筛选,下面是几种直接实用的方案:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 05:25:23