ItemCF:ItemCollaborationFilter,基于物品的协同过滤算法核心思想:给用户推荐那些和他们之前喜欢的物品相似的物品。
Iterm-based的基本思想是预先根据所有用户的历史偏好数据计算物品之间的相似性,然后把与用户喜欢的物品相类似的物品推荐给用户。还是以之前的例子为例,可以知道物品a和c非常相似,因为喜欢a的用户同时也喜欢c,而用户A喜欢a,所以把c推荐给用户A。
基本步骤如下:
1. 训练数据准备,准备好用户与物品的喜欢数据。这里借助movielens的一个数据,每行一条数据,分别是用户,物品,评分和时间
2. 计算物品的相似度,本例采用最常用的余弦定理来计算相似度
以item-user做成倒排矩阵,如
user1 user2 ... usern
item1 2 4 ... 5
item2 1 3 ... 2
... ... ... ... ...
itemn 4 3 ... 1
04
|
N = dict () #物品被多少个不同用户购买
|
05
|
for user,items in user_items.items():
|
13
|
C[i][j] + = 1 / math.log( 1 + len (item_users[i]))
|
16
|
for i,related_items in C.items():
|
17
|
itemSim.setdefault(i,{})
|
18
|
for j,cij in related_items.items():
|
19
|
itemSim[i][j] = cij / (math.sqrt(N[i] * N[j]))
|
|
3. 找出与用户喜欢的物品相似度高的topN个作为推荐的候选。
最终相似计算得分=用户对物品的喜欢得分*物品相似度得分
02
|
def Recommend(user,N = 10 ):
|
04
|
action_item = user_items[user] #用户user产生过行为的item和评分
|
05
|
for item,score in action_item.items():
|
06
|
for j,wj in sorted (itemSim[item].items(),key = lambda x:x[ 1 ],reverse = True ):
|
07
|
if j in action_item.keys():
|
12
|
return dict ( sorted (rank.items(),key = lambda x:x[ 1 ],reverse = True )[ 0 :N])
|
|
注:要排除用户已喜欢的物品
运行结果: