이동 평균에서 데이터 포인트를 추출 하시겠습니까?


15

이동 평균 데이터에서 데이터 포인트를 추출 할 수 있습니까?

다시 말해, 데이터 집합에 이전 30 개 지점의 이동 평균 만있는 경우 원래 데이터 지점을 추출 할 수 있습니까?

그렇다면 어떻게?


1
정답은 예입니다. 그러나 정확한 절차는 초기 데이터 세그먼트 처리 방법에 따라 다릅니다. 간단히 삭제하면 15 조각의 데이터가 효과적으로 손실되어 결정되지 않은 선형 방정식 시스템이 남습니다. 결론은 일반적으로 많은 유효한 답변이 있지만 (a) 더 짧은 창 (또는 일부 절차)이 초기 15 이동 평균에 사용되거나 (b) 솔루션 (약 15 차원의 제약 조건 ...). 어떤 상황에 있습니까?
whuber

@whuber 감사합니다! 2,000 점이 있습니다. 첫 번째 MA 포인트는 처음 30 개의 원래 포인트의 평균 일 가능성이 높습니다. 정확도는 일반적으로 올바른 결과에 이어 두 번째로 가장 "최근"지점에서 가장 잘 추측됩니다. 비교적 간단한 방법을 추천 할 수 있습니까? 미리 감사드립니다!

1
(댓글을 작성하는 데 5 분 이상 걸리는 경우 ...). 내가 쓰고 싶었던 것은 평균을 행렬 곱셈이라고 생각할 수 있다는 것입니다. 가운데 행은 대각선 앞에 1 / 30 * [1 1 1 ...]이됩니다. 문제는 행렬을 뒤집을 수 없도록 벡터 테두리의 점을 어떻게 처리 하는가입니다. 더 적은 수의 요소에 대한 평균 결과이거나 다른 제약 조건에 대해 생각한 것으로 가정하여이를 수행 할 수 있습니다. 매트릭스 반전은 이해하기 쉬운 방법이지만 가장 효율적이지는 않습니다. FFT를 사용하여 그렇게 할 수 있습니다.
fabee

답변:


4

fabee의 답변에 +1이 완료되었습니다. 내가 작업을 수행하기 위해 찾은 패키지를 기반으로 R로 변환하는 메모입니다. 필자의 경우, 1 월 -2 월 3 월, 2 월 3 월 -4 월, 3 월 -4 월 5 월 등 3 개월 기준으로 NOAA 온도 예측 데이터가 있으며,이를 대략적으로 분석하고 싶었습니다. 각 3 개월 기간의 온도가 본질적으로 평균이라고 가정하면 월간 값입니다.

library (Matrix)
library (matrixcalc)

# Feb-Mar-Apr through Nov-Dec-Jan temperature forecasts:

qtemps <- c(46.0, 56.4, 65.8, 73.4, 77.4, 76.2, 69.5, 60.1, 49.5, 41.2)

# Thus I need a 10x12 matrix, which is a band matrix but with the first
# and last rows removed so that each row contains 3 1's, for three months.
# Yeah, the as.matrix and all is a bit obfuscated, but the results of
# band are not what svd.inverse wants.

a <- as.matrix (band (matrix (1, nrow=12, ncol=12), -1, 1)[-c(1, 12),])
ai <- svd.inverse (a)

mtemps <- t(qtemps) %*% t(ai) * 3

어느 것이 나를 위해 잘 작동합니다. @fabee에게 감사합니다.

편집 : 좋아, 내 R을 파이썬으로 역 번역하면 다음과 같은 결과를 얻습니다.

from numpy import *
from numpy.linalg import *

qtemps = transpose ([[46.0, 56.4, 65.8, 73.4, 77.4, 76.2, 69.5, 60.1, 49.5, 41.2]])

a = tril (ones ((12, 12)), 2) - tril (ones ((12, 12)), -1)
a = a[0:10,:]

ai = pinv (a)

mtemps = dot (ai, qtemps) * 3

(R 버전보다 디버깅하는 데 시간이 오래 걸렸습니다. 먼저 R과 마찬가지로 Python에 익숙하지 않기 때문에 R을 대화식으로 훨씬 더 유용하게 사용할 수 있기 때문입니다.)


