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?
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?
Câu trả lời:
+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.)
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ận
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.
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.