[TOC]
推荐系统(recommender system or recommendation system) 有时也称为推荐平台或推荐引擎(platform or engine),是Information filtering system的一个子类。
Collaborative filtering
Content-based filtering
Session-based recommender systems
Reinforcement learning for recommender systems
Multi-criteria recommender systems
Risk-aware recommender systems
Mobile recommender systems
Hybrid recommender systems
推荐问题解决的问题归纳为给用户u推荐物品i,并且满足用户偏好、新奇度和多样性等
比如评分相关的推荐算法Surprise
协同过滤和矩阵分解是常用的方法。
数据格式:user item rating timestamp(时间戳可以不要)
由原始数据组成的用户-物品的评分矩阵(User-Item Matrix)
. | I1 | I2 | I3 | I4 | I5 |
---|---|---|---|---|---|
A | 5 | 4 | 4.5 | ? | 3 |
B | ? | 4 | ? | 4 | ? |
C | 4 | ? | 3.5 | 4 | 3 |
D | ? | 5 | ? | ? | 3 |
E | 4 | ? | 4.5 | 5 | ? |
我需要找到一个矩阵\(\hat{R}\)近似未知的矩阵\(R\) | |||||
\[R \approx \hat{R} = Q^TP\] |
损失函数
上面只是最简单的原理介绍
详细使用方法以及公式,见Matrix Factorization-based algorithms
Matrix Factorization: A Simple Tutorial and Implementation in Python
collaborative filtering
基于邻域的协同过滤算法:knns.KNNBasic;knns.KNNWithMeans;
knns.KNNWithZScore;knns.KNNBaseline;
主要参数:
k:设置领域的个数;
user_based:是否为基于用户的协同过滤,True则为UserCF,False为ItemCF;
name:相似度计算方式,默认为MSD,也可设置为cosine,pearson,pearson_baseline
KNNBasic
surprise.prediction_algorithms.knns.KNNBasic(k=40, min_k=1, sim_options={}, verbose=True, **kwargs)
user_based=True
KNNWithMeans
surprise.prediction_algorithms.knns.KNNWithMeans(k=40, min_k=1, sim_options={}, verbose=True, **kwargs)
该方法认为,每个用户的打分跟用户本身的习惯有关,都是基于某一个特定值上下浮动。
KNNWithZScore
surprise.prediction_algorithms.knns.KNNWithZScore(k=40, min_k=1, sim_options={}, verbose=True, **kwargs)
该算法通过同时考虑均值和方差来对标准的KNN推荐算法进行改进
KNNBaseline
surprise.prediction_algorithms.knns.KNNBaseline(k=40, min_k=1, sim_options={}, bsl_options={}, verbose=True, **kwargs)
该算法不再使用传统的统计指标,而是允许使用自定义的计算方法来为每一个用户计算一个一个基准值。
collaborative filtering
例如下面表格里有3个用户对4个物品的评分
101 | 102 | 103 | 104 | |
---|---|---|---|---|
UserX | 5 | 3.5 | ||
UserY | 2 | 5 | 4 | 2 |
UserZ | 4.5 | 3.5 | 1 | 4 |
求物品两两之间的差值平均分: | ||||
物品102和101:{(3.5-5)+(5-2)+(3.5-4.5)}/3=0.5/3 | ||||
物品103跟101:{(4-2)+(1-4.5)}/2=-1.5/2 | ||||
物品104跟101:{(2-2)+(4-4.5)}/2=-0.5/2 | ||||
物品103跟102:{(4-5)+(1-3.5)}/2=-3.5/2 | ||||
物品104跟102:{(2-5)+(4-3.5)}/2=-2.5/2 | ||||
物品104跟103:{(2-4)+(4-1)}/2=1/2 | ||||
能得到下面表格 | ||||
101 | 102 | 103 | 104 | |
----- | ------- | ------- | ----- | ----- |
101 | ||||
102 | 0.17 | |||
103 | -0.75 | -1.75 | ||
104 | -0.25 | -1.25 | 0.5 | |
OK,现在准备工作已经完成了,然后进行推荐,例如对X用户进行推荐,103和104个预测评分根据101、102的评分来的。 | ||||
X预测103评分={(-0.75+5)+(-1.75+3.5)}/2=(4.25+1.75)/2=3 | ||||
X预测104评分={(-0.25+5)+(-1.25+3.5)}/2=(4.75+2.25)/2=3.5 | ||||
那么给X用户推荐的顺序就是:先推荐104在推荐103 |
collaborative filtering
协同聚类\({C_{ui}}\) 的均值(聚类质心)\(\overline{C_{ui}}\)
聚类\({C_u}\)(基于user) 的均值(聚类质心)\(\overline{C_{u}}\)
聚类\({C_i}\)(基于item) 的均值(聚类质心)\(\overline{C_{i}}\)
cc = CoClustering(n_cltr_u=3,n_cltr_i =2)
cc.avg_cltr_i.shape # (2,)
cc.avg_cltr_u.shape # (3,)
cc.avg_cocltr.shape # (3,2)
Collaborative Filtering
比如根据用户行为相关的推荐算法implicit
隐式反馈特征
相对于显示反馈数据,隐式反馈有以下几方面特征
原始数据格式1:userId itemId eventType value
原始数据格式2:eventType event_weight
转换数据格式1:userId itemId total_weight
转换数据格式1-2:pd.factorize(userId) pd.factorize(itemId) total_weight (主要是减少存储)
最终数据格式:
压缩稀疏行矩阵:item_user_sparse_matrix = csr_matrix((df['weight'], (df['iid'], df['uid'])))
coo_matrix:坐标格式的稀疏矩阵
csr_matrix:压缩稀疏行矩阵
基类RecommenderBasehttps://implicit.readthedocs.io/en/latest/models.html
fit(item_user=csr_matrix)方法:
rank_items(userid=user_id, user_items=None, selected_items=selected_items_ids, recalculate_user=False)
方法:指定用户(user_id)对指定物品集合(selected_items_ids)进行排名,返回物品排序列表(List of (itemid, score) tuples,仅仅返回指定的物品集合selected_items)
recommend(userid=user_id, user_items=None, N=5, filter_already_liked_items=False, filter_items=list(排除列表), recalculate_user=False)
方法:指定用户(user_id)并设置相关过滤条件, 返回TOP-N物品推荐列表(List of (itemid, score) tuples);
recommend_all()为多个用户推荐TOP-N
https://implicit.readthedocs.io/en/latest/lmf.html
similar_items(itemid=item_id, N=5, react_users=None, recalculate_item=False)
方法:指定物品(item_id), 返回TOP-N类似物品列表(List of (itemid, score) tuples);
similar_users(userid=user_id, N=5)
方法:指定用户(user_id), 返回TOP-N类似用户列表(List of (userid, score) tuples);
item_factors
属性:
user_factors
属性:
AlternatingLeastSquares交替最小二乘法
在矩阵分解(matrix factorization)中使用的一种算法。有一个稀疏矩阵,假设这个矩阵是低阶的,可以分解成两个小矩阵相乘。然后交替对两个小矩阵使用最小二乘法,算出这两个小矩阵,就可以估算出稀疏矩阵缺失的值:
AlternatingLeastSquares(factors=潜在特征因子数量, regularization=0.1, iterations=迭代次数)
潜在特征因子数量就类似与前面交替最小二乘法示意图中介绍的User Feature Matrix和Movie Feature Matrix.(f1,f2,f3; factors=3)
BayesianPersonalizedRanking贝叶斯个性化排序
BPR: Bayesian Personalized Ranking from Implicit Feedback
BayesianPersonalizedRanking(factors=潜在特征因子数量, learning_rate =SGD学习速率, regularization=0.1, iterations=迭代次数)
LogisticMatrixFactorization
Logistic Matrix Factorization for Implicit Feedback Data
BayesianPersonalizedRanking(factors=潜在特征因子数量, learning_rate =SGD学习速率, regularization=0.1, iterations=迭代次数, neg_prop=30)
Approximate Alternating Least Squares近似交替最小二乘
实现一:NMSLibAlternatingLeastSquares,基于NMSLib
利用NMSLib建立潜在因子的近似最近邻指数,加速交替最小二乘模型的速度。
实现二:AnnoyAlternatingLeastSquares,基于 Annoy index
使用一个Annoy index来计算相似的items和推荐的items。
实现三:FaissAlternatingLeastSquares,基于 Faiss
利用Faiss建立潜在因子的近似最近邻指数,加速交替最小二乘模型的速度。
以上所有模型都是基于MatrixFactorizationBase -> 基于RecommenderBase
最近邻模型使用Cosine,TFIDF或BM25作为距离度量
from implicit.nearest_neighbours import ItemItemRecommender,CosineRecommender,TFIDFRecommender,BM25Recommender
ItemItemRecommender ->基于RecommenderBase
CosineRecommender,TFIDFRecommender,BM25Recommender-> 基于ItemItemRecommender
Collaborative Filtering for Implicit Feedback Datasets
Applications of the Conjugate Gradient Method for Implicit Feedback Collaborative Filtering.
针对隐式和显式反馈的混合模型——LightFM
https://github.com/lyst/lightfm
lightfm.LightFM(no_components=10, k=5, n=10, learning_schedule=’adagrad’, loss=’logistic’, learning_rate=0.05, rho=0.95, epsilon=1e-06, item_alpha=0.0, user_alpha=0.0, max_sampled=10, random_state=None)
四个可选的损失函数:
参数:
变量:
方法:
LightFM模型评估
自带数据集
数据集建设(自定义数据集)
lightfm.data.Dataset(user_identity_features=True, item_identity_features=True)
用于构建交互和特征矩阵的工具,负责处理用户/项目ID与特征名称和内部特征索引之间的映射。
参考
创建数据集类的实例。-调用fit(或fit_partial)
使用(user id, item id) 或 (user id, item id, weight) 的可迭代项调用build_interactions来构建交互和权重矩阵。
build_interactions(data=(iterable of (user_id, item_id) or (user_id, item_id, weight)) )weight如果未提供,默认1
使用(user / item id,[features])或(user / item id,{feature:feature weight})的可迭代项调用build_user / item_features来构建特征矩阵。
要添加新的用户/商品ID或功能,请再次调用fit_partial。您将需要调整LightFM模型的大小,才能使用新功能。