协同过滤算法
创始人
2024-05-02 00:00:06

00 协同过滤算法基本原理

协同过滤:通过群体的行为来找到某种相似性(用户之间的相似性或者物品之间的相似性),通过相似性来为用户做决策和推荐

基于用户的协同过滤算法(UserCF)的基本原理:给用户推荐和他兴趣相似的其他用户喜欢的物品。

基于物品的协同过滤算法(ItemCF)的基本原理:给用户推荐和他之前喜欢的物品相似的物品。


01 基于用户的协同过滤算法(UserCF)

1.1 UserCF的算法流程

  1. 根据用户的历史行为,获取用户之间的共现矩阵C[u][v]=∣N(u)⋂N(v)∣C[u][v]=|N(u) \bigcap N(v)|C[u][v]=∣N(u)⋂N(v)∣
  2. 根据共现矩阵得到用户与用户之间的相似矩阵W[u][v]=C[u][v]∣N(u)∣∗∣N(v)∣W[u][v]= \frac{C[u][v]}{|N(u)| * |N(v)|}W[u][v]=∣N(u)∣∗∣N(v)∣C[u][v]​
  3. 根据用户之间的相似矩阵找到topK个相似的用户作为和目标用户兴趣相似的用户集合,并找到这个集合中属于这个集合中用户喜欢但目标用户没有出现的物品列表,对物品列表中的物品计算兴趣程度p(u,i)=∑W[u][v]p(u, i) = \sum {W[u][v]}p(u,i)=∑W[u][v],按照兴趣程度排序推荐给目标用户

首先建立与物品发生行为的用户列表,令C[u][v]C[u][v]C[u][v]表示用户u和用户v相同物品的个数,N[u]N[u]N[u]表示用户u的物品数,遍历每个物品的用户列表,将用户列表中的两两用户对应的C[u][v]C[u][v]C[u][v]加1,同时计算N[u]N[u]N[u],最后计算用户之间的相似矩阵W[u][v]W[u][v]W[u][v];推荐物品时,先从相似矩阵中得到目标用户topK个相似用户,然后计算属于这topK个用户但不属于目标用户的所有物品的兴趣程度值即可。

1.2 UserCF的代码实现

import math
def UserSimilarity(train):item_users = dict()for user, items in train.items():for item in items.keys():if item not in item_users:item_users[item] = set()item_users[item].add(user)C = dict()N = dict()for item, users in item_users.items():for u in users:N[user] += 1for v in users:if u == v:continueC[u][v] += 1W = dict()for u, related_users in C.items():for v, cuv in related_users.items():W[u][v] = cuv / math.sqrt(N[u] * N[v])return W
def Recommand(user, train, W, K):rank = dict()interacted_items = train[user]for v, wuv in sorted(W[user].items, key=lambda x: x[1], reverse=True)[:K]:for i, rvi in train[v].items:if i in interacted_items:continuerank[i] += wuvreturn rank

02 基于物品的协同过滤算法(ItemCF)

2.1 ItemCF的算法流程

  1. 根据用户的历史行为,获取物品之间的共现矩阵C[i][j]=∣N(i)⋂N(j)∣C[i][j]=|N(i) \bigcap N(j)|C[i][j]=∣N(i)⋂N(j)∣
  2. 根据共现矩阵得到物品之间的相似矩阵W[i][j]=C[i][j]∣N(i)∣∗∣N(j)∣W[i][j]= \frac{C[i][j]}{|N(i)| * |N(j)|}W[i][j]=∣N(i)∣∗∣N(j)∣C[i][j]​
  3. 根据相似矩阵找到目标用户发生行为的物品列表中每个物品对应的topK个物品,并计算目标用户对每个物品对应的topK个物品的兴趣程度p(u,i)=∑W[i][j]p(u, i)= \sum W[i][j]p(u,i)=∑W[i][j],按照兴趣程度排序推荐给目标用户

2.2 ItemCF的代码实现

import math
def ItemSimilarity(train):C = dict()N = dict()for u, items in train.items():for i in items:N[i] += 1for j in items:if i == j:continueC[i][j] += 1W = dict()for i, related_items in C.items():for j, cij in related_items.items():W[i][j] = cij / math.sqrt(N[i] * N[j])return Wdef Recommendation(train, user_id, W, K):rank = dict()ru = train[user_id]for i, pi in ru.items():for j, wij in sorted(W[i].items(), key=lambda x: x[1], reverse=True)[:K]:if j in ru:continuerank[j] += wijreturn rank

03 协同过滤算法的改进

3.1 相似度的改进IUF

用户(物品)相似度的计算公式为
wuv=∣N(u)⋂N(v)∣∣N(u)∣∣N(v)∣w_{uv} = \frac{|N(u) \bigcap N(v)|}{\sqrt{|N(u)| |N(v)|}} wuv​=∣N(u)∣∣N(v)∣​∣N(u)⋂N(v)∣​
相似度的计算实际上更大程度会受活跃用户(物品)的影响比较大,所以计算相似度应该活跃用户(物品)对物品的相似度的贡献应该小于不活跃的用户(物品),现引入IUF(Inverse User Frequence),即用户(物品)活跃度对数的倒数的参数,来修正相似度,公式如下:
wuv=∑i∈N(u)⋂N(v)1log(1+∣N(i)∣)∣N(u)∣∣N(v)∣w_{uv} = \frac{\sum_{i \in N(u) \bigcap N(v)} \frac{1}{log(1+|N(i)|)}}{\sqrt{|N(u)| |N(v)|}} wuv​=∣N(u)∣∣N(v)∣​∑i∈N(u)⋂N(v)​log(1+∣N(i)∣)1​​

3.2 相似度的归一化Norm

一般来说,热门物品相似度比较大,所以推荐的物品大多数是推荐比较热门里的物品,因此,推荐的覆盖率就比较低,如果进行相似度的归一化,就可以提供推荐的覆盖率

相似度归一化公式为
wij=wijmaxjwijw_{ij} = \frac{w_{ij}}{max_{j} w_{ij}} wij​=maxj​wij​wij​​

04 ItemCF和UserCF的对比

指标UserCFItemCF
性能适用于用户较少的场合,如果用户很多,计算用户相似度矩阵代价很大适用于物品数明显小于用户数的场合,如果物品很多,计算物品相似度矩阵代价很大
领域时效性较强,用户个性化兴趣不太明显的领域长尾物品丰富,用户个性化需求强烈的领域
实时性用户有新行为,不一定造成推荐结果的立即变化用户有新行为,一定会造成推荐结果的实时变化
冷启动在新用户对很少的物品产生行为后,不能立即对他进行个性化推荐,因为用户相似度矩阵是每隔一段时间离线计算的新用户只要对一个物品产生行为,就可以给他推荐和该物品相关的其他物品

05 参考资料

[1] 协同过滤推荐算法总结
[2] 最小推荐系统:协同过滤(Collaborative Filtering)

相关内容

热门资讯

北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
阿西吧是什么意思 阿西吧相当于... 即使你没有受到过任何外语培训,你也懂四国语言。汉语:你好英语:Shit韩语:阿西吧(아,씨발! )日...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...