Что лучший путь состоит в том, чтобы отсортировать по пятизвездочной оценке?

mod_php не является единственным способом использовать PHP. Можно использовать fastcgi. PHP должен быть скомпилирован с --enable-fastcgi.

PHP как FastCGI: http://www.fastcgi.com/drupal/node/5?q=node/10

64
задан Mechanical snail 21 September 2012 в 03:45
поделиться

6 ответов

До 2015 года в базе данных Internet Movie Database (IMDb) публично перечислялась формула, используемая для ранжирования их списка фильмов Top 250 . Цитата:

Формула для расчета 250 наименований с самым высоким рейтингом дает истинную байесовскую оценку :

 взвешенный рейтинг (WR) = (v ÷ (v + m)) × R + (m ÷ (v + m)) × C

где:

  • R = среднее значение для фильма (среднее)
  • v = количество голосов за фильм
  • m = минимальное количество голосов, необходимых для попадания в список 250 лучших (в настоящее время 25000)
  • C = среднее количество голосов по всему отчету (в настоящее время 7.0)

Для 250 лучших учитываются только голоса обычных избирателей.

Это не так сложно понять. Формула следующая:

rating = (v / (v + m)) * R +
         (m / (v + m)) * C;

Что можно математически упростить до:

rating = (R * v + C * m) / (v + m);

Переменные:

  • R - собственный рейтинг предмета. R - среднее значение голосов, полученных за элемент. (Например, если за элемент не проголосовали, его R равно 0. Если кто-то поставит ему 5 звезд, R станет 5. Если кто-то поставит ему 1 звезду, R станет 3, в среднем [1, 5] . И так далее.)
  • C - Средний рейтинг элемента. Найдите R каждого элемента в базе данных, включая текущий, и возьмите их среднее значение; то есть C. (Предположим, что в базе данных 4 элемента, и их оценки равны [2, 3, 5, 5] . C составляет 3,75, среднее значение этих чисел.)
  • v - Количество голосов. за предмет. (Другой пример: если за элемент проголосовали 5 человек, v равно 5.)
  • m - настраиваемый параметр. Величина «сглаживания», применяемая к рейтингу, зависит от количества голосов (v) по отношению к m. Отрегулируйте m до тех пор, пока результат вас не удовлетворит. И не следует неверно истолковывать описание m IMDb как «минимальное количество голосов, необходимых для внесения в список» - эта система вполне способна ранжировать элементы с меньшим количеством голосов, чем m.

Все формулы: значение C до расчета среднего. Вначале, когда данных недостаточно (т. Е. Количество голосов значительно меньше m), это приводит к заполнению пробелов средними данными. Однако по мере накопления голосов мнимые голоса в конечном итоге будут вытеснены реальными.

В этой системе голоса не вызывают резких колебаний рейтинга. Вместо этого они просто немного возмущают его в каком-то направлении.

Когда есть ноль голосов, существуют только воображаемые голоса, и все они C. Таким образом, каждый элемент начинается с рейтинга C.

См. Также:

71
ответ дан 24 November 2019 в 15:51
поделиться

Очевидно, что небольшое количество оценок ставит эту проблему в разряд статистических. Тем не менее ...

Ключевым элементом повышения качества совокупной оценки является «оценка оценщика», то есть вести учет оценок, которые поставил каждый конкретный «оценщик» (относительно других). Это позволяет взвесить их голоса во время процесса агрегирования.

Другое решение, в большей степени выходящее из строя, состоит в том, чтобы предоставить конечным пользователям подсчет (или указание его диапазона) голосов за базовый элемент.

0
ответ дан 24 November 2019 в 15:51
поделиться

Я настоятельно рекомендую книгу «Программирование коллективного разума» Тоби Сегарана (OReilly) ISBN 978-0-596-52932-1 в котором обсуждается, как извлечь значимые данные из поведения толпы. Примеры написаны на Python, но их достаточно легко преобразовать.

Я настоятельно рекомендую книгу «Программирование коллективного разума» Тоби Сегарана (OReilly) ISBN 978-0-596-52932-1, в которой обсуждается, как извлекать значимые данные из поведения толпы. Примеры написаны на Python, но их достаточно легко преобразовать.

Я настоятельно рекомендую книгу «Программирование коллективного разума» Тоби Сегарана (OReilly) ISBN 978-0-596-52932-1, в которой обсуждается, как извлекать значимые данные из поведения толпы. Примеры написаны на языке Python, но его достаточно легко преобразовать.

