Archive for the ‘推荐系统’ Category

【Resys】付超群:Music Recommender Systems

星期四, 六月 3rd, 2010

这个slide介绍了不少推荐的算法,但我所收获的确是整个推荐环节的一些通用的过程及数据整理:

Music Recommender Systems

  • Data Collection(User rating/collection/listen log/view log)
  • Data Cleaning(Missing/Wrong/Noise/Duplicate Data)
  • Data Preprocessing
  • Data Mining
  • Tracking & Optimization

【Resys】付超群:智能推荐系统

星期三, 六月 2nd, 2010

付超群的这个Slide也是个极好的智能推荐学习材料

【Resys】王守崑:豆瓣在推荐领域的实践和思考

星期二, 六月 1st, 2010

最近有个推荐的实战项目,但在重新看了这个豆瓣的推荐分享后发现我们没考虑到的问题还相当多。对于盛大来说,要做好这块不仅仅是找几个人这么简单,而是需要从业务、用户行为、技术实现和实际运营等多维度来思考。

——————————–

什么样的产品适合推荐(产品特性、用户行为层面):

  • 具有媒体性的产品(Media Product)
  • 口味(taste)很重要
  • 单位成本不重要
  • 瀑布效应(Information Cascade),详见附一

什么样的产品适合推荐(业务层面):

  • 条目增长相对稳定
  • 能够获得快速反馈
  • 稀疏性、多样性和时效性的平衡

推荐系统的可扩展性:

  • 降低存储空间
  • 近似算法/分块
  • 并行/分布式计算

推荐系统面临的挑战:

  • 推荐是一项技术还是一种产品/功能?
  • 推荐能否有独立的产品形态?
