协同过滤(Collaborative Filtering)推荐算法是最经典、最常用的推荐算法。基本思想是:
根据用户之前的喜好以及其他兴趣相近的用户的选择来给用户推荐物品。
目前应用比较广泛的协同过滤算法是基于邻域的方法,主要有:
不管是 UserCF 还是 ItemCF 算法, 重点是计算用户之间(或物品之间)的相似度。
UserCF
杰卡德(Jaccard)相似系数
由于杰卡德相似系数一般无法反映具体用户的评分喜好信息,所以常用来评估用户是否会对某物品进行打分, 而不是预估用户会对某物品打多少分。
余弦相似度 余弦相似度衡量了两个向量的夹角,夹角越小越相似。余弦相似度的计算如下,其与杰卡德(Jaccard)相似系数只是在分母上存在差异
上述用户-物品交互矩阵在现实中是十分稀疏的,为了节省内存,交互矩阵会采用字典进行存储。在 sklearn
中,余弦相似度的实现:
from sklearn.metrics.pairwise import cosine_similarity
i = [1, 0, 0, 0]
j = [1, 0, 1, 0]
cosine_similarity([i, j])
皮尔逊相关系数
在用户之间的余弦相似度计算时,将用户向量的内积展开为各元素乘积和、皮尔逊相关系数与余弦相似度的计算公式非常的类似。
相较于余弦相似度,皮尔逊相关系数通过使用用户的平均分对各独立评分进行修正,减小了用户评分偏置的影响。在scipy
中,皮尔逊相关系数的实现:
from scipy.stats import pearsonr
i = [1, 0, 0, 0]
j = [1, 0.5, 0.5, 0]
pearsonr(i, j)
适用场景
基于用户的协同过滤(UserCF):
过程
计算用户之间的相似度
计算用户对新物品的评分预测
对用户进行物品推荐
User-based算法存在两个重大问题:
1. 数据稀疏性
2. 算法扩展性
由于UserCF技术上的两点缺陷, 导致很多电商平台并没有采用这种算法, 而是采用了ItemCF算法实现最初的推荐系统。
判断
召回率:在模型召回预测的物品中,预测准确的物品占用户实际喜欢的物品的比例。
精确率:推荐的物品中,对用户准确推荐的物品占总物品的比例。
如要确保召回率高,一般是推荐更多的物品,期望推荐的物品中会涵盖用户喜爱的物品。而实际中,推荐的物品中用户实际喜爱的物品占少数,推荐的精确率就会很低。故同时要确保高召回率和精确率往往是矛盾的,所以实际中需要在二者之间进行权衡。
覆盖率:推荐系统能够推荐出来的物品占总物品集合的比例。覆盖率表示最终的推荐列表中包含多大比例的物品。如果所有物品都被给推荐给至少一个用户, 那么覆盖率是100%
新颖度:用推荐列表中物品的平均流行度度量推荐结果的新颖度。 如果推荐出的物品都很热门, 说明推荐的新颖度较低。 由于物品的流行度分布呈长尾分布, 所以为了流行度的平均值更加稳定, 在计算平均流行度时对每个物品的流行度取对数。
基于物品的协同过滤(ItemCF):
协同过滤算法存在的问题之一就是泛化能力弱:
权重改进四法
base公式
对热门物品进行惩罚
控制对热门物品的惩罚力度
对活跃用户的惩罚
矩阵分解
协同过滤算法的特点:
为了使得协同过滤更好处理稀疏矩阵问题, 增强泛化能力。从协同过滤中衍生出矩阵分解模型(Matrix Factorization, MF)或者叫隐语义模型:
算法原理