Normalverteilte Zufallsvariablen - Nichtlineare Abbildungen
Viele Meßgrößen von Sensoren sowie Zustände von Systeme lassen sich in der Praxis durch normalverteile Zufallsvariablen sehr gut beschreiben. Dies ist eine Konsequenz auf dem zentralen Grenzwertsatz (central limit theorem), nachdem der Stichprobenmittelwert als Zufallsvariable näherungsweise normalverteilt ist.
Die Argumentation dabei ist, dass die Meßgröße eines Sensors als Überlagerung des eigentlichen wahren Zustandes \(\textbf{x}\) mit normalverteiltem Rauschen \(\epsilon\sim\mathcal{N}\) gesehen werden kann. Das Rauschen wird als Überlagerung (Mittelwert) unendlich vieler kleiner Störeinflüße modelliert und ist daher aufgrund des zentralen Grenzwertsatzes normalverteilt.
Wird der Systemzustand nun aufgrund dieser normalverteilten Meßgrößen geschätzt und zusätzlich noch von ebenfalls normalverteilten Störeinflüßen überlagert, so ist es plausibel anzunehmen das ebendieser Systemzustand auch normalverteilt ist.
Eine normalverteilte Zufallsvariable wird dabei vollständig durch Angabe ihres (ggf. mehr-dimensionalen) Mittelwertes sowie der dazugehörigen Kovarianzmatrix beschrieben. Man sagt der Vektor von Zufallsvariablen
ist multivariat Normalverteilt mit Mittelwert
und Kovarianz
Dabei beschreibt die Kovarianzmatrix auf ihrer Hauptdiagonale die Varianzen \((\sigma_{1}^2,\dots,\sigma_{n}^2)\) der Zufallsvariablen. Der Term \(\sigma_{ij}\) entspricht dann der Kovarianz zwischen \(x_i\) und \(x_j\).
Lineare Abbildungen von Zufallsvariablen
Im folgenden betrachten wir eine multivariat normalverteilte Zufallsvariable \(\boldsymbol{x}\in\mathbb{R}^n\), also
sowie eine lineare Abbildung ebendieser
mit einer Matrix \(A\in\mathbb{R}^{n\times n}\) Da die Summe normalverteilter Zufallsvariablen ebenfalls wieder normalverteilt ist gilt für lineare Abbildungen einfach
Für die Kovarianz von \(\boldsymbol{y}\) finden wir entsprechend
Lineare Abbildung - Ein Beispiel
In dem folgenden Beispiel wurde eine multivariate Zufallsvariable mit Mittelwert \(\boldsymbol{\mu} = (1.5, 0.5)\) und Kovarianz
über eine lineare Abbildung \(\boldsymbol{y} = A\cdot\boldsymbol{x}\) mit
abgebildet. Für die neue Zufallsvariable ergibt sich
Für die Kovarianz der neuen Zufallsvariable finden wir entsprechend

Gezeigt sind die Kovarianzellipsen (Regionen konstanter Mahalanobis-Distanz) sowie eine Stichprobe von 512 zufälligen Samples (Ausprägungen) der Zufallsvariable. Im linken Teil der Grafik ist die Zufallsvariable \(\boldsymbol{x}\) abgebildet.
Die Samples wurden individuell mit der linearen Abbildungsmatrix in das neue Koordinatensystem überführt und anschließend wieder der sich ergebende Mittelwert sowie die Kovarianz der Punktwolke bestimmt. Die so entstehende Punkte sowie Ellipsen wurden hellblau in das rechte Koordinatensystem eingezeichnet.
Gleichzeitig wurde die tatsächliche Kovarianz und der tatsächliche Mittelwert als dunkelblaue Ellipsen eingezeichnet. Beide sind nahezu deckungsgleich. Die beobachtete Abweichung ergibt sich daraus, dass für die Stichprobe lediglich 512 zufällige Samples gezogen wurden, die Stichprobe also zu klein ist.
Nicht-Lineare Abbildungen von Zufallsvariablen
Wird eine multivariat normalverteilte Zufallsvariable \(\boldsymbol{X}\) durch eine nicht-lineare Funktion \(f: \mathbb{R}^n\mapsto\mathbb{R}^m\) abgebildet, so ist \(\boldsymbol{Y} = f(\boldsymbol{X})\) ebenfalls eine Zufallsvariable. In der Regel ist \(\boldsymbol{Y}\) jedoch nicht mehr normalverteilt.

