데이터 슬라이딩 윈도우 통계

데이터 슬라이딩 윈도우 통계 (Statistics on Sliding Windows of Data)

데이터의 전체가 아니라 부분 구간(윈도우)에 대해 기술 통계량을 계산하고 싶을 때가 많아요. Octave의 movfun과 그로부터 파생된 mov* 함수들이 이 일을 해 줍니다.

출처: 문서

본문

전체 데이터셋의 일부 구간(즉, 윈도우)에 대해 기술 통계량을 계산하는 것은 자주 유용해요. Octave는 movfun 함수를 제공하는데, 이 함수는 임의의 함수 핸들을 데이터 윈도우로 호출하고 결과를 누적해요. 이동 평균(movmean)처럼 가장 흔히 원하는 함수는 대부분 이미 제공돼요.

movfun

y = movfun (fcn, x, wlen)
y = movfun (fcn, x, [nb, na])
y = movfun (…, "property", value)

데이터 x의 길이 wlen 이동 윈도우에 함수 fcn을 적용해요.

이동 윈도우 길이 입력 wlen은 수치 스칼라 또는 2-원소 수치 배열 [nb, na]일 수 있어요. 이동 윈도우에 포함되는 원소는 wlen의 크기·값은 물론 "SamplePoints" 옵션이 지정되었는지에 따라 달라져요. 원소 포함의 전체 세부 사항은 movslice를 참고하세요.

계산 중 데이터 입력 x는 2차원 wlen-by-N 행렬로 재구성되고 fcn은 이 새 행렬에 대해 호출돼요. 따라서 fcn은 배열 입력 인자를 받아 차원 1, 즉 배열의 열 방향으로 계산을 적용해야 해요.

n개 열을 가진 배열(아마 다차원)에 적용할 때 fcn은 두 형식 중 하나로 결과를 반환할 수 있어요. 형식 1) 크기 1-by-n-by-dim3-by-…-by-dimN의 배열. 이는 Octave 핵심 함수의 전형적인 출력 형식이에요. 이 사용 사례의 예는 demo ("movfun", 5)로 볼 수 있어요. 형식 2) 길이 n * numel_higher_dims의 행 벡터(여기서 numel_higher_dims는 prod (size (x)(3:end)))예요. i번째 입력 열에 대한 fcn의 출력은 i:n:(n*numel_higher_dims) 인덱스에서 찾을 수 있어요. 이 형식은 함수를 배열로 결합하거나 nthargout을 사용할 때 유용해요. 예는 demo ("movfun", 6)으로 볼 수 있어요.