View more webinars from gu wendong.
附一:information cascade
An information (or informationalcascade occurs when people observe the actions of others and then make the same choice that the others have made, independently of their own private information signals. Because it is usually sensible to do what other people are doing, the phenomenon is assumed to be the result of rational choice. Nevertheless, information cascades can sometimes lead to arbitrary or even erroneous decisions.

【Resys】Resys China创刊号

星期天, 三月 14th, 2010

在Resys群组潜水很久了,之所以潜水是因为以前对推荐系统这个领域一无所知。最近几位热心人做出了质量相当高的Resys China创刊号,一定要推荐一下。

从长远来看,推荐系统绝对有很好的发展前景。从应用层面来讲,目前领先的电子商务网站、视频网站及信息内容消费网站都有所尝试。Amazon的推荐系统所带来的销售额据说已经达到30%了。但对绝大多数公司来说这也是个资源、人才和技术投入的无底洞,投入产出比还无法平衡。举个在Resys China第一期里提到的例子:一个由顶级计算机科学家组成的团队花了三年时间把Netflix的推荐引擎准确度提高了10%,而Netflix总共只不过7w多部作品。从这个角度而言,不要说对于盛大文学,仅仅对起点中文网而言,要做一个有效的推荐系统(目前只是“读者还读过”,“书友推荐”等初级阶段),从目前看来也是一个几乎不可能完成的任务。但我所关心的是有没有人开始关注这个事情并着手尝试。

【Resys】如何从无到有建立推荐系统

星期二, 十二月 15th, 2009

推荐系统广泛应用于各类网站,电子商务中的商品推荐、博客网站的文章推荐,以及帮助人们寻找音乐和影片的各类应用。但如何才能从无到有的给网站配备一个推荐系统呢?针对这个问题,我在搜索引擎中遍寻多时,但始终没有找到满意的答案。这期间我也加入了国内推荐系统高手聚集的推荐系统邮件列表,其中不乏当当、卓越亚马逊、豆瓣等业内在推荐系统上领先的产品、技术高手,但浸淫多日却始终无法在脑海中形成一个以内容推荐为最终目的的产品框架或产品路线图。这种状态一直持续到我购买了集体智慧编程(Programming Collective Intelligence)后才得以改观,现在我将此书的部分读书笔记予以整理,希望能给同样对推荐系统感兴趣的朋友整理出一个可操作的、适合内容型网站推荐系统产品框架。

——————–正文分割线——————–

我们知道,要想了解内容网站的推荐信息,最没有技术含量的方法莫过于向朋友询问。我们也知道,这其中有一部分人的品位会比其他人的高一些,通过观察这些人是否通常也和我们一样喜欢同样的东西,可以逐渐对这些情况有所了解。不过随着选择越来越多,要想通过询问一小群人来确定我们想要的东西,将会变得越来越不切实际,因为他们可能并不了解所有的选择。这就是为什么人们要发展出一套被称为协同过滤(collaborative filtering)的技术。从实际的情况看,目前我们所能接触到的领先推荐系统,包括Netfilx、豆瓣、Amazon等等都是利用协同过滤技术来实现的。协同过滤又分成几种:基于用户的协同过滤、基于项目的协同过滤、基于模型的协同过滤。

那么到底什么是协同过滤?它需要产品设计者做哪些事情才能实现?(为了让问题简化,这里着重介绍基于用户的协同过滤)

一个基于用户的协同过滤过滤算法通常的做法是对一大群人进行搜索,并从中找出与我们品位相近的一小群人。算法会对这些人所偏爱的其他内容进行考察,并将它们组合起来构成一个经过排名的推荐列表。因此产品设计者需要理解你的网站需要依次做以下这几件事情:

1.搜集偏好(Collecting Preferences)

要搜集偏好意味着要寻找一种表达不同人及其偏好的方法。例如,豆瓣会要求用户对每部电影用1到5颗星来评分,以此来体现包括本人在内的每位影评者对某一给定影片的喜爱程度。假如你正在设计一个购物网站,那不妨用数字1来代表有人过去购买过某件商品,用数字0来代表未曾购买过任何商品。而对于一个新闻故事投票网站,我们可以分别用数字-1、0和1来表达“不喜欢”、“没有投票”、“喜欢”。不管偏好如何表达的,你要做的是建立一种方法来使得你的用户来参与表达,并把他们表达的内容对应到数字以形成相应的数据集合。

2.寻找相近的用户(Finding Similar Users)

有了人们偏好的数据集后,我们需要有一种方法来确定人们在品位方面的相似程度。为此,我们可以将每个人与所有其他人进行对比,并计算他们的相似度评价值。有若干种方法可以达到此目的:欧几里德距离(Euclidean Distance Score)皮尔逊相关度(Person Correlation Coefficient)余弦相似性(Cosine-based Similarity)、调整余弦相似性(Adjusted Cosine Similarity)、Jaccard系数曼哈顿距离算法等。请记住,各种相似度的计算方法各有所长,要根据具体的应用场景来选取一种或几种综合使用。

下面以实际例子简单介绍两种:

欧几里德距离(Euclidean Distance Score):它以经过人们一致评价的物品为坐标轴,然后将参与评价的人绘制到图上,并考察他们彼此间的距离远近。x轴、y轴分别代表电影Dupree和Snake,而在第一象限偏好空间里的则是每个人对这两部电影的评分。

欧几里德距离不难发现,Toby对Snakes和Dupree这两部电影的评分是4.5和1.0,而LaSalle的则是4.0和2.0。按照欧几里德距离的结论,偏好越相似的人,其在偏好空间的距离就越短。至于如何计算两者的距离,运用你初中学的几何知识就行,计算两点每个坐标的差值,求平方后再相加,最后对总和取平方根。值得一提的是此方法对于数量多于两项的评分也同样适用。因此,你可以设计一个函数来计算2个用户间的相似度,当然前提是两者需要有一定重合的评分项。

欧几里德距离公式

皮尔逊相关度(Pearson Correlation Score):它的原理是通过判断两组数据与某一直线拟合程度来判断相似度。它在数据不是很规范(normalized)的时候,如影评者对影片的评价总是相对于平均水平偏离很大时,会倾向于给出更好的结果。

如下图是Mick LaSalle和Gene Seymour分别对5部电影的评分(与上图不同,x轴和y轴对应的是两个人),虚线被称为最佳拟合线(best-fit line),其绘制原则是尽可能地靠近图上的所有坐标点。如果两位评论者对所有影片的评分情况都相同,那么这条直线将成为对角线,并且会与图上所有的坐标点都相交。

皮尔逊相关度1

下图展示了一个有着更高相关系数的例子,这意味着Lisa Rose和Jack Matthews在这几部电影上有着更高的相似度(各点更靠近最佳拟合曲线)。

皮尔逊相关度2采用皮尔逊方法可以修正“夸大分值(grade inflation)”的情况。在上图中,虽然Jack总是倾向于给出比Lisa更高的分数,但最终的直线仍然拟合度较高,这是因为他们两者有着相对近似的偏好。也就是说,如果某人总是倾向于给出比另一人更高的分数,而两者的分差又始终保持一致,则他们依然可能会存在很好的相关性。而此前提到过的欧几里德距离评价方法,会因为一个人的评价始终比另一个人更为“严格”(从而导致评价始终相对较低),而得出两者不相近的结论,即使他们的品位很相似也是如此。而这一行为是否是我们想要的结果,取决于具体的应用场景。

皮尔逊的相关度算法首先会找出两位评论者都曾评价过的物品,然后计算两者的评分总和和平方和,并求得评分的乘积之和。最后,利用这些计算结果计算出相关系数:

皮尔逊相关度公式

PS:公式能看懂,但我还未能从数学上去理解此公式的推导过程,惭愧-_-|||

3.为评论者打分(Ranking the Critics)

理解了上一步后,这步就简单了。现在只需根据指定的人员对每个人进行打分,找出最接近的匹配结果,也即所谓该人的最近邻。回到上面的例子,我们的目的是要寻找与自己品位相似的影评者,那么所需要做的就是以你自己为基准,计算每个人和你的相似度,然后排序输出前几项即可。现在假设你是Toby,那么经过这一步的计算你会得到一个你的最近邻列表,也就是说你可能会知道Lisa、Mick和Claudia可能是和你品位最相近的3个人。

4.推荐物品(Recommending Items)

找到一位和你趣味相投的影评者固然不错,但我们的最终目的是一份影片的推荐列表(上面提到过的以内容推荐为最终目的)。当然,简单的做法是查找与自己品位最相近的人,并从他所喜欢的影片中找出一部自己还未看过的影片,但这样做有些随意或者是粗糙。因为如果该人还未对某些影片做过评论,但这些影片也许就是我们所喜欢的。又或者另外的一种情况就是推荐给你某人特别热衷的一部影片,但有其他可靠数据表明所有的其他评论者都不看好这部影片。

为了解决上述问题,我们需要一个经过加权的评价值来为影片打分:

影片加权评分上图中Critic列是与Toby进行相似度对比的人名,Similarity列表示他们与Toby的相似度系数。Night、Lady和Luck都是电影名,所在列是这些人对这些电影的评分。S.x打头的那几列给出了相似度系数和评分后相乘的结果。如此一来,相比于我们不相近的人,那些与我们相近的人将会对整体评价拥有更多的贡献。

那有人会问为什么不直接采用Total这行,而需要Total/Sim.Sum?这是因为,一部受更多人评论的影片会对结果产生更大的影响,因此我们必须要除以Sim.Sum,它代表了所有对这部电影有过评论的评论者的相似度之和。就像Night这部电影,Total为12.89,有5个人为其评分,而Lady为8.38,4个人评分。假设电影Night有和当前相同的Total分数却多了一倍的人为其评分,那最后的结果也未必一定比电影Lady的Total/Sim.Sum更好。

好了,我们现在已经得到了一个经过排名的影片列表了,你可以决定自己究竟要不要观看其中的某一部,或者干脆什么也别看。其实,有时候什么都不推荐也是一种推荐。

最后我用lovelycharts画了这张流程图(用的时候才现不支持中文噢)。如果你想要设计一个推荐系统,现在应该大概清楚要做哪几件事情了吧:)

