Эффективная идентификация скользящего окна в Matlab - PullRequest
0 голосов
/ 18 февраля 2011

У меня есть данные временных рядов с некоторыми отсутствующими данными, для которых я выполняю некоторую функцию оценки по скользящим окнам.Длина окон не одинакова, и у каждой переменной разные даты начала и окончания.Я хочу удалить все окна, в которых есть недостающие данные.Окна перекрываются, поэтому одно пропущенное наблюдение часто удаляет множество окон из рассмотрения.То, что я хочу, - это отображение каждой даты в окна, которые ее содержат.

В настоящее время у меня есть логическая матрица, в которой есть строка для каждого возможного дня, а затем каждый столбец представляет одно из окон с истинными значениями длядни этого окна.Затем я могу подставить эту матрицу в строки, представляющие отсутствующие данные, и те столбцы, которые содержат какие-либо истинные значения, являются недействительными окнами.Проблема в том, что логическая матрица становится большой (10k x 10k ~ 100 МБ) и их может быть много.Я могу преобразовать в разреженный, который решает проблему размера, но вычисление того, какие окна для удаления, становится очень медленным, когда окна длинные.

Это не пахнет как проблема, которая должна быть ресурсоемкой (любая памятьили вычисления), есть ли лучший способ?

Редактировать: Позвольте мне добавить пример, так что это может быть немного яснее.Допустим, полный набор дат находится в диапазоне от 1 до 100. Окна от 1:10, 2:11, 3:12 и т. Д. До 91: 100 (они одинаковы, но для примера это не имеет значения).У меня есть серия, которая работает с 5 до 25, но имеет NaN на 17.

Этот NaN выбивает десять окон (с 8:17 до 17:26).Я хочу эффективное отображение от наблюдения 17 до окон 8:17.Понятно, что довольно просто, когда окна имеют одинаковую длину, но какой эффективный метод, если окна нерегулярные?

Ответы [ 2 ]

3 голосов
/ 18 февраля 2011

Логические сравнения стоят немного времени и ресурсов.Вы действительно уверены, что это узкое место?

Если создание окна отнимает много времени, вы можете сделать это в while -цикле, так что вы можете пропустить несколько записей, если встретитеNaN внутри окна.

Если создание окна быстрое, что, безусловно, будет с одинаковой длиной, вы можете просто сделать

%# startEnd is created according to your example, but can be whatever quick method
startEnd = [(1:(100-windowSize+1))',(windowSize+1:100)'];
nanIdx = find(isnan(data))';  %'#

%# This line temporarily creates a logical array of size nWindows-by-numberOfNaNs
%# which is most likely smaller than nWindows-by-nWindows
badWindows = any(bsxfun(@le,startEnd(:,1),nanIdx) & bsxfun(@ge,startEnd(:,2),nanIdx),2);

startEnd(badWindows,:) = [];
1 голос
/ 18 февраля 2011

Я закодировал решение Йонаса, и оно оказалось медленнее, чем то, что у меня уже было. Однако это избавило меня от необходимости большого массива, и это заставило меня задуматься о проблеме по-другому. Мне просто нужно было перейти от отображения окна -> (начало obs, конец obs) к подходу obs -> (индексы каждого окна, в которое входит obs).

Поэтому я создаю массив ячеек, который содержит каждый набор индексов окна для каждого дня (я мог бы использовать матрицу NumObsx2, но я хочу разрешить, возможно, сложное определение окна). Для каждой временной серии я использую индексы каждой отсутствующей точки данных для поднабора отображения, чтобы получить индексы всех окон, которые необходимо удалить. Затем cell2mat извлекает индексы из массива ячеек, и я могу удалить плохие окна (к счастью, Matlab не заботится о повторяющихся индексах в назначениях).

В мои сроки этот метод примерно в 10 раз больше моего первоначального метода и в 15 раз больше, чем метод Йонаса. Индексы на карте можно сохранить как uint16, поэтому требуемая память намного меньше, чем мое оригинальное решение (но все же больше, чем метод Джонаса).

В качестве бонуса я могу использовать accmarray для подсчета индексов, если я хочу использовать более сложные критерии, такие как не более 5 NaN (ср. Не более одного, как описано).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...