Wie berechnet man den einfachen gleitenden Durchschnitt in C # schneller?

8

Was ist die schnellste Bibliothek / Algorithmus zur Berechnung des einfachen gleitenden Durchschnitts? Ich habe meine eigene geschrieben, aber es dauert zu lange auf 330 000 Elemente Dezimal-Datensatz.

  • Periode / Zeit (ms)
  • 20/300;
  • 60/1500;
  • 120/3500.

Hier ist der Code meiner Methode:

%Vor%

Das Data.Close[] ist ein dezimales Array fester Größe (1 000 000).

    
zozed 14.10.2012, 17:18
quelle

10 Antworten

11

Ihr Hauptproblem besteht darin, dass Sie für jede Iteration zu viele Informationen wegwerfen. Wenn Sie so schnell arbeiten möchten, müssen Sie einen Puffer der gleichen Größe wie die Rahmenlänge beibehalten.

Dieser Code wird gleitende Durchschnitte für den gesamten Datensatz ausführen:

(Nicht wirklich C #, aber Sie sollten die Idee bekommen)

%Vor%

Bitte beachten Sie, dass es verlockend sein könnte, einen laufenden Cumsum zu behalten, statt den gesamten Puffer zu behalten und den Wert für jede Iteration zu berechnen, aber dies funktioniert nicht für sehr lange Datenlängen, da Ihre kumulative Summe so groß wird, dass sie klein wird zusätzliche Werte führen zu Rundungsfehlern.

    
Storstamp 14.10.2012, 21:44
quelle
4
%Vor%     
J.L. Haynes 01.06.2017 22:55
quelle
3

Wenn die Daten statisch sind, können Sie das Array vorverarbeiten, um Abfragen im gleitenden Durchschnitt sehr schnell durchzuführen:

%Vor%

Jetzt ist die Berechnung des gleitenden Durchschnitts einfach und schnell:

%Vor%     
nneonneo 14.10.2012 17:37
quelle
2

Die aktuelle (akzeptierte) Lösung enthält eine innere Schleife. Es wäre effizienter, dies ebenfalls zu entfernen. Sie können sehen, wie dies hier erreicht wird:

Wie man eine sich bewegende Standardabweichung effizient berechnet

    
ChrisW 19.02.2016 21:13
quelle
2

Heutzutage hat die Math DotNet -Bibliothek eine Klasse namens RunningStatistics , die dies für Sie tun. Wenn Sie es nur über die letzten "X" -Elemente machen möchten, verwenden Sie MovingStatistics stattdessen.

Beide berechnen laufende Durchschnittswerte, Varianz und Standardabweichung im laufenden Betrieb mit nur einem Durchlauf und ohne zusätzliche Kopien der Daten zu speichern.

    
Randolpho 02.02.2017 19:14
quelle
1
%Vor%

Eine C-Funktion, 13 Codezeilen, einfacher gleitender Durchschnitt. Anwendungsbeispiel:

%Vor%     
Sorin 21.12.2013 09:12
quelle
1

Das ist MA, das ich in meiner App verwende.

%Vor%

Sobald Sie es für die gesamte Datenreihe berechnet haben, können Sie sofort einen bestimmten Wert abrufen.

    
Miroslav Popov 26.06.2014 21:36
quelle
1

So habe ich es versucht. Aber ich warne mich davor, dass ich ein kompletter Amateur bin, also könnte das völlig falsch sein.

%Vor%

Sollte eine Liste von Dezimalstellen mit den gleitenden Durchschnitten für Ihre Daten zurückgeben.

    
Mahalo Quaker 19.02.2016 21:06
quelle
1

Wie wäre es mit Queue ?

%Vor%

Verwendung:

%Vor%     
koryakinp 12.12.2017 20:31
quelle
0
%Vor%     
tcwicks 18.01.2017 14:36
quelle