Regressionsgerade



  • Ich habe hier einige Punkte in meinem x-y-Koordinatensystem und soll durch diese eine Gerade ziehen. Mein Prof meinte, ich solle dazu eine Regressionsgerade verwenden. Ich versuche nun herauszufinden, was das genau ist. Ich weiss, dass ich am Ende ein a und ein b bekommen muss, damit ich ein y=ax+b bekomme. Aber ich lese bei Wikipedia etwas von "multipler Regression" und "lineare Regression" und weiss gar nichts mit den dort gegebenen Formeln anzufangen. An anderer Stelle finde ich zwar eine Formel (Cramersche Regel) die ein a und b als Ergebnis hat (Eingabe sind N Paare x,y), aber ich weiss nicht, ob die die richtige ist. Kann mir da jemand näheres zu sagen? Hat schon jemand sowas programmiert?

    Hintergrund: Ich kalibriere eine 3D-Kamera. Dazu muss ich diese in verschiedenen Abständen (1m,2m,3m,4m...) vor eine Wand stellen und Messwerte aufnehmen. Diese Messwerte rauschen aber und so bekomme ich für jeden Abstand mehrere verschiedene Messwerte. Daher die Regressionsgerade. Später soll ich die Standardabweichung berechnen, aber das sollte kein Problem sein, wenn ich die Gerade einmal habe. Vielen Dank für Eure Hilfe!

    (Dieser Thread könnte natürlich auch ins Mathematik-Forum passen, aber vielleicht hat jemand eine C++ Lösung parat, daher dieses Forum)



  • erstmal WARNING: ich habe gerade die 8. Klasse abgeschlossen! Das was du denke ich brauchst ist erstmal lineare Regression und die Formel aus 2 Punkten ne Formel zu machen ist nicht das Problem. Zu diesem wird es erst wenns darum geht, eine 'gemittelte' Gleichung zu erstellen. unser Tschenrechner macht das prima 😃
    aber in C++? Vielleicht von p1 zu p2 bis pn jeweils die Gleichung berechnen und dann a und b mitteln?



  • Ne, so einfach gehts nicht. Ich hatte am Anfang auch (wo ich noch nur ein xy-Paar pro Entfernung hatte) von p1 nach p2, p1 nach p3, p1 nach p4 etc und dann die Vektoren gemittelt. Aber das ist zu ungenau. Mein Prof meinte, ich schiebe irgendwie alle Werte (so an die 150 können das sein) in die Regressionsformel und am Ende kommen a und b raus.



  • http://de.wikipedia.org/wiki/Regressionsanalyse#Berechnung_der_Regressionsgeraden
    Da steht doch alles. Die Formeln nach C++ zu übertragen ist nicht so das Problem, oder?

    std::map<double, double> values;
    // ...
    
    double y = 0, x = 0;
    
    for (std::map<double, double>::const_iterator i = values.begin (); i != values.end (); ++i)
    {
        x += i.first;
        y += i.second;
    }
    y /= values.size ();
    x /= values.size ();
    
    double b1 = 0, b2 = 0;
    
    for (std::map<double, double>::const_iterator i = values.begin (); i != values.end (); ++i)
    {
        b1 += (i.first - x) * (i.second - y);
        b2 += (i.first - x) * (i.first - x);
    }
    double b = b1 / b2;
    double a = y - b * x;
    

    Ist mit Sicherheit nicht das effizienteste, sollte aber funktionieren.



  • Ich kenne dieses std::map nicht, aber ich versuche mal das Ganze zu verstehen, danke 🙂

    Also diese Cramersche Regel brauche ich nicht?



  • Hier ist das, glaube ich, etwas einfacher erklärt.
    http://members.chello.at/gut.jutta.gerhard/kurs/statistik2.htm



  • Klasse Link! 👍



  • Noch eine Frage zu den Formeln in diesem letzten Link: Was genau ist V(x) und V(y). Ich versuche gerade alles in Worte zu fassen, aber das gelingt mir nicht bei diesem V.





  • Ah, Varianz, dankeschön!



  • Doch noch eine Frage, hoffentlich die letzte:

    Ich brauche am Schluss noch die Standardabweichung. Bloss bezweifle ich, dass ich dazu die Varianzformel von den beiden Links benutzen kann. Die Varianz dort geht über ALLE Punkte, richtig? In meinem Koordinatensystem sind aber diskrete x-Werte (1m,2m,3m...) und dazu mehrere y-Werte. Die Gerade bekomme ich nun, aber ich muss die Standardabweichung für JEDES x seperat machen, also kann die Varianz dort vergessen richtig? Was muss ich dann machen? Reicht es dann, für jedes x die Abstände seiner y´s zu mitteln und das wars?

    Sry, dass das jetzt offtopic(mathematisch) wird.


Anmelden zum Antworten