Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
| kurse:efcomputergrafik:kw09 [2020/02/27 06:31] – Simon Knaus | kurse:efcomputergrafik:kw09 [2020/03/03 14:18] (current) – Simon Knaus | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ==== KW09 Ziele ===== | ||
| + | * Jede/r kennt was ein Regressions-/ | ||
| + | * Jede/r kann eine lineare Regression in Python und mit SciKit durchführen. | ||
| + | * Jede/r kennt die Begriffe Residuum, Residual Sum of Squares, feature space. | ||
| + | ==== Einführung ==== | ||
| + | * Vorstellung | ||
| + | * Kenntniserhebung | ||
| + | * Python | ||
| + | * Pythonumgebung | ||
| + | * Mathematik: Stochastik, Erwartungswert, | ||
| + | * Einstieg | ||
| + | * Clearview | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[http:// | ||
| + | * Aufgaben / Besprechung | ||
| + | === Informatik und Mathematik === | ||
| + | Die meisten Probleme der Thematik maschinelles lernen (<< | ||
| + | * Klassifikationsprobleme, | ||
| + | * Regressionsprobleme | ||
| + | zurückführen. | ||
| + | Im EF Computergrafik sprechen wir mehrheitlich von << | ||
| + | Wer die Thematik weiterverfolgen möchte, kann sich an diesen drei Büchern unten orientieren | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | |||
| + | === Formalisierung === | ||
| + | Mathematisch kann die Problematik auf folgende Gleichung heruntergebrochen werden: | ||
| + | \[ | ||
| + | f(X)=Y. | ||
| + | \] | ||
| + | $X\in\mathbb{R}^p$ ist ein Vektor. Die Menge $\mathbb{R}^p$ ist dabei der sogenannte << | ||
| + | |||
| + | Man unterscheidet dabei zwischen | ||
| + | * Regression: Ist $\mathcal Y\subset \mathbb R$, dann ist es **Regressions**problem. | ||
| + | * Klassifikation: | ||
| + | |||
| + | Die Probleme dabei, lassen sich wie folgt zusammenfassen | ||
| + | - Wie finde ich ein << | ||
| + | - Was ist << | ||
| + | |||
| + | Die Antwort auf die erste Frage, sind verschiedene Methoden. Im EF werden wir voraussichtlich folgende Methoden vertieft kennenlernen: | ||
| + | * Regression (Uni- und multivariat) als Brückenschlag zur normalen Mathe | ||
| + | * Smoothing-Splines als Brückenschlag zu Teil II | ||
| + | * $k$-nearest-neighbours als erste echte nicht-lineare Variante | ||
| + | * Neuronale Netze | ||
| + | |||
| + | Dass $X$ und $Y$ gross geschrieben werden, hat damit zu tun, dass beide als Zuvallsvektoren verstanden werden. Zufallsvektoren sind Vektoren, welche aus Zufallsvariablen (Zufallsgrössen) bestehen. So ist $X=[X_1, | ||
| + | $Y$ ist üblicherweise $1$-dimensional. | ||
| + | |||
| + | |||
| + | === Gütekriterien === | ||
| + | |||
| + | Grundsätzlich ist immer die Idee, dass mein Modell $f$ möglichst genau den Wert der Variable $Y$ vorhersagt, wenn ich die zugehörigen Werte von $X$ kenne. Im Regressionskontext ist dies häufig, die mittlere quadratische Abweichung (residual sum of squares, RSS). | ||
| + | |||
| + | Gehen wir davon aus, dass wir $n$ Beobachtungen ($=$ Datenpunkte $\neq$ Zufallsvariable) $x_i=[x^1, | ||
| + | Man definiert dann | ||
| + | \[ | ||
| + | \text{RSS}(f)=\sum_{i=1}^n (f(x_i)-y_i)^2. | ||
| + | \] | ||
| + | Im einfachsten Fall suchen wir ein lineares $f$: Gehen wir von $x_i=[x^1]$ aus und einer linearen Funktion aus. Damit setzten wir voraus, dass $Y_i=\alpha+\beta X_i+\varepsilon_i$ ist. $\varepsilon_i$ ist dabei ein Fehlerterm, der die Ungenauigkeit des Modells << | ||
| + | |||
| + | Hat man die bekannten Grössen $x_i$ so kann man die Vorhersage $f(x_i)=\hat y_i$ berechnen (predicted value; prediction). Das Residuum ist dann einfach $\hat y_i-y_i$. | ||
| + | ==== Aufgaben ==== | ||
| + | === Einstiegsfragen === | ||
| + | - Welches sind Klassifizierungsaufgaben bei Clearview? Was ist der Feature Space? Was ist $|\mathcal{Y}|$? | ||
| + | - Welches sind Klassifzierungsaufgaben beim Slaugherbots? | ||
| + | |||
| + | === Regression === | ||
| + | Verwende für die nachfolgenden Aufgaben den folgenden Datensatz {{kurse: | ||
| + | |||
| + | == Univariate Lineare Regression == | ||
| + | - Setze ein Modell $y_i=f(x_i)=\beta x_i+\epsilon_i$ voraus, $y_i$ sind dabei die gefahrenen Kilometer und $x_i$ das Alter in Tagen. Bestimme $\beta$ so, dass $\sum_{i=1}^{n}(y_i-\beta x_i)^2=\text{RSS}(f)$ minimal ist, das heisst, leite eine Formel für $\beta$ her. | ||
| + | - Berechne $\beta$ in Python ohne Hilfsmittel, | ||
| + | - Verwende dann [[https:// | ||
| + | - Installiere zuerst scikit. Frage Ks oder eine/n der erfahrenen Programmierer/ | ||
| + | - Arbeite die Lösung unten Schritt für Schritt durch, falls du noch nicht klar kommst. | ||
| + | - Leite die Formel für $\alpha$ und $\beta$ im Modell $f(y_i)=\alpha+\beta x_i$ her: Das Prinzip ist dasselbe: Wir haben neu eine Funktion $f$, welche von $\alpha$ und $\beta$ abhängt, das heisst, um $\alpha$ und $\beta$ zu bestimmen, kann $f$ nach $\alpha$ und nach $\beta$ abgeleitet werden, beide gleich Null gesetzt werden und das Gleichungssystem aufgelöst werden. | ||
| + | - Berechne $\alpha$ und $\beta$ wiederum <<von Hand>> | ||
| + | - Du hast nun ein Modell: $y=f(x)=\alpha+\beta x$. Berechne Forecasts auf {{kurse: | ||
| + | |||
| + | <hidden Lösung Afg.1 > | ||
| + | |||
| + | Der Ausdruck $\sum_{i=1}^n (y_i-\beta x_i)^2$ ist eigentlich ein quadratisches Polynom in $\beta$. Die Werte $x_i$ und $y_i$ sind Zahlen und bekannt. Folglich kann man die Summe als Funktion von $\beta$ aufassen und ableiten. Leitet man dann also $f(\beta)=\sum_{i=1}^n (y_i-\beta x_i)^2$ ab, erhält man \[f' | ||
| + | \[ | ||
| + | \beta = \frac{\sum_{i=1}^n x_iy_i}{\sum_{i=1}^nx_i^2}. | ||
| + | \] | ||
| + | Das ist die übliche Formel für die Regressionsgerade __ohne__ Achsenabschnitt. | ||
| + | </ | ||
| + | |||
| + | <hidden Stub Afg. 2> | ||
| + | <code python | stubafg02.py> | ||
| + | import csv | ||
| + | path = " | ||
| + | |||
| + | #befehl um csv dateien zu lesen | ||
| + | datalist = list(csv.reader(open(path, | ||
| + | |||
| + | print(datalist[1]) | ||
| + | print(datalist[2][3]) | ||
| + | |||
| + | //schlaufe zum berechnen schreiben | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <hidden Lösung Afg. 3> | ||
| + | <code python> | ||
| + | import numpy as np | ||
| + | from sklearn.linear_model import LinearRegression | ||
| + | import matplotlib.pyplot as plt | ||
| + | |||
| + | #daten laden | ||
| + | path = " | ||
| + | |||
| + | data = np.loadtxt(fname = path, delimiter = ',' | ||
| + | #relevante spalten auswählen | ||
| + | x = data[:,8] | ||
| + | y = data[:,7] | ||
| + | |||
| + | #zähler und nenner definieren | ||
| + | num = 0.0 | ||
| + | den = 0.0 | ||
| + | for i in range(len(x)): | ||
| + | num += y[i]*x[i] | ||
| + | den += x[i]*x[i] | ||
| + | beta=num/ | ||
| + | print(beta) | ||
| + | |||
| + | #etwas weniger händisch | ||
| + | print(np.dot(x, | ||
| + | |||
| + | # mit scikit tools | ||
| + | #zuerst in einen echten mehrdimensionalen nx1-Array verwandenln | ||
| + | xb = x.reshape(-1, | ||
| + | |||
| + | |||
| + | #Ohne Achsenabschnitt | ||
| + | reg = LinearRegression(fit_intercept=False).fit(xb, | ||
| + | # alpha und beta ausgeben | ||
| + | print(reg.intercept_) | ||
| + | print(reg.coef_) | ||
| + | |||
| + | #Mit Achsenabschnitt | ||
| + | reg = LinearRegression(fit_intercept=True).fit(xb, | ||
| + | # alpha und beta ausgeben | ||
| + | print(reg.intercept_) | ||
| + | print(reg.coef_) | ||
| + | |||
| + | # Plot outputs | ||
| + | plt.scatter(xb, | ||
| + | plt.plot(x, reg.predict(xb), | ||
| + | |||
| + | plt.xticks(()) | ||
| + | plt.yticks(()) | ||
| + | |||
| + | plt.show() | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <hidden Lösung Afg. 4> | ||
| + | Genau wie bei der univariaten Regression, kann das Problem als Polynom in $\alpha$ und $\beta$ aufgefasst werden. Leite wir $f$ nach $\alpha$ und $\beta$ ab und setzen beides gleich $0$ und lösen nach $\alpha$ und $\beta$ auf, erhalten wir: | ||
| + | \[ | ||
| + | \beta= \frac{\sum(x_i-\bar{x})(y_i-\bar{y})}{\sum(x_i-\bar{x})^2} \text{ und } \alpha=\bar{y}-{\beta}\bar{x} | ||
| + | \] | ||
| + | wobei $\bar{y}=\frac{1}{n}\sum_{i=1}^n y_i$ und $\bar{x}=\frac{1}{n}\sum_{i=1}^n x_i$ ist. | ||
| + | |||
| + | </ | ||
| + | |||
| + | == Multivariate Lineare Regression == | ||
| + | |||
| + | Das Modell $y_i=\alpha+\beta x_i$ ist sehr simpel. Um gute Vorhersagen zu machen, müssen wir mehr als eine Variable haben, das heisst, wir hätten gerne ein Model $Y=\alpha+\beta_1X_1+\beta_2X_2+\cdots +\beta_pX_p$. Interpretiert man die Multiplikation $\cdot$ als Skalarprodukt, | ||
| + | \[ | ||
| + | \sum_{i=1}^n (y_i-\alpha-\beta_1 x_i^1-\cdots-\beta_px_i^p)^2 | ||
| + | \] | ||
| + | soll minimal sein. | ||
| + | Wenn also z.B. $p=2$ ist suchen wir also eine Ebene, welche die quadrierten Abstände der Datenpunkte von der Ebene minimiert. | ||
| + | |||
| + | |||
| + | ==== Tafeln ==== | ||
| + | {{ : | ||
| + | |||
| + | ==== Prüfung / OOP ==== | ||
| + | <code python | prA3.py> | ||
| + | |||
| + | class Foo: | ||
| + | def __init__(self, | ||
| + | self.n = a | ||
| + | def mehr(self): | ||
| + | self.n+=1 | ||
| + | def show(self): | ||
| + | print(self.n) | ||
| + | | ||
| + | | ||
| + | a=Foo(3) | ||
| + | b=Foo(5) | ||
| + | a.mehr() | ||
| + | b.show() | ||
| + | print(b.n) | ||
| + | b.mehr() | ||
| + | b.show() | ||
| + | print(b.n) | ||
| + | a.show() | ||
| + | print(a.n) | ||
| + | |||
| + | #a.n ist analog zu reg.coef_ oder reg.intercept_ | ||
| + | </ | ||