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.
Pour comprendre la distribution normale multivariée et effectuer son tracé, je me suis référé à ce qui suit.
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.
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.
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.
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