Czy można wyodrębnić punkty danych z ruchomych danych średnich?
Innymi słowy, jeśli zestaw danych zawiera tylko proste średnie ruchome z poprzednich 30 punktów, czy można wyodrębnić oryginalne punkty danych?
Jeśli tak to jak?
Czy można wyodrębnić punkty danych z ruchomych danych średnich?
Innymi słowy, jeśli zestaw danych zawiera tylko proste średnie ruchome z poprzednich 30 punktów, czy można wyodrębnić oryginalne punkty danych?
Jeśli tak to jak?
Odpowiedzi:
+1 do odpowiedzi fabee, która jest kompletna. Tylko uwaga, aby przetłumaczyć go na język R, w oparciu o pakiety, które znalazłem do wykonania dostępnych operacji. W moim przypadku miałem dane, które są prognozami temperatury NOAA na trzy miesiące: styczeń-luty-marzec, luty-marzec-kwiecień, marzec-kwiecień-maj itd. I chciałem je rozbić na (przybliżone) wartości miesięczne, przy założeniu, że temperatura każdego trzymiesięcznego okresu jest zasadniczo średnią.
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
Który działa dla mnie świetnie. Dzięki @fabee.
EDYCJA: OK, tłumacząc wstecz moje R na Python, otrzymuję:
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
(Debugowanie trwało dłużej niż wersja R. Po pierwsze dlatego, że nie znam tak dobrze Pythona jak z R, ale także dlatego, że R jest znacznie bardziej użyteczny interaktywnie.)
Wiele programów numerycznych oferuje pseudo-inwersje (np. Matlab, numpy w python itp.).
Oto kod python do generowania sygnałów z mojego przykładu:
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()
Mam nadzieję, że to pomaga.