我正在尝试从高斯分布中生成随机数。Python有非常有用的random.gauss()
方法,但这只是一个一维随机变量。我如何以编程方式从这个 n 维分布中生成随机数?
例如,在二维中,此方法的返回值本质上是与平均值的距离,因此我仍然需要 (x,y) 坐标来确定实际数据点。我想我可以再生成两个随机数,但我不确定如何设置约束。
我很欣赏任何见解。谢谢!
我正在尝试从高斯分布中生成随机数。Python有非常有用的random.gauss()
方法,但这只是一个一维随机变量。我如何以编程方式从这个 n 维分布中生成随机数?
例如,在二维中,此方法的返回值本质上是与平均值的距离,因此我仍然需要 (x,y) 坐标来确定实际数据点。我想我可以再生成两个随机数,但我不确定如何设置约束。
我很欣赏任何见解。谢谢!
Numpy 与 random 模块中的函数具有多维等价物
您正在寻找的功能是 numpy.random.normal
您可以使用该np.random.multivariate_normal()
功能执行此操作。它不仅适用于二维数据,而且适用于任意数量的维度。
例如,如果您希望有 100 个以点 (1,3) 为中心的二维点,您可以执行以下操作。
mean = [1, 3]
cov = [[8, -5], [0.2, 0.2]]
x, y = np.random.multivariate_normal([0, 2], cov, 100).T
对于以点 (1,10,100) 为中心的 100 个 3 维点,您可以执行此操作。
mean = [1, 10, 100]
cov = [[1,1,1], [1,1,1], [1,1,1]]
x, y, z = np.random.multivariate_normal(mean, cov, 100).T
有关更多信息,请参阅文档,但您也可以问我。http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.multivariate_normal.html
您需要将多维分布正确分解为一维分布的组合。例如,如果您想要一个距给定中心的高斯分布距离和围绕它的均匀分布的角度的点,您将获得具有高斯 rho 和统一 theta(介于 0 和 2 之间)的 delta 极坐标pi),那么,如果你想要笛卡尔坐标,你当然要进行坐标变换。
听起来您要的是Multivariate Normal Distribution。要从该分布生成一个值,您需要有一个协方差矩阵来说明 x 和 y 之间的关系。你的 x 和 y 有什么关系?如果 x 和 y 是独立的,您可以使用 random.gauss() 生成两个值。
如果您不确定您的协方差矩阵是什么,那么您需要解决一个数学问题,然后才能解决软件问题。如果您提供有关您要建模的内容的更多信息,我们可能会提供帮助(我看到 Alex Martelli 刚刚发布了一些常见模型的解决方案)。