Ước tính trực tuyến các tứ phân vị mà không lưu trữ các quan sát


13

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).


Bạn đang tìm kiếm một bằng chứng cho thấy Q1 và Q2 hội tụ với các lượng tử thực khi số lượng ví dụ tăng theo cách tương tự như phân tích chuỗi markov trong các slide bạn liên kết? Về mặt triển khai, thuật toán trên có vẻ không hoàn hảo (tôi đã thử nghiệm các lượng tử gần đúng cho chuẩn thông thường trong R và thuật toán hoạt động tốt).
Theja

1
@Theja cảm ơn bạn, tôi không tìm kiếm một bằng chứng (quá nhiều công việc) mà chỉ là lời khuyên và ý kiến, Vấn đề chính tôi thấy là dựa trên tính toán về ước tính chạy trung bình, như whuber đã chỉ ra.
Louis Hugues

Câu trả lời:


3

Trung vị là điểm tại đó 1/2 quan sát rơi xuống dưới và 1/2 trên. Tương tự, perecentile thứ 25 là trung vị cho dữ liệu giữa min và median và phần trăm thứ 75 là trung vị giữa trung bình và max, vì vậy, tôi nghĩ rằng bạn đang ở trên nền tảng vững chắc áp dụng bất kỳ thuật toán trung bình nào bạn sử dụng trước tiên toàn bộ dữ liệu được đặt để phân vùng nó, và sau đó trên hai phần kết quả.

Cập nhật :

Câu hỏi này về stackoverflow dẫn đến bài báo này: Raj Jain, Imrich Chlamtac: Thuật toán P² để tính toán động lượng tử và biểu đồ mà không lưu trữ các quan sát. Cộng đồng. ACM 28 (10): 1076-1085 (1985) có bản tóm tắt cho thấy nó có thể rất được bạn quan tâm:

Một thuật toán heuristic được đề xuất cho tính toán động qf trung vị và các lượng tử khác. Các ước tính được tạo ra một cách linh hoạt khi các quan sát được tạo ra. Các quan sát không được lưu trữ; do đó, thuật toán có yêu cầu lưu trữ rất nhỏ và cố định bất kể số lượng quan sát. Điều này làm cho nó lý tưởng để thực hiện trong một chip lượng tử có thể được sử dụng trong các bộ điều khiển và máy ghi công nghiệp. Thuật toán được mở rộng hơn nữa để vẽ biểu đồ. Độ chính xác của thuật toán được phân tích.


4
Câu trả lời này bỏ qua hai điểm tinh tế, một điểm không quan trọng nhưng điểm còn lại có thể rất quan trọng. Một điều không quan trọng là kỹ thuật chia đôi tính toán bản lề trên và dưới có thể hơi khác so với trung vị, tùy thuộc vào kích thước mẫu. Điều quan trọng là sự phân chia kép dường như được dựa trên ước tính đang chạy của trung vị. Bất kỳ sự thay đổi nào giữa ước tính này và trung vị thực tế cũng sẽ khiến bản lề cũng thay đổi. Theo trực giác, đây không phải là một vấn đề vì lượng dữ liệu ngày càng lớn, nhưng nó là một vấn đề cần một số phân tích.
whuber

n1:32:21:1n

2
@Avraham, cảm ơn bạn đã chỉ ra bài báo, như tôi đã đề cập, tôi đã thử thuật toán P-vuông từ Chain và Chlamtac. trên dữ liệu của tôi, thiết lập thuật toán tôi đã giải mã cho kết quả tốt hơn (MSE) và nhanh hơn. Vì vậy, tôi đã đặt câu hỏi nếu nó có thể có một số vấn đề tuy nhiên. Như whuber nhận xét thực tế rằng nó sử dụng một ước tính đang chạy là một vấn đề tiềm năng; nhưng tôi không biết nó có thực sự quan trọng hay không.
Louis Hugues

Rất tiếc, đã thấy điều đó và quên nó. Lời xin lỗi của tôi.
Avraham

0

Một thay đổi rất nhỏ đối với phương pháp bạn đã đăng và bạn có thể tính toán bất kỳ tỷ lệ phần trăm tùy ý nào mà không phải tính toán tất cả các lượng tử. Đây là mã Python:

class RunningPercentile:
    def __init__(self, percentile=0.5, step=0.1):
        self.step = step
        self.step_up = 1.0 - percentile
        self.step_down = percentile
        self.x = None

    def push(self, observation):
        if self.x is None:
            self.x = observation
            return

        if self.x > observation:
            self.x -= self.step * self.step_up
        elif self.x < observation:
            self.x += self.step * self.step_down
        if abs(observation - self.x) < self.step:
            self.step /= 2.0

và một ví dụ:

import numpy as np
import matplotlib.pyplot as plt

distribution = np.random.normal
running_percentile = RunningPercentile(0.841)
observations = []
for _ in range(1000000):
    observation = distribution()
    running_percentile.push(observation)
    observations.append(observation)

plt.figure(figsize=(10, 3))
plt.hist(observations, bins=100)
plt.axvline(running_percentile.x, c='k')
plt.show()

Phân phối bình thường với phân vị 1 STD

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.