【问题标题】:Euclidian distance between posts based on tags基于标签的帖子之间的欧几里得距离
【发布时间】:2010-12-25 01:33:25
【问题描述】:

我正在玩编程集体智慧书中的欧几里得距离示例,


# Returns a distance-based similarity score for person1 and person2 
def sim_distance(prefs,person1,person2): 
  # Get the list of shared_items 
  si={} 
  for item in prefs[person1]: 
    if item in prefs[person2]: 
       si[item]=1 
  # if they have no ratings in common, return 0 
  if len(si)==0: return 0 
  # Add up the squares of all the differences 
  sum_of_squares=sum([pow(prefs[person1][item]-prefs[person2][item],2) 
                      for item in prefs[person1] if item in prefs[person2]]) 

这是对影评人进行排名的原始代码,我正在尝试修改它以找到类似的帖子,基于我构建地图的标签,例如,

url1 - > tag1 tag2
url2 - > tag1 tag3

但如果将此应用于函数,

pow(prefs[person1][item]-prefs[person2][item],2) 

这变成 0 因为标签没有权重相同的标签排名 1。我修改了代码以手动创建差异来测试,

pow(prefs[1,2) 

然后我得到了很多 0.5 的相似度,但同一篇文章与它自己的相似度下降到 0.3。我想不出一种将欧几里得距离应用于我的情况的方法?

【问题讨论】:

    标签: python similarity euclidean-distance


    【解决方案1】:

    好的,首先,您的代码看起来不完整:我只看到您的函数返回一个。我想你的意思是这样的:

    def sim_distance(prefs, person1, person2): 
      # Get the list of shared_items
      p1, p2 = prefs[person1], prefs[person2]
      si = set(p1).intersection(set(p2))
    
      # Add up the squares of all the differences 
      matches = (p1[item] - p2[item] for item in si)
      return sum(a * a for a in matches) 
    

    接下来,为了清晰起见,您的帖子需要进行一些编辑。我不知道这是什么意思:“这变成 0,因为标签没有权重相同的标签排名 1。”

    最后,如果您提供 prefs[person1]prefs[person2] 的示例数据,将会有所帮助。然后你就可以说出你得到了什么以及你期望得到什么。

    编辑:根据我在下面的评论,我会使用这样的代码:

    def sim_distance(prefs, person1, person2):
        p1, p2 = prefs[person1], prefs[person2]
        s, t = set(p1), set(p2)
        return len(s.intersection(t)) / len(s.union(t))
    

    【讨论】:

    • 我的意思是假设 2 个帖子共享标签 (tag1) 作为唯一相似的标签。那么 (p1[item] - p2[item] for item in si) si 中的每个项目都将为 0 不是吗?原因标签在共享情况下是 0 或 1,它们都是 1,然后 1 - 1 将是 0。
    • 欧几里得距离代码旨在计算共享一个数值度量的两个事物之间的相似性。您将其应用于没有数字度量的事物。我会使用 Aziz 想法的变体:我会将相同元素的数量与两组中唯一元素的数量进行比较。
    【解决方案2】:

    基本上,标签没有权重,也不能用数值表示。所以你不能定义两个标签之间的距离。

    如果你想使用它们的标签找到两个帖子之间的相似性,我建议你使用相似标签的比率。例如,如果您有

    url1 -> tag1 tag2 tag3 tag4
    url2 -> tag1 tag4 tag5 tag6
    

    那么你有 2 个相似的标签,代表2 (similar tags) / 4 (total tags) = 0.5。我认为这可以很好地衡量相似度,只要每个帖子有超过 2 个标签。

    【讨论】:

      猜你喜欢
      • 2011-01-29
      • 2016-10-11
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 2021-06-01
      • 1970-01-01
      • 2016-02-15
      • 1970-01-01
      相关资源
      最近更新 更多