推荐系统模型

  • 基于内容的推荐
  • 基于协同过滤的推荐算法
  • 基于用户的协同过滤算法
  • 基于物品的协同过滤算法
  • 基于隐语义模型算法
  • 基于关联规则的推荐
  • Apriori算法
  • FP-增长算法



推荐系统首先通过分析用户行为数据,建立用户偏好模型。然后使用用户兴趣匹配物品的特征信息,再经过推荐算法进行筛选过滤,找到用户可能感兴趣的推荐对象,最后推荐给用户。上述过程经过训练和验证最终形成推荐模型,可用于在线或离线推荐。同时,推荐结果在用户端的响应也作为输入数据,用于模型的迭代优化。

推荐系统 ps架构 推荐系统模型_推荐系统 ps架构


基于内容的推荐

基于内容推荐的原理是根据用户感兴趣的物品A,找到和A内容信息相近的物品B,从而将B推荐给A。

而提取用户偏好的物品特征是基于内容推荐算法的关键,基于内容的推荐过程是用户喜欢的物品和特征的描述。

物品的特征有属性、描述等,图书的特征是一些文本内容,特征提取可能涉及文本处理相关技术,将文本内容转化为可计算的向量形式,实现对物品的特征建模,应用推荐算法进行内容推荐。

除此之外,还有相似度计算(根据关键词进行相似度计算,常用的算法有TF-IDF)。基于内容的推荐优点是简单有效,推荐结果直观,容易理解,不需要领域知识。不需要用户的历史行为数据,比如对物品的评价等。


基于协同过滤的推荐算法

基于用户行为数据设计的推荐算法,称为协同过滤算法。此方法主要根据用户的历史行为,寻找用户或物品的临近集合,以此计算用户对物品的偏好,包括基于领域、图、关联规则、知识的推荐算法,其中最广泛应用的是基于领域的方法,在实践中往往是上述几种方法的混合应用。

而基于领域的推荐算法主要包括两种算法:基于用户的协同过滤算法和基于物品的协同过滤算法,基于物品的协同过滤与计算用户兴趣相似度一致,基于物品的协同推荐需要计算与用户偏好的物品相似的物品。

基于用户的协同过滤算法

基于用户的协同过滤算法为用户推荐兴趣相似的其他用户喜欢的物品。算法的关键是计算两个用户的兴趣相似度。计算用户相似度的方法有3种:余弦相似性、皮尔森系数相关和修正的余弦相似性。算法步骤如下:

  • 找到与目标用户兴趣相似的用户集合
  • 找到这个集合中的用户喜欢的,且目标用户没有用过的物品,推荐给目标用户

假设目前共有4个用户: A、B、C、D;共有5个物品:a、b、c、d、e。用户与物品的关系(用户喜欢物品)。A收藏的物品有a、b、d,B有a、c依次类推。

推荐系统 ps架构 推荐系统模型_推荐系统 ps架构_02


然后,我们需要用一个向量来用于计算这些用户之间的相似性,而这向量可以这样表示,对于物品总数n,每个用户都可以建立成一个n维向量,而用户的收藏列表中,如果存在该物品则记为1,否则记为0。如下:

推荐系统 ps架构 推荐系统模型_推荐系统 ps架构_03


当我们想通过A来为B推荐物品的时候,我们需要计算AB的相似度,计算方式如下:

推荐系统 ps架构 推荐系统模型_频繁项集_04


通过用户两两之间的相似度计算,选取相似度高的用户的收藏列表中,B没有的物品推荐给的B。


基于物品的协同过滤算法

基于物品的协同过滤算法是给用户推荐跟他喜欢的物品相似的物品,是基础的推荐算法,集成在各类电商平台的推荐系统中。与基于内容的推荐算法相比,是通过用户的行为计算物品之间的相似度,而基于内容的推荐算法计算的是物品内容特征的相似度。例如,物品A、B有很大的相似度是因为喜欢物品A的用户也都喜欢物品B。

例如,在进行推荐的时候,我们需要将用户行为进行打分,将抽象的行为变成一个个数值,如下所示:

推荐系统 ps架构 推荐系统模型_频繁项集_05


现在有用户A、B、C和商品1、2、3、4、5、6,它们构成的行为矩阵如下:

推荐系统 ps架构 推荐系统模型_机器学习_06


评分矩阵如下:

推荐系统 ps架构 推荐系统模型_机器学习_07


