参考:https://zhuanlan.zhihu.com/p/27502172

推荐系统分类

主要用 “协同过滤的推荐”
image.png

1. 基于内容的推荐

顾名思义,它是利用项目的内在品质或者固有属性来进行推荐,比如音乐的流派、类型,电影的风格、类别等,不需要构建UI矩阵。它是建立在项目的内容信息上作出推荐的,而不需要依据用户对项目的评价意见,更多地需要用机器学习的方法从关于内容的特征描述的事例中得到用户的兴趣资料。
以前一直觉得基于内容的推荐算法最简单,没有啥技术含量,直接基于项目的相似度来通过最近邻获取与目标项目最相似的项目列表,然后把用户没有行为记录并且评分高的项目推荐给特定用户。

相当于我最近在听 古典音乐 这种类型的音乐,然后系统将我没听过的但评分高的古典音乐推荐给我。理解中应该是有一个古典音乐标签和列表,直接根据列表给我推送。但这个列表的来源很粗暴,只是有古典标签和评分高,没有涉及到与我这个用户兴趣相似的其他用户,也就没有给我推荐其他用户喜欢的古典音乐了。

2. 基于协同过滤的推荐

顾名思义,它是通过集体智慧的力量来进行工作,过滤掉那些用户不感兴趣的项目。协同过滤是基于这样的假设:为特定用户找到他真正感兴趣的内容的好方法是首先找到与此用户有相似兴趣的其他用户,然后将他们感兴趣的内容推荐给此用户。
它一般采用最近邻技术,利用用户的历史喜好信息计算用户之间的距离,然后利用目标用户的最近邻居用户对商品评价的加权评价值来预测目标用户对特定商品的喜好程度,系统从而根据这一喜好程度来对目标用户进行推荐,通常需要用到UI矩阵的信息。协同过滤推荐又可以根据是否运用机器学习的思想进一步划分为基于内存的协同过滤推荐(Memory-based CF)和基于模型的协同过滤推荐(Model-based CF)。

2.1 基于内存的协同过滤推荐

其中基于内存的推荐系统(Memory-based CF)主要是通过启发式的方法来进行推荐,主要步骤一个是相似性函数的选择,如何选择合适的相似性函数来更好的度量两个项目或者用户的相似性是关键;另一个主要步骤是如何进行推荐,最简单的推荐方法是基于大多数的推荐策略,即推荐那些大多数人产生过行为而目标用户未产生过行为的项目。
根据用户维度和项目维度的不同而分为Item-based CFUser-based CF

  • Item-based CF:

①首先需要构建UI矩阵;
②根据UI矩阵来计算列(项目维度)的相似度;
③选择特定项目最相似的k个项目构成推荐列表;
④推荐给特定用户列表中还没有发生过行为的项目。

  • User-based CF:

①首先需要构建UI矩阵;
②根据UI矩阵来计算行(用户维度)的相似度;
③选择特定用户最相似的k个用户;
④推荐给特定用户列表中还没有发生过行为而在相似用户列表中产生过行为的高频项目。

2.2 基于模型的协同过滤推荐

基于模型的推荐系统(Model-based CF)主要是运用机器学习的思想来进行推荐,说到机器学习思想那真是不胜枚举。记得小邬老师提过,目前机器学习主要是研究以下几种方式:
① 损失函数+正则项(Loss Function);
通过对不同的任务来建立不同的损失函数加正则项来解决问题。比如著名的Lasso Regression、Ridge Regression以及Hinge Regression等。
② 神经网络+层(Neural Network);
通过对不同的任务来设计不同的网络结构来解决问题。比如RNN、CNN以及GAN等。
③ 图模型+圈(Graph Model);
通过运用图的知识来解决不同的实际问题。比如马尔科夫模型等。
回到机器学习方法在推荐系统的应用上来,主要的方法为分类算法,回归算法、聚类算法、矩阵分解算法、神经网络算法、图模型算法以及隐语义模型等,在这主要介绍基于矩阵分解的推荐系统算法,以后有时间再慢慢补充吧。

2.3 基于矩阵分解的推荐

