推荐系统

推荐系统

1 什么是推荐系统

如果一个用户有明确的需求,比如想买一包花生米,那么他可以去便利店根据分类牌找到自己的喜欢牌子的花生米,或者在淘宝上利用搜索引擎直接寻找。但是,如果用户没有明确的需求时,比如说,你今天很无聊,想下载一部电影看看。但是当你打开某个下载网站时,面对100年来发行的数不胜数的电影,你会手足无措,不知道该看哪一部。此时,你遇到了信息过载的问题,需要一个工具来帮助你做筛选,它可以分析你的历史兴趣,从庞大的电影库中找到几部符合你兴趣的电影供你选择。这个工具就是推荐系统。

随着信息技术和互联网的发展,人们逐渐从信息匮乏的时代走入了信息过载的时代。在这个时代,无论是信息消费者还是信息生产者都遇到了很大的挑战:对于信息消费者,从大量信息中找到自己感兴趣的信息是一件非常困难的事情;对于信息生产者,让自己生产的信息脱颖而出,受到广大用户的关注,也是一件非常困难的事情。推荐系统就是解决这一矛盾的主要工具。推荐系统的任务就是联系用户和信息,一方面帮助用户发现对自己有价值的信息,另一方面让信息能够展现在对它感兴趣的用户面前,从而实现信息消费者和信息生产者的双赢。


2 推荐算法

推荐算法一般分为基于内容(Content-based)、协同过滤(Collaborative Filtering)和混合(Hybrid)推荐算法三种。

一、基于内容的推荐算法

1)基于内容(content-based)的推荐算法是指根据用户过去喜欢的物品(item),为用户推荐和他过去喜欢的物品相似的物品。

2)基于内容的推荐服从如下假设:对于特定的目标用户,在内容上与该用户以往感兴趣的商品相似的商品,用户将来很可能对这些商品仍感兴趣。

3)基本思想:通过分析用户已经购买或浏览过的商品内容,以及分享和评价的内容信息来建立或更新用户的兴趣配置文件,然后系统自动比较被推荐项目信息与用户配置文件之间的相似度,并直接向用户推荐与其配置文件相似度最高的项目,其核心是能够能到物品的准确描述。

4CB的过程一般分为以下三步:

Item Representation(商品表达):对商品做特征工程,通俗来说就是将商品的属性表达出来。比如:item=农夫山泉(品类:矿泉水;价格:1-5

Item一般都会有一些描述它的属性。这些属性通常可以分为两种:结构化(structured)和非结构化(unstructured)属性。所谓结构化属性就是可以被量化,可直接使用的属性,如人有性别、学历、地域等属性。而非结构化属性就是需要再进行二次解析,无法直接利用的属性,如人的购买记录,一篇文章的内容等。像文章这种非结构化数据可以利用TF-IDFword2vec等算法把文章中的关键词向量化表示出来。

如果用TF-IDF表示文章对应关键词的权重,那么可以得到以下矩阵:


Profile Learning(特征学习):利用一个用户过去喜欢的(以及不喜欢的)商品的特征数据来学习出此用户的喜好特征(profile)。比如:id=小明;喜欢=(农夫山泉,麦当劳);不喜欢=(可乐,鸡翅)

假设用户已经对一些item给出了他的喜好判断,喜欢其中的一部分item,不喜欢其中的另一部分。那么,这一步要做的就是通过用户过去的这些喜好判断,为他产生一个模型。有了这个模型,我们就可以根据此模型来判断用户是否会喜欢一个新的item。所以,我们要解决的是一个典型的有监督分类问题,理论上机器学习里的分类算法都可以照搬进这里。

简单地说,就是把用户所有浏览过的item分类,分成用户喜爱和不喜爱的两类,然后利用喜爱的这部分对用户进行建模。

下面我们简单介绍下CB里常用的一些学习算法:

1)最近邻方法(KNN

对于一个新的item,最近邻方法首先找用户已经评判过并与此新item最相似的kitem,然后依据用户对这kitem的喜好程度来判断其对此新item的喜好程度。这种做法和CF中的item-based KNN很相似,差别在于这里的item相似度是根据item的属性向量计算得到,而CF中是根据所有用户对item的评分计算得到。

对于这种方法,比较关键的可能就是如何通过item的属性向量计算item之间的两两相似度。建议对于结构化数据,相似度计算使用欧几里得距离;而如果使用向量空间模型来表示item的话,则相似度计算可以使用cosine

2)Rocchio算法

