2010-06-03 137 views
2

我试图从高斯分布生成随机数。 Python有非常有用的方法random.gauss(),但这只是一个一维随机变量。我怎样才能以编程方式在n维中从这个分布生成随机数?在Python中生成n维随机数

例如,在两维中,此方法的返回值基本上与平均值的距离,所以我仍然需要(x,y)坐标来确定实际数据点。我想我可以再生成两个随机数,但我不确定如何设置约束。

我很欣赏任何见解。谢谢!

回答

4

numpy的多维具有等同的随机模块中的功能

你要找的功能是numpy.random.normal

+0

完美。谢谢! – Magsol 2010-06-03 21:09:34

1

您需要正确地分解你的多维分配到的组成一维分布。例如,如果您想要一个距离给定中心的高斯分布距离的点和一个均匀分布的角度,可以得到高斯rho和均匀theta(介于0和2之间)的三角洲的极坐标pi),那么,如果你想要笛卡尔坐标,你当然要做一个坐标变换。

+0

在数学上,这正是我所拍摄的内容,我认为这可以通过假设每个维度之间完全独立来完成(如Daniel Stutzbach所提到的)。 – Magsol 2010-06-03 21:09:01

0

这听起来像你要求Multivariate Normal Distribution。要从该分布中生成一个值,需要有一个协方差矩阵来表示x和y之间的关系。你的x和y有什么关系?如果x和y是独立的,则可以使用random.gauss()生成两个值。

如果您不确定您的协方差矩阵是什么,那么您在解决软件问题之前需要先解决一个数学问题。如果您提供更多关于您想要建模的信息,我们可能会提供帮助(并且我看到Alex Martelli刚刚为常见模型发布了一些解决方案)。

+0

我的协方差矩阵本身可以是随机的,或者它可以简单地为0,因为基本上我不在乎是否存在独立性。我只是试图综合相对天真的数据点来测试我正在编写的聚类算法,在这种情况下,0的协方差可能是最容易测试的。我忽视了为每个维度生成随机正态分布数字的想法,因为过分简单化了,但现在你提起来了,似乎这样工作就好了。谢谢! – Magsol 2010-06-03 21:03:32

3

您可以使用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个三维点,您可以执行此操作。

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