web-dev-qa-db-fra.com

Comment générer du gaussien 2D avec Python?

Je peux générer des données gaussiennes avec la fonction random.gauss(mu, sigma), mais comment générer des gaussiennes 2D? Y a-t-il une fonction comme ça?

22
user103021

Puisque la distribution gaussienne 2D standard n'est que le produit de deux distributions gaussiennes 1D, s'il n'y a pas de corrélation entre les deux axes (c'est-à-dire que la matrice covariante est diagonale), il suffit d'appeler random.gauss deux fois.

def gauss_2d(mu, sigma):
    x = random.gauss(mu, sigma)
    y = random.gauss(mu, sigma)
    return (x, y)
14
kennytm

Si vous pouvez utiliser numpy, il y a numpy.random.multivariate_normal(mean, cov[, size]) .

Par exemple, pour obtenir 10 000 échantillons 2D:

np.random.multivariate_normal(mean, cov, 10000)

mean.shape==(2,) et cov.shape==(2,2).

45
NPE

Je voudrais ajouter une approximation en utilisant des fonctions exponentielles. Cela génère directement une matrice 2D qui contient un gaussien 2D symétrique mobile.

Je devrais noter que j'ai trouvé ce code dans les archives de la liste de diffusion scipy et l'ai légèrement modifié.

import numpy as np

def makeGaussian(size, fwhm = 3, center=None):
    """ Make a square gaussian kernel.

    size is the length of a side of the square
    fwhm is full-width-half-maximum, which
    can be thought of as an effective radius.
    """

    x = np.arange(0, size, 1, float)
    y = x[:,np.newaxis]

    if center is None:
        x0 = y0 = size // 2
    else:
        x0 = center[0]
        y0 = center[1]

    return np.exp(-4*np.log(2) * ((x-x0)**2 + (y-y0)**2) / fwhm**2)

Pour référence et améliorations, il est hébergé sous forme de Gist ici . Les demandes de tirage sont les bienvenues!

13
giessel

Numpy a une fonction pour ce faire. Il est documenté ici . En plus de la méthode proposée ci-dessus, elle permet de prélever des échantillons avec une covariance arbitraire.

Voici un petit exemple, en supposant que ipython -pylab a démarré:

samples = multivariate_normal([-0.5, -0.5], [[1, 0],[0, 1]], 1000)
plot(samples[:, 0], samples[:, 1], '.')

samples = multivariate_normal([0.5, 0.5], [[0.1, 0.5],[0.5, 0.6]], 1000)
plot(samples[:, 0], samples[:, 1], '.')
4
Johannes
import numpy as np

# define normalized 2D gaussian
def gaus2d(x=0, y=0, mx=0, my=0, sx=1, sy=1):
    return 1. / (2. * np.pi * sx * sy) * np.exp(-((x - mx)**2. / (2. * sx**2.) + (y - my)**2. / (2. * sy**2.)))

x = np.linspace(-5, 5)
y = np.linspace(-5, 5)
x, y = np.meshgrid(x, y) # get 2D variables instead of 1D
z = gaus2d(x, y)

Implémentation simple et exemple de la fonction gaussienne 2D . Ici sx et sy sont les écarts dans les directions x et y, mx et my sont les coordonnées centrales.

0
jitter