Чи можливо витягнути точки даних із ковзних середніх даних?
Іншими словами, якщо набір даних має лише прості ковзні середні показники попередніх 30 балів, чи можливо витягнути вихідні точки даних?
Якщо так, то як?
Чи можливо витягнути точки даних із ковзних середніх даних?
Іншими словами, якщо набір даних має лише прості ковзні середні показники попередніх 30 балів, чи можливо витягнути вихідні точки даних?
Якщо так, то як?
Відповіді:
+1 до відповіді феї, яка завершена. Просто примітка для перекладу його на R на основі пакетів, які я виявив робити операції під рукою. У моєму випадку у мене були дані, що прогнозують температуру NOAA на три місяці: січень-лютий-березень, лютий-березень-квітень, березень-квітень-травень тощо, і я хотів їх розбити (приблизно) щомісячні значення, якщо вважати, що температура кожного тримісячного періоду по суті є середньою.
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
Що для мене чудово працює. Дякую @fabee
EDIT: Гаразд, зворотний переклад мого R на Python, я отримую:
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
(Для налагодження цього було потрібно набагато більше часу, ніж версія R. По-перше, я не так знайомий з Python, як з R, але також тому, що R набагато більш корисний для інтерактивного використання.)
Багато числових програм пропонують псевдоінверси (наприклад, Matlab, numpy в python тощо).
Тут буде код python для генерації сигналів з мого прикладу:
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()
Сподіваюся, що це допомагає.