Учитывая линейную функцию y = a*x + b
(a
и b
- ранее известные константы), легко вычислить расстояние суммы квадратов между линией и окном выборок (1, Y1), (2, Y2), ..., (n, Yn)
(где Y1
- самый старый образец, а Yn
- самый новый):
sum((Yx - (a*x + b))^2 for x in 1,...,n)
Мне нужен быстрый алгоритм для вычисления этого значения для скользящего окна (длиной n
) - я не могу повторно сканировать все сэмплы в окне каждый раз, когда приходит новый сэмпл.
Очевидно, что некоторое состояние должно быть сохранено и обновлено для каждого нового образца, который входит в окно, и каждый старый образец выходит из окна.
Обратите внимание, что когда сэмпл покидает окно, значения остальных сэмплов также меняются - каждый Yx становится Y (x-1). Поэтому, когда сэмпл покидает окно, каждый другой сэмпл в окне добавляет новое значение к новой сумме: (Yx - (a*(x-1) + b))^2
вместо (Yx - (a*x + b))^2
.
Есть ли известный алгоритм для расчета этого? Если нет, можете ли вы думать об этом? (Допускается наличие ошибок из-за линейных приближений первого порядка).