Ước tính trực tuyến phương sai với bộ nhớ hạn chế


7

Tôi đang tạo ra một thành phần nhằm tính toán trung bình và phương sai của một số liệu liên quan đến các sự kiện xảy ra trong thời gian nhưng với bộ nhớ trong hạn chế.

Hãy tưởng tượng rằng các sự kiện là khách truy cập vào một cửa hàng và số liệu là tuổi của họ.

Trong thời gian, thành phần của tôi nhận được các sự kiện với độ tuổi của mỗi khách truy cập. Tôi không muốn thành phần của mình ghi nhớ lịch sử của từng thời đại. Lý tưởng nhất, tôi muốn chỉ lưu trữ một thành phần ánh sáng: trung bình A, phương sai V và số lượng sự kiện N.

Sau mỗi sự kiện theo độ tuổi E, tôi muốn cập nhật ba giá trị đó:

N<=N+1
A<=(A*N+E)/(N+1)
V<=???

Để làm gì V? Tôi đang nghĩ về một cái gì đó như:

V<=(V*N+(E-A)^2)/(N+1)

Tôi biết nó không chính xác như trước đây của tôi Vđang sử dụng cái cũ Akhông còn là mức trung bình.

Q1 - Có một công thức chính xác?
Q2 - Nếu không, đề xuất của tôi là một ước tính tốt? Có phải là thiên vị? Nó sẽ hội tụ chính xác khi Ntăng?
Câu 3 - Có công thức nào tốt hơn không?


Số chính xác có thể là một mối quan tâm quá. Và xem thêm thuật toán trực tuyến để tính toán phương sai với một phân rã .
Scortchi - Phục hồi Monica

Bạn cũng có thể giữ tổng của E ^ 2 không?
Andy W

Vâng, nó sẽ ổn thôi. Tôi có thể giữ một số lượng hữu hạn các giá trị nhưng không phụ thuộc vào N.
Arnaud Mégret

4
Ví dụ, sử dụng thuật toán cập nhật phương sai một lần ổn định bằng số như được cung cấp trong phần 1 của cs.yale.edu/publications/techreports/tr222.pdf . Câu trả lời của Andy W. là một phương pháp khủng khiếp có thể rất không chính xác.
Mark L. Stone

Câu trả lời:


10

Thuật toán đẹp và đơn giản để tính toán phương sai theo cách trực tuyến được mô tả bởi Welford (1962). Dưới đây bạn có thể thấy triển khai C ++ / Rcpp của nó hoạt động ngoại tuyến, nhưng có thể dễ dàng điều chỉnh theo kịch bản trực tuyến:

List welford_cpp(NumericVector x) {

  int n = x.length();
  double delta;
  double msq = 0;
  double mean = x[0];

  if (n > 1) {
    for (int i = 1; i < n; i++) { 
      delta = x[i] - mean;
      mean += delta / (i+1);
      msq += delta * (x[i] - mean);
    }
    return Rcpp::List::create(Rcpp::Named("mean") = mean,
                              Rcpp::Named("variance") = msq / (n-1));
  }

  return Rcpp::List::create(Rcpp::Named("mean") = mean,
                            Rcpp::Named("variance") = NAN);
}

Như bạn thấy, nó cần phải lưu trữ chỉ có bốn biến: n, delta, msqmeanvà tính trung bình và phương sai đồng thời như bạn muốn.


Welford, BP (1962). Lưu ý về phương pháp tính tổng các bình phương và sản phẩm đã hiệu chỉnh . Kỹ thuật 4 (3): 419-420.


Rất hay, cảm ơn bạn (để Mark Stone cũng tham khảo). Sẽ xóa câu trả lời của tôi.
Andy W

1

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:

Var(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à:

Varotôid(x)= =12(n-1)2ΣTôi<k,j<k(XTôi-Xj)2

Phương sai mới của bạn là

Varnew(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)2Varotôid(x)

Vì thế

Varnew(x)= =(n-1n)2Varotôid(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(Xk2-2XjXk+Xj2)= =1n2(Σj<kXk2-2XkΣj<kXj+Σj<kXj2)= =1n2(kXk2-2Xk(k-1)Xotôid¯+(k-1)Xotôid2¯)
Bởi vì
Σj<kXj= =(k-1)Xotôid¯Σj<kXj2= =(k-1)Xotôid2¯

Hình thức cuối cùng là

Varnew(x)= =(n-1n)2Varotôid(x)+1n2(kXk2-2Xk(k-1)Xotôid¯+(k-1)Xotôid2¯)

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

Xotôid2¯= =Varotôid(x)+(Xotôid¯)2Varnew(x)= =(n-1n)2Varotôid(x)+1n2(kXk2-2Xk(k-1)Xotôid¯+(k-1)(Varotôid(x)+(Xotôid¯)2))

Điều này mang lại số lượng cần được lưu trữ xuống còn 2.


Không phải phương pháp này yêu cầu sự sẵn có của tất cả các điểm dữ liệu trước đó để tính toán cập nhật? Nếu vậy, điều đó trái với ý tưởng xử lý bộ nhớ hạn chế. Lưu ý rằng các thuật toán cập nhật trực tuyến, dọc theo dòng của Welford trong câu trả lời của @Tim, đây là một trường hợp cụ thể của một loại thuật toán tương tự được thảo luận trong cs.yale.edu/publications/techreports/tr222.pdf, không yêu cầu lưu cũ điểm dữ liệu, nhưng chỉ có 2 thanh ghi (biến vô hướng) để giữ lại thông tin cũ.
Mark L. Stone

@ MarkL.Stone Hmm tôi thấy. Có, điều này đòi hỏi tất cả các giá trị trước đóXTôi, bạn đúng rồi.
Firebug

@ MarkL.Stone Tôi đã cập nhật công thức để ba số vô hướng cần được lưu trữ. Tôi đã có thể thấy nó có thể được giảm hơn nữa, có lẽ tương đương với các giải pháp khác.
Firebug

Do phép trừ, thay vì chỉ thêm các đại lượng không âm, thuật toán sửa đổi của bạn ít chính xác hơn về số lượng (mạnh mẽ) so với Welford và các thuật toán tương tự. Tôi thấy không có công trong đó.
Mark L. Stone

0

OK Andy W đã đưa ra câu trả lời. Bằng cách bảo tồnE2 trung bình theo cách tương tự như trung bình E, bạn có thể sử dụng V= =exp(E2)-exp(E)2.


2
Bởi exp(E2)bạn có thể có nghĩa là giá trị mong đợi củaE2? (Và không phải là hàm số mũ.)
Andy W

8
Phương pháp đó là tốt, trừ khi bạn quan tâm đến việc có được câu trả lời đúng.
Mark L. Stone

2
Bất ổn định số, và do đó, không chính xác về số. Nó là chính xác nếu được thực hiện trong số học chính xác, tức là độ chính xác vô hạn. Trong độ chính xác hữu hạn trên máy tính, nó có thể rất không chính xác, và thậm chí có thể phát ra âm tính (và thực tế có nhiều lần) ..
Mark L. Stone

4
Excel thực sự đã sử dụng phương pháp này trong một thời gian dài (chịu nhiều chỉ trích và chế giễu từ các nhà thống kê và những người khác). Trong các trường hợp khá đơn giản (dữ liệu với giá trị trung bình lớn, độ lệch chuẩn nhỏ), bạn có thể làm cho hàm phương sai của nó đưa ra đầu ra tương ứng với một xấp xỉ của một trình tạo số ngẫu nhiên (thay đổi dữ liệu theo số lượng nhỏ liên tiếp và phương sai được báo cáo tăng vọt). Điều này được gây ra bởi sự hủy bỏ thảm khốc của sự khác biệt. Đó là một cách rất hiệu quả để chứng minh tại sao những vấn đề này lại quan trọng. Excel không làm điều đó nữa.
Glen_b -Reinstate Monica

4
Về sự hủy bỏ thảm khốc này, hãy xem ví dụ cuộc thảo luận ở đây
Glen_b -Reinstate Monica
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.