Monday 30 January 2017

Rekursiv Gleitender Mittelwert Algorithmus

Der Hauptfehler in Ihrem Programm ist, dass die rekursive Berechnung falsch ist. Um den Durchschnitt zu berechnen, müssen Sie die Summe aus dem aktuellen Wert und den verbleibenden Werten erhalten. Dann teilen Sie diese Summe durch die Anzahl der Werte. Die Anzahl der Werte ist num. Der aktuelle Wert ist, was calculatenumber () zurückgibt. Die Summe der verbleibenden Werte ist num-1 multipliziert mit dem Mittelwert der verbleibenden Werte. Der Mittelwert der verbleibenden Werte wird durch einen rekursiven Aufruf von average () berechnet. So schreiben wir folgendes: Ein komplettes Programm, das diese Funktion verwendet, könnte so aussehen: Beachten Sie, dass dies kein sehr guter Weg ist, um den Durchschnitt zu berechnen, da Sie die Genauigkeit jedes Mal verlieren, wenn Sie die aktuelle Summe durch num dividieren. Wenn dieser Durchschnitt wieder multipliziert wird, wenn der rekursive Aufruf zurückkehrt, werden die signifikanten Stellen, die Sie in der Abteilung verloren haben, nicht wiederhergestellt. Sie zerstören Informationen, indem Sie die Summe dividieren und dann multiplizieren. Für mehr Präzision, würden Sie wollen, um die Summe zu halten, wie Sie durch die Elemente gehen, dann teilen sich am Ende. Ein weiterer Punkt zu betrachten ist, was durch einen gleitenden Durchschnitt gemeint ist. Was wir oben implementiert haben, ist kein gleitender Durchschnitt, sondern ein fester Durchschnitt. Es ist der Durchschnitt eines festen Fensters von Elementen. Wenn Sie das Fenster um eine Position verschieben, müssen Sie alles von vorne beginnen und die Summe erneut berechnen. Der richtige Weg, um ein bewegliches Fenster zu implementieren ist, alle Elemente im Fenster zu verfolgen. Wenn Sie das Fenster um eine Position nach rechts verschieben, entfernen Sie das am weitesten links liegende Element aus dem Fenster und subtrahieren dessen Wert aus der Summe und fügen dann das neue Element zum Fenster hinzu und addieren dessen Wert zur Summe. Das macht es eine bewegliche Summe. Das Teilen der beweglichen Summe durch die Anzahl der Elemente gibt Ihnen den gleitenden Durchschnitt. Die natürliche Weise, ein sich bewegendes Fenster zu implementieren, ist mit einer Warteschlange, weil Sie dem Kopf neue Elemente hinzufügen und alte Elemente aus dem Schwanz entfernen können. Ich möchte einen iterativen Algorithmus, der gewichtete Durchschnitt berechnet implementieren. Das spezifische Gewicht Gesetz spielt keine Rolle, aber es sollte in der Nähe von 1 für die neuesten Werte und in der Nähe von 0 zu den ältesten. Der Algorithmus sollte iterativ sein. D. h. es sollte sich nicht an alle vorherigen Werte erinnern. Es sollte nur einen neuesten Wert und alle aggregativen Informationen über Vergangenheit, wie vorherige Werte der durchschnittlichen, Summen, Zählimpulse usw. wissen. Zum Beispiel kann der folgende Algorithmus sein: Es gibt exponentielle abnehmende Gewicht, das nicht gut sein kann. Ist es möglich, Schritt abnehmende Gewicht oder etwas Die Anforderungen für das Wiegen Gesetz ist folgende: 1) Das Gewicht sinkt in die Vergangenheit 2) Ich habe einige mittlere oder charakteristische Dauer, so dass Werte älter diese Dauer viel weniger wichtig als neuere 3) I Sollte in der Lage, diese Dauer Ich brauche die folgenden. Angenommen, vi sind Werte, wobei v1 die erste ist. Nehmen wir auch an, dass wi Gewichte sind. Aber w0 ist das letzte. Also, nach dem ersten Wert kam ich erstmal nach dem zweiten Wert v2 kam, hätte ich durchschnittlich Beim nächsten Wert sollte ich beachten, dass sich das Gewichtsprofil mit mir bewegt, während ich mich entlang der Wertsequenz befinde. D. h. Jeder Wert hat nicht sein eigenes Gewicht die ganze Zeit. Mein Ziel ist es, dieses Gewicht zu senken, während Sie Vergangenheit. Gt Aber meine Aufgabe ist es, durchschnittlich neu berechnet jedes Mal neue Wert kommt mit alten Werten wiedergewichtet. OP Ihre Aufgabe ist fast immer unmöglich, auch bei außergewöhnlich einfachen Gewichtungsregelungen. Sie fragen, mit O (1) Speicher, Ertragsdurchschnitte mit einem sich ändernden Gewichtungsschema. Zum Beispiel, wenn neue Werte übergeben werden, für eine nahezu beliebig wechselnde Gewichtsfolge. Dies ist aufgrund der Injektivität unmöglich. Sobald Sie zusammen die Zahlen zusammen, verlieren Sie eine riesige Menge an Informationen. Zum Beispiel, auch wenn Sie die Gewicht-Vektor hatte. Können Sie den ursprünglichen Wertvektor nicht wiederherstellen oder umgekehrt. Es gibt nur zwei Fälle, die ich denken kann, wo Sie weg mit diesem erhalten konnten: Konstante Gewichte wie 2,2,2. 2: Dies ist äquivalent zu einer Online-Algebra, die Sie nicht wollen, weil die alten Werte nicht wiedergewichtet werden. Die relativen Gewichte der vorherigen Antworten ändern sich nicht. Zum Beispiel könnten Sie Gewichte von 8,4,2,1 zu tun. Und fügen Sie in ein neues Element mit beliebigem Gewicht wie. 1. aber Sie müssen alle vorherigen um den gleichen multiplikativen Faktor, wie 16,8,4,21 erhöhen. So fügen Sie bei jedem Schritt ein neues willkürliches Gewicht und eine neue willkürliche Neuskalierung der Vergangenheit hinzu, sodass Sie 2 Freiheitsgrade haben (nur 1, wenn Sie Ihr Dot-Produkt normalisieren müssen). Die Gewicht-Vektoren youd erhalten würde aussehen: So jede Gewichtung Schema können Sie sehen, wie das funktioniert (es sei denn, Sie müssen die Sache normalisiert durch die Summe der Gewichte zu halten, in diesem Fall müssen Sie dann teilen den neuen Durchschnitt durch die neue Summe, die Sie berechnen können, indem Sie nur O (1) Speicher behalten). Multiplizieren Sie einfach den vorherigen Durchschnitt mit den neuen s (die sich implizit über das Punktprodukt in die Gewichte verteilen) und tack auf den neuen wnewValue. Antwort # 1 am: April 22, 2011, 09:31:01 pm »Hier Im Angenommen, Sie wollen, dass die Gewichte zu 1 zu summieren. Solange Sie ein relatives Gewicht erzeugen können, ohne es in der Zukunft ändern, können Sie am Ende mit einer Lösung, die dieses Verhalten imitiert. Das heißt, Sie haben Ihre Gewichte als Sequenz definiert und die Eingabe als Sequenz definiert. Betrachten Sie die Form: sum (s0i0 s1i1 s2i2 snin) sum (s0 s1 s2 sn). Beachten Sie, dass es trivial möglich ist, dies inkrementell mit ein paar Aggregationszähler zu berechnen: Natürlich berechnet calculateWeightFromCounter () in diesem Fall nicht Gewichte, die Summe zu eins - der Trick hier ist, dass wir durch Division durch die Summe der Gewichte So daß letztlich die Gewichte praktisch zusammenfallen. Der eigentliche Trick ist, wie Sie berechnenWeightFromCounter (). Sie könnten einfach zurückkehren, zum Beispiel, aber beachten Sie, dass die letzte gewichtete Zahl nicht in der Nähe der Summe der Zähler unbedingt, so dass Sie möglicherweise nicht am Ende mit den genauen Eigenschaften, die Sie wollen. (Sein schwer zu sagen, da, wie erwähnt, haben Sie ein ziemlich offenes Problem verlassen.) Das Problem ist, dass Gewichte mit jedem neuen Wert ändern. In Ihrem Fall sind sie nicht. Ndash Suzan Cioc Die tatsächlichen verwendeten Gewichte ändern sich mit jedem neuen Wert - die quotweightsquot werden durch eine sukzessive größere Zahl geteilt, wodurch die Durchsetzung, dass die tatsächlichen verwendeten Gewichte immer auf 1. ndash Kaganar Mar 29 12 Um 14:45 Dies ist zu lang, um in einem Kommentar posten, aber es kann nützlich sein, zu wissen. Angenommen, Sie haben: w0vn. Wnv0 (nennen wir diese w0..nvn..0 kurz) Dann ist der nächste Schritt: w0vn1. Wn1v0 (und dies ist w0..n1vn1..0 für kurze) Dies bedeutet, dass wir einen Weg brauchen, um w1..n1vn..0 aus w0..nvn..0 zu berechnen. Es ist sicher möglich, daß vn.0 0. 0, z, 0. 0 ist, wobei z an einer Stelle x ist. Wenn wir keine zusätzliche Speicherung haben, dann ist f (zw (x)) zw (x 1) wobei w (x) das Gewicht für die Stelle x ist. Umordnen der Gleichung w (x 1) f (zw (x)) z. Nun ist w (x 1) besser konstant für eine Konstante x, also ist f (zw (x)) z besser konstant. Damit kann f z fortpflanzen - dh f (zw (x)) zf (w (x)). Aber hier haben wir wieder ein Problem. Beachten Sie, dass wenn z (was eine beliebige Zahl sein könnte) durch f ausbreiten kann. Dann kann w (x) sicherlich. Also ist f (zw (x)) w (x) f (z). Somit ist f (w (x)) w (x) f (z). Aber für eine konstante x. W (x) konstant ist und somit auch f (w (x)) besser konstant ist. W (x) konstant ist, so daß f (z) konstanter ist, so daß w (x) f (z) konstant ist. Somit ist f (w (x)) w (x) c, wobei c eine Konstante ist. Also, f (x) cx wobei c eine Konstante ist, wenn x ein Gewichtswert ist. Das heißt, jedes Gewicht ist ein Vielfaches des vorherigen. Somit nehmen die Gewichte die Form w (x) mbx an. Beachten Sie, dass dies davon ausgeht, dass die einzige Information, die f ist, der letzte aggregierte Wert ist. Beachten Sie, dass an einem gewissen Punkt werden Sie auf diesen Fall reduziert werden, wenn Sie nicht bereit sind, eine nicht konstante Menge an Daten, die Ihre Eingabe zu speichern. Sie können nicht einen unendlichen Längenvektor der reellen Zahlen mit einer reellen Zahl darstellen, aber Sie können sie irgendwie in einer konstanten, endlichen Menge an Speicherung annähern. Aber das wäre nur eine Annäherung. Obwohl ich havent rigoros bewiesen, es ist meine Schlussfolgerung, dass, was Sie wollen, ist unmöglich, mit einem hohen Grad an Präzision zu tun, aber Sie können in der Lage, log (n) Raum (die auch O (1) für viele sein kann Praktische Anwendungen), um eine Qualitätsnäherung zu erzeugen. Sie können sogar noch weniger verwenden. Ich habe versucht, praktisch Code etwas (in Java). Wie gesagt, Ihr Ziel ist nicht erreichbar. Sie können nur den Durchschnitt aus einer Anzahl von zuletzt gespeicherten Werten zählen. Wenn Sie nicht genau sein müssen, können Sie die älteren Werte approximieren. Ich habe versucht, es durch die Erinnerung an die letzten 5 Werte genau und ältere Werte nur SUMmed durch 5 Werte, die Erinnerung an die letzten 5 SUMs. Dann ist die Komplexität O (2n) zum Speichern der letzten nnn Werte. Dies ist eine sehr grobe Annäherung. Sie können die Arraygrößen lastValues ​​und lasAggregatedSums beliebig ändern. Sehen Sie dieses Ascii-Kunstbild, das versucht, ein Diagramm der letzten Werte anzuzeigen, das zeigt, dass die ersten Spalten (ältere Daten) als aggregierter Wert (nicht einzeln) gespeichert werden und nur die frühesten 5 Werte einzeln gespeichert werden. Herausforderung 1. Mein Beispiel zählt nicht Gewichte, aber ich denke, es sollte kein Problem für Sie, Gewichte für die lastAggregatedSums angemessen hinzufügen - das einzige Problem ist, dass, wenn Sie niedrigere Gewichte für ältere Werte wollen, wäre es schwieriger, weil das Array dreht, so ist Es ist nicht einfach zu wissen, welches Gewicht für welche Array-Mitglied. Vielleicht können Sie den Algorithmus ändern, um immer verschieben Werte im Array anstatt zu drehen Dann Hinzufügen von Gewichten sollte kein Problem sein. Herausforderung 2. Die Arrays werden mit 0 Werten initialisiert, und diese Werte zählen bis zum Mittelwert von Anfang an, auch wenn wir nicht genug Werte erhalten. Wenn Sie den Algorithmus für lange Zeit laufen, werden Sie wahrscheinlich nicht stören, dass es das Lernen für einige Zeit am Anfang. Wenn Sie dies tun, können Sie eine Änderung -) beantwortet Jan 21 14 um 15:59 Ihre Antwort 2016 Stack Exchange, Inc


No comments:

Post a Comment