如切如磋,如琢如磨——《诗经.卫风.淇奥》
推荐算法:协同过滤推荐算法
协同过滤推荐算法,(英文名:Collaborative Filtering,简称CF),乃初代推荐算法也。
算法思想:协同过滤推荐算法(Collaborative Filtering)
核心思想:物以类聚,人以群分
- “跟你喜好相似的人喜欢的东西你也很有可能喜欢” :基于用户的协同过滤推荐(User-based CF)
- “跟你喜欢的东西相似的东西你也很有可能喜欢 ”:基于物品的协同过滤推荐(Item-based CF)
“协同过滤”本质上是一种集体智慧。
“协同过滤”实现方案很多,为稍作区分,有人将诸多方案划分为二:
- 其一,“基于内存的协同过滤(Memory-Based CF)”
- 其二,“基于模型的协同过滤(Model-Based CF)”
而为何如此划分,尚无固定结论,且界限模棱两可。在部分资料上有可能会见到有人以“是否借助机器学习算法思想实现”为由区分二者,笔者相对比较赞同这个理由。 因为Model-Based CF就相当于用机器学习算法的思想去把Memory-Based CF给“重构”了。
但注意:广义上讲,CF本身也可以算作机器学习算法的一种,不过这里大家可以直接认为笔者眼中的机器学习算法就是狭义的指如KNN、K-means、回归算法、神经网络算法等等这些我们耳熟能详的机器学习算法。
那么我们先来看下,基于内存的协同过滤推荐算法如何实现
章一 协同过滤推荐算法:基于内存的协同过滤
基于内存的协同过滤推荐算法依据用户和物品两个不同的维度又被分为:
- 基于用户的协同过滤推荐,User-based CF
- 基于物品的协同过滤推荐,Item-based CF
如上图,我们仅从用户-物品的喜好来看,可以初略估计用户1和用户2爱好相似,物品A和物品B是相似的;那么基于用户的推荐,用户2喜欢的物品,就可以推荐给用户1;基于物品的推荐,可以把物品B推荐给喜欢物品A的用户,在这里是用户3
由于从两个不同维度出发,推荐出来的结果往往有较大的差异,因此我们都需要进行研究。但有的领域,User-based CF的效果先天性的优于Item-based CF;有的领域反之,不过这都不是绝对的。到底哪个好,往往做了才知道。
相似性计算依据
上图例子中,我们认定用户1和用户2相似,物品A和物品B相似是基于“直觉”。但通常计算相似度有很多相似度计算方法,在协同过滤推荐中,用的相对较多的,一种是杰卡德相似系数、一种是皮尔逊相关系数。通常杰卡德相似系数常用在1,0类型布尔数据集上,皮尔逊相关系数通常用在数值数据集上。
因此对于如果是上图中的布尔数据,我们通常选用杰卡德相似系数。如果是评分数据,那么我们通常选用皮尔逊相关系数。
二者在使用中除了相似度实现方式不一样,其余操作都是一样的,因此后面的示例中,我们主要使用评分数据集来进行试验,也就是说我们主要是使用皮尔逊相关系数来计算相似度,并最终预测用户对物品的评分值。
数据集
这里我们使用MovieLens的ml-latest-small数据集
明确目标:目的是根据用户-电影的评分数据集,即ratings.csv,然后利用协同过滤推荐算法,预测用户对其他未知物品的评分,并作出推荐。
1.1 基于用户的协同过滤推荐
基于ml-latest-small数据集实现User-Based CF算法
基本流程:
- 加载数据集
- 计算用户间两两相似度
- 根据相似度预测评分
- 根据预测评分产生推荐结果
1.1.1 使用Pandas加载数据集,并转换为矩阵
import
1.1.2 计算用户间相似度(皮尔逊相关系数)
# ......
1.1.3 实现评分预测方法
评分预测基本公式:根据与近邻用户相似度加权求平均方式计算
# ......
1.1.4 预测全部评分
# ......
1.1.5 TOP-K推荐结果
def
1.2 基于物品的协同过滤推荐算法
基于ml-latest-small数据集实现Item-Based CF算法
基本流程:
- 加载数据集(同上)
- 计算物品间两两相似度(同上)
- 根据相似度预测评分
- 根据预测评分产生推荐结果(同上)
1.2.1 实现评分预测方法
评分预测基本公式:根据与近邻物品相似度加权求平均方式计算
def
1.3 面向对象封装User-Based CF和Item-Based CF
import