Potřebuji implementovat nějaký algoritmus na hodnocení "věcí". O co jde:
Mám databázi "věcí" a uživatel může jednotlivé věci ohodnotit známkami 1 - 5 (5 je nejlepší). Potřebuji sestavit žebříček věcí podle celkového hodnocení. Teď nastává ta otázka, jakým způsobem vypočítat celkové hodnocení jednotlivé "věci".
Většina lidí by mi jistě poradila [ celkove_hodnocení = (hodnoceni_1 + hodnoceni_2 + ... + hodnoceni_n)/(n*5) ]. Jenže u tohoto způsobu mi nahoru vyskočí "věc" s jedním pětibodovým hodnocením, zatímco jiná "věc", která má třeba 10 hodnocení a celkové skóre 4.72, se umístí až pod touto "věcí". Čili bych potřeboval něco, co vezme v potaz počet hodnocení a bude počítat s jejich vahou.
Stačí mi i název takového algoritmu, který toto spočítá, zbytek si vygooglím. Nerad bych znova vynalézal kolo, toto už určitě někdo řešil... Díky
Fórum › PHP
Hodnotící algoritmus
To Kobi : Pokud nevadí angličtina, tento se například používá na lamer.cz http://www.evanmiller.org/how-not-to-sort-by-average-rating.html
Zdravím,
to co hledáš by měl být vážený půměr. Něco málo k němu se dozvíš například na http://cs.wikipedia.org/wiki/Vážený_průměr
co takhle uvazovat nejaky dostatecne velky pocet N nejnovejsich hodnoceni a prumer spocitat z nich tak, ze jestli ze jou data k dyzspozici tak s spocita prumer obycejne suma / pocet, jestlize nejsou tak se ta co jsou k duspozici a doplni se do N hodnocenimi se prostredni hodnotu (3),
to by melo byt dostatecne rychle, jediny problem je ze musis omezit ta posledni ohodnoceni
Vazeny prumer tady moc nepomuze, leda ze by lide, co hodnoti, mely nejake urovne "duveryhodnosti" a pak jejich znamky maji ruznou vahu, i tak to neodstrani problem s malym poctem extremnich hodnot.
Nejjednoduzsi by bylo tam dat "vypisovat veci s vice nez ____ hodnoceni" kde si uzivatel napise pocet hodnoceni.
Mimochodem je lepsi novinka, co je na strance den a ma hodnoceni 4,90 z 50 hodnoceni, nebo neco co ma po roce 4,79 z 1500 hodnoceni? Pro obe by se nasli argumenty, je potreba jenom najit pocet hodnoceni kde se tomu uz da verit. To muze byt napr 1/100 z nejvetsiho poctu hodnoceni, nebo natrvdo nejake cislo.
Nebo druha tezsi moznost- cim ma vec min hodnoceni, tim se posune vic ke stredu. tj napr pod 10 hodnoceni -+0.5 (4,6->4,1, 2,2->2,7, 2,8->3) pod 100 -+0,2 (4,4->4,2 3,1->3) pod 1000 -+0,1 . Toto jde napsat i bez hranic jako -+nejakakonstanta/pocethodnoceni. tady by to bylo napriklad pro nejaka konstanta 5:
pocethodnoceni aritmetickyprumer upravenahodnota
3 3,8 3,8-5/3=2,13 (nesmi pri uprave prekrocit 3 ) =3
4 3,8 3,8-5/4=3
10 3,8 3,8-5/10=3,3
50 3,8 3,8-5/50=3,7
100 3,8 3.8-5/100=3,795
1000 3,8 3,8-5/1000=3,7995
70 1,9 1,9+5/70=1,971
Jenom je potreba pohlidat, jestli je prumer pod nebo nad 3, aby se vedelo, jestli pricitat nebo odcitat a take, jestli je upravena hodnota pod nebo nad 3, aby ji neprekrocila.
Tim se mirne poupravi hodnota zalozena na nizkem poctu hodnoceni, zase je ale potreba najit primerene cisla a pocty kdy uz se tomu da verit.
To Krychlik : Díky za moc pěknou odpověď. Ještě bych se zeptal na dopřesnění. Jak najdu tu konstantu 5 + jak najdu / vytvořím ten střed 3. Platí že konstanta = počet možností a 3 se tedy rovná střed z daných 5 možností? :)
Celkem se mi to líbí :) A ještě bych se ujistil, v posledním řádku přičítáš, protože to číslo bude pořád menší, než 3, ale v prvním řádků odčítáš, protože by po přičtení už se přes 3 přehouplo. Je to tak?
To hrach : Tu konstantu si zvolis, muze to by jakekoli realne cislo, podle nalady proste (teda nemelo by byt zaporne :-) . Cim vetsi tim vetsi uprava, 5 sem dal jako priklad, to ze je to zrovna pocet moznosti byla nahoda.Klidne dej PI nebo sqrt(2), je to uplne jedno. Stred je stred hodnot tj 1-5 ma stred 3, 0-100 by melo 50.
To upresneni: Ne, pro >3 se vzdy odcita, pokud je vysledek mensi nez 3 tak bude 3. pro <3 presne naopak. Samozrejme misto 3 muze byt jiny stred hodnot.
To Krychlik:
ta aditivni konstanta je docela dobry napda, ale povede k tomu, ze se vsechna hodnoceni z [stred +- ta konstanta] prepoctou na [stred], imho by byla lespi jako multiplikativni, protoze potom se to bude prepocitavat spojite. Kvuli implementaci by pak asi taky bylo lepsi neuvazovat hodnoceni 1 .. 5 ale -2 .. 2 (pri prenasobovani nebude treba nic osetrovat kvuli prostrednistredni hodnote) a v zobrazeni vysledne hodnoceni zobrazovat s posunem o tu 3
To fari : Jenze kdyby se to jeste nasobilo treba rozdilem Aritmetickeho prumeru a stredu, tak moc extremni pripady se upravi az moc. Snad trochu to zmensit treba logaritmem.
Takze cely algoritmus upravy bude takhle:
Kdyz Aprumer=stred nic nedelat (neni to potreba upravovat a navic matematici nemaj radi logaritmus 0, nejaka porucha asi :-)
kdyz Aprumer>stred
noveHodnoceni= Aprumer- konstanta*log(abs(Aprumer-stred))/pocetHodnoceni //php neovladam
kdyz Aprumer<stred
noveHodnoceni= Aprumer+ konstanta*log(abs(Aprumer-stred))/pocetHodnoceni
Toto zabrani pretekani pres stred a take to bude velke extremy upravovat vic,ale zase ne moc, proste tak primerene. Jeste je ale potraba nastavit zaklad logarytmu, ale 10 je primerene, kdyby se nekdo nudil muze si to vysetrit, pekne namalovat grafy, badat, sledovat pekne krivky...
Jeste jedna posledni vec- pri uprave kodu, aby neprekracoval stred a vetsi extremy se upravovali vic, sem zapomnel na "malou drobnost" a to hodnota log pro (0,1) takze finalni vzorec je takovy
pro Aprumer=3 noveHodnoceni= Aprumer
pro Aprumer>3 noveHodnoceni= Aprumer- konstanta*log(abs(Aprumer+1-stred))/pocetHodnoceni
pro Aprumer<3 noveHodnoceni= Aprumer+ konstanta*log(abs(Aprumer-1-stred))/pocetHodnoceni
Tak ted to neprekracuje stred, upravuje hodnoty u 3 na jine cislo nez 3, velke extremy to upravuje vic nez male a pri malem poctu hodnoceni to upravuje vic nez pri velkem. Snad uz hotovo. Kdybych byl prvni na svete tak necht je to znamo jako Krychlikova rovnice :-)
a co tak zobrazovat poradie len tych "veci" ktore boli hodnotene aspon 10 krat...?...
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Hodnotící systém — založil Tester
Algoritmus — založil LuckaH
Algoritmus — založil Jirina.K
Algoritmus — založil RePRO
C++ algoritmus — založil silent
Moderátoři diskuze