2014-09-08 18 views
5

Voglio generare una distribuzione gaussiana in Python con le dimensioni xey che denotano la posizione e la dimensione z che denota la grandezza di una certa quantità.Generazione della distribuzione gaussiana 3D in Python

La distribuzione ha un valore massimo di 2e6 e una sigma di deviazione standard = 0,025.

In MATLAB posso farlo con:

x1 = linspace(-1,1,30); 
x2 = linspace(-1,1,30); 

mu = [0,0]; 
Sigma = [.025,.025]; 

[X1,X2] = meshgrid(x1,x2); 
F = mvnpdf([X1(:) X2(:)],mu,Sigma); 
F = 314159.153*reshape(F,length(x2),length(x1)); 
surf(x1,x2,F); 

In Python, quello che ho finora è:

x = np.linspace(-1,1,30) 
y = np.linspace(-1,1,30) 

mu = (np.median(x),np.median(y)) 

sigma = (.025,.025) 

c'è una funzione numpy.random.multivariate_normal Numpy cosa può presumibilmente fare lo stesso di mvnpdf di MATLAB, ma sto lottando per capire il documentation. Soprattutto nell'ottenere la matrice di covarianza richiesta da numpy.random.multivariate_normal.

+0

Penso che tu sia sbagliato pensare che '' numpy.random.multivariate_normal() '' fa la stessa cosa, perché non ti fornisce il pdf della distribuzione, ma estrae solo numeri casuali dalla distribuzione definita nella matrice di covarianza, nonché i valori di aspettativa mu. – Nras

+0

Capisco cosa intendi, sì. Qualche suggerimento su come realizzarlo allora? – Jonny

+0

Vedo che la tua distribuzione _xy_ è _separable_, ovvero, è il prodotto di una _x_ distribuzione gaussiana di una distribuzione _y_ gaussiana. Forse potrebbe essere d'aiuto con Python –

risposta

2

A partire dal SciPy 0.14, è possibile utilizzare scipy.stats.multivariate_normal.pdf():

http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.multivariate_normal.html

import numpy as np 
from scipy.stats import multivariate_normal 

x, y = np.mgrid[-1.0:1.0:30j, -1.0:1.0:30j] 
# Need an (N, 2) array of (x, y) pairs. 
xy = np.column_stack([x.flat, y.flat]) 

mu = np.array([0.0, 0.0]) 

sigma = np.array([.025, .025]) 
covariance = np.diag(sigma**2) 

z = multivariate_normal.pdf(xy, mean=mu, cov=covariance) 

# Reshape back to a (30, 30) grid. 
z = z.reshape(x.shape) 
Problemi correlati