Na tento problém dříve nebo později narazí každý programátor webu, kde se něco hodnotí a podle hodnocení něco řadí. Jako příklad uvedu e-shop, kde uživatelé hodnotí produkty a jiní si je mohou podle hodnocení řadit. Předpokládejme, že každému produktu můžete udělit podle kvality jednu až pět hvězdiček.
Zmiňovaný problém však nastává, když se zamyslíme nad tím, zda-li chceme při seřazení jako první z produktů zařadit ten, který má z jednoho jediného hlasu pět hvězdiček, nebo ten, který má z padesáti hlasů průměr 4,8. Z hlediska důvěryhodnosti je rozumné zvýhodnit druhou možnost.
Jako první je třeba zjistit koeficient důvěryhodnosti hlasování. Pro vyjádření tohoto jsem zvolil logaritmickou funkci o základu, který je roven počtu očekávaných hlasujících.
1 2 3 4 5 6 7 | $zaklad = 20; //počet očekávaných hlasujících //zjištění počtu hlasujících $dotaz = "SELECT COUNT(*) AS pocet FROM hlasovani WHERE id_produkt=$id_produkt;"; $hlasujici = mysql_fetch_array(mysql_query($dotaz)); $pocet = $hlasujici['pocet']; $duveryhodnost = log($pocet, $zaklad); |
Problém samozřejmě nastává, když odhlasoval pouze jeden člověk, protože poté je logaritmus roven nule a důvěryhodnost výsledku by tedy byla rovna nule. Tomuto problému je třeba se vyhnout, protože je nežádoucí a proto budeme jednoho hlasujícího člověka vydávat za 1,5 člověka.
1 2 3 | if ($pocet == 1) { $duveryhodnost = log(1.5, $zaklad); } |
Důvěryhodnost není procentuální vyjádření, protože při počtu hlasujících větším než je základ hodnota přesáhne 1. Dále je třeba vypočítat průměrnou známku při hlasování.
1 2 3 4 5 6 7 8 9 10 | if ($pocet!=0) { $dotaz2 = "SELECT SUM(hodnota) AS soucet FROM hlasovani WHERE id_produkt=$id_produkt;"; $celkem = mysql_fetch_array(mysql_query($dotaz2)); $soucet = $celkem['soucet']; $prumer = $soucet/$pocet; } else { $prumer = 0; } |
Obě hodnoty nakonec vynásobíme mezi sebou, abychom získali jakousi „oblíbenost produktu“.
1 2 3 4 5 6 7 8 | if ($pocet != 0) { $oblibenost = $duveryhodnost * $prumer; } else { $oblibenost = 0; } echo "Oblíbenost produktu: ".$oblibenost." (průměrná známka ".$prumer." z celkem ".$pocet." hlasů)"; |
Uvítám vaše připomínky k tématu.