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. wie 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.
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;
});
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
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