Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Алгоритмы > отклонение от среднего арифметического |
Автор: KOLANICH 24.10.2011, 00:09 |
как посчитать отклонение от среднего арифметического не храня все значения то есть есть поток из n значений (сначала поступает первое, затем второе, затем - третье и тд, но количество их заранее известно) нужно вычислить для каждого значения отклонение от среднего арифметического, возвести в квадрат и просуммировать сохранять все, а потом считать нельзя - их может быть ОЧЕНЬ МНОГО, памяти может не хватить также должна соблюдаться точность |
Автор: sQu1rr 24.10.2011, 01:05 | ||||
дисперсию считаете?
Помоему никак ![]() |
Автор: Earnest 24.10.2011, 06:58 |
Из формулы-определения дисперсии D = 1/N*Sum ((Di - M)^2) легко выводится другая: D = 1/N*Sum (Di^2) - M^2, где Di - i-й элемент, M - среднее. Таким образом, если хранить 3 величины (сумму элементов, сумму их квадратов и количество), дисперсию можно считать на лету. |
Автор: Akina 24.10.2011, 11:20 | ||
Среднее арифметическое для множества из одного элемента равно значению этого единственного элемента. Очевидно же. А отклонение в этом случае - нулевое. |
Автор: sQu1rr 24.10.2011, 12:06 | ||
В дисперсии отклонение считается от среднего арифметического всего потока а не множества пройденных элементов |
Автор: Akina 24.10.2011, 12:32 | ||||
Правильно. Но не всего потока, который теоретически пройдёт через счётный механизм, а того, который УЖЕ прошёл. А если на данный момент прошёл только один элемент - то дисперсия считается для потока из 1 элемента. Когда поступит второй - она будет считаться для потока из 2 элементов... и так далее, пока не будет принят весь объём данных - и только тогда будет получено окончательное, а не промежуточное, значение.
![]() |
Автор: Earnest 24.10.2011, 12:57 |
Подставь M в первую формулу, раскрой скобки и т.д. Это известная формула из теорвера или мат. статистики, уже не помню, где-то на втором курсе в приличном вузе должны проходить. |
Автор: Akina 24.10.2011, 13:15 |
Earnest, давай попробуем на примере. N=3 D(1)=1 D(2)=2 D(3)=3 M=(1+2+3)/3=2 1/(N*Sum(Di-M)^2) = 1/3*((1-2)^2+(2-2)^2+(3-2)^2)=1/(3*2)=1/6 1/(N*Sum (Di^2)) - M^2 = 1/(3*(1^2+2^2+3^2)) - 2^2 = 1/(3*14) - 4 = ну ни разу не 1/6... Может, ты имел в виду, что дисперсия равна разности квадрата матожидания и матожидания квадрата? |
Автор: Earnest 24.10.2011, 13:31 | ||
Так и результат ни разу ни 1/6. В первой формуле ты чего-то того: сумма квадратов отклонений = 1/3 * ((1-2)^2 + (2-2)^2 + (3-2)^2) = 1/3 * (1+1) = 2/3. Как у тебя двойка в знаменатель попала, не пойму.
А я разве не это написала? |
Автор: Akina 24.10.2011, 14:45 |
Хм... и правда, если присмотреться... но пока поймёшь... милль пардон. |
Автор: KOLANICH 24.10.2011, 18:02 |
всем спасибо на другом форуме товарищ по никнейму val_nnm подсказал решение ![]() |
Автор: Akina 24.10.2011, 20:40 |
KOLANICH, Это абсолютно то же, что тебе сказала Earnest. |
Автор: KOLANICH 24.10.2011, 22:47 |
DELETED |
Автор: _Y_ 26.10.2011, 17:31 | ||
Но, надо понимать, дисперсия каждый раз будет считаться для выборки разной величины (увеличивающейся с каждым шагом на единицу). Впрочем, если в потоке данных нет дрифта (постепенного законопмерного изменения величин и/или закона их рассеяния), то где-то после 50-й точки все выйдет на более-менее достоверную постоянную величину. В других же случаях, похоже, без двух проходов через данные не обойтись. ЗЫ: Помнится когда-то для чего-то подобного мы считали статистические характеристики не для всего потока, а только для последних N точек (штук 100-200 брали - с запасом, если правильно помню). |
Автор: VictorTsaregorodtsev 28.10.2011, 15:46 |
_Y_, можно с экспоненциальным забыванием считать значения средней и дисперсии - в итоге получатся не "средние температуры по больнице" (как при счёте за 2 прохода), а более акцентированные на характеристиках последних точек результаты. |