Skip to content

实现了一系列常见的推荐算法,如UserCF,ItemCF,SVD等,包含“切分训练集与测试集-训练模型-推荐-评估”一整套流程。

Notifications You must be signed in to change notification settings

JustinZhang6/Recommend-system

Repository files navigation

Recommend-system

实现了一系列常见的推荐算法,包含“切分训练集与测试集-训练模型-推荐-评估”一整套流程。

实现算法

User Based Collaborative Filtering(基于User的协同过滤)
Item Based Collaborative Filtering(基于Item的协同过滤)
矩阵分解
基于内容的推荐算法 (进行中)
基于神经网络的协同过滤 Neural Collaborative Filtering (包括:GMF/ MLP/ Neural MF)(都基于pytorch写的)

数据集

Movielens 1M数据集ml-1m.zip

评价指标:

指标一:Precision、Recall、Coverage、Popularity
指标二:MSE、RMSE
指标三:HR、NDCGM

运行

  1. 下载数据集

    下载,并解压到项目Recommend-system文件夹下

  2. 运行代码
    eg:
    python item_cf.py
    python user_cf.py
    python GMF.py --batch_size 256 --lr 0.01 --n_emb 32 --epochs 30

注意事项

电影推荐结果可能被注释掉了,如果需要此部分数据可自行修改代码。

UserCF算法中,由于用户数量多,生成的相似性矩阵也大,会占用比较多的内存。

ItemCF算法中,每次推荐都需要找出一个用户的所有电影,再为每一部电影找出最相似的电影,运算量比UserCF大,因此推荐的过程比较慢。

算法思想

基于协同过滤的方法

UserCF

基本思想:相似的用户可能喜欢相似的产品,根据其它用户看的电影+用户相似度,来预测和推荐产品。
核心:计算用户之间的相似度
相似度计算方法:

简单法:

对用户a和b,N为数量:

  Sim(a,b) = N(a和b共同看过的电影数量) / math.sqrt(N(a单独看过的电影数量) * N(b单独看过的电影数量))

皮尔森系数:

userCF-sim1
userCF-prid1

ItemCF

基本思想:相似的产品可能有相似的评价,根据当前用户已评价过的产品+产品相似度,可预测和推荐产品。
核心:计算产品之间的相似度
相似度计算方法:

对产品x和y,N为数量:

  Sim(x,y) = N(产品x和y同时被一个人用过的次数) / math.sqrt(N(x单独被用过的次数)* N(y单独被用过的次数))

表示如图:
itemCF-sim+calu

两种协同过滤存在的问题

  • 都是基于评分矩阵打分,即用户需要有打分如5分,7分,数据获取难。
  • 用户打分准确度
  • 矩阵稀疏严重
  • 冷启动问题严重(新用户/产品的推荐)
    不适用于大多真实场景,比如实际有大量用户与产品,难以找最近邻居。

改进思路

  • 隐式打分:点击、网页浏览、浏览时间、文件下载情况

用户冷启动问题:

  • 激励用户主动评分选择倾向
  • 基于用户个性

产品冷启动问题:

  • 基于内容的方法
  • 基于专家的方法

两者应用分析

针对新闻类网站,可以采用UserCF。因为用户大都关注热门新闻,个性化要求不强,热门程度和实效性是推荐的重点;ItemCF需要维护一张物品相似度表,当物品更新速度较快时,表的维护成本太高。

针对电商、音乐、图书类网站,可以采用ItemCF。因为用户的兴趣喜好相对稳定,个性化要求较高,同时对实效性要求不高。 cf_comp.jpg

基于模型的方法

往往需要很大的算力,在线下预处理,在预测的时候可以直接基于模型预测。
常见的有:

  • 基于矩阵分解MF的方法:SVD、PCA。也有一些经典变形:如PMF/SVD++/NMF/FunkSVD/BiasSVD/timeSVD/ConvMF
  • 基于关联规则挖掘的方法
  • 基于概率的方法:贝叶斯网络。思路是给定打分矩阵,根据如贝叶斯理论,算出可能喜欢的概率。也有复杂的模型如聚类模型、pLSA主题模型等。
  • 基于机器学习的方法
  • 基于深度学习的方法

