1+ # -*- coding: utf-8 -*-
2+
3+ """
4+ Time : 2019-08-02 15:29
5+ Author : Thinkgamer
6+ File : SlopeOne.py
7+ Software: PyCharm
8+ """
9+
10+ class SlopeOne :
11+ def __init__ (self ):
12+ self .user_rate , self .item_rate = self .loadData ()
13+
14+ # 加载数据
15+ def loadData (self ):
16+ user_rate = {
17+ "U1" : {"a" : 2 , "b" : 3 , "c" : 3 , "d" : 4 },
18+ "U2" : {"b" : 4 , "c" : 2 , "d" : 3 , "e" : 3 },
19+ "U3" : {"a" : 4 , "b" : 2 , "c" : 3 , "e" : 2 },
20+ "U4" : {"a" : 3 , "c" : 5 , "d" : 4 , "e" : 3 }
21+ }
22+ item_rate = {
23+ "a" : {"U1" : 2 , "U3" : 4 , "U4" : 3 },
24+ "b" : {"U1" : 3 , "U2" : 4 , "U3" : 2 },
25+ "c" : {"U1" : 3 , "U2" : 2 , "U3" : 3 , "U4" : 5 },
26+ "d" : {"U1" : 4 , "U2" : 3 , "U4" : 4 },
27+ "e" : {"U2" : 3 , "U3" : 2 , "U4" : 3 }
28+ }
29+ return user_rate ,item_rate
30+
31+ # 计算物品之间的评分偏差
32+ def cal_item_avg_diff (self ):
33+ avgs_dict = {}
34+ for item1 in self .item_rate .keys ():
35+ for item2 in self .item_rate .keys ():
36+ avg = 0.0
37+ user_count = 0
38+ if item1 != item2 :
39+ for user in self .user_rate .keys ():
40+ user_rate = self .user_rate [user ]
41+ if item1 in user_rate .keys () and item2 in user_rate .keys ():
42+ user_count += 1
43+ avg += user_rate [item1 ] - user_rate [item2 ]
44+ avg = avg / user_count
45+ avgs_dict .setdefault (item1 ,{})
46+ avgs_dict [item1 ][item2 ] = avg
47+ return avgs_dict
48+
49+ # 计算两个电影的共同评分人数
50+ def item_both_rate_user (self , item1 , item2 ):
51+ count = 0
52+ for user in self .user_rate .keys ():
53+ if item1 in self .user_rate [user ].keys () and item2 in self .user_rate [user ].keys ():
54+ count += 1
55+ return count
56+
57+ # 预估评分
58+ def predict (self , user , item , avgs_dict ):
59+ total = 0.0 # 分子
60+ count = 0 # 分母
61+ for item1 in self .user_rate [user ].keys ():
62+ num = self .item_both_rate_user (item , item1 )
63+ count += num
64+ total += num * (self .user_rate [user ][item1 ] - avgs_dict [item ][item1 ])
65+ return total / count
66+
67+ if __name__ == "__main__" :
68+ slope = SlopeOne ()
69+ avgs_dict = slope .cal_item_avg_diff ()
70+ result = slope .predict ("U2" , "a" , avgs_dict )
71+ print ("U2 对 a的预测评分为: %s" % result )
0 commit comments