Slope one:简单高效的推荐算法

推荐系统最早在亚马逊的网站上应用,根据以往用户的购买行为,推荐出购买某种产品同时可能购买的其他产品,国内做的不错的当当网,有时候买书,它总能给我推荐出我感兴趣的其他书来,也算是技术极大的促进了销售。

一般的协同过滤算法,首先是收集用户对事物(产品)的评分情况,一种直接对某本书,或者某个歌曲打分,另种是隐性的打分,比如商务系统中,购买了表示打2分,浏览了打1分,其他的0分。我比较看好隐性打分,因为直接打分需要用户的参与程度比较高,很多网站都在内容页中留一个打分的按钮,从1~5选一个,我可能喜欢这篇文章,可我哪里知道我喜欢的程度是几分啊,还要我去思考,而网站设计中一条很重要的原则是:Do not let me think!,于是我就胡打一个分数或者不打,而隐性的打分则不同,只有你喜欢的图书你才会购买,只有你喜欢的歌曲才会听多次。

收集好用户的打分之后,通过最近邻搜索到和某个事物或者某个人特征或者兴趣相近的其他事物或者人,最近邻搜索算法一般是皮尔森相关系数(Person Correlation Coefficient)、余弦相似性(Cosine-based Similarity)以及调整余弦相似性(Adjusted Cosine Similarity)。关于余弦定理在数据挖掘中的应用,google黑白报有过介绍,可以参考数学之美 系列 12 - 余弦定理和新闻的分类。

剩下的工作就是根据最近邻集进行推荐了。

最近邻集的运算相对来说成本比较高,尤其是大量数据的时候,今天和大家分享的是一种简单高效的协同过滤算法:Slope one

基本原理

用户

对事物A打分

对事物B打分

X

3

4

Y

2

4

Z

4

?

用户Z对事物B的打分可能是多少呢?股票上有个说法是平均值可以掩盖一切异常波动,所以股票上的各个技术指标收拾不同时间段的平均值的曲线图或者柱状图等。同样的,Slope one算法也认为:平均值也可以代替某两个未知个体之间的打分差异,事物A对事物B的平均很差是:((3 - 4) + (2 - 4)) / 2 = -1.5,也就是说人们对事物B的打分一般比事物A的打分要高1.5,于是Slope one算法就猜测Z对事物B的打分是4 + 1.5 = 5.5

是不是非常的简单?

加权算法

有n个人对事物A和事物B打分了,R(A->B)表示这n个人对A和对B打分的平均差(A-B),有m个人对事物B和事物C打分了,R(B->C)表示这m个人对B和对C打分的平均差(B-C),注意都是平均差而不是平方差,现在某个用户对A的打分是ra,对C的打分是rc,那么A对B的打分可能是:

rb = (n * (ra - R(A->B)) + m * (rb + R(B->C)))/(m+n)

开源的Slope one的程序包

  • Python http://www.serpentine.com/blog/2006/12/12/collaborative-filtering-made-easy/
  • Java http://taste.sourceforge.net/ http://www.daniel-lemire.com/fr/documents/publications/SlopeOne.java http://www.nongnu.org/cofi/
  • PHP http://sourceforge.net/projects/vogoo http://www.drupal.org/project/cre http://www.daniel-lemire.com/fr/documents/publications/webpaper.txt
  • Slope one算法作者写的,简单明了,强烈推荐。
  • Erlang http://chlorophil.blogspot.com/2007/06/collaborative-filtering-weighted-slope.html
  • C# http://www.kuqin.com/algorithm/20080628/10205.html
  • 国人写的C#版本
  • T-SQL http://blog.charliezhu.com/2008/07/21/implementing-slope-one-in-t-sql/

还有一些其他语言的版本,请参考http://en.wikipedia.org/wiki/Slope_One,即将面世的,居于PHP & Mysql的Slope one算法实现将会在http://code.google.com/p/openslopeone/开源出来,主要优化的是海量数据以及分布式处理,目前在我的笔记本上(迅驰+1.5G内存),对440W打分记录进行测试,单一线程,3小时47分处理完。速度还算是不错了,最近工作实在太忙了,等我整理好会开源出来放在上面的地址。过几天会有一篇我的算法的详细介绍,盼诸位批评指正,共同学习,共同进步。

原文发布于微信公众号 - 大数据挖掘DT数据分析(datadw)

原文发表时间:2015-07-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏华章科技

你真的知道怎么用大数据来驱动产品和运营吗?

本文作者为桑文锋,Sensors Data创始人&CEO,前百度大数据部技术经理。2005 毕业于浙江大学计算机系,2007年加入百度并负责组建并带领团队,从零...

662
来自专栏java一日一条

程序员世界常见的6个问题

在完成这些任务的过程中,我不但学到了很多不同的技能,并得出了很多观察结果,想与大家分享。

391
来自专栏华章科技

7步教你打造你的第一份数据报告

你是一个在校学生,上着自己喜欢或不喜欢的课,闲来无事,你打开知乎,看到了数据分析话题,你下定决心要成为一个数据分析师,你搞来一堆学习资料和在线课程,看完之后自信...

662
来自专栏知晓程序

他们做的小程序,要把全世界的好文章装进你的口袋 | 晓组织 #12

我们是「墨加口袋」团队的工匠,每天都在马不停蹄地迭代、测试、优化产品,虽然很累,但越来越多的用户通过「墨加口袋」提高了他们收藏、整理和分享好文章的效率,这令我们...

1032
来自专栏CDA数据分析师

大数据分析师:啥时候说Yes啥时候该说No?

早在20世纪90年代的美国沃尔玛超市中,就有“啤酒与尿布“的故事表现了大数据分析给企业带来的利益体现。这些年来大数据分析正在为企业带来巨大的变化。虽然越来越普遍...

1785
来自专栏云计算D1net

数据安全性思考:在云中应信任什么?

虽然云供应商尽力提供了他们的安全措施,但是关于合作伙伴、客户以及他们在安全方面努力的投诉依然存在。 ? 对于Cirrity这样没有直属销售队伍而依托系统集成商和...

2877
来自专栏ThoughtWorks

避免成为“优秀的程序员” | TW洞见

今日洞见 文章作者来自ThoughtWorks:Deon Thomas,译者来自:陈翔。图片来自网络。 感谢ThoughtWorks校队小组:张力文 刘若然 ...

3389
来自专栏厦门SEO

2018年做好SEO搜索引擎优化的五大策略!

SEO重点可以浓缩成这5个大方向,听起来很简单,但实际上要去优化到好却是件浩大的工程。但是,只要努力彻底执行这5大方向的优化,你绝对可以把关键字排名做的非常好,...

749
来自专栏phodal

我是如何为技术博客设计一个推荐系统(上):统计与评分加权

过去的两周里,我一直忙于为 『玩点什么』 设计一个推荐系统。在这个过程中,参考几本书籍,查找了一系列的资料。想着这些资料上,大部分都是大同小异的,实现了几个简单...

2556
来自专栏大数据文摘

Mesa——谷歌揭开跨中心超速数据仓库的神秘面纱

1326

扫码关注云+社区