Lineare Regression – Methode der kleinsten Fehlerquadrate

Das Javascript dieser Seite setzt ein von Carl Friedrich Gauß entwickeltes Verfahren um, mit dem beliebige Wertepaare durch eine Linearkombination quasi beliebiger Terme approximiert werden können. Es werden die gefundenen Koeffizienten angezeigt sowie die Funktion und die Standardabweichung. In einem eigenen Fenster werden der Graph der Funktion und die gegebenen Wertepaare (rote Punkte) dargestellt. Darüber hinaus können aufgrund der gefundenen Funktion beliebige neue Werte berechnet werden. Unten auf dieser Seite können komplette Wertetabellen, auch zum direkten Exportieren in ein Tabellenverarbeitungsprogramm o.ä., erstellt werden.

Alle Begriffe und das Verfahren selbst mit ausführlichem Beispiel sowie die Verwendung des Programmes werden detailliert erläutert. Zur Herleitung des Verfahrens →siehe hier.

 

Wertepaare x y

Terme

Regressionskoeffizienten und -funktion


Wertepaare
                 
x=

Hinweise zur Eingabe  •   Übersicht Matheseiten  •   Biographie C. F. Gauß  •   Wertetabelle erzeugen


Das Plotter-Applet ("canvas"-Element, html5) kann nicht angezeigt werden.

Zoomen: hinein mit Shift+Maustaste, hinaus mit Strg+Maustaste — Bereich verschieben: bei gedrückter Maustaste ziehen


© Arndt Brünner, Gelnhausen • Version: 5. 1. 2011  •   eMail
html5-Version: © Arndt Brünner, 14. 12. 2019

Lineare Regression

Es kommt häufig vor, daß man zu gegebenen Wertepaaren (x|y) — z.B. Meßwerten — eine Funktion f(x) sucht, bei der für alle Wertepaare möglichst genau f(x)=y gelten soll.
Für die Wertepaare (-1|0), (0,4|-0,84) und (2|3) ist dies beispielsweise die um 1 nach unten verschobene Normalparabel f(x)=x2–1. Diese Kurve geht genau durch alle drei Punkte. Zu n Punkten kann man stets ein Polynom vom Grade n-1 finden, dessen Graph durch alle Punkte geht.

Klicke hier, um eine Seite zu laden, auf der dies mithilfe eines Java-Applets interaktiv ausprobiert werden kann.

Nun ist aber Genauigkeit nicht immer die wesentlichste Forderung an die gesuchte Funktion. Oftmals sucht man eine einfache Funktion, deren Graph im Durchschnitt sehr nahe an allen Punkten liegt.

Bei Messungen treten häufig Meßfehler auf. Eine große Zahl leicht gestreuter Meßwerte kann das Auffinden einer möglicherweise sehr einfachen zugrundeliegenden Funktion sehr erschweren, denn hier kann man ja davon ausgehen, daß die gemessenen Werte nicht genau auf der Kurve der eigentlich bzw. möglicherweise zugrundeliegenden, einfachen Funktion liegen werden.

Die Gaußsche Methode der kleinsten Fehlerquadrate ermöglicht das Ermitteln von Funktionen F, die gegebene Wertepaare optimal, d.h. mit kleinstmöglicher Abweichung annähern. Sie sind vom Typ F(x) = a·f(x) + b·g(x) + c·h(x) + ....

Die Variablen a, b, c ... stehen dabei für konstante Koeffizienten, und die Funktionen f(x), g(x), h(x) ... für beliebige Funktionsterme der Unbekannten x. Ob geeignete Koeffizienten a, b, c ... gefunden werden können, hängt maßgeblich von der Wahl dieser Funktionsterme ab. Da das Multiplizieren mit einer Variablen ein "linearer" Vorgang ist, nennt man die kombinierte Summe solcher Terme eine Linearkombination.

Polynome sind einfache Beispiele für Funktion, die Linearkombinationen aus Funktionstermen sind, beispielsweise: F(x) = 3x2 - 2x + 7. In diesem Beispiel wären die Koeffizienten a=3, b=-2 und c=7, und die einzelnen Funktionen wären f(x)=x2, g(x)=x und h(x)=1. Letzteres bewirkt, daß der letzte Koeffizient ein konstanter Summand, ein einzelnes lineares Glied, ist.