-1
ответ дан 24 November 2019 в 15:51
поделиться

Вы можете отсортировать по медиане вместо среднего арифметического. В этом случае в обоих примерах медиана равна 5, поэтому оба будут иметь одинаковый вес в алгоритме сортировки.

Вы можете использовать режим для того же эффекта, но медиана, вероятно, лучше.

Если вы хотите присвоить дополнительный вес продукту со 100 5-звездочными оценками, вы, вероятно, захотите использовать какой-то режим взвешивания, придавая больший вес рейтингам с той же средней, но с большим количеством голосов.

7
ответ дан 24 November 2019 в 15:51
поделиться

Что ж, в зависимости от того, насколько сложным вы хотите это сделать, вы можете дополнительно взвесить оценки на основе того, сколько оценок сделал человек и каковы эти оценки. Если человек сделал только одну оценку, это может быть рейтинг шилла, и он может рассчитывать меньше. Или, если человек оценил много вещей в категории а, но мало в категории б, и имеет средний рейтинг 1,3 из 5 звезд, это звучит так, как будто категория а может быть искусственно отягощена низкой средней оценкой этого пользователя, и следует отрегулировать.

Но достаточно усложнять. Давайте сделаем это проще.

Предполагая, что мы работаем только с двумя значениями, ReviewCount и AverageRating, для конкретного элемента, мне было бы разумно рассматривать ReviewCount как по существу значение «надежности». Но мы не просто хотим снизить баллы по элементам с низким значением ReviewCount: оценка в одну звезду, вероятно, так же ненадежна, как и оценка в пять звезд. Итак, мы хотим получить среднее значение к середине: 3.

В общем, я думаю о уравнении вроде X * AverageRating + Y * 3 = the-rating-we-want. Чтобы это значение получилось правильным, нам нужно, чтобы X + Y равнялось 1. Также нам нужно, чтобы X увеличивался в значении по мере увеличения ReviewCount ... при количестве отзывов 0 x должен быть 0 (что дает нам уравнение « 3 ”), а при бесконечном количестве просмотров X должен быть равен 1 (что дает уравнение = AverageRating).

Так что такое уравнения X и Y? Для уравнения X необходимо, чтобы зависимая переменная асимптотически приближалась к 1, когда независимая переменная приближается к бесконечности. Хороший набор уравнений выглядит примерно так: одиночный однозвездочный рейтинг, вероятно, так же ненадежен, как одиночный пятизвездочный рейтинг. Итак, то, что мы хотим сделать, - это, вероятно, среднее значение к середине: 3.

Итак, в основном, я думаю о уравнении вроде X * AverageRating + Y * 3 = the-rating-we-want. Чтобы это значение получилось правильным, нам нужно, чтобы X + Y равнялось 1. Также нам нужно, чтобы X увеличивался в значении по мере увеличения ReviewCount ... при количестве отзывов 0 x должен быть 0 (что дает нам уравнение « 3 ”), а при бесконечном количестве просмотров X должен быть равен 1 (что дает уравнение = AverageRating).

Так что такое уравнения X и Y? Для уравнения X необходимо, чтобы зависимая переменная асимптотически приближалась к 1, когда независимая переменная приближается к бесконечности. Хороший набор уравнений выглядит примерно так: одиночный однозвездочный рейтинг, вероятно, так же ненадежен, как одиночный пятизвездочный рейтинг. Итак, то, что мы хотим сделать, - это, вероятно, среднее значение к середине: 3.

Итак, в основном, я думаю о уравнении вроде X * AverageRating + Y * 3 = the-rating-we-want. Чтобы это значение получилось правильным, нам нужно, чтобы X + Y равнялось 1. Также нам нужно, чтобы X увеличивался в значении по мере увеличения ReviewCount ... при количестве отзывов 0 x должен быть 0 (что дает нам уравнение « 3 ”), а при бесконечном количестве просмотров X должен быть равен 1 (что дает уравнение = AverageRating).

Так что такое уравнения X и Y? Для уравнения X необходимо, чтобы зависимая переменная асимптотически приближалась к 1, когда независимая переменная приближается к бесконечности. Хороший набор уравнений выглядит примерно так: Итак, мы хотим получить среднее значение к середине: 3.