Die Abbildung zeigt ein einfaches Beispiel. Links ist das Histogram von 400.000 Samples einer normalverteilten Zufallsvariable mit Mittelwert \(\mu=3\) und Varianz \(\sigma^2 = 1\) gezeigt. Wird die Zufallsvariable durch \(f(x) = x^2\) auf eine neue Zufallsvariable \(\boldsymbol{Y} = f(\boldsymbol{X})\) abgebildet, so ist diese offensichtlich nicht mehr normalverteilt (siehe dazu das rechte Histogram der sich ergebenden Verteilung).
Um dennoch eine Näherung für die Verteilung von \(\boldsymbol{Y}\) zu erhalten, kann die nicht-lineare Abbildung \(f(\boldsymbol{X})\) im Punkt des Erwartungswerts \(\boldsymbol{\mu}_X = \mathbb{E}[\boldsymbol{X}]\) durch eine lineare Funktion approximiert werden. Dies geschieht durch eine Taylor-Entwicklung erster Ordnung:
wobei \(J_f(\boldsymbol{\mu}_X)\) die Jacobi-Matrix von \(f\) an der Stelle \(\boldsymbol{\mu}_X\) ist.
Da die Linearkombination einer normalverteilten Zufallsvariablen wieder normalverteilt ist, lässt sich auf Basis dieser Approximation eine multivariate Normalverteilung für \(\boldsymbol{Y}\) angeben:
Der approximierte Erwartungswert ergibt sich zu
\[\mathbb{E}[\boldsymbol{Y}] \approx f(\boldsymbol{\mu}_X),\]und die approximierte Kovarianzmatrix zu
\[\Sigma_Y \approx J_f(\boldsymbol{\mu}_X) \, \Sigma_X \, J_f(\boldsymbol{\mu}_X)^\top,\]
wobei \(\Sigma_X\) die Kovarianzmatrix von \(\boldsymbol{X}\) ist.
Diese Methode entspricht einer Taylor-Entwicklung erster Ordnung und wird typischerweise im Extended Kalman Filter (EKF) verwendet. Für genauere Approximationen existieren alternative Methoden wie die Unscented Transform, bei der deterministisch gewählte Sigma-Punkte durch die nichtlineare Abbildung propagiert werden.
Die Jacobi-Matrix
Die Jacobi-Matrix ist eine Matrix, die alle ersten partiellen Ableitungen einer vektorwertigen Funktion enthält. Betrachtet man eine Funktion \(f: \mathbb{R}^n \rightarrow \mathbb{R}^m\), so ergibt sich die Jacobi-Matrix \(J_f(\boldsymbol{x})\) als eine \(m \times n\)-Matrix:
Jede Zeile enthält dabei die partiellen Ableitungen einer Komponente von \(f\). Mit anderen Worten: Die Jacobi-Matrix beschreibt, wie sich kleine Änderungen in \(\boldsymbol{X}\) auf jede Komponente von \(f(\boldsymbol{X})\) auswirken. Sie ist die natürliche Verallgemeinerung der Ableitung aus der eindimensionalen Analysis auf mehrdimensionale Vektorfunktionen.
In unserem Kontext wird die Jacobi-Matrix verwendet, um eine nichtlineare Funktion im Punkt \(\boldsymbol{\mu}_X\) durch eine lineare Abbildung zu approximieren.
Die Jacobi-Matrix - Ein Beispiel
Es sei \((r, \alpha)\) ein zwei-dimensionaler Punkt in Polarkoordinaten, also dargestellt über seinen Abstand zum Ursprung \(r\) sowie den Winkel zum x-Achse \(\alpha\).
Die Abbildung in gewohnte kartesische Koordinaten läßt sich über die nicht-lineare Funktion
darstellen. Für die Jacobi-Matrix finden wir dann
Diese Matrix beschreibt die lokale lineare Approximation der Koordinatentransformation am Punkt \((r, \alpha)\). Sie zeigt insbesondere, wie Änderungen in Radius und Winkel sich auf die kartesischen Koordinaten auswirken.
Kennt man den Erwartungswert \(\boldsymbol{\mu}_{(r,\alpha)}\) sowie die Kovarianzmatrix \(\Sigma_{(r,\alpha)}\) der ursprünglichen (in Polarkoordinaten beschriebenen) Zufallsvariablen, so lässt sich durch Einsetzen der Jacobi-Matrix in die Approximation
eine Näherung der Kovarianzmatrix im kartesischen Raum berechnen.

