นี่คือการเพิ่มคำตอบ @chmike
วิธีการนี้ดูเหมือนจะคล้ายกับอัลกอริทึมออนไลน์ของ BP Welford สำหรับส่วนเบี่ยงเบนมาตรฐานซึ่งคำนวณค่าเฉลี่ย จอห์นคุกให้คำอธิบายที่ดีที่นี่ Tony Finch ในปี 2009 มีวิธีการสำหรับค่าเฉลี่ยเคลื่อนที่ชี้แจงและส่วนเบี่ยงเบนมาตรฐาน:
diff := x – mean
incr := alpha * diff
mean := mean + incr
variance := (1 - alpha) * (variance + diff * incr)
ดูที่คำตอบที่โพสต์ก่อนหน้านี้และขยายเพื่อรวมหน้าต่างการเคลื่อนไหวแบบเอ็กซ์โพเนนเชียล:
init():
meanX = 0, meanY = 0, varX = 0, covXY = 0, n = 0,
meanXY = 0, varY = 0, desiredAlpha=0.01 #additional variables for correlation
update(x,y):
n += 1
alpha=max(desiredAlpha,1/n) #to handle initial conditions
dx = x - meanX
dy = y - meanY
dxy = (x*y) - meanXY #needed for cor
varX += ((1-alpha)*dx*dx - varX)*alpha
varY += ((1-alpha)*dy*dy - varY)*alpha #needed for corXY
covXY += ((1-alpha)*dx*dy - covXY)*alpha
#alternate method: varX = (1-alpha)*(varX+dx*dx*alpha)
#alternate method: varY = (1-alpha)*(varY+dy*dy*alpha) #needed for corXY
#alternate method: covXY = (1-alpha)*(covXY+dx*dy*alpha)
meanX += dx * alpha
meanY += dy * alpha
meanXY += dxy * alpha
getA(): return covXY/varX
getB(): return meanY - getA()*meanX
corXY(): return (meanXY - meanX * meanY) / ( sqrt(varX) * sqrt(varY) )
ใน "รหัส" ด้านบนสามารถตั้งค่า Alpha ที่ต้องการเป็น 0 และหากเป็นเช่นนั้นรหัสจะทำงานโดยไม่มีการยกน้ำหนักแบบเอ็กซ์โปเนนเชียล คุณสามารถแนะนำให้ตั้งค่า Alpha ที่ต้องการเป็น 1 / ต้องการ WindowSize ตามที่Modified_moving_averageแนะนำสำหรับขนาดหน้าต่างที่เคลื่อนไหว
คำถามด้านข้าง: จากการคำนวณทางเลือกข้างต้นความคิดเห็นใดที่ดีกว่าจากมุมมองที่มีความแม่นยำ
อ้างอิง:
chmike (2013) https://stats.stackexchange.com/a/79845/70282
Cook, John (nd) คำนวณความแปรปรวนของการทำงานอย่างแม่นยำhttp://www.johndcook.com/blog/standard_deviation/
นกกระจอกโทนี่ (2009) การคำนวณที่เพิ่มขึ้นของค่าเฉลี่ยถ่วงน้ำหนักและความแปรปรวน https://fanf2.user.srcf.net/hermes/doc/antiforgery/stats.pdf
วิกิพีเดีย (nd) อัลกอริทึมออนไลน์ของ Welford https://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#Online_algorithm