前言
之前朋友说有同学在面字节算法实习时让复现DeepFM算法(包括训练),然后就懵了。因此最近在整理传统推荐算法的一些内容时,大概是这样的:

就想到「基于邻域的协同过滤(UserCF与ItemCF),除了了解原理、应用场景的区别外,如果现场写实现伪代码你会么?」 有很多文章在讲协同过滤的原理,很少具体到代码,所以这次把以前写的CF代码优化下进行分享。
本文约1.7k字,预计阅读5分钟.
概要
协同过滤是「基于用户行为」设计的推荐算法,具体来说,是「通过群体的行为来找到某种相似性」(用户之间的相似性或者物品之间的相似性),通过相似性来为用户做决策和推荐。当然,协同过滤有基于邻域的、隐语义模型等,这里我们主要指的是基于邻域的ItemCF和UserCF。具体的原理就不多做解释了,见下图:

ItemCF与UserCF的代码其实很相近,因此以ItemCF为例,两个算法的具体代码可以在github:https://github.com/ZiyaoGeng/SimpleCF(阅读原文)中找到。
ItemCF
对于ItemCF算法的实践,我采用类的方式进行建立,主要内容包括:
模型的输入;
初始化【计算相似度矩阵】;
对单个用户进行推荐;
对测试集的所有内容进行推荐;
因此大体框架为:
class ItemCF:
def __init__(self, user_item_dict, item_hot_list, sim_item_topK, topN, i2i_sim=None):
"""
Item-based collaborative filtering
:param user_item_dict: A dict. {user1: [(item1, score),...], user2: ...}
:param item_hot_list: A list. The popular movies list.
:param sim_i