Skip to content

Commit de425af

Browse files
authored
add SlopeOne算法实现
1 parent 9a0b4e9 commit de425af

File tree

1 file changed

+71
-0
lines changed

1 file changed

+71
-0
lines changed

Recommend/SlopeOne.py

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
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

Comments
 (0)