Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >大数据工程师:如何改进豆瓣电影Top250的算法思路

大数据工程师:如何改进豆瓣电影Top250的算法思路

作者头像
机器学习AI算法工程
发布于 2018-03-12 09:55:22
发布于 2018-03-12 09:55:22
1.6K0
举报

作者:飞林沙 算法工程师

影迷们经常关注的电影排行榜里,一部由100人评出9.0分的电影,和一部由10000人评出8.0分的电影,谁应该排在前面呢?

这是我们算法工程师时常会面对的问题。

一些深度影迷可能会想到 imdb.com (互联网电影数据库) 所采用的贝叶斯公式[见附注],这个公式的思路就是通过每部影片的[评分人数]作为调节排序的杠杆:如果这部影片的评分人数低于一个预设值,则影片的最终得分会向全部影片的平均分拉低。

由此可见,平衡评分人数和得分,避免小众高分影片排前,是这个计算方法的出发点。可问题在于:调节整个榜单的排序主要依赖于这个[评分人数预设值]。如果它设置的很低,那么最终的排序结果,就是每部影片自身评分从高到低在排序;如果它被设置得过高,那么只适用高曝光率的影片。据说 imdb.com 的这个预设值从500一路调整到了25000,遗憾的是这个算法仍然无法很好的解决他们的问题。

我们看看国内电影市场的现状。2013年上映的《疯狂原始人》两个月内在豆瓣电影得到了13万人次的评分,而1974年上映的《教父2》,到目前为止的评分总人数还不到10万人。近几年观影方式的多样化以及影院观影的持续火爆,使得新近上映的影片很轻松地就能获得大量的评分,相较之下,老片子的曝光机会少了很多。显然,继续调节 [评分人数的预设值] 已无法满足当前国内电影排行榜的实际需求。

如何解决这个问题呢?对算法工程师而言,我们通常会先用最基本的算法模型来应对,然后针对该算法带来的问题再修改并衍生出新的算法。比如针对这里的[评分人数预设值],我们可以分出老片和新片两个排行分别对待,也可以把时间因素考虑在内,如此等等。

不过这次我们决定换个做法。

在重新审视过 [豆瓣电影TOP250] 这一产品之后,我们提炼出两个关键指标:

1 它应该具备人群的广泛适应性。

例如一些动漫作品,因为拥有大量的粉丝,容易得到高分。如果采用 imdb.com 的榜单公式计算,这些影片的排名就会很靠前,但它们显然不适合被推荐给非动漫迷。

我们的解决办法,是将电影划分为若干分类,每一分类对应着喜欢此类有显著代表性的人群。如此一来,排序问题就变成了推荐问题,即把某部影片分别向所有类人群做推荐,能被推荐给越多人群的电影也就越具备广泛性。

实际上,实验的结果也证明了《肖申克的救赎》这类电影的人群广泛度远远超越了《EVA》这样的动漫作品。

2 它还需要具备持续关注度,不能昙花一现。

1957年的《十二怒汉》时至今日仍然被人津津乐道,而一些票房大片上映时非常红,过后就乏人问津。如何解决他们的排序关系?

我们取得每部影片在不同时间周期内的收藏人数和评分,将其汇成一条收藏曲线,再分析不同的曲线及其间关系,计算相应的分数。

