Алгоритм вычисления расстояния суммы квадратов скользящего окна от заданной линейной функции
Учитывая строковую функцию 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
,
Есть ли известный алгоритм для расчета этого? Если нет, можете ли вы думать об этом? (Допускается наличие ошибок из-за линейных приближений первого порядка).
2 ответа
Если вы расширите срок (Yx - (a*x + b))^2
условия разбиты на три части:
- Условия только
a
,x
а такжеb
, Они дают некоторую постоянную при суммированииn
и может быть проигнорировано. - Условия только
Yx
а такжеb
, Они могут быть обработаны в стиле интегратора вагонов, как описано в @Xion. - Один срок
-2*Yx*a*x
,-2*a
является константой, так что игнорируйте эту часть. Рассмотрим частичную суммуS = Y1*1 + Y2*2 + Y3*3 ... Yn*n
, ДаноY1
и бегущая суммаR = Y1 + Y2 + ... + Yn
ты можешь найтиS - R
который устраняетY1*1
и сокращает все остальные условия, оставляя вас сY2*1 + Y3*2 + ... + Yn*(n-1)
, Теперь обновите текущую суммуR
что касается (2), вычитая изY1
и добавлениеY(n+1)
, Добавить новыйYn*n
срок доS
,
Теперь просто сложите все эти частичные термины.
Разве прямой подход не добьется цели?...
Под "простым" я подразумеваю поддержание очереди образцов. Как только появится новый образец, вы бы:
- вытолкнуть самый старый образец из очереди
- вычесть его расстояние от вашей суммы
- добавить новый образец в очередь
- рассчитать его расстояние и добавить его к вашей сумме
Что касается времени, то здесь все равно O(1), если очередь реализована в виде связанного списка или чего-то подобного, вы также хотите сохранить расстояние с вашими выборками в очереди, поэтому вы рассчитываете его только один раз. Таким образом, использование памяти составляет 3 числа с плавающей запятой на выборку - O(n).