tom_sawyer Posté 29 Juillet 2006 Posté 29 Juillet 2006 Bonjour à tous, Je suis en train de réfléchir à comment mettre en place la pondération d'un système de votes. Sur mes annuaires j'offre aux internautes la possibilité de noter chaque site. Je me sers ensuite de ces données (comme par exemple sur Depensez.com) pour présenter les sites les plus "populaires". Pour effectuer ce classement pour l'instant je ne me base que sur la note. C'est à dire qu'un site ayant un vote de 10 sera mieux placé qu'un site qui a une note de 9.99 avec 2000 votes, ce qui me parait un peu injuste C'est aussi facilement contournable puisqu'il suffit à un nouveau site de s'attribuer une note de 10 et ensuite d'attribuer une mauvaise note à chacun des autres sites pour apparaitre en tête avec ce système. Je souhaiterais donc prendre en compte à la fois la note mais aussi le nombre de votes. Un système simple serait par exemple d'établir un seuil de vote pour démarrer le classement puisqu'une adresse IP ne peut effectuer qu'un vote pour un site donné. Ca ne me semble pourtant pas la solution idéale car un iste avec 25 votes de 10 sera toujours devant un site avec 900 votes de 9 si je fixe un palier à 20 votes... Auriez-vous d'autres idées ? Merci
Vincent Posté 29 Juillet 2006 Posté 29 Juillet 2006 Peut être que la moyenne pondérée peut répondre a tes besoin. Cela a pour principe d'appliquer des coefficents (sorte de bonus ou de pénalité pour un certains nombre de valeur) Une autre idée serait de mettre une échelle de temps, et de partir sur des moyennes mobiles par exemple : on fait une moyenne de la note sur les 7 derniers jours glissants. si tu ajoutes cela à un minimum de vote, par exemple : 10. cela aura pour conséquence d'eliminer les sites qui ont 1 seul vote par jour et ensuite meme un site qui a 900 votes, aura une moyenne plus fluctuante car les votes les plus vieux ne compteront plus. sinon on peut aussi se baser sur l'ecart type mais en fait, mes cours de proba et de stats sont trop vieux pour que je puisse t'aider plus précisément...
Spidetra Posté 29 Juillet 2006 Posté 29 Juillet 2006 (modifié) Petite piste rapide, sans vraiment faire une analyse approfondie ( système à améliorer ). Plus tu as de votes pour un site donné, et plus la moyenne est fiable, en tout cas plus la moyenne est représentative de ce que pense ta communauté. 1. Tu va choisir un facteur de lissage arbitraire : 10, 100, 1000, 10000 a toi de voir. Un facteur dégressif qui va réduire ta moyenne. Plus ton facteur sera grand, plus ton système sera contraignant => plus il faudrat de vote pour arriver à classer un site. 2. Tu va diviser ce facteur par le nombre de votes obtenus, afin de pondérer ce facteur par le nombre de votants 4 Tu vas soustraire le résultat obtenus, à la moyenne du site. Ce qui donne en terme math : ( somme des notes obtenus / nombres de votes ) - ( facteur arbitraire / nombres de votes ) que l'on peut simplifier : ( somme des notes obtenus - facteur arbitraire ) / ( nombre de votes ) Imaginons que tu prenne 10 comme facteur arbitraire : 1 site avec un seul vote de 10 obtient une moyenne de 0 : ( 10 - 10 ) / 1 1 site avec 2 votes de 9 obtient une moyenne de 4 : ( 9 + 9 - 10 ) / 2 1 site avec 3 votes de 8 obtient une moyenne de 4,66 : ( 8 + 8 + 8 - 10 ) / 3 etc..... Plus ton facteur arbitraire sera grand, plus il faudrat des votes pour atténuer l'impact du facteur dégréssif. Si ton facteur est > 10, tu auras des moyennes négatives. C'est pas très grave et ça se gère très bien. A toi de faire des test pour choisir un facteur qui te convient : 10, 20, 50, 100, 1000...... A l'affichage, il me semble mieux d'afficher les moyennes réelles et le nombres de votes ( pas les moyennes lissées ). Par contre à l'affichage ça va faire bizarre, et il faudrat que tu l'explique à tes visiteurs. Le site avec une moyenne réelle de 8 sera classée devant le site avec une moyenne réelle de 10 Tu ne peux rien faire contre le fait qu'un concurrent viennent attribuer une mauvaise note. Une mauvaise note aura 2 effets : - baisser la moyenne réelle - mais aussi atténuer l'effet du facteur dégréssif. Ce facteur atténue les effets d'un vote dans un sens comme dans l'autre. Si un matheux passe par là, il te trouveras une meilleure fonction à base de Log, de ln ou autre fonction magique dont ils ont le secret Modifié 29 Juillet 2006 par Spidetra
Bourinho Posté 29 Juillet 2006 Posté 29 Juillet 2006 Salut, pour eviter le problème des valeurs négatives, tu peux tenter un truc du genre : Note = Moyenne * (1 - exp (-x * NombreDeVotes)) ou x est un coefficient à déterminer... A+
Spidetra Posté 30 Juillet 2006 Posté 30 Juillet 2006 La fonction de Bourinho est bc plus élégante que la mienne, en tout cas elle est bc moins linéaire Un x entre [0,1..0,5] donne des bonnes atténuations.
tom_sawyer Posté 30 Juillet 2006 Auteur Posté 30 Juillet 2006 Un GRAND merci à tous Je vais tester cette solution de lissage qui me parait excellente ! Note = Moyenne * (1 - exp (-x * NombreDeVotes)) Pour ceux comme moi qui ne connaissaient pas la fonction exp avant aujourdh'ui voici un cours sur la fonction exponentielle Merci encore, je vais tenter de mettre cela en place et je vous soumettrai le résultat ++
Bourinho Posté 30 Juillet 2006 Posté 30 Juillet 2006 Salut à tous, la fonction "exp" résoud le problème des résultats négatifs... ensuite, si vous ne trouvez pas un x qui correspond a ce que vous rechercher sur toute la plage que peut couvrir NombreDeVotes, rien ne vous interdit de passer à un truc un poil plus compliqué... Note = Moyenne * (1 - exp (- f(NombreDeVotes))) où f est croissante dans notre cas de figure.(pour que la note augmente quand le nombre de votes augmente...) Par contre, je pense que un truc du genre : Note = Moyenne * (1 - exp (-x * NombreDeVotes^y)) peut modéliser a peu prés tout ce que l'on souhaite...
tom_sawyer Posté 30 Juillet 2006 Auteur Posté 30 Juillet 2006 Merci Bourinho pour ces approfondissements Petite question : que signifie le ^y dans ta dernière formule ? Pour ceux qui veulent se faire une idée des fonctions, il est possible de calculer l'exp grace à google ++
tom_sawyer Posté 30 Juillet 2006 Auteur Posté 30 Juillet 2006 Merci Vincent, en fait pour le puissance c'était bon mais que représente y
Spidetra Posté 30 Juillet 2006 Posté 30 Juillet 2006 Si je comprend l'idée de Bourinho c'est d'introduire un second facteur d'atténuation. L'atténuation n'est pas seulement dépendante du nombre de votes. Les possibilités sont infinies. 1. Tu peux imaginer de faire intervenir un facteur temps. Imagine un site qui a reçu n votes de 10/10. Il a reçu ces n votes aujourd'hui ( il parle d'un thème d'actualité ) et que la moyenne s'approche de 10. Dans un an, ce site est totalement obsolète, mais il est toujours très bien classé. En un an il n'a reçu aucun vote supplémentaire. Est-il vraiment normal de garder un bon classement à ce site ? Tu peux imaginer un système qui va enlever 5% ( ou un autre facteur ) à un vote par tranche de 24 heures. Au bout de 20 jours le poids de ce vote est passé à zéro. Un site sera obligé de recevoir des votes régulièrement pour rester classé et pour continuer à limiter les effets du facteur d'atténuation. 2. Au contraire tu peux imaginer un système qui serait basé sur le nombre de visites. Dans ce cas, au contraire, les visites iraient en sens inverse du facteur d'atténuation. J'aime moins ce type de système. Il a tendance à renforcer leclassement des sites qui sont déjà bien ranker.
Bourinho Posté 30 Juillet 2006 Posté 30 Juillet 2006 Salut, en fait, je pensais à y en tant que constante. Comme x, c'est un facteur qui peut permettre de mieux faire correspondre l'atténutaion a ce que tu recherches si tu as une idée précise sur un exemple. Par exemple, si tu te dis qu'une video qui a un vote qui est un 10, tu souhaites lui mettres 8... si cela est ton seul souhait, tu fais un petit calcul pour trouver le x que tu souhaites! Mais si tu as aussi envie que celui qui a uniquement 2 votes à 10 ait une note de 9...comme tu as déjà fixé x, tu n'as plus rien pour faire vérifier cette nouvelle condition... Donc ensuite, plus tu souhaites vérifier de condition, plus cela devient compliqué... Si tu souhaites rester avec une seule variable, en clair le x, pour le choisir, une bonne méthode consiste à te fixer un nombre de votes à 10 pour avoir une note finale à 10... si tu affiches tes resultats avec deux chiffres après la virgule, tu peux faire comme suit : 9,995 < 10 * (1 - exp (-x*NombreDeVotesPourFaireDix)) (c'est pour que l'arrondi donne 10) 0,9995 < 1 - exp (-x*NombreDeVotesPourFaireDix) exp (-x*NombreDeVotesPourFaireDix) < 0,0005 -x*NombreDeVotesPourFaireDix < ln(0,0005) x > - ln(0,0005)/NombreDeVotesPourFaireDix la fonction "ln" est la fonction logarithme néperien, mais je ne connais pas son petit nom sous php... Exemple, pour NombreDeVotesPourFaireDix = 10, x = 0,77 peut se révéler être un bon choix... Un x entre [0,1..0,5] donne des bonnes atténuations. x= 0,1 => NombreDeVotesPourFaireDix = 77 x= 0,5 => NombreDeVotesPourFaireDix = 16 A+
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant