¿Cómo generar gaussian 2D con Python?
(4)
Puedo generar datos gaussianos con la función random.gauss(mu, sigma)
, pero ¿cómo puedo generar gaussianos 2D? ¿Hay alguna función como esa?
Dado que la distribución estándar de Gauss en 2D es solo el producto de dos distribuciones de Gauss en 1D, si no hay correlación entre los dos ejes (es decir, la matriz covariante es diagonal), simplemente llame a random.gauss
dos veces.
def gauss_2d(mu, sigma):
x = random.gauss(mu, sigma)
y = random.gauss(mu, sigma)
return (x, y)
Me gustaría agregar una aproximación usando funciones exponenciales. Esto genera directamente una matriz 2d que contiene un 2d gaussiano simétrico móvil.
Debo tener en cuenta que encontré este código en los archivos de la lista de correo scipy y lo modifiqué un poco.
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)
Para referencias y mejoras, se encuentra here como una esencia. Tire de las solicitudes de bienvenida!
Numpy tiene una función para hacer esto. Está documentado here . Además del método propuesto anteriormente, permite extraer muestras con covarianza arbitraria.
Aquí hay un pequeño ejemplo, asumiendo que se inicia ipython -pylab
:
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], ''.'')
Si puedes usar numpy
, hay numpy.random.multivariate_normal(mean, cov[, size])
.
Por ejemplo, para obtener 10,000 muestras 2D:
np.random.multivariate_normal(mean, cov, 10000)
donde mean.shape==(2,)
y cov.shape==(2,2)
.