Rocchio算法是信息检索中处理相关反馈(RelevanceFeedback)的一个著名算法。比如你在搜索引擎里搜“苹果”,当你最开始搜这个词时,搜索引擎不知道你到底是要能吃的苹果,还是要不能吃的苹果,所以它往往会尽量呈现给你各种结果。当你看到这些结果后,你会点一些你觉得相关的结果(这就是所谓的相关反馈了)。然后如果你翻页查看第二页的结果时,搜索引擎可以通过你刚才给的相关反馈,修改你的查询向量取值,重新计算网页得分,把跟你刚才点击的结果相似的结果排前面。比如你最开始搜索“苹果”时,对应的查询向量是{“苹果”:1}。而当你点击了一些与MaciPhone相关的结果后,搜索引擎会把你的查询向量修改为{“苹果”:1,Mac: 0.8,iPhone:0.7},通过这个新的查询向量,搜索引擎就能比较明确地知道你要找的是不能吃的苹果了。Rocchio算法的作用就是用来修改你的查询向量的:{“苹果”: 1}--> {“苹果”: 1,Mac: 0.8,iPhone:0.7}

CB里,我们可以类似地使用Rocchio算法来获得用户的profile

假设用户(id)已经对一些item做出了喜欢的判断,对另一部分item做出了不喜欢的判断,且这些item我们已经有了对应的向量化表示,那么这就是用户的profile,如何计算用户的profile呢?公式如下:


其中x是用户喜欢的itema是喜欢item的总数,y是用户不喜欢的itemb是不喜欢item的总数。这时我们得到另一个用户矩阵:(当然这里不是协同过滤,无需把全部用户列成矩阵项,实际应用单个用户id即可)


3)决策树算法(DecisionTree,简称DT

item的属性较少而且是结构化属性时,决策树一般会是个好的选择。这种情况下决策树可以产生简单直观、容易让人理解的结果。而且我们可以把决策树的决策过程展示给用户,告诉他为什么这些item会被推荐。但是如果item的属性较多,且都来源于非结构化数据(如item是文章),那么决策树的效果可能并不会很好。

Recommendation Generation(推荐):通过比较上一步得到的用户的喜好特征与候选商品的特征,为此用户推荐一组相关性最大的商品。

 如果上一步Profile Learning中使用的是分类模型(如决策树、线性分类器和朴素贝叶斯模型等),那么我们只要把模型预测的用户最可能感兴趣的nitem作为推荐返回给用户即可。而如果Profile Learning中使用的直接学习用户属性的方法(如Rocchio算法),那么我们只要把与用户属性最相关的nitem作为推荐返回给用户即可。其中的用户属性与item属性的相关性可以使用如cosine等相似度度量获得。计算如下:

通过以上二步得到的所有item和所有用户的profile,那么要对一个用户的profile和所有item进行匹配,此时我们计算的方式一般用余弦相似度。

余弦相似度的计算方法如下,假设向量ab的坐标分别为(x1,y1)(x2,y2)


余弦值的范围在[-1,1]之间,值越趋近于1,代表两个向量的方向越接近;越趋近于-1,代表两个向量的方向越相反。公式如下:


5)基于内容的推荐算法举例:


对于个性化阅读来说,一个item就是一篇文章,第一步我们要提取文章中的关键词组来表示文章的主题,可以采用的方法例如TF-IDF找文章中词的权重,例如在python文章中“python”是主要被提及的字眼,那么该词是关键字,利用这种方法,我们就可以把文章向量化。第二步是找出用户之前喜欢的文章,通过上述TF-IDF方法,将其向量化,然后求平均值,来代表用户大致喜欢的文章。如果用户喜欢python语言,那么该用户的profile['python']的权重占比较大。第三步就是通过以上二步得到的所有item和该用户的profile进行匹配,计算方式一般用余弦相似度。

(6)优缺点

优点:

不需要其它用户的数据,没有冷启动问题和稀疏问题。即每个用户的profile都是依据他本身对item的喜好获得的,自然就与他人的行为无关。

能为具有特殊兴趣爱好的用户进行推荐。

能推荐新的或不是很流行的项目,没有新项目问题。新项目进入推荐系统后,基于内容的推荐方法为其提取特征,进而建立刻画其内容的特征向量,然后根据用户偏好文档决定是否向用户推荐。

通过列出推荐项目的内容特征,可以解释为什么推荐那些项目。如果需要向用户解释为什么推荐了这些产品给他,你只要告诉他这些产品有某某属性,这些属性跟你的品味很匹配等等。

缺点:

有限的内容分析:只能分析一些容易提取的文本类内容(新闻、网页、博客),而自动提取多媒体数据(图形、视频流等)的内容特征具有技术上的困难。

过度规范问题:不能为用户发现新的感兴趣的资源,只能发现和用户已有兴趣相似的资源。

新用户问题:当一个新的用户没有或很少对任何商品进行评分时,系统无法向该用户提供可信的推荐。

