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

如何基于相似度为向量分配概率?余弦相似性结果异常问题

哈哈,我太懂这种困惑了——余弦相似度看起来好用,但有时候结果完全不符合直觉,这其实是因为它的设计目标和你实际想要衡量的「相似性」根本不是一回事儿!

问题根源:余弦相似度只看「方向」,不看「幅度」和「稀疏性」

先拆解你遇到的两个核心问题:

为什么看似不同的向量余弦相似度相同?

余弦相似度的计算公式是:
cos_sim(A,B) = (A·B) / (||A|| * ||B||)
它本质上是计算两个向量之间夹角的余弦值,只和向量的方向有关,和向量的长度(每个维度的数值大小)完全无关。比如:

  • 向量[1,2]和[2,4],方向完全一致,余弦相似度就是1,哪怕后者的数值是前者的两倍;
  • 哪怕是稀疏向量和稠密向量,只要它们的归一化方向一致,余弦值也会相同。你提到的示例2、3、4应该就是这种情况——它们的方向向量(归一化后)完全重合,所以余弦相似度相同,哪怕原始向量看起来差异很大。

为什么全90向量和单1向量的相似度有40%?

咱们手动算一遍就明白公式的逻辑了:

  1. 点积:90*0 + 90*0 + 90*1 + 90*0 + 90*0 + 90*0 = 90
  2. 全90向量的模:||A|| = sqrt(90²*6) = 90*sqrt(6) ≈ 220.45
  3. 单1向量的模:||B|| = sqrt(1²) = 1
  4. 余弦相似度:90/(220.45*1) ≈ 0.408,也就是约40%

这个结果完全符合公式计算,但不符合你的直觉——因为你觉得「相似」应该是大部分元素匹配或者稀疏性一致,但余弦相似度完全不关心这些,它只看两个向量在空间中的夹角,这显然不是你想要的「相似性」定义。

解决方案:选对适合你场景的相似度指标

根据你的需求,推荐这几个方向:

1. 如果你在意「数值大小差异」或「整体匹配度」

  • 欧氏距离(或归一化欧氏距离):直接计算向量间的直线距离,数值差异越大,距离越大,相似度越低。比如全90向量和单1向量的欧氏距离约为220,能直观反映出它们的不相似。
  • 曼哈顿距离:计算各维度绝对值差的和,同样能体现数值层面的差异。

2. 如果你在意「稀疏性/非零元素重叠」

  • 杰卡德相似度:计算两个向量非零元素的交集与并集的比值。比如全90向量非零元素是6个,单1向量是1个,交集是1个,所以相似度是1/6 ≈ 16.7%,更符合你对「不相似」的直觉判断。
  • 稀疏余弦相似度:只考虑两个向量中非零的共同维度来计算余弦值,忽略其中一个为零的维度,这样能排除稀疏性带来的干扰。

3. 自定义调整:转换向量后再计算

  • 把向量转为二进制向量:非零元素设为1,零设为0,再计算杰卡德或汉明相似度。比如全90向量转成[1,1,1,1,1,1],和[0,0,1,0,0,0]的汉明相似度是1 - 5/6 ≈ 16.7%,更贴合你的预期。
  • 给稀疏维度加权重:比如对非零元素少的向量,在计算相似度时给非零维度更高的权重,修正余弦相似度的结果。
总结

余弦相似度是个好工具,但它只适合衡量方向上的相似性(比如文本主题、用户偏好的方向)。如果你的场景需要考虑数值大小、稀疏性或者元素的实际匹配度,一定要换用更贴合需求的相似度指标——毕竟「相似」的定义本来就不是唯一的,得看你到底想衡量什么~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:09:49