계산은 property/value 쌍을 지정해서 제어할 수 있어요. 유효한 속성은 다음과 같아요.

  • "dim" — 기본값인 첫 번째 비단일 차원 대신 지정된 차원을 따라 동작해요.

  • "SamplePoints" — x의 데이터 점에 대한 고유 좌표 위치의 정렬된 수치 벡터를 지정해요. 기본값은 벡터 [1 : numel (x)]예요. 기본이 아닌 SamplePoints 벡터를 지정하면 이동 윈도우 길이 wlen을 SamplePoints 위치에 대해 측정해 각 윈도우 슬라이스에 포함할 점을 결정해요. SamplePoints는 균일하게 간격을 두지 않아도 돼요. 이는 서로 다른 수의 점을 가진 윈도우 슬라이스를 만들 수 있어요.

  • "Endpoints" — 윈도우의 경계(끝점)에서 결과를 계산하는 방법을 제어해요.

    • "shrink"(기본값) — 배열의 시작·끝에서 원본 데이터가 없는 원소를 제외하도록 윈도우를 잘라요. 예: 길이 3 윈도우에서 y(1) = fcn (x(1:2)), y(end) = fcn (x(end-1:end)).
    • "discard" — 원본 데이터 배열을 넘어 확장되는 윈도우를 사용하는 모든 y 값을 삭제해요. 예: 10-원소 데이터 벡터와 길이 3 윈도우에서 출력은 8개 원소만 가져요. 첫 원소는 인덱스 [0, 1, 2]에 대한 계산이 필요하므로 삭제되고, 마지막 원소는 [9, 10, 11] 계산이 필요하므로 삭제돼요.
    • "fill" — 데이터 배열 밖의 윈도우 원소를 NaN으로 대체해요. 예: 길이 3 윈도우에서 y(1) = fcn ([NaN, x(1:2)]), y(end) = fcn ([x(end-1:end), NaN]). 이 옵션은 보통 y 경계에 NaN 값을 만들지만, fcn이 NaN을 다루는 방식과 "nancond" 속성의 영향을 받아요.
    • user_value — 데이터 배열 밖의 윈도우 원소를 지정된 값 user_value(수치 스칼라여야 함)로 대체해요. 예: y(1) = fcn ([user_value, x(1:2)]), y(end) = fcn ([x(end-1:end), user_value]). 흔한 선택은 0이에요.
    • "same" — 데이터 배열 밖의 윈도우 원소를 경계 x 값으로 대체해요. 예: y(1) = fcn ([x(1), x(1:2)]), y(end) = fcn ([x(end-1:end), x(end)]).
    • "periodic" — 윈도우를 감싸서 없는 데이터 원소를 데이터의 반대쪽에서 가져와요. 예: y(1) = fcn ([x(end), x(1:2)]), y(end) = fcn ([x(end-1:end), x(1)]).

    참고 1: 균일하지 않은 SamplePoint 간격에서는 "EndPoints"의 허용 값이 "shrink"뿐이에요. 참고 2: 일부 "Endpoints" 옵션에서는 경계의 윈도우 크기가 중앙 부분과 같지 않을 수 있고, fcn이 이런 경우에도 동작해야 해요.

  • "nancond"NaNNA 값이 "movfun" 출력에 미치는 영향을 제어해요. "includenan"(기본값)은 NaN·NA 값을 이동 윈도우에 포함시키고, NaN·NA 값을 담은 윈도우 슬라이스는 그 원소에 대해 NaN을 반환해요. "omitnan""movfun"NaN·NA 값을 무시하게 해서 그 윈도우 슬라이스의 결과를 계산하는 데 더 적은 원소를 사용하게 해요. "omitnan"이 지정되고 윈도우 슬라이스가 전부 NaN·NA이면 "movfun"은 그 원소에 대해 "nanval" 속성이 지정한 값을 반환해요. "includemissing"·"omitmissing"은 각각 "includenan"·"omitnan"과 동의어로 쓰일 수 있어요.

  • "nanval""nancond""omitnan"·"omitmissing"이고 윈도우의 모든 원소가 NaN·NA일 때 반환할 값을 지정해요. "nanval"은 수치 스칼라 값 또는 NaN(기본값)이어야 해요.

  • "outdim" — 계산의 어느 차원이 출력 y에 나타날지 선택하는 행 벡터예요. fcn이 형식 1로 N차원 배열을 반환할 때만 유용해요. 기본값은 모든 출력 차원을 반환해요.

프로그래밍 참고: "outdim" 속성은 fcn의 출력이 많은 차원을 가지거나, 원하는 출력을 선택하는 기본 함수의 래퍼가 너무 비쌀 때 메모리를 아끼는 데 쓸 수 있어요. 메모리가 문제되지 않으면 출력 차원을 선택하는 가장 쉬운 방법은 movfun으로 전체 결과를 먼저 계산한 뒤 인덱싱으로 그 결과를 필터링하는 거예요. 코드 복잡성이 문제가 아니라면 익명 함수로 래퍼를 만들 수 있어요. 예를 들어 basefcn이 K차원 행 출력을 반환하고 차원 D만 원한다면 다음 래퍼를 사용할 수 있어요.

fcn = @(x) basefcn (x)(:,columns(x) * (D-1) + (1:columns(x)));
y = movfun (@fcn, ...);

See also: movslice, prepad, postpad, permute, reshape.

movslice

slcidx = movslice (N, wlen)
slcidx = movslice (N, wlen, samplepoints)
[slcidx, C, Cpre, Cpost, win, wlen, scalar_wlen] = movslice (…)

길이 N의 벡터를 길이 wlen의 윈도우로 자르는 인덱스를 생성해요.

입력 N은 양의 정수여야 해요. 이동 윈도우 길이 입력 wlen은 수치 스칼라 또는 2-원소 수치 배열일 수 있어요. 이동 윈도우에 포함되는 원소는 wlen의 크기·값은 물론 samplepoints 입력이 지정되었는지에 따라 달라져요.

