【问题标题】:Randomly fill a 3D grid according to a probability density function p(x,y,z)根据概率密度函数 p(x,y,z) 随机填充 3D 网格
【发布时间】:2015-12-19 22:52:09
【问题描述】:

如何按照给定概率密度函数指定的顺序填充 3D 网格?

使用 python,我想以 随机 的顺序放置点,但是根据该区域上的某些指定概率分布,没有重复点。

依次:

  • 创建离散的 3D 网格
  • 为每个网格点指定一个概率密度函数,pdf(x,y,z)
  • 放置一个点 (x0,y0,z0),其随机位置与 pdf(x,y,z) 成正比
  • 继续添加点(不重复),直到所有位置都被填满

所需的结果是网格中所有点的所有点(不重复)的列表,按照它们被填充的顺序。

【问题讨论】:

  • 你确定它们填充的是立方体,而且不仅仅是投影吗? 2D 切片是什么样的?
  • 好问题,我想这可能会出现。除非我跑到边界(在这种情况下是 3,我不是),否则即使是投影也不应该区分/显示 x、y 或 z,这显然是这样做的。这是因为pdf只有radial依赖。
  • 所以你基本上是在尝试从多元高斯生成和绘制绘图?
  • 是的! - 好吧,在这种情况下。一般来说,我想指定一个具有任意空间依赖性的 pdf。
  • 您为什么要编辑问题以删除原始代码,然后将其作为答案发布?

标签: python sorting numpy random probability


【解决方案1】:

这是一个使用高斯 pdf 的示例(参见图表)。此代码很容易适应任何指定的 pdf:

%matplotlib qt 
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

#number of points to lay down:
n = 4000;

#create meshgrid:
min, max, L = -5, 5, 91;
[x_grid,y_grid,z_grid] = np.meshgrid(np.linspace(min,max,L),np.linspace(min,max,L),np.linspace(min,max,L))
xi,yi,zi = x_grid.ravel(),y_grid.ravel(),z_grid.ravel()

#create normalized pdf (gaussian here):
pdf = np.exp(-(x_grid**2 + y_grid**2 + z_grid**2));
pdf = pdf/np.sum(pdf);

#obtain indices of randomly selected points, as specified by pdf:
randices = np.random.choice(np.arange(x_grid.ravel().shape[0]), n, replace = False,p = pdf.ravel())

#random positions:
x_rand = xi[randices]
y_rand = yi[randices]
z_rand = zi[randices]

fig = plt.figure();
ax = fig.add_subplot(111, projection='3d',aspect='equal')
svals = 16;
ax.scatter(x_rand, y_rand, z_rand, s=svals, alpha=.1)

【讨论】:

    【解决方案2】:

    以下不实现从多元高斯绘图:

    xi_sorted = np.random.choice(x_grid.ravel(),x_grid.ravel().shape, replace=False, p = pdf.ravel())
    yi_sorted = np.random.choice(x_grid.ravel(),x_grid.ravel().shape, replace=False, p = pdf.ravel())
    zi_sorted = np.random.choice(x_grid.ravel(),x_grid.ravel().shape, replace=False, p = pdf.ravel())
    

    那是因为p(x)*p(y)*p(z) != p(x,y,z) 除非三个变量是独立的。您可以考虑像Gibbs sampler 这样的东西,通过从单变量分布中顺序提取来从联合分布中提取。

    在多元正态的特定情况下,可以使用(完整示例)

    from __future__ import division
    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib.cm as cm
    from mpl_toolkits.mplot3d import Axes3D
    from math import *
    
    num_points = 4000
    
    sigma = .5;
    mean = [0, 0, 0]
    cov = [[sigma**2,0,0],[0,sigma**2,0],[0,0,sigma**2]]
    
    x,y,z = np.random.multivariate_normal(mean,cov,num_points).T
    
    svals = 16
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d',aspect='equal')
    ax.scatter(x,y,z, s=svals, alpha=.1,cmap=cm.gray)
    

    【讨论】:

    • 感谢您简明扼要地说明我的错误!我曾认为p(x)*p(y) = p(x,y) 在高斯分布的特殊情况下。因为某些原因。如果您可以提供代码,那将导致更快的投票/接受:)
    • @anon0909 我更新了我的答案以包含一个完整的工作示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-30
    • 2017-12-20
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    • 2012-11-21
    相关资源
    最近更新 更多