Có một thuật toán để ước tính giá trị trung bình, chế độ, độ lệch và / hoặc kurtosis của bộ giá trị, nhưng điều đó KHÔNG yêu cầu lưu trữ tất cả các giá trị trong bộ nhớ cùng một lúc?
Tôi muốn tính toán các thống kê cơ bản:
- nghĩa là: trung bình số học
- phương sai: trung bình của độ lệch bình phương so với giá trị trung bình
- độ lệch chuẩn: căn bậc hai của phương sai
- trung vị: giá trị phân tách nửa số lớn hơn với nửa số nhỏ hơn
- chế độ: giá trị thường xuyên nhất được tìm thấy trong tập hợp
- độ lệch: tl; dr
- kurtosis: tl; dr
Các công thức cơ bản để tính bất kỳ công thức nào trong số này là số học cấp trường, và tôi biết chúng. Cũng có nhiều thư viện thống kê triển khai chúng.
Vấn đề của tôi là số lượng lớn (hàng tỷ) giá trị trong các tập hợp mà tôi đang xử lý: Làm việc bằng Python, tôi không thể chỉ tạo danh sách hoặc băm với hàng tỷ phần tử. Ngay cả khi tôi đã viết điều này bằng C, mảng tỷ phần tử không quá thực tế.
Dữ liệu không được sắp xếp. Nó được sản xuất ngẫu nhiên, nhanh chóng, bằng các quy trình khác. Kích thước của mỗi bộ rất thay đổi và sẽ không được biết trước về kích thước.
Tôi đã tìm ra cách xử lý giá trị trung bình và phương sai khá tốt, lặp lại qua từng giá trị trong tập hợp theo bất kỳ thứ tự nào. (Thực ra, trong trường hợp của tôi, tôi sắp xếp chúng theo thứ tự mà chúng được tạo.) Đây là thuật toán tôi đang sử dụng, xin phép http://en.wikipedia.org/wiki/Algorithm_for_calculating_variance#On-line_algorithm :
- Khởi tạo ba biến: count, sum và sum_of_squares
- Đối với mỗi giá trị:
- Số lượng tăng dần.
- Thêm giá trị vào tổng.
- Thêm bình phương của giá trị vào sum_of_squares.
- Chia tổng cho số đếm, lưu trữ dưới dạng giá trị trung bình của biến.
- Chia sum_of_squares cho số đếm, lưu trữ dưới dạng biến mean_of_squares.
- Square nghĩa, lưu trữ dưới dạng square_of_mean.
- Trừ square_of_mean khỏi mean_of_squares, lưu trữ dưới dạng phương sai.
- Giá trị trung bình đầu ra và phương sai.
Thuật toán "trực tuyến" này có điểm yếu (ví dụ: các vấn đề về độ chính xác như sum_of_squares nhanh chóng lớn hơn phạm vi số nguyên hoặc độ chính xác float), nhưng về cơ bản nó cung cấp cho tôi những gì tôi cần mà không phải lưu trữ mọi giá trị trong mỗi tập hợp.
Nhưng tôi không biết liệu các kỹ thuật tương tự có tồn tại để ước tính số liệu thống kê bổ sung hay không (trung vị, chế độ, độ lệch, kurtosis). Tôi có thể sống với một công cụ ước tính thiên vị, hoặc thậm chí một phương pháp làm ảnh hưởng đến độ chính xác ở một mức độ nhất định, miễn là bộ nhớ cần thiết để xử lý các giá trị N về cơ bản nhỏ hơn O (N).
Việc trỏ tôi đến thư viện thống kê hiện có cũng sẽ hữu ích nếu thư viện có các hàm tính toán một hoặc nhiều phép toán này "trực tuyến".