Я хочу реализовать итеративный алгоритм, который вычисляет средневзвешенное значение. Конкретный весовой закон не имеет значения, но он должен быть близок к 1 для самых новых значений и близок к 0 к самому старому.
Алгоритм должен быть итеративным. то есть он не должен помнить все предыдущие значения. Он должен знать только одну новейшую ценность и любую агрегирующую информацию о прошлом, как предыдущие значения среднего, суммы, счета и т.д.
Возможно ли это?
Например, следующий алгоритм может быть:
void iterate(double value) {
sum *= 0.99;
sum += value;
count++;
avg = sum / count;
}
Это даст экспоненциальный убывающий вес, что может быть не очень хорошим. Возможно ли иметь понижающий вес или что-то еще?
РЕДАКТИРОВАТЬ 1
Ниже приведены требования к закону взвешивания:
1) Вес уменьшается в прошлое 2) Я имею некоторую среднюю или характерную продолжительность, так что значения старше этой продолжительности имеют гораздо меньшее значение, чем более новые 3) Я должен был бы установить эту продолжительность
РЕДАКТИРОВАТЬ 2
Мне нужно следующее. Предположим, что v_i
- значения, где v_1
- первое. Также предположим, что w_i
являются весами. Но w_0
- ПОСЛЕДНЕЕ.
Итак, после первого значения я получил первый средний
a_1 = v_1 * w_0
После того, как второе значение v_2 пришло, я должен иметь средний
a_2 = v_1 * w_1 + v_2 * w_0
При следующем значении я должен иметь
a_3 = v_1 * w_2 + v_2 * w_1 + v_3 * w_0
Обратите внимание, что профиль веса перемещается со мной, а я перемещаюсь по последовательности значений.
т.е. каждое значение не имеет собственного веса все время. Моя цель состоит в том, чтобы этот вес был ниже, когда он шел в прошлое.