7TF-IDF算法


二、基于协同过滤的算法

协同过滤(Collaborative Filtering)推荐算法是目前最为主流的一类推荐算法。主要分为两大类:基于内存的算法和基于模型的算法。或者说基于邻域的方法(基于用户的和基于项目的)和基于隐语义的方法(SVDRSVDSVD++LDALSAPLSA)。

(一)基于内存的算法

基于内存的算法以用户间或者项目间的相似性作为推荐的基础。该算法又可以分为两类:一类是基于用户的协同过滤算法,一类是基于项目的协同过滤算法。主要分为三步:①建立用户兴趣档案,并对用户对于项目的历史评分进行统计。②计算用户最近邻居或查找相似性较高的项目。在基于用户和基于项目的推荐算法中分别采用不同的方式。③最终输出当前用户对物品喜欢或不喜欢的预测值,或者将项目排序显示。

(1)基于用户的协同过滤算法(User-based




基于用户的协同过滤算法具有简单易实现、自动化程度高、能够发现用户潜在兴趣等优点。但随着各类应用的普及,系统用户规模急剧扩大,如淘宝、新浪微博用户数已经接近我国人口规模的半数,这意味着每次推荐都要进行超过1017次相似度计算,推荐的实时性较差,限制了基于用户的协同过滤算法在实际系统中的应用。

(2)基于项目的协同过滤算法(Item-based




基于项目的方法基本继承了基于用户的方法的优点,同时基于项目的方法可以离线完成相似度计算,提高了推荐的实时性。且基于项目的方法应对数据稀疏性问题的能力更强,推荐质量更好。

(3)Slope one

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


(4)相似度的计算方法




(二)基于模型的算法

基于内存的算法虽然得到了深入研究,并有广泛的应用,但相似度计算时间过长,尤其是基于用户的方法,存在系统不易扩展、实时性差的问题。为此,学者们提出了基于模型的协同过滤算法。该算法使用机器学习的建模方法,如矩阵分解、支持向量机、贝叶斯网络、聚类、奇异值分解、回归分析等。通过用户的评分记录,离线进行用户偏好建模,在线使用建好的偏好模型,根据用户实时信息进行预测,以提高推荐的响应速度。

(1)奇异值分解算法(SVD)



在数学意义上,SVD是这样子的,一个M*N矩阵的R可以分解成为三个矩阵相乘的形式,R=U*S*V(U是M*M矩阵,S是M*N的对角矩阵,V是N*N的矩阵)。这是严格相等的。S的对角元素称之为奇异值。如果我们减少奇异值的数量,可以得到一个逼近相等的分解。R约等于U*S*V(U是M*k矩阵,S是k*k的对角矩阵,V是k*N的矩阵)。于是我们可以拿这个维度减少的U作为user特征,V作为item特征。然后拿这些降维后的特征去计算相似度。

(2)正则化奇异值分解算法(RSVD)

基于奇异值分解的推荐算法实际上只是采用如下类似奇异值分解的形式:


征矩阵V都是d维矩阵,d为特征空间维度。

(3)SVD++


SVD++算法提取潜在信息的能力很强,预测准确性较高,但计算复杂度很高。

(4)概率矩阵分解(Probabilistic Matrix Factorization,PMF)





(5)非负矩阵分解(Non-negtive Matrix Factorization,NMF)




(6)基于图的模型





(三)协同过滤的优缺点

和基于内容的过滤方法相比,协同过滤具有如下的优点:

①能够过滤难以进行机器自动内容分析的信息,如艺术品,音乐等。

②共享其他人的经验,避免了内容分析的不完全和不精确,并且能够基于一些复杂的,难以表述的概念(如信息质量、个人品味)进行过滤。

③有推荐新信息的能力。可以发现内容上完全不相似的信息,用户对推荐信息的内容事先是预料不到的。这也是协同过滤和基于内容的过滤一个较大的差别,基于内容的过滤推荐很多都是用户本来就熟悉的内容,而协同过滤可以发现用户潜在的但自己尚未发现的兴趣偏好。

④能有效的使用其他相似用户的反馈信息,较少用户的反馈量,加快个性化学习的速度。

虽然协同过滤作为一种典型的推荐技术有其相当的应用,但协同过滤仍有许多的问题需要解决。最典型的问题有稀疏问题(Sparsity)和可扩展问题(Scalability)。

三、基于关联规则发现的推荐算法

(1)关联规则



(2)优缺点

算法的第一步关联规则的发现最为关键且最耗时,是算法的瓶颈,但可以离线进行。其次,商品名称的同义性问题也是关联规则的一个难点。

四、混合推荐算法




3 推荐系统常用的评价指标







4 推荐系统面临的挑战



研究热点



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值