一、协同过滤推荐概述
协同过滤(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相似度公式来计算,跟上面的物品相似度求法一样。计算完相似度后,就可以根据用户间的相似性,预测用户对未评分图书进行评分预测。
另外,欧几里得距离相似度、余弦值相似度、皮尔逊相关系数等多种方式当中的一种求出相似度。具体原理以及过程可以参考一下我之前整理的三篇博客
基于用户与基于物品两种推荐方式比较:
我们简单比较下基于用户的协同过滤和基于项目的协同过滤:基于用户的协同过滤需要在线找用户和用户之间的相似度关系,计算复杂度肯定会比基于基于物品的协同过滤高。但是可以帮助用户找到新类别的有惊喜的物品。而基于物品的协同过滤,由于考虑的物品的相似性一段时间不会改变,因此可以很容易的离线计算,准确度一般也可以接受,但是推荐的多样性来说,就很难带给用户惊喜了。一般对于小型的推荐系统来说,基于物品的协同过滤肯定是主流。但是如果是大型的推荐系统来说,则可以考虑基于用户的协同过滤,当然更加可以考虑我们的第三种类型,基于模型的协同过滤。
3、基于模型(model based)的协同过滤
基于模型的协同过滤算法,不同于上述两种,它往往先使用机器学习算法来预测用户对于某个物品的评分,一般来说,推荐系统会由 m 个用户和 n 个物品,用户对其中的部分物品进行评分,推荐系统中,物品数量往往及其巨大,单个用户不会对所有物品产生评分,所以用户-物品矩阵一般是一个稀疏矩阵。此时,只有部分用户和部分数据之间是有评分数据的,其它部分评分是空白,此时我们要用已有的部分稀疏数据来预测那些空白的物品和数据之间的评分关系,找到最高评分的物品推荐给用户。
一般对于这个问题,可以用机器学习的来建模解决,主流的方法可以分为:矩阵分解,关联算法,聚类算法,分类算法,回归算法,神经网络,图模型以及隐语义模型等。
基于矩阵分解的模型