如上图所示,用户对物品的行为构成一个评分矩阵,该矩阵可以用来计算物品两两之间的相似性,从而得到两个物品的相似度,最后用于推荐类似物品。

如计算物品1和2的相似性:

推荐系统 ps架构 推荐系统模型_推荐系统 ps架构_08


推荐系统 ps架构 推荐系统模型_推荐系统 ps架构_09


最后得到所有物品之间的相似度矩阵:

推荐系统 ps架构 推荐系统模型_频繁项集_10


接下来,我们只需要将上图中的相似度矩阵×评分矩阵=推荐矩阵,就能得到一个用于推荐的矩阵,在该矩阵中,分值越大越值得推荐:

推荐系统 ps架构 推荐系统模型_机器学习_11


最后,我们将推荐矩阵和原来的评分矩阵作对比,把推荐过的物品进一步排,如图,A收到过推荐(浏览过)的物品有1、2、4、6,所以我们在推荐矩阵中将他们排除,然后在剩余的物品中,选择一个评分最高的物品推荐给用户A:

推荐系统 ps架构 推荐系统模型_推荐系统 ps架构_12


基于隐语义模型算法

隐语义模型最早出现在文本挖掘领域,用于找到文本的隐含语义,核心思想是通过隐含特征关联用户兴趣和物品,通过矩阵分解建立用户和隐类之间的关系、物品和隐类之间的关系,最终得到用户对物品的偏好关系。

即对于某个用户,首先得到他的兴趣分类,然后从分类中挑选出他可能喜欢的物品。隐语义模型使用算法自动得到物品和用户的分类权数。不仅准确度更高,可以得到可靠的权重,还减少了标记物品所需要的人力。

接着,通过隐语义分析给物品分类,并计算出物品属于每个类的权重;然后,确定用户对哪类物品感兴趣,以及感兴趣程度。对于一个给定的分类,选择那些属于这个类的物品推荐给用户,以及确定这些物品在一个类中的权重。

推荐系统用户的行为分为显性反馈和隐形反馈,隐语义模型在显性反馈数据上解决评分预测问题达到了很好的精度。对于隐形反馈数据是指数据集只有正样本,即用户喜欢什么物品,没有用户不感兴趣的样本。

而用户对物品的喜好程度可以根据如下公式得出:

推荐系统 ps架构 推荐系统模型_推荐系统 ps架构_13


其中,?为隐类,?(?,?)为用户?与隐类?之间的关系,?(?,?)为物品?与隐类?之间的关系,其值越高越能代表隐类?。两者相乘为该用户与该物品之间的权重,即用户对物品的喜好程度。

隐语义模型的缺点是模型每次训练时,需要扫描所有用户的行为记录,所以计算用户隐类向量和物品隐类向量较慢,很难实现实时推荐。解决方案是利用物品的内容属性(关键词、类别等)得到物品的特征向量,实时收集用户对物品的行为,并用这些数据得到物品的隐特征向量,然后预测用户是否会单击链接。隐语义模型的优点在于理论基础较好,存储空间为线性增长,节省空间。


基于关联规则的推荐

分为Apriori算法和FP-增长算法算法

从大规模数据集中寻找物品间的隐含关系被称作为关联分析(association analysis)和关联规则学习(association rule learning)。

如图:

推荐系统 ps架构 推荐系统模型_机器学习_14

  1. 频繁项集:经常出现在一块的物品的集合
  2. 关联规则:暗示两种物品之间可能存在很强的关系

例如上图的{葡萄酒、尿布、豆奶},从上面的数据集中也可以找到尿布->葡萄酒(这两个经常出现)的关联规则,这意味着有人买了尿布,那很有可能他也会购买葡萄酒。而当我们寻找频繁项集时,有两个概念比较重要:支持度和可信度。其中,支持度是指两件商品A和B在总销售笔数(N)中同时出现的概率,即A与B同时被购买的概率,计算公式如下:

推荐系统 ps架构 推荐系统模型_频繁项集_15


根据上图,我们可以得到{豆奶}的支持度为4/5,项集{豆奶,尿布}的支持度为3/5。在使用支持度时需要结合业务特点确定一个最小值,只有高于此值的商品项集才能进行推荐,即关注出现频次高的商品组合,超过某一支持度最小值的项集称为频繁项集。置信度是购买A商品后再购买B商品的条件概率,置信度大说明购买A的客户很大概率也会购买B(当然,这是相对的,你也可以计算购买B后购买A的概率)。计算公式如下:

