【问题标题】:Calculate euclidean distance between two vector (bag of words) in python在python中计算两个向量(词袋)之间的欧几里得距离
【发布时间】:2013-05-23 12:00:34
【问题描述】:

我使用字典来表示文章中的字数

例如{"name" : 2 , "your": 10, "me", 20}表示“name”出现两次,“your”出现10次,“me”出现20次。

那么,有没有什么好的方法可以计算这些向量的欧式距离呢? 困难在于这些向量的长度不同,有些向量包含某些单词,有些则不包含。

我知道我确实可以编写一个长函数来做到这一点,只是寻找一种更简单、更聪明的方法。谢谢

编辑: 目的是获取两篇文章之间的相似度并将它们分组

【问题讨论】:

  • 这个previous answer of mine对你有帮助吗?它使用counter.Counter(),这是包数据结构的Python实现。
  • 只有当两个向量的长度相同(即映射相同的单词)并且顺序相同时才能这样做。
  • 你可以计算交叉点的欧几里得距离。无论如何,这是一个任意的选择。如果您准确地告诉我们您的目标,我们可能会帮助您为您想要做的事情设计一个良好的距离函数。
  • 问题是,计算不同维度数据的欧几里得距离有多大意义。向量x=(x1,x2) 是二维的,因此可与向量y=(y1,y2) 在欧几里得距离方面进行比较。但是从这个意义上讲,您如何将`x` 与向量z = (z1, z2, z3, z4, z5) 进行比较?

标签: python math vector


【解决方案1】:

类似

math.sqrt(sum((a[k] - b[k])**2 for k in a.keys()))

其中 a 和 b 是具有相同键的字典。如果您要比较不同向量对之间的这些值,那么您应该确保每个向量包含完全相同的单词,否则您的距离测量将毫无意义。

您可以仅根据交叉点计算距离:

math.sqrt(sum((a[k] - b[k])**2 for k in set(a.keys()).intersection(set(b.keys()))))

另一种选择是使用联合并将未知值设置为 0

math.sqrt(sum((a.get(k, 0) - b.get(k, 0))**2 for k in set(a.keys()).union(set(b.keys()))))

但是您必须仔细考虑您实际计算的是什么。

【讨论】:

    【解决方案2】:

    您还可以在两个向量之间使用余弦相似度,如以下链接所示: http://mines.humanoriented.com/classes/2010/fall/csci568/portfolio_exports/sphilip/cos.html

    【讨论】:

      猜你喜欢
      • 2020-06-10
      • 2021-02-11
      • 2014-05-31
      • 2014-06-14
      • 2017-09-15
      • 1970-01-01
      • 2014-11-12
      • 1970-01-01
      • 2019-06-06
      相关资源
      最近更新 更多