yyyyyyyyyyyyyyyyyyyy

博客园 首页 新随笔 联系 订阅 管理

推荐系统的常用算法概述

 

  前一阵子准备毕业论文的开题,一直在看推荐系统相关的论文。对推荐系统有了一个更加清晰和理性的认识,也对推荐算法有了深入了解。借此机会总结分享一下,大家多多拍砖。

推荐系统的出现

  随着互联网的发展,人们正处于一个信息爆炸的时代。相比于过去的信息匮乏,面对现阶段海量的信息数据,对信息的筛选和过滤成为了衡量一个系统好坏的重要指标。一个具有良好用户体验的系统,会将海量信息进行筛选、过滤,将用户最关注最感兴趣的信息展现在用户面前。这大大增加了系统工作的效率,也节省了用户筛选信息的时间。

  搜索引擎的出现在一定程度上解决了信息筛选问题,但还远远不够。搜索引擎需要用户主动提供关键词来对海量信息进行筛选。当用户无法准确描述自己的需求时,搜索引擎的筛选效果将大打折扣,而用户将自己的需求和意图转化成关键词的过程本身就是一个并不轻松的过程。

  在此背景下,推荐系统出现了,推荐系统的任务就是解决上述的问题,联系用户和信息,一方面帮助用户发现对自己有价值的信息,另一方面让信息能够展现在对他感兴趣的人群中,从而实现信息提供商与用户的双赢。

 

推荐算法介绍

  1 基于人口统计学的推荐

  这是最为简单的一种推荐算法,它只是简单的根据系统用户的基本信息发现用户的相关程度,然后将相似用户喜爱的其他物品推荐给当前用户。

  

  系统首先会根据用户的属性建模,比如用户的年龄,性别,兴趣等信息。根据这些特征计算用户间的相似度。比如系统通过计算发现用户A和C比较相似。就会把A喜欢的物品推荐给C。

  优势:

  a 不需要历史数据,没有冷启动问题

  b 不依赖于物品的属性,因此其他领域的问题都可无缝接入。

  不足:

  算法比较粗糙,效果很难令人满意,只适合简单的推荐

 

  2 基于内容的推荐

  与上面的方法相类似,只不过这次的中心转到了物品本身。使用物品本身的相似度而不是用户的相似度。

  

  系统首先对物品(图中举电影的例子)的属性进行建模,图中用类型作为属性。在实际应用中,只根据类型显然过于粗糙,还需要考虑演员,导演等更多信息。通过相似度计算,发现电影A和C相似度较高,因为他们都属于爱情类。系统还会发现用户A喜欢电影A,由此得出结论,用户A很可能对电影C也感兴趣。于是将电影C推荐给A。

  优势:

  对用户兴趣可以很好的建模,并通过对物品属性维度的增加,获得更好的推荐精度

  不足:

  a 物品的属性有限,很难有效的得到更多数据

  b 物品相似度的衡量标准只考虑到了物品本身,有一定的片面性

  c 需要用户的物品的历史数据,有冷启动的问题

 

  3 协同过滤

  协同过滤是推荐算法中最经典最常用的,具体的思路我已经在之前的一篇文章中提到过,大家可以去看一下。

  这里只想介绍一下协同过滤中的方法和刚才提到方法的区别。

  大家都知道协同过滤分为基于用户的协同过滤和基于物品的协同过滤。那么他们和基于人口学统计的推荐和基于内容的推荐有什么区别和联系呢?下面简单介绍一下。

  基于用户的协同过滤——基于人口统计学的推荐

  基于用户的协同过滤推荐机制和基于人口统计学的推荐机制都是计算用户的相似度,并基于“邻居”用户群计算推荐,但它们所不同的是如何计算用户的相似度,基 于人口统计学的机制只考虑用户本身的特征,而基于用户的协同过滤机制可是在用户的历史偏好的数据上计算用户的相似度,它的基本假设是,喜欢类似物品的用户 可能有相同或者相似的口味和偏好。

  基于物品的协同过滤——基于内容的推荐

  基于项目的协同过滤推荐和基于内容的推荐其实都是基于物品相似度预测推荐,只是相似度计算的方法不一样,前者是从用户历史的偏好推断,而后者是基于物品本身的属性特征信息。

  协同过滤的优势:

  a 它不需要对物品或者用户进行严格的建模,而且不要求物品的描述是机器可理解的,所以这种方法也是领域无关的。

  b 这种方法计算出来的推荐是开放的,可以共用他人的经验,很好的支持用户发现潜在的兴趣偏好

  不足:

  a 方法的核心是基于历史数据,所以对新物品和新用户都有“冷启动”的问题。

  b 推荐的效果依赖于用户历史偏好数据的多少和准确性。

  c 在大部分的实现中,用户历史偏好是用稀疏矩阵进行存储的,而稀疏矩阵上的计算有些明显的问题,包括可能少部分人的错误偏好会对推荐的准确度有很大的影响等等。

  d 对于一些特殊品味的用户不能给予很好的推荐。

  e 由于以历史数据为基础,抓取和建模用户的偏好后,很难修改或者根据用户的使用演变,从而导致这个方法不够灵活。

 

  4 混合推荐算法

  以上介绍的方法是推荐领域最常见的几种方法。但是可以看出,每个方法都不是完美的。因此实际应用中,向Amazon这样的系统都是混合使用各种推荐算法,各取所长。因此我们在使用时,也可以多考虑一下什么情况下更适合使用哪种算法,来提高我们系统的效率。

 

