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

如何按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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 11:21:03