+1 auf die Antwort von fabee, die vollständig ist. Nur eine Notiz, um es in R zu übersetzen, basierend auf den Paketen, die ich gefunden habe, um die Operationen zur Hand zu machen. In meinem Fall hatte ich Daten, bei denen es sich um NOAA-Temperaturvorhersagen für drei Monate handelt: Januar-Februar-März, Februar-März-April, März-April-Mai usw., und ich wollte sie in (ungefähre) Daten aufteilen. Monatswerte unter der Annahme, dass die Temperatur jedes Dreimonatszeitraums im Wesentlichen ein Durchschnitt ist.
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
Welches funktioniert gut für mich. Danke @fabee.
BEARBEITEN: OK, rückübersetzend mein R zu Python, erhalte ich:
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
(Das Debuggen hat viel länger gedauert als die R-Version. Erstens, weil ich mit Python nicht so vertraut bin wie mit R, aber auch, weil R viel interaktiver nutzbar ist.)