Der obige Plot zeigt ein Beispiel für eine solche Transformation. Links ist die normalverteilte Zufallsvariable \(\boldsymbol{X}\) zu sehen. Die Zufallsvariable weißt in \(r\)-Richtung (horizontal) nur eine geringe Unsicherheit auf. Das entspricht einer hohen Genauigkeit was Entfernungsschätzungen angeht. In \(\alpha\)-Richtung (vertikal) ist die Unsicherheit deutlich größer, die Winkelgenauigkeit ist also deutlich schlechter. Das entspricht dem typischen Unsicherheitsprofil eines Radars.
Rechts ist die nicht-lineare Transformation dieser Zufallsvariable in den kartesischen Raum zu sehen. Solange die Winkelunsicherheit nicht zu groß ist kann die entstehende Verteilung hinreichend gut durch eine Normalverteilung beschrieben werden.
Was passiert nun wenn die Winkelunsicherheit zu groß wird?

Im obigen Plot wurde die Winkelunsicherheit deutlich erhöht. Die möglichen Meßwerte (die einzelnen Punkte der Punktwolke) decken nun einen so großen Bereich ab, dass die Transformation in kartesische Koordinate nicht mehr sinnvoll durch eine Normalverteilung beschrieben werden kann. Dies zeigt sich auch daran das die durch Linearisierung geschätzten Parameter (Mittelwert und Kovarianz, gezeichnet in Dunkelblau) deutlich von dem tatsächlichen Mittelwert und der tatsächlchen Kovarianz der transformierten Punkte (gezeichnet in Hellblau) abweichen.
Aufgabe 1: Lineare Abbildung
In dieser Aufgabe arbeiten Sie in der Datei
nonlinearmapping/linear.py
Implementieren Sie die Methode linear.map_samples()
. Folgen Sie den Anweisungen im Code.
- linear.map_samples(samples, alpha)[Quellcode]
TODO Assume you have a normal distributed random variable \(\boldsymbol{X}\) with mean
\[\mu = (1.5 ,0.5)\]and covariance
\[\begin{split}\Sigma = \begin{pmatrix}0.7&-0.4\\-0.4&1.4\end{pmatrix}\end{split}\]Assume further that \(\boldsymbol{Y}\) is another random variable with
\[\boldsymbol{Y} = A\cdot \boldsymbol{X}\]and
\[\begin{split}A = \begin{pmatrix}\cos(\alpha)&-\sin(\alpha)\\\sin(\alpha)&\cos(\alpha)\end{pmatrix}\end{split}\]The samples parameter holds 512 samples of this random variable.
Apply the linear mapping to the samples and calculate the exact new mean and covariance of \(\boldsymbol{Y}\), namely
\[E[\boldsymbol{Y}] = E[A\cdot\boldsymbol{X}] = A\cdot\boldsymbol{\mu}\]\[Cov[\boldsymbol{Y}] = Cov[A\cdot\boldsymbol{X}] = A\cdot Cov[\boldsymbol{X}] \cdot A^T\]Return the mapped samples as well as the exact mean and covariance of the mapped random variable. Do not estimate the mean and covariance from the mapped samples.
- Parameter:
samples – (np.array 2x512) 512 Samples from \(\boldsymbol{X}\)
alpha – Parameter \(\alpha\) of the Matrix \(A\) (see above)
- Rückgabe:
3-tuple (mapped_samples, mapped_mu, mapped_cov)
Lösung anzeigen
def map_samples(samples, alpha):
# TODO: Calculate Matrix A
s, c = np.sin(alpha), np.cos(alpha)
A = np.array([[ c, s],
[-s, c]])
# TODO: Map the samples and calculate the exact mean and covariance of the Y
mu = np.array([1.5, 0.5])
cov = np.array([[0.7, -0.4],[-0.4, 1.4]])
mapped_samples = A @ samples
mapped_mu = A @ mu.reshape(-1,1)
mapped_cov = A @ cov @ A.T
# TODO: Return your mapped samples, the mapped mean and the mapped covariance
return mapped_samples, mapped_mu, mapped_cov
Starten Sie dann das Program. Wenn Sie alles richig gemacht haben sehen Sie einen animierten Plot ähnlich zu dem oben gezeigten Bild. Sie sollten sehen das die aus der Punktwolke geschätzten Kovarianzellipsen (hellblau) stets nahezu identisch sind mit denen von ihnen berechneten sind.
Aufgabe 2: Polarkoordinaten nach Kartesisch
In dieser Aufgabe arbeiten Sie in der Datei
nonlinearmapping/polar.py
Implementieren Sie die Methode polar.map_samples()
. Folgen Sie den Anweisungen im Code.
- polar.map_samples(samples, radius, alpha, cov)[Quellcode]
TODO Assume you have a normal distributed random variable \(\boldsymbol{X}\) with mean
\[\mu = (r, \alpha)\]and given covariance (cov-Parameter). \(\boldsymbol{X}\) represents a random point in polar coordinates. We want to transform that point into cartesian coordinates by applying the following transformation
\[\begin{split}\boldsymbol{Y} = \begin{pmatrix} r\cdot\cos(\alpha)\\ r\cdot\sin(\alpha) \end{pmatrix}\end{split}\]The samples parameter holds 512 samples of this random variable.
Apply the non-linear mapping to the samples and calculate the exact new mean and covariance of \(\boldsymbol{Y}\) after linearization using the Jacobian Matrix :\(J\), namely
\[E[\boldsymbol{Y}] = f(\boldsymbol{\mu})\]\[Cov[\boldsymbol{Y}] = J\cdot Cov[\boldsymbol{X}] \cdot J^T\]Return the mapped samples as well as the derived mean and covariance of the mapped random variable. Do not estimate the mean and covariance from the mapped samples.
- Parameter:
samples – (np.array 2x512) 512 Samples from \(\boldsymbol{X}\)
radius – The mean radius in polar coordinates
alpha – The mean angle in polar coordinates
- Rückgabe:
3-tuple (mapped_samples, mapped_mu, mapped_cov)
Lösung anzeigen
def map_samples(samples, alpha):
# TODO: Map all samples from polar to cartesian coordinates
r, a = samples[0, :], samples[1, :]
mapped_samples = np.zeros_like(samples)
mapped_samples[0, :] = r * np.cos(a)
mapped_samples[1, :] = r * np.sin(a)
# TODO: Calculate Jacobian
J = np.array([[np.cos(alpha), -radius*np.sin(alpha)],
[np.sin(alpha), radius*np.cos(alpha)]])
# TODO: Calculate mean and covariance of Y after linearization
mapped_mu = np.array([radius * np.cos(alpha), radius * np.sin(alpha)])
mapped_cov = J @ cov @ J.T
# TODO: Return your mapped samples, the mapped mean and the mapped covariance
return mapped_samples, mapped_mu, mapped_cov
Starten Sie dann das Program. Wenn Sie alles richig gemacht haben sehen Sie einen animierten Plot ähnlich zu dem oben gezeigten Bild. Sie sollten sehen das die aus der Punktwolke geschätzten Kovarianzellipsen (hellblau) stets nahezu identisch sind mit denen von ihnen berechneten sind.
Aufgabe 3: Polarkoordinaten nach Kartesisch - Teil 2
Erhöhen Sie im Skript den Wert der Variable
STD_ALPHA = 5 # Standard deviation of angular values (degrees)
auf z.B. 25° und schauen Sie was passiert.
Praxisbeispiel für nichtlineare Transformation: Sauerstoffsättigung im Blut
Medizinischer Hintergrund
Die Sauerstoffsättigung des Hämoglobins im menschlichen Blut ist eine wichtige medizinische Messgröße. Sie beschreibt, wie viel Prozent des verfügbaren Hämoglobins mit Sauerstoff beladen ist – ein zentraler Indikator für die Versorgung des Körpers mit Sauerstoff.
Direkt gemessen wird in der Regel jedoch nicht die Sättigung selbst, sondern der Sauerstoffpartialdruck (\(p\)) im arteriellen Blut, beispielsweise mit einem Pulsoxymeter oder einer Blutgasanalyse. Zwischen dem Partialdruck und der Sättigung besteht ein nichtlinearer Zusammenhang, der durch die sogenannte Hill-Gleichung beschrieben werden kann.
Die Hill-Gleichung
Die Sauerstoffsättigung \(S\) in Abhängigkeit vom Sauerstoffpartialdruck \(p\) lässt sich durch die folgende Funktion annähern:
Dabei sind: - \(p\) der Sauerstoffpartialdruck in mmHg, - \(n\) der sogenannte Hill-Koeffizient (beschreibt die Kooperativität der Sauerstoffbindung), - \(K\) der Partialdruck, bei dem 50 % des Hämoglobins gesättigt sind.
Typische Werte für menschliches Hämoglobin sind \(n = 2{,}7\) und \(K = 26\) mmHg.
Ziel dieser Aufgabe ist es, zu untersuchen, wie sich Unsicherheiten bei der Messung des Sauerstoffpartialdrucks auf die Verteilung der Sauerstoffsättigung auswirken – insbesondere bei Verwendung einer linearen Approximation mittels Taylor-Entwicklung erster Ordnung.
Das Experiment
Ein typisches Experiment in diesem Bereich sieht so aus:
Gegeben ist eine normalverteilte Zufallsvariable für den Sauerstoffpartialdruck:
\[p \sim \mathcal{N}(\mu_p = 40\,\text{mmHg}, \sigma_p^2 = 25\,\text{mmHg}^2)\]Bestimmen Sie den Erwartungswert \(\mu_S\) und die Varianz \(\sigma_S^2\) der Sauerstoffsättigung \(S(p)\) unter Verwendung einer linearen Approximation im Punkt \(\mu_p\).
Leiten Sie dazu die erste Ableitung der Funktion \(S(p)\) nach \(p\) her und verwenden Sie diese zur Approximation mittels Taylor-Entwicklung erster Ordnung.
Führen Sie eine Monte-Carlo-Simulation mit mindestens 10.000 Zufallswerten \(p_i \sim \mathcal{N}(\mu_p, \sigma_p^2)\) durch. Transformieren Sie jeden Wert mit \(S(p_i)\) und schätzen Sie den empirischen Mittelwert und die Varianz der resultierenden Verteilung.
Vergleichen Sie die Ergebnisse der Simulation mit den Werten aus der linearen Approximation.
Wiederholen Sie die Schritte 1–4 für folgende alternative Mittelwerte: - \(\mu_p = 20\) mmHg - \(\mu_p = 80\) mmHg
Diskutieren Sie Ihre Beobachtungen: - Wann funktioniert die lineare Approximation gut? - In welchen Fällen weicht sie stark vom Simulationsergebnis ab? - Was ist der Einfluss der Lage von \(\mu_p\) relativ zur Sättigungskurve?
Wir wollen dieses Experiment im folgenden in Python mit NumPy durchführen.
Aufgabe 4: Sauerstoffsättigung bestimmen
In dieser Aufgabe arbeiten Sie in der Datei
nonlinearmapping/oxygen.py
Implementieren Sie die Methode oxygen.map_samples()
. Folgen Sie den Anweisungen im Code.
- oxygen.map_samples(samples)[Quellcode]
TODO: Transform samples of a normally distributed oxygen partial pressure (p) using the Hill equation to approximate blood oxygen saturation.
\[S(p) = \frac{p^n}{p^n + K^n}\]Note: You need to estimate the mean and variance of the samples by using np.mean and np.var.
Additionally compute an analytical approximation of the mean and variance of the transformed values via first-order Taylor expansion.
- Parameter:
samples – A 1D array of sampled oxygen partial pressures (in mmHg), assumed to be normally distributed with unknown mean and variance.
Returns:
- return:
3-Tuple of mapped_samples, the estimated mean and the estimated variance of the saturation (via Taylor expansion)
Lösung anzeigen
def map_samples(samples):
N, K = 2.7, 26
# TODO: Apply the Hill function to each sample to get saturation values
mapped_samples = np.power(samples, N) / (np.power(samples, N) + np.power(K, N))
# TODO: Use np.mean and np.var to compute mean and variance of the original input samples
mu = np.mean(samples)
V = np.var(samples)
# TODO: Compute the derivative (Jacobian) of the Hill function at the mean
J = N * np.power(K, N) * np.power(mu, N-1) / ((np.power(mu, N) + np.power(K, N))**2)
# TODO: Compute the transformed mean using the Hill function
mapped_mu = np.power(mu, N) / (np.power(mu,N) + np.power(K, N))
# TODO: Approximate the transformed variance via linear error propagation
mapped_var = J * V * J
# TODO: Return the mapped samples, the mapped mean and the mapped variance
return mapped_samples, mapped_mu, mapped_var
Aufgabe 5: Experimentieren mit den Werten
- Experimentieren Sie im Skript mit verschiedenen Werten für den Mittelwert \(\mu_p\) und die Standardabweichung \(\sigma_p\)
\(\mu_p = 20\) mmHg
\(\mu_p = 80\) mmHg
\(\sigma_p = 2.5\) mmHg
\(\sigma_p = 10\) mmHg
- Diskutieren Sie dann Ihre Beobachtungen:
Wann funktioniert die lineare Approximation gut?
In welchen Fällen weicht sie stark vom Simulationsergebnis ab?
Was ist der Einfluss der Lage von \(\mu_p\) relativ zur Sättigungskurve?