È possibile estrarre punti dati dallo spostamento di dati medi?
In altre parole, se un insieme di dati ha solo medie mobili semplici dei precedenti 30 punti, è possibile estrarre i punti dati originali?
Se é cosi, come?
È possibile estrarre punti dati dallo spostamento di dati medi?
In altre parole, se un insieme di dati ha solo medie mobili semplici dei precedenti 30 punti, è possibile estrarre i punti dati originali?
Se é cosi, come?
Risposte:
+1 alla risposta di fabee, che è completa. Solo una nota per tradurlo in R, in base ai pacchetti che ho trovato per fare le operazioni a portata di mano. Nel mio caso, avevo dati che sono previsioni di temperatura NOAA su base trimestrale: gennaio-febbraio-marzo, febbraio-marzo-aprile, marzo-aprile-maggio, ecc. E volevo dividerli in (approssimativo) valori mensili, supponendo che la temperatura di ciascun periodo di tre mesi sia essenzialmente una media.
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
Il che funziona benissimo per me. Grazie @fabee.
EDIT: OK, ri-traducendo la mia R in Python, ottengo:
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
(Il cui debug ha richiesto molto più tempo rispetto alla versione R. Prima perché non ho familiarità con Python come con R, ma anche perché R è molto più utilizzabile in modo interattivo.)
Molti programmi numerici offrono pseudo-inverse (ad esempio Matlab, numpy in python, ecc.).
Ecco il codice Python per generare i segnali dal mio esempio:
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()
Spero possa aiutare.