- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我目前正在使用贝叶斯排名算法对网站上的视频进行排名,每个视频都有:
喜欢
不喜欢
View
上传日期
任何人都可以喜欢
或不喜欢
视频,观看视频时总是views + 1
并且所有视频都有唯一的上传日期
。
数据结构
数据格式如下:
| 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
注意:views
和 upload_date
未考虑在内。
问题
排名目前运行良好,但我们似乎没有充分利用我们掌握的所有数据。
拥有likes
、dislikes
、views
和 upload_date
但只使用两个似乎是一种浪费,因为 views
和 upload_date
没有考虑到每个 like
/dislike
应该有多少权重。
例如在上面的数据结构表中,项目1
和2
都有相同数量的likes
/不喜欢
但是项目 2
是最近上传的,所以它的平均每日浏览量更高。
既然项目 2
在更短的时间内比那些 likes
/dislikes
有更多的喜欢和不喜欢,肯定应该加权更强?
新算法结果
理想情况下,考虑了 views
和 upload_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 |
上面是一个简单的表示,数据越多,它就会变得越复杂。
问题
总而言之,我的问题是如何将 views
和 upload_date
纳入我当前的排名算法以改进视频排名方式?
我认为上面的示例通过计算 avg_views
是一个很好的方法,但是我应该把它添加到我拥有的排名算法中的什么位置呢?
可能存在更好的排名算法,如果是这种情况,请提供一个我可以使用的不同算法的示例,并说明使用它的好处。
最佳答案
直接采用观看百分比也不能准确表示项目的受欢迎程度。虽然 18 个中有 9 个赞比 500 个中有 9 个赞“强”,但一个视频获得 500 次观看而另一个视频只有 18 次的事实更能说明该视频的受欢迎程度。
获得大量观看次数的视频通常意味着它在广泛的观看者中非常受欢迎。它只获得一小部分喜欢或不喜欢通常是次要考虑因素。获得少量观看次数和大量点赞的视频通常表明该视频的定位非常狭窄。
如果您想在等式中加入观看次数,我建议您将从喜欢和不喜欢中得到的贝叶斯平均值乘以观看次数的对数。这应该能很好地解决问题。
除非您想使用多因素排名,否则喜欢、不喜欢和观看次数都会单独计算并赋予单独的权重。数学涉及更多,需要进行一些调整,但往往会给出更好的结果。例如,考虑一下人们通常会“喜欢”他们觉得有点有趣的视频,但只有在他们觉得令人反感时才会“不喜欢”。不喜欢比喜欢更强烈。
关于mysql - 使用喜欢/不喜欢和每天平均观看次数的排名算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22949258/
我有一个不断增长的日志文件。我如何通过 Ruby 脚本查看和解析它? 脚本将解析写入文件的每个新行,并在新行包含字符串 'ERROR' 时将内容输出到屏幕 最佳答案 def watch_for(fil
我想尝试更新 modelValue 并更改日期选择器中的值 watch(range, (range) => { emit("update:modelValue", range); consol
谁能给我一个例子,说明如何在 ng-include 上观察发射事件?准确地说,我想在我的指令中观察 $includeContentLoaded 事件......这是我的 html:
经过一番努力,我能够使用谷歌驱动器对自己进行身份验证,获取文件列表,获取我想要的文件。现在希望能够捕获google文档数据中的变化,从而知道发生变化的行数和列数。 感觉我的答案就在这里https://
我构建了一个具有指向 promise 的属性的指令。当 promise 解决时,我想运行一个对数据执行某些操作的函数。像这样: scope.$watch('source', function (da
我正在尝试编写一个执行以下操作的 gulp 文件: 运行监视任务,在任何模板更改时重建 Handlebars 模板。 如果构建失败,它会通过notify()方法通知BrowserSync,这样如果出现
我有一个用例,我每天在不同的时刻都有新文件,比如每隔一小时或两小时,所以我需要查看文件夹中的目录,并在添加新文件时触发发送这些新文件的事件我在 NIFI 上的网络服务的路径,知道如何实现这个以及为此使
有人可以推荐一个 JAVA 开源库来监控 FTP 位置更改吗?我正在尝试监视 FTP 位置的更改,一旦检测到更改,更改的文件将被复制到 SVN 位置以进行提交。 最佳答案 Java 远程目录轮询器 (
我想知道是否可以在 Apple Watch Simulator 中模拟心跳,如果可以,如何实现。 谢谢! 最佳答案 是的,您需要使用 HKWorkoutSession 关于xcode - 观看 OS
我目前正在使用 google calendar api 并尝试在 javascript 中编写一个函数,该函数使用 calendar.events.watch 函数以便在用户日历中有更新时进行更新 (
我需要监视网络应用程序中两个目录中的更改(上传的文件)。我创建了一个ServletContextListener来触发对这两个目录的监控。 我的问题是,当第一次监控开始时,线程被阻塞,第二次监控没有启
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 8 年前。 Improv
我正在开发一个应用程序,当 watch 被激活时,我需要启动一个计时器(使用 NSTimer)。使用计时器,我向 iPhone 询问一些信息(大约每 1 秒一次,最多 5 秒一次)。我用它来启动计时器
我只想向我的 WKInterfaceController 添加图像,但是... Xcode 告诉我: Unable to find image named "circle44" on Watch @I
除了 root_path 之外的所有路由都在产品中中断,即使我的 assert_select 测试所有 GREEN。 The core of the problem was misconfigured
我试图观察用户何时在 IScroll (v5) 中滚动。 我对 angular 还是很陌生,只是在学习编写指令。 从其他示例中,我正在尝试。 我的指令是 app.directive('watchScr
我有一个带有 Controller 的选择输入,当选择一个值时,希望将该值传递给将显示它的指令。 (在本例中,在传单 map 上绘制一个形状)。 问题是我希望该值是“即发即忘” - 因此他们选择形状,
我正在使用 Gulp 来编译和缩小我的 SASS。这工作正常,但我想通过使用 BrowserSync 来扩展自动化。 我已按照一些教程网站上的说明进行操作,但无法使其正常工作 - 当我更新 .scss
一段时间以来,我一直在尝试远离 FTP。 在掌握了 GIT 之后(我错过了什么!),将提交推送到 GitHub,然后最终将更改 pull 到我的远程服务器上并 pull 任何更改)。 我一直在看的一个
我有一个使用 Parse.com 的现有 iOS 应用程序。您可以使用用户名和密码、Facebook 或 twitter 登录,也可以创建新的登录名。我正在准备更新,它有一个 WatchKit 扩展,
我是一名优秀的程序员,十分优秀!