В общем, я думаю о уравнении вроде X * AverageRating + Y * 3 = the-rating-we-want. Чтобы это значение получилось правильным, нам нужно, чтобы X + Y равнялось 1. Также нам нужно, чтобы X увеличивался в значении по мере увеличения ReviewCount ... при количестве отзывов 0 x должен быть 0 (что дает нам уравнение « 3 ”), а при бесконечном количестве просмотров X должен быть равен 1 (что дает уравнение = AverageRating).

Так что такое уравнения X и Y? Для уравнения X необходимо, чтобы зависимая переменная асимптотически приближалась к 1, когда независимая переменная приближается к бесконечности. Хороший набор уравнений выглядит примерно так: Итак, то, что мы хотим сделать, - это, вероятно, среднее значение к середине: 3.

Итак, в основном, я думаю о уравнении вроде X * AverageRating + Y * 3 = the-rating-we-want. Чтобы это значение получилось правильным, нам нужно, чтобы X + Y равнялось 1. Также нам нужно, чтобы X увеличивался в значении по мере увеличения ReviewCount ... при количестве отзывов 0 x должен быть 0 (что дает нам уравнение « 3 ”), а при бесконечном количестве просмотров X должен быть равен 1 (что дает уравнение = AverageRating).

Так что такое уравнения X и Y? Для уравнения X необходимо, чтобы зависимая переменная асимптотически приближалась к 1, когда независимая переменная приближается к бесконечности. Хороший набор уравнений выглядит примерно так: Чтобы это значение получилось правильным, нам нужно, чтобы X + Y равнялось 1. Также нам нужно, чтобы X увеличивался в значении по мере увеличения ReviewCount ... при количестве отзывов 0 x должен быть 0 (что дает нам уравнение « 3 ”), а при бесконечном количестве просмотров X должен быть равен 1 (что дает уравнение = AverageRating).

Так что такое уравнения X и Y? Для уравнения X необходимо, чтобы зависимая переменная асимптотически приближалась к 1, когда независимая переменная приближается к бесконечности. Хороший набор уравнений выглядит примерно так: Чтобы это значение получилось правильным, нам нужно, чтобы X + Y равнялось 1. Также нам нужно, чтобы X увеличивался в значении по мере увеличения ReviewCount ... при количестве отзывов 0 x должен быть 0 (что дает нам уравнение « 3 ”), а при бесконечном количестве просмотров X должен быть равен 1 (что дает уравнение = AverageRating).

Так что такое уравнения X и Y? Для уравнения X необходимо, чтобы зависимая переменная асимптотически приближалась к 1, когда независимая переменная приближается к бесконечности. Хороший набор уравнений выглядит примерно так:

Так что такое уравнения X и Y? Для уравнения X необходимо, чтобы зависимая переменная асимптотически приближалась к 1, когда независимая переменная приближается к бесконечности. Хороший набор уравнений выглядит примерно так:

Так что такое уравнения X и Y? Для уравнения X необходимо, чтобы зависимая переменная асимптотически приближалась к 1, когда независимая переменная приближается к бесконечности. Хороший набор уравнений выглядит примерно так: Y = 1 / (коэффициент ^ RatingCount) и (используя тот факт, что X должен быть равен 1-Y) X = 1 - (1 / (factor ^ RatingCount)

Затем мы можем настроить «коэффициент» в соответствии с диапазоном, который мы ищем.

Я использовал эту простую программу C #, чтобы попробовать несколько факторов:

        // 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();

Так что вы не утруждаете себя копированием, он дает следующий результат:

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

Что-то вроде этого? Очевидно, вы можете настроить значение "фактора" по мере необходимости, чтобы получить желаемый вес.

7
ответ дан 24 November 2019 в 15:51
поделиться

Смотрите эту страницу для хорошего анализа систем рейтинга на основе звезд, и эту для хорошего анализа систем на основе upvote-/downvote-.

Для голосования вверх и вниз вы хотите оценить вероятность того, что, учитывая имеющиеся у вас оценки, "реальная" оценка (если бы у вас было бесконечное количество оценок) будет больше некоторого количества (например, аналогичного количества для какого-то другого элемента, по которому вы сортируете).

Ответ см. во второй статье, но вывод состоит в том, что вы хотите использовать уверенность Уилсона. В статье приводится уравнение и пример кода на языке Ruby (легко переводится на другой язык).

17
ответ дан 24 November 2019 в 15:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: