+1 untuk jawaban fabee, yang lengkap. Hanya sebuah catatan untuk menerjemahkannya ke R, berdasarkan pada paket yang saya temukan untuk melakukan operasi. Dalam kasus saya, saya memiliki data yang merupakan prakiraan suhu NOAA berdasarkan tiga bulan: Jan-Feb-Mar, Feb-Mar-Apr, Mar-Apr-May, dll, dan saya ingin memecahnya menjadi (perkiraan) nilai bulanan, dengan asumsi bahwa setiap periode periode tiga bulan pada dasarnya adalah rata-rata.
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
Itu sangat bagus untuk saya. Terima kasih @fabee.
EDIT: OK, menerjemahkan kembali R saya ke Python, saya dapat:
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
(Yang membutuhkan waktu lebih lama untuk debug daripada versi R. Pertama karena saya tidak terbiasa dengan Python seperti dengan R, tetapi juga karena R jauh lebih dapat digunakan secara interaktif.)