Как рассчитать среднее значение на основе количества голосов/баллов/выборок/и т. д.?

Для простоты предположим, что у нас есть примерный набор возможных оценок {0, 1, 2}. Есть ли способ рассчитать среднее значение на основе количества баллов, не попадая в таблицы поиска и т. Д., Для расчета доверительного интервала 95%?

dreeves опубликовал решение этой проблемы здесь: -number-of-match/281407#281407">Как рассчитать справедливый общий игровой счет на основе переменного количества матчей?

Теперь скажем, у нас есть 2 сценария...

Сценарий A) 2 голоса со значением 2 приводят к SE = 0, в результате чего среднее значение равно 2

Сценарий B) 10000 голосов со значением 2 приводят к SE = 0, в результате чего среднее значение равно 2

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

Доступные мне данные:

  • n (количество голосов)
  • сумма (сумма голосов)
  • {набор голосов} (все значения голосов)

Спасибо!


person Community    schedule 21.05.2009    source источник
comment
Итак, вы ищете средневзвешенное значение? то есть среднее значение, которое имеет больший вес, чем больше у него голосов.   -  person BenAlabaster    schedule 22.05.2009
comment
Да, я думаю, это могло бы работать и таким образом. Либо меньший вес для меньшего количества голосов, либо больший вес для большего количества голосов.   -  person    schedule 22.05.2009


Ответы (2)


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

Пример на C# (потому что мне это известно лучше всего...), который можно легко перевести на выбранный вами язык:

double avgScore = Math.Round(sum / n);
double rank = avgScore * Math.Log(n);

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

Если вам нравится логарифмический подход, но основание 10 на самом деле не работает с вашим подсчетом голосов, вы можете легко использовать другое основание. Например, чтобы сделать это в базе 3 вместо этого:

double rank = avgScore * Math.Log(n, 3);

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

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

double rank = avgScore * w(n);

где w(n) возвращает значение веса в зависимости от количества голосов. Затем вы определяете w(n) по своему желанию, например, так:

double w(int n) {
    // caution! ugly example code ahead...
    // if you even want this approach, at least use a switch... :P

    if (n > 100) { 
        return 10; 
    } else if (n > 50) {
        return 8;
    } else if (n > 40) {
        return 6;
    } else if (n > 20) {
        return 3;
    } else if (n > 10) {
        return 2;
    } else {
        return 1;
    }
}
person Tomas Aschan    schedule 21.05.2009
comment
Спасибо Томас ... просто и мило. Это должен был быть подход, который я бы выбрал, но мне было интересно, есть ли другие варианты, кроме пользовательского уравнения веса. Думаю, мне нужно проанализировать свои данные и посмотреть, когда я могу сказать, что пользователь может просто использовать прямое среднее значение. - person ; 22.05.2009
comment
Мне нравится логарифмический подход. +1up - person Dmitri Farkov; 22.05.2009
comment
Я думаю, что весовую функцию проще всего реализовать (и во многих случаях быстрее всего запустить), но у нее есть свои ограничения. Однако при логарифмическом подходе вы также можете использовать метод Math.Log(n, b), где b — основание, чтобы получить более быстрое или более медленное влияние на рост. Я отредактировал свой пост, чтобы отразить это тоже. - person Tomas Aschan; 22.05.2009

Если вы хотите использовать идею из моего другого упомянутого ответа (спасибо!) об использовании пессимистичной нижней границы в среднем, то я думаю, что необходимо будет ввести некоторые дополнительные предположения/параметры.

Чтобы убедиться, что я понимаю: с 10000 голосов, каждый из которых равен "2", вы совершенно уверены, что истинное среднее значение равно 2. С 2 голосами, каждый из которых имеет "2", вы очень не уверены - может быть, некоторые 0 и 1 придут и снизят среднее значение. Но как это измерить, я думаю, это ваш вопрос.

Вот идея: все начинают с некоторого «багажа»: единственного фантомного голоса «1». Человек с 2 истинными голосами «2» тогда будет иметь среднее значение (1 + 2 + 2) / 3 = 1,67, где человек с 10 000 истинных голосов «2» будет иметь среднее значение 1,9997. Одно это может удовлетворить ваши критерии. Или, чтобы добавить пессимистическую идею нижней границы, человек с 2 голосами будет иметь пессимистичный средний балл 1,333, а человек с 10 тысячами голосов будет 1,99948.

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

person dreeves    schedule 21.05.2009
comment
Спасибо Даниэль. Ваш метод похож на метод Томаса выше, где у вас есть функция для учета меньшего количества голосов. Я предполагаю, что это просто, и поскольку это не очень важно для точности (я просто создаю приближение), это должно работать нормально. - person ; 22.05.2009