Lineare Regression - Finale Version

22/06/2010 - 19:05 von Andreas Bauer | Report spam
Hallo Karl Heinz, Ernst, Thomas,
leider funktioniert die Kalibrierung nicht.
Des weiteren habe ich den Überblick verloren, welche Formel
aus Eurer Sicht nun Gültigkeit hat.

Bei gleichen x + y Werten funktioniert die Excelkalkulation nicht
mehr.
Bild:
1:
http://www1.minpic.de/bild_anzeigen.php?id5395&key%266265&ende

2:
http://www1.minpic.de/bild_anzeigen.php?id5396&keyF157902&ende

Deshalb die Bitte, könnt Ihr mir auf die Sprünge helfen.
Kurze Zusammenfassung,
welche finale Lösung hat Gültigkeit.


Ich habe z.B. einen X-Wert von 10, nur y àndert sich.
Da kommen keine pausible Werte zurück.
Der neue Wert sollte ja annàhernd auch bei 10 liegen.

Ausgangsituation.
Soll Werte * Koeffizienten = Ist Werte
A * b[2] = B
Wie rechne ich konkret um,
Inverse
Determinante
Inverse/Adjunkte

Mit 3 Werten und Excel passt es.
Leider nicht mit mehreren Werten.

Datei Excel:
http://www.materialordner.de/IqH89E...zGqGd.html



So kann man es testen
f(x,y) = a*x + b*y + c
// x ist fix - y àndert sich
// f(x) = a * x + b * y + c;
// f(y) = a * x + b * y + c;

double nZuAchseX;
nZuAchseX = a * 10 + b * 10 + c;
nZuAchseX = a * 10 + b * 20 + c;
nZuAchseX = a * 10 + b * 30 + c;
nZuAchseX = a * 10 + b * 40 + c;

- C-Code

#define epsilon 1E-13

BOOL CTestRegression::Test_Koeffizienten()
{
double a = 0;
double b = 0;
double c = 0;

double x_[] = {10,20,30};
double y_[] = {10,20,30};
double z_[] = {10.1,20.2,29.3};

/*
double x_[] = {173,275.5,139.5};
double y_[] = {12.5,28.5,153};
double z_[] = {131,197,114};
*/

unsigned num = 3;

unsigned i;
double x,y,z,d,d1,d2,d3;

double sx = 0.;
double sy = 0.;
double sz = 0.;
double sxy = 0.;
double sxz = 0.;

double syz = 0.;
double sx2 = 0.;
double sy2 = 0.;
double n = (double)num;

for (i=0; i<num; ++i)
{
x = x_[i];
y = y_[i];
z = z_[i];

sx += x;
sy += y;
sz += z;

sxy += x * y;
sxz += x * z;
syz += y * z;

sx2 += x * x;
sy2 += y * y;
}


//Die Determinante
//D = det(A) ist

d = sx*sx*sy*sy*n+sxy*sy*sx+sx*sxy*sy-sx*sy*sy*sx-sxy*sxy*n-
sx*sx*sy*sy;

if (fabs(d) < epsilon)
{
return FALSE; // keine sinnvolle Loesung
}

/*
Die Inverse A^-1 ist

( Summe xi^2 Summe xiyi Summe xi ) = 1/det(A)
( Summe xiyi Summe yi^2 Summe yi )
( Summe xi Summe yi n )

Nun kann man durch Multiplikation wieder die Loesung aufschreiben

c = A^-1 * b
( a ) ( sxi^2 sxiyi sxi ) ( sxizi )
( b ) = 1/det(A) ( sxiyi syi^2 syi ) * ( syizi )
( c ) ( sxi syi n ) ( szi )


( sxi^2 sxizi + sxiyi syizi + sxi szi ) = 1/det(A)
( sxiyi sxiyi + syi^2 syizi + syi szi )
( sxi sxizi + syi syizi + n szi )
*/


d1 = sx*sx * sxz + sxy * syz + sx * sz;
d2 = sxy * sxy + sy*sy * syz + sy * sz;
d3 = sx * sxz + sy * syz + n * sz;

// d1 = sx*sx * sxz + sxy * syz + sx * sz;
// d2 = sxy * sxy + sy*sy * syz + sy * sz;
// d3 = sx * sxz + sy * syz + n * sz;
a = d1 / d;
b = d2 / d;
c = d3 / d;


// x y àndert sich
// f(x) = a * x + b * y + c;
// f(y) = a * x + b * y + c;

double nZuAchseX;
nZuAchseX = a * 10 + b * 10 + c;
nZuAchseX = a * 10 + b * 20 + c;
nZuAchseX = a * 10 + b * 30 + c;
nZuAchseX = a * 10 + b * 40 + c;


return TRUE;
}




