-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathuser_specific.py
123 lines (94 loc) · 2.97 KB
/
user_specific.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
from similarity_matrix import sim_matrix
from user_data import user_record
from inverted_index import List_of_Courses
import operator,math
def CourseScore_ItemSim(course_list):
Course_score = {}
for course in List_of_Courses:
if course in course_list:
continue
total = 0
sim_sum = 0
for c in course_list:
sim_sum = sim_sum + sim_matrix[course][c]
total = total + sim_matrix[course][c]*course_list[c]
if(sim_sum!=0):
Course_score[course] = total/sim_sum
#c1 = list(reversed(sorted(Course_score.items(), key=operator.itemgetter(1))))
#print c1
#print '\n\n'
return Course_score
def User_Similarity(user_sim,course_list,user_record):
#using pearson correlation coefficient
for uid in user_record:
si = {}
for course in course_list:
if course in user_record[uid]:
si[course] = 1
n = len(si)
if(n==0):
user_sim[uid] = 0
continue
sum1=sum([course_list[it] for it in si])
sum1 = sum1/n
sum2=sum([user_record[uid][it] for it in si])
sum2 = sum2/n
numerator = sum([(course_list[it]-sum1)*(user_record[uid][it]-sum2) for it in si])
sum1Sq = math.sqrt(sum([math.pow(course_list[it]-sum1,2) for it in si]))
sum2Sq = math.sqrt(sum([math.pow(user_record[uid][it]-sum2,2) for it in si]))
den = sum1Sq*sum2Sq
if(den==0):
user_sim[uid] = 0
continue
r = numerator/den
user_sim[uid] = r
def CourseScore_UserSim(course_list,user_record):
Course_score = {}
user_sim = {}
User_Similarity(user_sim,course_list,user_record)
for course in List_of_Courses:
#only score courses i haven't seen yet
if course in course_list:
continue
total = 0
sim_sum = 0
for person in user_record:
if(user_sim[person]<=0):
continue
if course in user_record[person]:
sim_sum = sim_sum + user_sim[person]
total = total + user_record[person][course]*user_sim[person]
if(sim_sum!=0):
Course_score[course] = total/sim_sum
#c1 = list(reversed(sorted(Course_score.items(), key=operator.itemgetter(1))))
#print c1
#print '\n\n'
return Course_score
def Hybrid_Recommender(course_list,user_record):
Course_Item_sim = CourseScore_ItemSim(course_list)
Course_User_sim = CourseScore_UserSim(course_list,user_record)
user_recom = {}
#70% weightage to item based results and 30% to user based results
for c1 in Course_Item_sim:
user_recom[c1] = 0.8*Course_Item_sim[c1]
if c1 in Course_User_sim:
user_recom[c1] = user_recom[c1] + (0*Course_User_sim[c1])
for c1 in Course_User_sim:
if c1 in user_recom:
continue
else:
user_recom[c1] = 0*Course_User_sim[c1]
return list(reversed(sorted(user_recom.items(), key=operator.itemgetter(1))))
def Course_recommendation(course_list,user_record):
user_recom = []
l = Hybrid_Recommender(course_list,user_record)
for i in range(10):
user_recom.append(l[i][0])
return user_recom
def Course_recommendation_for_efficiency(course_list,user_record):
user_recom = []
l = Hybrid_Recommender(course_list,user_record)
val = {}
for i in range(len(l)):
val[l[i][0]] = l[i][1]
return val