推荐系统笔记(近邻推荐)

思维导图:

                      

提到推荐系统,协同过滤算法是最出名啦,协同过滤的重点在于协同,也就是群体互帮互助,互相支持是集体智慧的体现

协同过滤:

         当推荐系统度过使用基于内容的推荐阶段后,就有了可观的用户行为,这时候用户行为是正向的,也就是用户或明或暗地表达着喜欢的行为。这些行为可以表达成一个用户和物品的关系矩阵,这个用户物品的关系矩阵中填充的就是用户对物品的态度,但并不是每个位置都有,需要的就是把那些还没有的地方填起来,这个关系矩阵就是协同过滤的基础,一切都围绕这个矩阵进行。

协同过滤是一个比较大的算法范畴,通常划分为两类:

1、基于记忆的协同过滤

简单的理解就是记住每个人消费过什么东西,然后给他推荐相似的东西,或者推荐相似的人消费的东西

    1)基于用户的协同过滤(User-Based)

       思想:你遇到一个人,你发现他喜欢的电影、喜欢的运动基本上都是你喜欢的,从此,你经常问他有什么好东西可以推荐的

       原理:基于用户的协同过滤,核心就是那个用户物品的关系矩阵

       具体实现步骤

       第一步,准备用户向量,从这个矩阵中,理论上可以给出每一个用户得到的一个向量(向量具备的特点:向量的维度就是物品的个数;向量是稀疏的,也就是说并不是每个维度上都有数值;向量维度上的取值可以是简单的0或1)

       第二步,用每一个用户的向量,两两计算用户之间的相似度,设定一个相似度阈值或者设定一个最大数量,为每个用户保留与其最相似的用户

      第三步,为每一个用户产生推荐结果

      实践中遇到的坑

       1)只有原始用户行为日志,需要从中构造矩阵,怎么做?

          构造矩阵做协同过滤时,矩阵是稀疏的,典型的稀疏矩阵存储格式:CSR、COO

       2)如果用户的向量很长,计算一个相似度则耗时很久,怎么办?

         通常采取降低相似度计算复杂度,常用的办法主要有两个:1、对向量采样计算    2、向量化计算

       3)如果用户量很大,而且通常如此,两两计算用户相似度也是一个坑,怎么办?

        第一个方法是将相似度计算拆成MapReduce任务,将原始矩阵Map成键为用户对,值为两个用户对同一个物品的评分之积,Reduce阶段对这些成集再求和,MapReduce任务结束后再对这些值归一化

       第二个方法是不用基于用户的协同过滤,这种计算对象两两之间的相似度的任务,如果数据量不大,一般来说不超过百万个,然后矩阵又是稀疏的,那么很多单机版本的工具其实更快,比如KGraph、GraphCHI等

       4)计算推荐时,看上去要为每一个用户计算他和每一个物品的分数?

      针对几个特点可以利用一下:1、只有相似的用户喜欢过的物品需要计算,这个数量相比全部物品少了很多 2、把计算过程拆成MapReduce任务,拆Map Reduce任务的做法是:1)遍历每个用户喜欢的物品列表  2)获取该用户的相似用户列表 3)把每一个喜欢的物品Map成两个记录发射出去,一个是键为<相似用户ID,物品ID,1> 三元组,可以拼成一个字符串,值为相似度,另一个键为<相似用户ID,物品ID,0>三元组,值为<喜欢程度*相似度>   4)Reduce阶段,求和后输出   5) <相似用户ID,物品ID,0>的值除以<相似用户ID,物品ID,1>的值

        一些改进:惩罚对热门物品的喜欢程度,热门的东西很难反应出用户的真实兴趣,很大可能是被煽动;增加喜欢成都的时间衰减,一般使用一个指数函数,指数就是一个负数

         应用场景:基于用户的协同过滤的应用场景,基于用户的协同过滤有两个产出:相似用户列表;基于用户的推荐结果

    2) 基于物品(Item-Based)的协同过滤

       在基于物品协同过滤出现之前,信息过滤系统最常使用的是基于用户的协同过滤。基于用户的协同过滤首先计算相似用户,然后再根据相思用户的喜好推荐物品,这个算法有几个问题:1)用户数量往往比较大,计算起来比较吃力,称为瓶颈  2)用户的口味其实是变化很快的,不是静态的,所以兴趣迁移问题很难反应出来 3)数据稀疏,用户和用户之间有共同的消费行为实际上是比较少的,而且一般是一些热门物品,对发现用户兴趣帮助不是很大。

       与基于用户的不同,基于物品的协同过滤首先计算相似物品,然后在根据用户消费过、或者正在消费的物品为其推荐相似的。

       首先,物品的数量或者严格的说,可以推荐的物品数量往往少于用户数量,所以一般计算物品之间的相似度不会称为瓶颈

       其次,物品之间的相似度比较静态,它们的速度没有用户的口味变化快,所有完全解决用户兴趣迁移的问题

       最后,物品对应的消费者数量较大,对于计算物品之间的相似度稀疏度是好过计算用于之间相似度的

       基于物品的协同过滤算法主要步骤如下:1)、构建用户物品的关系矩阵,矩阵元素可以是用户的消费行为,也可以是消费后的评价,还可以是消费行为的某种量化如时间、费用等 2)、假如矩阵的行表示物品,列表示用户的话,那么两两计算行向量之间的相似度,得到物品相似度矩阵,行和列都是物品  3)、产生推荐结果,根据推荐场景不同,有两种产生结果的形式,一种是为某一个物品推荐相关物品,另一种是在个人首页产生类似猜你喜欢的推荐结果。

       计算物品相似度:从物品关系矩阵中得到的物品向量是一个稀疏向量;向量的维度是用户,一个用户代表向量的一维,这个向量的总共维度是总用户数量;向量的各个维度的取值是用户对这个物品的消费结果,可以是行为本身的布尔值,也可以是消费行为量化如时间长短、次数多少、费用大小等;没有消费过的就不再表示,所以说是一种稀疏向量

      一些改进:

          1、物品中心化。把矩阵中的分数,减去的是物品分数的均值;先计算每一个物品收到评分的均值,然后再把物品向量中的分数减去对应物品的均值

           2、用户中心化。把矩阵中的分数,减去对应用户分数的均值;先计算每一个用户的评分均值,然后把他打过的所有分数都减去这个均值

          上面提到的相似度计算方法,不只是适用于评分类矩阵,也适用于行为矩阵。所谓行为矩阵,即矩阵元素为0或1的布尔值,也就是隐式反馈,隐式反馈取值特殊,有一些基于物品的改进推荐算法无法应用,比如著名的Slope One算法

     计算推荐结果

            得到物品相似度之后,接下来就是为用户推荐他可能会感兴趣的物品,基于物品的协同过滤,有两种应用场景

        第一种属于TopK推荐:当用户访问首页时,汇总和用户已经消费过的物品相似的物品,按照汇总后分数从高到低推出

        第二种属于相关推荐:当用户访问一个物品的详细页面时或者完成一个物品消费的结果时,直接获取这个物品的相似物品推荐