선택 입력 samplepoints는 N개 데이터 점의 고유 위치의 정렬된 수치 벡터예요. 기본값은 벡터 [1 : N]예요. 기본이 아닌 samplepoints 벡터를 지정하면 이동 윈도우 길이 wlen을 samplepoints 위치에 대해 측정해 각 윈도우 슬라이스에 포함할 점을 결정해요. samplepoints는 균일하게 간격을 두지 않아도 돼서, 아래에서 지정하듯 기본이 아닌 samplepoints를 사용하면 일부 movslice 출력의 형태와 내용이 달라져요.

이동 윈도우 크기와 포함 원소는 다음과 같이 정의돼요.

  • samplepoints가 기본값 1:N(또는 미지정)이면:
    • 정수 값 wlen에 대해:
      • 홀수 정수 스칼라 wlen은 대칭 윈도우로, 중앙 원소의 양쪽에 (wlen - 1) / 2개 원소를 포함해요. 예: 인덱스 5, 길이 3의 윈도우 슬라이스는 [4, 5, 6].
      • 짝수 정수 스칼라 wlen은 비대칭으로 중앙 원소의 왼쪽에 wlen/2, 오른쪽에 wlen/2 - 1개 원소를 가져요. 예: 인덱스 5, 길이 4 → [3, 4, 5, 6].
      • [nb, na] 형태의 정수 값 벡터 wlen은 중앙 원소의 왼쪽에 nb, 오른쪽에 na개 원소를 포함해요. 예: wlen = [3, 1], 인덱스 5 → [2, 3, 4, 5, 6].
    • 정수 값이 아닌 스칼라 wlen에 대해:
      • nb = na = fix (wlen / 2)인 2-원소 벡터 형태로 변환된 뒤 정수 벡터 규칙을 따라 처리돼요. 예: wlen = 2.5, 인덱스 5 → [3, 4, 5, 6, 7].
      • 정수 값이 아닌 벡터 wlen은 wlen = fix (wlen)으로 정수로 잘린 뒤 처리돼요. 예: wlen = [1.2, 2.3], 인덱스 5 → [4, 5, 6, 7].
  • 기본이 아닌 samplepoints 벡터를 지정하면:
    • [nb, na]로 지정된 벡터 wlen은 samplepoints 원소로 정의된 점 위치에서 중앙 원소 위치 전에 nb 이하, 후에 na 이하 거리의 모든 점을 포함해요. 예: 인덱스 5, wlen = [2, 3], samplepoints의 3-8번째 원소가 [1, 3, 5, 7, 8 ,9] → 윈도우 슬라이스는 samplepoints [3, 5, 7, 8]에 해당하는 [4, 5, 6, 7].
    • 스칼라 wlen은 nb = na = wlen / 2인 2-원소 벡터 형태로 변환돼요. 그 뒤 윈도우는 중앙 원소 위치 전에 nb 이하 거리, 후에 na보다 작은(같지 않은) 거리의 모든 점을 포함해요. 즉 [nb, na). 예: wlen = [2, 3], samplepoints 3-8번째가 [1, 3, 5, 7, 8 ,9][4, 5, 6](samplepoints [3, 5, 7]).

출력 slcidx는 벡터 슬라이스의 인덱스 배열이에요.

  • samplepoints가 기본값이거나 미지정이면 slcidx는 벡터에 완전히 맞는 슬라이스의 인덱스만 담아요. 각 열은 윈도우가 왼쪽에서 오른쪽으로 이동할 때 한 슬라이스의 인덱스예요. 슬라이스는 스칼라 wlen에 대해 fix (wlen)개, 배열 값 wlen에 대해 nb + na + 1개 원소를 가져요.
  • 기본이 아닌 samplepoints를 지정하면 slcidx는 2xN 배열이고, 첫·둘째 행에 각 슬라이스의 첫·마지막 원소를 담아요.

선택 출력 C는 윈도우가 벡터 안에 완전히 유지되는 윈도우 중심 위치의 행 벡터예요.

선택 출력 CpreCpost는 각각 벡터의 시작·끝에서, 윈도우가 벡터 끝을 넘어 확장되는 결과를 만드는 벡터 원소를 담아요.

선택 출력 win은 이동 윈도우를 만드는 정보를 담아요.

  • samplepoints가 기본값이거나 미지정이면 win은 slcidx와 같은 행 수의 열 벡터로, 중심 상대 위치 스텐실로 정의된 이동 윈도우를 담아요.
  • 기본이 아닌 samplepoints를 지정하면 win은 2xN 배열이고, 첫·둘째 행에 samplepoints와 같은 좌표를 사용한 각 윈도우 슬라이스의 왼쪽·오른쪽 경계를 담아요. 이 경계는 samplepoints가 지정한 위치 벡터 밖에 놓일 수도 있어요.

