web-dev-qa-db-ja.com

Pythonで2Dガウスを生成する方法は?

random.gauss(mu, sigma)関数を使用してガウスデータを生成できますが、2Dガウスを生成するにはどうすればよいですか?そのような機能はありますか?

22
user103021

標準の2Dガウス分布は2つの1Dガウス分布の積であるため、2つの軸間に相関がない場合(つまり、共変行列は対角線です)、random.gaussを2回呼び出すだけです。

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

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)

45
NPE

指数関数を使用して近似を追加したいと思います。これにより、移動可能な対称2次元ガウスを含む2次元行列が直接生成されます。

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)

参照および機能強化のために、Gist here としてホストされています。プルリクエストを歓迎します!

13
giessel

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], '.')
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)

2D Gaussian function の簡単な実装と例。ここで、sxとsyはxとy方向の広がり、mxとmyは中心座標です。

0
jitter