Nichtlineare Angleichung Kurve

Neue Frage »

Quako Auf diesen Beitrag antworten »
Nichtlineare Angleichung Kurve
Meine Frage:
Hallo. Als Softwareentwickler habe ich zuletzt mich mit dem Thema künstlich neuronale Netze beschäftigt und bin durch eine Diskussion mit einem Freund darauf gekommen, dass sich folgende Aufgabe auch mit einfacher Statistik lösen lassen sollte. Leider hab ich bis jetzt nur Beispiele zur Lösung des gegebenen Problems auf Basis der linearen Regression gefunden.

Problem: Folgende Punkte im Koordinatensystem sind gegeben:
X Y
1 2
2 5
3 12
4 14
5 14
6 12

Nun soll hierzu ein Polynom 2. Grades gefunden werden, welches sich den Punkten am stärksten nährt. Ich freue mich, wenn ihr mir helft. Danke

Meine Ideen:
Ich hab bereits mit der Methode der kleinsten Quadrate eine lineare Funktion berechnet der sich den Punkten stark annähert. Leider hab ich nur ein Polynom 1. Grades und würde gerne lernen wie ich weiter vorgehen muss um eine nicht lineare Ausgleichskurve zu berechnen
Finn_ Auf diesen Beitrag antworten »

Gegeben sind also feste Messwerte und der Modellansatz
.

Nach der Methode der kleinsten Quadrate bildet man nun die Summe der Fehlerquadrate:


Gesucht ist das Tripel , welches die Summe minimiert.

Offenbar ist differenzierbar, und daher

ein notwendiges Kriterium für ein lokales Minimum.

Dieses Gleichungssystem ist zu lösen.
Quako Auf diesen Beitrag antworten »

Vielen dank für die Antwort. Mein Problem ist ehrlich gesagt nun die Herangehensweise wie man die zu lösende Gleichung löst.

Vielen Dank für weitere Antworten
SM!LE Auf diesen Beitrag antworten »

(zu spät)
Hast du dir die Formeln für die lineare Regression selbst hergeleitet bzw. kennst du das Vorgehen mit der partiellen Ableitung?
Wenn ja dann geht das bei der quadratischen Regression auf die gleiche Art und Weise nur, dass deine Funkion sich jetzt quadratisch ist:



Dann gehst du auch wie bei der linearen Regression wieder mit der "Methode der kleinsten Fehlerquadrate" vor.

Deine Funktion lässt sich also wie folgt beschreiben:



Das ganze musst du jetzt partiell differenzieren nach a, b und c und die Ableitungen null setzen.

Also:







Dann hast du wieder ein Gleichungssystem, diesmal mit 3 Gleichungen und 3 Unbekannten und die Vorgehensweise ist wie bei der linearen Regression.
Finn_ Auf diesen Beitrag antworten »

Zunächst einmal ausmultiplizieren und dann alle Faktoren aus den Summen heraus, die nicht vom Laufindex abhängen. Das verringert den Berechnungsaufwand beträchtlich.

Nun die Ableitungen bilden. Die drei Ableitungen lassen sich zu einer vektorwertigen Funktion zusammenfassen, deren Nullstelle (0,0,0) gesucht ist. Man bekommt also eine Funktion , bei der mit gesucht ist. Auf dieses Problem lässt sich das mehrdimensionale Newton-Verfahren anwenden.
Finn_ Auf diesen Beitrag antworten »

Alternativ kann auch das Gradientenverfahren auf das ursprüngliche Optimierungsproblem angesetzt werden.
 
 
SM!LE Auf diesen Beitrag antworten »

Da ich nicht weiß wo genau du Probleme hast würde ich dir die Vorgehensweise bei einem Beispiel demonstrieren.

Als erstes musst du partiell differenzieren und die partielle Ableitung dann null setzen:



Dann multiplizierst du die beiden Klammerausdrücke miteinander und teilst beide Seiten durch 2.



Jetzt geht es darum die Summe aufzutrennen und alle Summenteile die ein enthalten auf die rechte Seite und alles andere auf die linke Seite zu bringen.



Und an dieser Stelle musst du nur noch deine Werte aufsummieren und für die jeweiligen Summen einsetzen.
Das wäre dann eine der drei Gleichungen für das Gleichungssystem was du dann lösen musst.
Finn_ Auf diesen Beitrag antworten »

Oh, da kommt doch ein LGS raus. Hatte ich nicht gesehen.

Bei einer Polynomfunktion 3. Grades wäre es dann nicht mehr so einfach.
mYthos Auf diesen Beitrag antworten »