推荐系统的发展方向

  1 需要考虑在保证推荐准确性的同时增加推荐的多样性,使特殊喜好的用户得到推荐

  2 需要考虑用户对系统的实时反馈,更好的利用反馈数据强化推荐算法

  3 考虑时间,空间,任务等因素,来更好的完成推荐

  

欢迎大家拍砖~ 更多资料请看 http://www.ibm.com/developerworks/cn/web/1103_zhaoct_recommstudy1/index.html

 

 

 

选择合适的推荐系统模型

我们的机器学习工程师一直忙于构建GraphLab farm。这篇博客针对一个特殊的应用难题:怎样从 GraphLab Create recommender toolkit 的众多模型和选项中选择一个合适的推荐模型。

这完全取决于你现有的数据类型以及你评估结果的方式。

(注意:这里使用的是GraphLab Create 0.9 的API。GraphLab Create 1.0 支持通过recommender.create() 来智能选择推荐模型。你可以通过 1.0 的API文档查看recommender toolkit中模型的最新说明。此外,这个论坛列出了从版本0.9.1到版本1.0的API变动。)

如果你的数据是隐性的,也就是数据中仅有用户和物品间的交互信息(没有用户对物品的打分),那么,你可以选择使用Jaccard相似度的 ItemSimilarityModel

当数据为隐反馈时,你可以通过增加一个均为1的目标列把数据伪装成显性数据。若要构建追求排序性能的模型,请见下文。

如果数据是显性的,也就是观测数据中包含用户的真实评分,那么你可以从多个模型中选择。使用cosine或Pearson相似度的ItemSimilarityModel可以包含评分信息。此外,MatrixFactorizationModel(矩阵分解模型)、FactorizationModel(分解模型) 以及 LinearRegressionModel(线性回归模型) 都支持评分预测。

如果你的目标是提高排序性能,你可以在设置 ranking_regularization 的情况下使用 ItemSimilarityModel(物品相似度模型)、MatrixFactorizationModel(矩阵分解模型) 、 FactorizationModel(分解模型)。排序正则化选项设置后会随机地选取一些未观测数据并把它们的目标评分设成一个偏负面的值。ranking_regularization 值在0到1之间。该值越大,负样本的权重也就越大。如果你想使用 分解模型来处理隐反馈数据,你应该首先给 SFrame 增加一列全为1的值把它变成显性数据,再将 unobserved_rating_value 设为 0 来运行排序正则化。这里明确地设定 unobserved_raint_value 是有必要的,因为模型默认把未知评分设为已知评分的 5% 分位数;当所有已知评分均为 1 时,它们的 5% 分位数也是 1,不能把它作为未知评分的目标值。

