大数据推荐算法之基于物品协同过滤推荐实例

来源:互联网 发布:qq邮箱smtp端口号 编辑:程序博客网 时间:2024/05/19 00:37
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
01defItemSimilarity(): 
02    #建立物品-物品的共现矩阵 
03    =dict()  #物品-物品的共现矩阵 
04    =dict()  #物品被多少个不同用户购买 
05    for user,items inuser_items.items(): 
06        for initems.keys(): 
07            N.setdefault(i,0
08            N[i] += 1 
09            C.setdefault(i,{}) 
10            for initems.keys(): 
11                if == j : continue 
12                C[i].setdefault(j,0
13                C[i][j] += 1 / math.log(1 +len(item_users[i]))
14    #计算相似度矩阵 
15    itemSim =dict() 
16    for i,related_items inC.items(): 
17        itemSim.setdefault(i,{}) 
18        for j,cij inrelated_items.items(): 
19            itemSim[i][j] = cij / (math.sqrt(N[i] *N[j])) 
20    return itemSim
3. 找出与用户喜欢的物品相似度高的topN个作为推荐的候选。
最终相似计算得分=用户对物品的喜欢得分*物品相似度得分
01#给用户user推荐,前N个相关物品 
02defRecommend(user,N=10): 
03    rank =dict() 
04    action_item =user_items[user]     #用户user产生过行为的item和评分 
05    for item,score inaction_item.items(): 
06        for j,wj in sorted(itemSim[item].items(),key=lambdax:x[1],reverse=True): 
07            if inaction_item.keys(): 
08                continue 
09            rank.setdefault(j,0
10            rank[j] += score *wj
11             
12    return dict(sorted(rank.items(),key=lambdax:x[1],reverse=True)[0:N])
注:要排除用户已喜欢的物品
 
运行结果:
 
本例代码下载
原创粉丝点击