Как мне заказать эти «полезные» оценки? - PullRequest
6 голосов
/ 20 сентября 2010

Под сообщениями, сгенерированными пользователем на моем сайте, у меня есть 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 :

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

Ответы [ 4 ]

5 голосов
/ 20 сентября 2010

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

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 (по Agresti-Coull) с вероятностью 95% упадет в диапазоне «полезности» от 23,7% до 100%, так что оно сортируется ниже 999/1000, который имеет диапазон от 99,2% до 100% (с 0,237 < 0,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.

4 голосов
/ 20 сентября 2010

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

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

Если вы хотите знать, насколько точнаданное число, самый простой способ - использовать квадратный корень из дисперсии биномиального распределения с n равным общему количеству ответов и p фракции ответов, которые были «полезными».

1 голос
/ 12 февраля 2011

Это зависит от ожидаемого количества положительных отзывов и количества людей, которые голосуют в среднем. Если, как в приведенном вами примере, иногда 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)
1 голос
/ 20 сентября 2010

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

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

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