如果你想对评分数据进行评分预测,那么选择MatrixFactorizationModel, FactorizationModel, or LinearRegressionModel的任意一个。从统计学的角度看,这三个模型都是明确地对评分建模的回归模型。换句话说,观测评分被建模为一些项的加权组合,其中权重(包括一些项,也被成为因子)通过训练数据得到。这几个模型都可以很方便地引入用户或物品特征。

LinearRegressionModel 假设评分是用户特征、物品特征、用户偏置、物品流行度偏置的线性组合。MatrixFactorizationModel 和 FactorizationModel 还可以引入两个向量的内积项,其中一个向量表示用户对一组隐性特征的喜好程度,另一个向量表示物品对这组隐性特征的包含程度。这些通常被称为隐性因子并且可以从观测数据中自动学习得到。FactorizationModel (分解模型)较 MatrixFactorizationModel(矩阵分解模型) 更进一步, 考虑到了这些隐性因子与边际特征的交互影响。一般来说,FactorizationModel(分解模型) 最有效,但也最难训练(由于它的威力和灵活性)。LinearRegressionModel(线性回归模型) 最简单,训练速度也最快,但没有考虑用户物品间的交互作用。

我们建议你从 MatrixFactorizationModel(矩阵分解模型) 开始,如果这个模型运行时间过长,可以降级使用 LinearRegressionModel(线性回归模型)。或者,如果你认为需要使用二阶交互项来加强模型,可以升级使用 FactorizationModel(分解模型)。注意,这些模型都带有几个正则化参数如:n_factors 和 regularization,这些参数会影响测试时的预测精度。这对于 FactorizationModel(分解模型) 尤为有用。建议你使用超参数搜索函数 graphlab.toolkits.model_params_search() 来调整这些参数。

如果目标评分是二值的,也就是它们的值是赞或踩标签,在使用回归模型(LinearRegressionModel, MatrixFactorizationModel, FactorizationModel)时,设置输入参数‘binary_targets = True’。

使用MatrixFactorizationModel(矩阵分解模型) 和 FactorizationModel (分解模型)训练得到的隐性因子可以作为特征用于其他的任务。在这种情形下,使用非负因子有利于提高可解释性。简单地使用‘nmf=True’作为输入参数,分解类型的模型就会学习非负因子。

已有数据?数据问题?

最后,有几个影响推荐系统性能的常见数据问题。第一,如果观测数据非常稀疏,也就是仅包含大量用户的一个或两个观测数据,那么任何一个模型都不会比 popularity 或 item_means 这些基准模型效果好。这种情况下,将稀疏用户和物品剔除后重试也许有用。另外,重新检查数据收集和清理过程,看错误是否源于此处。尽可能对每个用户每个物品获取更多的观测数据。

另一个经常会遇到的问题是把使用数据当做评分。与显性评分位于一个很好的线性区间(例如,[0, 5])不同,使用数据可能被严重扭曲。例如,在 Million Song 数据集中,一个用户播放一首歌超过 16000 次。所有的模型都很难应对这种严重扭曲的目标。解决的方法是对使用数据进行归类。例如,把播放次数超过 50 次映射成最高评分 5 。你也可以把播放次数转成二进制,例如播放超高两次的为 1,反之为 0。

好吧,都记住了吗?是的,我们一半都记不住。下面这幅粗略的信息图一目了然地显示了所有的提示。愉快地探索吧,勇敢地推荐系统研究者!

 

 

 

 

互联网推荐系统漫谈

