Mehrfachregression
-
y = b1 * sin(x1) + b2 * sqrt(x1) + b3 * x2^2 + b4 * x2^3
Mir faellt grade auf, dass das auch nur ein lineares Problem ist, da die gesuchten Parameter b1, b2, b3 und b4 nur linear mit einfliessen. Mach es dir also nicht so schwer, linear ist einfach.
-
knivil schrieb:
y = b1 * sin(x1) + b2 * sqrt(x1) + b3 * x2^2 + b4 * x2^3
Mir faellt grade auf, dass das auch nur ein lineares Problem ist, da die gesuchten Parameter b1, b2, b3 und b4 nur linear mit einfliessen. Mach es dir also nicht so schwer, linear ist einfach.
Wie wäre dann denn der Lösungsansatz wenn es linear wäre? Das Einzige was mir einfiele, wäre die Daten in die einzelnen Terme zu transformieren und für jeden Datensatz den neuen Datenpunkt (sin(x1),sqrt(x1),x22,x23)^T auszurechnen und dann in diesem 4Dimensionalen Raum linear zu optimieren. Bin mir aber grad nicht sicher, ob das wirklich das macht, was wir wollen.
Natürlich klappt das nicht, wenn wir zum Beispiel b1*sin(b2*x1) haben.
-
Ok, wie wäre es denn, wenn man z.b. folgende Zerlegung vornimmt:
x1 x2 y 0.5 1.3 1.4 0.7 1.5 2.8 0.9 1.9 2.6 1.2 2.3 3.7 1.5 4.2 4.3 Modellgleichung linearer Ansatz: y = b0 + b1x1 + b2x2 und nun den linearen Ansatz "polinomial erweitert", man "mogelt" also beliebige neue Koeffizienten auf Basis von x1, x2 dazu: y = b0 + b1x1 + b2x1² + b3x2 + b4x2² Nun muss man für die neuen Koeffizienten eine Tabelle mit "neuen" Datenwerten auf Basis von x1, x2 ergänzen: x1 x1² x2 x2² y x1 x2 x3 x4 0.5 0.25 1.3 1.69 1.4 0.7 0.49 1.5 2.25 2.8 0.9 0.81 2.6 6.76 2.6 1.2 1.44 3.7 13.69 3.7 1.5 2.25 4.2 17.64 4.3
mit SciLab sieht das folgendermaßen aus:
x1 = [0.5,0.7,0.9,1.2,1.5] x2 = [0.25,0.49,0.81,1.44,2.25] x3 = [1.3,1.5,2.6,3.7,4.2] x4 = [1.69,2.25,6.76,13.69,17.64] y = [1.4,2.8,2.6,3.7,4.3] X = [ones(5,1), x1', x2', x3', x4'] X = 1. 0.5 0.25 1.3 1.69 1. 0.7 0.49 1.5 2.25 1. 0.9 0.81 2.6 6.76 1. 1.2 1.44 3.7 13.69 1. 1.5 2.25 4.2 17.64 b = inv(X'*X)*X'*y' b = - 1.1530301 16.200242 - 5.805805 - 3.9454127 0.6114774 X*b = 1.4 2.8 2.6 3.7 4.3 y = -1.1530301 + 16.200242x1 - 5.805805x1² - 3.9454127x2 + 0.6114774x2²
Wäre doch ein schöner Ansatz einen ausreichenden Datenbestand (Kennfeld) mit einem Modellgleichung basierend auf Polynomen (o.ä.) mit beliebiger Genauigkeit, d.h. bel. neuen Koeffizienten, zu approximieren. Man könnte auch Wurzel und Sinusfunktionen usw. mit in die Gleichung einbeziehen. Letztendlich ist das alles dann nur eine Frage des Rechenaufwandes bezüglich der Matrizen.
-
Wäre doch ein schöner Ansatz einen ausreichenden Datenbestand (Kennfeld) mit einem Modellgleichung basierend auf Polynomen (o.ä.) mit beliebiger Genauigkeit, d.h. bel. neuen Koeffizienten, zu approximieren. Man könnte auch Wurzel und Sinusfunktionen usw. mit in die Gleichung einbeziehen. Letztendlich ist das alles dann nur eine Frage des Rechenaufwandes bezüglich der Matrizen.
Ich hab das vorhin mal in meinen Vorlesungsunterlagen angeschaut. Das wird so auch zum Teil gemacht, aber so einfach, wie das klingt, ist es nicht.
Natürlich geht das alles, wenn man den Rechenaufwand außer betracht lässt - aber der ist Astronomisch.
um ein komplettes Polynom zweiten Grades mit 2D Eingabe abzubilden, brauchst du bereits folgende Basispolynome zur Linearisierung: (1,x,y,x2,y2,x*y) für Polynome 3. Grades kannst du noch folgende Terme hinzufügen: (x3,x2*y,x*y2,y3). Linearisierung eines Polynoms dritten Grades benötigt also bereits einen 10 Dimensionalen Parameterraum. Und das alles bei 2D. Höhere Dimensionen der Eingabedaten werden richtig schlimm. Für ein Polynom von Grad k und eine n-dimensionale Eingabe lässt sich die Anzahl der Parameter so berechnen:
$P=\sum_{i=0}^k { n+k-1 \choose k }$Und das ist exponentiell in n und k - weswegen die Technik bei vielen Anwendungen ausscheidet (man muss ja auch bedenken, dass danach noch Matrixmultiplikationen kommen, die dann richtig teuer werden...).
//edit nochn Problem: du brauchst dann natürlich auch mindestens P samples, sonst kannste die Matrix nicht invertieren.
-
Dass das Ganze mit teurem Rechenaufwand verbunden ist, ist mir bewußt. Ich beschränke mich auf max. 4 Eingangsgrößen.
Ich nehme mal an, dass Du mit x, y das Selbe meinst, wie ich mit x1, x2, oder?
Warum müssen eigentlich Deiner Angabe nach die Terme x*y (x1*x2 ??) mit als Basispolynom in die Gleichung aufgenommen werden? Kann man das nicht auch einfach weglassen, so wie ich es in meinem Beispiel oben gemacht habe?
Könntest Du mir evtl. mal die Seiten aus Deinen Unterlagen per Mail zukommen lassen, um dass ich besser den math. Hintergrund verstehe?
-
-
F98 schrieb:
Warum müssen eigentlich Deiner Angabe nach die Terme x*y (x1*x2 ??) mit als Basispolynom in die Gleichung aufgenommen werden? Kann man das nicht auch einfach weglassen, so wie ich es in meinem Beispiel oben gemacht habe?
Nein, kannst du nicht. Ohne diese Parameter kannst du zum Beispiel bei quadratischen Polynomen die Funktion nicht mehr rotieren. Das ist schlecht, wenn deine Funktion eine Ellipsenförmige Parabel als Form hat, die schräg im Raum liegt - da kommst du einfach nicht hin ohne den x1*x2 Parameter. Stichwort: Kovarianzmatrix und Gaussverteilung. Da siehst du ziemlich gut, was diese Parameter leisten. Kannst du auch schnell selbst testen. Rotiere folgede Matrix um einen beliebigen Winkel:
A=[c1,0] [0,c2]
Schaue dir dann an, was mit den Parametern die vorher 0 waren passiert. das ist dein (x1*x2) Parameter.
Könntest Du mir evtl. mal die Seiten aus Deinen Unterlagen per Mail zukommen lassen, um dass ich besser den math. Hintergrund verstehe?
Uff. Das ist da nur kurz zusammengefasst gewesen weil das nur ein Randthema war um ein anderes Problem zu lösen. Ich glaube nicht, dass das so viel bringt.
-
Ich hoffe, ich verstehe Dich nicht falsch.
Mein Ziel ist es nicht, die Matrix zu rotieren. Es geht mir nicht um die 3D-grafische Verarbeitung der Daten in einem Spiel, sondern es geht letzendlich nur um eine Wissensbasis, die bis dato in Form eines n-dimensionalen gerasterten, normierten Kennfeldes abgelegt ist. Eingangsgrößen sind x1-xn, Ausgangsgröße y. Zusammenhänge beschrieben als WENN X1, X2, X3 DANN Y.
Auf dieses Kennfeld werden nun die Eingangsdaten gegeben und zurück kommt die Ausgangsgröße (z.B. eine Stellgröße). Dahinter steht bis dato ein recht komplexer Algorithmus, der im n-dimensionalen Suchraum rödelt. Das kostet Zeit und v.a. Speicherplatz.
Einfacher wäre es oft, wenn man so ein Kennfeld, für technische Prozesse ausreichend, näherungsweise als Gleichung beschreibt. Das ist und muss kein Hexenwerk sein. Man setzt also die Eingangsgrößen einfach in die linearisierte Gleichung ein und bekommt (näherungsweise) y raus.
Schön ist es eben, wenn man nun nicht nur eine lineare Näherung als Fläche durch den Kennfeldraum hat, sondern auch einen Sattel oder leicht geschwungenen Ansstieg nachbilden kann, nichts kompliziertes wie zerklüftete 3D-Landschaften, denn techn. Prozesse sind rel. homogen.
Die Ermittlung der Koeffizienten der zugehörigen Gleichung kann da meinetwegen 5-10 min dauern ;), das macht man ja nur einmal im Vorfeld. Wenn man die Gleichung einmal hat, kann man diese rel. leicht auf einer C-Basierten Plattform verwenden. Sowas macht sich besser als einen komplexen Algo zu implementieren, der auch noch viel Speicher auf der Zielplattform verbraucht.
-
F98 schrieb:
Mein Ziel ist es nicht, die Matrix zu rotieren. Es geht mir nicht um die 3D-grafische Verarbeitung der Daten in einem Spiel
Mir auch nicht. Offensichtlich habe ich es nicht geschafft, meine Intention rüber zu bringen.
plotte mal folgende Funktion:
x^T*A*x mit x=(x1,x2), A=die Matrix aus dem vorherigen post und c1!=c2
das lässt sich auflösen in:
x^T*A*x=(c1*x1, c2*x2)*x=c1*x12+c2*x22und das ist, wie du zugeben musst eine ganz normale quadratische Funktion wie du sie auch hattest.
nun rotiere die Matrix A und löse die Gleichung nochmal auf. du wirst sehen, dass sie auf einmal komplexer wurde - der plot der Funktion aber bis auf die Rotation gleich ist. Das hat nichts mit 3D Verarbeitung zu tun, sondern dass man Funktionen im R^n entlang einer/mehrerer Achse(n) rotieren kann. Die Form bleibt die Selbe, nur eben rotiert. Warum ist das wichtig?
Stell dir vor, deine Daten sind primär so verteilt, dass A sie annähern kann - dann ist alles in Ordnung. Alternativ könnten sie aber auch genauso rotiert sein wie ichs hier gezeigt habe.
Dann kann aber A die Daten nicht mehr länger annähern, weil A keine Rotation kennt.Nebenbei: So wie du dein Problem beschrieben hast, bin ich mehr denn je für neuronale Netze und entsprechende Optimierungsalgorithmen. Das ist die klassische nichtlineare Regressionsaufgabe und neuronale Netze sind da eben unangefochten State of the Art - warum mit weniger begnügen?
-
otze schrieb:
Stell dir vor, deine Daten sind primär so verteilt, dass A sie annähern kann
Das tritt in der Regel ein, da die Daten rel. homogen verteilt sind und auch das Modell wenig/nicht zerklüftet (rel. ebene Fläche, Sattel)
otze schrieb:
Alternativ könnten sie aber auch genauso rotiert sein wie ichs hier gezeigt habe.
So wie ich das aber rauslesen kommt sowas gar nicht bei mir in Frage. Wenn eine Rotation der Daten im Raum um eine Achse stattfände müßte ja das Polynom komplett neu approximiert werden, da sich die Stutzstellen der Fläche gleichmäßig um eine Achse mit einem best. Drehwinkel verschoben hätten.
-
So wie ich das aber rauslesen kommt sowas gar nicht bei mir in Frage. Wenn eine Rotation der Daten im Raum um eine Achse stattfände müßte ja das Polynom komplett neu approximiert werden, da sich die Stutzstellen der Fläche gleichmäßig um eine Achse mit einem best. Drehwinkel verschoben hätten.
Du hast immer noch nicht verstanden, was ich gemeint habe.
Mach erstmal das, was ich dir vorhin als beispiel gezeigt habe. splotte die Funktionen, schau sie dir an. Und dann überleg, ob der parameter sinnlos ist. Wenn er etwas macht, was deine Funktion ohne ihn nicht könnte, dann ist er es nicht.
so, ich suche mal direkt ein Bild raus:
http://www.weberconnect.de/bjt4.gif
ich hoffe, du weißt wie man das ließt. Kannst du diese Funktion ohne den x*y Parameter annähern? (das ist eine gedrehte quadratische Funktion)