Ich möchte einen iterativen Algorithmus implementieren, der den gewichteten Durchschnitt berechnet. 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 irgendwelche aggregative Informationen über Vergangenheit, wie vorherige Werte des Durchschnitts, Summen, Zählungen etc. wissen. Zum Beispiel kann der folgende Algorithmus sein: Es wird exponentiell abnehmende Gewicht geben, was nicht gut sein kann. Ist es möglich, Schritt abnehmende Gewicht oder etwas zu haben Die Voraussetzungen für das Wiegen des Gesetzes sind: 1) Das Gewicht verringert sich in die Vergangenheit 2) Ich habe eine mittlere oder charakteristische Dauer, so dass Werte älter diese Dauer ist viel weniger als neuere 3) I Sollte in der Lage sein, diese Dauer zu setzen, brauche ich folgendes. Angenommen, vi sind Werte, wobei v1 die erste ist. Angenommen, wi sind Gewichte. Aber wO ist das LETZTE. Also, nach dem ersten Wert kam ich den ersten Durchschnitt Nachdem der zweite Wert v2 kam, hätte ich durchschnittlich Mit dem nächsten Wert sollte ich beachten, dass das Gewichtsprofil sich mit mir bewegt, während ich die Wertfolge verschiebe. I. e. Jeder Wert hat nicht sein eigenes Gewicht die ganze Zeit. Mein Ziel ist es, dieses Gewicht zu senken, während es vorbei geht. Gt Aber meine Aufgabe ist es, den Durchschnitt neu berechnet zu haben, jedes Mal, wenn neuer Wert mit alten Werten wieder aufgenommen wird. OP Ihre Aufgabe ist fast immer unmöglich, auch mit außergewöhnlich einfachen Gewichtungsschemata. Sie bitten, mit O (1) Speicher, Ertragsdurchschnitte mit einem sich ändernden Gewichtungsschema. Zum Beispiel, da neue Werte eingegangen werden, für einige fast willkürlich ändernde Gewichtsfolge. Dies ist aufgrund der Injektivität unmöglich. Sobald Sie die Zahlen zusammen verschmelzen, verlieren Sie eine riesige Menge an Informationen. Zum Beispiel, auch wenn Sie das Gewicht Vektor hatte. Sie konnten den ursprünglichen Wertvektor nicht wiederherstellen, oder umgekehrt. Es gibt nur zwei Fälle, an die ich denken kann, wo man damit weitermachen könnte: Konstante Gewichte wie 2,2,2. 2: Dies entspricht einem Online-Mittelungsalgorithmus, den Sie nicht wollen, weil die alten Werte nicht neu aufgezeichnet werden. Die relativen Gewichte der vorherigen Antworten ändern sich nicht. Zum Beispiel könnten Sie Gewichte von 8,4,2,1 machen. Und füge ein neues Element mit beliebigem Gewicht hinzu. 1. aber du musst alle vorherigen durch den gleichen multiplikativen Faktor wie 16,8,4,21 erhöhen. So fügen Sie bei jedem Schritt ein neues willkürliches Gewicht hinzu und eine neue willkürliche Reskalierung der Vergangenheit, so dass Sie 2 Freiheitsgrade haben (nur 1, wenn Sie Ihr Punktprodukt normalisieren müssen). Die Gewicht-Vektoren, die du bekommst, würden so aussehen: So kann jedes Gewichtungsschema, das du so aussehen möchtest, das funktionieren (es sei denn, du musst das Ding durch die Summe der Gewichte normalisieren, in diesem Fall musst du dann den neuen Durchschnitt durch das neue teilen Summe, die man berechnen kann, indem man nur O (1) Speicher hält). Lediglich den vorherigen Durchschnitt durch die neuen s (die implizit über das Dot-Produkt in die Gewichte verteilen) vervielfachen und den neuen wnewValue anhängen. Antwortete Mar 29 12 at 21:27 Hier vermutlich ich will, dass die Gewichte auf 1 summieren. Solange man ein relatives Gewicht generieren kann, ohne dass es sich in der Zukunft ändert, können Sie am Ende mit einer Lösung, die dieses Verhalten nachahmt. Das heißt, nehmen Sie an, dass Sie Ihre Gewichte als Sequenz definiert und die Eingabe als Sequenz definiert haben. Betrachten wir 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ählern zu berechnen: Natürlich berechnenWeightFromCounter () in diesem Fall sollte keine Gewichte erzeugen, die zu einem Summen - der Trick hier ist, dass wir durchschnittlich durch Division durch die Summe der Gewichte So dass am Ende die Gewichte praktisch zu einem zu summieren. Der eigentliche Trick ist, wie Sie berechnenWeightFromCounter (). Sie könnten einfach den Zähler selbst zurückgeben, zum Beispiel, aber beachten Sie, dass die letzte gewichtete Zahl wäre nicht in der Nähe der Summe der Zähler unbedingt, so können Sie nicht am Ende mit den genauen Eigenschaften, die Sie wollen. (Es ist schwer zu sagen, da, wie erwähnt, du hast ein ziemlich offenes Problem hinterlassen.) Antwortete Mar 28 12 um 21:45 Das Problem ist, dass sich die Gewichte mit jedem neuen Wert ändern. In deinem Fall sind sie nicht. Ndash Suzan Cioc Mar 29 12 um 14:43 Die tatsächlichen Gebrauchsgewichte ändern sich mit jedem neuen Wert - die Ziffern werden durch eine sukzessiv größere Zahl geteilt, wodurch erzwingt, dass die tatsächlichen verwendeten Gewichte immer auf 1. ndash Kaganar Mar 29 12 summieren Um 14:45 Dies ist zu lang, um in einem Kommentar zu posten, aber es kann nützlich sein, zu wissen. Angenommen, Sie haben: w0vn. Wnv0 (gut nennen diese w0..nvn..0 kurz) Dann ist der nächste Schritt: w0vn1. Wn1v0 (und das ist w0..n1vn1..0 kurz) Das heißt, wir brauchen einen Weg, um w1..n1vn..0 aus w0..nvn..0 zu berechnen. Es ist sicher möglich, dass vn..0 0. 0, z, 0. 0 ist, wobei z an irgendeiner 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. Umreißen der Gleichung, w (x 1) f (zw (x)) z. Nun ist w (x 1) besser für eine Konstante x konstant, also f (zw (x)) z besser konstant sein Daher muß f sich ausbreiten - das heißt f (zw (x)) zf (w (x)). Aber auch hier haben wir ein Problem. Beachten Sie, dass, wenn z (die 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) ist konstant, und so ist f (w (x)) besser auch konstant. W (x) ist konstant, also ist f (z) besser konstant, so dass 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. So nehmen die Gewichte die Form w (x) mbx an. Beachten Sie, dass dies die einzige Information f hat, ist der letzte aggregierte Wert. Beachten Sie, dass Sie irgendwann auf diesen Fall reduziert werden, es sei denn, Sie sind bereit, eine nicht konstante Menge an Daten zu speichern, die Ihre Eingabe repräsentieren. Sie können nicht einen unendlichen Längenvektor von 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 es nicht bewiesen habe, ist es meine Schlussfolgerung, dass das, was Sie wollen, unmöglich ist, mit einem hohen Maß an Präzision zu tun, aber Sie können in der Lage sein, log (n) Raum (das kann auch O (1) für viele sein Praktische Anwendungen), um eine Qualitätsnäherung zu erzeugen. Sie können noch weniger nutzen. Antwortete Mar 29 12 um 23:01 Ich habe versucht, praktisch etwas zu schreiben (in Java). Wie gesagt, Ihr Ziel ist nicht erreichbar. Sie können nur durchschnittlich von 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 zu tun, indem ich die letzten 5 Werte genau und ältere Werte nur von 5 Werten, erinnert an die letzten 5 SUMs. Dann ist die Komplexität O (2n) für die Erinnerung an die letzten nnn-Werte. Das ist eine sehr grobe Annäherung. Sie können die Arraygrößen lastValues und lasAggregatedSums ändern, wie Sie möchten. Sehen Sie sich dieses ascii-artiges Bild an, das versucht, ein Diagramm der letzten Werte anzuzeigen, und zeigt an, 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 keine Gewichte, aber ich denke, es sollte nicht ein Problem für Sie sein, um Gewichte für die lastAggregatedSums entsprechend hinzuzufügen - das einzige Problem ist, dass wenn Sie niedrigere Gewichte für ältere Werte wünschen, wäre es schwieriger, weil das Array sich dreht Es ist nicht einfach zu wissen, welches Gewicht für welches Array-Mitglied. Vielleicht kannst du den Algorithmus ändern, um immer Werte im Array zu verschieben, anstatt zu drehen. Dann ist das Hinzufügen von Gewichten kein Problem. Herausforderung 2. Die Arrays werden mit 0 Werten initialisiert, und diese Werte zählen von Anfang an auf den Durchschnitt, auch wenn wir nicht genug Werte erhalten. Wenn Sie den Algorithmus für lange Zeit laufen, werden Sie wahrscheinlich nicht stören, dass es für einige Zeit am Anfang zu lernen. Wenn Sie dies tun, können Sie eine Änderung hinterlassen -) beantwortet Jan 21 14 um 15:59 Ihre Antwort 2017 Stack Exchange, IncThe Hauptdefekt in Ihrem Programm ist, dass die rekursive Berechnung falsch ist. Um den Durchschnitt zu berechnen, musst du die Summe aus dem aktuellen Wert und den verbleibenden Werten erhalten. Dann dividiere diese Summe durch die Anzahl der Werte. Die Anzahl der Werte ist num. Der aktuelle Wert ist, was auch immer calculatenumber () zurückgibt. Die Summe der verbleibenden Werte ist num-1 multipliziert mit dem Mittelwert der verbleibenden Werte. Der Mittelwert der verbleibenden Werte wird berechnet, indem ein rekursiver Aufruf zum Mittelwert () erfolgt. So schreibe wir folgendes: Ein komplettes Programm, das diese Funktion verwendet, könnte so aussehen: Beachten Sie, dass dies nicht ein sehr guter Weg ist, um den Durchschnitt zu berechnen, weil Sie die Präzision jedes Mal verlieren, wenn Sie die aktuelle Summe durch num teilen. Wenn dieser Durchschnitt wieder vervielfacht wird, wenn der rekursive Anruf zurückkehrt, werden die signifikanten Ziffern, die du in der Division verloren hast, nicht wiederhergestellt. Sie zerstören Informationen, indem sie die Summe teilen und dann multiplizieren. Für mehr Präzision, würden Sie wollen, um die Summe zu verfolgen, wie Sie durch die Elemente gehen, dann teilen am Ende. Ein weiterer Punkt zu betrachten ist, was mit einem gleitenden Durchschnitt gemeint ist. Was oben ausgeführt wurde, ist kein gleitender Durchschnitt, sondern ein fester Durchschnitt. Es ist der Durchschnitt eines festen Fensters von Elementen. Wenn du das Fenster um eine Position bewegst, musst du alles beginnen und die Summe wieder berechnen. Der richtige Weg, um ein bewegendes Fenster zu implementieren, ist, alle Elemente im Fenster zu verfolgen. Wenn du das Fenster um eine Position nach rechts verschiebst, ziehst du das linkste Element aus dem Fenster und subtrahierst seinen Wert aus der Summe, füge dann das neue, rechtsextreme Element zum Fenster hinzu und füge seinen Wert der Summe hinzu. Das macht was eine bewegte Summe. Das Teilen der bewegten Summe durch die Anzahl der Elemente gibt Ihnen den gleitenden Durchschnitt. Der natürliche Weg, um ein bewegliches Fenster zu implementieren, ist mit einer Schlange, weil man dem Kopf neue Elemente hinzufügen und alte Elemente aus dem Schwanz platzieren kann. Antwortete am 22. November 14 um 17: 44In Statistik ist ein einfacher gleitender Durchschnitt ein Algorithmus, der den ungewichteten Mittelwert der letzten n Samples berechnet. Der Parameter n wird oft als Fenstergröße bezeichnet, da der Algorithmus als ein Fenster betrachtet werden kann, das über die Datenpunkte gleitet. Durch die Verwendung einer rekursiven Formulierung des Algorithmus wird die Anzahl der pro Probe benötigten Operationen auf eine Addition, eine Subtraktion und eine Division reduziert. Da die Formulierung unabhängig von der Fenstergröße n ist. Die Laufzeitkomplexität ist O (1). D. h. konstant. Die rekursive Formel des ungewichteten gleitenden Durchschnitts ist, wo avg der rollende Durchschnitt ist und x einen Datenpunkt darstellt. Also, wenn das Fenster nach rechts schiebt, fällt ein Datenpunkt, der Schwanz, und ein Datenpunkt, der Kopf, bewegt sich ein. Implementierung Eine Implementierung des einfachen gleitenden Durchschnitts muss die folgenden berücksichtigen: Algorithmeninitialisierung Solange Das Fenster ist nicht vollständig mit Werten belegt, die rekursive Formel scheitert. Speicher Der Zugriff auf das Schwanz-Element ist erforderlich, was je nach Ausführung eine Speicherung von n Elementen erfordert. Meine Implementierung verwendet die vorgestellte Formel, wenn das Fenster vollständig mit Werten belegt ist und wechselt ansonsten auf die Formel, die den Mittelwert durch Neuberechnung der Summe der vorherigen Elemente aktualisiert. Beachten Sie, dass dies aufgrund der Gleitkomma-Arithmetik zu numerischen Instabilitäten führen kann. Soweit Speicherverbrauch betroffen ist, verwendet die Implementierung Iteratoren, um Kopf - und Schwanzelemente zu verfolgen. Dies führt zu einer Implementierung mit konstantem Speicherbedarf unabhängig von der Fenstergröße. Hier ist das Update-Verfahren, das das Fenster nach rechts schiebt. In den meisten Sammlungen werden ihre Enumeratoren ungültig, wenn die zugrunde liegende Sammlung geändert wird. Die Implementierung beruht jedoch auf gültigen Enumeratoren. Vor allem in Streaming-basierten Anwendungen muss die zugrunde liegende Sammlung modifiziert werden, wenn ein neues Element eintrifft. Ein Weg, um damit umzugehen ist eine einfache kreisförmige feste Größe Sammlung der Größe n1, die nie ungültig macht seine Iteratoren und abwechselnd fügen Sie ein Element und rufen Shift. Ich wünschte, ich könnte herausfinden, wie man das tatsächlich umsetzen kann, da die Test-Funktion sehr verwirrend für mich ist8230 Muss ich Daten in Array umwandeln, dann laufe SMA sma neue SMA (20, Array) für eine 20-Periode SMA Wie gehe ich damit um Shift () - Funktion Ist es notwendig, Konstruktoren zu implementieren. (Entschuldigen Sie das Durcheinander). Nein, du musst deine Daten nicht in ein Array konvertieren, solange deine Daten IEnumerable1 implementieren und der aufgelistete Typ doppelt ist. Soweit Ihr privates Messaging betroffen ist, müssen Sie das DataRow auf etwas umwandeln, das auf doppelte Werte zählt. Ihr Ansatz funktioniert. Shift, schiebt das Fenster eine Position nach links. Für einen Datensatz von etwa 40 Werten und einer 20 Periode SMA haben Sie 21 Positionen das Fenster passt in (40 8211 20 1). Bei jedem Aufruf von Shift () wird das Fenster um eine Position nach links verschoben und Average () gibt die SMA für die aktuelle Fensterposition zurück. Das ist der ungewichtete Durchschnitt aller Werte im Fenster. Zusätzlich erlaubt meine Implementierung, die SMA zu berechnen, auch wenn das Fenster am Anfang nicht vollständig gefüllt ist. Also im Grunde hoffe das hilft. Weitere Fragen COPYRIGHT NOTICE Christoph Heindl und cheind. wordpress, 2009-2012. Unerlaubte Verwendung und Vervielfältigung dieses Materials ohne ausdrückliche und schriftliche Erlaubnis von diesem Blogs Autor und Besitzer ist streng verboten. Auszüge und Links können verwendet werden, vorausgesetzt, dass ein vollständiger und klarer Kredit an Christoph Heindl und cheind. wordpress mit entsprechender und spezifischer Richtung zum ursprünglichen Inhalt gegeben wird. Aktuelle BeiträgeChasing Trends: rekursive gleitenden durchschnittlichen Handelsregeln und Internet-Aktien Wai Mun Fong. Lawrence H. M. Yong Department of Finance und Accounting, National University of Singapore, 1 Business Link, Kent Ridge, Singapur 117592, Singapur akzeptiert 24. Juli 2003. Verfügbar online 24. März 2004. Der jüngste Anstieg und Fall der Internet-Aktienkurse hat zu populären Eindrücken von einem geführt Spekulative Blase im Internetbereich. Wir untersuchen, ob die Anleger die Dynamik in Internet-Aktien mit einfachen gleitenden durchschnittlichen (MA) Handelsregeln ausnutzen könnten. Wir simulieren den Echtzeit-Handel mit einer rekursiven Handelsstrategie, die auf über 800 gleitende Durchschnittsregeln angewendet wird. Statistische Schlussfolgerungen berücksichtigen bedingte Heterosedastizität und gemeinsame Abhängigkeiten. Es wurden keine signifikanten Handelsgewinne festgestellt. Die meisten Internet-Aktien verhalten sich wie zufällige Spaziergänge dies, kombiniert mit hoher Volatilität, kann der Grund für die düstere Leistung der gleitenden durchschnittlichen Regeln sein. Internet-Aktien Verschieben von durchschnittlichen Regeln Rekursive Strategie Bootstrap JEL-Klassifizierung Tabelle 6. Abb. 2. Abb. 3. Abb. 4. Entsprechender Autor. Tel. 65-6874-6693 Fax: 65-6779-2083. Copyright 2004 Elsevier B. V. Alle Rechte vorbehalten. Zitieren von Artikeln () Empfohlene Artikel Verwandter Buchinhalt Copyright 2017 Elsevier B. V. mit Ausnahme bestimmter Inhalte von Dritten. ScienceDirect ist ein eingetragenes Warenzeichen von Elsevier B. V. Cookies werden von dieser Seite benutzt. Um zu sinken oder mehr zu erfahren, besuchen Sie unsere Cookies Seite. Melden Sie sich über Ihre Institution an
No comments:
Post a Comment