선택 출력 wlenmovslice가 사용한 윈도우 길이를 2-원소 [nb, na] 형태로 반환해요.

선택 논리 출력 scalar_wlen은 입력 wlen의 스칼라·벡터 상태를 반환해서, 호출 함수가 이동 윈도우가 오른쪽 끝점을 포함할지([nb, na], 벡터 wlen) 배제할지([nb, na), 스칼라 wlen) 결정하게 해요.

See also: movfun.

mov* 함수들

movmad, movmax, movmean, movmedian, movmin, movprod, movstd, movsum, movvar는 각각 데이터 x의 길이 wlen 슬라이딩 윈도우에 대해 이동 중앙값·최댓값·평균·중앙값·최솟값·곱·표준편차·합·분산을 계산해요. 공통 시그니처는 다음과 같아요.

y = movXXX (x, wlen)
y = movXXX (x, [nb, na])
y = movXXX (…, dim)
y = movXXX (…, nancond)
y = movXXX (…, property, value)

이동 윈도우 길이 입력 wlen은 수치 스칼라 또는 2-원소 수치 배열 [nb, na]일 수 있고, 포함 원소는 "SamplePoints" 옵션 여부에 따라 달라져요(자세한 내용은 movslice 참고). 선택 인자 dim이 주어지면 그 차원을 따라 동작해요.

선택 인자 nancondNaN·NA 값이 출력에 미치는 영향을 제어하는 문자열이에요. "includenan"(대부분의 기본값)은 NaN·NA 값을 윈도우에 포함시켜 NaN·NA가 있는 슬라이스는 NaN을 반환하게 해요. "omitnan"NaN·NA를 무시해 더 적은 원소로 계산해요. 슬라이스가 전부 NaN·NA이면 각 함수의 기본 반환 값(아래 참고)이 돼요. "includemissing"·"omitmissing"은 동의어예요.

계산 제어 속성은 "Endpoints""SamplePoints"이며, 이는 movfun에서와 같은 의미예요. movstd·movvar는 추가로 정규화 옵션 opt(인자 순서상 dim보다 먼저)를 받아요. 이들 함수 대부분은 movfun을 호출하는 래퍼예요.

각 함수의 구체적인 특징:

  • movmad — 이동 중앙값 또는 평균 절대 편차. "method" 속성이 "median"(기본값) 또는 "mean"을 받아요. 호환성 참고: Octave 10 이전에는 이 함수가 평균 절대 편차만 계산했지만, MATLAB 호환성을 위해 기본값이 중앙값 절대 편차로 바뀌었어요. "method" 속성으로 두 "mad" 계산 방법에 모두 접근할 수 있어요. 이 속성은 Octave 코드 밖에서는 동작이 기대되지 않아요.
  • movmax — 이동 최댓값. 전부 NaN이면 NaN 반환.
  • movmean — 이동 평균. 전부 NaN이면 NaN 반환.
  • movmedian — 이동 중앙값. 전부 NaN이면 NaN 반환.
  • movmin — 이동 최솟값. 전부 NaN이면 NaN 반환.
  • movprod — 이동 곱. 전부 NaN이면 1 반환.
  • movstd — 이동 표준편차. opt 정규화: 0N-1로 정규화(분산의 최선 불편 추정량의 제곱근, 기본값), 1N으로 정규화(평균 주변 2차 모멘트의 제곱근). 기본 opt를 쓰려면 빈 인자 []를 전달하면 돼요. 전부 NaN이면 NaN 반환.
  • movsum — 이동 합. 전부 NaN이면 0 반환.
  • movvar — 이동 분산. opt 정규화: 0N-1로(분산의 최선 불편 추정량, 기본값), 1N으로(평균 주변 2차 모멘트). 전부 NaN이면 NaN 반환.

각 함수의 See also 목록은 movfun, movslice 그리고 해당 기본 집계 함수(max, mean, median, min, prod, std, sum, var, mad)가 나열돼요.

더 알아보기

  • 이동 윈도우 인덱스 생성은 movslice 항목을 참고하세요.
  • 기술 통계량 관련 기본 함수도 Descriptive Statistics 항목을 함께 보면 좋아요.