Regressionsgerade - Schnittpunktfindung



  • Hallo Leute!

    Habe folgendes Problem u. wäre euch sehr dankbar, wenn ihr mir weiterhelfen könnt.

    Ich bin im 3D-Raum, Vektor v(x,y,z) gibt mir die Koordinate im Raum an. In jeder Ecke im Raum habe ich 5 Punkte. Ich soll durch jede dieser 5 Punkte eine Gerade durchlegen (d.h. ich habe dann 4 Geraden). Wiederum diese 4 Geraden sollen sich dann an einem Punkt Treffen, diesen Punkt soll ich berechnen.

    Tipps die ich bekam waren: Ausgleichsgerade mittels SVD.

    Kann mir jemand bitte erklären wie ich mathematisch zu diesen Schnittpunkt komme?

    Vielen Dank!



  • Ist im Matheforum wohl besser aufgehoben ;).

    Eins ist mir noch nicht klar: Treffen sich die Punkte automatisch in der Mitte? Oder musst du die Regression so durchführen, dass sie sich in einem Punkt treffen?

    Wenn du bereits die 4 Geraden hast und den Schnittpunkt brauchst: Einfach 2 Geraden schneiden. dh av+b=cv+d. nach v auflösen. fertig. Problem ist halt, wenn sich die Regressionsgeraden nicht in einem Punkt schneiden, sondern du den Punkt berechnen musst, der der beste Kandidat für einen gemeinsamen Schnittpunkt wäre.

    In dem Fall wäre das so etwas wie:

    \[ \min\_v \sum\_i^4 d(v,g_i) \]

    wobei g die Geraden sind und d der Abstand von v zu der Geraden. Abstand Punkt/Gerade in 3D steht in jeder Formelsammlung. Das Ganze musst du dann nur nach v ableiten und 0 setzen.



  • otze schrieb:

    Ist im Matheforum wohl besser aufgehoben ;).

    Eins ist mir noch nicht klar: Treffen sich die Punkte automatisch in der Mitte? Oder musst du die Regression so durchführen, dass sie sich in einem Punkt treffen?

    Ich muss die Regression so durchführen, dass sich die Gerade in in einem Punkt Treffen.

    otze schrieb:

    Wenn du bereits die 4 Geraden hast und den Schnittpunkt brauchst:

    Die Geraden hab ich eben noch nicht!



  • dann sag das doch so. Du fragst nach ner Schnittpunktbestimmung, willst aber Geraden berechnen 🙄



  • otze schrieb:

    dann sag das doch so. Du fragst nach ner Schnittpunktbestimmung, willst aber Geraden berechnen 🙄

    Dann hab ich mich wohl komisch ausgedrückt.

    Ich suche zuerst die Geraden u. dann erst den Schnittpunkt dieser Geraden.



  • Eine schnelle heuristik, die auch nicht extrem schlecht wird, ist einfach den Mittelwert der 4 Cluster berechnen. Dann den Mittelpunkt P suchen, bei denen die Geraden die durch die Mittelwerte und P gehen die Abstände minimieren.

    Ansonsten fällt mir grad nur Gradientenabstieg ein. Mach dabei alles wie oben, und Bilde danach den Gradienten. über alle 4 Mittelwerte und P. Folge dann dem Gradienten solange, bis er hinreichend nahe 0 ist.

    Das Problem ist, dass das ganze keine richtige Regressionsaufgabe ist. Durch die Anforderung, dass sich die Geraden alle im selben Punkt schneiden müssen, wird das was komplett anderes.Oder anders ausgedrückt: Die schlechteste Lösung für die Regression könnte die Beste für deine Aufgabe sein.



  • Danke otze vorerst einmal für deine Bemühungen!

    Aber wie sieht so eine Regressionsrechnugn in 3D aus?????

    Bin über jede Hilfe sehr dankbar, es ist überaus dringend!



  • oh, dich hab ich ganz uebersehen, sorry.



  • Dieser Thread wurde von Moderator/in rapso aus dem Forum Spiele-/Grafikprogrammierung in das Forum Mathematik und Physik verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Ich habe jetzt folgendes gefunden: Ausgleichsgerade für den 2D Fall mit Summe der der kleinsten Fehlerquadrate ...

    Minimierung kleinste Fehlerquadrate: http://img136.imageshack.us/img136/4015/minh.jpg

    Parameter A und B: http://img196.imageshack.us/img196/7772/38794482.jpg

    x,y sind gemessene Wertepaare. A und B sind Schätzwerte.

    Ist es das was ich brauche, um eine Gerade durch die Punkte zu finden? Wie sieht es in 3D für (x,y,z) aus??

    Bitte helft mir, ich will nicht durchfallen!

    Danke!



  • Im mehrdimensionalen bestimmst du die Regressionsgerade so:
    du hast eine Menge von Punkten p_1,...,p_n
    Bilde zuerst den Mittelpunkt: m = (p_1 + ... + p_n)/n
    Bilde nun die Matrix A = [ (p_1 - m) (p_2 - m) ... (p_n - m) ] (die Differenzvektoren bilden die Spalten)
    Und jetzt bildest du die Kovarianzmatrix K = A*A^t (A^t ist die transponierte Matrix zu A)
    Nun berechnest du die Eigenwerte von K und wählst den betragsmäßig größten aus, den nennen wir e. Nun bestimmst du den normierten Eigenvektor zu e, d.h. der hat die Länge 1 und wir nennen ihn v.

    Die Ausgleichsgerade ist dann x = e*v + m oder in gewohnter Form g(x) = x*v + m (x ist eine einfache reelle Zahl, ggf. ist dir die Schreibweise g(t) = t*v + m geläufiger).



  • Mathematikker schrieb:

    Im mehrdimensionalen bestimmst du die Regressionsgerade so:
    du hast eine Menge von Punkten p_1,...,p_n
    Bilde zuerst den Mittelpunkt: m = (p_1 + ... + p_n)/n
    Bilde nun die Matrix A = [ (p_1 - m) (p_2 - m) ... (p_n - m) ] (die Differenzvektoren bilden die Spalten)
    Und jetzt bildest du die Kovarianzmatrix K = A*A^t (A^t ist die transponierte Matrix zu A)
    Nun berechnest du die Eigenwerte von K und wählst den betragsmäßig größten aus, den nennen wir e. Nun bestimmst du den normierten Eigenvektor zu e, d.h. der hat die Länge 1 und wir nennen ihn v.

    Die Ausgleichsgerade ist dann x = e*v + m oder in gewohnter Form g(x) = x*v + m (x ist eine einfache reelle Zahl, ggf. ist dir die Schreibweise g(t) = t*v + m geläufiger).

    Beachte bitte dass bei der ersten Schreibweise der Geraden x ein Vektor ist (im drei-dimensionalen Raum ein drei-dimensionaler Vektor) und in der zweiten Schreibweise eine reelle Zahl.



  • Mathematikker schrieb:

    Im mehrdimensionalen bestimmst du die Regressionsgerade so:
    du hast eine Menge von Punkten p_1,...,p_n
    Bilde zuerst den Mittelpunkt: m = (p_1 + ... + p_n)/n
    Bilde nun die Matrix A = [ (p_1 - m) (p_2 - m) ... (p_n - m) ] (die Differenzvektoren bilden die Spalten)
    Und jetzt bildest du die Kovarianzmatrix K = A*A^t (A^t ist die transponierte Matrix zu A)
    Nun berechnest du die Eigenwerte von K und wählst den betragsmäßig größten aus, den nennen wir e. Nun bestimmst du den normierten Eigenvektor zu e, d.h. der hat die Länge 1 und wir nennen ihn v.

    Die Ausgleichsgerade ist dann x = e*v + m oder in gewohnter Form g(x) = x*v + m (x ist eine einfache reelle Zahl, ggf. ist dir die Schreibweise g(t) = t*v + m geläufiger).

    Hallo Mathematiker!

    Vielen Dank erstmal für deine Hilfe. Ganz blick ich da aber nicht durch.
    Die Kovarianzmatrix hab ich mal. Dann wirds problematisch.

    Kann ich ab der Kovarianzmatrix mit SVD weitermachen? Denn K = U*S*V^t hätte ich.

    Danke!
    Adamn



  • Habe folgendes gefunden:

    // =============== SVD TEST ========================================
    		int nobs = 9;                           // number of observations
    		int npred = 2;                          // number of predictor values
    
    		double y[]  = { 2, 3, 1 };
    		double x1[] = { 3, 6, 5 };
    		double x2[] = { 1, 5, 10 };
    
    		cout << "\n\nTest 5 - singular value\n";
    
    		// Singular value decomposition method
    
    		// load data - 1s into col 1 of matrix
    		int npred1 = npred+1;
    		NEWMAT::Matrix X(nobs,npred1); 
    		NEWMAT::ColumnVector Y(nobs);
    		X.Column(1) = 1.0;  
    		X.Column(2) << x1;  
    		X.Column(3) << x2;  
    		Y << y;
    
    		// do SVD
    		NEWMAT::Matrix U, V; 
    		NEWMAT::DiagonalMatrix D;
    		SVD(X,D,U,V);                              // X = U * D * V.t()
    		NEWMAT::ColumnVector Fitted = U.t() * Y;
    		NEWMAT::ColumnVector A = V * ( D.i() * Fitted );
    		Fitted = U * Fitted;
    		NEWMAT::ColumnVector Residual = Y - Fitted;
    		double ResVar = Residual.SumSquare() / (nobs-npred1);
    
    		// get variances of estimates
    		D << V * (D * D).i() * V.t();
    
    		// Get diagonals of Hat matrix
    		NEWMAT::DiagonalMatrix Hat;  Hat << U * U.t();
    
    		// print out answers
    		cout << "\nEstimates and their standard errors\n\n";
    		NEWMAT::ColumnVector SE(npred1);
    		for (int i=1; i<=npred1; i++) 
    			SE(i) = sqrt(D(i)*ResVar);
    		cout << setw(11) << setprecision(5) << (A | SE) << endl;
    		cout << "\nObservations, fitted value, residual value, hat value\n";
    		cout << setw(9) << setprecision(3) << 
    			(X.Columns(2,3) | Y | Fitted | Residual | Hat.AsColumn());
    		cout << "\n\n";
    	}
    

    Mit Datensatz:

    Real y[]  = { 8.3, 5.5, 8.0, 8.5, 5.7, 4.4, 6.3, 7.9, 9.1 };
    Real x1[] = { 2.4, 1.8, 2.4, 3.0, 2.0, 1.2, 2.0, 2.7, 3.6 };
    Real x2[] = { 1.7, 0.9, 1.6, 1.9, 0.5, 0.6, 1.1, 1.0, 0.5 };
    

    Spuckt das Programm folgendes aus:

    Test 5 - singular value
    
    Estimates and their standard errors
    
        1.39166     0.53188 
        1.98310     0.20932 
        0.95221     0.27731 
    
    Observations, fitted value, residual value, hat value
        2.400     1.700     8.300     7.770     0.530     0.280 
        1.800     0.900     5.500     5.818    -0.318     0.190 
        2.400     1.600     8.000     7.675     0.325     0.229 
        3.000     1.900     8.500     9.150    -0.650     0.446 
        2.000     0.500     5.700     5.834    -0.134     0.271 
        1.200     0.600     4.400     4.343     0.057     0.480 
        2.000     1.100     6.300     6.405    -0.105     0.143 
        2.700     1.000     7.900     7.698     0.202     0.153 
        3.600     0.500     9.100     9.007     0.093     0.808
    

    Datensatz dieses Programmes ist y[], x1[], x2[] ... sind das meine x,y,z Werte? Sprich berechnet diese Funktion eine 3d-Regressionsgerade?

    Ich bitte um eure Hilfe, vielen Dank!
    Adamn



  • Ich wiederhole mich gerne noch einmal: Durch die Nebenbedingung eines gemeinsamen Schnittpunktes ist dies keine Regressionsaufgabe mehr. Deswegen ist es ziemlich sinnfrei, mit Techniken zur Regression an dieses Problem ran zu gehen.



  • otze schrieb:

    Ich wiederhole mich gerne noch einmal: Durch die Nebenbedingung eines gemeinsamen Schnittpunktes ist dies keine Regressionsaufgabe mehr. Deswegen ist es ziemlich sinnfrei, mit Techniken zur Regression an dieses Problem ran zu gehen.

    Du hast geschrieben: "berechne den Punkt, der der beste Kandidat für einen gemeinsamen Schnittpunkt ist". Das werde ich auch machen müssen.

    Wärst du doch bitte so nett u. gibst mir eine genaue Anweisung, wie ich dann eine Gerade für eine Punktwolke finden soll!? Ich kann mit deiner früheren Ausführung nicht viel anfangen.

    Ich verbringe schon die ganzen letzten Tage mit googeln auf der Suche nach einer Lösung, aber irgendwie steh ich auf der Leitung. Wenn du mir helfen könntest u. ich eine Möglichkeit hätte dich zu entschädigen, ich würde es sofort machen!!!


Anmelden zum Antworten