Как мне заказать эти полезные оценки?

Под пользовательскими сообщениями на моем сайте у меня есть рейтинговая система, подобная Amazon:

   Was this review helpful to you: Yes | No

Если есть голоса, я отображаю результаты над этой строкой следующим образом:

   5 of 8 people found this reply helpful.

Я хотел бы отсортировать сообщения на основе этих рейтингов. Если бы вы ранжировали посты от наиболее полезных к наименее полезным, как бы вы расположили следующие посты?

   a) 1/1 = 100% helpful
   b) 2/2 = 100% helpful
   c) 999/1000 = 99.9% helpful
   b) 3/4 = 75% helpful
   e) 299/400 = 74.8% helpful

Понятно, что сортировать только по проценту полезности неправильно, нужно каким-то образом учитывать общее количество голосов. Есть ли стандартный способ сделать это?

ОБНОВЛЕНИЕ:

Используя формулы Чарльза для расчета нижнего диапазона Агрести-Коулла и сортировки по нему, приведенные выше примеры будут сортироваться следующим образом:

   1) 999/1000 (99.9%) = 95% likely to fall in 'helpfulness' range of 99.2% to 100%
   2) 299/400 (74.8%) = 95% likely to fall in 'helpfulness' range of 69.6% to 79.3%
   3) 3/4 (75%) = 95% likely to fall in 'helpfulness' range of 24.7% to 97.5%
   4) 2/2 (100%) = 95% likely to fall in 'helpfulness' range of 23.7% to 100%
   5) 1/1 (100%) = 95% likely to fall in 'helpfulness' range of 13.3% to 100%

Интуитивно это кажется правильным.

ОБНОВЛЕНИЕ 2:

С точки зрения приложения, я не хочу выполнять эти вычисления каждый раз, когда я открываю список сообщений. Я думаю, что либо обновлю и сохраню нижнюю границу Агрести-Коулла, либо по регулярному расписанию, управляемому cron (обновление только тех сообщений, которые получили голосование с момента последнего запуска), либо обновлю его всякий раз, когда будет получено новое голосование. .


person mitchf    schedule 20.09.2010    source источник


Ответы (4)


Для каждого поста определите, насколько он будет полезен, по вашему мнению. Я предпочитаю использовать интервал Агрести-Коулла. Псевдокод:

float AgrestiCoullLower(int n, int k) {
  //float conf = 0.05;  // 95% confidence interval
  float kappa = 2.24140273; // In general, kappa = ierfc(conf/2)*sqrt(2)
  float kest=k+kappa^2/2;
  float nest=n+kappa^2;
  float pest=kest/nest;
  float radius=kappa*sqrt(pest*(1-pest)/nest);
  return max(0,pest-radius); // Lower bound
  // Upper bound is min(1,pest+radius)
}

Затем возьмите нижний конец оценки и отсортируйте по нему. Таким образом, 2/2 (по Агрести-Куллу) с вероятностью 95% попадает в диапазон «полезности» от 23,7% до 100%, поэтому он сортируется ниже 999/1000, который имеет диапазон от 99,2% до 100% (начиная с 0,237 ‹). .992).

Редактировать: поскольку некоторые люди, кажется, нашли это полезным (ха-ха), позвольте мне отметить, что алгоритм можно настроить в зависимости от того, насколько вы хотите быть уверенным / не склонным к риску. Чем меньше уверенности вам нужно, тем охотнее вы будете отказываться от «доказанных» (набравших большое количество голосов) обзоров в пользу непроверенных, но высоко оцениваемых обзоров. 90-процентный доверительный интервал дает каппа = 1,95996398, 85-процентный доверительный интервал дает 1,78046434, 75-процентный доверительный интервал дает 1,53412054, а 50-процентный доверительный интервал с осторожностью к ветру дает 1,15034938.

50% доверительный интервал дает

1) 999/1000 (99.7%) = 50% likely to fall in 'helpfulness' range of 99.7% to 100%
2) 299/400 (72.2%) = 50% likely to fall in 'helpfulness' range of 72.2% to 77.2%
3) 2/2 (54.9%) = 50% likely to fall in 'helpfulness' range of 54.9% to 100%
4) 3/4 (45.7%) = 50% likely to fall in 'helpfulness' range of 45.7% to 91.9%
5) 1/1 (37.5%) = 50% likely to fall in 'helpfulness' range of 37.5% to 100%

что в целом не так уж отличается, но он предпочитает 2/2 безопасности 3/4.

person Charles    schedule 20.09.2010
comment
Для ничьих (особенно при 0) я предлагаю разбить в пользу наибольшего количества голосов «за», а затем наименьшего количества голосов «против». - person Charles; 21.09.2010
comment
вау, Чарльз, это хардкор. очень впечатляюще. я запущу это на своих примерах и посмотрю, как они сортируются (после того, как я потрачу несколько минут на изучение Агрести-Коулла в Википедии!) - person mitchf; 21.09.2010
comment
Дайте мне знать, как это происходит. Я могу предоставить дополнительную информацию и/или ссылки по мере необходимости. - person Charles; 21.09.2010
comment
+1 за это элегантное решение (упорядочение по нижней границе доверительного интервала). Просто из любопытства: как ведет себя размер интервала для количества голосов "за" = 0 или = количества ответов? (простая биномиальная дисперсия в этих случаях стремится к нулю) - person Andre Holzner; 21.09.2010
comment
@Andre: Асимптотически он уменьшается как 1/n, или, скорее, C/n, где C зависит от выбранной достоверности. - person Charles; 21.09.2010

Этот вопрос, вероятно, лучше задать на http://stats.stackexchange.com .

Я думаю, вы все еще хотите заказать, увеличив «полезность».

Если вы хотите узнать, насколько точным является заданное число, самый простой способ — использовать квадратный корень из дисперсии Биномиальное распределение, где n равно общему количеству ответов, а p доля ответов, которые были "полезными".

person Andre Holzner    schedule 20.09.2010

Очень простым решением было бы игнорировать все, что меньше порогового количества голосов, а затем сортировать по процентам.

Например (требуется не менее пяти голосов)

   1.  99.9% (1000 votes)
   2.  74.8%  (400 votes)
   3-5.  waiting for five votes
person Thilo    schedule 20.09.2010

Это зависит от ожидаемого количества положительных отзывов и среднего количества людей, которые голосуют. Если, как в приведенном вами примере, у вас будет голосовать иногда 5 и 10 человек, а иногда 1000, то я бы предложил среднюю точку Уилсона:

(x+z^2/2)/(n+z^2)    The midpoint of the Adjusted Wald Interval / Wilson Score

where:
n = Sum(all_votes),  
x = Sum(positive_votes) / n, 
z = 1.96 (fixed value)
person Galois    schedule 12.02.2011