Zeichnen und verstehen Sie die multivariate Normalverteilung in Python

Einführung

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.

Referenz

Um die multivariate Normalverteilung zu verstehen und ihre Darstellung durchzuführen, habe ich mich auf Folgendes bezogen.

Übersicht über die multivariate Normalverteilung

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.

Zweidimensionales Normalverteilungsdiagramm

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.

多変量正規分布1.png

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.

ダウンロード (1).png

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

Zeichnen und verstehen Sie die multivariate Normalverteilung in Python
Verstehe die Poisson-Distribution sorgfältig und zeichne in Python
Erstellen Sie in Python ein elliptisches Streudiagramm, ohne eine multivariate Normalverteilung zu verwenden
Implementierung einer gemischten Normalverteilung in Python
Poisson-Verteilung und kumulative Poisson-Verteilung über SQLite in Python und Java
Zeichnen wir ein Diagramm der Poisson-Verteilung und der kumulativen Poisson-Verteilung in Python bzw. Java.
Passen Sie die Verteilung jeder Gruppe in Python an
Erstellen Sie in Python ein Diagramm der Standardnormalverteilung
Über den Unterschied zwischen "==" und "is" in Python
Wie man Autokorrelation und partielle Autokorrelation mit Python zeichnet
Logistische Verteilung in Python
Verarbeitung (Python) Diagramm der Koordinaten der Liste Geben Sie an, wie oft in draw ()
Beachten Sie, dass ich den Algorithmus der kleinsten Quadrate verstehe. Und ich habe es in Python geschrieben.
Das einfachste Python-Memo in Japan (Klassen und Objekte)
Erhalten Sie das Formular in Python und führen Sie verschiedene Aktionen aus
Finden Sie die Hermite-Matrix und ihre eindeutigen Werte in Python
Versuchen Sie, Bitcoin-Kerzendiagramme und technische Indikatoren in Python zu zeichnen
Überprüfen Sie die atrophische Natur der Wahrscheinlichkeitsverteilung in Python
Finde Fehler in Python
Schreiben Sie die Beta-Distribution in Python
Lernen Sie Python-Pakete und -Module kennen
Generieren Sie eine U-Verteilung in Python
Stapel und Warteschlange in Python
Unittest und CI in Python
Ich verstehe Python auf Japanisch!
Zeichnen Sie geografische Informationen in Python
Holen Sie sich den MIME-Typ in Python und bestimmen Sie das Dateiformat
In Python werden die Elemente in der Liste sortiert und als Elemente und Vielfache ausgegeben.
[In kürzester Zeit verstehen] Python-Grundlagen für die Datenanalyse
Bearbeiten Sie die Zwischenablage in Python und fügen Sie die Tabelle in Excel ein
Ich habe versucht, den Chi-Quadrat-Test in Python und Java zu programmieren.
[Python] Zeigt die verstrichene Zeit in Stunden, Minuten und Sekunden an (00:00:00)
Holen Sie sich das aktuelle Datum und die aktuelle Uhrzeit in Python unter Berücksichtigung des Zeitunterschieds
[Statistik] Lassen Sie uns die Beziehung zwischen der Normalverteilung und der Chi-Quadrat-Verteilung visualisieren.
[Tipps] Probleme und Lösungen bei der Entwicklung von Python + Kivy
Bestimmen Sie das Datums- und Uhrzeitformat mit Python und konvertieren Sie es in Unixtime
Die Geschichte von Python und die Geschichte von NaN
Pakete, die MIDI mit Python Midi und Pretty_Midi verarbeiten
Zählen Sie die Anzahl der thailändischen und arabischen Zeichen in Python gut
Abrufen der arXiv-API in Python
Unterschied zwischen list () und [] in Python
Unterschied zwischen == und ist in Python
Zeigen Sie Fotos in Python und HTML an
Sortieralgorithmus und Implementierung in Python
Python im Browser: Brythons Empfehlung
Speichern Sie die Binärdatei in Python
Klicken Sie in Python auf die Sesami-API
[Python] PCA-Scratch im Beispiel "Einführung in die multivariate Analysemethode"
[Python / matplotlib] FuncAnimation verstehen und verwenden
Neue Python-Grammatik und Funktionen, die im Einführungsbuch nicht erwähnt werden
Versuchen Sie, die stochastische Massenfunktion der Binomialverteilung in Python zu transkribieren
Holen Sie sich den Desktop-Pfad in Python
Über Python und Cython dtype
Holen Sie sich den Skriptpfad in Python
Im Python-Befehl zeigt Python auf Python3.8
Implementieren Sie das Singleton-Muster in Python