Nun können die Teilfunktionen auch wesentlich komplizierte Terme sein; einzige Bedingung ist, daß die zu findende Funktion F eine sogenannte Linearkombination aus diesen Funktionen ist, also eine Summe aus konstanten Vielfachen der Teilfunktionen.

Diese konstanten Faktoren können mit der erwähnten Methode der kleinsten Fehlerquadrate ermittelt werden, auf deren Herleitung hier nicht weiter eingegangen werden soll. Zur Herleitung siehe →diese Seite. Hier soll die konkrete numerische Anwendung der Methode dargestellt werden, die der Funktionalität dieses Javascripts zugrundeliegt.

Zur Berechnung der Parameter a, b, c usw., die im folgenden k1, k2 usw. genannt werden, muß eine Koeffizentenmatrix nach folgendem Schema erstellt werden. Die fi(x) sind die Teilfunktionsterme.
Die ganz spezielle Bedeutung der eckigen Klammern wird gleich noch erklärt.

[f1(x)·f1(x)] [f1(x)·f2(x)] [f1(x)·f3(x)] [f1(x)·f4(x)]    ...    [f1(x)·fn(x)] [y·f1(x)]
[f2(x)·f1(x)] [f2(x)·f2(x)] [f2(x)·f3(x)] [f2(x)·f4(x)] ... [f2(x)·fn(x)] [y·f2(x)]
[f3(x)·f1(x)] [f3(x)·f2(x)] [f3(x)·f3(x)] [f3(x)·f4(x)] ... [f3(x)·fn(x)] [y·f3(x)]
[f4(x)·f1(x)] [f4(x)·f2(x)] [f4(x)·f3(x)] [f4(x)·f4(x)] ... [f4(x)·fn(x)] [y·f4(x)]
... ... ... ... ... ... ...
[fn(x)·f1(x)] [fn(x)·f2(x)] [fn(x)·f3(x)] [fn(x)·f4(x)] ... [fn(x)·fn(x)] [y·fn(x)]

Die eckigen Klammern symbolisieren die sogenannten Gauß-Summen. Man gewinnt sie, indem man alle gegebenen Werte nacheinander in den eingeklammerten Term einsetzt und die Ergebnisse addiert:

[y·f2(x)] = Σ(yi· f2(xi))


 
 

Nun muß die Koeffizientenmatrix durch geeignete Zeilenumformungen in die Form
 1  0  0  0  ...  ...  k1 
 0  1  0  0  ... ... k2 
 0  0  1  0  ... ... k3 
 0  0  0  1  ... ... k4 
 ...  ...  ...  ...  ... ... ... 
 0  0  0  0  ... 1 kn 
                

Eine Erklärung des Lösungsverfahrens (an interaktiven Beispielen) und einen Rechner zum Lösen finden Sie über diesen Link.
Im Eingabefeld der verlinkten Seite können auch reine Koeffizientenmatrizen eingegeben werden. (Diese Möglichkeit wird dort nicht beschrieben.)

gebracht werden. Dann sind k1, k2, k3 ... bis kn die gesuchten Koeffizienten der Teilfunktionen, und F(x) = k1·f1(x) + k2·f2(x) + k3·f3(x) + ...+ kn·fn(x) ist die gesuchte Funktion, die die gegebenen Werte mit minimalem Fehler approximiert.

Diesen Fehler gibt man in der Standardabweichung an, die sich berechnet aus der Quadratwurzel aus der Summe der Quadrate der Einzelabweichungen für jedes Wertepaar vom durch die Funktion erzeugten Wert, dividiert durch die Zahl der Messungen:

 


Beispiel:

Gegeben seien (wie im obigen Bsp.) die Wertepaare (-1|0), (0,4|-0,84) und (2|3). Es soll eine Funktion F(x)=a·x2 + b·x + c gefunden werden, die durch die Punkte geht. (Da nur drei Punkte mit unterschiedlichen x-Werten gegeben sind, ist das ohne Abweichung möglich.)

