2016-08-20 5 views
1

Ich bin mir nicht sicher, ob das der richtige Begriff ist, aber ich denke, ich möchte s'm̶o̶o̶t̶h̶ ̶a̶n̶d̶/̶o̶r̶ einen Datensatz approximieren. Ich habe 30 Datenpunkte, wie es in der Tabelle unten dargestellt ist (die rote Linie mit Punkten). Ich möchte den Datensatz annähern, damit er mit weniger Datenpunkten beschrieben werden kann. Die schwarze Linie repräsentiert, was ich erreichen möchte. chart1wie Zeitreihendaten zu schätzen

Ich möchte in der Lage sein, eine Approximationsebene zu definieren, die steuert, wie stark das Ergebnis von dem ursprünglichen Datensatz abweichen wird. Der approximierte Datensatz sollte eine Reihe von Datenpunkten enthalten, die ich über gerade Linien verbinden kann.

Was ist der richtige Algorithmus oder eine mathematische Funktion, um dieses Problem zu lösen? Ich erwarte hier keine Umsetzung, sondern einige Vorschläge, wo ich anfangen soll.

Ich schrieb meine Implementierung des Approximationsalgorithmus. Es funktioniert in den meisten Fällen, aber es gibt bestimmte Situationen, in denen es nicht optimale Daten zurückgibt. Das folgende Beispiel zeigt drei gepunktete Linien. Die dünne rote Linie ist der ursprüngliche Datensatz, eine dicke rot-schwarze gepunktete Linie wird von meinem Algorithmus erzeugt, die grüne Linie ist das, was ich erreichen möchte.

my implementation

 var previousValue; 
     return array.map(function (dataPoint, index, fullArray) { 
      var approximation = dataPoint; 

      if (index > 0) { 
       if (Math.abs(previousValue - value) < tolerance) { 
        approximation = previousValue; 
       } else { 
        previousValue = dataPoint; 
       } 

      } else { 
       previousValue = dataPoint; 
      } 

      return approximation; 
     }); 
+0

Haben Sie etwas versucht? Ich bezweifle, dass es einen Standardalgorithmus gibt, der zu Ihrer schwarzen Linie passt, da Ihre x-Achsenpunkte nicht gleichmäßig verteilt sind. Betrachten wir ein „moving average“ unter Verwendung der Daten zu glätten und dann alle n Punkte holen, die Anzahl von Punkten zu reduzieren. – bhspencer

+0

Sache zu vereinfachen, nehmen wir an, dass die Punkte auf der x-Achse auf die roten Punkte ausgerichtet sind, aber es ist weniger von ihnen. Ich habe meinen eigenen Algorithmus geschrieben, um die Approximation durchzuführen, die im Grunde von links nach rechts verläuft und alle Punkte ignoriert, die innerhalb einer bestimmten Toleranz liegen. Wenn ein Wert den Toleranzwert überschreitet, wird ein neuer Datenpunkt erstellt und als neue Vergleichsbasis festgelegt. Der Algo funktioniert ok, aber es gibt Fälle, in denen es nicht perfekt ist. Das ist, warum ich gefragt werde, ob es eine generische Lösung ist also muss ich das Rad nicht neu erfinden. Ich habe oben Beispielausgänge meines Algo hinzugefügt. – maestr0

Antwort

1

Es gibt zwei Möglichkeiten:

  1. wenn das Register "Glitch" in den Daten von Bedeutung ist, was bedeutet, dass Sie es nicht glätten.
  2. wenn alle gezeigten Daten angenähert werden kann und die „Glitch“ ist unbedeutend

In (1) Fall können Sie durch Vorlagen ungefähre betrachten (zB Wavelet) oder Grunddifferentialanalyse verwenden zu erfassen und zu halten das " Glitch "(zB Meshes). In (2) Fall, können Sie MA, ARIMA verwenden, wo die "Glitch" weiter durch die Wurzeln analysiert werden kann

1

Okay, Punkt der Klarstellung, suchen Sie, um die Daten zu glätten oder annähern? Wenn Sie die Daten glätten wollen, werden die kleinen Unebenheiten und Vertiefungen in den Datenreihen per definitionem entfernt. Auf der anderen Seite, wenn das Ziel ist, alle diese Dips und Beulen genau darzustellen, dann wollen Sie nicht glätten. Ich werde über das Glätten sprechen, du sagst mir, ob du das andere willst.

Okay, der beste Weg, um Daten zu glätten, ist die Verwendung eines Alpha-Wertes. Die Gleichung ist T n + 1 = (1- α) T n + α Daten n + 1. Dies bedeutet, dass Sie den Teil des nächsten Funktionspunkts festlegen, der von Ihrem Serienverlauf betroffen ist, und den Teil, der vom aktuellen Datenpunkt betroffen ist.

Example graph with alpha = .5 Werfen Sie einen Blick auf diese Daten. Hier die α = .5. Also die Funktion entspricht den Daten, aber nicht viel. Der folgende ist der gleiche, aber der Alpha ist .25. So werden die Daten noch weniger befolgt, aber die Funktion ist viel flüssiger. Es gibt auch eine dritte Option, bei der α mit der Zeit abnimmt. Am Anfang kann es sehr hoch sein, so dass Sie schnell die Daten verfolgen, aber dann, wenn α mit der Zeit abnimmt, wird der Trend glatter und bleibt im Laufe der Zeit glatt. Schließlich können Sie eine harte Grenze für das Minimum setzen α Dies wird sicherstellen, dass Sie immer eine minimale Reaktionszeit auf die Daten haben werden.

Example graph with alpha = .25

+0

ok, danke für deine Erklärung. Es hat mir geholfen zu verstehen, dass das, was ich wirklich brauche, eine Annäherung ist. Im Wesentlichen möchte ich die Anzahl der Datenpunkte reduzieren und so nahe wie möglich an der ursprünglichen Form des Diagramms bleiben. Mein erstes Diagramm zeigt die Annäherung des roten Datensatzes als schwarze Linie. Ich brauche nur 5 Punkte um diese Linie zu beschreiben (inklusive Start- und Endpunkte) – maestr0