Punkte mittels Approximationsgerade annähern?

Aufrufe: 1646     Aktiv: 12.05.2020 um 09:49

0

Hallo,
es geht drum dass ich bspw. eine Serie vn Punkten habe wie
x=[2,7,4,9,11,0,7,3]
könnten bspw. die messwerte einer bestimmten Größe zu den Zeitpunkten 1s,2s,...,8sekunden sein.

 

und mich würde interessieren wie ich eine Gerade dergestalt berechnen kann die möglichst nahe bei den Punkten liegt.

sprich: ich will letztlich rechnerisch rausfinden ob die Werte im Verlauf (mehr oder minder konstant) ansteigen, wie ungefähr die Steigung der Gerade ist.
und wie gut die Gerade ist (denn bspw. bei der Messreihe (8,-8,8,-8,8,-8) würde sich die gerade bei y=0 befinden, also horizontal.mit steigung 0. was ja unsinn wäre, weil es ja wild hin und her schwankt)

 

geht mir im prinzip um lineare regression, wie ich so eine gerade bestimme, insbesondere deren Steigung.
Und wie ich rechnerisch bestimme ob die messwerte wirklich halbwegs linear steigen oder ob die eigentlich wild hin und her schwanken und die gerade gar nix aussagt.

Rein von der Aufgabe her ginge es drum eine Gerade zu finden sodass das Maximum der Abstände der Messpunkte von der Gerade minimal ist (alle punkte so nah wie möglich an der geraden)

Aber wie berechnet man das als Einzeiler?

Weil brauche das als konkrete Formel mit input=Datenwerte und Output=Gerade, bzw. deren Steigung sowie ne kennzahl über deren "Qualität"

 

Wie macht man sowas?

 

Edit: Ich sollte vielleicht ergänzen:
letztlich geht es mir um Preise in einem Tradingchart.

Sagen wir, alle 5 Minuten gibt es dort einen neuen preis.

Und ich will, indem ich bspw. die letzten 6 Werte nehme, eine gut passende Gerade "anlege", grob aussagen ob es gerade stark aufwärts geht, abwärts oder einfach nur so vor sich hin dümpelt (steigung ca. 0)

Was mir dabei etwas problematisch vorkommt:
zum bestimmen so einer regressionsgerade braucht man ja eigentlich wertepaare (x,y).
aber bei mir gibt es in dem sinne keine waagrechts x-achse bzw. keinen Ursprung in dem sinne.

wie hoch die werte zu bestimmten zeiten sind, also wie hoch deren x-wert ist, ist ablesbar.
aber ausser dass sich deren "x werte" um 5 minuten unterscheiden, gibt es bei der x-achse in dem sinne keinen Nullpunkt, keinen ursprung.

ich könnte natürlich irgendwie die indizes des array nehmen, in dem die werte gespeichert sind, heißt also die zahlen 1,2,3,4,5,6 als "x-werte" passend zu den entsprechenden y-werten.

 

Diese Frage melden
gefragt

Student, Punkte: 304

 
Kommentar schreiben
3 Antworten
0

Man könnte sich Werte raussuchen die einen ungefähren konstanten Faktor haben.

Dann hast du mehrere Geraden die den Verlauf deiner Funktion beschreiben. 

Zum Beispiel wenn du die Werte (1,1) (2,0) (4,2)  (8,3)  (16,5) hast siehst du ja das die Funktion exponentiell wächst.
Du musst halt immer Werte versuchen zu finden   Die ne ungefähre Relation zu einander haben.

Ansonsten wenn du Vorhersagen  machen willst gibt es diverse Programme, oder über Excel geht das glaube auch. 
musst du mal googeln 

Diese Antwort melden
geantwortet

Student, Punkte: 10

 

Kommentar schreiben

0

Darf ich fragen in welcher Programmiersprache du das machen willst? Ich bin mir recht sicher, dass es für dein Problem eine Lösung gibt.

Ansonsten könntest du dir ja eigentlich immer eine Funktion schreiben und dir so deinen Einzeiler im Prinzip selber generieren.

Mathematisch brauchst du eine Fehler Funktion, also bspw die Methode der kleinsten Quadrate, wie du ja auch schon erwähnt hast:

\( \sum \limits_{i=1}^{n} \frac{1}{2} | f(x_i) - y_i| ^2 \)

Diese müsstest du dann minimieren. 

Ich bezeichne deine Datenpunkte hier mal als Punkte \( (x_1,y_1), ..., (x_n,y_n)\)

 

Zu deinem letzten Abschnitt: Ich denke ohne x Werte wird sich das hier sehr schwer darstellen. Dann weißt du ja genau genommen nichtmal ob die Reihenfolge stimmt?

Also weenn der (unbekannte) x Wert des ersten Datenpunkts größer ist, als der des zweiten, dann stimmt ja gar nichts mehr oder...?

Diese Antwort melden
geantwortet

Student, Punkte: 910

 

Wie drücke ich das jetzt aus?
Am Ende von Allem habe ich letztlich einfach ein Array, sagen wir bspw. der Länge 5.

Und jedes Arrayelement ist eine Zahl.