推荐系统 ps架构 推荐系统模型_推荐系统 ps架构_16


上图中,{尿布,葡萄酒}的支持度为3/5,{尿布}的支持度为4/5,所以“尿布->葡萄酒”的置信度为3/4=0.75,这意味着尿布的记录中,我们的规则有75%都适用。


Apriori算法

Apriori算法是最有影响力的基于关联规则频繁项集挖掘算法,算法分为两个步骤:

  1. 第一步是通过迭代检索出所有事务中的频繁项集,即支持度不低于用户设定的阈值的项集。
  2. 第二步利用频繁项集构造出满足用户最小置信度的规则。其中找出所有频繁项集是基于该算法的性质:a.频繁项集的子集也是频繁项集.b.非频繁项集的超集(父集)一定是非频繁的

如下:假设给定如下电子商务网站的用户交易数据集,其中,定义最小支持度为2/9,即支持度计数为2,最小置信度为70%,现在要计算该数据集的关联规则。

推荐系统 ps架构 推荐系统模型_机器学习_17


1)计算频繁1项集。扫描交易数据集,统计每种商品出现的次数,选取大于或等于最小支持度的商品,得到了候选项集。因为这里的商品数都大于等于2,所以都保留下来了。

推荐系统 ps架构 推荐系统模型_机器学习_18


根据频繁1项集,计算频繁2项集。这里将频繁项集进行两两组合,然后统计它们在数据集中一起出现的次数,像I1,I2它们在原来的数据集中出现的次数为4(原来的交易条目为9,所以{I1,I2}一起出现的次数为4/9),然后根据最小支持度我们可以将计数小于2的去掉。

推荐系统 ps架构 推荐系统模型_推荐系统 ps架构_19


根据频繁2项集(去除计数小于2后的候选2项集),计算频繁3项集。首先将频繁2项集进行连接,得到{{I1,I2,I3},{I1,I2,I5},{I1,I3,I5},{I2,I3,I4},{I2,I3,I5},{I2,I4,I5}}(为了方便,不再统计小于2的项集了)

然后根据频繁项集性质进行剪枝(第一种剪枝),即频繁项集的非空子集必须是频繁的。{I1,I2,I3}的2项子集为{I1,I2},{I1,I3},{I2,I3},都在频繁2项集中,则保留; {I1,I3,I5}的2项子集为{I1,I3},{I1,I5},{I3,I5},由于{I3,I5}不是频繁2项集,移除该候选集。以此类推,得到频繁3项集。

根据频繁3项集,计算频繁4项集。重复上述的思路,得到{I1,I2,I3,I5},根据频繁项集定理,它的子集{I2,I3,I5}为非频繁项集,所以移除该候选集。从而,频繁4项集为空,至此,计算频繁项集的步骤结束。

根据频繁项集,计算关联规则。这里以频繁3项集{I1,I2,I5}为例,计算关联规则。{I1,I2,I5}的非空子集为{I1,I2}、{I1,I5}、{I2,I5}、{I1}、{I2}和{I5}。

规则1,{I1,I2}=>{I5},置信度为{I1,I2,I5}的支持度除以{I1,I2}的支持度,即2/4=50%,因其小于最小置信度(0.7),所以删除该规则。

同理,最后可以得到{I1,I5}=>{I2},{I2,I5}=>{I1}和{I5}=>{I1,I2}为3条强关联规则。


FP-增长算法

FP-增长算法采用分而治之的策略,经过第一遍扫描之后,把数据库中的频繁项集压缩成一棵频繁模式树,同时依然保留关联信息,随后将树分成一些条件库,每个库和一个长度为1的频繁项集相关,然后对这些条件库进行挖掘。当原始数据量很大的时候,可以结合划分的方法,使得树可以放入主存中。

树的构建过程如下:扫描数据集,得到所有的频繁1项集的计数。然后删除支持度低于阈值的项,将1项频繁集放入项头表,并按照支持度降序排列。扫描数据集,将非频繁的1项集从原始数据集中删除,并将事务按照支持度降序排列。

读入排序后的事务集并按照排序顺序依次插入FP树中,排序靠前的节点是父节点,而靠后的是子节点。如果有共用父节点,对应共用父节点计数加1。插入后,如果有新节点出现,则项头表对应的节点会通过节点链表链接到新节点。直到所有的数据都插入到FP树后,FP树的建立完成。