如何将相似度表转换为696×696矩阵?附数据集与需求
商品相似度矩阵生成方案(用于聚类)
数据集快照
"V1","V2","N" 16,17,0.065532029 16,30,0.070163826 17,30,0.053089888 29,30,0.068024596
数据背景
- 预处理过程:从客户订单及订单内商品列表出发,统计同订单内商品对的共现次数,使用Jaccard Index计算商品间相似度,得到当前数据集。
- 数据集说明:
V1、V2为物料编号,N为商品间相似度指数;仅包含同订单共现的商品对,存在大量缺失对。 - 需求目标:基于1-696共696个唯一物料编号,生成696×696的相似度矩阵,缺失商品对的相似度值设为0,用于后续商品聚类。
实现方案(Python + Pandas)
这是我常用的高效实现方式,适合快速处理这类矩阵生成需求:
import pandas as pd # 1. 读取你的数据集(替换为实际文件路径) # df = pd.read_csv("your_dataset.csv") # 这里用示例数据模拟 df = pd.DataFrame({ "V1": [16, 16, 17, 29], "V2": [17, 30, 30, 30], "N": [0.065532029, 0.070163826, 0.053089888, 0.068024596] }) # 2. 生成全量物料编号(1到696) all_materials = list(range(1, 697)) # 3. 构建对称数据:因为(V1,V2)和(V2,V1)的相似度是相同的 symmetric_df = pd.concat([ df, df.rename(columns={"V1": "V2", "V2": "V1"}) ]).drop_duplicates(subset=["V1", "V2"]) # 4. 生成相似度矩阵,缺失值填充为0 similarity_matrix = symmetric_df.pivot_table( index="V1", columns="V2", values="N", fill_value=0 ) # 5. 确保矩阵包含所有物料编号,避免遗漏无共现的商品 similarity_matrix = similarity_matrix.reindex( index=all_materials, columns=all_materials, fill_value=0 ) # 可选:转换为NumPy数组,方便直接传入聚类算法(如sklearn的KMeans) similarity_array = similarity_matrix.values
关键说明
- 为什么要构建对称数据?因为商品共现是双向的,比如商品16和17的相似度和17和16的完全一致,这样生成的矩阵才符合聚类算法的输入要求。
reindex步骤是核心:确保所有1-696的物料都出现在矩阵的行和列中,哪怕某个物料没有和任何其他商品共现,对应的行/列都会填充为0。- 生成的矩阵可以直接用于聚类,比如用
sklearn.cluster.KMeans或者层次聚类算法。
内容的提问来源于stack exchange,提问作者M.A
相关产品推荐
相关产品推荐

