Ich habe versucht, mit Python zu zeichnen, um ein Bild der "multivariaten Normalverteilung" zu erhalten, die beim Studium der Statistik herauskam. Dieses Mal wird die Anzahl von $ n $ auf 2 gesetzt und die zweidimensionale Normalverteilung wird aufgezeichnet, damit sie bei der Visualisierung leicht verstanden werden kann.
Um die multivariate Normalverteilung zu verstehen und ihre Darstellung durchzuführen, habe ich mich auf Folgendes bezogen.
Die multivariate Normalverteilung der Variablen $ n $ wird wie folgt ausgedrückt.
f(\vec{x}) = \frac{1}{\sqrt{(2\pi)^n |\sum|}}exp \left \{-\frac{1}{2}{}^t (\vec{x}-\vec{\mu}) {\sum}^{-1} (\vec{x}-\vec{\mu}) \right \}
Da es $ n $ Variablen gibt, werden die Daten durch die Notationsvektornotation $ n $ dargestellt. Da es außerdem so viele Durchschnittswerte $ \ mu $ wie Variablen gibt, werden diese auch in Vektornotation ausgedrückt.
{ \begin{equation}\vec{x}=\begin{pmatrix}x_1 \\ x_2 \\ \vdots \\ x_n \\ \end{pmatrix}, \vec{\mu}=\begin{pmatrix}\mu_1 \\ \mu_2 \\ \vdots \\ \mu_n \\ \end{pmatrix} \end{equation}
}
Ein Element $ x_ {i} $ repräsentiert die Daten der Wahrscheinlichkeitsvariablen $ X_ {i} $, und der Durchschnittswert $ \ mu_i $ repräsentiert den Durchschnittswert der Wahrscheinlichkeitsvariablen $ X_ {i} $. In Bezug auf die Varianz muss im Fall von multivariaten Daten nicht nur die Verteilung der einzelnen Daten, sondern auch die Korrelation zwischen den Daten berücksichtigt werden, sodass die ** Varianz-Kovarianzmatrix $ \ sum $ ** verwendet wird.
{ \begin{equation}\ \ \ \Sigma = \begin{pmatrix} \sigma_{1}^2 & \cdots & \sigma_{1i} & \cdots & \sigma_{1n}\\ \vdots & \ddots & & & \vdots \\ \sigma_{i1} & & \sigma_{i}^2 & & \sigma_{in} \\ \vdots & & & \ddots & \vdots \\ \sigma_{n1} & \cdots & \sigma_{ni} & \cdots & \sigma_{n}^2 \end{pmatrix} \end{equation}
}
$ \ Sigma ^ 2_i $ ist die Verteilung der $ i $ -ten Variablen, und $ \ sigma_ {ij} = \ sigma_ {ji} (i ≠ j) $ liegt sowohl zwischen der $ i $ -ten Variablen als auch der $ j $ -ten Variablen. Es wird verteilt. Und die zweidimensionale Normalverteilung, wenn $ n $ $ 2 $ ist, wird wie folgt ausgedrückt.
N_2 \left ( \begin{pmatrix} \mu_x \\ \mu_y \\ \end{pmatrix} , \begin{pmatrix} \sigma_{x}^2 & \sigma_{xy}\\ \sigma_{xy} & \sigma_{y}^2\\ \end{pmatrix} \right )
Nun möchte ich eine zweidimensionale Normalverteilung zeichnen.
Das Skript zum Zeichnen der zweidimensionalen Normalverteilung lautet wie folgt. Lassen Sie uns zunächst beide Variablen gemäß der Standardnormalverteilung ausgeben, wenn sie unabhängig voneinander sind.
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
from matplotlib import cm
#Erstellen Sie Daten, die in die Funktion eingefügt werden sollen
x = y = np.arange(-20, 20, 0.5)
X, Y = np.meshgrid(x, y)
z = np.c_[X.ravel(),Y.ravel()]
#Eine Funktion, die die Wahrscheinlichkeitsdichte einer zweidimensionalen Normalverteilung zurückgibt
def gaussian(x):
#Matrixausdruck der verteilten co-verteilten Matrix
det = np.linalg.det(sigma)
print(det)
#Inverse der verteilten co-verteilten Matrix
inv = np.linalg.inv(sigma)
n = x.ndim
print(inv)
return np.exp(-np.diag((x - mu)@inv@(x - mu).T)/2.0) / (np.sqrt((2 * np.pi) ** n * det))
#Geben Sie den Durchschnittswert von 2 Variablen an
mu = np.array([0,0])
#Geben Sie eine verteilte, gemeinsam verteilte Matrix mit zwei Variablen an
sigma = np.array([[1,0],[0,1]])
Z = gaussian(z)
shape = X.shape
Z = Z.reshape(shape)
#Zeichnen Sie die zweidimensionale Normalverteilung
fig = plt.figure(figsize = (15, 15))
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.coolwarm)
plt.show()
Das Ausgabeergebnis ist wie folgt. Da beide Variablen normal verteilt sind, ist der Graph scharf und unvoreingenommen.
Jetzt werden wir auch Diagramme verschiedener Formen zeichnen. Zeichnen wir die zweidimensionale Normalverteilung, wenn die Verteilung der beiden Variablen wie folgt ist.
#Geben Sie den Durchschnittswert von 2 Variablen an
mu = np.array([3,1])
#Geben Sie eine verteilte, gemeinsam verteilte Matrix mit zwei Variablen an
sigma = np.array([[10,5],[5,10]])
Das Folgende ist dasselbe wie in der obigen Darstellung.
Z = gaussian(z)
shape = X.shape
Z = Z.reshape(shape)
#Zeichnen Sie die zweidimensionale Normalverteilung
fig = plt.figure(figsize = (15, 15))
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.coolwarm)
plt.show()
Das Ausgabeergebnis ist wie folgt. Dieses Mal zeichnen wir die Verteilungen auf, die miteinander korrelieren, sodass wir sehen können, dass die Form leicht diagonal verzerrt ist.
Es ist einfach, das Bild zu erfassen, indem man Dinge visualisiert, die in mathematischen Formeln schwer zu verstehen waren.
Next Beim Studium der Statistik ist es oft schwierig, ein Bild nur mit mathematischen Formeln zu erhalten. Daher möchte ich aktiv versuchen, es selbst mit Python zu schreiben oder es zu zeichnen, um es zu visualisieren.
Recommended Posts