Data Science from Scratch: First Principles with Python (2015)
Chapter 22. Recommender Systems
O nature, nature, why art thou so dishonest, as ever to send men with these false recommendations into the world!
Henry Fielding
users_interests=[
["Hadoop","Big Data","HBase","Java","Spark","Storm","Cassandra"],
["NoSQL","MongoDB","Cassandra","HBase","Postgres"],
["Python","scikit-learn","scipy","numpy","statsmodels","pandas"],
["R","Python","statistics","regression","probability"],
["machine learning","regression","decision trees","libsvm"],
["Python","R","Java","C++","Haskell","programming languages"],
["statistics","probability","mathematics","theory"],
["machine learning","scikit-learn","Mahout","neural networks"],
["neural networks","deep learning","Big Data","artificial intelligence"],
["Hadoop","Java","MapReduce","Big Data"],
["statistics","R","statsmodels"],
["C++","deep learning","artificial intelligence","probability"],
["pandas","R","Python"],
["databases","HBase","Postgres","MySQL","MongoDB"],
["libsvm","regression","support vector machines"]
]
Manual Curation
Recommending What’s Popular
popular_interests=Counter(interest
foruser_interestsinusers_interests
forinterestinuser_interests).most_common()
[('Python',4),
('R',4),
('Java',3),
('regression',3),
('statistics',3),
('probability',3),
# ...
]
defmost_popular_new_interests(user_interests,max_results=5):
suggestions=[(interest,frequency)
forinterest,frequencyinpopular_interests
ifinterestnotinuser_interests]
returnsuggestions[:max_results]
["NoSQL","MongoDB","Cassandra","HBase","Postgres"]
most_popular_new_interests(users_interests[1],5)
# [('Python', 4), ('R', 4), ('Java', 3), ('regression', 3), ('statistics', 3)]
[('Java',3),
('HBase',3),
('Big Data',3),
('neural networks',2),
('Hadoop',2)]
User-Based Collaborative Filtering
defcosine_similarity(v,w):
returndot(v,w)/math.sqrt(dot(v,v)*dot(w,w))
unique_interests=sorted(list({interest
foruser_interestsinusers_interests
forinterestinuser_interests}))
['Big Data',
'C++',
'Cassandra',
'HBase',
'Hadoop',
'Haskell',
# ...
]
defmake_user_interest_vector(user_interests):
"""given a list of interests, produce a vector whose ith element is 1
if unique_interests[i] is in the list, 0 otherwise"""
return[1ifinterestinuser_interestselse0
forinterestinunique_interests]
user_interest_matrix=map(make_user_interest_vector,users_interests)
user_similarities=[[cosine_similarity(interest_vector_i,interest_vector_j)
forinterest_vector_jinuser_interest_matrix]
forinterest_vector_iinuser_interest_matrix]
defmost_similar_users_to(user_id):
pairs=[(other_user_id,similarity)# find other
forother_user_id,similarityin# users with
enumerate(user_similarities[user_id])# nonzero
ifuser_id!=other_user_idandsimilarity>0]# similarity
returnsorted(pairs,# sort them
key=lambda(_,similarity):similarity,# most similar
reverse=True)# first
[(9,0.5669467095138409),
(1,0.3380617018914066),
(8,0.1889822365046136),
(13,0.1690308509457033),
(5,0.1543033499620919)]
defuser_based_suggestions(user_id,include_current_interests=False):
# sum up the similarities
suggestions=defaultdict(float)
forother_user_id,similarityinmost_similar_users_to(user_id):
forinterestinusers_interests[other_user_id]:
suggestions[interest]+=similarity
# convert them to a sorted list
suggestions=sorted(suggestions.items(),
key=lambda(_,weight):weight,
reverse=True)
# and (maybe) exclude already-interests
ifinclude_current_interests:
returnsuggestions
else:
return[(suggestion,weight)
forsuggestion,weightinsuggestions
ifsuggestionnotinusers_interests[user_id]]
[('MapReduce',0.5669467095138409),
('MongoDB',0.50709255283711),
('Postgres',0.50709255283711),
('NoSQL',0.3380617018914066),
('neural networks',0.1889822365046136),
('deep learning',0.1889822365046136),
('artificial intelligence',0.1889822365046136),
#...
]
interest_user_matrix=[[user_interest_vector[j]
foruser_interest_vectorinuser_interest_matrix]
forj,_inenumerate(unique_interests)]
[1,0,0,0,0,0,0,0,1,1,0,0,0,0,0]
interest_similarities=[[cosine_similarity(user_vector_i,user_vector_j)
foruser_vector_jininterest_user_matrix]
foruser_vector_iininterest_user_matrix]
defmost_similar_interests_to(interest_id):
similarities=interest_similarities[interest_id]
pairs=[(unique_interests[other_interest_id],similarity)
forother_interest_id,similarityinenumerate(similarities)
ifinterest_id!=other_interest_idandsimilarity>0]
returnsorted(pairs,
key=lambda(_,similarity):similarity,
reverse=True)
[('Hadoop',0.8164965809277261),
('Java',0.6666666666666666),
('MapReduce',0.5773502691896258),
('Spark',0.5773502691896258),
('Storm',0.5773502691896258),
('Cassandra',0.4082482904638631),
('artificial intelligence',0.4082482904638631),
('deep learning',0.4082482904638631),
('neural networks',0.4082482904638631),
('HBase',0.3333333333333333)]
defitem_based_suggestions(user_id,include_current_interests=False):
# add up the similar interests
suggestions=defaultdict(float)
user_interest_vector=user_interest_matrix[user_id]
forinterest_id,is_interestedinenumerate(user_interest_vector):
ifis_interested==1:
similar_interests=most_similar_interests_to(interest_id)
forinterest,similarityinsimilar_interests:
suggestions[interest]+=similarity
# sort them by weight
suggestions=sorted(suggestions.items(),
key=lambda(_,similarity):similarity,
reverse=True)
ifinclude_current_interests:
returnsuggestions
else:
return[(suggestion,weight)
forsuggestion,weightinsuggestions
ifsuggestionnotinusers_interests[user_id]]
[('MapReduce',1.861807319565799),
('Postgres',1.3164965809277263),
('MongoDB',1.3164965809277263),
('NoSQL',1.2844570503761732),
('programming languages',0.5773502691896258),
('MySQL',0.5773502691896258),
('Haskell',0.5773502691896258),
('databases',0.5773502691896258),
('neural networks',0.4082482904638631),
('deep learning',0.4082482904638631),
('C++',0.4082482904638631),
('artificial intelligence',0.4082482904638631),
('Python',0.2886751345948129),
('R',0.2886751345948129)]
For Further Exploration
§ Crab is a framework for building recommender systems in Python.
§ Graphlab also has a recommender toolkit.
§ The Netflix Prize was a somewhat famous competition to build a better system to recommend movies to Netflix users.
All materials on the site are licensed Creative Commons Attribution-Sharealike 3.0 Unported CC BY-SA 3.0 & GNU Free Documentation License (GFDL)
If you are the copyright holder of any material contained on our site and intend to remove it, please contact our site administrator for approval.
© 2016-2026 All site design rights belong to S.Y.A.