관측 값을 저장하지 않고 사 분위수의 온라인 추정


13

관측 값을 저장하지 않고 많은 데이터 세트에서 사 분위수 (Q1, 중앙값 및 Q3)를 실시간으로 계산해야합니다. 나는 먼저 P 제곱 알고리즘 (Jain / Chlamtac)을 시도했지만 그것에 만족하지 못했습니다 (약간의 CPU 사용량과 적어도 내 데이터 세트의 정밀도에 대해서는 확신하지 못했습니다).

나는 즉시 중간 값을 추정하기 위해 FAME 알고리즘 ( Feldman / Shavitt )을 사용하고 Q1과 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

다시 시작하기 위해, 간단히 얻은 중간 값 M을 사용하여 데이터 세트를 2 개로 나누고 Q1과 Q3에 동일한 알고리즘을 재사용합니다.

이것은 어떻게 든 작동하는 것처럼 보이지만 나는 증명할 수 없습니다 (수학자가 아닙니다). 그것은 엷은가? 문제에 맞는 제안이나 다른 기술이 있으면 감사하겠습니다.

당신의 도움을 주셔서 대단히 감사합니다 !

==== 편집 =====

그러한 질문에 관심이있는 사람들을 위해, 몇 주 후에 마침내 100 값의 잔향과 함께 저수지 샘플링을 사용하여 매우 만족스러운 결과를 얻었습니다 (나에게).


연결 한 슬라이드의 마르코프 체인 분석과 유사한 방식으로 예제 수가 증가함에 따라 Q1과 Q2가 실제 Quantile에 수렴한다는 증거를 찾고 있습니까? 구현 측면에서 위의 알고리즘은 결함이없는 것으로 보입니다 (R에서 표준 정규에 대한 근사 수량을 테스트했으며 알고리즘이 올바르게 작동합니다).
Theja

1
@ Theja는 당신에게 증거를 찾고 있지는 않지만 조언과 의견만을 찾고 있습니다. 주요 문제는 whuber가 지적한 것처럼 중앙값의 추정치를 계산하는 것입니다.
Louis Hugues 2016 년

답변:


3

중앙값은 관측치의 1/2이 관측치의 1/2 이하로 떨어지는 지점입니다. 마찬가지로, 25 번째 백분위 수는 최소값과 중간 값 사이의 데이터에 대한 중앙값이고 75 번째 백분위 수는 중간 값과 최대 값 사이의 중간 값이므로 예, 처음 사용하는 중간 알고리즘을 적용하면 확실하게 시작됩니다 전체 데이터 세트를 분할 한 다음 두 개의 결과 조각으로 분할합니다.

업데이트 :

Stackoverflow 에 관한 이 질문Raj Jain, Imrich Chlamtac : 저장 관찰없이 양자점 및 히스토그램의 동적 계산을위한 P² 알고리즘입니다. 코뮌. ACM 28 (10) : 1076-1085 (1985) 의 초록은 아마도 당신에게 큰 관심을 보일 것입니다 :

휴리스틱 알고리즘은 중앙값과 다른 Quantile의 동적 계산을 위해 제안됩니다. 관측치가 생성 될 때 추정치는 동적으로 생성됩니다. 관측치는 저장되지 않습니다. 따라서 알고리즘은 관측 횟수에 관계없이 매우 작고 고정 된 저장 요구 사항을 갖습니다. 따라서 산업용 컨트롤러 및 레코더에 사용할 수있는 Quantile 칩으로 구현하는 데 이상적입니다. 알고리즘은 히스토그램 플로팅으로 확장됩니다. 알고리즘의 정확성이 분석됩니다.


4
이 답변은 두 가지 미묘한 점을 간과합니다. 하나는 중요하지 않지만 다른 하나는 매우 중요합니다. 중요하지 않은 것은 이중 분할 기술이 샘플 크기에 따라 중앙값과 약간 다를 수 있는 상단 및 하단 힌지 를 계산한다는 것 입니다. 중요한 것은 이중 분할이 중앙값 의 실행 추정치 를 기반으로하는 것 같습니다 . 이 추정치와 실제 중앙값 사이의 차이로 인해 경첩도 달라집니다. 직관적으로, 이것은 데이터의 양이 증가함에 따라 문제가되지 않지만 분석이 필요한 문제입니다.
whuber

n1:32:21:1n

2
@Avraham, 나는 이미 Chain과 Chlamtac에서 P-square 알고리즘을 시도했다고 언급했듯이 논문을 지적 해 주셔서 감사합니다. 내 데이터 세트에서 내가 언급 한 알고리즘은 더 나은 결과 (MSE)를 제공하고 더 빠릅니다. 그럼에도 불구하고 나는 그것이 어떤 문제를 일으킬 수 있는지 의문을 제기했다. whuber가 말한 것처럼 실행 추정치를 사용한다는 것은 잠재적 인 문제입니다. 그러나 나는 그것이 정말로 중요한지 아닌지 모른다.
Louis Hugues 2016 년

으악, 그것을보고 잊었다. 사과드립니다.
Avraham 2016 년

0

게시 한 방법이 약간 변경되어 모든 Quantile을 계산하지 않고도 임의의 백분위 수를 계산할 수 있습니다. 파이썬 코드는 다음과 같습니다.

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

그리고 예 :

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

STD 백분위 수가 1 인 정규 분포

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.