Das Ganze ist auch so schon ziemlich rechenintensiv.
Immerhin müssen die Summen ermittelt werden.
Bei einer Funktion 3. Grades erhöht sich dann der Rechenaufwand entsprechend (Grad 6 und 11 Summen).

Vorgeschlagen wird, dazu ein Tabellenkalkulationsprogramm zu benützen, um damit wenigstens das Gleichungssystem zu erstellen.

Allgemein lautet dieses (nach Ableitung und Trennen, die Summen gehen von k = 1 bis n)






-----------------------------------------------------------------------------

Im gegenständlichen Beispiel:






-------------------------------------------

Dabei kann man noch von Glück sagen, dass die Werte hier ganzzahlig sind.
Die (manuelle) Lösung dieses Systems steht noch auf einem anderen Blatt.
In heutigen Zeiten erledigt man das Ganze ohnehin mit einem CAS.

[attach]49146[/attach]

mY+
Quako Auf diesen Beitrag antworten »

Hallo mYthos,

wäre es möglich das von dir erstellte Excelsheet zu erhalten? Ich stelle mich wohl bei der Berechnung der Koeffizienten (a,b,c) zu blöd an.

Vielen Dank euch Allen!
Steffen Bühler Auf diesen Beitrag antworten »

Ich hab das hier mal erklärt.

Viele Grüße
Steffen
SM!LE Auf diesen Beitrag antworten »

Zitat:
Original von mYthos

Im gegenständlichen Beispiel:








@Quako: mYthos hat dir doch das fertige LGS schon aufgestellt. Wenn du das jetzt einfach löst, dann hast du deine Variablen a, b und c.
mYthos Auf diesen Beitrag antworten »

Zitat:
Original von Quako
Hallo mYthos,

wäre es möglich das von dir erstellte Excelsheet zu erhalten? ...


Gerne. Hole es dir aus dem im Anhang befindlichen ZIP-Archiv.
----------

Dazu ist zu sagen, dass ich die in Excel implemenierte Trendfunktion zunächst bewusst nicht verwendet habe, um offenkundig zu machen, wie die Methode des Minimierens der Fehlerquadrate im Einzelnen funktioniert.
Es wurden also alle erforderlichen Summen berechnet und damit das lineare Gleichungssystem erstellt.

Das geht allerdings nur bei Polynomfunktionen.
In anderen Fällen, z.B. bei der Funktion oder , usw., wird man zwar auch die Fehlerquadrate minimieren, dies und die Auflösung des zugehörigen Gleichungssystemes jedoch mit dem Solver erledigen.

Letzteres wurde im linken oberen Teil des Sheets gemacht, d. h. die Summe der Fehlerquadrate mittels Solvers - Zielwersuche minimiert und damit die Koeffizienten a, b, c des quadratischen Polynomes berechnet.
Die Anfangswerte der Koeffizienten a, b, c sollten aber vorher (grob) im erwarteten Schätzbereich liegen. Ansonsten kann es sein, dass das Verfahren unter Umständen nicht konvergiert.

Dies alles oben Beschriebene kann - bei bestimmen Funktionstypen - auch "automatisch" - im Verborgenen - mittels der Funktion "Trendlinie hinzufügen", polynomisch, Reihenfolge 2" bewerkstelligt werden, wie es Steffen in dem zitierten Beitrag beschrieben hat. Man hat dabei allerdings keine Ahnung, was sich dabei im Hintergrund abspielt.

Vor dem Zeichnen der Trendfunktion klicke undbedingt noch vorher in "Optionen" die Option "Gleichung (und Bestimmtheitsmaß) im Diagramm darstellen" an, sonst siehst du außer dem Graphen gar nichts.

Die dann angegebene Gleichung ist eakt auch identisch mit jener der zuvor berechneten.

Anmerkung:
Die Möglichkeit "Trendlinie hinzufügen" ist nur für bestimmte Funktionstypen gegeben, wie man dann sieht.
Die Methode Minimieren der Fehlerquadrate und Lösung mit dem Solver funktioniert hingegen mit (fast) allen erdenklichen Funktionen, deren "Gerüst" man ja selbst zu erstellen hat.
--------------
Auch in GeoGebra gibt es die Möglichkeit zur Bestimmung der Regressionsfunktion.
In deinem Fall geschieht dies hier recht einfach mit TRENDPOLY(Liste von Punkten,Grad des Polynoms)

[attach]49147[/attach]

mY+
Finn_ Auf diesen Beitrag antworten »

Alternative Musterlösung:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
from numpy import matrix, array, arange
from numpy.linalg import solve

