[PYTHON] Distribution normale bivariée

Je veux générer une distribution normale bivariée

\begin{equation}
  \begin{pmatrix}
    x \\
    y
  \end{pmatrix}
  = N
  \begin{pmatrix}
    \begin{pmatrix}
      \mu_x\\
      \mu_y
    \end{pmatrix}
    _,
    \begin{pmatrix}
      \sigma_x^2 & \rho\sigma_x\sigma_y \\
      \rho\sigma_x\sigma_y & \sigma_y^2 \\
    \end{pmatrix}
  \end{pmatrix}
\end{equation}

Tout d'abord, générez $ x = N (\ mu_x, \ sigma_x) $. Ensuite, x doit être fixé et y doit être généré. La distribution conditionnelle de y à ce moment est

y|x \sim N(\mu_y + \rho\frac{\sigma_y}{\sigma_x}(x-\mu_x), (1-\rho^2)\sigma_y^2))

Donné dans.

Lorsqu'il est implémenté en python

python3


import numpy as np
import matplotlib.pyplot as plt

def MVNORM(mu_x, sigma_x, mu_y, sigma_y, rho, N=1):
  x = np.random.normal(mu_x, sigma_x, N)
  y = np.random.normal(mu_y + rho*sigma_y/sigma_x*(x-mu_x), np.sqrt((1-rho**2)*sigma_y**2), N)
  return([x,y])

#Moyenne 0, écart-type 9 x et coefficient de corrélation 0.Génère 1000 y avec un écart type 3 avec une moyenne corrélée de 3 à 9.
MV = MVNORM(0, 9, 3, 3, 0.9 ,1000)

plt.scatter(MV[0], MV[1])
plt.show()

SUMMARY = (np.mean(MV[0]), np.std(MV[0]), np.mean(MV[1]), np.std(MV[1]))
print("mean X: {0[0]:0.2f}, stdev X: {0[2]:0.2f}, mean Y: {0[1]:0.2f}, stdev Y: {0[3]:0.2f}".format(SUMMARY))

image

mean X: 0.14, stdev X: 9.09, mean Y: 2.99, stdev Y: 3.08

Recommended Posts

Distribution normale bivariée
Vérification de la distribution normale
Générer une distribution normale avec SciPy
Essayez de dessiner une distribution normale avec matplotlib
Générateur aléatoire qui suit la distribution normale N (0,1)
Battre la fonction de densité de probabilité de la distribution normale
Créer un graphique de distribution normale standard en Python