33

我可以生成具有random.gauss(mu, sigma)函数的高斯数据,但是如何生成二维高斯数据?有没有这样的功能?

4

7 回答 7

65

如果可以使用numpy,就有numpy.random.multivariate_normal(mean, cov[, size])

例如,要获得 10,000 个 2D 样本:

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

哪里mean.shape==(2,)cov.shape==(2,2)

于 2011-10-07T13:07:29.813 回答
21

我想使用指数函数添加一个近似值。这直接生成一个二维矩阵,其中包含一个可移动的对称二维高斯。

我应该注意,我在 scipy 邮件列表档案中找到了这段代码并对其进行了一些修改。

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)

对于参考和增强,它在此处作为要点托管。欢迎请求请求!

于 2013-01-25T16:17:53.630 回答
17

由于标准的二维高斯分布只是两个一维高斯分布的乘积,如果两个轴之间没有相关性(即协变矩阵是对角线),只需调用random.gauss两次。

def gauss_2d(mu, sigma):
    x = random.gauss(mu, sigma)
    y = random.gauss(mu, sigma)
    return (x, y)
于 2011-10-07T13:13:53.807 回答
9
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)

二维高斯函数的简单实现和示例。这里 sx 和 sy 是 x 和 y 方向上的扩展,mx 和 my 是中心坐标。

于 2019-07-07T14:48:21.660 回答
5

Numpy 有一个功能可以做到这一点。它记录在这里。除了上面提出的方法之外,它还允许绘制具有任意协方差的样本。

下面是一个小例子,假设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], '.')
于 2013-01-23T19:27:28.647 回答
2

如果有人找到这个线程并且正在寻找更通用的东西(就像我所做的那样),我已经修改了来自@giessel 的代码。下面的代码将允许不对称和旋转。

import numpy as np

def makeGaussian2(x_center=0, y_center=0, theta=0, sigma_x = 10, sigma_y=10, x_size=640, y_size=480):
    # x_center and y_center will be the center of the gaussian, theta will be the rotation angle
    # sigma_x and sigma_y will be the stdevs in the x and y axis before rotation
    # x_size and y_size give the size of the frame 

    theta = 2*np.pi*theta/360
    x = np.arange(0,x_size, 1, float)
    y = np.arange(0,y_size, 1, float)
    y = y[:,np.newaxis]
    sx = sigma_x
    sy = sigma_y
    x0 = x_center
    y0 = y_center

    # rotation
    a=np.cos(theta)*x -np.sin(theta)*y
    b=np.sin(theta)*x +np.cos(theta)*y
    a0=np.cos(theta)*x0 -np.sin(theta)*y0
    b0=np.sin(theta)*x0 +np.cos(theta)*y0

    return np.exp(-(((a-a0)**2)/(2*(sx**2)) + ((b-b0)**2) /(2*(sy**2))))
于 2021-04-13T21:41:20.373 回答
1

我们可以尝试仅使用该numpy方法np.random.normal生成二维高斯分布。示例代码是np.random.normal(mean, sigma, (num_samples, 2)).

通过取平均值 = 0 和 sigma 20 运行的示例如下所示:

np.random.normal(0, 20, (10,2))

>>array([[ 11.62158316,   3.30702215],
   [-18.49936277, -11.23592946],
   [ -7.54555371,  14.42238838],
   [-14.61531423,  -9.2881661 ],
   [-30.36890026,  -6.2562164 ],
   [-27.77763286, -23.56723819],
   [-18.18876597,  41.83504042],
   [-23.62068377,  21.10615509],
   [ 15.48830184, -15.42140269],
   [ 19.91510876,  26.88563983]])

因此,我们在 2d 数组中获得了 10 个样本,均值 = 0 且 sigma = 20

于 2019-10-27T05:52:18.667 回答