Advertisement
nanorocks

recommenden_systems_lab33_ex

May 20th, 2018
493
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.06 KB | None | 0 0
  1. #-*- coding: utf-8 -*-
  2.  
  3. """
  4.  
  5. Да се напише функција која ќе генерира табела на слични корисници претставена како речник од речници
  6. (клучеви се имињата на корисниците), така што за секој пар корисници ќе чува торка од сличност базирана на Пеарсонова корелација,
  7. сличност базирана на Евклидово растојание, и број на заеднички оцени (оцени дадени за исти филмови). Вредностите да бидат заокружени на 3
  8. децимали. За прочитани имиња на двајца корисници да се испечати торката која се чува во генерираната табела.
  9.  
  10. """
  11.  
  12.  
  13. oceniPoKorisnici={
  14.     '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},
  15.     '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},
  16.     '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},
  17.     '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},
  18.     '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},
  19.     '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},
  20.     'Toby': {'Snakes on a Plane':4.5, 'Snitch': 5.0},
  21.     '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},
  22.     '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},
  23.     'Larry': {'Lady in the Water': 3.0, 'Just My Luck': 3.5, 'Snitch': 1.5, 'The Night Listener': 3.5}
  24.     }
  25.  
  26. from math import sqrt
  27.  
  28.  
  29. # Vrakja merka za slicnost bazirana na rastojanieto za person1 i person2
  30. def sim_distance(oceni, person1, person2):
  31.     # Se pravi lista na zaednicki predmeti (filmovi)
  32.  
  33.     filmovi1=set(oceni[person1].keys())
  34.     filmovi2=set(oceni[person2].keys())
  35.     zaednicki = filmovi1.intersection(filmovi2)
  36.  
  37.     if len(zaednicki) == 0: return 0
  38.  
  39.     suma = 0.0
  40.     for item in zaednicki:
  41.         ocena1 = oceni[person1][item]
  42.         ocena2 = oceni[person2][item]
  43.         suma += (ocena1 - ocena2) ** 2
  44. #         print(item, person1, ocena1, person2, ocena2)
  45.  
  46.     return 1 / (1 + sqrt(suma))
  47.  
  48.  
  49.  
  50.  
  51. # Go vrakja koeficientot na Pearsonova korelacija pomegu p1 i p2 (licnost 1 i licnost 2)
  52. # Vrednostite se pomegu -1 i 1
  53. def sim_pearson(oceni, p1, p2):
  54.     # Se kreira recnik vo koj ke se cuvaat predmetite (filmovi) koi se oceneti od dvajcata
  55.     # Vo recnikot ni se vazni samo klucevite za da gi cuvame iminjata na filmovite koi se zaednicki, a vrednostite ne ni se vazni
  56.     zaednicki = set()
  57.     for item in oceni[p1]:
  58.         if item in oceni[p2]:
  59.             zaednicki.add(item)
  60.  
  61.     # Se presmetuva brojot na predmeti oceneti od dvajcata
  62.     n = len(zaednicki)
  63.  
  64.     # Ako nemaat zaednicki predmeti vrati korelacija 0
  65.     if n == 0: return (0, 0)
  66.  
  67.     # Soberi gi zaednickite oceni (rejtinzi) za  sekoja licnost posebno
  68.     sum1 = 0
  69.     sum2 = 0
  70.  
  71.     # Soberi gi kvadratite od zaednickite oceni (rejtinzi) za  sekoja licnost posebno
  72.     sum1Sq = 0
  73.     sum2Sq = 0
  74.  
  75.     # Soberi gi proizvodite od ocenite na dvete licnosti
  76.     pSum = 0
  77.     for item in zaednicki:
  78.         ocena1 = oceni[p1][item]
  79.         ocena2 = oceni[p2][item]
  80.         sum1 += ocena1
  81.         sum1Sq += ocena1 ** 2
  82.         sum2 += ocena2
  83.         sum2Sq += ocena2 ** 2
  84.         pSum += ocena1 * ocena2
  85.  
  86.     # Presmetaj go koeficientot na korelacija
  87.     num = pSum - (sum1 * sum2 / n)
  88.     den = sqrt((sum1Sq - pow(sum1, 2) / n) * (sum2Sq - pow(sum2, 2) / n))
  89.     if den == 0: return (0,0)
  90.     r = num / den
  91.  
  92.     return (r,n)
  93.  
  94.  
  95. def novaTabela(oceniPoKorisnici):
  96.     slicni = {}
  97.  
  98.     for korisnik1, vrednos1 in oceniPoKorisnici.items():
  99.         for korisnik2, vrednos2 in oceniPoKorisnici.items():
  100.             if korisnik1 == korisnik2:
  101.                 continue
  102.             distance = sim_distance(oceniPoKorisnici, korisnik1, korisnik2)
  103.             paerson,sum_dis = sim_pearson(oceniPoKorisnici, korisnik1, korisnik2)
  104.             slicni[(korisnik1, korisnik2)] = (round(distance,3), round(paerson,3), sum_dis)
  105.  
  106.     return slicni
  107.  
  108. if __name__ == '__main__':
  109.  
  110.     korisnik1 = 'Larry'
  111.     korisnik2 = 'Gene Seymour'
  112.  
  113.  
  114.     # korisnik1 = input()
  115.     # korisnik2 = input()
  116.  
  117.     tabela = novaTabela(oceniPoKorisnici)
  118.     print(tabela[(korisnik1, korisnik2)])
  119.  
  120.     pass
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement