第一年接触数据挖掘和机器学习,然后在博士师兄的讨论下确定了推荐系统的学习方向,这篇算是对一年的学习进行的总结,其中用户-物品的算法主要是参考项亮老师的那本书,One Class CF主要是Yang Qiang 老师的那篇论文的理解,Slope One 也是一些见解,同时加上了北邮林德军学长的一篇论文中非常好的地方,内容都很基本。
推荐系统研究早在20世纪90年代就被提出,但是真正受到学术界和工业界的关注反而是在最近几年,电子商务网站的兴起与所谓的BIG DATA时代的到来,给推荐系统这一方向提供了极好的发展平台,最近几年学术界的关于推荐算法的文章喷涌而出,都在强调自己的算法是如何的精确与高效。各大电子商务网站均有自己的推荐系统部门。然而推荐系统的核心在于推荐算法,也是推荐系统的灵魂,本文主要针对现今经典的推荐算法进行总结和评价。
2、推荐系统
(1)推荐系统概述
互联网时代的快速发展,大量的信息系统、资源、网站的建设,使得人们在享受快速的信息获取方式的同时,却又产生了如何高效准确的去获取自己所需要的信息的困惑。于是便出现了搜索引擎,最著名的便是美国的谷歌搜索了,搜索引擎在解决信息过载的问题上是跨时代的,到目前为止仍是不可替代的。但是它并不具有个性化搜索的功能,它对于相同的关键词,其搜索结果是相同的;同时在电子商务网站,搜索引擎并不能给用户带来有效的购买建议;最后,由于商业竞价排名的影响,搜索引擎的结果并非是最合适用户的信息。
于是便催生了个性化系统的发展,即推荐系统。所谓个性化,便是对不同的用户系统能够做出不同的用户反馈。即在相同的电子商务网站,得到的确实不尽相同的网站页面。推荐系统主要根据用户在网站产生的行为,例如浏览、评分、点赞等等,通过建立模型将用户可能感兴趣的信息推荐给用户。虽然目前的发展其实还未达到真正的个性化,即每个人都是独立的模型,但是在当前技术条件下,也基本满足了个性化的需求。
推荐系统的定义有很多,可能不同行业的研究者对此有不同的理解,但总体的核心都是利用用户产生的行为对用户进行分析建模,为用户提供信息和建议。推荐系统的核心在于推荐算法,在最近几年,学术界关于推荐算法的论文非常多,但总体都是在经典的协同过滤算法进行改进,本文主要对经典的算法进行综述与评价。
一般来说,推荐系统的作用可以概括为以下几点:
1)提高服务质量,帮助用户快速检索信息。
推荐系统可以挖掘用户兴趣,可以让用户迅速找到自己想要的商品或者产生明确的购买倾向。
2)促进用户购买欲,提高销售能力。
用户在购物时,推荐系统能够有针对性的向用户提供高质量的推荐商品,可以有效促进用户的购买欲,进而可以提高电子商务网的销售能力。
3)提供个性化的服务。
用户在电子商务系统中购物时,推荐系统做出的推荐都是针对每一个用户的,而不是大众,推荐系统提供的服务让用户感觉此时推荐系统完全在为其一个人工作,提供一对一的服务。
4)提高用户忠诚度
在电子商务中,通过推荐系统提供的高效商品推荐,用户能够轻松的购买到自己满意的商品,无疑会继续吸引用户下次继续选择该网站,使得用户更加依赖于此电子商务,提高了对网站的忠诚度。
(2)推荐系统结构
推荐系统的完整框架主要是由用户交互接口、个性化推荐引擎、用户兴趣模型表示、推荐引擎、数据仓库、操作数据库等构成。
从总体层次结构看,推荐系统一般分为:信息输入模块、推荐系统生成模块、推荐输出模块。
(3)推荐结果的评价指标
任何推荐算法都要通过评测,才能评估它的推荐质量。推荐系统评测的问题吸引了很多研究人员的研究,常用的推荐评测指标有:准确度(accuracy),覆盖度(coverage),多样性(diversity),新颖性(novelty),惊喜度(serendipity)等等。下面将详细讨论这些评测指标。
l 准确度
准确度是推荐系统里最常用的指标,在预测评分的系统和Top-N的推荐系统中有不同的准确度度量方法。在评分预测的问题中,我们常用平均绝对误差(MAE)或者均方误差(RMSE)来评测评分预测的准确度:
这里,是测试集。是算法预测的用户对物品的打分,是数据集中用户对的实际打分。早期的推荐系统研究中多用MAE作为评测指标,但自从Netflix大奖赛中研究者们用RMSE作为评测指标后,RMSE逐渐成为评分预测问题中预测准确度的主要评测指标。
Top-N推荐问题和评分预测问题不同,他的目的是对每一个用户,通过分析他们的历史行为,给他们推荐N个他们最可能会喜欢的物品。给定一个推荐算法,对于用户,令是算法的推荐列表,是测试集中用户喜欢的物品集合,此时可以通过准确率(Precision)和召回率(Recall)来对量推荐的精度:
上面所述的方法都是离线评测方法。此外还可以在线评测推荐系统的准确度。最多的评测指标是点击率,即有多大比例的用户看到推荐结果后点击了推荐结果。此外,有些推荐系统设有反馈机制,让用户直接对推荐结果表示喜欢或者不喜欢,利用这些反馈数据,也可以度量推荐系统的准确度,比如可以用有百分之多少的用户表示喜欢来度量推荐的准确度。
l 覆盖度
推荐系统的一个重要任务是解决长尾的问题,即如何将长尾中的物品推荐为喜欢它们的用户。一个好的推荐系统应该不仅给用户推荐他们满意的物品,而且应该能够让高质量的物品出现在用户的推荐列表中。推荐系统的覆盖度度量了推荐系统能把多大比例的物品推送给至少一个用户。如果令是推荐系统给用户的推荐列表,那么推荐系统的覆盖率定义为:
其中,是用户集合,是物品集合。从上面的定义可以看到覆盖度介于(0,1]之间。覆盖度越大的推荐系统能够更好的发掘长尾。此外,准确度和覆盖度之间并没有直接的联系,准确度高等的推荐并不一定有高的覆盖度。比如考虑两种推荐算法,算法A给所有用户都推荐N个最热门的物品,算法B给用户随机推荐物品。算法A的准确度高于算法B,但算法A的覆盖度确实所有推荐算法中最低的,因为它给所有用户的推荐结果相同,所以它的覆盖度是。
l 多样性
多样性过低的推荐结果会影响用户的体验。比如,对于一个武侠迷,仅仅给他推荐金庸的小说,虽然准确度并不低,但多样性却比较低,不如给他推荐不同武侠小说家的经典作品,这样可以兼顾准确度和多样性。很多研究表明,传统的协同过滤算法以及内容过滤算法的推荐结果的多样性都是偏低的。因此,很多研究人员提出了很多提高推荐结果多样性的算法。
令是给用户u的推荐列表,那么推荐列表的多样性,是通过这个列表中物品两两之间的相似性来描述的。即如果一个推荐列表中的物品两两之间越不相似,那么这个推荐列表的多样性越高。给定两个物品,令为它们的相似度,越大,表示这两个物品越相似。从而,的多样性定义为:
这里,是推荐列表的长度。而整个推荐系统的多样性定义为:
从上面的定义可以看到,推荐结果的多样性定义依赖于物品相似度函数的定义。不同的相似度度量可以定义出不同的多样性,比如内容相似度可以定义为内容多样性。
l 新颖度和惊喜度
新颖性和惊喜度是最近两年推荐系统领域比较关注的指标。新颖度的目的是度量推荐列表中物品对于用户的新颖程度。很多准确度高的推荐结果往往不具有高的新颖度。比如,给一位研究数据挖掘的科学家推荐一本数据挖掘入门的书,虽然这本书符合这位用户的兴趣,但是对这位用户却没有新颖度,因为他有很大的可能已经看过这本书了。因此,新颖的推荐目的是希望推荐给用户那些他们没有听说过的物品。而惊喜度则更进一步,它的目的是推荐那些让用户感到出乎意料却又特别喜欢的物品。因此,某种程度上,惊喜度同时考虑了新颖性和准确度。
目前还没有离线计算这两个指标的方法。所有关于这两个指标的评测都是通过做用户调查(User Study),即让用户直接对推荐结果的新颖性和惊喜度进行评分来获得相关的评测指标。
3、协同过滤推荐算法综述
协同过滤(Collaborative Filtering)推荐算法是推荐系统中最经典也是目前工业界应用最多的算法。从研究的角度,人们探索此类型的系统已经很多年了,在不断改进和创新下,协同过滤成为推荐系统中无法替代的一种算法。
按照算法针对的对象的不同,协同过滤推荐算法分为基于内存的协同过滤推荐算法(Memory-based Collaborative Filtering)和基于模型的协同过滤推荐算法(Model-based Collaborative Filtering)。其中,基于内存的推荐分为基于用户的推荐和基于项目的推荐。基于模型的推荐分为SVD分解推荐、概率潜语义模型和LDA推荐,还包括贝叶斯网络模型,聚类模型,极大熵模型,线性回归模型,图模型。本文主要介绍基于内存的推荐。
基于内存的协同过滤推荐算法一般都需要将用户的历史信息存入内存,然后在推荐时实时分析内存中的用户历史信息完成推荐任务。GroupLens小组在1994年的CSCW国际会议中提出的基于用户的协同过滤推荐算法(User-based Collaborative Filtering,简称UserCF)是一种经典的基于内存的协同过滤推荐算法。该算法认为一个用户会喜欢和他有相似兴趣爱好的用户喜欢的物品。因此,要对一个用户做推荐,首先得找到和他兴趣爱好相似的用户。在UserCF中,两个用户兴趣爱好相似是因为他们喜欢相似的物品。这种相似性通过用户相似度进行衡量。衡量两个用户的相似度主要有两种思路:一种认为对于给定用户、,若他们对于任意物品总是给出相似的评分,则认为这两个用户相似,这种方法被称为Correlation相似度方法;另一种则认为如果用户、总是对相同的物品进行浏览、评价等行为,则这两个用户相似,这种方法被称为Relevance相似度方法。下面我们将列举集中典型的衡量用户相似度的方法:
1)余弦相似度(Cosine)是一种典型的Correlation相似度方法。它将用户的历史评分信息看做是为维向量,即使用分别表示用户和用户的历史评分信息。其中向量的第个元素是该用户对第个物品的评分值,未评分物品用0代替。用户和用户的余弦相似度可以用两个向量的夹角余弦表示,即:
(3.1)
其中,是用户对物品的评分值,是用户和用户共同评分的物品集合。
2)皮尔逊相似度(Pearson Correlation)亦是一种典型的Correlation相似度方法。它是自然科学领域中广泛用于度量两个变量间线性相关程度的方法之一。在UserCF中,它可以有效描述两个用户在若干个物品上评分变量趋势的一致程度。其计算方法如公式(4.2)所示:
(3.2)
其中,是用户对物品的平均评分值。
3)Jaccard相似度是一种典型的Relevance相似度方法。它通过计算用户和用户评分的物品集合的相似度衡量两个用户之间的相似度,两个用户共同评分的物品越多则他们越相似,其计算方法为:
(3.3)
利用计算所得的用户相似度,UserCF为待推荐用户寻找近邻,以便利用近邻行为预测当前用户的行为。近邻搜索是UserCF算法的核心内容之一,其效率和质量直接影响推荐算法的有效性。近邻搜索往往需要为当前用户寻找K个最相似的用户,因此,亦被称为K近邻方法(K-Nearest Neighbors,简称KNN).
在确定了用户u的近邻集合后,UserCF利用这些近邻的评分信息,将其进行加权平均,预测用户u对未评分物品的评分值。其计算方法如下式:
(3.4)
其中,为用户和用户的相似度,为用户的近邻集合。在Top-N推荐中,UserCF通过预测用户对物品的评分值信息,对用户未评分物品进行排序,并将预测评分值较高的前N个物品推荐给用户。
和基于用户的协同过滤推荐算法不同,基于物品的协同过滤推荐算法(Item-based Collaborative Filtering,简称ItemCF)认为用户会喜欢和他之前喜欢的物品相似的物品。因此,ItemCF首先从用户历史行为信息中获取用户喜欢的物品,然后利用物品相似度信息寻找和这些物品相似的物品,并将其推荐为用户。ItemCF的核心是计算物品的相似度。与UserCF的思想类似,ItemCF中物品相似度计算方法与UserCF中的用户相似度计算方法类似,只是计算相似度的目标对象变为物品,并相应的利用不同用户对同一物品的评分向量作为数据来源,其计算细节在此不再赘述。ItemCF利用物品相似度为目标物品寻找最近邻,依据最近邻的评分信息预测用户对目标物品的评分,并依此进行推荐。ItemCF的评分预测方法如公式(3.5)所示:
(3.5)
其中,是所有用户对物品的平均评分,是物品的近邻产品集合,是物品和物品的相似度。
UserCF和ItemCF是两种典型的基于内存的协同过滤推荐算法。对比两者,UserCF主要利用和用户兴趣相似的用户群体的行为信息进行推荐,它的推荐结果较为社会化;而ItemCF是向用户推荐与其自身历史兴趣相关的物品,它的推荐结果更加个性化。因此,这两种方法分别使用与需要较社会化或者较个性化推荐结果的应用环境。此外,UserCF和ItemCF分别需维护一个用户或物品的相似度矩阵,从技术实现的角度,两者分别适用于用户或物品的相似度较为稳定的环境。在电子商务、在线视频网站等推荐系统应用广泛的平台中,物品相似性相对稳定,因此,ItemCF应用也较为广泛。ItemCF还有一个特点是可以进行推荐解释。有研究表明,好的推荐解释可以有效提高用户对推荐结果的接受程度。
(3) One-Class 协同过滤
在许多推荐环境下,我们收集到的数据往往只是用户喜欢的物品的记录,即只有用户正向选择行为的记录,如用户的浏览记录,收藏网页记录等等,这类问题即为One Class 问题,即单类问题。这类数据在平常数据中非常常见,数据获得比较容易,但是难以解释。例如我们用0-1矩阵来表示这类问题,1的解释即为用户喜欢该物品,但是0却有两种原因来解释:一是用户没有看到该商品,但是用户喜欢;二是用户已经浏览过了但是不感兴趣。
这类one class数据存在两种问题:一是在训练时,由于只存在正样本,缺少负样本对训练数据的平衡,导致训练结果对所有缺失指的预测都是正向的,结果没有区分性;二是由于one-class 问题的数据通常反映的是用户日常的行为记录,所形成的矩阵相对于评分数据更为稀疏,这是在处理该类问题时非常棘手的地方。因此,对于one-class数据来说,如何准确的对原始数据添加适量的正负样本是非常重要的问题。在这里主要说明的是one-class协同过滤的基本原理和如何构造负样本的方法。
1、基本方法
One-Class协同过滤的核心思想就是我们如何去构造负样本(以下均用OCCF表示),主要是两种方法:
(1) AMAN
AMAU即所有缺失数据都看作负样本(All Missing As Negative ),这是最自然的一种方法,但是也是相对性能最差的一种方法。在进行推荐过程中,这类方法的缺陷有:一,由于missing value非常多,造成数据规模非常大,本来评分数据集的稀疏性就很大,导致复杂度更高,很难进行实验工作;二,将所有的missing value作为负样本时,又会导致负样本过多,远多于正样本,造成正负样本的不均衡,这对学习算法的效果也很差;三,Missing value中还有很多的正样本,这样的处理会造成误分的误差,给推荐精度造成更大的影响。虽说这类算法太过于粗糙,但是是一种很好的基线算法。
(2) Sampling Scheme
上一个方法已经说明的AMAU最大问题就是负样本太多了,造成复杂度太高。所以我们的改进的方法就是从Missing value中抽样出一个和正样本差不多大的集合作为负样本。提出这种想法后就自然产生如何抽样提高算法质量的想法。现今比较传统的方法有以下三种:
I Uniform Random Sampling
即均匀随机抽样,把所有的缺失数据看作负样本,以相同的概率进行抽样。
II User-Oriented Samping
即偏重用户抽样,基本定义是如果一个用户对很多物品产生了行为,那么他没有产生行为的物品将会以更高的概率选作负样本。也就是偏重活跃度高的用户的行为来进行抽样。
III Item-Oriented Sampling
即偏重物品抽样,基本定义是如果一个物品只是被少数的用户产生了行为,那么还没有对这些物品产生行为的用户也不会再去产生行为了。也就是偏重活跃度低的物品进行抽样选作负样本。
4、Slope One协同过滤
Slpoe One算法是一种基于评分的预测算法,主要应用在对物品评分的推荐系统。基本思想是利用用户对一组物品的评分偏差和目标用户对某些物品的评分,预测目标用户对目标物品的评分。Slope One算法不需要计算物品之间的相似度,,使用最基础的线性回归模型对物品评分进行预测,具有计算更快,可拓展性更好,对数据稀疏性更加适应等优点。
举个简单的例子,如下表有a,b,c三个用户,其中a,b,c均对物品1进行了评分,a,b对物品2进行了评分,要预测c对物品2的评分。
用户 |
物品1 |
物品2 |
a |
4 |
3 |
b |
5 |
4 |
c |
4 |
? |
则根据Slope One算法,预测评分为:4-((4-3)+(5-4))/2=3。预测模型采用的为的形式,参数b为用户对其他物品评分的平均偏差。Slope One算法的思想理念在于考虑到用户对相同物品评分的差异性,比如用户A的评分都比较高,即使不太好的物品也能有评分到4,而用户B的评分比较苛刻,即便满意的物品也只能打4分,因此在面对这种差异时,Slope One算法尽可能的去减少这种差异带来的评分误差。
Slope One算法一般有两种常用的实现方式:
l Weighted Slope One 算法
l Bi-Polar Slope One 算法
本节主要介绍这两种基本算法。
(1) Weighted Slope One 算法
在实际的推荐系统应用中,用户评分过的物品数一般都会大于2,为了均衡每个物品对目标的影响,因此就有了加权Slope One的算法,这也是非常传统的统计思想的做法。
定义为用户对物品的评分,表示用户所有的已经评分的物品的集合,表示对物品有评分的用户的集合。为物品和物品都有评分的用户集合,表示集合中所包含的元素数目。则物品和物品的评分偏差为:
最后,根据Weighted Slope One算法计算目标用户对目标物品的预测评分:
仔细分析这一算法,我们会发现这种算法缺少对用户之间的相关性,然而我们推荐系统的核心思想就是想研究相似用户的相关程度来得出更多的信息,因而这是此种算法存在的一个很大的缺陷,在应用中缺少更人性化的思想。我们用一个例子来说明:同样三个用户a,b,c对以下的物品进行的评分:
USER |
Item1 |
Item2 |
Item3 |
Item4 |
a |
? |
5 |
\ |
1 |
b |
3 |
1 |
4 |
\ |
c |
2 |
4 |
3 |
\ |
要求预测用户a对Item1的评分。
通过上述的算法公式,得到预测值为5,但是可以明显的发现用户b和用户a的偏好是有很大差异的,如果按此来进行推荐的话,会造成很大的误差。而Bi-Polar Slope One 算法便在处理该类问题有较好的效果。
(2) Bi-Polar Slope One 算法
Bi-Polar Slope One 算法的基本原理是根据用户对物品的评分,将物品集合分为用户喜欢的和用户不喜欢的,分别获得目标物品与它们之间的评分偏差和。这种算法思想即为Bi-Polar(两极)Slope one,以分两极做为惩罚来降低误差。
定义为用户对其已经评分物品的平均评分,则有:
则表示喜欢物品i,j的用户的集合,表示为不喜欢物品i,j的用户的集合。
定义和分别表示集合和所包含的元素数目。然后则得到目标物品和用户偏爱物品的评分差值为:
同时,我们可以得到目标物品和用户不喜欢的物品的评分偏差
最后得到的预测的结果为:
深入分析发现,这种两极Slope One算法也有其缺陷,在用户对物品的评分比较均匀时,即和均在平均评分的附近时,该算法得到的结果波动性会很大,因而Bi-Polar Slope One算法在将物品集合分极的做法过于粗糙。
(3) 算法评价
优点:
² 易于实现和维护:即算法很容易实现不复杂,流程简单,不用调用过多的模块,影响系统的可维护性
² 增量算法:即尽量解决冷启动中新的评分不能及时得到利用的问题,使得新的用户评分可以很快得对推荐结果产生影响,能够及时得获取用户新的需求,并给出相应的推荐结果;
² 能为新用户提供推荐服务:即当用户的评分数据很少时,也能够提供高质量的推荐结果;
² 高效率的查询响应:即基于该算法实现的推荐系统运行速度快,能够即时的响应用户请求;
² 合理的准确性:Slope One算法的推荐精度要优于传统的协同过滤算法。
缺点:
通过Slope One算法两种常用的实现方式Weighted SlopeOne和Bi-Polar Slope One分析比较可以发现,Slope One算法在计算过程没有考虑到相似度问题忽略了推荐系统真正的核心思想。有研宄表明,相较于传统的协同过滤算法,Slope One算法在数据稠密的情况下,有着最好的推荐精度,但是当数据变得比较稀疏时,Slope One算法表现的并不优秀。因此,Slope One算法主要有以下三个方面的缺陷:
v 没有考虑用户之间的相似性;
v 没有考虑项目之间的相似性;
v 在数据稀疏的情况下,推荐效果不如传统协同过滤算法好。
总结
协同过滤作为最经典也是最有效的推荐算法,在推荐系统中始终占据着核心地位。我所理解的协同过滤从两个方面来看:一是“协同”——Collaborative,我们知道推荐主要围绕着用户和物品来进行数据的收集,整理,建模,分析再到最后的推荐,这是用户与用户的协作,用户与物品的协作,也是物品之间的协作,而我们在做推荐算法时,也一直以此为核心思想,围绕着进行算法的创新与改良。二是“过滤”——Filtering,我们数据建模分析需要进行清理,作出推荐时同样是要过滤掉不好的,留下最高效的推荐内容。这是我所理解的协同过滤,它的思想指导着我们该如何去设计推荐和进行算法的改进。
推荐系统又称作个性化系统,其实在一定程度上,我们目前的推荐都是在对某一群体的建模推荐,并不能做到真正的个性化,然而每个人都是独一无二的,要想做到完全的个性化推荐还有很长的路要走,当然我想这应该是推荐系统以后发展的目标,让每一个用户拥有最个性的推荐模型。