推荐系统这个东西其实在我们的生活中无处不在,比如我早上买包子的时候,老板就经常问我要不要来杯豆浆,这就是一种简单的推荐。随着互联网的发展,把线下的这种模式搬到线上成了大势所趋,它大大扩展了推荐系统的应用:亚马逊的商品推荐,Facebook的好友推荐,Digg的文章推荐,豆瓣的豆瓣猜,Last.fm和豆瓣FM的音乐推荐,Gmail里的广告......在如今互联网信息过载的情况下,信息消费者想方便地找到自己感兴趣的内容,信息生产者则想将自己的内容推送到最合适的目标用户那儿。而推荐系统正是要充当这两者的中介,一箭双雕解决这两个难题。

推荐系统的评判标准

首先我们得明确什么是好的推荐系统。可以通过如下几个标准来判定。

  • 用户满意度  描述用户对推荐结果的满意程度,这是推荐系统最重要的指标。一般通过对用户进行问卷或者监测用户线上行为数据获得。
  • 预测准确度  描述推荐系统预测用户行为的能力。一般通过离线数据集上算法给出的推荐列表和用户行为的重合率来计算。重合率越大则准确率越高。
  • 覆盖率  描述推荐系统对物品长尾的发掘能力。一般通过所有推荐物品占总物品的比例和所有物品被推荐的概率分布来计算。比例越大,概率分布越均匀则覆盖率越大。
  • 多样性  描述推荐系统中推荐结果能否覆盖用户不同的兴趣领域。一般通过推荐列表中物品两两之间不相似性来计算,物品之间越不相似则多样性越好。
  • 新颖性  如果用户没有听说过推荐列表中的大部分物品,则说明该推荐系统的新颖性较好。可以通过推荐结果的平均流行度和对用户进行问卷来获得。
  • 惊喜度  如果推荐结果和用户的历史兴趣不相似,但让用户很满意,则可以说这是一个让用户惊喜的推荐。可以定性地通过推荐结果与用户历史兴趣的相似度和用户满意度来衡量。

简而言之,一个好的推荐系统就是在推荐准确的基础上给所有用户推荐的物品尽量广泛(挖掘长尾),给单个用户推荐的物品尽量覆盖多个类别同时不要给用户推荐太多热门物品,最牛逼的则是能让用户看到推荐后有种「相见恨晚」的感觉。

推荐系统的分类

推荐系统是建立在大量有效数据之上的,背后的算法思想有很多种,要大体分类的话可以从处理的数据入手。

1.利用用户行为数据 

互联网上的用户行为千千万万,从简单的网页浏览到复杂的评价,下单......这其中蕴含了大量的用户反馈信息,通过对这些行为的分析,我们便能推知用户的兴趣喜好。而这其中最基础的就是「协同过滤算法」

「协同过滤算法」也分两种,基于用户(UserCF)和基于物品(ItemCF)。所谓基于用户,就是跟据用户对物品的行为,找出兴趣爱好相似的一些用户,将其中一个用户喜欢的东西推荐给另一个用户。举个例子,老张喜欢看的书有A,B,C,D;老王喜欢看的书有A,B,C,E。通过这些数据我们可以判断老张和老王的口味略相似,于是给老张推荐E这本书,同时给老王推荐D这本书。对应的,基于物品就是先找出相似的物品。怎么找呢?也是看用户的喜好,如果同时喜欢两个物品的人比较多的话,就可以认为这两个物品相似。最后就只要给用户推荐和他原有喜好类似的物品就成。举例来说,我们发现喜欢看《从一到无穷大》的人大都喜欢看《什么是数学》,那如果你刚津津有味地看完《从一到无穷大》,我们就可以立马给你推荐《什么是数学》。