def regression_quadratic(data):
    n = len(data)
    sx = sum(x for [x,y] in data)
    sx2 = sum(x**2 for [x,y] in data)
    sx3 = sum(x**3 for [x,y] in data)
    sx4 = sum(x**4 for [x,y] in data)
    sy = sum(y for [x,y] in data)
    sxy = sum(x*y for [x,y] in data)
    sx2y = sum(x**2*y for [x,y] in data)

    A = matrix([
        [sx4,sx3,sx2],
        [sx3,sx2,sx],
        [sx2,sx,n]
    ])
    v = array([sx2y,sxy,sy])
    [a,b,c] = solve(A,v)
    return {
        "a": a, "b": b, "c": c,
        "f": lambda x: a*x**2+b*x+c
    }

def regression(data):
    import matplotlib.pyplot as plot

    t = regression_quadratic(data)

    print("a = {}".format(t["a"]))
    print("b = {}".format(t["b"]))
    print("c = {}".format(t["c"]))

    [x,y] = zip(*data)
    plot.plot(x,y,'o',color='black')

    x = arange(0,7,0.1)
    plot.plot(x,t["f"](x),color='black')

    plot.show()

data = [[1,2], [2,5], [3,12], [4,14], [5,14], [6,12]]
regression(data)
Quako Auf diesen Beitrag antworten »

Ich hab es meines Erachtens nun verstanden. Auch auf Basis einer zweiten Wertemengeerscheint meine Lösung zu stimmen.

Ich danke euch Allen für eure Beiträge und freu mich schon auf die nächste Frage mit der ich mich an euch wenden werde.

Viele Grüße!
Quako Auf diesen Beitrag antworten »

Zitat:
Original von mYthos
...

Allgemein lautet dieses (nach Ableitung und Trennen, die Summen gehen von k = 1 bis n)








mY+





Blöde Frage im Nachgang jetzt nochmal. Wo ich mehr Zeit hatte es mir anzuschauen sind mir noch 2 Fragen geblieben:

1.) Gibt eine eine einfache Erklärung, weshalb die zitierte Formel die Lösung ist? Also woher stammt diese und wie kam es zu dieser Formel?
2.) Wie würde ich das ganze für den 3. Polynomgrad weiterführen.

Ich krieg die Berechnung nun mittlerweile hin (mit den genannten Formeln) würde aber gern verstehen wieso es so funktioniert. Die Formel für die lineare Regression war ja doch erheblich anders.

PS: Da ich die Formel im oberen Post komplett zerschossen habe, kann dieser gerne entfernt werden. Sorry dafür.

Viele Grüße
mYthos Auf diesen Beitrag antworten »

Im Prinzip ist die Herleitung bei der linearen Regression analog, sie geht nur einfacher.
In allen Fällen ist immer die Summe der Differenzenquadrate zu minimieren und ein Gleichungssystem zu lösen.
-----------

Die zitierte Formel gewinnt man mittels der o. g. Schritte.
Im Großen und Ganzen:




; bei Null setzen durch 2 div. und innere Ableitung beachten.


------------------------------------------

Koeff. ausklammern und Summen nach Potenzen anschreiben, Null setzen:


=====================




------------------------------------------


=====================




------------------------------------------


===================

Damit sind die 3 Gleichungen des Systems erstellt.
--------

Bei einem Polynom 3. Grades macht man dies analog, beginnt daher mit







-------------------------------------------------


=========================

Wie die anderen 3 Gleichungen noch zu erstellen sind, wird dir jetzt sicher klar sein.
Es ist dann ein lin GlS mit den 4 variablen a, b, c, d aufzulösen.
Die manuelle Rechnung will ich jetzt nicht wirklich machen, in Excel geht das mit dem Solver kurz und schmerzlos.

Wie man mit dem Solver arbeitet (Zielzelle, veränderbare Zellen bestimmt, etc.) wurde beispielsweise hier erklärt.

Der Solver wird über das Menu "Extras" (Excel 2003) bzw. "Daten"-"Solver" (Excel 2010) aufgerufen.
Die Zielzelle ist die Summe der quadrierten Abweichungen (im Solver Minimum einstellen), die veränderbaren Zellen sind jene, in denen die Parameterwerte a, b, c, .. stehen.
Als Anfangswerte für a, b, c, d setze -0,2, 1, 3 und -2 ein.

Die Iteration wird durch Klicken auf den "Lösen"-Button gestartet.
----------

[attach]49149[/attach]

Wenn du dennoch mit den Summen und dem Gleichungssystem rechnen willst, erweitere das erste dir gesendete Excel-Sheet mit den Spalten und erstelle damit das lin GlSystem.

mY+
Neue Frage »
Antworten »



Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »