-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathsimple_recommender_qii.py
74 lines (51 loc) · 1.95 KB
/
simple_recommender_qii.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
# Simple QII on recommender system test
# usage: python simple_recommender_qii.py <user-name>
# where <user-name> can be 'Toby', etc.
import sys
from scikits.crab import datasets
from scikits.crab.models import MatrixPreferenceDataModel
from scikits.crab.metrics import pearson_correlation
from scikits.crab.similarities import UserSimilarity
from scikits.crab.recommenders.knn import UserBasedRecommender
import numpy
import random
import sys
random.seed()
# Set up a recommendation system
movies = datasets.load_sample_movies()
#movies = datasets.load_movielens_r100k()
model = MatrixPreferenceDataModel(movies.data)
similarity = UserSimilarity(model, pearson_correlation)
recommender = UserBasedRecommender(model, similarity, with_preference=True)
print movies.data
print movies.user_ids
average_local_inf = {}
iters = 5 # More iterations, greater accuracy
user_index = -1
if not movies.user_ids:
ids= set(movies.data.keys())
movies.user_ids = {x:str(x) for x in ids}
for id in movies.user_ids:
if movies.user_ids[id] == sys.argv[1]:
user_index = id
if user_index < 0:
print 'User not found'
sys.exit()
prediction = recommender.recommend(user_index)
print "Prediction: ", prediction
user_pref = model.preferences_from_user(user_index)
print "User preferences: ", user_pref
for item in user_pref:
local_influence = [0.0]*len(prediction)
item_index = item[0]
for i in xrange(iters):
new_pref = random.random()*4.0 + 1.0
model.set_preference(user_index, item_index, new_pref)
new_prediction = [recommender.estimate_preference(user_index, id[0]) for id in prediction]
print 'new prediction: ', new_prediction
for p in xrange(len(prediction)):
if not numpy.isnan(new_prediction[p]):
local_influence[p] = local_influence[p] + abs(new_prediction[p]-prediction[p][1])
print local_influence
average_local_inf[item] = sum(local_influence)/(iters*len(prediction))
print('Average local influence %s: %.3f' % (item, average_local_inf[item]))