基于投票的用户之间的相似性

时间:2009-12-02 22:34:53

标签: python mysql database information-retrieval similarity

假设我有一组用户,一组歌曲和每首歌的一组投票:

=========== =========== =======
User        Song        Vote
=========== =========== =======
user1       song1       [score]
user1       song2       [score]
user1       song3       [score]
user2       song1       [score]
user2       song2       [score]
user2       song3       [score]
user3       song1       [score]
user3       song2       [score]
user3       song3       [score]
user-n      song-n      [score]
=========== =========== =======

根据歌曲投票计算用户相似度的最有效方法是什么?有没有比为每首歌重复每个用户和每次投票更好的方法?

7 个答案:

答案 0 :(得分:11)

有两种常用指标可用于查找用户之间的相似性:

  1. 欧几里德距离,这正是您的想法:想象一个n维图形,每个轴都有一首由两个相关用户审阅的歌曲( u1 < / em>和* u2)并且其轴上的值是分数。您可以使用以下公式轻松计算相似度:

    对于u1和u2审核的每首歌曲,计算pow(u1.song.score - u2.song.score, 2)并将所有歌曲一起添加到sum_of_powers。然后由1 / 1 + (sqrt(sum_of_powers))给出相似系数。

  2. Pearson Correlation (或相关系数):这是一种更好的方法,可以找出两个数据集彼此相关的数量。这种方法使用更复杂的公式和一些统计背景,请在此处查看:wiki。您将为每个用户创建一个图表,然后根据分数绘制点数...例如,如果{1}}已经从u1投票aSong而{1}}从u2投票,则会绘制点2(假设user1是x轴,u2是y轴)。

  3. 为了澄清,您使用线性回归来查找两个系数4(2,4),它们描述了最小化距离图的所有点的距离的线。此行具有以下公式:A。如果两个相似的点应该靠近主对角线,那么B应该倾向于1而y = Ax + B为0.不要假设这个解释完整或作为参考,因为它缺乏健全性和典型数学形式主义,它只是为了给你一个想法。

    修改 像其他人写的那样,存在更复杂的聚类数据算法,比如k-means,但我建议你从简单的算法开始(实际上,当你意识到结果不够时,你应该需要更困难的东西)。

答案 1 :(得分:5)

我推荐Toby Segaran的书Programming Collective Intelligence。第3章介绍了不同的聚类方法,如Hierarchical ClusteringK-means Clustering

示例的源代码可用here

答案 2 :(得分:3)

如果你想获得最准确的结果,那么不,你必须迭代一切。

如果你的数据库足够大,你可以采取统计抽样,比如考虑1,000到10,000个用户并与之匹配。

您最好还是在数据库中添加更多表,存储结果,并且每隔一段时间更新一次,而不是动态计算。

答案 3 :(得分:1)

Ilya Grigorik做了一系列推荐算法,尽管他专注于Ruby。它似乎位于archives机器学习部分下,但没有直接的部分链接。

答案 4 :(得分:1)

我认为这里的很多人都错过了问题的简单性。他没有说创建评级预测系统。他只想计算每个用户的歌曲评级行为与每个其他用户的歌曲评级行为之间的相似性。 Pearson相关系数恰恰相反。是的,您必须遍历每个用户/用户对。

编辑:

在考虑了这个之后:

如果你想要两个用户的品味之间的相似性,而不是他们的“看法”水平,Pearson是很棒的...一个评价一系列歌曲4,5和6的用户将与另一个评价率的用户完全相关相同的歌曲3,6和9.换句话说,他们有相同的“品味”(他们会按相同的顺序排列歌曲),但第二个用户更加自以为是。换句话说,相关系数将任意两个评级向量视为线性关系相等。

但是,如果您希望用户为每首歌曲提供实际评分之间的相似性,则应使用两个评级向量之间的均方根误差。这是一个纯粹的基于距离的度量(线性关系不会影响相似性得分),因此4,5,6和3,6,9用户不会有完美的相似度得分。

决定归结为“类似”的意思......

就是这样。

答案 5 :(得分:1)

如果您想在不访问所有记录的情况下以近似方式进行,您可以使用Jaccard系数。如果你想考虑分数,可能需要一些改编。但我想这是最好的解决方案,如果您的系统太大而且您没有时间检查所有记录。

答案 6 :(得分:0)

你应该能够在本书中找到一个好的算法:Steven Skiena的The Algorithm Design Manual

这本书有很多用于各种目的的算法。我想你想要一个图形聚类算法。我没有这本书的副本,所以我不能为你查找。

快速谷歌搜索找到维基百科页面:http://en.wikipedia.org/wiki/Cluster_analysis也许这会有所帮助,但我认为这本书更清楚地解释了算法。