Недавно я столкнулся с ситуацией, когда я хотел рассчитать среднее значение неизвестного размера. Моя первая наивная идея состояла в том, чтобы вычислить среднее значение между средним значением текущего и новым значением:
xs = [3, 7, 6] # Assuming we don't know the length mean = x[0] n = 1 while n < len(xs): mean = (mean + xs[n])/2 n += 1
Что быстро показывает, что это просто неправильно:
(3 + 7 + 6)/3 = 5.3333 ((5/2 + 7/2)/2 + 6/2) = 5.5
Чтобы найти фактическое соотношение между средним значением текущего и значением, я начал сравнивать среднее значение из 2 и среднее из 3 значений:
(3 + 7)/2 = 3/2 + 7/2 (3 + 7 + 6)/3 = (3 + 7)/3 + 6/3
Отсюда можно переписать среднее значение из 3 значений с точки зрения среднего из 2 значений:
(3 + 7)/3 + 6/3 = = (3 + 7)/2 * 2/3 + 6/3 = = (3/2 + 7/2)*2/3 + 6/3
Где я заметил шаблон:
mean(i) = mean(i-1) * (i-1)/i + x(i-1)/i
Что дает нам правильный алгоритм для итеративного расчета среднего:
xs = [3, 7, 6] # Assuming we don't know length mean = xs[0] n = 1 while n < len(xs): n += 1 mean = mean*(i-1)/i + xs[i-1]/i
Хотя я знаю, что в этом примере итеративное расчет является неумелым, я обнаружил, что это реальная удобная для реализации алгоритма выращивания сегмента, где я решаю, какие пиксели добавить к сегменту на основе среднего значения текущего сегмента.
Оригинал: “https://dev.to/cipharius/calculating-mean-iteratively-3aah”