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

如何将元组列表转换为任意规模的相似度矩阵?

从两两测量元组生成对称相似度矩阵

手动修复代码(适配任意规模数据集)

核心逻辑是先明确所有参与测量的元素,建立元素到矩阵索引的映射,再初始化完整尺寸的矩阵并对称填充值,彻底避免缺失问题:

def tuple_list_to_similarity_matrix(tuples):
    # 提取所有唯一元素并排序(保证矩阵行列顺序一致)
    elements = sorted(list({item for tpl in tuples for item in tpl[:2]}))
    n = len(elements)
    # 建立元素到索引的映射字典
    elem_to_idx = {elem: idx for idx, elem in enumerate(elements)}
    # 初始化全0对称矩阵
    matrix = [[0.0 for _ in range(n)] for _ in range(n)]
    
    # 填充对角线(自身相似度默认设为1,可按需调整)
    for i in range(n):
        matrix[i][i] = 1.0
    
    # 遍历元组,同时填充对称位置的值
    for elem1, elem2, score in tuples:
        i = elem_to_idx[elem1]
        j = elem_to_idx[elem2]
        matrix[i][j] = score
        matrix[j][i] = score
    
    return matrix, elements

# 测试5元素规模数据集
test_tuples = [('a', 'b', 1), ('a', 'c', 2), ('b', 'c', 3), ('a', 'd', 0.5), ('b', 'e', 1.2), ('d', 'e', 0.8)]
sim_matrix, labels = tuple_list_to_similarity_matrix(test_tuples)

print("元素标签:", labels)
print("相似度矩阵:")
for row in sim_matrix:
    print(row)

这段代码不管数据集多大,都会先枚举所有元素、初始化对应尺寸的矩阵,再逐个填充值,不会出现缺失项。

利用Python工具包简化操作

如果不想手动实现逻辑,可以用以下工具包快速完成转换:

1. Pandas(适合中小规模数据集)

借助透视表功能快速构建矩阵,再补全对称部分:

import pandas as pd

def pandas_tuple_to_matrix(tuples):
    df = pd.DataFrame(tuples, columns=['elem1', 'elem2', 'score'])
    # 构建透视表,缺失值填充为0
    pivot = pd.pivot_table(df, index='elem1', columns='elem2', values='score', fill_value=0)
    # 补全对称部分
    symmetric_pivot = pivot.add(pivot.T, fill_value=0)
    # 填充对角线为1
    for elem in symmetric_pivot.index:
        symmetric_pivot.loc[elem, elem] = 1.0
    # 转换为列表形式的矩阵
    return symmetric_pivot.values.tolist(), symmetric_pivot.index.tolist()

2. SciPy(适合超大规模稀疏数据集)

如果数据量极大,用稀疏矩阵能节省内存:

from scipy.sparse import lil_matrix

def scipy_tuple_to_matrix(tuples):
    elements = sorted(list({item for tpl in tuples for item in tpl[:2]}))
    elem_to_idx = {elem: idx for idx, elem in enumerate(elements)}
    n = len(elements)
    # 初始化稀疏矩阵
    sparse_mat = lil_matrix((n, n))
    # 填充对角线
    sparse_mat.setdiag([1.0]*n)
    # 填充对称值
    for elem1, elem2, score in tuples:
        i, j = elem_to_idx[elem1], elem_to_idx[elem2]
        sparse_mat[i, j] = score
        sparse_mat[j, i] = score
    # 转换为稠密矩阵(列表形式)
    return sparse_mat.todense().tolist(), elements

内容的提问来源于stack exchange,提问作者Marija

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 10:30:51