2011-02-17 5 views
0

롤링 윈도우에 대해 일부 추정 기능을 실행하고있는 누락 된 데이터가있는 시계열 데이터가 있습니다. 창은 일정한 길이가 아니며 각 변수의 시작과 끝 날짜가 다릅니다. 누락 된 데이터가있는 창을 제거하고 싶습니다. 창은 겹치므로 하나의 누락 된 관찰은 대개 많은 창을 고려에서 제외시킵니다. 내가 원하는 것은 각 날짜에서 그것을 포함하는 창으로의 매핑입니다.Matlab의 효율적인 롤링 윈도우 식별

현재 가능한 모든 요일에 대해 행을 가진 논리 행렬이 있고 각 열은 해당 창의 요일에 대해 참 값을 가진 창 중 하나를 나타냅니다. 그런 다음이 행렬을 누락 된 데이터를 나타내는 행에 서브 세트 할 수 있으며, 실제로 값이 들어있는 열은 유효하지 않은 창입니다. 문제는 논리 행렬이 커지고 (10k x 10k ~ 100mb) 많은 것이있을 수 있다는 것입니다. 크기 문제를 해결하는 스파 스로 변환 할 수 있지만 창이 길면 제거 할 창을 계산하는 속도가 매우 느려집니다.

이것은 자원 집약적 인 (메모리 또는 계산) 문제가 아니므로 더 좋은 방법이 있습니까?

편집 : 예제를 추가해 약간 더 명확하게 표시하도록하겠습니다. 날짜의 전체 세트가 1에서 100까지라고 가정 해보십시오. Windows는 1:10, 2:11, 3:12에서 91 : 100까지입니다 (균일하지만이 예에서는 중요하지 않습니다). 저는 5에서 25까지 실행되는 시리즈를 가지고 있지만 NaN은 17입니다.

하나의 NaN이 10 개의 창 (8:17부터 17:26)을 두드립니다. 나는 관찰 17에서 창 8:17까지 효율적인 매핑을 원한다. 분명히, 창문이 일정한 길이라면 꽤 쉽습니다. 그러나 창문이 불규칙 할 때 효율적인 방법은 무엇입니까?

+1

나는 이해할 수 없다.'(date> = begin (i) && data

+0

@Oli 나는 물건을 더 분명하게 해주는 예제를 추가했습니다. – MatlabSorter

답변

1

을 할 수있는 나는 조나스 '솔루션을 코딩 그리고 내가 이미 장소에서 한 것보다 느린 었죠. 그러나 큰 배열에 대한 필요성을 없애고, 문제에 대해 다르게 생각하게되었습니다. 방금 창에서 -> (obs 시작, obs 끝) obs -> (obs가 속하는 각 창의 색인) 접근으로 갈 필요가있었습니다.

그래서 매일 각 창 인덱스 집합이 들어있는 셀 배열을 만듭니다 (NumObsx2 행렬을 사용할 수는 있지만 가능하면 복잡한 창 정의를 허용하려고합니다). 각 timeseries에 대해 필자는 누락 된 각 데이터 요소의 인덱스를 사용하여 매핑을 부분 집합 화하여 제거해야하는 모든 창에 대한 인덱스를 얻습니다. 그런 다음 cell2mat는 셀 배열에서 인덱스를 가져오고 잘못된 윈도우를 제거 할 수 있습니다 (Matlab은 할당 된 인덱스를 고맙게 생각하지 않습니다).

제 시간에이 방법은 원래 방법의 약 10 배이고 조나스 방법보다 15 배 빠릅니다. 맵의 인덱스는 uint16으로 저장 될 수 있으므로 필요한 메모리는 내 orignal 솔루션보다 훨씬 적습니다 (그러나 Jonas의 방법보다 여전히 많습니다).

보너스로, 5 개의 NaN (cf는 설명 된 것보다 많지 않음)과 같은 더 복잡한 기준을 사용하려면 인덱스를 계산할 때 accumarray를 사용할 수 있습니다.

+0

흥미 롭습니다. 그건 그렇고, 당신이 nx by 1 셀 배열'idxCell'에 인덱스를 저장했다면'badWindows = cellfun (@ (x) any (isnan (data (x))), idxCell) , 또는 당신은 다시 너무 많은 시험을 할 것입니까? – Jonas

+0

나는 너무 많은 테스트를한다고 생각한다 - idxCell의 각 셀은 그 윈도우에 대한 모든 인덱스를 데이터에 포함 할 것이므로 관찰 당보다는 각 윈도우 내의 각 관찰에 대해 isnan을 점검하게 될 것이다. 벡터화 된 코드는 훨씬 더 예쁘다 ... – MatlabSorter

3

논리 비교는 시간과 자원이 거의 들지 않습니다. 이것이 병목 현상이라고 확신합니까?

창을 만드는 데 시간이 많이 걸리는 경우 while -loop에서 수행해야 할 수 있습니다. 따라서 창 내부에 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,:) = []; 
+0

응답 해 주셔서 감사합니다. 이 접근법을 생각해 보았습니다. 문제는 엄청난 수의 isnan 점검 (관찰 당 한 번이 아니라 모든 창에 대한 모든 관찰)을 수행하는 것입니다. 각 창문이 백 관측 주위에 있다면 우리는 관측 당 (거의) 100 번 검사 할 것입니다. 나는 시계열을 한 번 확인한 다음 이것을 창으로 매핑하려고합니다. – MatlabSorter

+0

@MatlabSorter : 해결책을 업데이트했습니다. – Jonas

+0

병목 현상이 있었고 그 점에도 놀랐습니다. 그러나, 문제는 제가 데이터를 가지고있는 행 (예 : 5:25)에 전체 행렬을 서브 세팅한다는 것입니다. 정말 당신의 솔루션을 좋아합니다, 그것은 bsxfun의 우아한 사용법이며 누락 된 데이터가없는 일반적인 경우에 매우 효율적이어야합니다. – MatlabSorter