Как да изчисля средната стойност въз основа на броя гласове/резултати/извадки/и т.н.?

За по-лесно кажете, че имаме примерен набор от възможни резултати {0, 1, 2}. Има ли начин да се изчисли средна стойност въз основа на броя на резултатите, без да се навлиза в космати справочни таблици и т.н. за изчисление на 95% доверителен интервал?

dreeves публикува решение за това тук: Как мога да изчисля справедлив общ резултат от играта въз основа на променлив брой мачове?

Кажете сега, че имаме 2 сценария...

Сценарий A) 2 гласа със стойност 2 водят до SE=0, което води до средна стойност 2

Сценарий B) 10 000 гласа със стойност 2 водят до SE=0, което води до средна стойност 2

Исках Сценарий А да бъде някаква стойност, по-малка от 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
Харесвам логаритмичния подход. +1 нагоре - person Dmitri Farkov; 22.05.2009
comment
Мисля, че функцията за тегло е най-лесната за изпълнение (и в много случаи най-бързата за изпълнение), но тя има своите ограничения. С логаритмичния подход обаче можете също да използвате метода Math.Log(n, b), където b е основата, за да получите по-бързо или по-бавно въздействие с растежа. Редактирах публикацията си, за да отразя и това. - person Tomas Aschan; 22.05.2009

Ако искате да използвате идеята в другия ми рефериран отговор (благодаря!) за използване на песимистична долна граница на средната стойност, тогава мисля, че ще трябва да се инжектират някои допълнителни допускания/параметри.

За да съм сигурен, че разбирам: с 10 000 гласа, всеки един от които е „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