2014-09-08 20 views
5

Ich möchte eine Gauß-Verteilung in Python mit den X- und Y-Dimensionen, die die Position und die z-Dimension die Größe einer bestimmten Menge bezeichnen.Generieren von 3D-Gauß-Verteilung in Python

Die Verteilung hat einen Maximalwert von 2e6 und eine Standardabweichung Sigma = 0,025.

In MATLAB ich dies mit tun können:

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

, was ich bisher habe, ist:

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

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

sigma = (.025,.025) 

Es gibt eine Numpy Funktion numpy.random.multivariate_normal was angeblich tun können das gleiche wie MATLABs mvnpdf, aber ich habe Mühe, die documentation zu entziffern. Insbesondere, um die Kovarianzmatrix zu erhalten, die von numpy.random.multivariate_normal benötigt wird.

+0

Ich glaube, Sie falsch denken, dass '' numpy.random.multivariate_normal() '' tut das gleiche, weil es gibt Ihnen nicht die pdf der Verteilung, es zieht nur Zufallszahlen aus der Verteilung, die in der Kovarianzmatrix definiert ist, sowie die Erwartungswerte mu. – Nras

+0

Ich sehe was du meinst ja. Irgendwelche Vorschläge, wie man es dann erreicht? – Jonny

+0

Ich sehe Ihre _xy_ Verteilung ist _separable_, das heißt, es ist das Produkt einer _x_ Gaußschen Verteilung mal einer _y_ Gaußschen Verteilung. Vielleicht hilft das bei Python –

Antwort

2

Ab scipy 0,14, können Sie scipy.stats.multivariate_normal.pdf() verwenden:

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) 
Verwandte Themen