Phương sai có thể được diễn tả như tỷ lệ thuận với sự chênh lệch bình phương giữa mỗi giá trị và giá trị trung bình, hoặc (như nhiều chủ đề ở đây trong stats.SE tài liệu, như câu trả lời này tôi viết cho một câu hỏi khác) nó cách khác có thể được thể hiện dưới dạng tỉ lệ với bình phương sự khác biệt cặp đôi giữa mỗi mẫu.
Vì vậy, chúng tôi biết:
Biến ( x ) =1n⋅ΣTôi(XTôi-X¯¯¯¯)2= =12n2⋅Σtôi , j(XTôi-Xj)2
Giả sử bạn thêm một mẫu khác, được lập chỉ mục là chỉ mục cuối cùng, k. Phương sai trước đây của bạn sẽ là:
Varo l d( x ) =12 ( n - 1)2⋅Σtôi < k , j < k(XTôi-Xj)2
Phương sai mới của bạn là
Varn e w( x ) =12n2⋅Σtôi , j(XTôi-Xj)2= =12n2⋅ (Σtôi < k , j < k(XTôi-Xj)2+Σj < k(Xk-Xj)2+ΣTôi< k(XTôi-Xk)2)
Nhưng
Σj < k(Xk-Xj)2= =Σtôi < k(XTôi-Xk)2Σtôi < k , j < k(XTôi-Xj)2= 2 ( n - 1)2⋅Varo l d( x )
Vì thế
Varn e w( x ) =(n - 1n)2Varo l d( x ) +1n2Σj < k(Xk-Xj)2
Như @ MarkL.Stone đã nói trong các bình luận, điều này vẫn không hiệu quả vì chúng tôi phải giữ mọi XTôi. Vì vậy, hãy mở rộng công thức để đi đến một cái gì đó dễ điều khiển hơn.
1n2Σj < k(Xk-Xj)2= =1n2Σj < k(X2k- 2 ⋅Xj⋅Xk+X2j) = =1n2(Σj < kX2k- 2 ⋅Xk⋅Σj < kXj+Σj < kX2j) = =1n2( K ⋅X2k- 2 ⋅Xk⋅ ( k - 1 ) ⋅Xo l d¯¯¯¯¯¯¯¯¯+ ( K - 1 ) ⋅X2o l d¯¯¯¯¯¯¯¯¯)
Bởi vì
Σj < kXj= ( K - 1 ) ⋅Xo l d¯¯¯¯¯¯¯¯¯Σj < kX2j= ( K - 1 ) ⋅X2o l d¯¯¯¯¯¯¯¯¯
Hình thức cuối cùng là
Varn e w( x ) =(n - 1n)2Varo l d( x )+1n2( K ⋅X2k- 2 ⋅Xk⋅ ( k - 1 ) ⋅Xo l d¯¯¯¯¯¯¯¯¯+ ( K - 1 ) ⋅X2o l d¯¯¯¯¯¯¯¯¯)
Bạn có thể sử dụng công thức này để cập nhật phương sai bộ nhớ một cách hiệu quả. Bạn cũng có thể bổ sung nó để sử dụng các đợt thay vì cập nhật điểm đơn.
Về cơ bản, bạn cần lưu trữ trung bình, trung bình của các mẫu bình phương và phương sai mỗi lần lặp và sử dụng nó để cập nhật công thức phương sai.
Thêm nữa
X2o l d¯¯¯¯¯¯¯¯¯= =Varo l d( x ) + (Xo l d¯¯¯¯¯¯¯¯¯)2∴Varn e w( x ) =(n - 1n)2Varo l d( x )+1n2( K ⋅X2k- 2 ⋅Xk⋅ ( k - 1 ) ⋅Xo l d¯¯¯¯¯¯¯¯¯+ ( K - 1 ) ⋅ (Varo l d( x ) + (Xo l d¯¯¯¯¯¯¯¯¯)2) )
Điều này mang lại số lượng cần được lưu trữ xuống còn 2.