首先我们需要明确所要解决的问题,即对于一个M行(M个item),N列(N个user)的矩阵,当然这个矩阵是很稀疏的,即用户对于项目的评分是不充分的,大部分是没有记录的,我们的任务是要通过分析已有的数据(观测数据)来对未知数据进行预测,即这是一个矩阵补全(填充)任务。矩阵填充任务可以通过矩阵分解技术来实现.
具体的分解类型公式看原文吧。。。。

2.3.1 SVD 分解:

最经典的矩阵分解技术是SVD(奇异值)分解。
image.png
SVD分解的形式为3个矩阵相乘,中间矩阵为奇异值矩阵。如果想运用SVD分解的话,有一个前提是要求矩阵是稠密的,即矩阵里的元素要非空,否则就不能运用SVD分解。很显然我们的任务还不能用SVD,所以一般的做法是先用均值或者其他统计学方法来填充矩阵,然后再运用SVD分解降维。

2.3.2 FunkSVD

刚才提到的Traditional SVD首先需要填充矩阵,然后再进行分解降维,同时存在计算复杂度高的问题,所以后来提出了FunkSVD的方法,我总是念成Fuck,顾名思义,作者发明出这个算法的时候一定是太高兴,不由自主的说出了Fuck,这个算法真是太惊艳了!哈哈,纯属笔者开玩笑,实际上是以人家的名字命名的。它不在将矩阵分解为3个矩阵,而是分解为2个低秩的用户项目矩阵,在这里低秩的解释可以是:在大千世界中,总会存在相似的人或物,即物以类聚,人以群分。在这里,笔者总是混淆稀疏矩阵与低秩矩阵的概念,所以特此说明一下:
稀疏矩阵(sparse matrix):指的是矩阵中的非零元素比较少,但不一定是低秩的。比如对角矩阵,稀疏但是却满秩。

低秩矩阵(low-rank matrix):指的是矩阵的秩比较小,但不一定是稀疏的。比如全为1的矩阵,秩虽然小仅为1,但确实稠密矩阵。
以上两种最优化函数都可以通过梯度下降或者随机梯度下降法来寻求最优解。

2.3.3 BiasSVD

在FunkSVD提出来之后,出现了很多变形版本,其中一个相对成功的方法是BiasSVD,顾名思义,即带有偏置项的SVD分解。它是基于这样的假设:某些用户会自带一些特质,比如天生愿意给别人好评,心慈手软,比较好说话,有的人就比较苛刻,总是评分不超过3分(5分满分),笔者就是这样的人儿;同时也有一些这样的项目,一被生产便决定了它的地位,有的比较受人们欢迎,有的则被人嫌弃,这也正是提出用户和项目偏置项的原因;项亮给出的解释是:对于一个评分系统有些固有属性和用户物品无关,而用户也有些属性和物品无关,物品也有些属性与用户无关。

2.3.4 SVD++

人们后来又提出了改进的BiasSVD,还是顾名思义,两个加号,我想是一个加了用户项目偏置项,另一个是在它的基础上添加了用户的隐式反馈信息。它是基于这样的假设:用户对于项目的历史评分记录或者浏览记录可以从侧面反映用户的偏好,比如用户对某个项目进行了评分,可以从侧面反映他对于这个项目感兴趣,同时这样的行为事实也蕴含一定的信息。其中N(i)为用户i所产生行为的物品集合;ys为隐藏的对于项目j的个人喜好偏置,是一个我们所要学习的参数;至于|N(i)|的负二分之一次方是一个经验公式。

3.基于混合的推荐

