+1 à la réponse de fabee, qui est complète. Juste une note pour le traduire en R, basé sur les packages que j'ai trouvés pour effectuer les opérations à portée de main. Dans mon cas, j'avais des données qui sont des prévisions de température de la NOAA sur une base de trois mois: janvier-février-mars, février-mars-avril, mars-avril-mai, etc., et je voulais les détailler (approximativement) valeurs mensuelles, en supposant que la température de chaque période de trois mois est essentiellement une moyenne.
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
Ce qui fonctionne très bien pour moi. Merci @fabee.
EDIT: OK, en rétraduisant mon R en Python, j'obtiens:
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
(Ce qui a pris beaucoup plus de temps pour déboguer que la version R. D'abord parce que je ne suis pas aussi familier avec Python qu'avec R, mais aussi parce que R est beaucoup plus utilisable de manière interactive.)