这样,更新后的算法便初步形成了。算法更新后,榜单产生了一些变化,具体哪些变化?这就去看看吧!( http://movie.douban.com/top250 )

再说两句题外话,其实依靠简单的维度去做排序的榜单,我们平时也见的很多。这也许能解决一时的问题。对比简单排序甚至人工编辑的方式,一个算法模型在结果展示上可能没有优势,但面对环境因素的应变和扩展性上,算法有能力自我学习和进化,相信这也是产品生命力的一种体现吧。

附录: imdb.com 的top榜单公开公式(http://www.imdb.com/chart/top)

The formula for calculating the Top Rated 250 Titles gives a true Bayesian estimate:

weighted rating (WR) = (v ÷ (v+m)) × R + (m ÷ (v+m)) × C

where:

R = average for the movie (mean) = (Rating) -单部电影的得分 v = number of votes for the movie = (votes) -单部电影的有效评分人数 m = minimum votes required to be listed in the Top 250 (currently 25000) -入选top250榜单所需最低的有效评分人数 C = the mean vote across the whole report (currently 7.0) -所有影片的平均分

一直以来,我都很想借助一个例子来说明一个算法的诞生过程,或者说是思考的迭代过程,但是或者算法过于复杂,不利于初学者看懂,或者涉及到一些公司本身的机密,不便公开。正好这次有着这么一个不但容易而且比较典型的例子上线,就借机来说一下这个产品的诞生过程吧。 1. IMDB的TOP250 自IMDB以来,Top250就几乎成了各大网站的标配,而IMDB更是开放了自己Top250的算法: The formula for calculating the Top Rated 250 Titles gives a true Bayesian estimate: weighted rating (WR) = (v ÷ (v+m)) × R + (m ÷ (v+m)) × C where: R = average for the movie (mean) = (Rating) v = number of votes for the movie = (votes) m = minimum votes required to be listed in the Top 250 (currently 25000) C = the mean vote across the whole report (currently 7.0) for the Top 250, only votes from regular voters are considered. 方法其实很简单,就是一个基础的贝叶斯平均,随着互联网访问人数的日益增长,IMDB将自己最初的平均值m从500一路调整到了25000,而且据我所知,大部分公司的Top榜也是依据这样的方式来进行计算,甚至原封不动地去沿用了IMDB的参数设置,那么我们不妨来思考下传统的贝叶斯平均所带来的弊病,以及Top250产生本身的意义。 2. 分析贝叶斯平均带来的问题 我们首先思考一下贝叶斯平均中m和c的意义,从算法本身出发,贝叶斯平均希望把不足评分人数的电影评分向平均值(也就是7.0)去拉近。 首先说m和c本身,这个m和c是否具有通用性?很明显并不是,而是一个经统计得出的值。那么这个值到底应该是一个平均值还是分位数,我觉得依然需要我们依照实际的数据分布来评估界定。 另外说这个公式本身,大部分网站使用的都是所有电影的均值或者是中位数,比如说IMDB的25000,那么这个值是否真的可以起到贝叶斯平均的意义?如果大家感兴趣,也许可以尝试着根据豆瓣电影的评分以及收藏人数数据设置对应的v1,v2,r1,r2来做一次简单的不等式推导,我们会发现,所得出的排序几乎就是按照分数从高到低的排序。 究其原因,其实还是因为互联网上本身长尾现象的存在,这就需要我们更恰当地来选择m和c本身的统计值。接下来的问题就属于细节问题,每个人有每个人的解决办法,也许并不通用。 3. 重新思考Top250的产品意义 解决一个问题,或者为一个产品定制算法,整体我更愿意把他分成两步来走: A. 用最最基本的算法实现(对于这个例子来说就是贝叶斯平均) B. 思考该算法所带来的问题,然后改善原有算法或者产生新算法,接下来重新开始B的迭代过程。

回归正文,我们思考Top250本身的产品意义是什么,在我眼里Top250的意义如下: A. 非个性化推荐。也就是说对于一个电影的新用户,或者一个不知道该看什么的电影老用户,为其推荐Top250总是没有错,而且是最保险的。简而言之,就是具备人群的广泛适应性。 B. Top250的电影应该是经过时间考验的,而不是上映之初评分红极一时然后迅速跌落的。 那么接下来我们就分别来解决以上的两个问题。 4. 如何保证人群的广泛性 我们对人群广泛性举一个简单的例子,例如EVA是一部深受动漫迷喜爱的日本动漫作品,所以评分也都会达到9分以上,但是对于非动漫迷来说,为其推荐EVA明显并不是一个合适的做法。

我一直很努力地在强调数据中心和工具中心的概念,在软件世界中,重用是亘古不变的一个话题,那么在我看来,数据和工具这两个位于软件世界最底层的东西是可被最广泛重用的东西。

在之前的一段时间中,我们花费很大精力建设了一个豆瓣所有类型条目的聚类的一个数据中心,那么接下来我们便可以依据这个已有的数据来解决这个问题。

假设说我们已经对电影划分成了100个类,而这100个类分别又对应着其具有显著代表性的100类人群(例如A类喜欢看爱情动作片),也就是说相当于把Rank问题转换成了推荐问题,即我把某电影分别像向100类人群做推荐,可以被推荐给越多人群的电影说明就是一个越具有广泛性的电影。 在最终的结果评测时,我们也可以发现如肖申克的救赎一类电影的人群广泛程度远远超过了足球小将,EVA这样的受众比较局限的动漫。 5. 如何达到持续关注的目的 关于持续关注,我们也举一个简单的例子,1957年的十二怒汉距今已经过去半个世纪了,但是至今人们依旧对其津津乐道,而太多的爆米花大片可能在上映之初红极一时,然后随着偶像的跌落神坛,或者走出电影院的3D效果,也许就很快变得无人问津了。

在这里,我的方法是得到每一部电影在不同的时间间隔内对应的收藏人数和评分,这样其实类似与对每一部电影都得到了一条收藏和评分的曲线。那么接下来只分析不同的曲线以及之间的关系便可得出结论。 例如如果某部电影的曲线下降的很迅速,那么我们便可以说该电影只在上映之初得到了好评和关注。这样我们便可以评估每条曲线的质量并计算相应的分数,对之前的Rank做一次Rerank。 6. 效率没问题之前,效率都不是问题 除非极少数极为复杂的算法之外,在算法初步完成之前,我并不愿意去过多地考虑效率相关的问题。因为我总是固执地认为效率问题往往都可以在后期通过很多办法来解决掉,或者并行化计算,或者用C/C++来改进,或者增加预处理,或者干脆去做一些近似计算。 7. 总结 其实这个例子本身很简单,我想讲述的不过是如何诞生新产品的思维方式: 先框架,再细节。 先整体,再局部。 先简单,再迭代。 先阐述问题,再解决问题。 先广度优先,再深度优先。 最后说一句,某人(还是很懂算法的某人)在某天跟我吐槽首页豆瓣猜不需要算法,我说为什么呢?他说不就是热点和友邻广播么?我说OK,那你说热点怎么做呢?他说就依靠喜欢数来做order by。 我说那阿北写了一篇日记有100喜欢,我写了一篇日记有99喜欢,到底哪一个算是热点呢?如果你想评估每个人在过往日记的表现,那么修女每次的日记都有几百的喜欢,那么没有超过他的均值他就永远都上不了热点了么?如果你希望用户之间的比较,又要怎么样比较才能达到性能和质量的折中?

具体算法也许不便透露,我只是想说,永远不要认为一个外表看上去简单的产品在内部也是一样简单的,因为每个算法的背后都隐藏着无数你所忽略或者不去在意的种种细节。

再说两句题外话,其实依靠简单的维度去做排序的榜单,我们平时也见的很多。这也许能解决一时的问题。对比简单排序甚至人工编辑的方式,一个算法模型在结果展示上可能没有优势,但面对环境因素的应变和扩展性上,算法有能力自我学习和进化,相信这也是产品生命力的一种体现吧。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2015-10-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大数据挖掘DT数据分析 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C#一分钟浅谈:Xamarin 移动应用开发
随着移动设备的普及,移动应用开发成为了软件开发领域的一个重要分支。Xamarin 是一个基于 .NET 平台的跨平台移动应用开发框架,允许开发者使用 C# 语言编写一次代码,即可在 iOS、Android 和 Windows Phone 上运行。本文将从基础概念入手,逐步深入探讨 Xamarin 开发中的常见问题、易错点及如何避免,并通过代码案例进行解释。
Jimaks
2024/11/19
3270
C#一分钟浅谈:Xamarin 移动应用开发
随着移动设备的普及,移动应用开发成为了软件开发领域的一个重要分支。Xamarin 是一个基于 .NET 平台的跨平台移动应用开发框架,允许开发者使用 C# 语言编写一次代码,即可在 iOS、Android 和 Windows Phone 上运行。本文将从基础概念入手,逐步深入探讨 Xamarin 开发中的常见问题、易错点及如何避免,并通过代码案例进行解释。
Jimaks
2024/11/22
7950
C#一分钟浅谈:Xamarin 移动应用开发
.NET MAUI:跨平台应用开发的全方位指南
随着技术的不断发展和移动设备的普及,应用程序开发者面临着一个挑战:如何在不同的设备和操作系统上提供一致的用户体验?跨平台开发成为了解决这一挑战的关键技术之一,而微软推出的 .NET MAUI(Multi-platform App UI)就是其中的一个重要工具。本文将深入探讨 .NET MAUI 的特点、架构、使用场景以及开发实战,帮助开发者全面掌握这一跨平台应用开发框架。
Michel_Rolle
2024/09/30
2.8K0
WPF 应用程序开发:一分钟入门
Windows Presentation Foundation (WPF) 是一个用于构建 Windows 桌面应用程序的框架。它提供了丰富的功能集,包括数据绑定、控件、文档支持、图形、音频和视频,以及广泛的编程模型。本篇博客将带你快速了解 WPF 的基本概念,并通过一些常见的问题和易错点来深入探讨如何更高效地进行 WPF 应用程序开发。
Jimaks
2024/09/26
5990
.NET跨平台框架选择之一 - Avalonia UI
Avalonia UI文档教程:https://docs.avaloniaui.net/docs/getting-started
沙漠尽头的狼
2022/11/25
4.8K0
.NET跨平台框架选择之一 - Avalonia UI
C#使用Xamarin开发可移植移动应用(4.进阶篇MVVM双向绑定和命令绑定)附源码
GuZhenYin
2018/01/04
1.7K0
C#使用Xamarin开发可移植移动应用(4.进阶篇MVVM双向绑定和命令绑定)附源码
MAUI中Maui.Graphics.Controls绘制控件
Microsoft.Maui.Graphics是一个完全采用C#的iOS,Android,Windows,macOS,Tizen和Linux的跨平台图形库。 对于MAUI项目当中绘制的方案是使用不同平台的控件来而非自绘。当然MAUI当中也使用了Microsoft.Maui.Graphics, MAUI Preview9更新中, 引入了新的API能够轻松的将边框、阴影、形状添加到其中。
JusterZhu
2022/12/07
8100
MAUI中Maui.Graphics.Controls绘制控件
.NET开源免费的跨平台框架 - MAUI(附学习资料)
前几天分享了一个.NET MAUI开源免费的UI工具包 - Uranium,然后技术群有不少同学问.NET MAUI是不是免费的?能做什么?今天特意写这篇文章来介绍一下.NET开源、免费(基于MIT License)的跨平台框架:MAUI。
追逐时光者
2024/04/21
6420
.NET开源免费的跨平台框架 - MAUI(附学习资料)
移动开发(五):.NET MAUI中自定义主题设置
今天给大家分享.NET MAUI应用中如何自定义主题,提升APP本身个性化设置的能力,让你开发的APP更具有吸引力。感兴趣的朋友可以来学习一下!
小明互联网技术分享社区
2024/08/11
4060
移动开发(五):.NET MAUI中自定义主题设置
C#使用Xamarin开发可移植移动应用进阶篇(10.综合演练,来一份增删改查CRUD)
前言 源码地址:https://github.com/l2999019/DemoApp 可以Star一下,随意 - - 说点什么.. 呃 也有半个月没更新了. 本来这篇的Demo早就写完了,文章也构思
GuZhenYin
2018/01/04
2K0
C#使用Xamarin开发可移植移动应用进阶篇(10.综合演练,来一份增删改查CRUD)
CA周记 - 用 Visual Studio Code 做基于 .NET MAUI 跨平台移动应用开发
自2010年以来,移动应用开发是非常热门的一个方向,从技术上我们经历了原生应用开发、基于 H5 的 Web App、混合模式的移动应用开发,再到跨平台移动应用开发。.NET 不仅是一个跨平台的应用,也是一个跨应用场景的平台。.NET的移动应用方案最开始基于 Mono , 从 MonoTouch , 到 MonoDroid ,到跨平台移动应用方案 Xamarin , 再到现在整合到 .NET 6 的 MAUI。通过 .NET MAUI 你可以通过一份代码,一个项目快速构建具备原生性能的 iOS / Android / Windows / MacOS / Linux 应用。
JusterZhu
2022/12/07
1.4K0
CA周记 - 用 Visual Studio Code 做基于 .NET MAUI 跨平台移动应用开发
Xamarin.Forms入门-使用 Xamarin.Forms 来创建跨平台的用户界面
Xamarin.Forms 是一个跨平台的、基于原生控件的UI工具包,开发人员可以轻松的创建适用于 Android,iOS 以及 Windows Phone的用户界面。Xamarin.Forms 通过使用平台的原生控件来渲染用户界面,使用 Xamarin.Forms 的 App在外观上与平台完全一致。通过本文您可以快速了解如何使用 Xamarin.Form 来进行应用程序的开发。 简介 Xamarin.Forms可以帮助开发人员快速的构建跨平台的UI,通过一次编码,生成多平台界面。如果你做的工作涉及到三个平
葡萄城控件
2018/01/10
13.4K0
Xamarin.Forms入门-使用 Xamarin.Forms 来创建跨平台的用户界面
Avalonia:可信创.NET 跨平台UI,让JAVA失业者转.NET信创开发!
亲爱的读者们,今天我想与大家分享一个令人兴奋的主题 —— Avalonia,这个强大的.NET跨平台UI框架。作为一名曾经的JAVA开发者,我深知转换技术栈的挑战。然而,在当前快速变化的IT行业中,适应新技术已成为我们的必修课。尤其是在信创产业蓬勃发展的背景下,Avalonia为我们提供了一个绝佳的机会,让我们能够无缝过渡到.NET生态系统,并在跨平台UI开发领域大展身手。
用户10786849
2024/07/25
2.4K0
Avalonia:可信创.NET 跨平台UI,让JAVA失业者转.NET信创开发!
官宣!微软跨平台 UI 框架 .NET MAUI 6 正式发布!
欢迎使用 .NET 多平台应用程序 UI。此版本标志着我们在统一 .NET 平台的多年旅程中的新里程碑。现在,您和超过 500 万其他 .NET 开发人员拥有面向 Android、iOS、macOS 、Windows和Linux(由Github开源社区支持) 的一流跨平台 UI 技术栈,以补充 .NET 工具链 (SDK) 和基础类库 (BCL)。您可以使用 .NET 构建任何东西。
JusterZhu
2022/12/07
4.3K0
官宣!微软跨平台 UI 框架 .NET MAUI 6 正式发布!
C#语法——消息,MVVM的核心技术。
在C#中消息有两个指向,一个指向Message,一个指向INotify。这里主要讲INotify。
Kiba518
2018/08/23
1.3K0
移动开发(六):.NET MAUI中布局笔记介绍
StackLayout 主要用于水平或者垂直方向一组元素的排列布局。 其中 Orientation 属性用来指定元素排列的方向,默认为 Vertical
小明互联网技术分享社区
2024/09/18
3310
移动开发(六):.NET MAUI中布局笔记介绍
MAUI中构建跨平台原生控件实现
MAUI中使用Handler体系来处理不同平台的原生控件实现, 即对应的, 如果我们想要创建控件, 只需要创建基于不同平台的Handler即可。 那么下面主要教大家如何通过创建Handler(事件处理程序)来构建自己的控件。
JusterZhu
2022/12/07
8020
MAUI中构建跨平台原生控件实现
C#的跨平台应用程序开发
在现代软件开发中,跨平台应用程序开发是一个重要趋势,它允许开发者编写一次代码并在多个操作系统上运行。C#作为一门流行的编程语言,提供了多种工具和框架来支持跨平台开发。本文将深入探讨C#跨平台应用程序开发的核心概念、主要框架、使用场景以及最佳实践。
Michel_Rolle
2024/10/09
2.7K0
Xamarin 学习笔记 - Page(页面)
在之前的章节,我讲解了如何为Android或者iOS应用程序开发准备环境以及Layout布局的一些基本概念。
葡萄城控件
2018/08/09
4.8K0
Xamarin 学习笔记 - Page(页面)
MAUI Blazor 项目实战 - 从0到1轻松构建多平台应用UI
最近在项目中尝鲜了MAUI,总体感受下来还是挺不错的,优缺点并存,但是瑕不掩瑜,目前随着.Net版本的迭代升级对它的支持也越来越友好,相信未来可期!感兴趣的朋友欢迎关注。文章中如有不妥的地方,也请多多指教。
郑子铭
2023/08/30
6280
MAUI Blazor 项目实战 - 从0到1轻松构建多平台应用UI
推荐阅读
相关推荐
C#一分钟浅谈:Xamarin 移动应用开发
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档