基于混合的推荐,顾名思义,是对以上算法的融合,像淘宝既有基于内容的推荐也有协同过滤的推荐。具体怎么融合还是要结合具体的应用场景,包括是对特征的融合还是对算法层面的融合。其中说到算法的融合,想到了机器学习模型常用的三种模型融合方法:Bagging、Boosting和Stacking
Bagging(装袋)方法:该方法通过重采样技术生成若干个不同的子训练集,然后在每个训练集上训练一个分类器,然后采用投票的方式取大多数的结果为模型的最终结果。模型更像是发挥民主作用的人民代表大会制度,还是大部分人说了算的。
Boosting(强化提升)方法:每个训练样例都有权重,每次训练新分类器的时候都着重训练那些再上一次分类过程中分错的样例,权重会随着迭代次数的变化而变化。模型更像是有了记忆能力,加大力度惩罚那些在上一轮不乖的样例而使得他们越来越听话。
Stacking(堆叠)方法:每个分类器首先做一遍决策,然后将分类器们的决策送到更高一层的模型中,把他们当做特征再进行一次训练。每个单独分类器的输出会作为更高层分类器的输入,更高层分类器可以判断如何更好的合并这些来自低层的输出。模型更像是神经网络中的轴突,低层的输出作为高层的输入。
【具体思路】 给定一个train数据集和一个test数据集,我们的任务是分类。①首先需要确定基模型,在这选择KNN,DecisionTree和SVM三个;②其次是要把train数据集分成5折的交叉验证,4份用来训练,1份用来交叉验证;③选择一个基模型KNN,然后在train数据集上做交叉验证,每次用4N/5来训练,N/5来测试,共测试5次,这样就会得到整个train数据集上的预测;同样用每次训练好的模型来预测test,那么可以得到5个对于test的预测,然后取平均作为结果;⑤重复步骤3、4,这样会得到对于train的3列新的特征表达(每一列是一个基模型的预测结果),同理也会得到测试集的3列新的特征表达;⑥将新的3列train特征作为第二层模型(在这我们用LR)的输入,再次进行训练;⑦用test上3列新的特征作为输入,送入训练好的模型来预测结果。

有几个基模型,就会对整个train数据集生成几列新的特征表达。同样,也会对test有几列新的特征表达。

4. 基于人口统计学的推荐

主要是根据用户的注册信息来进行简单推荐,不展开介绍。

5. 基于规则的推荐

主要根据简单的规则或者领域知识来进行推荐,比如热门推荐等,不展开介绍。

评测指标

评测指标是用来评价一个系统性能好坏的函数,可以分为对于算法复杂度的度量以及算法准确性的度量。算法复杂度主要考虑算法实现的空间以及时间复杂度,当然算法复杂度同样重要,但这里主要讨论算法的准确性度量指标。
推荐系统根据推荐任务的不同通常分为两类:评分预测Top-N列表推荐。在这里主要根据这两者来分别讨论评测指标。

  • 评分预测任务:

预测特定用户对于没有产生过行为的物品能够打多少分。评分预测一般通过均方根误差(RMSE)和平均绝对误差(MAE)来计算。
其中Netflix认为RMSE加大了对预测不准的用户物品评分的惩罚(平方项的惩罚),因而对系统的评测更加苛刻,同时如果评分系统是基于整数建立的(即用户给的评分都是整数),那么对预测结果取整会降低MAE的误差。

  • Top-N列表推荐:

评分预测只能适用于小部分的场景,比如对于电影,书籍的评分,其实Top-N推荐更加符合现在的需求,给用户提供一个推荐的列表让其进行选择。Top-N推荐一般通过准确率与召回率来进行衡量。其中令R(u)是根据用户在训练集上的行为给用户作出的推荐列表(指的是预测的推荐列表),而T(u)是用户在测试集上的行为列表(指的是真实的列表GroundTruth),在这笔者总是容易混淆两者的含义。
准确率(precison)的意义在于所预测的推荐列表中有多少是用户真是感兴趣的,即预测列表的准确率,那么准确率的定义为。
召回率(recall)的意义在于真正用户感兴趣的列表中有多少是被推荐算法准确预测出来的,即真实列表的召回率,那么召回率的定义为。

一些讨论

协同过滤与内容推荐的区别

举个简单的小例子,
我们已知道用户u1喜欢的电影是A,B,C
用户u2喜欢的电影是A, C, E, F
用户u3喜欢的电影是B,D
我们需要解决的问题是:决定对u1是不是应该推荐F这部电影
基于内容的做法:要分析F的特征和u1所喜欢的A、B、C的特征,需要知道的信息是A(战争片),B(战争片),C(剧情片),如果F(战争片),那么F很大程度上可以推荐给u1,这是基于内容的做法,你需要对item进行特征建立和建模。
协同过滤的办法:那么你完全可以忽略item的建模,因为这种办法的决策是依赖user和item之间的关系,也就是这里的用户和电影之间的关系。我们不再需要知道ABCF哪些是战争片,哪些是剧情片,我们只需要知道用户u1和u2按照item向量表示,他们的相似度比较高,那么我们可以把u2所喜欢的F这部影片推荐给u1。

