Mitko_jos

Sistemi za preporaka

Dec 28th, 2014
299
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 14.17 KB | None | 0 0
  1. ---Sistemi za Preporaka
  2. lab3
  3. zad1
  4. oceniPoKorisnici={
  5.     '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},
  6.     '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},
  7.     '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},
  8.     '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},
  9.     '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},
  10.     '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},
  11.     'Toby': {'Snakes on a Plane':4.5, 'Snitch': 5.0},
  12.     '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},
  13.     '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},
  14.     'Larry': {'Lady in the Water': 3.0, 'Just My Luck': 3.5, 'Snitch': 1.5, 'The Night Listener': 3.5}
  15.     }
  16.  
  17. def invertirajOceni(oceni):
  18.     oceniPoFilmovi={}
  19.     for person in oceni:
  20.         for item in oceni[person]:
  21.             oceniPoFilmovi.setdefault(item,{})
  22.             oceniPoFilmovi[item][person]=oceni[person][item]                                         
  23.     return oceniPoFilmovi
  24.  
  25. #if __name__ == "__main__":
  26. oceniPoFilmovi=invertirajOceni(oceniPoKorisnici)
  27. film=input()
  28.  
  29. print(oceniPoFilmovi[film])
  30.  
  31. zad2
  32.  
  33. from math import sqrt
  34.  
  35. oceniPoKorisnici={
  36.     '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},
  37.     '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},
  38.     '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},
  39.     '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},
  40.     '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},
  41.     '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},
  42.     'Toby': {'Snakes on a Plane':4.5, 'Snitch': 5.0},
  43.     '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},
  44.     '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},
  45.     'Larry': {'Lady in the Water': 3.0, 'Just My Luck': 3.5, 'Snitch': 1.5, 'The Night Listener': 3.5}
  46.     }
  47.  
  48. def sim_distance(oceni,person1,person2):
  49.     # Se pravi lista na zaednicki predmeti (filmovi)
  50.     zaednicki={}
  51.     for item in oceni[person1].keys():
  52.         if item in oceni[person2]:
  53.             zaednicki[item]=1
  54.     # ako nemaat zaednicki rejtinzi, vrati 0
  55.     if len(zaednicki)==0:
  56.         return 0
  57.     # Soberi gi kvadratite na site razliki
  58.      # sum_of_squares=sum([pow(oceni[person1][item]-oceni[person2][item],2)
  59.      #     for item in oceni[person1] if item in oceni[person2]])
  60.  
  61.     sum_of_squares=0
  62.     for item in zaednicki.keys():
  63.         sum_of_squares+=(oceni[person1][item]-oceni[person2][item])**2
  64.     return (round(1/(1+sqrt(sum_of_squares)),3),len(zaednicki))
  65. #    return 1/(1+(sum_of_squares))
  66.  
  67. def sim_pearson(oceni,person1,person2):
  68.     # Se pravi lista na zaednicki predmeti (filmovi)
  69.     zaednicki=[]
  70.     for item in oceni[person1].keys():
  71.         if item in oceni[person2]:
  72.             zaednicki.append(item)
  73.     # ako nemaat zaednicki rejtinzi, vrati 0
  74.     if len(zaednicki)==0:
  75.         return 0
  76.  
  77.     sumaOceni1=0
  78.     sumaOceni2=0
  79.     sumaOceniKvadrati1=0
  80.     sumaOceniKvadrati2=0
  81.     sumaZaednickiProizvodi=0
  82.  
  83.     for item in zaednicki:
  84.         ocena1=oceni[person1][item]
  85.         ocena2=oceni[person2][item]
  86.         sumaOceni1+=ocena1
  87.         sumaOceni2+=ocena2
  88.         sumaOceniKvadrati1+=ocena1**2
  89.         sumaOceniKvadrati2+=ocena2**2
  90.         sumaZaednickiProizvodi+=ocena1*ocena2
  91.         # print ocena1,ocena2,item
  92.  
  93.     n=len(zaednicki)
  94.     broitel=n*sumaZaednickiProizvodi-sumaOceni1*sumaOceni2
  95.     imenitel=(n*sumaOceniKvadrati1-sumaOceni1**2)**0.5 * (n*sumaOceniKvadrati2-sumaOceni2**2)**0.5
  96.     if imenitel==0:
  97.         if broitel>0:
  98.             return 1
  99.         elif broitel<0:
  100.             return -1
  101.         else:
  102.             return -2
  103.  
  104.  
  105.     formula=broitel/imenitel
  106.     return (round(formula,3),len(zaednicki))
  107.  
  108. if __name__ == "__main__":
  109.  
  110.     korisnik1=input()
  111.     korisnik2=input()
  112.    
  113.     #korisnik1='Jack Matthews'
  114.     #korisnik2='Gene Seymour'
  115.     print sim_pearson(oceniPoKorisnici, korisnik1, korisnik2)
  116.     print sim_distance(oceniPoKorisnici, korisnik1, korisnik2)
  117.  
  118. zad3(tabela na slicnosti)
  119.  
  120. from math import sqrt
  121. import math
  122.  
  123. oceniPoKorisnici={
  124.     '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},
  125.     '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},
  126.     '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},
  127.     '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},
  128.     '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},
  129.     '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},
  130.     'Toby': {'Snakes on a Plane':4.5, 'Snitch': 5.0},
  131.     '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},
  132.     '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},
  133.     'Larry': {'Lady in the Water': 3.0, 'Just My Luck': 3.5, 'Snitch': 1.5, 'The Night Listener': 3.5}
  134.     }
  135.  
  136. def sim_distance(oceni,person1,person2):
  137.     # Se pravi lista na zaednicki predmeti (filmovi)
  138.     zaednicki={}
  139.     for item in oceni[person1].keys():
  140.         if item in oceni[person2]:
  141.             zaednicki[item]=1
  142.     # ako nemaat zaednicki rejtinzi, vrati 0
  143.     if len(zaednicki)==0:
  144.         return (0,0)
  145.     # Soberi gi kvadratite na site razliki
  146.      # sum_of_squares=sum([pow(oceni[person1][item]-oceni[person2][item],2)
  147.      #     for item in oceni[person1] if item in oceni[person2]])
  148.  
  149.     sum_of_squares=0
  150.     for item in zaednicki.keys():
  151.         sum_of_squares+=(oceni[person1][item]-oceni[person2][item])**2
  152.     return (round(1/(1+sqrt(sum_of_squares)),3),len(zaednicki))
  153. #    return 1/(1+(sum_of_squares))
  154.  
  155. def sim_pearson(oceni,person1,person2):
  156.     # Se pravi lista na zaednicki predmeti (filmovi)
  157.     zaednicki=[]
  158.     for item in oceni[person1].keys():
  159.         if item in oceni[person2]:
  160.             zaednicki.append(item)
  161.     # ako nemaat zaednicki rejtinzi, vrati 0
  162.     if len(zaednicki)==0:
  163.         return (0,0)
  164.  
  165.     sumaOceni1=0
  166.     sumaOceni2=0
  167.     sumaOceniKvadrati1=0
  168.     sumaOceniKvadrati2=0
  169.     sumaZaednickiProizvodi=0
  170.  
  171.     for item in zaednicki:
  172.         ocena1=oceni[person1][item]
  173.         ocena2=oceni[person2][item]
  174.         sumaOceni1+=ocena1
  175.         sumaOceni2+=ocena2
  176.         sumaOceniKvadrati1+=ocena1**2
  177.         sumaOceniKvadrati2+=ocena2**2
  178.         sumaZaednickiProizvodi+=ocena1*ocena2
  179.         # print ocena1,ocena2,item
  180.  
  181.     n=len(zaednicki)
  182.     broitel=n*sumaZaednickiProizvodi-sumaOceni1*sumaOceni2
  183.     imenitel=(n*sumaOceniKvadrati1-sumaOceni1**2)**0.5 * (n*sumaOceniKvadrati2-sumaOceni2**2)**0.5
  184.     if imenitel==0:
  185.         if broitel>0:
  186.             return (1,len(zaednicki))
  187.         elif broitel<0:
  188.             return (-1,len(zednicki))
  189.         else:
  190.             return (-2,len(zaednicki))
  191.  
  192.  
  193.     formula=broitel/imenitel
  194.     return (round(formula,3),len(zaednicki))
  195.  
  196. def TabelaNaSlicniKorisnici(oceni):
  197.     slicnosti={}
  198.     for critic1 in oceni.keys():
  199.         for critic2 in oceni.keys():
  200.             if critic1 == critic2:
  201.                 continue
  202.             slicnosti.setdefault(critic1,{})
  203.             s1 = sim_pearson(oceni,critic1,critic2)
  204.             s2 = sim_distance(oceni,critic1,critic2)
  205.             #if(isinstance(s1,int)):
  206.                # print critic1,critic2,s1,s2
  207.             slicnosti[critic1][critic2] = (s2[0],s1[0],s2[1])
  208.  
  209.     return slicnosti
  210. if __name__ == "__main__":
  211.  
  212.     korisnik1=input()
  213.     korisnik2=input()
  214.    
  215.  
  216.     #korisnik1='Larry'
  217.     #korisnik2='Gene Seymour'
  218.     # print oceniPoKorisnici
  219.     tabela=TabelaNaSlicniKorisnici(oceniPoKorisnici)
  220.     #for c in tabela.keys():
  221.     #    print c,tabela[c]
  222.     print tabela[korisnik1][korisnik2]
  223.  
  224.  
  225. ----Lab4
  226. zad1
  227.  
  228. from math import sqrt
  229.  
  230. oceniPoKorisnici={
  231.     '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},
  232.     '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},
  233.     '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},
  234.     '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},
  235.     '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},
  236.     '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},
  237.     'Toby': {'Snakes on a Plane':4.5, 'Snitch': 5.0},
  238.     '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},
  239.     '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},
  240.     'Larry': {'Lady in the Water': 3.0, 'Just My Luck': 3.5, 'Snitch': 1.5, 'The Night Listener': 3.5}
  241.     }
  242.  
  243. # Vrakja merka za slicnost bazirana na rastojanieto za person1 i person2
  244. def sim_distance(oceni,person1,person2):
  245.     si={}
  246.     for item in oceni[person1]:
  247.         if item in oceni[person2]:
  248.             si[item]=1
  249.     if len(si)==0: return 0
  250.     sum_of_squares=sum([pow(oceni[person1][item]-oceni[person2][item],2)
  251.     for item in oceni[person1] if item in oceni[person2]])
  252.     return 1/(1+sqrt(sum_of_squares))
  253.  
  254. def sim_pearson(oceni,person1,person2):
  255.     si={}
  256.     for item in oceni[person1]:
  257.         if item in oceni[person2]: si[item]=1
  258.     n=len(si)
  259.     if n==0: return 0
  260.     sum1=sum([oceni[person1][it] for it in si])
  261.     sum2=sum([oceni[person2][it] for it in si])
  262.     sum1Sq=sum([pow(oceni[person1][it],2) for it in si])
  263.     sum2Sq=sum([pow(oceni[person2][it],2) for it in si])
  264.     pSum=sum([oceni[person1][it]*oceni[person2][it] for it in si])
  265.     num=pSum-(sum1*sum2/n)
  266.     den=sqrt((sum1Sq-pow(sum1,2)/n)*(sum2Sq-pow(sum2,2)/n))
  267.     if den==0: return 0
  268.     r=num/den
  269.     return r
  270.    
  271. def transformPrefs(prefs):
  272.     result = {}
  273.     for person in prefs:
  274.         for item in prefs[person]:
  275.             result.setdefault(item,{})
  276.             result[item][person]=prefs[person][item]
  277.     return result
  278.  
  279.  
  280. def topMatches(prefs,person,n=4,similarity=sim_pearson):
  281.     #scores = []
  282.     scores=[(similarity(prefs,person,other),other)
  283.             for other in prefs if other!=person]
  284.     scores.sort()
  285.     scores.reverse()
  286.     return scores[0:n]
  287.  
  288. def getUserBasedRecomendations(oceni,korisnik,similarity=sim_pearson):
  289.     totals={}
  290.     simSums={}
  291.     for other in oceni:
  292.         if other==korisnik: continue
  293.         sim=similarity(oceni,korisnik,other)
  294.         if sim<=0: continue
  295.         for item in oceni[other]:
  296.             if item not in oceni[korisnik] or oceni[korisnik][item]==0:
  297.                 totals.setdefault(item,0)
  298.                 totals[item]+=oceni[other][item]*sim
  299.                 simSums.setdefault(item,0)
  300.                 simSums[item]+=sim
  301.                
  302.     rankings=[(total/simSums[item],item) for item,total in totals.items()]
  303.     rankings.sort()
  304.     rankings.reverse()
  305.     rankings = rankings[0:3]
  306.     return rankings
  307.    
  308. def getItemBasedRecomendations(oceni,korisnik,similarity=sim_pearson):
  309.     similar={}
  310.     films=transformPrefs(oceni)
  311.     for gledanFilm in oceni[korisnik]:
  312.             similar_filmovi=topMatches(films,gledanFilm)
  313.             for slicnost,slicen_film in similar_filmovi:
  314.                 if slicen_film not in oceni[korisnik] and (slicen_film not in similar or slicnost>similar[slicen_film]):
  315.                     similar[slicen_film]=slicnost
  316.    
  317.     rankings=sorted(similar, key=similar.get)
  318.     rankings.reverse()
  319.     rankings=rankings[0:3]
  320.     rankings.sort()
  321.     return rankings
  322.    
  323.  
  324. if __name__ == "__main__":
  325.     korisnik=input()
  326.    
  327.     rez=getUserBasedRecomendations(oceniPoKorisnici,korisnik,similarity=sim_pearson)
  328.     rez2=getItemBasedRecomendations(oceniPoKorisnici,korisnik,similarity=sim_pearson)
  329.    
  330.     rezultat= [x[1] for x in rez]
  331.     rezultat.sort()
  332.    
  333.     print "user-based:" , rezultat
  334.     print "item-based:" , rez2
Advertisement
Add Comment
Please, Sign In to add comment