##### 1.思想简介:
协同过滤,从字面上理解,包括协同和过滤两个操作。所谓协同就是利用群体的行为来做决策(推荐)。对于推荐系统来说,通过用户的持续协同作用,最终给用户的推荐会越来越准。而过滤,就是从可行的决策(推荐)方案(标的物)中将用户喜欢的方案(标的物)找(过滤)出来。协同过滤分为基于用户的协同过滤和基于标的物(物品)的协同过滤两类算法。
基于协同过滤的两种推荐算法,核心思想是很朴素的”物以类聚、人以群分“的思想。所谓物以类聚,就是计算出每个标的物最相似的标的物列表,我们就可以为用户推荐用户喜欢的标的物相似的标的物,这就是基于物品(标的物)的协同过滤。所谓人以群分,就是我们可以将与该用户相似的用户喜欢过的标的物的标的物推荐给该用户(而该用户未曾操作过),这就是基于用户的协同过滤。
基于协同过滤的两种推荐算法,核心思想是很朴素的”物以类聚、人以群分“的思想。所谓物以类聚,就是计算出每个标的物最相似的标的物列表,我们就可以为用户推荐用户喜欢的标的物相似的标的物,这就是基于物品(标的物)的协同过滤。所谓人以群分,就是我们可以将与该用户相似的用户喜欢过的标的物的标的物推荐给该用户(而该用户未曾操作过),这就是基于用户的协同过滤。具体思想可以参考下面的图
![在这里插入图片描述](https://upload-images.jianshu.io/upload_images/18154391-503b4d0a974da6f0?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
##### 2.算法原理
协同过滤的核心是怎么计算标的物之间的相似度以及用户之间的相似度。我们可以采用非常朴素的思想来计算相似度。我们将用户对标的物的评分(或者隐式反馈,如点击、收藏等)构建如下图为用户行为矩阵图:
![在这里插入图片描述](https://upload-images.jianshu.io/upload_images/18154391-ee1c54b556861294?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
矩阵的某个元素代表某个用户对某个标的物的评分,其中行向量代表某个用户对所有标的物的评分向量,列向量代表所有用户对某个标的物的评分向量。有了行向量和列向量,我们就可以计算用户与用户之间、标的物与标的物之间的相似度了。具体来说,行向量之间的相似度就是用户之间的相似度,列向量之间的相似度就是标的物之间的相似度。
![在这里插入图片描述](https://upload-images.jianshu.io/upload_images/18154391-a2901a56fc5c14bc.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
相似度的计算可以采用cosine余弦相似度算法来计算两个向量(可以是上图中的行向量或者列向量)之间的相似度:
计算完了用户(行向量)或者标的物(列向量)之间的相似度,那么下面说说怎么为用户做个性化推荐。
##### 2.1基于用户的协同过滤推荐:
用户u对标的物s的喜好度sim(u,s)可以采用如下公式计算,其中U是与该用户最相似的用户集合(我们可以基于用户相似度找到与某用户最相似的K个用户),score(ui,s)是用户ui对标的物的喜好度(对于隐式反馈为1,而对于非隐式反馈,该值为用户对标的物的评分),sim(u,ui)是用户ui 与用户u的相似度。
![在这里插入图片描述](https://upload-images.jianshu.io/upload_images/18154391-fcf9eec8972a4710.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
有了用户对每个标的物的评分,基于评分降序排列,就可以取topN推荐给用户了。
##### 2.2基于标的物的协同过滤:
用户u对标的物s的喜好度sim(u,s)可以采用如下公式计算,其中S是所有用户操作过的标的物的列表,score(u,si) 是用户u对标的物si的喜好度,sim(si,s)是标的物 与s的相似度。
![在这里插入图片描述](https://upload-images.jianshu.io/upload_images/18154391-b72503e3921bfc4c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
有了用户对每个标的物的评分,基于评分降序排列,就可以取topN推荐给用户了。
##### 3.实践部分
##### 3.1基于标的物的协同过滤python实践
(1)准备数据
数据格式: uid,itemid,score(ui矩阵)
![](https://upload-images.jianshu.io/upload_images/18154391-e225e3eb6b4d0ae9.png?imageMogr2/auto-orient/strip%7CimageVi