Recommendation_design

协同过滤(Collaborative Filtering)扫盲班(5)

星期一, 四月 13th, 2009

Slope One协同过滤算法

Slope One是一个简单高效的协同过滤算法,由 Daniel Lemire 教授在 2005 年提出。

基本概念

用户X,Y和Z都对Item1打了分。 同时用户X,Y还对Item2打了分,用户Z对Item2可能会打多少分呢?

用户 对Item1的评分 对Item2的评分
X 5 3
Y 4 3
Z 4 ?

计算方法:4 – ((5-3) + (4-3))/2 = 2.5,找到对Item1和Item2都打过分的用户,算出rating差的平均值,这样我们就能推测出对Item1打过分的用户Z对Item2的可能的评分,并据此向Z用户推荐新项目。

Slope One的优点

这里我们能看出Slope One算法的一个很大的优点,在只有很少的数据时候也能得到一个相对准确的推荐, 这一点可以解决Cold Start的问题。

另外一种情况

如果100个用户对Item1和Item2的评分差的平均值是2,1000个用户对Item2和Item3的评分差的平均值是-3,那Item1相对Item3的评分情况又是如何?显然这两个rating差的权重是不一样的。因此我们的计算过程是:

  • (100×(Rating 1 to 2) + 1000×(Rating 3 to 2)) / (100 + 1000)
  • (100×2 + 1000×(-3)) / (100 + 1000)
  • -2800/1100
  • 约等于-2.55

也就是说Item1和Item3的评分差的平均值是2.55