Es sei also f1(x):= x2 und f2(x):= x und f1(x):= 1.

Die erforderliche Matrix hat die Größe 3×4 und stellt sich so dar:

[f1(x)·f1(x)] [f1(x)·f2(x)] [f1(x)·f3(x)] [y·f1(x)]
[f2(x)·f1(x)] [f2(x)·f2(x)] [f2(x)·f3(x)] [y·f2(x)]
[f3(x)·f1(x)] [f3(x)·f2(x)] [f3(x)·f3(x)] [y·f3(x)]

Die fi(x) werden durch die Funktionsterme ersetzt

[x2·x2] [x2·x] [x2·1] [y·x2]
[x·x2] [x·x] [x·1] [y·x]
[1·x2] [1·x] [1·1] [y·1]

... was sich glücklicherweise vereinfacht zu:

[x4] [x3] [x2] [y·x2]
[x3] [x2] [x] [y·x]
[x2] [x] [1] [y]

Nun werden die Gauß-Summen berechnet:

[x4] = (-1)4 + 0,44 + 24 = 17,0256
[x3] = (-1)3 + 0,43 + 23 =  7,064
[x2] = (-1)2 + 0,42 + 22 =  5,16
[x] = -1 + 0,4 + 2 = 1,4
[1] = 1 + 1 + 1 = 3   (für jedes gegebene Wertepaar einen Summanden!)
[y·x2] = 0·(-1)2 - 0,84·0,42 + 3·22 = 11,8656
[y·x] = 0·(-1) - 0,84·0,4 + 3·2 = 5,664
[y] = 0 - 0,84 + 3 = 2,16

Dies ergibt also letztlich diese Matrix:

17,02567,0645,1611,8656
7,0645,161,45,664
5,161,432,16

Nach dem Gaußschen Eliminationsverfahren wird zunächst durch Division aller Zahlen der ersten Zeile durch 17,0256 das Diagonalelement zu 1 gemacht:

10,4149046142280,3030730194530,696926980547
7,0645,161,45,664
5,161,432,16

Dann werden die ersten Spalten der zweiten und dritten Zeile zu 0 gemacht, indem das 7,064- bzw. 5,16-fache der ersten Zeile subtrahiert wird:

10,4149046142280,3030730194530,696926980547
02,229113805094-0,7409078094160,740907809416
0-0,7409078094161,436143219622-1,436143219622

Nun wird die zweite Zeile durch den Wert ihres Diagonalelements (2,2911...) dividiert:

10,4149046142280,3030730194530,696926980547
01-0,3323777403040,332377740304
0-0,7409078094161,436143219622-1,436143219622

Das zweite Element der ersten und dritten Zeile wird durch Subtraktion des jeweils geeigneten Vielfachen der zweiten Zeile (Faktoren 0,4149... für die erste und -0,7409... für die dritte Zeile) zu 0 gemacht:

100,4409780775720,559021922428
01-0,3323777403040,332377740304
001,189881956155-1,189881956155

Die dritte Zeile wird normalisiert (Division durch 1,18988...):

100,4409780775720,559021922428
01-0,3323777403040,332377740304
001-1

Die dritten Spalten der ersten beiden Zeilen werden durch Subtraktion geeigneter Vielfacher der dritten Zeile eliminiert:

1001
0100
001-1

In der letzten Spalte stehen die gesuchten Koeffizienten der Funktionsterme: k1=1, k2=0 und k3=-1, womit sich die Funktion f(x) = x2 - 1 ergibt.

→ Seite zum Gaußschen Eliminationsverfahren mit Erklärungen an interaktiven Beispielen


Das Javascript dieser Seite setzt diesen Algorithmus um. Beliebige Wertepaare können durch eine Linearkombination quasi beliebiger Terme approximiert werden. Es werden die gefundenen Koeffizienten angezeigt sowie die Funktion und die Standardabweichung. In einem eigenen Fenster werden der Graph der Funktion und die gegebenen Wertepaare (rote Punkte) dargestellt. Darüber hinaus können aufgrund der gefundenen Funktion beliebige neue Werte berechnet werden. Unten auf dieser Seite können komplette Wertetabellen, auch zum direkten Exportieren in ein Tabellenverarbeitungsprogramm o.ä., erstellt werden.


zum Rechner 

Hinweise zur Eingabe

Vorgehensweise

Geben Sie im linken, großen Feld Wertepaare ein und im mittleren Feld zeilenweise die Terme, aus denen sich per Linearkombination die Regressionskurve zusammensetzen soll. Auch aus dem Listenfeld unter dem mittleren Eingabefeld können diverse Standardfunktionen und -terme gewählt werden, was etwa bei Polynomen die Schreibarbeit erspart.

Nach Festlegen von Werten und Funktionen betätigen Sie die Schaltfläche [Regression], um die Analyse zu starten. Das Javascript findet die Linearkombination aus den angegebenen Funktionstermen mit der minimalen Abweichung zwischen den gegebenen y-Werte und den berechneten Funktionswerten. Im rechten, großen Feld wird das Ergebnis angezeigt. Nach der Analyse können im Feld rechts unten beliebige Funktionswerte berechnet werden.

Detailliertere Erläuterungen im folgenden Abschnitt.

zum Rechner 

Wertepaare

Die Werte können fortlaufend in der Form x1 y1 x2 y2 x3 y3 ... oder auch zeilenweise eingegeben werden:
  x1 y1
  x2 y2
  x3 y3
  ...

Während der Regressionsanalyse wird das Eingabefeld in diese zeilenweise Form standardisiert, und die Wertepaare werden zusätzlich automatisch nach steigenden x-Werten sortiert.

Als Trennzeichen zwischen den Werten sind zulässig: Leerzeichen, Semikolon, Tabulator, senkrechter Strich |, Schrägstrich / und Zeilenvorschub. Eine sinnvolle Approximierung kann in der Regel nur gefunden werden, wenn mindestens soviele Wertepaare vorliegen, wie Koeffizenten von Teilfunktionen bestimmt werden sollen.

Zum Ausprobieren gibt es die Möglichkeit, per Zufallsgenerator Wertepaare erzeugen und anzeigen zu lassen. Diese liegen zwischen -10 und 10. Da sie wahllos und im Mittel gleichmäßig in diesem Quadrat verteilt liegen, ist diese Funktion eigentlich nur von geringem Nutzen und dient lediglich der Veranschaulichung.

zum Rechner 

Terme

In das zweite Feld werden zeilenweise die Terme der gewünschten Teilfunktionen mit der Variablen x eingegeben. Einige Standardfunktionen lassen sich auch durch das Listenfeld unterhalb des Eingabefeldes auswählen und automatisch eintragen. "Polynom 5" bedeutet dabei: Polynom vom fünften Grad; also werden hier die Koeffizienten (a, b,d, d, e, f) dieser Funktion bestimmt: F(x)=ax5+bx4+cx3+dx2+ex+f.

Die in das Fenster einzugebenden Teilfunktionen sind dabei x5, x4 usw. Ein linearer Summand, d.h. ein einzelner, konstanter Koeffizient in der Funktion ohne x, wie in diesem Beispiel der letzte Koeffizient f, kann durch den eigegebenen Term "1" berechnet werden. a·x5 ist das a-fache von x5, und f ist das f-fache von 1.

Das Javascript beherrscht die Grundrechenarten + - * /, einschließlich der Potenzierung ^, sowie die Funktionen sin, cos, tan, ln oder log (beides natürlicher Logarithmus), exp, sqr, atan, asin, acos, sinh(x), cosh(x), tanh(x), asinh(x), acosh(x), atanh(x), int (Ganzzahl), abs (Absolutwert).

Die zu verwendende Syntax ist die BASIC-Syntax. Bei der Eingabe die Javascript- oder C-Syntax zu verwenden, führt in der Regel zu einem Fehler, da die Eingaben intern umgewandelt werden, z.B. von x^2 in Math.pow(x,2) oder von sqr(x) in Math.sqrt(x). Die Eingabe Math.sqrt(x) würde umgewandelt werden in Math.Math.sqrtt(x), was natürlich zu einem Fehler führt.

