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;

}

}