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

Dan*_*Dan 9 mysql sorting algorithm 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   |
Run Code Online (Sandbox Code Playgroud)


目前的加权排名

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

该算法考虑了贝叶斯平均值,以提供更好的整体排名.

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)
Run Code Online (Sandbox Code Playgroud)


当前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
Run Code Online (Sandbox Code Playgroud)

注意:viewsupload_date没有考虑在内.


问题

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

likes,dislikes,viewsupload_date,但只使用两个似乎是一种浪费,因为viewsupload_date没有考虑进来占多大比重每like/ dislike应该有.

例如,在上面的数据结构表中,项目12两者具有相同数量的likes/ dislikes2最近上传的项目,因此它的平均每日视图更高.

由于项目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    |
Run Code Online (Sandbox Code Playgroud)

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


这个问题

所以总结一下,我的问题是我怎么能因素views,并upload_date为我目前的排名算法的风格,以改善该视频的排名方式?

我认为通过计算上面的例子avg_views是一个很好的方法,但我应该把它添加到我的排名算法中?

这有可能是更好的排名算法可能存在,如果是这样的话,那么请提供不同的算法,我可以使用,并注明使用它的好处的例子.

Jim*_*hel 7

采用直接百分比的观点也不能准确表示该项目的受欢迎程度.虽然18个中的9个比"500个中的9个"更"强",但是一个视频获得500个视图而另一个只获得18个视频的事实更强烈地表明该视频的受欢迎程度.

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

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

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


use*_*092 7

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

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

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

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

  • 你能否构建你的答案(比如指出主要部分和主要论点)?一面文字看起来有些令人生畏,并表明很少付出努力使它变得有用. (2认同)