2016-08-01 1 views
1

J'essaie de tracer la distribution comun de deux variables distribuées normales.Tracer la distribution normale en 3D

Le code ci-dessous représente une variable distribuée normale. Quel serait le code pour tracer deux variables distribuées normales?

import matplotlib.pyplot as plt 
import numpy as np 
import matplotlib.mlab as mlab 
import math 

mu = 0 
variance = 1 
sigma = math.sqrt(variance) 
x = np.linspace(-3, 3, 100) 
plt.plot(x,mlab.normpdf(x, mu, sigma)) 

plt.show() 
+0

Pouvez-vous définir la distribution 'común'? matplotlib3d a beaucoup d'exemples qui peuvent vous aider à faire ce que vous avez besoin http://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html – jm22b

Répondre

4

Il ressemble à ce que vous cherchez est un Multivariate Normal Distribution. Ceci est mis en œuvre dans Scipy comme scipy.stats.multivariate_normal. Il est important de se rappeler que vous passez une matrice de covariance à la fonction. Donc, pour garder les choses simples garder les éléments diagonaux zéro:

[X variance ,  0 ] 
[  0  ,Y Variance] 

Voici un exemple en utilisant cette fonction et générer un tracé 3D de la distribution résultante. J'ajoute la palette de couleurs pour faire voir les courbes plus facilement mais n'hésitez pas à l'enlever.

import numpy as np 
import matplotlib.pyplot as plt 
from scipy.stats import multivariate_normal 
from mpl_toolkits.mplot3d import Axes3D 

#Parameters to set 
mu_x = 0 
variance_x = 3 

mu_y = 0 
variance_y = 15 

#Create grid and multivariate normal 
x = np.linspace(-10,10,500) 
y = np.linspace(-10,10,500) 
X, Y = np.meshgrid(x,y) 
pos = np.empty(X.shape + (2,)) 
pos[:, :, 0] = X; pos[:, :, 1] = Y 
rv = multivariate_normal([mu_x, mu_y], [[variance_x, 0], [0, variance_y]]) 

#Make a 3D plot 
fig = plt.figure() 
ax = fig.gca(projection='3d') 
ax.plot_surface(X, Y, rv.pdf(pos),cmap='viridis',linewidth=0) 
ax.set_xlabel('X axis') 
ax.set_ylabel('Y axis') 
ax.set_zlabel('Z axis') 
plt.show() 

vous donnant cette parcelle: enter image description here

Modifier

Une simple verision est avalible par matplotlib.mlab.bivariate_normal Il prend les arguments suivants de sorte que vous n'avez pas à vous soucier de matrices matplotlib.mlab.bivariate_normal(X, Y, sigmax=1.0, sigmay=1.0, mux=0.0, muy=0.0, sigmaxy=0.0) ici X, et Y sont à nouveau le résultat d'un meshgrid donc en utilisant ceci pour recréer l'intrigue ci-dessus:

import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib.mlab import biivariate_normal 
from mpl_toolkits.mplot3d import Axes3D 

#Parameters to set 
mu_x = 0 
sigma_x = np.sqrt(3) 

mu_y = 0 
sigma_y = np.sqrt(15) 

#Create grid and multivariate normal 
x = np.linspace(-10,10,500) 
y = np.linspace(-10,10,500) 
X, Y = np.meshgrid(x,y) 
Z = bivariate_normal(X,Y,sigma_x,sigma_y,mu_x,mu_y) 

#Make a 3D plot 
fig = plt.figure() 
ax = fig.gca(projection='3d') 
ax.plot_surface(X, Y, Z,cmap='viridis',linewidth=0) 
ax.set_xlabel('X axis') 
ax.set_ylabel('Y axis') 
ax.set_zlabel('Z axis') 
plt.show() 

Donner: enter image description here