Laufende lineare Regression



  • Hallo Forum,

    ich habe ein kleines Effizienzproblem. Und zwar möchte ich zu einer gegebenen Anzahl von Datenpunkten eine laufende lineare Regression anfertigen.

    Angenommen ich habe 10 Millionen (x,y)-Punkte (x = Zeit (time_t), y = Messwert (float)) Dann möchte ich jeweils in einem laufenden Fenster von zum Beispiel +-10000 Punkten um den aktuellen Wert herum eine lineare Regression durchführen (für die ersten 9999 Punkte setzte ich einfach irgendeinen ungültigen Wert / Alternativ Regression mit weniger Punkten - ist irrelevant).

    So, wie mache ich das effizient, wenn ich für alle 10 Mio Punkte diese Ausgleichsgerade berechnen möchte?

    Zusatzinfo: ich bin nur an der Steigung interessiert und der Abstand der x-Werte ist häufig konstant, es fehlen aber auch oft über kurze oder auch längere Zeitspannen Messwerte.

    Mein Ansatz: laufende Mittelwerte für x und y berechnen (das ist ja trivial) und dann (teuer) für alle Punkte in x[position-10000] bis x[position+10000]: summiere (x-xavg)*(y-yavg) sowie (x-xavg)**2 und teile die Summen. Das funktioniert zwar, dauert mir aber eigentlich zu lange, wenn ich das für jeden einzelnen der 10 Mio Punkte machen muss - zumal ich das auch noch für mehrere Fenstergrößen berechnen möchte.

    In boost::accumulators gibt es tag::rolling_mean, das löst meine rollenden x- und y-Mittelwertberechnungen (allerdings ist das auch trivial selbst nachzubauen). Aber wie berechne ich die laufende Varianz und Kovarianz? Gibt es das vielleicht schon irgendwie in boost? Ich glaube nicht, aber vielleicht irgendwo anders? Oder gibt es da irgendeinen Trick zur Effizienzsteigerung? In dem Zusammenhang: ich finde die boost-Dokumentation regelmäßig furchtbar. Bis ich verstehe, wie ich irgendwas nutze, muss ich immer halb Stackoverflow lesen... 😕

    Zuletzt: habe überlegt, das stattdessen ins Mathe-Subforum zu stellen, aber eigentlich bin ich mehr an einer C++-Lösung (gerne auch Bibliothek) insteressiert.


  • Mod

    Bevor da zu viel Mühe rein gesteckt wird: Bist du sicher, dass du das so möchtest? Oder geht es in Wirklichkeit um ganz ein anderes Problem bezüglich der Datenanalyse (oder Darstellung) von dem du bloß denkst, dass deine gleitende Regression eine gute Lösung wäre? So wirklich sinnvoll klingt mir das nämlich nicht, da lineare Regression und Neuberechnung in jedem Punkt zwei gegensätzliche Ziele sind. Frag immer nach dem, was du erreichen möchtest, nicht danach, wie du denkst, dass der Weg dahin aussehen könnte.



  • Tja, das Ziel ist nicht so wirklich klar definiert (interessante Bereiche finden - für was auch immer für Bedeutungen von "interessant"), das ist auch ein Problem der Aufgabe.

    Ich möchte mir eigentlich die Ableitung der Messwerte-Funktion angucken. Allerdings springen die Messwerte oft wild hin und her, sodass ich schon über gewisse Bereiche mitteln muss, um überhaupt was zu erkennen. Und die Frage ist auch, wie groß dieser Bereich sein muss (für langfristige Effekte muss ich über Wochen mitteln, für kurzfristige vielleicht über eine Stunde). Muss man mal sehen. Daher würde ich gerne viele Dinge einfach mal ausprobieren.



  • wob schrieb:

    In boost::accumulators gibt es tag::rolling_mean, das löst meine rollenden x- und y-Mittelwertberechnungen (allerdings ist das auch trivial selbst nachzubauen). Aber wie berechne ich die laufende Varianz und Kovarianz? Gibt es das vielleicht schon irgendwie in boost?

    rolling_moment<2> ist die Varianz; siehe auch Moment (Stochastik)


Anmelden zum Antworten