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

标签 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]
=========== =========== =======

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

最佳答案

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

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

    对于 u1 和 u2 评价的每首歌曲,计算 pow(u1.song.score - u2.song.score, 2)并将所有内容加到 sum_of_powers 中.然后由 1 / 1 + (sqrt(sum_of_powers)) 给出相似系数.

  2. Pearson Correlation(或相关系数):这是一种更好的方法,可以确定两个数据集之间的相关程度。此方法使用更复杂的公式和一些统计背景,请在此处查看:wiki .您将为每对用户创建一个图表,然后您根据分数绘制点.. 例如,如果 aSong已投2来自 u1 和 4从 u2 开始,它将绘制点 (2,4) (假设user1为x轴,u2为y轴)。

澄清一下,您使用线性回归 找到两个系数 AB ,它描述了最小化与图形所有点的距离的线。这一行有这个公式:y = Ax + B .如果两组相似点应该靠近主对角线所以A B 应该趋向于 1到 0。不要认为这个解释是完整的或作为引用,因为它缺乏可靠性和典型的数学形式,它只是给你一个想法。

编辑: 就像其他人写的那样,存在更复杂的聚类数据算法,例如 k-means,但我建议您从简单的算法开始(实际上,当您意识到结果还不够时,您应该需要一些更难的算法)。

关于python - 基于投票的用户之间的相似性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1836352/

相关文章:

python - ElementTree 返回元素而不是 ElementTree

php - Laravel 和 MySQL 按周获取数据

ruby-on-rails - rails 中数据修复的最佳替代方案?

sql - 将 SQL 列空值转换为 0

python - 树莓派发送数据到XAMPP数据库

python - 替换 Pandas 数据框中的值

python - 如何为轴添加第二行标签

php - 如何使用 PHP 函数更有效地获取表中多列的排名

php - 从 MYSQL 中的 Now() 选择最近 7 天

c# - 立即开始使用 EDMX