Trích xuất điểm dữ liệu từ di chuyển trung bình?


15

Có thể trích xuất các điểm dữ liệu từ di chuyển dữ liệu trung bình?

Nói cách khác, nếu một tập hợp dữ liệu chỉ có các đường trung bình di chuyển đơn giản của 30 điểm trước đó, thì có thể trích xuất các điểm dữ liệu gốc không?

Nếu vậy thì thế nào?


1
Câu trả lời là có đủ điều kiện, nhưng quy trình chính xác phụ thuộc vào cách phân đoạn dữ liệu ban đầu được xử lý. Nếu nó bị bỏ đi một cách đơn giản, thì bạn đã mất 15 mẩu dữ liệu một cách hiệu quả, để lại cho bạn một hệ thống phương trình tuyến tính không xác định. Kết quả cuối cùng là tồn tại nhiều câu trả lời hợp lệ nói chung, nhưng bạn vẫn có thể đạt được một số tiến bộ nếu (a) cửa sổ ngắn hơn (hoặc một số quy trình như vậy) được sử dụng cho 15 đường trung bình di chuyển ban đầu hoặc (b) bạn có thể chỉ định các ràng buộc bổ sung trên giải pháp (giá trị ràng buộc khoảng 15 chiều ...). Bạn đang ở trong tình huống nào?
whuber

@whuber Cảm ơn bạn rất nhiều vì đã tìm kiếm! Tôi có 2.000 điểm. Điểm MA đầu tiên rất có thể là trung bình của 30 điểm ban đầu. Độ chính xác đứng thứ hai sau một kết quả chính xác, cụ thể nhất là những dự đoán tốt ở những điểm "gần đây" nhất. Bạn có thể giới thiệu một phương pháp tương đối đơn giản? Cảm ơn trước!

1
(nếu bạn mất hơn năm phút để viết bình luận ...). Điều tôi muốn viết là bạn có thể nghĩ trung bình là một phép nhân ma trận. Các hàng ở giữa sẽ có 1/30 * [1 1 1 ...] trước đường chéo. Câu hỏi là, làm thế nào để bạn đối phó với các điểm ở biên của vectơ của bạn để làm cho ma trận không thể đảo ngược. Bạn có thể làm điều này bằng cách giả định rằng chúng là kết quả của việc tính trung bình trên các yếu tố ít hơn hoặc bạn nghĩ về các ràng buộc khác. Lưu ý rằng trong khi đảo ngược ma trận là một cách dễ dàng để hiểu nó, nó không phải là hiệu quả nhất. Bạn có thể muốn sử dụng một FFT để làm điều đó.
fabee

Câu trả lời:


4

+1 cho câu trả lời của fabee, đã hoàn tất. Chỉ cần một lưu ý để dịch nó sang R, dựa trên các gói mà tôi đã tìm thấy để thực hiện các thao tác trong tay. Trong trường hợp của tôi, tôi đã có dữ liệu dự báo nhiệt độ NOAA trên cơ sở ba tháng: Jan-Feb-Mar, Feb-Mar-April, Mar-April-May, v.v., và tôi muốn chia nó ra (gần đúng) giá trị hàng tháng, giả sử rằng nhiệt độ của mỗi giai đoạn ba tháng về cơ bản là trung bình.

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

Mà làm việc tuyệt vời cho tôi. Cảm ơn @fabee.

EDIT: OK, dịch lại R của tôi sang Python, tôi nhận được:

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

(Mất nhiều thời gian để gỡ lỗi hơn phiên bản R. Đầu tiên vì tôi không quen với Python như với R, nhưng cũng vì R có thể sử dụng tương tác nhiều hơn.)


@Gracchus: Xin lỗi, không phải là một anh chàng C ++, nhưng bạn có thể tìm thấy những gì bạn cần trong thư viện đại số tuyến tính Armadillo C ++ ( arma.sourceforge.net ), cũng có sẵn trong R thông qua gói RcppArmadillo.
Wayne

OK, xem nếu nó làm việc cho bạn. Nếu vậy, bạn có thể chọn câu trả lời của tôi ;-)
Wayne

Các thực hành tốt nhất của FYI trong Python là nhập tuyệt đối: python.org/dev/peps/pep-0008/#imports giúp đọc mã của người khác dễ dàng hơn nhiều, vì bạn thực sự biết các hàm đến từ đâu thay vì phải tìm kiếm từng cái bạn không biết Ước gì nó là tiêu chuẩn trong R để làm điều tương tự. Phải tìm kiếm mọi chức năng nhỏ trong mã của người khác thực sự nghiền nát bánh răng của tôi ...
lời nói

Ngoài ra, máy tính xách tay Jupyter cho tương tác Python hoặc IPython.
lời giới thiệu

17

Tôi cố gắng đưa những gì whuber nói vào một câu trả lời. Giả sử bạn có một vectơ lớn với n = 2000 mục. Nếu bạn tính toán một đường trung bình động với một cửa sổ có chiều dài = 30 , bạn có thể viết những dòng này như một vector ma trận nhân y = A x của vector x với ma trậnxn=2000=30y=Axx

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

trong đó có cái được chuyển qua khi bạn tiến qua các hàng cho đến khi 30 cái đó kết thúc ma trận. Ở đây vectơ trung bình y có 1970 kích thước. Ma trận có 1970 hàng và 2000 cột. Do đó, nó không thể đảo ngược.3030y19702000

x1,...,x2000y1y2

x1,...,xnxyx

A3030AA

AAz=AyxyAz

2000x

tái tạo tín hiệu gốc từ trung bình di chuyển bằng cách sử dụng giả

Nhiều chương trình số cung cấp giả nghịch đảo (ví dụ Matlab, numpy trong python, v.v.).

Đây sẽ là mã python để tạo các tín hiệu từ ví dụ của tôi:

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()

Mong rằng sẽ giúp.


Đây là một câu trả lời tuyệt vời, nhưng tôi nghĩ bạn đã nhầm khi nói rằng "nó giảm thiểu khoảng cách bậc hai giữa y và Az". Trong thực tế y và Az là như nhau. Điều tối thiểu hóa là chỉ tiêu z hoạt động tốt đối với các tín hiệu trong thế giới thực mà tôi đã thử, nhưng sẽ không tốt nếu tín hiệu ban đầu của bạn có nhiều ngoại lệ.
gdelfino

Tôi không chắc chắn nếu tôi làm theo. y và Axe là như nhau, nhưng không phải y và Az Đúng là nó cũng giảm thiểu định mức của z. Tôi cũng không thấy lý do tại sao nó không hoạt động cho các ví dụ của tôi. Các đường màu xanh và đỏ kết hợp khá độc đáo. Tôi có thiếu điều gì trong bình luận của bạn không?
fabee

y là trung bình di chuyển được tính từ tín hiệu gốc x bằng cách nhân với A. Quy trình này cho chúng ta một tín hiệu z có cùng trung bình di chuyển y. Do đó y = Az Vì vậy, chỉ có định mức của z được giảm thiểu. Nếu tín hiệu ban đầu xảy ra có giá trị định mức lớn, thì quy trình sẽ không cho kết quả tốt. Một tín hiệu ví dụ có giá trị định mức lớn nằm bên dưới:
gdelfino

{42.8, -33.7, 13. , 36,4675, , 13,5468, -45,2374, 10,3787, 35,8235, -41,5161, 19,9717, 43,0658, -33,7125, 13,0321}
gdelfino

Vui lòng sử dụng kích thước cửa sổ là 8 cho tín hiệu trên. Bằng cách này, tín hiệu được lọc có hình dạng rất khác so với tín hiệu gốc.
gdelfino
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.