SVD 及其部分变形

svd1.jpg
svd2.jpg

基于神经网络的协同推荐

NeuralCF模型实际上提出了一个模型框架,它基于用户向量和物品向量这两个Embedding层,利用不同的互操作层进行特征的交叉组合,并且可以灵活地进行不同互操作层的拼接。从这里可以看出深度学习构建推荐模型的优势----利用神经网络理论上能够拟合任意函数的能力,灵活地组合不同的特征,按需增加或减少模型的复杂度。

NeuralCF模型也存在局限性。由于是基于协同过滤的思想进行改造的,所以NeuralCF模型并没有引入更多其他类型的特征,这在实际应用中无疑浪费了其他有价值的信息。此外,对于模型中互操作的种类并没有做进一步的探究和说明。这都需要后来者进行更深入的探索。

原理详细可见论文解析 https://zhuanlan.zhihu.com/p/131274333

###代码说明:
代码参考了原论文作者的代码实现,库地址
models目录中包含性能最佳的GMF和MLP模型。
data_proc.py 包含了如何为实验准备数据。
对于Linux系统,可以采用shell命令快速进行,如:

source activate pytorch
python GMF.py --batch_size 256 --lr 0.01 --n_emb 8 --epochs 30
python GMF.py --batch_size 256 --lr 0.001 --n_emb 8 --epochs 30
python GMF.py --batch_size 512 --lr 0.01 --n_emb 8 --epochs 30
python GMF.py --batch_size 512 --lr 0.001 --n_emb 8 --epochs 30
python GMF.py --batch_size 1024 --lr 0.01 --n_emb 8 --epochs 30
python GMF.py --batch_size 1024 --lr 0.001 --n_emb 8 --epochs 30
python MLP.py --batch_size 256 --lr 0.01 --layers "[32, 16, 8]" --epochs 30
python MLP.py --batch_size 256 --lr 0.001 --layers "[32, 16, 8]" --epochs 30
python MLP.py --batch_size 512 --lr 0.01 --layers "[32, 16, 8]" --epochs 30
python MLP.py --batch_size 512 --lr 0.001 --layers "[32, 16, 8]" --epochs 30
python MLP.py --batch_size 1024 --lr 0.01 --layers "[32, 16, 8]" --epochs 30
python MLP.py --batch_size 1024 --lr 0.001 --layers "[32, 16, 8]" --epochs 30
python MLP.py --batch_size 256 --lr 0.01 --layers "[64, 32, 16]" --epochs 30
python MLP.py --batch_size 256 --lr 0.01 --layers "[128, 64, 32]" --epochs 30
python MLP.py --batch_size 256 --lr 0.01 --layers "[256, 128, 64]" --epochs 30
python NeuralMF.py --batch_size 1024 --lr 0.001 --n_emb 32 --layers "[128, 64, 32]" --mf_pretrain "pytorch_GMF_bs_256_lr_0001_n_emb_32.pt" --mlp_pretrain "pytorch_MLP_bs_256_reg_00_lr_001_n_emb_64_ll_32_dp_wodp.pt"  --learner "SGD" --epochs 10
python NeuralMF.py --batch_size 1024 --lr 0.001 --n_emb 32 --layers "[128, 64, 32]"  --mf_pretrain  "pytorch_GMF_bs_256_lr_0001_n_emb_32.pt"  --mlp_pretrain "pytorch_MLP_bs_256_reg_00_lr_001_n_emb_64_ll_32_dp_wodp.pt"  --freeze 1 --learner "SGD" --epochs 10

参考资料

相关课件
https://github.com/Lockvictor/MovieLens-RecSys
https://www.cnblogs.com/lzllovesyl/p/5243370.html
https://blog.csdn.net/zhongkejingwang/article/details/43053513
https://blog.csdn.net/zhongkejingwang/article/details/43083603
基于神经网络的协同推荐上更多pytorch外的实现或参数比较:https://github.com/jrzaurin/neural_cf

About

实现了一系列常见的推荐算法,如UserCF,ItemCF,SVD等,包含“切分训练集与测试集-训练模型-推荐-评估”一整套流程。

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages