Recommendation-systems
基于pandas+scipy的推荐系统实战工作坊,覆盖协同过滤与关联规则挖掘两种核心范式
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
基于pandas+scipy的推荐系统实战工作坊,覆盖协同过滤与关联规则挖掘两种核心范式
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
想象一下这样的场景:你走进一家超市,购物车里只有几样东西,收银台旁边的屏幕却精准地弹出"购买了全脂牛奶的顾客通常也会买面包和鸡蛋"——这就是推荐系统在默默工作。从电商的"猜你喜欢"到视频网站的"为您推荐",推荐系统早已渗透进我们数字生活的每个角落。今天要介绍的这个开源项目,正是帮助开发者和学生系统掌握推荐系统核心技术的实战工作坊。
piyushpathak03/Recommendation-systems 是由印度机器学习工程师 Piyush Pathak 创建的推荐系统教学仓库,于2019年前后在 GitHub 发布,至今已获得 215 颗星和 57 次 fork,被标注为 GPL-3.0 开源协议。作为一个教学性质的代码仓库,它不以生产级实现为目标,而是将推荐系统的理论框架与 Python 实现一一对应,让学习者能够"知其然更知其所以然"。
推荐系统是机器学习最成熟的应用领域之一,从早期的协同过滤到如今大模型驱动的个性化推荐,技术栈持续演进。Piyush 的工作坊覆盖了从经典统计方法到深度学习模型的完整技术谱系,对于想系统建立推荐系统知识体系的开发者来说,是一个不错的起点。
仓库主要由两个 Jupyter Notebook 组成,分别对应推荐系统的两大核心范式。
这是仓库的主体内容,包含 39 个代码单元,系统讲解了基于协同过滤的推荐系统构建流程。整个 Notebook 分为两条主线:
Item-based(基于物品)协同过滤:核心思路是"喜欢物品 A 的人通常也喜欢物品 B",因此只要计算出物品之间的相似度,就能为用户推荐与其历史偏好物品相似的其他物品。该实现使用 余弦相似度(Cosine Similarity) 作为相似度度量,计算逻辑是对每一对物品的评分向量计算夹角余弦值(1 - cosine distance),值越接近 1 表示相似度越高。关键代码为 1-cosine(data_cf.iloc[:,i], data_cf.iloc[:,j]),通过 scipy.spatial.distance.cosine 实现。Notebook 演示了如何将长格式数据(Person, item, Quantity)通过 pivot() 方法转换为用户-物品评分矩阵(宽格式),并基于该矩阵计算物品相似度矩阵。
User-based(基于用户)协同过滤:思路反过来——"与你口味相似的人也喜欢 X",通过计算用户之间的行为相似度,找到目标用户的最近邻,然后根据最近邻的偏好来推荐物品。核心函数 getScore(history, similarities) 实现了加权评分预测:对目标用户的已评分物品,计算每个物品的加权平均分(相似度为权重),从而生成推荐列表。
值得注意的是,代码使用 print data_recommend.iloc[:10,:4] 这种 Python 2 语法,说明代码编写时间较早,尚未全面适配 Python 3,但基本逻辑在 Python 3 环境下也能正常运行。
这个 Notebook 实现了 Apriori 算法的完整版本,用于从购物篮数据中发现商品之间的关联规则。Apriori 是关联规则挖掘的经典算法,其核心思想是:如果某个项集是频繁的,那么它的所有子集也一定是频繁的——基于这一先验知识,可以大幅减少候选项集的生成数量。
MBA Notebook 包含四个核心函数:tokenize() 负责将 CSV 文件转换为事务列表(每个事务是一组商品的集合);frequent_itemsets() 实现候选项集的逐层生成(从单项集到二项集再到三项集),使用 SUPP_THRESHOLD = 100(支持度阈值)过滤非频繁项集;measures() 计算关联规则的三度度量——置信度(Confidence)、提升度(Lift) 和 卷积度(Conviction),分别衡量规则的可信度、关联强度和反向独立性;generate_rules() 则枚举所有满足阈值的关联规则,其中置信度阈值 0.4、提升度阈值 20.0、卷积度阈值 5.0。
数据集使用 groceries.csv 和 groceries_mba.csv,包含杂货店顾客的购买记录,每行代表一个"用户-商品"交互。
从代码分析来看,该项目的技术选型非常简洁,核心依赖只有三个库:
README 中还列出了作者推荐的一系列进阶工具库,涵盖推荐系统的各个子领域:深度学习推荐库(TensorRec、Spotlight、TFranking)、矩阵分解库(Implicit、QMF、LightFM、Surprise)、相似度搜索库(Annoy、NMSLib、FAISS)——这些并非本仓库内置,而是作者建议读者进一步探索的方向。
从代码架构来看,这是一个典型的 Notebook-as-curriculum(笔记本即课程) 模式:每个代码单元高度独立,配有 Markdown 说明,适合逐步执行、边学边练。这种模式在教学场景中非常流行,也是 Kaggle 竞赛和 Coursera 课程的常见格式。
作为教学代码仓库,该项目在部署方面没有任何特殊优化。无 Dockerfile、无 docker-compose、无 Web 界面、无预训练模型文件,部署本质上是"把代码 clone 下来,用 Jupyter 打开运行"。
环境要求极低:仅需 Python 3.6+、Jupyter Notebook 和 pip,通过 pip install pandas scipy 即可安装全部依赖。不需要 GPU,内存 4GB 以上即可流畅运行整个 Notebook(作者在代码注释中也提示"For only 500 users. Might be slow beyond that")。
快速启动方式:
git clone https://github.com/piyushpathak03/Recommendation-systems.git
cd Recommendation-systems
pip install pandas scipy jupyter
jupyter notebook
然后在浏览器中打开 Notebook,依次运行每个代码单元即可。数据集 groceries.csv 已内置在仓库 data/ 目录下,无需额外下载。
必须坦诚地说,这个仓库并非没有缺点,在使用时需要心中有数。
Python 2 语法遗留问题:部分代码(如 print data_recommend.iloc[:10,:4] 和 .iteritems())使用的是 Python 2 语法,在 Python 3 环境下执行会报错,需要手动替换为 print() 函数和 .items() 方法。
性能未经优化:协同过滤部分的相似度矩阵计算使用了双层 for 循环逐对计算,在物品数量较大时会非常慢。真实推荐系统会用向量化的矩阵运算(NumPy dot product)或专门的近似最近邻库(Annoy、FAISS)来加速,这里为了教学清晰性牺牲了性能。
缺乏模型持久化:整个仓库是"一次性"的 Notebook——每次运行都是从头计算,没有模型保存和加载的演示。如果要在生产环境中使用,需要额外的序列化步骤。
教学深度有限:Notebook 主要覆盖基于相似度的传统协同过滤,没有涉及矩阵分解(SVD/SVD++)、深度学习推荐模型(Wide & Deep、DIN)或在线学习等进阶主题。README 中虽然列出了这些方向,但并未提供实现代码。
尽管存在上述局限,这个项目在推荐系统的学习路径中仍占有一席之地。
从行业角度看,推荐系统的技术演进经历了三个阶段:统计协同过滤(2000-2010年,Amazon年代)、矩阵分解时代(2010-2018年,Netflix Prize 推动)、深度学习时代(2018年至今,YouTube Deep Neural Networks for YouTube Recommendations 论文为标志性事件)。本仓库恰好位于第一阶段的尾声,帮助学习者打好统计学基础——理解"相似度"和"关联规则"这些核心概念,比直接上手深度学习模型更有利于建立系统性的认知。
对于 AI 爱好者而言,这个仓库提供了一个低门槛的入口:通过亲手运行代码,直观感受推荐系统如何"猜中"用户喜好,是建立直觉认知的好方式。对于 AI 开发者而言,仓库中规范的数据处理流程(长格式→宽格式→相似度计算→Top-K推荐)和 Apriori 算法的完整实现,可以作为自己项目的参考模板。
piyushpathak03/Recommendation-systems 是一个定位清晰的推荐系统入门工作坊,以协同过滤和关联规则挖掘为核心,用纯 Python(pandas + scipy)实现了从数据处理到推荐生成的全流程。它不是生产级项目,而是一本用代码写成的教材——适合作为推荐系统学习的"第一章",帮助读者建立对推荐算法核心思想的直观理解。如果你已经有了机器学习基础,想快速了解推荐系统怎么从零开始,这个仓库值得花一个下午动手跑一遍。