81 votes

Quelle est la meilleure façon de trier selon un classement de 5 étoiles?

Je suis en train de trier un tas de produits par les notes des clients à l'aide d'un 5 étoiles du système. Le site que je vais mettre cela en place pour ne pas avoir beaucoup de cotes et de continuer à ajouter de nouveaux produits, il aura généralement un petit nombre de produits avec un faible nombre de cotes.

J'ai essayé en utilisant la moyenne étoiles, mais que l'algorithme échoue lorsqu'il y a un petit nombre d'évaluations.

Exemple d'un produit qui a 3x 5 étoiles ne serait meilleur qu'un produit qui a 100x 5 étoiles et 2x 2 étoiles.

Ne pas le deuxième produit d'apparaître plus haut parce qu'il est statistiquement plus digne de confiance en raison du plus grand nombre de notations?

97voto

Martin Harris Points 18057

Pour leur Top 250 films de la liste IMDB utilise une estimation Bayésienne. C'est une belle manière de prendre le nombre d'électeurs en considération.

À partir d' ici:

La formule pour calculer le Haut Nominale de 250 Titres donne un vrai Bayésienne estimation:

pondérée de notation (WR) = (v ś (v+m)) × R + (m ś (v+m)) × C

où:

* R = average for the movie (mean) = (Rating)
* v = number of votes for the movie = (votes)
* m = minimum votes required to be listed in the Top 250 (currently 1300)
* C = the mean vote across the whole report (currently 6.8)

pour le Top 250, seuls les votes de régulièrement, les électeurs sont pris en compte.

20voto

Greg Points 411

Vous pouvez regarder cette page pour obtenir une bonne analyse:

http://www.evanmiller.org/how-not-to-sort-by-average-rating.html

Fondamentalement, vous voulez estimer la probabilité que vu les notes que vous avez, le "vrai" score (si vous l'aviez infini de l'évaluation) est supérieure à la quantité (comme, par exemple, le nombre similaire pour un autre point que vous êtes de tri contre.)

Voir l'article pour la réponse, mais la conclusion est que vous voulez utiliser la Wilson confiance. L'article donne l'équation et l'exemple de code Ruby (facilement traduit dans une autre langue).

8voto

Beska Points 6717

Ainsi, selon le degré de complexité que vous voulez faire, vous pourriez avoir des classements en outre être pondérée en fonction du nombre de cotes de la personne a fait, et ce que ces notations sont. Si la personne n'a fait qu'une seule note, il pourrait être un complice de notation, et pourrait compter pour moins. Ou si la personne a déterminé beaucoup de choses dans la catégorie a, mais peu dans la catégorie b, et a une note moyenne de 1.3 sur 5 étoiles, ça sonne comme de la catégorie a peut être artificiellement écrasés par le faible score moyen de cet utilisateur, et doit être ajusté.

Mais assez de fabrication complexe. Nous allons faire simple.

En supposant que nous travaillons avec seulement deux valeurs, ReviewCount et AverageRating, pour un article en particulier, il serait logique pour moi de regarder ReviewCount essentiellement comme étant la "fiabilité" de la valeur. Mais nous ne voulons pas seulement d'apporter des scores bas à faible ReviewCount éléments: un seul étoiles est probablement aussi peu fiable qu'un seul 5 étoiles. Donc, ce que nous voulons faire est probablement de la moyenne vers le milieu: 3.

Donc, fondamentalement, je pense à une équation de quelque chose comme X * AverageRating + Y * 3 = la-cote-nous-envie. Afin de rendre cette valeur de sortir à droite nous avons besoin de X+Y est égale à 1. Aussi nous avons besoin de X à l'augmentation de la valeur que ReviewCount augmente...avec un examen comte de 0, x doit être égal à 0 (en nous donnant une équation de "3"), et avec une infinie examen nombre X doit être de 1 (ce qui rend l'équation = AverageRating).