Mit (pi) und (e) stehen auch diese beiden Konstanten zur Verfügung. Klammerung, auch beliebig verschachtelt, wird erkannt. Dabei dürfen allerdings nur runde Klammern, verwendet werden, z.B.: log(x^(10/(2-sin(x)))+1).

Hinweis:
Die vom Programm zu erzeugende und zu berechnende Matrix hat die Größe n × (n+1). Für jedes Feld der Matrix oberhalb der Diagonale muß eine Gauß-Summe mit allen Werten berechnet werden. (Die unteren Felder sind aufgrund der Symmetrie identisch.) Da Javascript eine interpretierte Sprache ist, müssen dabei jedesmal die Funktionen neu "übersetzt" werden. Das kann erhebliche Rechenzeit kosten!

zum Rechner 

Regressionskoeffizienten und -funktion

In diesem dritten Feld erscheinen schließlich die Ergebnisse der Regressionsanalyse, die durch den Klick auf die Schaltfläche unterhalb des Feldes gestartet wird. Zuerst werden die Linear-Koeffizienten der Einzelfunktionen aufgelistet, und zwar genau zugehörig den im mittleren Feld gegenüberstehenden Termen. Dann folgt die gefundene Funktion, die zur bequemeren Weiterverarbeitung einzeilig ausgegeben wird, so daß gegebenenfalls gescrollt werden muß, um sie ganz zu sehen. Die Koeffizienten werden auf die Zahl Dezimalstellen gerundet, die im Textfeld unterhalb des Ausgabefensters festgelegt ist. Wenn in der Funktion ein Term mit dem Koeffizienten 0 erscheint, so ist dieser in Wahrheit ungleich 0 und wird nur wegen der Rundung nicht angezeigt. Terme mit Koeffizienten gleich 0 (genauer: mit Betrag kleiner als 10-12) werden ausgelassen. Vorsicht: Bei Termen, die in oberster Priorität Summen oder Differenzen sind, wie x+1 oder sin(x)-1, müssen in manchen Fällen Klammern ergänzt werden, bevor der Ausdruck weiterverwendet werden kann, wenn dieser fehlerhaft, beispielsweise: 3,54 * sin(x)-1, ausgegeben wird. Richtig wäre natürlich 3,54 * (sin(x)-1). Das Script erkennt jedoch die allermeisten dieser Fälle selbst und ergänzt die Klammern. Solche Terme dennoch zur Sicherheit am besten schon bei der Eingabe einklammern.

Dann folgt die Standardabweichung, also der mittlere Fehler zwischen den gegebenen y-Werten und den berechneten f(x)-Werten, aus technischen Gründen S genannt (für Sigma Σ), da im html-Textfeld leider nicht zwischendurch auf den griechischen Zeichensatz umgeschaltet werden kann. Und schließlich die Liste der berechneten Funktionswerte zu allen gegebenen x-Werten. Zum Vergleich kann das Textfeld so weit gescrollt werden, bis die Funktionswerte auf gleicher Höhe mit den gegebenen Werten stehen.

Die Analyse schlägt fehl, wenn z.B. Funktionen verwendet werden, die für die gegebenen x-Werte nicht definiert sind, beispielsweise asin(2), log(0) oder sqr(-1). In diesem Fall erscheinen statt der Koeffizienten die Kürzel NaN für "Not a Number".

Unterhalb des Ausgabefensters steht ein Feld zur Verfügung, in das nach erfolgter und erfolgreicher Regressionsanalyse x-Werte eingegeben werden kann, um das entsprechende f(x) zu berechnen. Auch hier hängt die Rundung des Ergebnisses von der Angabe der gewünschten Dezimalstellen ab.

zum Rechner  •   zum Plottfenster


Wertetabelle erzeugen
Startwert:
Schrittweite:
Endwert:
Dezimalstellen:     formatiert:
     tabellarisch
     zum Exportieren

zum Rechner  •   zum Plottfenster