Die lineare Regression gehört zum Supervised Learning und dort im Speziellen zur Unterkategorie Regression. Das heißt, zur Anwendung der linearen Regression werden gelabelte Daten benötigt und der Output der linearen Regression ist ein numerischer Wert. Die lineare Regression beruht auf der Grundidee, den Zusammenhang zwischen den bekannten Features und der zu prädizierenden Variable durch eine lineare Funktion beschreiben zu können. Im folgenden Artikel stelle ich euch das Model der linearen Regression und der zugehörigen Kostenfunktion einmal genauer vor.
Diesen und andere Beiträge von mir kannst du als sauber formatierte PDF-Datei zum Ausdrucken oder offline Lesen erwerben. Mehr Informationen dazu findest du hier.
Zu diesem Artikel findest du auch ein Video von mir auf YouTube.
Nötige Vorkenntnisse
Zum Verständnis des Artikels solltet ihr eine grundlegende Vorstellung davon haben, was ein Modell im Kontext des Machine Learnings ist und wie man mit diesem eine Prädiktion berechnet. In diesem Artikel gehe ich genauer auf diesen Punkt ein.
In dem genannten Artikel wird auch ein Beispiel zur Prädiktion von Häuserpreisen erläutert, welches ich in diesem Artikel wieder aufgreife. Ich wiederhole das Beispiel daher hier kurz, wer mit dem Beispiel bereits bekannt ist, kann den folgenden Absatz einfach überspringen.
In dem genannten Häuserpreisbeispiel soll ein Machine Learning Modell entwickelt werden, welches die Preise von Häusern auf Basis der Größe des Hauses in Quadratmetern, der Anzahl der Stockwerke usw. vorhersagt. Die Daten, aus dem das Modell entwickelt werden soll, enthalten Informationen über bereits verkaufte Häuser. Insbesondere der Verkaufspreis, also die Größe, die das Modell prädizieren soll, ist also in diesen Daten enthalten. Die Performance des Modells wird über die (quadrierte) Abweichung zwischen dem prädizierten und wirklichen Verkaufspreis eines Hauses gemessen.
Um das vorgestellte Modell der linearen Regression verstehen zu können, solltet ihr grundlegende mathematische Kenntnisse von Funktionen und linearer Algebra haben.
Regression für eine skalare Variable
Beginnen wir mit dem Fall einer skalaren Variable $x$. Ich greife hier erneut das Beispiel mit dem Schätzen von Immobilienpreisen aus dem ersten Artikel dieser Reihe auf. Ich gehe davon aus, dass die Variable $x$ für die Wohnfläche eines Hauses steht und die Variable $y$ für den Verkaufspreis eines Hauses. Die Funktion $f(x)$ ist dann das gewählte Model, in unserem Fall das der linearen Regression. Damit ist $f(x)$ eine lineare Funktion in $x$ mit den beiden Parametern $\theta_0$ und $\theta_1$:
$f(x) = \theta_0 + \theta_1 x$
Betrachten wir dazu einmal ein Koordinatensystem wie in der unteren Abbildung links, auf der die Wohnfläche auf der x-Achse und der Preis des Hauses auf der y-Achse aufgetragen ist. Nehmen wir einmal an, dass wir die blauen Datenpunkte gegeben haben. Eine lineare Funktion $f(x)$, die die Datenpunkte möglichst genau abbilden soll, könnte dann wie in der unteren rechten Abbildung in grüner Farbe dargestellt aussehen. Konkret ergibt sich bei dieser Funktion ein Wert von 58.300 für $\theta_0$, welches man auch als y-Achsenabschnitt bezeichnet. Damit wäre ein Haus mit $0 m^2$ laut unseres Models 58.300€ wert. Das ist natürlich nicht wirklich realistisch, allerdings wird die Betrachtung von Häusern unter einer gewissen Größe sicherlich auch nicht praxisrelevant sein.
Für $\theta_1$ ergibt sich ein Wert von 1.300 € pro Quadratmeter, was gleichzeitig auch die Steigung der Funktion ist, siehe die untere Abbildung links. Somit wird laut unseres Modells ein Haus für jeden Quadratmeter mehr um 1.300€ teurer, was sich leicht durch das gezeigte Steigungsdreieck $\Delta x$ und $\Delta y$ nachvollziehen lässt, welches an dieser Stelle natürlich nicht maßstabsgetreu dargestellt ist. Eine Veränderung der Datenpunkte würde natürlich auch eine Veränderung in der Berechnung der linearen Regression und damit in den Parametern $\theta_0$ und $\theta_1$ der linearen Funktion bewirken, wie in der unteren Abbildung rechts zu sehen. Wie die beiden Parameter $\theta_0$ und $\theta_1$ bestimmt werden, verrate ich im folgenden Abschnitt.
Kostenfunktion
Zur Berechnung der beiden Parameter $\theta_0$ und $\theta_1$ wird eine Kostenfunktion aufgestellt, die ich im Folgenden Schritt für Schritt erläutern werde. Zunächst sei aber gesagt, dass der Sinn einer Kostenfunktion darin besteht, Abweichungen von der gewünschten Norm bzw. Lösung mit hohen Werten, in diesem Fall auch als Kosten bezeichnet, zu bestrafen. Dabei ist der Wert umso höher, je weiter entfernt man sich von der gewünschten Lösung befindet. Ist man dagegen nah an der gewünschten Lösung, so ist der Wert der Kostenfunktion niedrig, im Idealfall sogar null. Man kann es auch einfach so zusammenfassen:
Hohe Abweichung von der gewünschten Lösung $\Rightarrow$ hohe Kosten
Geringe Abweichung von der gewünschten Lösung $\Rightarrow$ niedrige Kosten
In der Regel werden Kostenfunktionen so konzipiert, dass nur positive Werte möglich sind, womit ein Wert von null somit den Idealfall darstellt. Dieser wird jedoch nur in speziellen Fällen erreicht, sodass man sich zumeist darauf konzentriert, eine Kostenfunktion so klein wie möglich werden zu lassen. Wie eine solche Kostenfunktion tatsächlich funktioniert und arbeitet, sollte im weiteren Verlauf des Artikels deutlich klarer werden.
Kostenfunktion der linearen Regression
Das Wertepaar $(x_i, y_i)$ steht für einen Datenpunkt, mit dem unser Modell trainiert werden soll. Betrachten wir dazu zunächst die Differenz zwischen $f(x_i)$ und $y_i$. Der Funktionswert $f(x_i)$ liegt auf der Funktion $f(x)$. Dies ist in der unteren Abbildung links einmal durch einen roten Punkt dargestellt. Die Differenz zwischen diesen beiden Punkten in y-Richtung, die ich mit $\Delta y_i$ bezeichne, ist somit auch die Differenz zwischen $f(x_i)$ und $y_i$:
$\Delta y_i = f(x_i)-y_i$
Statt $f(x_i)$ kann man an dieser Stelle nun auch die Funktionsvorschrift von $f(x)$ einsetzen, mit den beiden Parametern $\theta_0$ und $\theta_1$:
$\Delta y_i = \theta_0 + \theta_1x_i-y_i$
Man kann nun die beiden folgenden Fälle betrachte:
$\theta_0 + \theta_1 x_i > y_i ~~\Rightarrow~~ \Delta y_i > 0$
$\theta_0 + \theta_1 x_j < y_j ~~\Rightarrow~~ \Delta y_j < 0$
Dies ist auch noch einmal grafisch in der oberen rechten Abbildung dargestellt. Damit Abweichungen auf beiden Seiten des Graphen gleich behandelt werden und keine negativen Werte auftreten, wird die Differenz $\Delta y_i$ quadriert. Ohne die Quadrierung würden sich positive und negative $\Delta y$-Werte aufheben. Zudem soll eine Kostenfunktion, wie zuvor bereits erläutert, Kosten aufaddieren und keine negativen Werte aufweisen. Negative $\Delta y$-Werte würden daher den Sinn der Kostenfunktion verfehlen und zudem zu falschen Ergebnissen führen. Durch die Quadrierung der Werte wird dieses Problem gelöst.
Die Quadrierung hat zudem Vorteile bei der Berechnung der Ableitung, wie wir später noch sehen werden. Deshalb werden Kosten in der Regel quadriert und nicht einfach deren Betrag genommen. Denn die Ableitung eines Betrages ist numerisch betrachtet, aufgrund der Unstetigkeit der Ableitung, äußerst schwierig zu handhaben.
Im folgenden Schritt summieren wir die quadrierten Abweichungen $\Delta y_i$ miteinander über alle Datenpunkte, wobei $m$ die Anzahl der Datenpunkte beschreibt:
$J(\theta_0, \theta_1) = \frac{1}{2m} \sum\limits_{i=1}^m (\theta_0 + \theta_1x_i-y_i)^2$
Die Kostenfunktion wird mit $J(\theta_0, \theta_1)$ bezeichnet. Zusätzlich wird die Kostenfunktion mit dem Faktor $2m$ skaliert. Die Skalierung mit dem Faktor 2 ist eine Konvention, der in den meisten Fällen gefolgt wird. Diese Konvention kommt daher, dass bei der Bildung der Ableitung mit 2 multipliziert wird, da es sich um eine quadratische Funktion handelt. Diese Werte heben sich dann gegenseitig auf.
Die Skalierung mit der Anzahl der Datenpunkte $m$ dient zur Regularisierung der Kostenfunktion. Je mehr Datenpunkte man bei der Berechnung der Kostenfunktion zur Verfügung hat, desto größer wird folglicherweise die Summe der Abweichungen. Durch die Division mit $m$ erhält man sozusagen den quadrierten Fehler pro Datenpunkt und damit einen relativ gesehen kleinen Wert. Dies ist aus numerischer Sicht immer günstiger, da so starke Rundungsfehler oder gar Gleitkommaüberläufe vermieden werden. Den Punkt der Regularisierung hatte ich bereits im zweiten Artikel dieser Reihe bei der Aufbereitung der Daten angesprochen.
Die Minimierung der Kostenfunktion $J(\theta_0, \theta_1)$ bedeutet also, dass die Parameter $\theta_0$ und $\theta_1$ so bestimmt werden, dass die Kostenfunktion $J(\theta_0, \theta_1)$ einen möglichst kleinen Wert hat. Grafisch gesehen heißt das, dass die Abweichungen $\Delta y_i$, die in den obigen Abbildungen in Gelb dargestellt sind, ebenfalls möglichst klein sein sollten. Damit wird die Funktion $f(x)$ durch die beiden $\theta$ Parameter so bestimmt, dass diese möglichst exakt die blauen Datenpunkte abbildet.
Grafische Darstellung der Kostenfunktion
Um ein besseres Gefühl für diese Kostenfunktion zu bekommen, schauen wir uns diese einmal grafisch an. Dabei gehen wir der Einfachheit halber zunächst davon aus, dass der Wert für $\theta_0$ bereits auf 1.0 festgelegt wurde und somit konstant ist. Der Graph der Funktion $f(x)$ mit einem Wert von $0.1$ für $\theta_1$ würde dann wie auf der linken Seite dargestellt aussehen:
Betrachten wir dazu auch die blauen Datenpunkte und die entsprechenden Abweichungen in Gelb, welche in der Kostenfunktion aufsummiert werden. Auf der rechten Seite ist die Kostenfunktion $J(\theta_1)$ einmal grafisch dargestellt inklusive der zugehörigen Funktionsvorschrift. Für $\theta_1=0.1$, wie auf der linken Seite dargestellt, ergibt sich somit ein recht hoher Wert für die Kostenfunktion, dargestellt durch den roten Punkt in der rechten Abbildung.
Wird der Wert für $\theta_1$ jetzt auf $0.2$ erhöht, so sehen wir sowohl links durch die Verringerung der gelben Abstände, als auch rechts durch die Verringerung des Funktionswerts der Kostenfunktion $J(\theta_1)$, dass wir uns der Lösung annähern.
Genau das Gleiche geschieht bei der Erhöhung des Wertes von $\theta_1$ auf $0.3$ und schließlich auch bei der Erhöhung auf $0.4$.
Hier tritt einer dieser speziellen Fälle auf, bei der die Kostenfunktion tatsächlich den Wert $0$ erreicht. Alle Datenpunkte liegen auf einer Linie und werden exakt von der Funktion $f(x)$ durchlaufen. Wird der $\theta_1$ weiter schrittweise bis auf $0.7$ erhöht, so vergrößert sich sowohl der Abstand zwischen den Datenpunkten und der Funktion $f(x)$ als auch der Wert der Kostenfunktion $J(\theta_1)$.
Die optimale Lösung liegt also bei $\theta_1 = 0.4$, was zugleich das Minimum der Funktion $J(\theta_1)$ darstellt. An dieser Stelle ist es auch wichtig zu erwähnen, dass durch die Quadrierung der Terme, $J(\theta_1)$ ein eindeutiges globales Minimum hat und somit die Lösung relativ leicht bestimmt werden kann. Dies zeige ich auch noch einmal am Ende dieses Artikels. Dies gilt auch für den Fall, dass $\theta_0$ nicht konstant ist, was wir uns im Folgenden einmal anschauen.
Für den Fall von zwei Parametern $\theta_0$ und $\theta_1$ kann die Funktion $J(\theta_0, \theta_1)$ nur als dreidimensionaler Plot dargestellt werden, wobei die Höhe der Funktion den Wert der Kostenfunktion darstellt:
Dies ist zusätzlich durch die Farben, blau für niedrige und rot für hohe Werte, hervorgehoben. Dieser Plot ist nur beispielhaft zu verstehen und hat keinen direkten Bezug zu dem vorigen Beispiel. Bei einem realen Beispiel sind die Gradienten in manchen Richtungen zu gering, um diese richtig zu erkennen, was in meinen Augen für zu viel Verwirrung sorgen würde. Daher habe ich auf diesen beispielhaften Plot zurückgegriffen. Die rote Kugel in der Mitte des Plots stellt das Minimum dieser Funktion dar. Man kann es sich auch wirklich wie eine Kugel vorstellen, die vom höheren Rand immer zum Minimum der Funktion rollt. Wie zu sehen hat auch diese Funktion ein eindeutiges globales Minimum, genau wie die Kostenfunktion mit einem Parameter zuvor.
Lineare Regression für eine vektorwertige Variable
Betrachten wir nun den Fall, dass die Funktion $f(x)$ nicht über eine skalare, sondern über eine vektorwertige Variable $\bar{x}$ definiert ist. Um kenntlich zu machen, dass es sich bei $\bar{x}$ um einen Vektor handelt, nutze ich zur Notation einen kleinen Strich über der Variable. Somit bezeichnet auch nicht mehr der Vektor $\bar{x}$ die Wohnfläche des Hauses, sondern der Eintrag $x_1$. Der Eintrag $x_2$ könnte etwa die Anzahl der Stockwerke beschreiben und der Wert $x_n$ die Größe des Gartens. Dazwischen können sich noch beliebige weitere Werte bzw. Features befinden, sodass insgesamt $n$ Features existieren. Entsprechend vergrößert sich auch die Funktionsvorschrift $f(\bar{x})$ und die Anzahl der $\theta$ Parameter:
$f(\bar{x}) = \theta_0 + \theta_1 x_1 + \theta_2 x_2 + \ldots + \theta_n x_n$
Die Parameter $\theta$ können ebenfalls in einem Vektor $\bar{\theta}$ zusammengefasst werden, der ein $n+1$-dimensionaler Vektor ist:
$\bar{\theta} = \begin{bmatrix} \theta_0 \\ \theta_1 \\ \vdots \\ \theta_n \end{bmatrix} \in \mathbb{R}^{n+1}$
Genauso kann $\bar{x}$ zu einem $n+1$-dimensionalen Vektor zusammengefasst werden, wobei $x_0=1$ ist:
$\bar{x} = \begin{bmatrix} 1 \\ x_1\\ x_2 \\ \vdots \\ x_n \end{bmatrix} \in \mathbb{R}^{n+1}$
Durch diese Definition kann die Funktion $f(\bar{x})$ nun als Skalarprodukt der beiden Vektoren $\bar{\theta}$ und $\bar{x}$ zusammengefasst werden, wobei $\bar{\theta}$ dazu transponiert werden muss, was durch das hochgestellte T dargestellt wird:
$f(\bar{x}) = \bar{\theta}^T \bar{x}$
Die Kostenfunktion $J(\bar{\theta})$ kann somit ebenfalls in kompakter Form geschrieben werden. Achtet darauf, dass das tiefgestellte $i$ hier nicht für die einzelnen Features $x_1$, $x_2$ usw. steht, sondern für den $i$-ten Datenpunkt $(\bar{x}_{(i)}, y_{(i)})$. Zur Verdeutlichung habe ich dazu das $i$ in Klammern geschrieben:
$J(\bar{\theta}) = \frac{1}{2m} \sum\limits_{i=1}^m (\bar{\theta}^T \bar{x}_{(i)}-y_{(i)})^2$
Lösung der linearen Regression
Zum Abschluss dieses Artikels gehe ich darauf ein, wie die lineare Regression gelöst werden kann, also wie die Parameter $\bar{\theta}$ bestimmt werden können. Im Grunde gibt es dazu zwei Möglichkeiten: ein analytisches Verfahren über die sogenannte Normalengleichung, sowie ein iteratives numerisches Verfahren namens Gradient Descent. Da Gradient Descent auch später noch eine wichtige Rolle spielen wird und etwas umfangreicher ist, werde ich das in einem späteren Artikel genauer vorstellen. Ich zeige nun erst einmal die Normalengleichung.
Betrachten wir dazu einmal die oben genannte Kostenfunktion $J(\bar{\theta})$ und schreiben diese einmal in eine Matrixschreibweise um:
$J(\bar{\theta}) = \frac{1}{2m} (X \bar{\theta}-\bar{y})^T (X \bar{\theta}-\bar{y})$
Die Matrix $X$ hat dabei die folgende Form, wobei alle Werte für $x_{0, (j)}=1$ sind:
$ X = \begin{bmatrix} 1 & x_{1,(1)} & \ldots & x_{n,(1)} \\ 1 & x_{1,(2)} & \ldots & x_{n,(2)} \\ \ldots & \ldots & \ddots & \ldots \\ 1 & x_{1,(m)} & \ldots & x_{n,(m)} \end{bmatrix} \in \mathbb{R}^{m \times n+1}$
In einer Zeile befindet sich ein Datenpunkt mit seinen $n$ Features sowie der Wert $x_{0, (j)}=1$. Die Länge einer Spalte wird durch die Anzahl der Datenpunkte $m$ bestimmt. Somit ist $X$ eine $(m \times n+1)$-Matrix. Der Vektor $\bar{y}$ in der obigen Gleichung enthält die y-Werte aller Datenpunkte und ist somit ein m-dimensionaler Vektor:
$\bar{y} = \begin{bmatrix} y_{(1)}\\ y_{(2)} \\ \vdots \\ y_{(m)} \end{bmatrix} \in \mathbb{R}^{m}$
Wie ich bereits weiter oben im Artikel erläutert habe, ist es ja das Ziel, die Kostenfunktion $J(\bar{\theta})$ zu minimieren. Dies lässt sich am einfachsten dadurch erreichen, dass wir die Ableitung der Kostenfunktion gleich null setzen und dann nach $\bar{\theta}$ auflösen:
$\frac{\partial J}{\partial \bar{\theta}} = 0 $
Da es sich bei der Kostenfunktion $J(\bar{\theta})$ um eine quadratische Funktion handelt, gibt es für diesen Fall auch nur eine Lösung für $\bar{\theta}$, die eindeutig das globale Minimum beschreibt. Die Ableitung von $J(\bar{\theta})$ nach $\bar{\theta}$ sieht wie folgt aus:
$\frac{\partial J}{\partial \bar{\theta}} = \frac{1}{m} (X \bar{\theta}-\bar{y})^T \frac{\partial (X \bar{\theta}-\bar{y})}{\partial \bar{\theta}} = 0$
In den Quellenangaben am Ende dieses Beitrags findet ihr zwei Links, wenn ihr euch einmal genauer anschauen wollt, wie diese Ableitung gebildet wird. Letztlich handelt es sich aber nur um die Anwendung der Produktregel. Den Parameter $m$ können wir an dieser Stelle vernachlässigen, da wir mit ihm auf beiden Seiten der Gleichung multiplizieren können. Die innere Ableitung $\frac{\partial (X \bar{\theta}-\bar{y})}{\partial \bar{\theta}}$, die noch in der obigen Gleichung vorhanden ist, kann zu der Matrix $X$ vereinfacht werden:
$\frac{\partial (X \bar{\theta}-\bar{y})}{\partial \bar{\theta}} = X$
Da $X$ und $\bar{y}$ unabhängig von $\bar{\theta}$ sind, ist die Ableitung nach $\bar{\theta}$ an dieser Stelle ziemlich simpel. Ableitungen nach Vektoren erscheinen an dieser Stelle vielleicht etwas merkwürdig, aber wenn ihr das Ganze einmal in einzelne Gleichungen ausschreiben würdet, würdet ihr feststellen, dass sie sich nicht von den Ableitungen nach einem Skalar unterscheiden. Wir können damit die obige Gleichung nun also weiter vereinfachen zu:
$(X \bar{\theta}-\bar{y})^T X = 0$
Durch Transponieren auf beiden der Gleichung lässt sich $X$ auf die linke Seite bringen.
$\begin{align*} X^T (X \bar{\theta}-\bar{y}) &= 0 \\ X^T X \bar{\theta} &= X^T \bar{y} \\ \bar{\theta} &= (X^T X)^{-1} X^T \bar{y} \end{align*}$
Ein paar einfache Umformungen später erhalten wir eine analytische Gleichung für $\bar{\theta}$. Diese Gleichung bezeichnet man als Normalengleichung.
Die Matrix $(X^T X)^{-1}$ ist die sogenannte Inverse der Matrix $(X^T X)^{-1}$. Eine Matrix multipliziert mit seiner Inversen ergibt die Einheitsmatrix. Diesen Umstand hatten wir uns bei der letzten Umformung der Gleichung zunutze gemacht. Bei der Berechnung einer Inversen können jedoch einige Probleme auftreten. Zum einen kann es sein, dass verwendete Features linear abhängig voneinander sind. Das wäre etwa der Fall, wenn man die Wohnfläche eines Hauses einmal in Quadratmetern und einmal in Quadratzentimetern verwenden würde. In diesem Falle ließe sich die Inverse der Matrix $X^T X$ nicht berechnen. Man sagt dann auch, eine Matrix sei singulär.
Das gleiche Problem kann auftreten, wenn sehr viele Features $x_i$ verwendet werden, aber nur sehr wenige Datenpunkte zur Verfügung stehen. Generell sollte man mindestens so viele Datenpunkte wie Features besitzen, besser ist es aber ein Vielfaches an Datenpunkten im Vergleich zu Features zu besitzen. Das gilt generell für alle Modelle, denn so wird Overfitting, was ich im ersten Artikel dieser Reihe angesprochen hatte, vermieden. Ein weiteres Problem, was bei zu viele Features auftreten kann, ist eine sehr hohe Rechenzeit bei der Berechnung der Inversen.
Eine Lösung für das Problem bei nicht berechenbaren Inversen kann die Berechnung der Pseudoinversen sein, die sich immer berechnen lässt. Ich möchte auf die Pseudoinverse an dieser Stelle aber nicht weiter eingehen. Unten in den Quellen verlinke ich einen entsprechenden Wikipedia Artikel für die Leser, die sich dort weiter informieren möchten. Eine andere Lösungsmöglichkeit zur Bestimmung der Parameter $\bar{\theta}$ der linearen Regression ist auf das bereits erwähnte Gradient Descent Verfahren zurückzugreifen.
Zusammenfassung lineare Regression
In diesem Artikel habe ich euch das Modell der linearen Regression vorgestellt. Auf Basis einer Kostenfunktion wird eine lineare Funktion ermittelt, um einen Zusammenhang zwischen den Features $\bar{x}$ und der Target-Variablen $y$ verschiedener Datenpunkte herzustellen. Wird eine quadratische Kostenfunktion gewählt, so wie sie hier vorgestellt wurde, dann besitzt die lineare Regression eine eindeutige Lösung. Diese kann über ein analytisches Verfahren, die sogenannte Normalengleichung, sowie ein iteratives numerisches Verfahren namens Gradient Descent, ermittelt werden.
Weitere Informationen
In meinen Videos auf YouTube stelle ich dieses und weitere Machine Learning Themen noch einmal detaillierter vor. Bei Fragen oder Anmerkungen schreibt mir gerne einen Kommentar :).
Meine Webseite ist komplett werbefrei. Falls dir dieser Beitrag gefallen hat und du meine Arbeit gerne unterstützen möchtest, schau daher doch einmal auf meiner Support-Seite vorbei. Das würde mich sehr freuen :).
Quellen
Machine Learning Kurs von Andrew Ng auf coursera.org, der aber leider nicht mehr verfügbar zu sein scheint. Es gibt dort aber weitere Kurse von Andrew Ng (und anderen Dozenten) zu diesem Thema.
Herleitung Normalengleichung:
Towards Data Science
The Green Place
Pseudoinverse:
https://de.wikipedia.org/wiki/Pseudoinverse