至于什么时候用UserCF,什么时候用ItemCF,这都要视情况而定。一般来说,UserCF更接近于社会化推荐,适用于用户少,物品多,时效性较强的场合,比如Digg的文章推荐;而ItemCF则更接近个性化推荐,适用于用户多,物品少的场合,比如豆瓣的豆瓣猜、豆瓣FM,同时ItemCF还可以给出靠谱的推荐理由,例如豆瓣的「喜欢OO的人也喜欢XX」和亚马逊的「买了XX的人也买了OO」。

协同过滤算法也有不少缺点,最明显的一个就是热门物品的干扰。举个例子,协同过滤算法经常会导致两个不同领域的最热门物品之间具有较高的相似度,这样很可能会给喜欢《算法导论》的同学推荐《哈利波特》,显然,这不科学!要避免这种情况就得从物品的内容数据入手了,后文提到的内容过滤算法就是其中一种。

除了协同过滤算法,还有隐语义模型(LFM)应用得也比较多,它基于用户行为对物品进行自动聚类,从而将物品按照多个维度,多个粒度分门别类。然后根据用户喜欢的物品类别进行推荐。这种基于机器学习的方法在很多指标上优于协同过滤,但性能上不太给力,一般可以先通过其他算法得出推荐列表,再由LFM进行优化。

2.利用用户标签数据 

我们知道很多网站在处理物品条目的时候会通过用户自己标注的标签来进行分类,比如网页书签Delicious,博客的标签云,豆瓣书影音的标签。这些标签本身就是用户对物品的一种聚类,以此作为推荐系统的依据还是很有效的。

关于标签的推荐,一种是根据用户打标签的行为为其推荐物品,还有一种是在用户给物品打标签的时候为其推荐合适的标签。

根据标签推荐物品的基本思想就是找到用户常用的一些标签,然后找到具有这些标签的热门物品,将其推荐给用户。这里要注意两个问题,一个是要保证新颖性和多样性,可以用TF-IDF方法来降低热门物品的权重;另一个则是需要清除某些同义重复标签和没有意义的标签。

在用户打标签时为其推荐标签也是相当重要的,一方面能方便用户输入标签,一方面能提高标签质量,减少冗余。典型的应用场景就是用豆瓣标记书影音。这里的思想就是将当前物品上最热门的标签和用户自己最常用的标签综合在一起推荐给用户。其实豆瓣就是这么做的,它在用户标记物品的时候,给用户推荐的标签就分为「我的标签」和「常用标签」两类,而在「我的标签」里也考虑了物品的因素。

基于标签的推荐有很多优点,一方面可以给用户提供比较准确的推荐理由;另一方面标签云的形式也提高了推荐的多样性,给了用户一定的自主选择。标签其实可以看做一种物品的内容数据,比如书的作者,出版社,类型;音乐的国别,风格,作者等等,基于这些信息的推荐可以弥补上述基于用户行为推荐的一些弱点。

3.利用上下文信息

此处所谓的上下文,是指用户所处的时间,地点,心情等。这些因素对于推荐也是至关重要的,比如听歌的心情,商品的季节性等等。

这里主要以时间为例说说,在很多新闻资讯类网站中,时效性是很重要的一点,你要推荐一篇一年前的新闻给用户,估计会被骂死。在这种推荐中就需要加入时间衰减因子,对于越久之前的物品,赋予越小的权重。同样的思想也可以用在基于用户行为的推荐中,这里有很多可以优化的地方。对于ItemCF来说,同一用户在间隔很短的时间内喜欢的不同物品可以给予更高的相似度,而在找相似物品时也可以着重考虑用户最近喜欢的物品;对于UserCF,如果两个用户同时喜欢了相同的物品,那么可以给予这两个用户更高的相似度,而在推荐物品时,也可着重推荐口味相近的用户最近喜欢的物品。我们可以给相似度和用户的行为赋予一定权重,时间间隔越久权重越低,经过这种改进的「协同过滤算法」往往能得到用户更满意的结果。

类似的,在LBS成为应用标配的今天,可以根据物品与用户的距离赋予相应的权重,再综合其他因素得到靠谱的地点推荐。

4.利用社交网络数据

如今以Facebook,Twitter为首的社交网络大行其道,而其中的海量数据也是一大宝库。实验证明,由于信任的作用,来自好友的推荐往往能获取更高的点击率,鉴于此,亚马逊就利用了Facebook的信息给用户推荐好友喜欢的商品。此种推荐类似于UserCF,只是寻找用户之间的关系时除了兴趣相似度以外还得考虑熟悉度(如共同好友个数),这样一来,你的闺蜜们和基友们喜欢的物品很可能就会被推荐给你。

在社交网络内部也有许多推荐算法的应用。其中最重要的当属好友推荐,可依据的数据有很多:人口统计学属性(例如人人的找同学),共同兴趣(如Twitter中转发的信息),好友关系(共同好友数量,N度人脉)。另外还有信息流(Timeline)推荐,这其中以Facebook的EdgeRank为代表,大致思想就是:如果一个会话(Feed)被你熟悉的好友最近产生过重要的行为,它在信息流的排序中就会有比较高的权重。另外,基于社交网络兴趣图谱和社会图谱的精准广告投放也是推荐系统的关键应用,它决定着社交网站的变现能力

推荐系统的冷启动问题

介绍了这么多类的推荐系统,最后说说推荐系统的一个主要问题:冷启动问题。具体分三种情况:如何给新用户做个性化推荐,如何将新物品推荐给用户,新网站在数据稀少的情况下如何做个性化推荐。

对此也有相应的解决方案。对于新用户,首先可以根据其注册信息进行粗粒度的推荐,如年龄,性别,爱好等。另外也可以在新用户注册后为其提供一些内容,让他们反馈对这些内容的兴趣,再根据这些数据来进行推荐。这些内容需要同时满足热门和多样的要求。而对于新物品的推荐,可能就要从其内容数据上下功夫了。我们可以通过语义分析对物品抽取关键词并赋予权重,这种内容特征类似一个向量,通过向量之间的余弦相似度便可得出物品之间的相似度,从而进行推荐。这种内容过滤算法在物品(内容)更新较快的服务中得到大量应用,如新闻资讯类的个性化推荐。

而在网站初建,数据不够多的情况下,可能就要先通过人工的力量来建立早期的推荐系统了。简单一点的,人工编辑热门榜单,高级一点的,人工分类标注。国外的个性化音乐电台Pandora就雇了一批懂计算机的音乐人来给大量音乐进行多维度标注,称之为音乐基因。有了这些初始数据,就可以方便地进行推荐了。国内的Jing.fm初期也是通过对音乐的物理信息,情感信息,社会信息进行人工分类,而后再通过机器学习和推荐算法不断完善,打造出了不一样的个性化电台。

除了这些,利用社交网络平台已有的大量数据也是一个不错的方法,尤其是那些依托于其他SNS账号系统的服务。

算法vs人

有很多人怀疑推荐系统是否会让一个人关注的东西越来越局限,但看完这些你会觉得并非如此,多样性,新颖性和惊喜度也都是考察推荐系统的要素。而至于算法和人究竟哪个更重要的争论,我很赞同唐茶创始人李如一的一个观点:

在技术社群的讨论里,大家默认觉得让推荐算法变得更聪明、让软件变得更「智能」一定是好事。但人不能那么懒的。连「发现自己可能感兴趣的内容」这件事都要交给机器做吗?不要觉得我是Luddite。真正的技术主义者永远会把人放到第一位。

我想补充的是,算法虽然不能解决全部问题,但算法可以变得更人性化。套用某人「网络就是社会」的论断,其实算法和人之间早已不那么泾渭分明了。

 

 

 

推荐系统开源软件汇总

我收集和整理的目前互联网上所能找到的知名开源推荐系统(open source project for recommendation system),并附上了个人的一些简单点评(未必全面准确),
这方面的中文资料很少见,希望对国内的朋友了解掌握推荐系统有帮助
 
陈运文
 
 SVDFeature
由上海交大的同学开发的,C++语言,代码质量很高 。去年我们参加KDD竞赛时用过,非常好用,而且出自咱们国人之手,所以置顶推荐!
 
SVDFeature包含一个很灵活的Matrix Factorization推荐框架,能方便的实现SVD、SVD++等方法, 是单模型推荐算法中精度最高的一种。SVDFeature代码精炼,可以用相对较少的内存实现较大规模的单机版矩阵分解运算。
 
另外含有Logistic regression的model,可以很方便的用来进行ensemble运算
 
 
 
 
Crab
项目地址:
 
 
系统的Tutorial可以看这里:
 
Crab是基于Python开发的开源推荐软件,其中实现有item和user的协同过滤。据说更多算法还在开发中,
Crab的python代码看上去很清晰明了,适合一读
 
CofiRank
C++开发的 Collaborative Filtering算法的开源推荐系统,但似乎2009年后作者就没有更新了,
CofiRank依赖boost库,联编会比较麻烦。不是特别推荐
项目地址:
 
 
 
EasyRec
Java开发的推荐系统,感觉更像一个完整的推荐产品,包括了数据录入模块、管理模块、推荐挖掘、离线分析等,整个系统比较完备。
项目地址:
 
 
 
 GraphLab
项目地址:
Graphlab是基于C++开发的一个高性能分布式graph处理挖掘系统,特点是对迭代的并行计算处理能力强(这方面是hadoop的弱项),
由于功能独到,GraphLab在业界名声很响
用GraphLab来进行大数据量的random walk或graph-based的推荐算法非常有效。
Graphlab虽然名气比较响亮(CMU开发),但是对一般数据量的应用来说可能还用不上
 
 
Lenskit
这个Java开发的开源推荐系统,来自美国的明尼苏达大学,也是推荐领域知名的测试数据集Movielens的作者,
他们的推荐系统团队,在学术圈内的影响力很大,很多新的学术思想会放到这里
 
 
Mahout
网址
Mahout知名度很高,是Apache基金资助的重要项目,在国内流传很广,并已经有一些中文相关书籍了。注意Mahout是一个分布式机器学习算法的集合,协同过滤只是其中的一部分。除了被称为Taste的分布式协同过滤的实现(Hadoop-based,另有pure Java版本),Mahout里还有其他常见的机器学习算法的分布式实现方案。
 
另外Mahout的作者之一Sean Owen基于Mahout开发了一个试验性质的推荐系统,称为Myrrix, 可以看这里:
http://myrrix.com/quick-start/ 
 
 
MyMediaLite
基于.NET框架的C#开发(也有Java版本),作者基本来自德国、英国等欧洲的一些高校。
除了提供了常见场景的推荐算法,MyMediaLite也有Social Matrix Factorization这样独特的功能
尽管是.Net框架,但也提供了Python、Ruby等脚本语言的调用API
MyMediaLite的作者之一Lars Schmidt在2012年KDD会议上专门介绍过他们系统的一些情况,可惜由于.Net开发框架日渐式微,MyMediaLite对Windows NT Server的系统吸引力大些,LAMP网站用得很少
 
 
LibFM
项目网址:
作者是德国Konstanz University的Steffen Rendle,去年KDD Cup竞赛上我们的老对手,他用LibFM同时玩转Track1和Track2两个子竞赛单元,都取得了很好的成绩,说明LibFM是非常管用的利器(虽然在Track1上被我们打败了,hiahia)
顾名思义,LibFM是专门用于矩阵分解的利器,尤其是其中实现了MCMC(Markov Chain Monte Carlo)优化算法,比常见的SGD(随即梯度下降)优化方法精度要高(当然也会慢一些)
 
顺便八卦下,去年KDD会议上和Steffen当面聊过,他很腼腆而且喜欢偷笑,呵呵挺可爱。
 
LibMF
项目地址:
http://www.csie.ntu.edu.tw/~cjlin/libmf/
注意LibMF和上面的LibFM是两个不同的开源项目。这个LibMF的作者是大名鼎鼎的台湾国立大学,他们在机器学习领域享有盛名,近年连续多届KDD Cup竞赛上均获得优异成绩,并曾连续多年获得冠军。台湾大学的风格非常务实,业界常用的LibSVM, Liblinear等都是他们开发的,开源代码的效率和质量都非常高
 
LibMF在矩阵分解的并行化方面作出了很好的贡献,针对SDG优化方法在并行计算中存在的locking problem和memory discontinuity问题,提出了一种矩阵分解的高效算法,根据计算节点的个数来划分评分矩阵block,并分配计算节点。系统介绍可以见这篇论文(Recsys 2013的 Best paper Award)
Y. Zhuang, W.-S. Chin, Y.-C. Juan, and C.-J. Lin. A Fast Parallel SGD for Matrix Factorization in Shared Memory Systems. Proceedings of ACM Recommender Systems 2013.
 
PREA
全名是 Personalized Recommendation Algorithms Toolkit, 开发语言为Java。也是一个轻量级的开源项目
项目网址:
 
放在Mloss这个大project下。我个人感觉PREA还是比较简陋的,参加开发的三位工程师Joonseok Lee, Mingxuan Sun, Guy Lebanon更新频率很低,提供的资料也少。
 
不过Mloss下倒是能找到其他一些推荐开源项目
 
 
Python-recsys
一个非常轻量级的开源推荐系统,python开发,作者似乎只有一位,
Python-recsys主要实现了SVD、Neighborhood SVD推荐算法,
这个项目麻雀虽小五脏俱全,评估数据(Movielens,Last.fm)、评估框架也都有
API也很简单清晰,代码简洁,属于推荐入门的良好教材。
不过真正要用到实际系统中,还是得补充很多内容
 
github的地址位于
 
项目的介绍见:
 
RapidMiner
项目网址为:
Java语言开发,RapidMiner(前身是Yale)已经是一个比较成熟的数据挖掘解决方案了,包括常见的机器学习、NLP、推荐、预测等方法(推荐只占其中很小一部分),而且带有GUI的数据分析环境,数据ETL、预处理、可视化、评估、部署等整套系统都有。
 
另外RapidMiner提供commercial license,提供R语言接口,感觉在向着一个商用的数据挖掘公司的方向在前进。
 
 
 
Recommendable
基于Ruby语言开发,实现了一些评分预测的推荐算法,但是整体感觉比较单薄,
github上地址如下:
 
 
Recommenderlab
基于R语言开发的开源推荐程序,对经常使用R语言的工程师或者BI数据分析师来说,recommenderlab的出现绝对算得上是福音了
项目地址:
 
 
基于Recommenderlab来开发推荐系统,代码会非常精简,因为推荐系统所依赖的user-item rating matrix对擅长处理向量运算的R语言来说再方便不过了,
但是在实际推荐系统中,需要考虑的问题和逻辑都比较复杂,用Recommenderlab不是很灵活。另外受限于R语言对内存的限制,Recommenderlab不太适用于过大规模的推荐应用
 
 
Waffles
SF地址:
Waffles英文原意是蜂蜜甜饼(见logo),在这里却指代一个非常强大的机器学习的开源工具包,基于C++语言开发。
Waffles里包含的算法特别多,涉及机器学习的方方面面,推荐系统位于其中的Waffles_recommend tool,大概只占整个Waffles的1/10的内容(其它还有分类、聚类、采样、降维、数据可视化、音频处理等许许多多工具包,估计能与之媲美的也就数Weka了)
 

 

 

 

 

 

 

posted on 2016-07-27 22:37  xxxxxxxx1x2xxxxxxx  阅读(1409)  评论(0编辑  收藏  举报