UserCF和ItemCF分别适用于什么情况

一、在适合用途上的比较。Item CF是利用物品间的相似性来推荐的,所以假如用户的数量远远超过物品的数量,那么可以考虑使用Item CF,比如购物网站,因其物品的数据相对稳定,因此计算物品的相似度时不但计算量较小,而且不必频繁更新;User CF更适合做新闻、博客或者微内容的推荐系统,因为其内容更新频率非常高,特别是在社交网络中,User CF是一个更好的选择,可以增加用户对推荐解释的信服程度。

而在一个非社交网络的网站中,比如给某个用户推荐一本书,系统给出的解释是某某和你有相似兴趣的人也看了这本书,这很难让用户信服,因为用户可能根本不认识那个人;但假如给出的理由是因为这本书和你以前看的某本书相似,这样解释相对合理,用户可能就会采纳你的推荐。

二、从推荐的多样性上比较。单个用户的多样性:Item CF的多样性显然不如User CF的好,因为Item CF的推荐就是和以前看的东西最相似的。系统的多样性(也被称为覆盖率,指一个推荐系统能否给用户提供多种选择):在这种指标下,Item CF的多样性要远远好于User CF,因为User CF会更倾向于推荐热门的物品。从另外一个角度看,也就是说,Item CF的推荐有很好的新颖性,容易发现并推荐长尾里的物品。所以大多数情况,Item CF的精度稍微小于User CF,但是如果考虑多样性,Item CF却比User CF好很多。

由于User CF经常推荐热门的,所以它在推荐长尾里项目方面的能力不足;而Item CF只推荐A领域给用户,这样他有限的推荐列表中就可能包含了一定数量的不热门的长尾物品,同时Item CF的推荐对这个用户而言,显然多样性不足。但是对整个系统而言,因为不同的用户的主要兴趣点不同,所以系统的覆盖率会比较好。

三、用户特点对推荐算法影响的比较。对于User CF,推荐的原则是假设用户会喜欢那些和他有相同喜好的用户喜欢的东西,但是假如用户暂时找不到兴趣相投的邻居,那么基于用户的CF推荐效果就打了大大折扣了,因此用户是否适应User CF算法跟他有多少邻居是成正比关系的。基于项目协同过滤算法也是有一定前提的,即用户喜欢和他以前购买过的相同类型的物品,那么我们可以计算一个用户喜欢的物品的自相似度。一个用户喜欢物品的自相似度大,就说明他喜欢的东西都是比较相似的,即这个用户比较符合Item CF方法的基本假设,那么他对Item CF的适应度自然比较好;反之,如果自相似度小,就说明这个用户的喜好习惯并不满足Item CF方法的基本假设,那么用Item CF方法所做出的推荐对于这种用户来说,其推荐效果可能不是很好。

Q&A

Q:UserCF和ItemCF分别适用于什么情况? A:UserCF根据相似用户推荐,更社会化;ItemCF根据用户本身的历史记录推荐,更加个性化。UserCF较适用于新闻,社区等网站,ItemCF较适用于购物等网站。
Q:UserCF和ItemCF的余弦相似度矩阵W有什么异同? A:UserCF的相似度矩阵表示用户之间的相似度,适用于用户较少物品较多的场合;ItemCF的相似度矩阵表示物品之间的相似度,适用于用户较多物品较少的场合。目前的购物网站中,物品数量远远小于用户数量,所以购物网站大多采用ItemCF。【速记:哪个少,就用哪个。因为计算量少,且精确一点】
Q:如何评价一个推荐系统的优劣? A:评价一个推荐系统有3种方法:离线实验,用户调查和在线实验。评测的指标有:用户满意度,预测准确度,覆盖率,多样性,新颖性,惊喜度,信任度,实时性,健壮性和商业目标。