使用喜欢/不喜欢和每日平均观看次数的排名算法

时间:2014-04-08 22:16:01

标签: mysql algorithm sorting statistics ranking

我目前正在使用贝叶斯排名算法对网站上的视频进行排名,每个视频都有:

  • likes
  • dislikes
  • views
  • upload_date

任何人都可以likedislike观看视频,观看视频时始终views + 1,所有视频都有唯一的upload_date


数据结构

数据采用以下格式:

|  id  |  title    |  likes  |  dislikes  |  views  |  upload_date  |
|------|-----------|---------|------------|---------|---------------|
|  1   | Funny Cat |    9    |     2      |   18    |  2014-04-01   |
|  2   | Silly Dog |    9    |     2      |   500   |  2014-04-06   |
|  3   | Epic Fail |    100  |     0      |   200   |  2014-04-07   |
|  4   | Duck Song |    0    |     10000  |   10000 |  2014-04-08   |
|  5   | Trololool |    25   |     30     |   5000  |  2014-04-09   |


当前加权排名

以下加权比率算法用于对视频进行排名和排序,以便首先显示最佳评分。

此算法会考虑bayesian average以提供更好的整体排名。

Weighted Rating (WR) = ((AV * AR) + (V * R))) / (AV + V)

AV = Average number of total votes
AR = Average rating
V  = This items number of combined (likes + dislikes)
R  = This items current rating (likes - dislikes)


示例当前MySQL查询

SELECT id, title, (((avg_vote * avg_rating) + ((likes + dislikes) * (likes / dislikes)) ) / (avg_vote + (likes + dislikes))) AS score 
FROM video
INNER JOIN (SELECT ((SUM(likes) + SUM(dislikes)) / COUNT(id)) AS avg_vote FROM video) AS t1
INNER JOIN (SELECT ((SUM(likes) - SUM(dislikes)) / COUNT(id)) AS avg_rating FROM video) AS t2
ORDER BY score DESC
LIMIT 10

注意:viewsupload_date未计算在内。


问题

排名目前运作良好,但似乎我们没有充分利用我们掌握的所有数据。

拥有likesdislikesviewsupload_date但只使用两个似乎是浪费,因为viewsupload_date不是考虑到每个like / dislike应该有多少重量。

例如,在上面的数据结构表格中,商品12都具有相同数量的likes / dislikes但是商品最近上传了2,因此它的平均每日观看次数更高。

由于项目2在更短的时间内有更多的喜欢和不喜欢,likes / dislikes肯定会加权更强?


新算法结果

理想情况下,考虑viewsupload_date的新算法会将数据排序为以下结果:

注意:avg_views等于(views / days_since_upload)

|  id  |  title    |  likes  |  dislikes  |  views  |  upload_date  |  avg_views  |
|------|-----------|---------|------------|---------|---------------|-------------|
|  3   | Epic Fail |    100  |     0      |   200   |  2014-04-07   |     67      |
|  2   | Silly Dog |    9    |     2      |   500   |  2014-04-06   |     125     |
|  1   | Funny Cat |    9    |     2      |   18    |  2014-04-01   |     2       |
|  5   | Trololool |    25   |     30     |   5000  |  2014-04-09   |     5000    |
|  4   | Duck Song |    0    |     10000  |   10000 |  2014-04-08   |     5000    |

以上是一个简单的表示,更多的数据会变得更加复杂。


问题

总而言之,我的问题是如何将viewsupload_date纳入我当前的排名算法中以改进视频排名方式?

我认为通过计算avg_views的上述示例是一个很好的方法,但我应该在哪里将其添加到我拥有的排名算法中?

可能存在更好的排名算法,如果是这种情况,那么请提供一个我可以使用的不同算法的示例,并说明使用它的好处。 / p>

5 个答案:

答案 0 :(得分:7)

直观的视图百分比也无法准确表示项目的受欢迎程度。虽然18个中的9个比500个中的9个更“强”,但是一个视频获得500个视图而另一个只获得18个视频的事实更强烈地表明该视频的受欢迎程度。

获得大量观看次数的视频通常意味着它在各种观众中非常受欢迎。它只有一小部分喜欢或不喜欢通常是次要考虑因素。获得少量观看次数和大量喜欢的视频通常表明视频的目标非常狭窄。

如果你想在方程中加入视图,我会建议将你喜欢和不喜欢的贝叶斯平均值乘以视图数的对数。这应该很好地解决问题。

