Der P2-Algorithmus ist ein guter Fund. Dabei werden mehrere Schätzungen des Quantils vorgenommen, diese regelmäßig aktualisiert und das Quantil mithilfe einer quadratischen (nicht linearen, nicht kubischen) Interpolation geschätzt. Die Autoren behaupten, dass die quadratische Interpolation in den Schwänzen besser funktioniert als die lineare Interpolation, und Kubik würde zu wählerisch und schwierig werden.
Sie geben nicht genau an, wie dieser Ansatz für Ihre "schwerfälligen" Daten fehlschlägt, aber es ist leicht zu erraten: Schätzungen extremer Quantile für schwerfällige Verteilungen werden instabil, bis eine große Menge von Daten erfasst wird. Dies wird jedoch (in geringerem Maße) ein Problem sein, selbst wenn Sie alle Daten speichern würden. Erwarten Sie also keine Wunder!
Setzen Sie auf jeden Fall Hilfsmarker - nennen wir sie und x 6 -, in denen Sie sich sicher sind, dass das Quantil liegt, und speichern Sie alle Daten, die zwischen x 0 und x 6 liegen . Wenn Ihr Puffer voll ist, müssen Sie diese Marker aktualisieren und dabei immer x 0 ≤ x 6 beibehalten . Ein einfacher Algorithmus, um dies zu tun, kann aus einer Kombination von (a) der aktuellen P2-Schätzung des Quantils und (b) gespeicherten Zählwerten der Anzahl von Daten kleiner als x 0 und der Anzahl von Daten größer als x 6 entwickelt werdenx0x6x0x6x0≤x6x0x6. Auf diese Weise können Sie das Quantil mit hoher Sicherheit genau so gut schätzen, als ob Sie den gesamten Datensatz immer zur Verfügung hätten, aber Sie benötigen nur einen relativ kleinen Puffer.
Insbesondere schlage ich eine Datenstruktur , um Teilinformationen über eine Folge von n Datenwerten x 1 , x 2 , ... , x n aufrechtzuerhalten . Hier ist y eine verknüpfte Liste(k,y,n)nx1,x2,…,xny
y=(x(n)[k+1]≤x(n)[k+2]≤⋯≤x(n)[k+m]).
In dieser Notation bezeichnet den i - kleinsten der bisher gelesenen n x -Werte. m ist eine Konstante, die Größe des Puffers y .x(n)[i]ithn xmy
Der Algorithmus beginnt damit, dass mit den ersten m gefundenen Datenwerten gefüllt und in die kleinste bis größte sortierte Reihenfolge gebracht wird. Sei q das zu schätzende Quantil; zB q = 0,99. Beim Lesen von x n + 1 gibt es drei mögliche Aktionen:ymqqxn+1
Wenn , Inkrement k .xn+1<x(n)[k+1]k
Wenn , nichts zu tun.xn+1>x(n)[k+m]
Andernfalls fügen Sie in y ein .xn+1y
In jedem Fall erhöhen Sie .n
Die Einfügeprozedur setzt in sortierter Reihenfolge in y und eliminiert dann einen der Extremwerte in y :xn+1yy
Wenn , dann entferne x ( n ) [ k + 1 ] von y und erhöhe k ;k+m/2<nqx(n)[k+1]yk
Ansonsten entferne von y .x(n)[k+m]y
Vorausgesetzt, ist ausreichend groß, wird diese Prozedur das wahre Quantil der Verteilung mit hoher Wahrscheinlichkeit einklammern. In jedem Stadium n kann es auf die übliche Weise in Bezug auf x ( n ) [ [ q n n ] und x ( n ) [ ⌈ q n ⌉ ] geschätzt werden , die wahrscheinlich in y liegen werden . (Ich glaube, m muss nur wie die Quadratwurzel der maximalen Datenmenge skalieren ( Nmnx(n)[⌊qn⌋]x(n)[⌈qn⌉]ymN), aber ich habe keine strenge Analyse durchgeführt, um dies zu beweisen.) In jedem Fall wird der Algorithmus feststellen, ob er erfolgreich war (durch Vergleichen von und ( k + m ) / n mit q ).k/n(k+m)/nq
Testen mit bis zu 100.000 Werten mit undq=0,5(der schwierigste Fall) zeigen an, dass dieser Algorithmus eine 99,5% ige Erfolgsrate beim Erhalten des korrekten Werts von x ( n ) [ ⌊ q n ⌋ ] aufweist . Für einen Strom vonN=10 12 Werten würde dies einen Puffer von nur zwei Millionen erfordern (drei oder vier Millionen wären jedoch die bessere Wahl). Die Verwendung einer sortierten doppelt verknüpften Liste für den Puffer erfordertO(log( √m=2N−−√q=.5x(n)[⌊qn⌋]N=1012=O(log(N))Aufwand beim Erkennen und Löschen des Maximums oder Minimums sindO(1)Operationen. Das relativ teure Einfügen muss typischerweise nur mitO( √ erfolgenO(log(N−−√))O(log(N))O(1)mal. Somit betragen die Berechnungskosten dieses AlgorithmusO(N+ √O(N−−√)in der Zeit undO( √O(N+N−−√log(N))=O(N)eingelagert.O(N−−√)