等权重下含布尔特征的多列行向量cosine similarity计算及id匹配咨询
实现等权重余弦相似度匹配的完整流程
关键前置注意事项
如果直接用原始特征值计算余弦相似度,会出现特征量级差异导致的权重失衡问题:你当前数据集里size特征取值在1000-3000区间,剩下的计数/布尔特征取值在0-3区间,直接计算会让size的贡献度远高于其他特征,完全达不到“所有特征等权重”的要求。要实现真正的等权重,必须先对所有特征做min-max归一化,把每个特征的取值范围映射到[0,1]区间,保证单个特征对最终向量的贡献度对等。
具体计算步骤
- 拆分数据:把
id列单独作为样本标签,不参与相似度计算,剩下的size、numberOfPlants、三个布尔特征组成待计算的特征矩阵。 - 特征归一化(实现等权重):对每一列特征单独做min-max归一化,公式为:
归一化值 = (当前值 - 列最小值) / (列最大值 - 列最小值)
以你给出的数据集为例:size列的最小值是1191,最大值是3251,计算后四个样本的归一化值分别为0、1、0.218、0.457numberOfPlants列的最小值是1,最大值是3,计算后四个样本的归一化值分别为1、0.5、0、1- 三个布尔特征本身已经是0/1取值,不需要额外调整
最终每个样本的特征向量会被压缩到统一的取值尺度下,实现等权重贡献。
- 全量余弦相似度计算:
两个向量A、B的余弦相似度 = (A和B的逐元素乘积之和) / (A的模长 * B的模长)
逐行两两计算所有样本的余弦值,得到一个N行N列的相似度矩阵(N为样本总数),矩阵中第i行第j列的数值,就对应id为i的样本和id为j的样本的相似度,取值范围为0-1(因为所有特征都是非负的),值越大代表相似度越高。 - 按输入id查询最相似结果:
- 定位输入id在相似度矩阵中对应的行
- 剔除该行中对应自身的相似度值(固定为1,没有参考意义)
- 找到该行中剩余相似度值最大的位置,对应的列索引就是要返回的最相似样本id
实际计算示例
用你给出的原始数据集,归一化后四个样本的特征向量分别为:
- id0:
[0, 1, 0, 1, 1] - id1:
[1, 0.5, 1, 0, 0] - id2:
[0.218, 0, 1, 1, 0] - id3:
[0.457, 1, 0, 0, 1]
逐对计算后,当输入id=0时,和其他样本的相似度分别为0.577(匹配id1)、0.403(匹配id2)、0.778(匹配id3),最终返回的最相似id就是3。
快速实现思路
用Python完成全流程时不需要从零编写余弦相似度计算逻辑,可直接调用成熟的工具链:
- 用
MinMaxScaler完成特征归一化 - 用
cosine_similarity方法一次性计算全量相似度矩阵 - 封装简单的查询函数,传入id即可直接返回最相似的匹配结果
内容的提问来源于stack exchange,提问作者x89
相关产品推荐
相关产品推荐

