Advertisement
TwiNNeR

snzl4z3

Nov 25th, 2016
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.56 KB | None | 0 0
  1. import math
  2.  
  3. oceniPoKorisnici = {
  4.     'Lisa Rose': {'Catch Me If You Can': 3.0, 'Snakes on a Plane': 3.5, 'Superman Returns': 3.5,
  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,
  7.                      'You, Me and Dupree': 3.5},
  8.     'Michael Phillips': {'Catch Me If You Can': 2.5, 'Lady in the Water': 2.5, 'Superman Returns': 3.5,
  9.                          'The Night Listener': 4.0, 'Snitch': 2.0},
  10.     'Claudia Puig': {'Snakes on a Plane': 3.5, 'Just My Luck': 3.0, 'The Night Listener': 4.5, 'Superman Returns': 4.0,
  11.                      'You, Me and Dupree': 2.5},
  12.     'Mick LaSalle': {'Lady in the Water': 3.0, 'Snakes on a Plane': 4.0, 'Just My Luck': 2.0, 'Superman Returns': 3.0,
  13.                      'You, Me and Dupree': 2.0},
  14.     'Jack Matthews': {'Catch Me If You Can': 4.5, 'Lady in the Water': 3.0, 'Snakes on a Plane': 4.0,
  15.                       'The Night Listener': 3.0, 'Superman Returns': 5.0, 'You, Me and Dupree': 3.5, 'Snitch': 4.5},
  16.     'Toby': {'Snakes on a Plane': 4.5, 'Snitch': 5.0},
  17.     'Michelle Nichols': {'Just My Luck': 1.0, 'The Night Listener': 4.5, 'You, Me and Dupree': 3.5,
  18.                          'Catch Me If You Can': 2.5, 'Snakes on a Plane': 3.0},
  19.     'Gary Coleman': {'Lady in the Water': 1.0, 'Catch Me If You Can': 1.5, 'Superman Returns': 1.5,
  20.                      'You, Me and Dupree': 2.0},
  21.     'Larry': {'Lady in the Water': 3.0, 'Just My Luck': 3.5, 'Snitch': 1.5, 'The Night Listener': 3.5}
  22. }
  23.  
  24.  
  25. def sim_distance(oceni, person1, person2):
  26.     # Se pravi lista na zaednicki predmeti (filmovi)
  27.     zaednicki = {}
  28.     for item in oceni[person1].keys():
  29.         if item in oceni[person2]:
  30.             zaednicki[item] = 1
  31.     # ako nemaat zaednicki rejtinzi, vrati 0
  32.     if len(zaednicki) == 0: return 0
  33.     # Soberi gi kvadratite na zaednickite razliki
  34.     sum_of_squares = sum([pow(oceni[person1][item] - oceni[person2][item], 2)
  35.                           for item in oceni[person1] if item in oceni[person2]])
  36.     ret = 1 / (1 + math.sqrt(sum_of_squares))
  37.     return (round(ret, 3), len(zaednicki))
  38.  
  39.  
  40. def sim_pearson(oceni, person1, person2):
  41.     # Se kreira recnik vo koj ke se cuvaat predmetite (filmovi) koi se oceneti od dvajcata
  42.     # Vo recnikot ni se vazni samo klucevite za da gi cuvame iminjata na filmovite koi se zaednicki, a vrednostite ne ni se vazni
  43.     zaednicki = {}
  44.     for item in oceni[person1]:
  45.         if item in oceni[person2]: zaednicki[item] = 1
  46.  
  47.     # Se presmetuva brojot na predmeti oceneti od dvajcata
  48.     n = len(zaednicki)
  49.  
  50.     # Ako nemaat zaednicki predmeti vrati korelacija 0
  51.     if n == 0: return 0
  52.  
  53.     # Soberi gi zaednickite oceni (rejtinzi) za  sekoja licnost posebno
  54.     sum1 = sum([oceni[person1][it] for it in zaednicki])
  55.     sum2 = sum([oceni[person2][it] for it in zaednicki])
  56.  
  57.     # Soberi gi kvadratite od zaednickite oceni (rejtinzi) za  sekoja licnost posebno
  58.     sum1Sq = sum([pow(oceni[person1][it], 2) for it in zaednicki])
  59.     sum2Sq = sum([pow(oceni[person2][it], 2) for it in zaednicki])
  60.  
  61.     # Soberi gi proizvodite od ocenite na dvete licnosti
  62.     pSum = sum([oceni[person1][it] * oceni[person2][it] for it in zaednicki])
  63.  
  64.     # Presmetaj go koeficientot na korelacija
  65.     num = pSum - (sum1 * sum2 / n)
  66.     den = math.sqrt((sum1Sq - pow(sum1, 2) / n) * (sum2Sq - pow(sum2, 2) / n))
  67.     if den == 0: return 0
  68.     r = num / den
  69.     return (round(r, 3), len(zaednicki))
  70.  
  71.  
  72. def TabelaNaSlicniKorisnici(oceni):
  73.     slicnosti = {}
  74.  
  75.     for person1 in oceni:
  76.         for person2 in oceni:
  77.             if person1 == person2:
  78.                 continue
  79.             pearson = sim_pearson(oceni, person1, person2)
  80.             distance = sim_distance(oceni, person1, person2)
  81.  
  82.             if person1 not in slicnosti.keys():
  83.                 slicnosti[person1] = {}
  84.  
  85.             if isinstance(pearson, int) or isinstance(distance, int):
  86.                 ret1 = 0
  87.                 ret2 = 0
  88.                 ret3 = 0
  89.             else:
  90.                 ret1 = round(pearson[0], 3)
  91.                 ret2 = round(distance[0], 3)
  92.                 ret3 = pearson[1]
  93.  
  94.             slicnosti[person1][person2] = (ret2, ret1, ret3)
  95.     return slicnosti
  96.  
  97.  
  98. if __name__ == "__main__":
  99.     korisnik1 = input()
  100.     korisnik2 = input()
  101.     # korisnik1='Mick LaSalle'
  102.     # korisnik2='Lisa Rose'
  103.     # print oceniPoKorisnici
  104.     tabela = TabelaNaSlicniKorisnici(oceniPoKorisnici)
  105.     # print tabela
  106.     print tabela[korisnik1][korisnik2]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement