#create a dict about movies
critics = {'Lisa Rose':{'Lady in the Water':2.5, 'Snakes on a Plane':3.5, 'Just My Luck':3.0, 'Superman Returns':3.5, 'You, Me and Dupree':2.5, 'The Night Listener':3.0},'Gene Seymour':{'Lady in the Water':3.0, 'Snakes on a Plane':3.5, 'Just My Luck':1.5, 'Superman Returns':5.0, 'The Night Listener':3.0, 'You, Me and Dupree':3.5},'Michael Phillips':{'Lady in the Water':2.5, 'Snakes on a Plane':3.0, 'Superman Returns':3.5, 'The Night Listener':4.0},'Claudia Puig':{'Snakes on a Plane':3.5, 'Just My Luck':3.0, 'The Night Listener':4.5, 'Superman Returns':4.0, 'You, Me and Dupree':2.5},'Mick LaSalle':{'Lady in the Water':3.0, 'Snakes on a Plane':4.0, 'Just My Luck':2.0, 'Superman Returns':3.0, 'The Night Listener':3.0, 'You, Me and Dupree':2.0},'Jack Matthews':{'Lady in the Water':3.0, 'Snakes on a Plane':4.0, 'The Night Listener':3.0, 'Superman Returns':5.0, 'You, Me and Dupree':3.5},'Toby':{'Snakes on a Plane':4.5, 'You, Me and Dupree':1.0, 'Superman Returns':4.0}}from math import sqrt
#return a value to judge similarity between person1 and person2defsim_distance(prefs, person1, person2):#items of both person1 and person2si = {}for item in prefs[person1]:if item in prefs[person2]:si[item] = 1#return 0 if there is no item both of person1 and person2if len(si) == 0: return0#calculate the distance between person1 and person2sum_of_squares = sum([pow(prefs[person1][item] - prefs[person2][item], 2) for item in prefs[person1] if item in prefs[person2]])return1/(1 + sqrt(sum_of_squares))#return the Pearson Correlation Score between p1 and p2defsim_pearson(prefs, p1, p2):#items of both p1 and p2si = {}for item in prefs[p1]:if item in prefs[p2]:si[item] = 1#number of itemsn = len(si)#return 0 if there is no item both of p1 and p2if n == 0: return1sum1 = sum([prefs[p1][it] for it in si])sum2 = sum([prefs[p2][it] for it in si])sum1Sq = sum([pow(prefs[p1][it], 2) for it in si])sum2Sq = sum([pow(prefs[p2][it], 2) for it in si])pSum = sum([prefs[p1][it] * prefs[p2][it] for it in si])#calculate the Pearson Correlation Scorenum = pSum - (sum1 * sum2/n)den = sqrt((sum1Sq - pow(sum1, 2)/n)*(sum2Sq - pow(sum2, 2)/n))if den == 0: return0r = num / denreturn r#return the most similarity persondeftopMatches(prefs, person, n = 5, similarity = sim_pearson):scores = [(similarity(prefs, person, other), other) for other in prefs if other != person]#sorted the listscores.sort()scores.reverse()return scores[0:n]#give the suggest by other score of add powerdefgetRecommendations(prefs, person, similarity = sim_pearson):totals = {}simSums = {}for other in prefs:#do not match with itselfif other == person: continuesim = similarity(prefs, person, other)#ignore values equles zero or less than zeroif sim <= 0: continuefor item in prefs[other]:#only assess movies which himself not yet watchif item notin prefs[person] or prefs[person][item] == 0:#similarity * valuestotals.setdefault(item, 0)totals[item] += prefs[other][item] * sim#sum of similaritysimSums.setdefault(item, 0)simSums[item] += sim#create a normalized list rankings = [(total/simSums[item], item) for item, total in totals.items()]#sortedrankings.sort()rankings.reverse()return rankings