推荐系统-协同过滤推荐

一、协同过滤推荐概述

协同过滤(Collaborative Filtering)作为推荐算法中最经典的类型,包括在线的协同和离线的过滤两部分。所谓在线协同,就是通过在线数据找到用户可能喜欢的物品,而离线过滤,则是过滤掉一些不值得推荐的数据,比比如推荐值评分低的数据,或者虽然推荐值高但是用户已经购买的数据。

二、协同过滤推荐分类   

       协同过滤的模型一般为m个物品,m个用户的数据,只有部分用户和部分数据之间是有评分数据的,其它部分评分是空白,此时我们要用已有的部分稀疏数据来预测那些空白的物品和数据之间的评分关系,找到最高评分的物品推荐给用户。
      一般来说,协同过滤推荐分为三种类型。第一种是基于用户(user-based)的协同过滤,第二种是基于项目(item-based)的协同过滤,第三种是基于模型(model based)的协同过滤。


1.   基于物品(item-based)的协同过滤    

  物品的协同过滤是物品和物品之间的相似度,找到了目标用户对某些物品的评分,那么我们就可以对相似度高的类似物品进行预测,将评分最高的若干个相似物品推荐给用户。比如你在网上买了一本机器学习相关的书,网站马上会推荐一堆机器学习,大数据相关的书给你,这里就明显用到了基于物品的协同过滤思想。

案例实现

以图书销售推荐为例,解释物品协同过滤的过程。为了简单化,假设某图书销售平台总共有6本书销售,有6个用户购买。

数据:用户的评分数据,分值1-5分。每个用户对图书的评分如下图矩阵所示。

                               鸟哥笔记,用户运营,菠萝王子,产品运营鸟哥笔记,用户运营,菠萝王子,产品运营

相似的物品可能被同个用户喜欢。反过来讲,就是被同个用户喜欢的物品是相似商品。如上图中,图书1和图书2两本书,被用户A同时喜欢,这两本书具有相似性。而图书5和图书6,没有被同个用户同时喜欢,不具有相似性。

                            鸟哥笔记,用户运营,菠萝王子,产品运营

关于相似度的求法有很多种(欧式、余弦、皮尔逊),这地方用余弦相似度计算图书1和图书2的相似度,也叫做cosine距离,计算过程为:

                                  鸟哥笔记,用户运营,菠萝王子,产品运营

具体余弦值相关数学基础可以参考我的另外一篇博客  https://blog.csdn.net/u014539465/article/details/105353638

回想高中时候的课本我们就可以知道,上面的similarity计算公式,实际上就是计算书籍1的评分向量(4,5,4,0,0,0)和书籍2的评分向量(3,0,3,3,4,0)的 cos 夹角。

用同样的方式,可以算出图书1跟其他五本图书相似度分别为0.27, 0 .79,0.32,0.99和0。对每两本书计算完这个相似度后,就可以获得全部图书的相似矩阵。

                                   鸟哥笔记,用户运营,菠萝王子,产品运营鸟哥笔记,用户运营,菠萝王子,产品运营

一个平台不仅仅有6本图书6个用户,我们再扩展到一般的情况。计算物品的相似度,实际是计算每两个物品评分向量的cosine距离,评分向量的每一维,代表了一个用户,下图中,表格的第一行代表了所有用户对物品A的评分。当有100万个用户时,也就是计算每两个100万维向量的距离。这样就导致计算量很大,而且很多平台不仅仅只有100万用户,因而这个低效的计算方式需要改进。

                               鸟哥笔记,用户运营,菠萝王子,产品运营鸟哥笔记,用户运营,菠萝王子,产品运营

预测决策:

有了评分矩阵之后,预测决策一般有两种场景。

一种是根据相似度排序推荐最近邻物品。类似于“看了还看”,“买了还买”场景。在这里的例子中,我们知道图书1和其他图书的相似度排序分别是图书5,图书3,图书4和图书2。当用户点击了图书1时,就可以按照相似顺序从高到低推荐。

                            鸟哥笔记,用户运营,菠萝王子,产品运营鸟哥笔记,用户运营,菠萝王子,产品运营

第二种是根据相似度预测评分推荐物品。如何决策要不要给用户B推荐图书2,图书4和图书6呢?如下图,通过用户B对图书1的评分 * 未知图书与图书1的相似度来预测用户B对剩下图书的评分。如图书2的预测评分 =  图书1的评分5分 * 图书1和图书2的相似度0.27 ,从而用户B对图书2的评分是:5*0.27=1.35。同样方式计算出其他图书的评分预测。

                         鸟哥笔记,用户运营,菠萝王子,产品运营鸟哥笔记,用户运营,菠萝王子,产品运营

从上面的结果来看,用户B对其他图书评分比较低,这几本图书推荐的可能性大大减少。

物品协同过滤实际使用

这是推荐系统里最朴素的算法,因为它的计算量会随着用户和物品的数量呈指数增长,所以它并不适合在大量用户或大量物品的场景使用。在它诞生的年代,还没有大数据,这种计算方式耗费大量内存,需要做大量的优化。我尝试过用100万用户,100万物品和500万条的数据在256G内存的机器上做过尝试,计算一分钟后就宣告内存耗尽。确实需要计算的话,一般使用Spark来实现。

因为这个缺点,就需要新的算法来计算物品的协同过滤。

前面提到,计算任意两物品之间的相似度后,有两个使用场景。针对这两个场景,分别有不同的迭代算法:

  • 根据相似度排序推荐最近邻物品:使用如Word2vec,Item2vec等Embedding类的算法,将物品嵌入固定的向量空间中,再使用LSH算法(局部敏感哈希算法)取最近邻物品。这个后续文章会介绍。

  • 根据相似度预测评分推荐物品:本章后续介绍的SVD算法。

虽然这个算法使用较少了,但是物品协同过滤的思想都是一脉相乘的,理解了这个简单的cosine相似度计算方式,可以更好理解后续的迭代算法。

最后补充一下,物品协同过滤的一个缺点,或者说是协同过滤的缺点,对于一个新物品,协同过滤是无法推荐的。因为新物品用户无评分,导致它跟所有物品的相似度都是为0。这个是使用这个算法时非常需要注意的一个点。

2.  基于用户(user-based)的协同过滤     

主要考虑的是用户和用户之间的相似度,只要找出相似用户喜欢的物品,并预测目标用户对对应物品的评分,就可以找到评分最高的若干个物品推荐给用户。

                     鸟哥笔记,用户运营,菠萝王子,产品运营鸟哥笔记,用户运营,菠萝王子,产品运营

评分了相同图书的用户为相似用户,他们的相似度同样也用cosine相似度公式来计算,跟上面的物品相似度求法一样。计算完相似度后,就可以根据用户间的相似性,预测用户对未评分图书进行评分预测。

        另外,欧几里得距离相似度、余弦值相似度、皮尔逊相关系数等多种方式当中的一种求出相似度。具体原理以及过程可以参考一下我之前整理的三篇博客

https://blog.csdn.net/u014539465/article/details/105352011

https://blog.csdn.net/u014539465/article/details/105352450

https://blog.csdn.net/u014539465/article/details/105353638

基于用户与基于物品两种推荐方式比较:

我们简单比较下基于用户的协同过滤和基于项目的协同过滤:基于用户的协同过滤需要在线找用户和用户之间的相似度关系,计算复杂度肯定会比基于基于物品的协同过滤高。但是可以帮助用户找到新类别的有惊喜的物品。而基于物品的协同过滤,由于考虑的物品的相似性一段时间不会改变,因此可以很容易的离线计算,准确度一般也可以接受,但是推荐的多样性来说,就很难带给用户惊喜了。一般对于小型的推荐系统来说,基于物品的协同过滤肯定是主流。但是如果是大型的推荐系统来说,则可以考虑基于用户的协同过滤,当然更加可以考虑我们的第三种类型,基于模型的协同过滤。

 

3、基于模型(model based)的协同过滤   

       基于模型的协同过滤算法,不同于上述两种,它往往先使用机器学习算法来预测用户对于某个物品的评分,一般来说,推荐系统会由 m 个用户和 n 个物品,用户对其中的部分物品进行评分,推荐系统中,物品数量往往及其巨大,单个用户不会对所有物品产生评分,所以用户-物品矩阵一般是一个稀疏矩阵。此时,只有部分用户和部分数据之间是有评分数据的,其它部分评分是空白,此时我们要用已有的部分稀疏数据来预测那些空白的物品和数据之间的评分关系,找到最高评分的物品推荐给用户。
      一般对于这个问题,可以用机器学习的来建模解决,主流的方法可以分为:矩阵分解,关联算法,聚类算法,分类算法,回归算法,神经网络,图模型以及隐语义模型等。

     基于矩阵分解的模型

原理
 根据用户与物品的潜在表现,我们就可以预测用户对未评分的物品的喜爱程度
基于矩阵分解的方法
ALS 交替最小二乘
ALS-WR( 加权正则化交替最小二乘法 ): alternating-least-squares with weighted-λ –regularization
将用户 (user) 对商品 (item) 的评分矩阵分解为两个矩阵:一个是用户对商品隐含特征的偏好矩阵,另一个是商品所包含的隐含特征的矩阵。在这个矩阵分解的过程中,评分缺失项得到了填充,也就是说我们可以基于这个填充的评分来给用户最商品推荐了。
SVD 奇异值分解矩阵
 
 
原理
根据用户与物品的潜在表现,我们就可以预测用户对未评分的物品的喜爱程度
基于矩阵分解的方法
ALS 交替最小二乘
ALS-WR( 加权正则化交替最小二乘法 ): alternating-least-squares with weighted-λ –regularization
将用户 (user) 对商品 (item) 的评分矩阵分解为两个矩阵:一个是用户对商品隐含特征的偏好矩阵,另一个是商品所包含的隐含特征的矩阵。在这个矩阵分解的过程中,评分缺失项得到了填充,也就是说我们可以基于这个填充的评分来给用户最商品推荐了。
SVD 奇异值分解矩阵
 
ALS 方法

 

ALS 的矩阵分解算法常应用于推荐系统中,将用户 (user) 对商品 (item) 的评分矩阵,分解为用户对商品隐含特征的偏好矩阵,和商品在隐含特征上的映射矩阵。
与传统的矩阵分解 SVD 方法来分解矩阵 R( R∈ℝm×n ) 不同的是, ALS(alternating least squares) 希望找到两个低维矩阵,以 R̃ =XY 来逼近矩阵 R ,其中 , X∈ℝm×d Y∈ℝd×n ,这样,将问题的复杂度由 O(m*n) 转换为 O(( m+n )*d)
计算 X Y 过程:首先用一个小于 1 的随机数初始化 Y ,并根据公式求 X ,此时就可以得到初始的 XY 矩阵了,根据平方差和得到的 X ,重新计算并覆盖 Y ,计算差平方和,反复进行以上两步的计算,直到差平方和小于一个预设的数,或者迭代次数满足要求则停止
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

潘永青

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值