Kann sein dass die Zahlen in Richtung aufsteigender Indizes steigen. oder fallen.
Oder gar nix davon.

Mal so als Beispiel:
das 5er Array [1,3,5,7,9] ist offensichtlich aufsteigend geordnet.

hier lässt sich direkt eine gerade konstruieren die durch die entsprechenden Punkte
(1,1) (2,3) (3,5) (4,7) (5,9)
(wobei 1. eintrag=index, 2. eintrag=zahl an dem index)

Die "Steigung" wäre dann +2 (weil: geht man um einen Indexplatz nach oben, erhöht sich der "Funktionswert" um +2)
nur sowas wie y-achsenabschnitt lässt sich hier eher shclecht finden mangels ursprung :-/

hier habe ich die Gerade "erraten" aber bei Punkten, die nicht rein zufällig alle auf einer "Linie" liegen, müsste ich das systmatisch hinkriegen.
Für den Anfang würde mir schon mal eine Formel für die Geradensteigung reichen.
Als Zusatz sozusagen wäre eine berechenbare Kennzahl ideal, anhand der ich ablesen könnte, wie gut die Gerade auf bzw. bei den Punkten liegt.

Gegenbeispiel:
Bei dem Array (5,-5,-5,5,-5,5)
wäre (meine Vermutung) die ideal gerde eine horizontale Linie im Sinne von y=0.
die ist von jedem Punkt um 5 Einheiten entfernt.
Obwohl das für dieses Array/Datenmenge schon die bestmögliche Gerade ist, ist sie doch miserabel in dem Sinne dass sie von jedem Punkt 5 Einheiten (un damit sehr weit weg) ist.
Sprich: hier macht eine Annäherung durch eine gerade keinen Sinn, weils einfach nicht so zum Verlauf passt.

Wie gesagt, wäre neben der Steigung halt gut wenn es eine kennzahl gäbe anhand der ich sehen bzw. ablesenkönnte, wie gut oder schlecht die "perfekte gerade" zum Datensatz passt.
Ob es von jedem Punkt nur "relativ minimal" abweicht.
Oder ob es wie bei den alternierenden Werten oben (wo die gerade durch 0 geht und steigung 0 ha) einfahc nur unsinn ist und gar nix über den Verlauf aussagt.

Mir fehlt nur schlicht und ergreifend eine mehr oder minder kurze Formel um die Steigung eines ideal angepassten Gerade sowie die Kennzahl für dessen Angepasstheit zu bestimmen.

für dieses "wie gut passt es" könnte ich zwar einfach das Minimum der Abweichungen betrachten.
Aber da hätte ich das Problem dass ich nicht weiß welcher Absolutbetrag an Abweichung noch gut ist oder nicht.

Ich meine, wenn sich bspw. alle meine Messwerte so um die 10000 bewegen, dann würde man eine Abweichung um 5 ooder 10 Einheiten sicherlich nicht als schlecht bezeichnen.

Wenn wir aber allerdings wie oben Werte haben, die im einstelligen oder niedrigen 2stelligen Bereich liegen, dann wäre eine Abweichung von mindestens 10 Einheiten eine Katastrophe bzw. würde ausdrücken dass selbst die idela berechnete Gerade miserabel ist und gar nicht an den graph passt.

daher würde es da der reine Minimumwert auch nicht bringen.