除非你想要进行多因素排名,否则喜欢,不喜欢和观点都会分别计算并给出单独的权重。数学更复杂,需要一些调整,但它往往会产生更好的结果。例如,考虑一下,人们会经常“喜欢”他们觉得有趣的视频,但如果他们发现它令人反感,他们只会“不喜欢”。不喜欢是一种更强烈的指示。

答案 1 :(得分:7)

我可以指出一种非参数方式来获得关于加权线性评分系统的最佳排序,而不确切地知道你想要使用什么权重(只是对权重的约束)。首先,请注意平均每日观看次数可能会产生误导,因为电影可能会在以后的几年内下载得更少。所以我要做的第一件事就是拟合一个多项式模型(10度应该足够好),它可以根据电影可用的天数预测总观看次数。然后,一旦你适应了,那么对于每个日期,你会得到预测的总观看次数,这是你除以得到的相对平均观看次数"这是一个乘数指示器,可以告诉您观看电影的可能性(或不太可能)与您预期的平均数量相比有多少倍。所以2意味着电影被观看了两倍,而1/2意味着电影被观看了一半。如果你想要2和1/2是"否定"从评分的角度来看,哪一种是有意义的,然后记录乘数的对数来得到分数。

现在,您可以计算多个数量以包含在总分中,例如(日志)和#34;相对平均观看次数"我在上面提到过,(喜欢/总观看次数)和(不喜欢/总观看次数)。 “美国新闻与世界报道”每年对大学进行排名,他们只使用7种不同类别得分的加权总和来获得他们排名的每所大学的总分。因此,使用类别得分的加权线性组合绝对不是一个坏的方法。 (注意在采用线性组合分数之前,您可能希望对某些类别执行类似日志转换的操作)。问题是你可能不知道确切地使用什么权重来给出最可取的"排行。首先要注意的是,如果你想要相同比例的权重,那么你应该规范化每个类别得分,使其在所有电影中的标准差等于1。然后,例如,如果你使用相等的权重,那么每个类别都是真正加权的。那么问题是你想要使用什么样的权重。显然,相对观看次数和喜欢比例的权重应该是正数,不喜欢比例的权重应该是负数,所以将不喜欢得分乘以-1然后你可以假设所有权重都是正数。如果你认为每个类别应该贡献至少20%,那么你得到的每个权重至少是权重总和的0.2倍。如果你认为不喜欢喜欢,那么你可以说(不喜欢体重)> = c *(比如体重)某些c> 1,或(dislike_weight)> = c *(权重之和)+(如同权重)对于某些c> 1。 0.类似地,您可以在权重上定义其他线性约束,以反映您对权重应该是什么的信念,而不会选择权重的精确值。

现在这里有趣的部分,这是我的帖子的主旨。如果你对权重有线性不等式约束,权重的线性组合大于或等于0的所有形式,但你不知道要使用什么权重,那么你可以简单地计算所有可能的顶部-10或前20名电影排名,你可以选择任何满足你的约束的权重,然后选择由最大的权重体积支持的top-k排序,其中权重的体积是立体角导致特定top-k排序的多面体重量锥。然后,一旦你选择了最受支持的"" top-k排名,您可以将得分参数限制在为您提供排名的圆锥内,并删除前k部电影,并计算剩余电影的下一个前10名或前20名排名的所有可能性。权重仅限于尊重原有的top-k电影'排行。计算受限制权重的电影的所有获得的前k排名可以比列举所有n(n-1)...(n-k + 1)top-k可能的排名并且全部尝试它们更快。如果你有两个或三个类别然后使用多面体构造方法,可以根据输出大小,即可获得的top-k排名的数量,在线性时间内计算可获得的top-k排名。多面体计算方法还给出了不等式,这些不等式定义了给出每个前k等级的得分权重锥,如果你有两个或三个类别,则也是线性时间。然后,为了获得给出每个排名的权重量,您可以对圆锥进行三角测量并与单位球相交,并计算得到的球形三角形的面积。 (如果类别的数量是2或3,则再次线性复杂)。此外,如果您将类别缩放到[0,50]范围内并舍入到最接近的整数,那么您可以证明,如果类别数量类似于5,则可获得的top-k排名的数量实际上非常小或更少。 (即使你有很多电影而k很高)。当您修复当前顶级电影组的排序并将参数限制在产生固定顶级排序的圆锥中时,这将进一步限制可获得的下一个最佳前k电影的输出大小。输出大小确实依赖于(多项式)k,这就是为什么我建议设置k = 10或20并计算top-k电影并选择最佳(最大音量)排序并修复它,然后计算下一个最好的top-k电影这尊重原始top-k等的排序。

