我树的结构很简单,深度为2,每个子节点都是根的直接子节点,每个节点都有一个除根之外的权重。有没有一种很好的方法来衡量两棵树的相似性?
这是原始问题:
假设您有一个关于您已阅读的书籍的数据列表。该列表包含键和值,如哈希表。键是书籍类别,值是您在当前类别下阅读的书籍数量。所以每个人都有这个数据列表,我想根据这个数据列表比较两个用户的相似性。我知道协作过滤可以做到这一点,但我正在尝试这种方式并将其与cf.
进行比较
所以我将数据列表视为加权树。类别是子节点,每个子节点的权重是此类别出现在用户书籍中的时间
相似性与协作过滤中两个用户的相似度相似。这是一个数字。
答案 0 :(得分:3)
这可以使用set操作完成。
多年前,我曾在Meta-CVS软件中实现过这样的相似性指标。这用于在将快照导入分支时识别重命名的文件。当然,可以在基线之间重命名和编辑文件,这意味着您无法执行精确的比较。但我离题了。
Jaccard Index 1
首先,两个用户对书籍的兴趣完全不同。或者他们可以有完全相同的兴趣。
你可以做的是计算他们的综合兴趣组合的大小,并将它们共同的部分表示为整体大小的一部分。
假设兴趣集没有加权,而只是设置没有相关权重的类别。然后可以将相似性表示为两个用户共有的类别数量除以类别总数。也就是说,集合交集的基数除以集合联合的基数。
如果涉及权重,则必须以某种方式处理它们。也许用联盟的总重量来计算集合交叉点的总权重(注意除以零)。
正如您所看到的,如果用户没有共同的类别,则此指标会产生0.0;如果他们对匹配的类别(无论权重)感兴趣,则此指标会产生1.0,因此它是可行的。
余弦相似性 2
定义相似性的另一种方法是将其视为矢量点积(相关性)。首先,确定两个用户之间存在的所有类别。为两个用户中的每一个形成一个向量,其中存在每个类别的权重(如果用户在其兴趣集中没有该类别,则为零)。
然后你可以通过取这些向量的点积并将它除以它们长度的乘积来计算相似度:(A。B)/ | A || B |
矢量的长度是权重平方和的平方根。 (再次注意除以零。)
在此相似性度量下,如果用户没有共同的类别,则两个向量是垂直的,并且它们的点积为零。该度量基本上是两个矢量之间角度的余弦。余弦越接近1,矢量就越平行(用户的兴趣是“在同一方向上对齐”)。
希望这会给你一些想法;但正如你所看到的,这是开放式的。