ZASTOSOWANIE ALGORYTMÓW GRUPOWANIA
W SIECI WWW I E-BIZNESIE
Sprawozdanie II
Algorytmy w systemach rekomendujących
Czemiel Paulina
Hałaburda Krzysztof
Zadanie 1
Dla podanego zbioru dotyczącego zakupów (0 - oznacza przedmiot nie kupiony, 1 - kupiony przez
użytkownika) stworzyć listę rekomendacji dla klienta który kupił przedmioty 5 i 7.
Kod funkcji:
function licz_cos($p_i, $p_j, $dane) {
$licznik = 0;
$ilosc_osob = count($dane)+1;
for ($i = 1; $i < $ilosc_osob; $i++) {
$licznik += $dane[$i][$p_i] * $dane[$i][$p_j];
}
$pierwiastek[1] = 0;
$pierwiastek[2] = 0;
for ($i = 1; $i < $ilosc_osob; $i++) {
$pierwiastek[1]+= $dane[$i][$p_i];
$pierwiastek[2]+= $dane[$i][$p_j];
}
$mianownik = sqrt($pierwiastek[1]) * sqrt($pierwiastek[2]);
if ($mianownik == 0) {
return 0;
}
return $licznik / $mianownik;
}
Otrzymane wyniki:
Przedmiot 5
Przedmiot 7
p1
cos(1,5) = 0.35355
cos(1,7) = 0.00000
p2
cos(2,5) = 0.25000
cos(2,7) = 0.00000
p3
cos(3,5) = 0.00000
cos(3,7) = 0.00000
p4
cos(4,5) = 0.00000
cos(4,7) = 0.00000
p6
cos(6,5) = 0.00000
cos(5,7) = 0.43290
p7
cos(7,5) = 0.43290
cos(6,7) = 0.00000
p8
cos(8,5) = 0.43301
cos(8,7) = 0.83333
p9
cos(9,5) = 0.00000
cos(9,7) = 0.00000
p10
cos(10,5) = 0.00000
cos(10,7) = 0.00000
p11
cos(11,5) = 0.00000
cos(11,7) = 0.00000
p12
cos(12,5) = 0.00000
cos(12,7) = 0.00000
p13
cos(13,5) = 0.40089
cos(13,7) = 0.61721
p14
cos(14,5) = 0.00000
cos(14,7) = 0.00000
p15
cos(15,5) = 0.40089
cos(15,7) = 0.61721
Poniżej przedstawiono listę rekomendacji dla klienta:
Przedmiot 5
Przedmiot 7
brak
Przedmiot 8
Przedmiot 13
Przedmiot 15
Lista rekomendacji zostaje utworzona wówczas, gdy porównując popularność przedmiotu
otrzymamy wynik > 0,5. W przypadku klienta, który zakupił przedmiot 5 nie zostanie utworzona
lista rekomendacji, ponieważ z wykonanych obliczeń nie otrzymaliśmy wyników większych niż
0,5. Dla klienta kupującego przedmiot 7 w liście rekomendacji pojawią się przedmioty 8, 13, 15.
Zadanie 2
1. Podzielić dane na zbiór testowy (elementy o1 io4) i uczący (pozostałe 8 elementów).
2. Dla zbioru uczącego obliczyć średnie różnice Dij.
Otrzymane wyniki:
D12:-0.15
D13:-
D14:-
D15:5.14
D16:-
D17:15.09
D18:17.96
D19:-
D110:-
D21:0.15
D23:-
D24:-
D25:4.08
D26:-
D27:10.07
D28:9.515
D29:-
D210:-
D31:-
D32:-
D34:-
D35:-
D36:-
D37:-
D38:-
D39:-
D310:-
D41:-
D42:-
D43:-
D45:-
D46:-
D47:-
D48:-
D49:-
D410:-
D51:-5.14
D52:-4.08
D53:-
D54:-
D56:-
D57:2.005
D58:1.336
D59:-
D510:3.64
D61:-
D62:-
D63:-
D64:-
D65:-
D67:-
D68:-
D69:-
D610:-
D71:-15.09
D72:-10.07
D73:-
D74:-
D75:- 2.005
D76:-
D78:- 0.669
D79:-
D710:14.8
D81:-17.96
D82:-9.515
D83:-
D84:-
D85:-1.336
D86:-
D87:0.669
D89:-
D810:11.31
D91:-
D92:-
D93:-
D94:-
D95:-
D96:-
D97:-
D98:-
D910:-
D101:-
D102:-
D103:-
D104:-
D105:-3.64
D106:-
D107:-14.8
D108:-11.31
D109:-
3. Dla każdego przypadku i ze zbioru testowego wyznaczyć błąd RMSE.
3.1 dla każdej oceny j danego użytkownika i należy obliczyć wartość przewidywaną Pi i
porównać ją z rzeczywistą Ri.
3.2 obliczyć RMSEi jako pierwiastek z wyrażenia 1/noi(Pi0Ri)2, gdzie noi oznacza liczbę ocen
danego użytkownika.
Oceny dla: o1
Oceny dla: o4
p1
14.21667
7.38750
p2
9.37500
10.03333
p3
-
0
p4
-
0
p5
5.43389
-1.23105
p6
-
0
p7
1.51222
-3.63842
p8
-2.48611
-5.24684
p9
-
0
p10
-8.43000
-12.76333
4. Ostateczny błąd RMSE=RMSE1+RMSE2+...+RMSEn01+RMSEn, gdzie n oznacza liczbę
wszystkich przypadków w zbiorze testowym.
Suma:
Różnice w ocenach o1 RMSE:
Różnice w ocenach o4 RMSE:
0.08150
0.25187
0.06158
0.05783
0.36335
0.47653
0.13191
0.39495
1.02962
Suma wszystkich przypadków zbioru testowego: 1,4245749458647.
Kod funkcji:
function wylicz_Dij($dane){
$Dij = array();
$ilosc_produktow = count($dane[1]);
$ilosc_osob = count($dane)+1;
for($i=1;$i<$ilosc_produktow;$i++){
for($j=1;$j<$ilosc_produktow;$j++){
if($i<>$j){
$suma=0;$ilosc_par=0;
for($o=1;$o<$ilosc_osob;$o++){
if(($dane[$o][$i]<>'-')&&($dane[$o][$j]<>'-'))
{
$suma += (($dane[$o][$i]) - ($dane[$o][$j]));
$ilosc_par++;
}
}
if($ilosc_par==0){
$Dij[$i.$j]['wartosc'] = $Dij[$i.$j]['ilosc'] = "-";
}else{
$Dij[$i.$j]['wartosc'] = $suma/$ilosc_par;
$Dij[$i.$j]['ilosc'] = $ilosc_par;
}
}
}
}
return $Dij;
}
function licz_ocene($p_i,$Dij,$dane){
$ocena = 0;
$ilosc_produktow = count($dane);
$p = array();
for($i=1;$i<$ilosc_produktow;$i++){
if($dane[$i]<>"-" && $Dij[$p_i.$i]['wartosc']<>"-"){
$p[$i]['wartosc'] = $dane[$i] + $Dij[$p_i.$i]['wartosc'];
$p[$i]['ilosc'] = $Dij[$p_i.$i]['ilosc'];
}
}
$licznik = 0;$mianownik = 0;
for($i=1;$i<$ilosc_produktow;$i++){
if(isset($p[$i]))
{
$licznik += $p[$i]['wartosc']*$p[$i]['ilosc'];
$mianownik += $p[$i]['ilosc'];
}
}
if($mianownik == 0){
return '-';
}else{
return $licznik/$mianownik;
}
}