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