Ich würde eigentlich wetten, die leute aus der Hardcorestatistik haben dafür auch eine sehr komplex zu berechnende Zahl entwickelt, anhand derer man das messen kann.
Aber leider kenne ich die nicht :-(
  ─   densch 11.05.2020 um 10:35

Naja, folgendes Problem: Wenn du das Array [1,3,5,7,9] anschaust, kannst du hier ja auch ganz andere x Werte zuweisen und bekommst direkt andere Steigungen. Nimm bspw genau die gleichen x_werte wie y-Werte und schon hast du die Ursprungsgerade als perfekte Ausgleichsgerade mit Steigung 1.

Da du aber sagst, dass es sich um Preise in einem Zeitlichen Verlauf handelt, kannst du ja wirklich einfach als x-Werte die Zahlen von der 1 an aufwärts nutzen. Um einen Trend zu erkennen ist es ja völlig egal, wie groß da jeweils der Abstand ist und wo der Ursprung ist. Vorrausgesetzt, du hast Preise in einem regelmäßigen Zeitabstand. Wenn du dann Steigungen etc UNTEREINANDER vergleichst, macht das ja auch Sinn, du darfst aber eben nur, wenn die x-Achse einen realen Bezug hat auch einen realen Bezug der Steigung betrachten.
Bsp: Wenn du sagst alle 5 Minuten hast du einen Preis und du setzt dann \(x_1 = 5, x_2=10\) usw, wird die Steigung dir die Änderung pro Minute angeben.

Schau dir mal die folgende Seite an:

https://www.crashkurs-statistik.de/einfache-lineare-regression/

Hier stehen schon recht weit oben Formeln für a und b, die du verwenden kannst. dIe hängen sowohl von der Varianz , als auch vom Korrelationskoeffizienten ab. Ich denke dass der Korrelationskoeffizient r das Maß ist, das du suchst. Für ihn gilt:
\( r \in [-1,1]\)
r nimmt die extremen Werte -1 und 1 nur dann an, wenn man eine perfekte Ausgleichsgerade zeichnen kann. das Vorzeichen zeigt an, ob die Korrelation positiv oder negativ ist. (Sinken deine Preise also auf einer perfekten Gerade, so wird der Koeffizient -1 sein)
Zudem steigt der Betrag von 1, je besser die Annäherung wird!
Dein Beispiel mit den alternierenden 5en wird also einen Korrelationskoeffizienten sehr nahe der 0 ergeben.

meine Frage zu deiner bevorzugten Programmiersprache hast du leider nicht beantwortet. Du kannst dir hier viel Mühe und Tipparbeit sparen. Die meisten Programmiersprachen werden eine Library oder Ähnliches haben, wo die Regression komplett hinterlegt ist.

  ─   eckebrecht 11.05.2020 um 12:34

Naja, MQL4 ist die einzige mir zur Verfügung stehende Sprache (ist wohl so ähnlich wie Java).

geht um einen Expert Advisor den ich mir schreiben will der bspw. für die letzten 5 Werte (daher auch das 5er Array) die Steigung der Regressionsgerade sowie diesen korrelationskoeffizienten berechnet.

Werde mir mal die Formeln dafür durchlkesen und das mal ausprobieren.

Klar ist die letztendliche Steigung relativ egal, geht nur drum ob sie >0, =0 oder <0 ist
(einfach weil ich nciht zu beurteilen vermag, ab wann ich von einer starken steigung sprechen sollte und wann nicht)
  ─   densch 11.05.2020 um 18:17

Obwohl, wenn ich so recht überlege...
Eigentlich könnte ich ja hingehen, gucken um wie viel der preis in der letzten Zeit geschwnkt hat (um welches deltay) und steigung betrachten.

ich meine, dass ich die Steigung der Preise der letzten 5 Minuten berechne und das dann durch die durchschnittliche Veränderung an y-werten teile oder so.

oder sowas.
damit könnte ich vielleicht ein gefühl dafür kriegen ob der preis gerade auffällig am steigen ist.
oder ob er nur die steigung hat, die der graph schon seit Ewigkeiten kosntant hat.

Wobei ich da ja eigentlich auch einfach die steigung berechnen könnte für einen kurzen Zeitraum und mit der steigung eines längeren zeitraums vergleichen kann um zu sehen ob die steigung plötzlich wesentlih höher ist als vorher.

vielleicht direkt Steigung kurze zeit/steigung lange zeit.
wenn >1.2 bspw. geht es aufwärts kurzfristig, wenn <0.8 geht es abwärts kurzfristig.
und bei werten um die 1 trottet der graph einfach so vor sich hin, vielleicht mit einer konstanten steigung aber doch mit nichts besonderem.

wobei ich ja eigentlich auch hingehen könnte und den winkel im vergleich zur horizontalen berechnen könnte.
der könnte auch aufschlussreich sein (über steigungsdreieck eben berechnen, ankathete=1, gegenkathete=steigungswert).

der winkel dürfte mir ja am ehesten noch ein gefühl dafür geben wie stark es aufwärts geht.

Ich muss mal schwer über das Ganze nachdenken :-)
  ─   densch 11.05.2020 um 22:54

Puh das ist viel Input auf einmal :D MQL4 sagt mir tatsächlich gar nichts, aber ich würde mich mal erkundigen, was für Bibliotheken zur Verfügung stehen, damit du das machen kannst. Für solche Anwendungen die Richtung Statistik gehen sind ja eigentlich R und Python sehr verbreitet, da weiß ich auch das es solche Dinge gibt.

Nochmal Zur Steigung: wenn du tatsächlich Preise zu bestimmten Zeitpunkten hast, also bspw im 5 Minutentakt ist es ja auf jeden Fall Sinnvoll die Steigung anzuschauen, das wird schon Sinn machen. Du musst dann denke ich für dich über die Zeit feststellen, was eher normale und was außergewöhnliche Steigungen sind, aber wenn dein Datensatz mal eine gewisse große hast, wirst du da bestimmt ei Gefühl für bekommen.

Den Winkel und das Steigungsdreieck halte ich eher für unnötig. Der Winkel zur horizontalen ist ja letztendlich nichts anderes als die Steigung, ich denke da kannst du dir zusätzliche Rechnungen sparen und einfach direkt den Wert nehmen, den du über die Formel sowieso berechnest.
  ─   eckebrecht 12.05.2020 um 09:49

Kommentar schreiben

0

Das kann man doch auch selbst rechnen. Lineare Regression ist doch überschaubar. Siehe z.B. mein Video auf meinem youTube Kanal über das Coronavirus, wo lineare und exponentielle Regression erklärt und vorgerechnet wird.

Diese Antwort melden
geantwortet

Lehrer/Professor, Punkte: 6.14K

Vorgeschlagene Videos
 

Leider scheint diese Antwort Unstimmigkeiten zu enthalten und muss korrigiert werden. Professorrs wurde bereits informiert.