Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2018
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.30 KB | None | 0 0
  1. oceniPoKorisnici = {
  2. 'Lisa Rose': {'Catch Me If You Can': 3.0, 'Snakes on a Plane': 3.5, 'Superman Returns': 3.5,
  3. 'You, Me and Dupree': 2.5, 'The Night Listener': 3.0, 'Snitch': 3.0},
  4. 'Gene Seymour': {'Lady in the Water': 3.0, 'Snakes on a Plane': 3.5, 'Just My Luck': 1.5, 'The Night Listener': 3.0,
  5. 'You, Me and Dupree': 3.5},
  6. 'Michael Phillips': {'Catch Me If You Can': 2.5, 'Lady in the Water': 2.5, 'Superman Returns': 3.5,
  7. 'The Night Listener': 4.0, 'Snitch': 2.0},
  8. 'Claudia Puig': {'Snakes on a Plane': 3.5, 'Just My Luck': 3.0, 'The Night Listener': 4.5, 'Superman Returns': 4.0,
  9. 'You, Me and Dupree': 2.5},
  10. 'Mick LaSalle': {'Lady in the Water': 3.0, 'Snakes on a Plane': 4.0, 'Just My Luck': 2.0, 'Superman Returns': 3.0,
  11. 'You, Me and Dupree': 2.0},
  12. 'Jack Matthews': {'Catch Me If You Can': 4.5, 'Lady in the Water': 3.0, 'Snakes on a Plane': 4.0,
  13. 'The Night Listener': 3.0, 'Superman Returns': 5.0, 'You, Me and Dupree': 3.5, 'Snitch': 4.5},
  14. 'Toby': {'Snakes on a Plane': 4.5, 'Snitch': 5.0},
  15. 'Michelle Nichols': {'Just My Luck': 1.0, 'The Night Listener': 4.5, 'You, Me and Dupree': 3.5,
  16. 'Catch Me If You Can': 2.5, 'Snakes on a Plane': 3.0},
  17. 'Gary Coleman': {'Lady in the Water': 1.0, 'Catch Me If You Can': 1.5, 'Superman Returns': 1.5,
  18. 'You, Me and Dupree': 2.0},
  19. 'Larry': {'Lady in the Water': 3.0, 'Just My Luck': 3.5, 'Snitch': 1.5, 'The Night Listener': 3.5}
  20. }
  21.  
  22. from math import *
  23. import math
  24.  
  25.  
  26. # Vrakja merka za slicnost bazirana na rastojanieto za person1 i person2
  27. def sim_distance(prefs, person1, person2):
  28. si = {}
  29. for item in prefs[person1]:
  30. if item in prefs[person2]:
  31. si[item] = 1
  32. if len(si) == 0: return 0
  33. sum_of_squares = sum([pow(prefs[person1][item] - prefs[person2][item], 2)
  34. for item in prefs[person1] if item in prefs[person2]])
  35. return (round(1 / (1 + math.sqrt(sum_of_squares)), 2))
  36.  
  37.  
  38. def sim_pearson(prefs, person1, person2):
  39. si = {}
  40. for item in prefs[person1]:
  41. if item in prefs[person2]:
  42. si[item] = 1
  43. n = len(si)
  44. if len(si) == 0: return 0
  45. sum1 = sum([prefs[person1][item] for item in si])
  46. sum2 = sum([prefs[person2][item] for item in si])
  47. sum1Sq = sum([pow(prefs[person1][item], 2) for item in si])
  48. sum2Sq = sum([pow(prefs[person2][item], 2) for item in si])
  49. pSum = sum([prefs[person1][item] * prefs[person2][item] for item in si])
  50. num = pSum - (sum1 * sum2 / n)
  51. den = math.sqrt((sum1Sq - pow(sum1, 2) / n) * (sum2Sq - pow(sum2, 2) / n))
  52. if den == 0: return 0
  53. r = num / den
  54. return (round(r, 2))
  55.  
  56.  
  57. def transformPrefs(prefs):
  58. result = {}
  59. for person in prefs:
  60. for item in prefs[person]:
  61. result.setdefault(item, {})
  62. result[item][person] = prefs[person][item]
  63. return result
  64.  
  65.  
  66. def topMatches(prefs, person, n=5, similarity=sim_pearson):
  67. scores = [(similarity(prefs, person, other), other)
  68. for other in prefs if other != person]
  69. scores.sort()
  70. scores.reverse()
  71. return scores[0:n]
  72.  
  73.  
  74. def getRecommendations(prefs, person, similarity=sim_pearson, n=3):
  75. totals = {}
  76. simSums = {}
  77. for other in prefs:
  78.  
  79. if other == person: continue
  80. sim = similarity(prefs, person, other)
  81.  
  82. if sim <= 0: continue
  83. for item in prefs[other]:
  84.  
  85. if item not in prefs[person] or prefs[person][item] == 0:
  86. totals.setdefault(item, 0)
  87. totals[item] += prefs[other][item] * sim
  88.  
  89. simSums.setdefault(item, 0)
  90. simSums[item] += sim
  91.  
  92. rankings = [(total / simSums[item], item) for item, total in totals.items()]
  93.  
  94. rankings.sort()
  95.  
  96. rankings.reverse()
  97. return rankings[0:n]
  98.  
  99.  
  100. def getUserBasedRecomendations(oceni, korisnik, similarity=sim_pearson):
  101. rankings = []
  102. slicni = getRecommendations(oceni, korisnik)
  103. for item in slicni:
  104. rankings.append(item[1])
  105.  
  106. rankings = rankings[0:3]
  107. rankings.sort()
  108. return rankings
  109.  
  110.  
  111. def getItemBasedRecomendations(oceni, korisnik, similarity=sim_pearson):
  112. rankings = []
  113. itembased = transformPrefs(oceni)
  114. movies = oceniPoKorisnici[korisnik]
  115. preporaka = []
  116. for movie in movies:
  117. slicni = topMatches(itembased, movie)
  118. for slicen in slicni:
  119. ocenka = slicen[0]
  120.  
  121. if slicen[1] not in movies and ocenka >= 0:
  122. preporaka.append(slicen)
  123. preporaka.sort()
  124. preporaka.reverse()
  125. preporaka2 = []
  126. for preporaki in preporaka:
  127. if preporaki[1] not in preporaka2:
  128. preporaka2.append(preporaki[1])
  129. rankings = preporaka2[0:3]
  130. rankings.sort()
  131.  
  132. return rankings
  133.  
  134.  
  135. #def square_rooted(x):
  136. #return round(sqrt(sum([a * a for a in x])), 3)
  137.  
  138.  
  139. def cosine_similarity(oceni,p1,p2):
  140. zaednicki = {}
  141. for item in oceni[p1]:
  142. if item in oceni[p2]: zaednicki[item] = 1
  143.  
  144. numerator = sum([oceni[p1][it] * oceni[p2][it] for it in zaednicki])
  145. denominator = sqrt(sum([oceni[p1][it]*oceni[p1][it] for it in zaednicki])) * sqrt(sum([oceni[p2][it]*oceni[p2][it] for it in zaednicki]))
  146.  
  147. if denominator == 0:
  148. return -1
  149. vkupno= round(numerator / float(denominator),2)
  150. return vkupno
  151.  
  152.  
  153. def transformoceni(oceni):
  154. result={}
  155. for person in oceni:
  156. for item in oceni[person]:
  157. result.setdefault(item,{})
  158. # Zameni gi mestata na licnosta i predmetot
  159. result[item][person]=oceni[person][item]
  160.  
  161. return result
  162. def similarity(recnik,film):
  163. total={}
  164. for item in recnik.keys():
  165. if item!=film:
  166. total.setdefault(item,{})
  167. total[item]=(cosine_similarity(recnik,film,item),sim_pearson(recnik,film,item),sim_distance(recnik,film,item))
  168. return total
  169.  
  170. if __name__ == "__main__":
  171. film = "Catch Me If You Can"
  172.  
  173. filmovi=transformoceni(oceniPoKorisnici)
  174. lista = similarity(filmovi, film)
  175.  
  176. lista1 = lista.items()
  177. lista1.sort()
  178. for x in lista1:
  179. print x[0]
  180. print x[1][0], x[1][1], x[1][2]
  181. print '\n'
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement