ZASTOSOWANIE ALGORYTMÓW GRUPOWANIA
W SIECI WWW I E-BIZNESIE
Sprawozdanie II
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;
}
}