เป็นไปได้หรือไม่ที่จะดึงจุดข้อมูลออกจากข้อมูลเฉลี่ยเคลื่อนที่?
กล่าวอีกนัยหนึ่งถ้าชุดข้อมูลมีค่าเฉลี่ยเคลื่อนที่อย่างง่ายจาก 30 คะแนนก่อนหน้าเป็นไปได้หรือไม่ที่จะแยกจุดข้อมูลดั้งเดิมออก
ถ้าเป็นเช่นนั้นได้อย่างไร
เป็นไปได้หรือไม่ที่จะดึงจุดข้อมูลออกจากข้อมูลเฉลี่ยเคลื่อนที่?
กล่าวอีกนัยหนึ่งถ้าชุดข้อมูลมีค่าเฉลี่ยเคลื่อนที่อย่างง่ายจาก 30 คะแนนก่อนหน้าเป็นไปได้หรือไม่ที่จะแยกจุดข้อมูลดั้งเดิมออก
ถ้าเป็นเช่นนั้นได้อย่างไร
คำตอบ:
+1 ถึงคำตอบของ fabee ซึ่งเสร็จสมบูรณ์ เพิ่งทราบว่าจะแปลมันเป็น 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
แก้ไข: ตกลงกลับแปล 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 สามารถใช้งานได้แบบโต้ตอบมากขึ้น)
ฉันพยายามที่จะนำสิ่งที่คนพูดมาตอบคำถาม สมมุติว่าคุณมีเวกเตอร์ขนาดใหญ่มีn = 2000รายการ หากคุณคำนวณค่าเฉลี่ยเคลื่อนที่ด้วยหน้าต่างที่มีความยาวℓ = 30คุณสามารถเขียนนี่เป็นการคูณเมทริกซ์เวกเตอร์y = A xของเวกเตอร์xกับเมทริกซ์
ซึ่งมีอันซึ่งถูกเลื่อนผ่านในขณะที่คุณเลื่อนไปตามแถวจนกว่าจะมี30อันที่จุดสิ้นสุดของเมทริก เวกเตอร์เฉลี่ยy ที่นี่มีขนาด 1970 เมทริกซ์มีแถว1970และคอลัมน์2000 ดังนั้นจึงไม่สามารถย้อนกลับได้
ถ้าคุณไม่คุ้นเคยกับการฝึกอบรมคิดเกี่ยวกับมันเป็นระบบสมการเชิงเส้น: คุณกำลังค้นหาสำหรับตัวแปรเช่นนั้นโดยเฉลี่ยในสามสิบแรกผลผลิตy 1 , โดยเฉลี่ยในช่วงสามสิบวินาทีที่สองให้ผลผลิตy 2เป็นต้น
โปรแกรมเชิงตัวเลขหลายตัวเสนอโปรแกรมหลอกผู้บุกรุก (เช่น Matlab, numpy ใน 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()
หวังว่าจะช่วย