Preciso calcular quartis (Q1, mediana e Q3) em tempo real em um grande conjunto de dados sem armazenar as observações. Tentei pela primeira vez o algoritmo do quadrado P (Jain / Chlamtac), mas não estava satisfeito com ele (um pouco de uso da CPU e não estava convencido pela precisão, pelo menos no meu conjunto de dados).
Eu uso agora o algoritmo FAME ( Feldman / Shavitt ) para estimar a mediana em tempo real e tento derivar o algoritmo para calcular também Q1 e 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
Para retomar, ele simplesmente usa a mediana M obtida em tempo real para dividir o conjunto de dados em dois e, em seguida, reutilizar o mesmo algoritmo para Q1 e Q3.
Isso parece funcionar de alguma forma, mas não sou capaz de demonstrar (não sou matemático). É falho? Gostaria de receber qualquer sugestão ou eventual outra técnica adequada ao problema.
Muito obrigado pela sua ajuda!
==== EDIT =====
Para aqueles que estão interessados em tais perguntas, depois de algumas semanas, finalmente acabei usando a Amostragem de Reservatório com um revervoir de 100 valores e deu resultados muito satististas (para mim).
Respostas:
A mediana é o ponto em que 1/2 das observações caem abaixo e 1/2 acima. Da mesma forma, o 25º perecentil é a mediana dos dados entre o mínimo e a mediana, e o 75º percentil é a mediana entre o mediano e o máximo, então sim, acho que você está em um terreno sólido, aplicando qualquer algoritmo de mediana usado primeiro o conjunto de dados inteiro para particioná-lo e, em seguida, nas duas partes resultantes.
Atualização :
Esta pergunta sobre o fluxo de pilha leva a este artigo: Raj Jain, Imrich Chlamtac: O algoritmo P² para cálculo dinâmico de quantiis e histogramas sem armazenar observações. Comum. ACM 28 (10): 1076-1085 (1985), cujo resumo indica que provavelmente é de grande interesse para você:
fonte
Uma alteração muito pequena no método que você postou e você pode calcular qualquer percentil arbitrário, sem precisar calcular todos os quantis. Aqui está o código Python:
e um exemplo:
fonte