无论如何,如果这种方法听起来很吸引你(迭代地找到满足你的体重限制的最大重量支持的前k排名的连续选择),请告诉我,我可以制作并发布一篇文章在所需的多面体计算以及软件链接上,您可以使用最少的额外编码来完成。与此同时,这里有一篇论文http://arxiv.org/abs/0805.1026我写了一篇关于7类大学排名数据的类似研究,其中权重仅限于所有非负数(对权重的任意线性约束的推广是直截了当的)。 / p>

答案 2 :(得分:3)

一种简单的方法是为每个平均值提出一个合适的比例因子 - 然后对“权重”进行求和。困难的部分是调整比例因子以产生所需的顺序。

从您的示例数据中,起点可能类似于:

Weighted Rating = (AV * (1 / 50)) + (AL * 3) - (AD * 6)

Key&解释

AV =每日平均观看次数:       5000很高,所以除以50,在这种情况下将重量减少到100。

AL =平均每天喜欢:      3天内 100 = 33.33高,所以乘以3,在这种情况下将重量增加到100。

AD =每天平均不喜欢:       10,000在这里似乎是一个极端的价值 - 同意Jim Mischel的观点,不喜欢可能比喜欢更重要所以最初的负面比例因子是"喜欢&#34的两倍;比例因子。

这给出了以下结果(见SQL Fiddle Demo):

ID  TITLE       SCORE
-----------------------------
3   Epic Fail   60.8
2   Silly Dog   4.166866
1   Funny Cat   1.396528
5   Trololool   -1.666766
4   Duck Song   -14950

[我故意保持这个简单的方式来提出一个起点的想法 - 但是对于真实的数据,你可能会发现线性缩放是不够的 - 在这种情况下你可以考虑条带或对数缩放。]

答案 3 :(得分:2)

每个视频都有:

  • 喜欢
  • 视图
  • UPLOAD_DATE

因此我们可以从中扣除以下参数:

  • like_rate = likes / views

  • dislike_rate = likes / views

  • view_rate = views / number_of_website_users

  • video_age = count_days(今天上传日期)

  • avg_views = views / upload_age

  • avg_likes = likes / upload_age

  • avg_dislikes = dislikes / upload_age

在我们设置要使用的公式之前,我们需要指定不同的视频流行度应该如何工作,一种方法是用点来解释一个流行视频的属性:

  1. 在大多数情况下,最受欢迎的视频是

  2. 视频越老,流行所需的avg_views越高

  3. 一个like_rate超过like_rate_threshold的视频或dislike_rate超过dislike_rate_threshold的视频可以通过与其阈值的差异来衡量它的年龄

  4. 视频的高view_rate是一个很好的指标,可以向之前未观看过视频的用户推荐该视频

  5. 如果avg_likes或avg_dislikes制作了大部分avg_views,那么视频在此期间会被视为有效,如果是有效视频,我们实际上并不需要检查它的年龄

  6. 结论:我没有公式,但可以通过将一个单位转换为另一个单位来构建一个公式,例如根据使用avg_likes,avg_dislikes和avg_views

    进行的计算将视频年龄减少几天

答案 4 :(得分:2)

由于还没有人指出(我有点惊讶),我会这样做的。我们提出的任何排名算法 的问题在于它基于 我们的 观点。您当前正在寻找的是一种算法,可以容纳 中位数用户 的观点。

这不是什么新主意。 Netflix前段时间有它,只有他们个性化,基于个人选择。正如我所说,我们正在寻找中位数用户最佳排名。

那么如何实现呢?正如其他人所建议的那样,您正在寻找一个函数R(L,D,V,U),它返回排序键的实数。 R()可能非常非线性。

这是一个经典的机器学习问题。 “训练数据”包括用户选择。当用户选择电影时,它是关于排名的好处的声明:选择排名较高的电影是对置信度的投票。排名较低的选择是一种谴责。函数R()应相应地修改自身。最初,当前的排名系统可用于训练系统以镜像其选择。从那里它将适应用户反馈。

对于像这样的问题,有几种方案和大量关于机器学习的研究文献:回归建模,神经网络,表示学习等。例如,参见the Wikipedia page的一些指针。

我可以建议一些方案,但除非对此方法感兴趣,否则不会。如果这是真的,请在评论中说“是”。

实施将是非平凡的 - 当然不仅仅是调整你的SELECT声明。但从好的方面来说,你可以声称你的顾客在良心上得到他们所要求的东西!