如何按DataFrame的CLASS列分组计算不同类别向量的余弦相似度
实现方法
你可以按分组提取特征、生成目标类别对、批量计算跨组余弦相似度的逻辑实现,全程用你已导入的依赖即可完成,不需要额外安装其他库:
import pandas as pd import scipy.spatial.distance as ssd import numpy as np from itertools import combinations_with_replacement # 1. 构建测试DataFrame df = pd.DataFrame({'SJDR': [2,3,7,8,0,0], 'TR': [0,0,0,1,1,3], 'BSO': [1,1,2,0,1,1], 'CLASS': [2,2,1,3,1,3]}) # 2. 定义特征列,排除CLASS标签列 feature_cols = [col for col in df.columns if col != 'CLASS'] # 3. 按CLASS分组,存储每个类别的特征矩阵 class_feature_map = { class_val: group[feature_cols].values for class_val, group in df.groupby('CLASS') } # 拿到所有唯一类别并排序,保证组合顺序稳定 sorted_classes = sorted(class_feature_map.keys()) # 4. 生成你需要的所有不重复类别组合 class_pairs = combinations_with_replacement(sorted_classes, 2) # 5. 遍历每个组合计算余弦相似度 for cls_a, cls_b in class_pairs: arr_a = class_feature_map[cls_a] arr_b = class_feature_map[cls_b] # 批量计算两组所有样本的余弦相似度,返回shape为 (len(arr_a), len(arr_b)) 的矩阵 sim_matrix = 1 - ssd.cdist(arr_a, arr_b, metric='cosine') print(f"===== Class {cls_a} x Class {cls_b} 余弦相似度矩阵 =====") print(sim_matrix) # 如果你需要拿到单个样本的相似度,比如类1第0个样本和类2第1个样本的相似度,直接取 sim_matrix[0][1] 即可
结果说明
- 输出的相似度矩阵中,第
i行第j位的值,代表Class A的第i个样本和Class B的第j个样本的余弦相似度,取值范围为[-1,1],值越高相似度越高 - 如果不需要计算同类样本的相似度(也就是
Class x x的组合),把combinations_with_replacement换成combinations即可,会自动生成仅不同类的组合:(1,2), (1,3), (2,3)
内容的提问来源于stack exchange,提问作者Costa.Gustavo
相关产品推荐
相关产品推荐

