如何高效生成簇内两两相关度超阈值的无重复物品聚类?
满足两两相关度阈值的聚类生成方案
核心思路
要生成簇内所有元素两两相关度≥0.7的聚类,本质是在元素的相关关系图中寻找团(Clique)——团内任意两个节点间都存在边(即相关度达标)。同时通过遍历上三角矩阵的方式,从根源避免自配对、重复配对的生成,减少算力消耗。
分步实现
1. 参数初始化与预处理
假设matrix是存储元素间相关度的DataFrame(行、列均为元素标识),先定义阈值并提取元素列表:
import pandas as pd import networkx as nx plimit = 0.7 # 提取所有元素名称 elements = matrix.index.tolist()
若
matrix是原始数据矩阵,需先计算相关系数矩阵:corr_matrix = matrix.corr(),后续用corr_matrix替代matrix即可。
2. 构建无向图(避免冗余配对)
只遍历上三角区域(索引i < j),跳过自配对(i=j)和反向配对(j < i),直接构建符合要求的边:
G = nx.Graph() G.add_nodes_from(elements) # 遍历上三角,仅处理i<j的元素对 for i in range(len(elements)): for j in range(i + 1, len(elements)): elem_a = elements[i] elem_b = elements[j] # 获取两两相关度 corr_value = matrix.loc[elem_a, elem_b] if corr_value >= plimit: G.add_edge(elem_a, elem_b)
3. 检测符合要求的聚类(团)
利用图论库的团检测方法,直接生成所有满足条件的簇:
# 找出所有最大团(团内无法再添加任何元素仍满足两两相关要求) clusters = list(nx.find_cliques(G)) # 若需调整为指定的9个聚类,可根据团的大小、元素数量等规则筛选/合并 # 示例:若团数量多于9,可优先保留规模较大的团,再处理剩余元素 # clusters = sorted(clusters, key=lambda x: len(x), reverse=True)[:9]
关键优势
- 算力优化:通过上三角遍历,全程不生成自配对、重复配对,无需后续冗余清理步骤
- 结果合规:生成的每个簇天然满足“两两相关度≥0.7”的要求,完全匹配需求
内容的提问来源于stack exchange,提问作者Sanjiv Prasad
相关产品推荐
相关产品推荐