@Gracchus : 죄송하지만 C ++ 사용자는 아니지만 Armadillo C ++ 선형 대수 라이브러리 ( arma.sourceforge.net ) 에서 필요한 것을 찾을 수 있습니다.이 라이브러리 는 RcppArmadillo 패키지를 통해 R로도 제공됩니다.
Wayne

좋아, 그것이 당신을 위해 작동하는지 확인하십시오. 그렇다면 내 대답을 선택할 수 있습니다 ;-)
Wayne

참고로 파이썬에서 모범 사례는 절대 수입을 할 수 있습니다 python.org/dev/peps/pep-0008/#imports이 기능 대신에 갖는 어디에서 온 당신이 실제로 알고 있기 때문에 그것을 너무 쉽게, 다른 사람의 코드를 읽을 수있는 당신이 모르는 각각을 찾아보십시오. R에서 동일한 작업을 수행하는 것이 표준 이었기를 바랍니다. 다른 사람의 코드에 모든 작은 기능을 조회 할 수있는 것은 정말 ... 내 기어를 갈기
wordsforthewise

또한 Python 상호 작용 또는 IPython을위한 Jupyter 노트북.
wordsforthewise

17

xn=2000=30y=Axx

A=130(1...10...001...10...0...1...100...01...1)

3030y19702000

x1,...,x2000y1y2 등.

x1,...,xnxyx

A3030AA 임).

AAz=AyxyAz wikipedia ).

2000x

의사 역수를 사용하여 이동 평균에서 원래 신호의 재구성

많은 수치 프로그램은 의사 역수 (예 : Matlab, numpy in python 등)를 제공합니다.

내 예제에서 신호를 생성하는 파이썬 코드는 다음과 같습니다.

from numpy import *
from numpy.linalg import *
from matplotlib.pyplot import *
# get A and its inverse     
A = (tril(ones((2000,2000)),-1) - tril(ones((2000,2000)),-31))/30.
A = A[30:,:]
pA = pinv(A) #pseudo inverse

# get x
x = random.randn(2000) + 5
y = dot(A,x)

# reconstruct
x2 = dot(pA,y)

plot(x,label='original x')
plot(y,label='averaged x')
plot(x2,label='reconstructed x')
legend()
show()

희망이 도움이됩니다.


이것은 훌륭한 답변이지만 "y와 Az 사이의 2 차 거리를 최소화합니다"라고 말했을 때 착각 한 것 같습니다. 사실 y와 Az는 같은 것입니다. 최소화 된 것은 z의 표준으로, 내가 시도한 실제 신호에는 잘 작동하지만 원래 신호에 많은 특이 치가있는 경우 그렇게 좋지 않습니다.
gdelfino

내가 따라 갈지 잘 모르겠습니다. y와 Ax는 동일하지만 y와 Az는 동일하지 않으며 z의 규범을 최소화하는 것도 사실입니다. 또한 왜 내 예제에서 작동하지 않는지 알 수 없습니다. 파란색과 빨간색 선이 아주 잘 어울립니다. 귀하의 의견에 뭔가 빠졌습니까?
fabee

y는 A를 곱하여 원래 신호 x에서 계산 된 이동 평균입니다.이 절차는 이동 평균 y가 동일한 신호 z를 제공합니다. 따라서 y = Az 따라서 z의 규범 만 최소화됩니다. 원래 신호의 표준 값이 크면 절차가 제대로 수행되지 않습니다. 표준 값이 큰 신호의 예는 다음과 같습니다.
gdelfino

{42.8, -33.7, 13.2, -45.6, 10.2, 35.8, -41.4, 20.253, 43.3429, -33.2735, 13.6135, -45.1067, 10.6346, 36.1352, -40.9703, 20.6616, 43.6796, -32.8966, 14.0406, -44.7001, 10.9988 , 36.4675, -40.7277, 20.8823, 43.7878, -32.7415, 13.9951, -44.7947, 11.044, 36.3873, -40.7117, 20.7505, 43.8204, -32.9399, 13.9129, -44.9549, 10.8703, 36.1559, -40.8894, 20.4211.4311.4311.4311. , 13.5468, -45.2374, 10.3787, 35.8235, -41.5161, 19.9717, 43.0658, -33.7125, 13.0321}
gdelfino

위의 신호에 대해 윈도우 크기 8을 사용하십시오. 이렇게하면 필터링 된 신호의 모양이 원래 신호와 매우 다릅니다.
gdelfino
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.