[ Berichtigung, da Ernst Sauer einen Fehler gefunden hat ] Karl Heinz
schrieb: > Andreas Bauer schrieb: >> http://www1.minpic.de/bild_anzeigen.php?id4609&keyU273016&ende


Dann musst du das also so machen, wie Thomas Plehn schrieb.
Nimm statt f(x) = a*x + b dein f(x,y) = a*x + b*y + c
Dann das Quadrat der Fehler minimieren
Summe(axi + b yi + c - zi)^2 = Minimum
Dazu Partielle Ableitungen nach den Koeffizienten a, b, c nullsetzen
Summe(axi + byi + c - zi)xi = 0
Summe(axi + byi + c - zi)yi = 0
Summe(axi + byi + c - zi) = 0



Sortieren nach den Parametern/Koeffizenten

Summe axi xi + Summe byi xi + c
Summe xi = Summe zi xi Summe axi yi + Summe byi yi + c
Summe yi = Summe zi yi Summe axi + Summe byi + c
n = Summe zi

Nun hast du wieder ein Gleichungssystem A * c = B [ Hier war ein
Fehler ]

Wie Ernst Sauer festgestellt hat, muss es richtig heissen:
( Summe xi^2 Summe xiyi Summe xi ) ( a )=( Summe xizi )
( Summe xiyi Summe yi^2 Summe yi ) ( b ) ( Summe yizi )
( Summe xi Summe yi n ) ( c ) ( Summe zi )

Damit hat man eine an der Hauptdiagonale symmetrische Matrix mit

A^-1 = adj(A)/diag(A) = A^T/diag(A)

Die Determinante
D = det(A) ist

= Summe xi^2 Summe yi^2 n + Summe xiyi
Summe yi Summe xi + Summe xi Summe xiyi
Summe yi - Summe xi Summe yi^2 Summe xi - Summe xiyi
Summe xiyi n - Summe xi^2 Summe yi Summe yi

Die Inverse A^-1 ist

( Summe xi^2 Summe xiyi Summe xi ) = 1/det(A)
( Summe xiyi Summe yi^2 Summe yi )
( Summe xi Summe yi n )

Nun kann man durch Multiplikation wieder die L sung aufschreiben

c = A^-1 * b
( a ) ( sxi^2 sxiyi sxi ) ( sxizi )
( b ) = 1/det(A) ( sxiyi syi^2 syi ) * ( syizi )
( c ) ( sxi syi n ) ( szi )


( sxi^2 sxizi + sxiyi syizi + sxi szi ) = 1/det(A)
( sxiyi sxiyi + syi^2 syizi + syi szi )
( sxi sxizi + syi syizi + n szi )
 

Lesen sie die antworten

#1 Karl Heinz
22/06/2010 - 19:33 | Warnen spam
Andreas Bauer schrieb:

( Summe xi^2 Summe xiyi Summe xi ) = 1/det(A)
( Summe xiyi Summe yi^2 Summe yi )
( Summe xi Summe yi n )

Nun kann man durch Multiplikation wieder die Loesung aufschreiben



Das hier ist falsch

c = A^-1 * b
( a ) ( sxi^2 sxiyi sxi ) ( sxizi )
( b ) = 1/det(A) ( sxiyi syi^2 syi ) * ( syizi )
( c ) ( sxi syi n ) ( szi )



Man müsste A orthogonal haben

( a ) ( sxi^2 sxiyi sxi ) ( sxizi )
( b ) = ( -sxiyi -syi^2 -syi ) * ( -syizi )
( c ) ( -sxi -syi -n ) ( -szi )



Aber dann hat EIN syi falsches Vorzeichen für A^-1,
so dass man das vorher irgendie nullen müsste was
aber sehr unübersichtlich wird, so dass man lieber
die Adjunkte hinschreibt und durch die Determinante teilt:

http://de.wikipedia.org/wiki/Regul%...3-Matrizen

( a b c )
( d e f ) ->
( g h i )

( ei - fh ch - bi bf - ce )
1/det()A ( fg - di ai - cg cd - af )
( dh - eg bg - ah ae - bd )


Bisschen Schreibkram aber es geht mit Sicherheit.

Ähnliche fragen