Guest User

Untitled

a guest
Dec 5th, 2016
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.54 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, 'You, Me and Dupree': 2.5, 'The Night Listener': 3.0, 'Snitch': 3.0},
  3.     'Gene Seymour': {'Lady in the Water': 3.0, 'Snakes on a Plane': 3.5, 'Just My Luck': 1.5,  'The Night Listener': 3.0,'You, Me and Dupree': 3.5},
  4.     'Michael Phillips': {'Catch Me If You Can': 2.5, 'Lady in the Water': 2.5,'Superman Returns': 3.5, 'The Night Listener': 4.0, 'Snitch': 2.0},
  5.     '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},
  6.     'Mick LaSalle': {'Lady in the Water': 3.0, 'Snakes on a Plane': 4.0,'Just My Luck': 2.0, 'Superman Returns': 3.0, 'You, Me and Dupree': 2.0},
  7.     'Jack Matthews': {'Catch Me If You Can': 4.5, '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, 'Snitch': 4.5},
  8.     'Toby': {'Snakes on a Plane':4.5, 'Snitch': 5.0},
  9.     'Michelle Nichols': {'Just My Luck' : 1.0, 'The Night Listener': 4.5, 'You, Me and Dupree': 3.5, 'Catch Me If You Can': 2.5, 'Snakes on a Plane': 3.0},
  10.     'Gary Coleman': {'Lady in the Water': 1.0, 'Catch Me If You Can': 1.5, 'Superman Returns': 1.5, 'You, Me and Dupree': 2.0},
  11.     'Larry': {'Lady in the Water': 3.0, 'Just My Luck': 3.5, 'Snitch': 1.5, 'The Night Listener': 3.5}
  12.     }
  13.  
  14. from math import sqrt
  15. # Vrakja merka za slicnost bazirana na rastojanieto za person1 i person2
  16. def sim_distance(oceni,person1,person2):
  17.     # Se pravi lista na zaednicki predmeti (filmovi)
  18.     zaednicki={}
  19.     for item in oceni[person1].keys():
  20.         if item in oceni[person2]:
  21.             zaednicki[item]=1
  22.     # ako nemaat zaednicki rejtinzi, vrati 0
  23.     if len(zaednicki)==0:
  24.         return 0
  25.     # Soberi gi kvadratite na site razliki
  26.      # sum_of_squares=sum([pow(oceni[person1][item]-oceni[person2][item],2)
  27.      #     for item in oceni[person1] if item in oceni[person2]])
  28.  
  29.     sum_of_squares=0
  30.     for item in zaednicki.keys():
  31.         sum_of_squares+=(oceni[person1][item]-oceni[person2][item])**2
  32.     return 1/(1+sqrt(sum_of_squares))
  33. #    return 1/(1+(sum_of_squares))
  34.  
  35. def sim_pearson(oceni,person1,person2):
  36.     # Se pravi lista na zaednicki predmeti (filmovi)
  37.     zaednicki=[]
  38.     for item in oceni[person1].keys():
  39.         if item in oceni[person2]:
  40.             zaednicki.append(item)
  41.     # ako nemaat zaednicki rejtinzi, vrati 0
  42.     if len(zaednicki)==0:
  43.         return 0
  44.  
  45.     sumaOceni1=0
  46.     sumaOceni2=0
  47.     sumaOceniKvadrati1=0
  48.     sumaOceniKvadrati2=0
  49.     sumaZaednickiProizvodi=0
  50.  
  51.     for item in zaednicki:
  52.         ocena1=oceni[person1][item]
  53.         ocena2=oceni[person2][item]
  54.         sumaOceni1+=ocena1
  55.         sumaOceni2+=ocena2
  56.         sumaOceniKvadrati1+=ocena1**2
  57.         sumaOceniKvadrati2+=ocena2**2
  58.         sumaZaednickiProizvodi+=ocena1*ocena2
  59.         # print ocena1,ocena2,item
  60.  
  61.     n=len(zaednicki)
  62.     broitel=n*sumaZaednickiProizvodi-sumaOceni1*sumaOceni2
  63.     imenitel=(n*sumaOceniKvadrati1-sumaOceni1**2)**0.5 * (n*sumaOceniKvadrati2-sumaOceni2**2)**0.5
  64.     if imenitel==0:
  65.         if broitel>0:
  66.             return 1
  67.         elif broitel<0:
  68.             return -1
  69.         else:
  70.             return -2
  71.  
  72.  
  73.     formula=broitel/imenitel
  74.     return formula
  75.    
  76. def transformPrefs(prefs):
  77.     result={}
  78.     for person in prefs:
  79.         for item in prefs[person]:
  80.             result.setdefault(item,{})
  81.             # Zameni gi mestata na licnosta i predmetot
  82.             result[item][person]=prefs[person][item]
  83.     return result
  84.  
  85.  
  86. def topMatches(prefs,person,n=5,similarity=sim_pearson):
  87.     scores=[(similarity(prefs,person,other),other)
  88.                    for other in prefs if other!=person]
  89.     # Se sortira listata vo rastecki redosled
  90.     scores.sort( )
  91.     # Se prevrtuva za najslicnite (so najgolema vrednost) da bidat prvi
  92.     scores.reverse( )
  93.     return scores[0:n]
  94.  
  95. def getRecommendations(prefs,person,similarity=sim_pearson):
  96.     totals={}
  97.     simSums={}
  98.     for other in prefs:
  99.         # Za da ne se sporeduva so samiot sebe
  100.         if other==person: continue
  101.         sim=similarity(prefs,person,other)
  102.         # ne se zemaat vo predvid rezultati <= 0
  103.         if sim<=0: continue
  104.         for item in prefs[other]:
  105.             # za tekovniot korisnik gi zemame samo filmovite sto gi nemame veke gledano
  106.             if item not in prefs[person] or prefs[person][item]==0:
  107.                 # Similarity * Score   (Slicnost * Ocena)
  108.                 totals.setdefault(item,0)
  109.                 totals[item]+=prefs[other][item]*sim
  110.  
  111.                 # Sumuma na slicnosti
  112.                 simSums.setdefault(item,0)
  113.                 simSums[item]+=sim
  114.  
  115.     # Kreiranje na normalizirana lista so rejtinzi
  116.     rankings=[(total/simSums[item],item) for item,total in totals.items()]
  117.  
  118.     # Sortiranje na listata vo rastecki redosled
  119.     rankings.sort()
  120.     # Prevrtuvanje na lista za najgolemite vrednosti da bidat napred
  121.     rankings.reverse()
  122.     return rankings
  123.  
  124.  
  125. def getUserBasedRecomendations(oceni,korisnik,similarity=sim_pearson):
  126.     rankings = []
  127.     slicni=getRecommendations(oceni,korisnik)
  128.     for item in slicni:
  129.         rankings.append(item[1])
  130.     rankings=rankings[0:3]
  131.     rankings.sort()
  132.     return rankings
  133.    
  134. def getItemBasedRecomendations(oceni,korisnik,similarity=sim_pearson):
  135.     rankings = []
  136.     itemsBased = transformPrefs(oceni)
  137.     movies = oceni[korisnik]
  138.     notWatch = []
  139.     for movie in itemsBased:
  140.         if movie not in movies:
  141.             notWatch.append(movie)
  142.     added={}
  143.     for movie in movies:
  144.         slicni = topMatches(itemsBased,movie)
  145.         for slicen in slicni:
  146.             if slicen[1] in notWatch:
  147.                 if slicen[0] >= 0:
  148.                     if slicen[1] in added:
  149.                         if slicen[0] > added[slicen[1]]:
  150.                             added[slicen[1]]=slicen[0]
  151.                     else:
  152.                         added[slicen[1]]=slicen[0]
  153.     reverse = []
  154.     for x in added:
  155.         reverse.append((added[x],x))
  156.     reverse.sort()
  157.     reverse.reverse()
  158.     if len(reverse) > 3:
  159.         for x in range(0,3):
  160.             rankings.append(reverse[x][1])
  161.     else:
  162.         for x in range(0,len(reverse)):
  163.             rankings.append(reverse[x][1])
  164.     rankings.sort()
  165.     return rankings
  166.  
  167.  
  168. if __name__ == "__main__":
  169.     korisnik=input()
  170.     print "user-based: %s"%(getUserBasedRecomendations(oceniPoKorisnici,korisnik))
  171.     print "item-based: %s"%(getItemBasedRecomendations(oceniPoKorisnici,korisnik))
Add Comment
Please, Sign In to add comment