Hareketli ortalama verilerden veri noktaları elde etmek mümkün müdür?
Başka bir deyişle, bir veri kümesi yalnızca önceki 30 noktanın basit hareketli ortalamalarına sahipse, orijinal veri noktalarını çıkarmak mümkün müdür?
Öyleyse nasıl?
Hareketli ortalama verilerden veri noktaları elde etmek mümkün müdür?
Başka bir deyişle, bir veri kümesi yalnızca önceki 30 noktanın basit hareketli ortalamalarına sahipse, orijinal veri noktalarını çıkarmak mümkün müdür?
Öyleyse nasıl?
Yanıtlar:
Fabee'nin cevabına +1, ki bu tamamlandı. Eldeki işlemleri yaparken bulduğum paketlere dayanarak onu R'ye çevirmek için bir not. Benim durumumda, üç aylık bazda NOAA sıcaklık tahminleri olan verilerim vardı: Ocak-Şubat-Mart, Şubat-Mart-Nisan, Mart-Nisan-Mayıs, vb. her üç aylık dönemin sıcaklığının esasen bir ortalama olduğunu varsayarsak, aylık değerler.
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
Bu benim için harika çalışıyor. Teşekkürler @fabee.
EDIT: Tamam, R benim Python için çeviri, ben:
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
(Bu, R sürümüne göre hata ayıklamak için çok daha uzun sürdü. Birincisi, R ile olduğu kadar Python'a aşina olmadığım için değil, R'nin etkileşimli olarak çok daha kullanışlı olması nedeniyle.)
Whuber'ın söylediklerini bir cevaba koymaya çalışıyorum. Let Diyelim ki büyük bir vektör olduğunu varsayalım ile n = 2000 girdileri. Eğer uzunluk bir pencere ile bir hareketli ortalama hesaplaması ℓ = 30 , bir vektör matris çarpım olarak yazabilir y = A x vektörü x matrisi ile
hangi vardır kadar satır ile peşin olarak yoluyla kaydırılır olanları 30 olanlar matrisin sonuna çarptı. Burada ortalama y vektörü 1970 boyutlarına sahiptir. Matrisin 1970 satırı ve 2000 sütunu vardır. Bu nedenle, ters çevrilemez.
Matrislere aşina değilseniz, bunu doğrusal bir denklem sistemi olarak düşünün: değişkenlerini arıyorsunuz . . . , x 2000 , ilk otuz üzerindeki ortalama y 1 verir , ikinci otuz üzerindeki ortalama verir vb.
.
Birçok sayısal program sözde ters (ör. Matlab, pitonda numpy, vb.) Sunar.
İşte benim örnek sinyalleri oluşturmak için python kodu olurdu:
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()
Umarım yardımcı olur.