Tôi cần tính toán các phần tư (Q1, trung vị và Q3) trong thời gian thực trên một tập hợp dữ liệu lớn mà không lưu trữ các quan sát. Lần đầu tiên tôi đã thử thuật toán P vuông (Jain / Chlamtac) nhưng tôi không hài lòng với nó (sử dụng cpu quá nhiều và không bị thuyết phục bởi độ chính xác ít nhất là trên tập dữ liệu của tôi).
Bây giờ tôi sử dụng thuật toán FAME ( Feldman / Shavitt ) để ước tính trung vị khi đang bay và cố gắng tạo ra thuật toán để tính toán cả Q1 và Q3:
M = Q1 = Q3 = first data value
step =step_Q1 = step_Q3 = a small value
for each new data :
# update median M
if M > data:
M = M - step
elif M < data:
M = M + step
if abs(data-M) < step:
step = step /2
# estimate Q1 using M
if data < M:
if Q1 > data:
Q1 = Q1 - step_Q1
elif Q1 < data:
Q1 = Q1 + step_Q1
if abs(data - Q1) < step_Q1:
step_Q1 = step_Q1/2
# estimate Q3 using M
elif data > M:
if Q3 > data:
Q3 = Q3 - step_Q3
elif Q3 < data:
Q3 = Q3 + step_Q3
if abs(data-Q3) < step_Q3:
step_Q3 = step_Q3 /2
Để tiếp tục, nó chỉ cần sử dụng trung bình M thu được khi đang bay để chia tập dữ liệu thành hai và sau đó sử dụng lại cùng một thuật toán cho cả Q1 và Q3.
Điều này dường như hoạt động bằng cách nào đó nhưng tôi không thể chứng minh (tôi không phải là một nhà toán học). Là nó thiếu sót? Tôi sẽ đánh giá cao bất kỳ đề nghị hoặc kỹ thuật khác cuối cùng phù hợp với vấn đề.
Cảm ơn bạn rất nhiều vì đã giúp đỡ của bạn !
==== CHỈNH SỬA =====
Đối với những người quan tâm đến những câu hỏi như vậy, sau một vài tuần, cuối cùng tôi đã kết thúc bằng cách sử dụng Reservoir Sampling với một giá trị 100 giá trị và nó cho kết quả rất bão hòa (với tôi).