Linienglättungsalgorithmus, der die Datengleichmäßigkeit beibehält


7

Intro:

Ich arbeite mit einem riesigen Datensatz, den ich im Browser zeichnen muss, und da es bis zu 1 Million Punkte geben kann, war meine Idee, verschiedene Darstellungen für verschiedene Zoomstufen zu erstellen

Nehmen wir an, ich habe 100.000 Punkte, ich würde zwei mal zwei mitteln, bis ich 50.000 bekomme, dann würde ich das wiederholen, bis ich unter 500 Punkte komme (meine willkürliche Schwelle).

Auf der am meisten herausgezoomten Ebene würde ich alle 500 Punkte oder einen Teil davon zeichnen, abhängig von der Diagrammgröße, und beim Vergrößern würde ich zur nächsten Zoomstufe wechseln (und Daten streamen, wenn der Benutzer die Auswahl l / r zieht ), und wenn der Benutzer feinkörnige Details sehen möchte, kann er auf die Zoomstufe 0 zoomen und alle feinen Details sehen.

Ich habe diesen Prototyp tatsächlich erstellt und er funktioniert recht gut, abgesehen von einer Sache: Nebeneffekt davon ist, wie Sie sich vorstellen können, dass Spitzen in diesen Iterationen der Mittelwertbildung verloren gehen.

Ich habe einige Nachforschungen über den Douglas-Peucker-Algorithmus angestellt und herausgefunden, wie er Peaks beibehalten kann. Ich habe einige Tests durchgeführt und er funktioniert recht gut, aber das Problem dabei ist, dass er auf eine Reihe von Daten (y-Werte) stößt [1 , 1,1,1,5,6,1,1,1,1,1,1] es wird das zu etwas wie [1,6,1,1] glätten, was für mich nicht funktioniert, da ich muss Halten Sie das Verhältnis der Zoomstufen wie folgt

n (Länge der Originaldaten)> n / 2> n / 4> n / 8> .....

Ich habe einige Artikel über Linienglättung gelesen, aber alle Algorithmen, die ich gefunden habe, akzeptieren Entfernungsschwellenwerte, die sie zum Glätten als Parameter verwenden, und keiner von ihnen kann die Anzahl der gewünschten Ausgabeelemente akzeptieren, und auch, da ihr Ziel darin besteht, zu glätten In der Zeile transformieren sie eine Sequenz wie diese (y-Werte) [1,1,1,1,1,1,1,1,1,1] in [1,1].

Also endlich meine Frage:

Gibt es einen Algorithmus, der:

  • Anstelle der üblichen Abstandsschwelle wird die gewünschte Anzahl von Ausgabeelementen akzeptiert
  • versucht Spitzen zu erhalten (wie Douglas-Peucker)
  • glättet Daten gleichmäßig, selbst wenn es (y-Werte) [1,1,1,1,1,1] erhält und ich sage, ich möchte 3 Ausgänge, Ereignis, wenn es theoretisch korrekt ist, als [1,1] zu glätten. Ich müsste stattdessen [1,1,1] bekommen

Bitte lassen Sie sich auch nicht durch fehlende Informationen zur X-Achse verwirren, da dies irrelevant ist, da alle Daten in Schritten von 1 von 1 bis n gemessen werden und daher keine N / A-Werte oder Leerstellen oder Werte wie [1.3 1,4,3]

x ist immer [1,2,3 .... n]


Dies klingt sehr nach einer Anwendung der Selbstähnlichkeit (wie sie beispielsweise bei Fraktalen zu sehen ist), bei der Sie die entsprechenden Gleichungen und Algorithmen basierend auf dem vollständigen Datensatz oder der möglicherweise einfacheren Beibehaltung von Merkmalen programmgesteuert bestimmen müssten Bildskalierungsalgorithmen ...
Richard Arnold Mead

Nur eine Kuriosität: Haben Sie den trivialen Algorithmus ausprobiert (kein Durchschnitt, keine Glättung)? Wenn Sie sich auf der Zoomout-Ebene , möchten Sie die ursprünglichen Punkte nur mit Punkten darstellen. Erzeugen Sie dann die Werte, indem Sie nur die Min- und Max-Werte jedes einzelnen Intervalls mit . Reduzieren Sie beispielsweise bei Zoomstufe 1 die Punkte [1 2 6 9 2 2 3 5] auf [1 9 2 5] (1,9 sind die Min / Max der ersten 4 Punkte, 2,5 sind die Min / Max von die zweiten 4 Punkte). znm=n/2zm[i2n/m,(i+1)2n/m)i=0,...,m/21
Vor dem

Antworten:


1

Hier sind zwei Vorschläge, die Sie ausprobieren sollten.

Vorschlag 1: Verwenden Sie einen linearen Filter. Anstatt den Durchschnitt berechnen, versuchen Sie, über eine größere Sequenz zu , z. B. .x2n,x2n+1(x2n+x2n+1)/2yn=(x2n1+2x2n+2x2n+1+x2n+2)/6

Vorschlag 2: Verwenden Sie einen bedingten Filter: Wenn oder , lassen Sie bzw. und ähnlich für lokale Minima; Verwenden Sie andernfalls den Durchschnitt (oder einen linearen Filter) wie zuvor.x2n<x2n+1>x2n+2x2n1<x2n>x2n+1y=x2n+1y=x2n


Ihre Notation " ( )" ist unklar. y=x2n+1y=x2n
James Waldby - jwpat7
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.