【问题标题】:Calculate similarity of weighted trees计算加权树的相似度
【发布时间】:2012-05-12 00:54:29
【问题描述】:

我的树的结构很简单,深度为二,每个子节点都是根的直接子节点,每个节点除了根之外都有一个权重。有没有衡量两棵树相似度的好方法?
这是原始问题:
假设你有一个关于你读过的书的数据列表。该列表包含键和值,例如哈希表。键是书籍类别,值是您在当前类别下阅读的书籍数量。所以每个人都有这个数据列表,我想根据这个数据列表来比较两个用户的相似度。我知道协作过滤可以做到这一点,但我正在尝试这种方式并将其与 cf 进行比较。
所以我将数据列表视为加权树。类别为子节点,每个子节点的权重为该类别在用户书籍中出现的次数。
相似度与协同过滤中两个用户的相似度相似。这是一个数字。

【问题讨论】:

  • 如果你能清楚地定义“相似”,算法就会弹出来。你对相似度的定义是什么?它是布尔谓词还是连续度量?正如您所知道的,我们的问题很可能会得到密切投票:不是一个真正的问题:很难说出这里要问的问题。这个问题是模棱两可、含糊不清、不完整、过于宽泛或修辞的,无法以目前的形式得到合理的回答。
  • @Kaz 谢谢提醒,我会注意的。
  • 如果树的深度为二,而根没有权重,这与有序集合(例如列表或向量)有何不同?
  • @Kaz 是的,你是对的,它不是一棵树,它是一个哈希表,或者任何键值对集合。我将其描述为树,因为我认为可能有一些树的方法或算法可以在这里使用。
  • 你可能不正确。您实际上拥有的结构是一个集合,因为它是无序的,并且相似性度量(无论您如何定义它)是一个集合操作。树操作不太可能揭示集合操作。缺少顺序很重要,因为这意味着如果两个对象具有相同的内容,它们应该是相似的,而不考虑任何顺序。

标签: tree recommendation-engine collaborative-filtering


【解决方案1】:

这可以使用集合操作来完成。

几年前,我曾经在 Meta-CVS 软件中实现过这样的相似性度量。这用于在将快照导入分支时识别重命名的文件。当然,可以在基线之间重命名和编辑文件,这意味着您无法执行精确的比较。但我离题了。

杰卡德指数1

首先,两个用户对书籍的兴趣可能完全不同。或者他们可以有完全相同的兴趣。

您可以做的是计算他们组合的兴趣集的大小,并将他们共同的部分表示为整体大小的一小部分。

假设兴趣集没有加权,而只是设置没有相关权重的类别。然后,相似性可以表示为两个用户共有的类别数除以类别总数。也就是集合交集的基数,除以集合并集的基数。

如果涉及权重,则必须以某种方式对其进行处理。或许通过并集的总权重计算集合交集的总权重(注意除以零)。

如您所见,如果用户没有共同的类别,则此指标为 0.0,如果他们对匹配类别感兴趣(无论权重如何),则为 1.0,因此它是可行的。

余弦相似度2

定义相似性的另一种方法是将其视为向量点积(相关性)。首先,确定两个用户之间存在的所有类别。为两个用户中的每一个形成一个向量,其中存在每个类别的权重(如果用户在他的兴趣集中没有该类别,则为零)。

然后您可以通过将这些向量的点积除以它们的长度的乘积来计算相似度:(A . B) / |A||B|

向量的长度是权重平方和的平方根。 (同样,注意被零除。)

在这种相似度度量下,如果用户没有共同的类别,则两个向量垂直,并且它们的点积为零。这个度量基本上是两个向量之间夹角的余弦值。余弦越接近一,向量越平行(用户的兴趣“同向对齐”)。

希望这能给你一些想法;但正如你所见,这是开放式的。

【讨论】:

  • 感谢您的想法,很高兴与您交谈。
猜你喜欢
  • 1970-01-01
  • 2018-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-28
  • 2015-05-24
  • 1970-01-01
相关资源
最近更新 更多