基于属性计算相似度

4
我的目标是根据用户的属性计算两个用户之间的相似度。例如,我们考虑一个玩家,将年龄、薪水和得分作为属性。此外,我想按照重要性顺序给每个属性分配权重。在我的情况下,年龄比薪水和得分更重要。因此,假设我们使用欧几里得距离来计算相似度。
Given user 1 who is age 20, salary 50, points scored 100

Given user 2 who is age 24, salary 60, points scored 85

Given user 3 who is age 19, salary 62, points scored 80

为了计算用户1和用户2之间的相似度,我可以进行以下计算:

sqrt((20-24)^2 + (60-50)^2 + (85-100)^2)

现在我们想要加入权重,以便在欧几里得距离中,数字越小则说明两个对象越相似。正如前面提到的,由于年龄是最重要的因素,所以我们将分配权重如下:

sqrt(0.60*(20-24)^2 + 0.20*(60-50)^2 + 0.20*(85-100)^2)

我的方法正确吗?另外,我是否应该考虑其他算法,例如余弦相似性来计算相似度?

正确是针对什么而言的?这种方法至少是合理的。你想使用哪些其他相似度量取决于你的应用程序。你可能需要测试几个来找出哪一个最有效。 - Nico Schertler
@NicoSchertler 我不确定我是否正确添加了权重,而且我想知道是否有其他算法可以更准确地计算两个用户之间的相似度。例如,在我的应用程序中,年龄是最重要的因素。 - user1010101
权重看起来对我来说很好。当然,您应该了解属性的范围。如果它们不同,那么您可能需要引入一些归一化。还有许多其他相似性度量。Wolfram列出了其中一些(请参见数字数据)。 - Nico Schertler
@NicoSchertler 很好的观点,我一定会确保属性被规范化。谢谢你提供这个好资源。如果你能把你的评论列为答案,我可以接受它。 - user1010101
这并不是一个真正的答案,所以我会将其留作评论。如果你完成了研究,可以自己发布一个答案,描述最适合你情况的方法。 - Nico Schertler
1个回答

1

我目前正在从事一个涉及计算不同实体之间测量的项目,因此我熟悉你的问题。

在你的情况下,好处在于你没有各种不同类型(例如文本或分类等)的特征。年龄、薪水和积分是数字,正如评论中已经提到的,你应该做的第一件事就是标准化。这是“必须要做的”,因为如果你不这样做,那么在计算距离时可能会有一个特征占主导地位。

你必须小心并检查你的数据,必要时进行清理。例如,年龄为200的错误值将破坏你的标准化,大多数缩放后的年龄值将结束在较低部分(靠近零)。

你关于权重和计算加权欧几里得距离的想法是正确的。这些权重的总和为1(就像你在示例中展示的0.6+0.2+0.2=1一样)。

关于使用哪种距离度量方法,这是一个好问题。有许多距离度量方法可供选择。例如,请查看https://docs.scipy.org/doc/scipy/reference/spatial.distance.html

但根据我的经验,我会选择欧几里得距离,尽管你应该尝试几种方法并检查它在你的数据上的表现。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接