【问题标题】:Cosine similarity python issue余弦相似度python问题
【发布时间】:2014-11-19 14:26:43
【问题描述】:

您好,我正在尝试计算我的查询与我使用 python 中的信息检索程序返回的文档之间的余弦相似度。

对于余弦相似度,我使用此实现:

import math
def cosine_similarity(v1,v2):

    sumxx, sumxy, sumyy = 0, 0, 0
    for i in range(len(v1)):
        x = v1[i]; y = v2[i]
        sumxx += x*x
        sumyy += y*y
        sumxy += x*y
    return sumxy/math.sqrt(sumxx*sumyy)

我在这个网站上找到了这个解决方案,但我遇到了一些问题。 i tf*idf 权重和每个文档的向量,这是一个文档向量的例子 和一个查询向量:

D: [0.028239449664633154, 0.05559373180364792, 0.02798439181455718]
Q: [0.3746433655507998, 0.526816791853616, 0.618765996788542] 

好的,所以问题是有时我做余弦相似度,结果大于1,这怎么可能?余弦不能大于1?我的推理正确吗? 在这种情况下做余弦相似度是否正确? 请帮帮我,谢谢

【问题讨论】:

  • 什么输入给你的结果大于 1?
  • D:[0.009063952392358061, 0.01055107112621112] Q:[0.5619650483261998, 0.6541664098250894]
  • butit 给了我 1.0000000000000002 作为结果,并且有些文档的权重较高,相似度较低
  • 好的,但是如果我的查询是 [draw , paint] 使用这种方法,我会得到与这些术语出现 1 次的文档的高度相似性,而在它们出现 20 次的文档中,我得到的相似性很低

标签: python information-retrieval cosine-similarity dot-product


【解决方案1】:

1) Cosine similarity 不能大于 1。

-1 <= cos_sim <= 1

2) 你得到的结果大于 1 可能是因为浮点数据类型。

浮点数在计算机硬件中以 2 为底表示 (二进制)分数。

在运行 Python 的典型机器上,有 53 位精度 可用于 Python 浮点数

如果 Python 要打印存储为 0.1 的二进制近似值的真实十进制值,则必须显示

>>> 0.1
0.1000000000000000055511151231257827021181583404541015625

通过this链接了解更多关于python中浮点数的信息。

【讨论】:

    猜你喜欢
    • 2011-02-20
    • 1970-01-01
    • 2020-08-12
    • 2011-01-01
    • 2017-12-12
    • 1970-01-01
    • 2014-10-15
    • 2013-05-24
    相关资源
    最近更新 更多