1+ #!/usr/bin/env python
2+ #-*-coding:utf-8-*-
3+ '''
4+ Created on 2016-5-30
5+
6+ @author: thinkgamer
7+ '''
8+ import math
9+
10+ class ItemBasedCF :
11+ def __init__ (self ,train_file ):
12+ self .train_file = train_file
13+ self .readData ()
14+ def readData (self ):
15+ #读取文件,并生成用户-物品的评分表和测试集
16+ self .train = dict () #用户-物品的评分表
17+ for line in open (self .train_file ):
18+ # user,item,score = line.strip().split(",")
19+ user ,score ,item = line .strip ().split ("," )
20+ self .train .setdefault (user ,{})
21+ self .train [user ][item ] = int (float (score ))
22+
23+ def ItemSimilarity (self ):
24+ #建立物品-物品的共现矩阵
25+ C = dict () #物品-物品的共现矩阵
26+ N = dict () #物品被多少个不同用户购买
27+ for user ,items in self .train .items ():
28+ for i in items .keys ():
29+ N .setdefault (i ,0 )
30+ N [i ] += 1
31+ C .setdefault (i ,{})
32+ for j in items .keys ():
33+ if i == j : continue
34+ C [i ].setdefault (j ,0 )
35+ C [i ][j ] += 1
36+ #计算相似度矩阵
37+ self .W = dict ()
38+ for i ,related_items in C .items ():
39+ self .W .setdefault (i ,{})
40+ for j ,cij in related_items .items ():
41+ self .W [i ][j ] = cij / (math .sqrt (N [i ] * N [j ]))
42+ return self .W
43+
44+ #给用户user推荐,前K个相关用户
45+ def Recommend (self ,user ,K = 3 ,N = 10 ):
46+ rank = dict ()
47+ action_item = self .train [user ] #用户user产生过行为的item和评分
48+ for item ,score in action_item .items ():
49+ for j ,wj in sorted (self .W [item ].items (),key = lambda x :x [1 ],reverse = True )[0 :K ]:
50+ if j in action_item .keys ():
51+ continue
52+ rank .setdefault (j ,0 )
53+ rank [j ] += score * wj
54+ return dict (sorted (rank .items (),key = lambda x :x [1 ],reverse = True )[0 :N ])
55+
56+ #声明一个ItemBased推荐的对象
57+ Item = ItemBasedCF ("uid_score_bid" )
58+ Item .ItemSimilarity ()
59+ recommedDic = Item .Recommend ("xiyuweilan" )
60+ for k ,v in recommedDic .iteritems ():
61+ print k ,"\t " ,v
0 commit comments