Quels sont donc X et Y équations? Pour le X de l'équation voulez la variable dépendante à l'infini de 1 lorsque la variable indépendante approche de l'infini. Un bon ensemble d'équations est quelque chose comme: Y = 1/(facteur^RatingCount) et (en utilisant le fait que X doit être égal à 1-Y) X = 1 – (1/(facteur^RatingCount)

Ensuite, nous pouvons ajuster "facteur" pour s'adapter à la gamme que nous recherchons.

J'ai utilisé ce simple programme C# pour essayer quelques facteurs:

        // We can adjust this factor to adjust our curve.
        double factor = 1.5;  

        // Here's some sample data
        double RatingAverage1 = 5;
        double RatingCount1 = 1;

        double RatingAverage2 = 4.5;
        double RatingCount2 = 5;

        double RatingAverage3 = 3.5;
        double RatingCount3 = 50000; // 50000 is not infinite, but it's probably plenty to closely simulate it.

        // Do the calculations
        double modfactor = Math.Pow(factor, RatingCount1);
        double modRating1 = (3 / modfactor)
            + (RatingAverage1 * (1 - 1 / modfactor));

        double modfactor2 = Math.Pow(factor, RatingCount2);
        double modRating2 = (3 / modfactor2)
            + (RatingAverage2 * (1 - 1 / modfactor2));

        double modfactor3 = Math.Pow(factor, RatingCount3);
        double modRating3 = (3 / modfactor3)
            + (RatingAverage3 * (1 - 1 / modfactor3));

        Console.WriteLine(String.Format("RatingAverage: {0}, RatingCount: {1}, Adjusted Rating: {2:0.00}", 
            RatingAverage1, RatingCount1, modRating1));
        Console.WriteLine(String.Format("RatingAverage: {0}, RatingCount: {1}, Adjusted Rating: {2:0.00}",
            RatingAverage2, RatingCount2, modRating2));
        Console.WriteLine(String.Format("RatingAverage: {0}, RatingCount: {1}, Adjusted Rating: {2:0.00}",
            RatingAverage3, RatingCount3, modRating3));

        // Hold up for the user to read the data.
        Console.ReadLine();

Si vous ne vous souciez pas de la copie, il donne à cette sortie:

RatingAverage: 5, RatingCount: 1, Adjusted Rating: 3.67
RatingAverage: 4.5, RatingCount: 5, Adjusted Rating: 4.30
RatingAverage: 3.5, RatingCount: 50000, Adjusted Rating: 3.50

Quelque chose comme ça? Vous pourriez évidemment ajuster le "facteur" de la valeur que nécessaire pour obtenir le type de pondération que vous voulez.

7voto

Welbog Points 32952

Vous pouvez trier par médiane au lieu de la moyenne arithmétique. Dans ce cas, les deux exemples ont une médiane de 5, de sorte que les deux ont le même poids dans un algorithme de tri.

Vous pouvez utiliser un mode pour le même effet, mais la médiane est probablement une meilleure idée.

Si vous souhaitez attribuer plus de poids à l'produit avec 100 5 étoiles, vous aurez probablement envie d'aller avec une sorte d'pondérée de la mode, d'attribuer plus de poids aux notations avec la même médiane, mais avec plus de voix.

3voto

Jordan Reiter Points 8679

Si vous avez juste besoin d'un rapide et bon marché de la solution pour la plupart, travaillent sans l'aide de beaucoup de calcul, voici une option (en supposant que de 1 à 5 de l'échelle de notation)

SELECT Products.id, Products.title, avg(Ratings.score), etc
FROM
Products INNER JOIN Ratings ON Products.id=Ratings.product_id
GROUP BY 
Products.id, Products.title
ORDER BY (SUM(Ratings.score)+25.0)/(COUNT(Ratings.id)+20.0) DESC, COUNT(Ratings.id) DESC

En ajoutant en 25 et en divisant par le nombre total de notes + 20, vous êtes essentiellement en ajoutant 10 des pires scores et les 10 meilleurs scores pour les votes, et ensuite le tri en conséquence.

Il y a des problèmes connus. Par exemple, elle a injustement récompenses à faible notation des produits avec peu de notes (comme ce graphique montre, des produits avec une note moyenne de 1 et une cote de 1,2 tandis que les produits avec une note moyenne de 1 et 1k+ cotes score proche à 1,05). Vous pourrait aussi affirmer qu'il punit injustement des produits de haute qualité avec quelques notations.

Ce graphique montre ce qui se passe pour tous les 5 notes sur 1-1000 cotes: http://www.wolframalpha.com/input/?i=Plot3D%5B%2825%2Bxy%29/%2820%2Bx%29%2C%7Bx%2C1%2C1000%7D%2C%7By%2C0%2C6%7D%5D

Vous pouvez voir le pendage vers le haut au bas de la liste d'écoute, mais dans l'ensemble c'est juste un classement, je pense. Vous pouvez également regarder cela de cette façon:

http://www.wolframalpha.com/input/?i=Plot3D%5B6-%28%2825%2Bxy%29/%2820%2Bx%29%29%2C%7Bx%2C1%2C1000%7D%2C%7By%2C0%2C6%7D%5D

Si vous laissez tomber une bille sur la plupart des endroits dans ce graphique, il sera automatiquement rouleau vers des produits à la fois avec des scores élevés et des notes plus élevées.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X