2、基于模型的协同过滤

从用户物品关系矩阵中去学习一个模型,从而把那些矩阵空白处填满

协同过滤中相似度的计算方法:

相似度的本质:推荐算法实际有一个潜在假设,如果两个物体很相似,也就是距离很近,那么这两个物体很容易产生一样的动作

相似度计算方法:

     1、数据分类:在计算相似度之前,需要先把度量对象做个简单分类,相似度计算对象是向量,或者是高维空间下的坐标,表示向量的数值就有两种:1、实数值   2、布尔值,也就是0或者1

     2、欧式距离:是一个欧式空间下度量距离的方法,衡量两个点之间的距离。欧式距离不适合布尔向量之间

     3、余弦相似度:度量两个向量之间的夹角,其实就是用夹角的余弦值来度量。

          余弦相似度在度量文本相似度、用户相似度、物品相似度较为常用,余弦相似度的特点是它与向量的长度无关,因为余弦相似度计算需要对向量长度做归一化。

       一些改进:调整的余弦相似度,就是先计算向量每个纬度上的均值,然后每个向量在各个维度上都减去均值后,再计算余弦相似度

    4、皮尔逊相关度

          也是一种余弦相似度,不过先对向量做了中心化 ,在计算余弦相似度。不适合做布尔值向量之间的相关度(因为布尔向量对应0-1分布的随机变量,这样的随机变量变化只有有限的两个取值,根本没有‘变化趋势,高低起伏’)

    5、杰卡德(Jaccard)相似度

     表示两个集合德交集元素个数在并集中所占德比例,由于集合非常适用于布尔向量表示,所以杰卡德相似度简直就是为布尔值向量私人定做的。对应德计算方式是:1、分子是两个布尔向量做点积运算,得到的就是交集元素个数  2、分母是两个布尔向量做或运算,再求元素和。

比较:按照向量维度取值是否是布尔值来看,杰卡德相似度就只适合布尔值向量,余弦相似度适用于两种向量,欧式距离适合非布尔值向量。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值