1

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

4

1 回答 1

3

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

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

杰卡德索引1

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

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

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

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

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

余弦相似度2

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

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

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

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

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

于 2012-05-12T02:00:55.077 回答