Tracer et comprendre la distribution normale multivariée en Python

introduction

J'ai essayé de tracer avec python pour obtenir une image de la "distribution normale multivariée" qui est sortie lorsque j'étudiais les statistiques. Cette fois, le nombre de $ n $ est fixé à 2 et la distribution normale bidimensionnelle est tracée de manière à être facilement comprise une fois visualisée.

référence

Pour comprendre la distribution normale multivariée et effectuer son tracé, je me suis référé à ce qui suit.

Vue d'ensemble de la distribution normale multivariée

La distribution normale multivariée de la variable $ n $ est exprimée comme suit.


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 \}

Puisqu'il existe des variables $ n $, les données sont représentées par la notation vectorielle de dimension $ n $. De plus, comme il y a autant de valeurs moyennes $ \ mu $ que de variables, elles sont également exprimées en notation vectorielle.


{ \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}
}

Un élément $ x_ {i} $ représente les données de la variable de probabilité $ X_ {i} $, et la valeur moyenne $ \ mu_i $ représente la valeur moyenne de la variable de probabilité $ X_ {i} $. Ensuite, concernant la variance, dans le cas du multivarié, il est nécessaire de considérer non seulement la distribution de chaque donnée mais aussi la corrélation entre les données, donc la ** matrice de covariance de variance $ \ sum $ ** est utilisée.


{ \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 $ est la distribution de la variable $ i $ th, et $ \ sigma_ {ij} = \ sigma_ {ji} (i ≠ j) $ est à la fois entre la variable $ i $ th et la variable $ j $ th. Il est distribué. Et la distribution normale bidimensionnelle lorsque $ n $ est $ 2 $ est exprimée comme suit.

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  )

Maintenant, je voudrais tracer une distribution normale bidimensionnelle.

Diagramme de distribution normale bidimensionnelle

Le script pour tracer la distribution normale bidimensionnelle est le suivant. Tout d'abord, sortons les deux variables selon la distribution normale standard lorsqu'elles sont indépendantes l'une de l'autre.

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
from matplotlib import cm

#Créer des données à mettre dans la fonction
x = y = np.arange(-20, 20, 0.5)
X, Y = np.meshgrid(x, y)

z = np.c_[X.ravel(),Y.ravel()]

#Une fonction qui renvoie la densité de probabilité d'une distribution normale bidimensionnelle
def gaussian(x):
    #Expression matricielle de la matrice distribuée co-distribuée
    det = np.linalg.det(sigma)
    print(det)
    #Inverse de la matrice distribuée co-distribuée
    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))

#Spécifiez la valeur moyenne de 2 variables
mu = np.array([0,0])
#Spécifiez une matrice distribuée à deux variables
sigma = np.array([[1,0],[0,1]])

Z = gaussian(z)
shape = X.shape
Z = Z.reshape(shape)

#Tracer une distribution normale bidimensionnelle
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()

Le résultat de sortie est le suivant. Puisque les deux variables sont normalement distribuées, le graphique sera net et sans biais.

多変量正規分布1.png

Maintenant, nous allons également tracer des graphiques de différentes formes. Tracons la distribution normale bidimensionnelle lorsque la distribution des deux variables est la suivante.

#Spécifiez la valeur moyenne de 2 variables
mu = np.array([3,1])
#Spécifiez une matrice distribuée à deux variables
sigma = np.array([[10,5],[5,10]])

Ce qui suit est le même que le graphique ci-dessus.


Z = gaussian(z)
shape = X.shape
Z = Z.reshape(shape)

#Tracer une distribution normale bidimensionnelle
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()

Le résultat de sortie est le suivant. Cette fois, nous traçons les distributions qui sont corrélées les unes aux autres, de sorte que nous pouvons voir que la forme est légèrement déformée en diagonale.

ダウンロード (1).png

Il est facile de saisir l'image en visualisant des choses difficiles à comprendre dans des formules mathématiques.

Next Lors de l'étude des statistiques, il est souvent difficile d'obtenir une image avec uniquement des formules mathématiques, donc j'aimerais activement essayer de l'écrire moi-même avec python ou de la tracer pour la visualiser.

Recommended Posts

Tracer et comprendre la distribution normale multivariée en Python
Comprendre attentivement la distribution de Poisson et dessiner en Python
Créer un diagramme de dispersion elliptique en Python sans utiliser une distribution normale multivariée
Implémentation de distribution normale mixte en python
Distribution de Poisson et tracé de distribution cumulative de Poisson via sqlite en Python et Java
Trouvons un graphique de la distribution de Poisson et de la distribution cumulative de Poisson en Python et Java, respectivement.
Faites correspondre la distribution de chaque groupe en Python
Créer un graphique de distribution normale standard en Python
À propos de la différence entre "==" et "is" en python
Comment tracer l'autocorrélation et l'autocorrélation partielle avec Python
Distribution logistique en Python
traitement (python) Diagramme les coordonnées de la liste Spécifiez le nombre de fois dans draw ()
Notez que je comprends l'algorithme des moindres carrés. Et je l'ai écrit en Python.
Le mémo Python le plus simple au Japon (classes et objets)
Recevez le formulaire en Python et faites diverses choses
Trouvez la matrice Hermite et ses valeurs uniques en Python
Essayez de tracer des graphiques en bougies Bitcoin et des indicateurs techniques en Python
Vérifiez la nature atrophique de la distribution de probabilité en Python
Trouver des erreurs en Python
Écrire une distribution bêta en Python
Apprenez à connaître les packages et les modules Python
Générer une distribution U en Python
Pile et file d'attente en Python
Unittest et CI en Python
Je comprends Python en japonais!
Tracer des informations géographiques en Python
Obtenez le type MIME en Python et déterminez le format de fichier
En Python, les éléments de la liste sont triés et sortis sous forme d'éléments et de multiples.
Comprendre la signification des formules de distribution normale complexes et bizarres
[Comprendre au plus court] Principes de base de Python pour l'analyse des données
Manipulez le presse-papiers en Python et collez le tableau dans Excel
J'ai essayé de programmer le test du chi carré en Python et Java.
[Python] Afficher le temps écoulé en heures, minutes et secondes (00:00:00)
Obtenez la date et l'heure actuelles en Python, en tenant compte du décalage horaire
[Statistiques] Visualisons la relation entre la distribution normale et la distribution du chi carré.
[Astuces] Problèmes et solutions dans le développement de python + kivy
Déterminez le format de la date et de l'heure avec Python et convertissez-le en Unixtime
L'histoire de Python et l'histoire de NaN
Paquets qui gèrent le MIDI avec Python midi et pretty_midi
Comptez bien le nombre de caractères thaïlandais et arabes en Python
Obtenir l'API arXiv en Python
Différence entre list () et [] en Python
Différence entre == et est en python
Afficher les photos en Python et html
Algorithme de tri et implémentation en Python
Python dans le navigateur: la recommandation de Brython
Enregistrez le fichier binaire en Python
Frappez l'API Sesami en Python
[Python] PCA scratch dans l'exemple de "Introduction à la méthode d'analyse multivariée"
[Python / matplotlib] Comprendre et utiliser FuncAnimation
Nouvelle grammaire et fonctionnalités Python non mentionnées dans le livre d'introduction
Essayez de transcrire la fonction de masse stochastique de la distribution binomiale en Python
Obtenez le chemin du bureau en Python
À propos de Python et Cython dtype
Obtenez le chemin du script en Python
Dans la commande python, python pointe vers python3.8
Implémenter le modèle Singleton en Python