Python在4维球面上的点的均匀分布

时间:2013-04-08 13:28:33

标签: python distribution trigonometry montecarlo polar-coordinates

我需要在4维球体上均匀分布点。我知道这不像拾取3个角度和使用极坐标那样微不足道。

在3个维度中我使用

from random import random

u=random()
costheta = 2*u -1 #for distribution between -1 and 1
theta = acos(costheta)
phi = 2*pi*random

x=costheta
y=sin(theta)*cos(phi)
x=sin(theta)*sin(phi)

这给出了x,y和z的均匀分布。

如何获得4个维度的类似分布?

3 个答案:

答案 0 :(得分:7)

A standard way,或许not the fastest,是使用Muller的方法在N球上生成均匀分布的点:

import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d.axes3d as axes3d

N = 600
dim = 3

norm = np.random.normal
normal_deviates = norm(size=(dim, N))

radius = np.sqrt((normal_deviates**2).sum(axis=0))
points = normal_deviates/radius

fig, ax = plt.subplots(subplot_kw=dict(projection='3d'))
ax.scatter(*points)
ax.set_aspect('equal')
plt.show()

enter image description here

只需将dim = 3更改为dim = 4即可在4球上生成点。

答案 1 :(得分:1)

取4D空间中的任意随机点,并计算其单位向量。这将在单位4球上。

from random import random
import math
x=random.normalvariate(0,1)
y=random.normalvariate(0,1)
z=random.normalvariate(0,1)
w=random.normalvariate(0,1)
r=math.sqrt(x*x + y*y + z*z + w*w)
x/=r
y/=r
z/=r
w/=r
print (x,y,z,w)

答案 2 :(得分:0)

如果高斯采样确实产生均匀间隔的球形分布(与立方体采样不同),我喜欢@ unutbu的答案,但为了避免在高斯分布上采样并且必须证明这一点,有一个简单的解决方案:< strong>球体上均匀分布的样本(不在立方体上)。

  1. 统一分布上生成点。
  2. 计算每个点的平方半径(避免平方根)。
  3. 丢弃积分
    • 丢弃平方半径大于1的点(因此,非平方半径大于1)。
    • 丢弃太接近零半径的点,以避免与下一步中的除法相关的数值不稳定。
  4. 对于保留的每个采样点,将采样点除以范数,以便将其重新规范化为单位半径。
  5. 因丢弃样本而清洗并重复以获取更多积分。
  6. 这显然适用于n维空间,因为半径始终是更高维度的L2范数。

    快速避免平方根和高斯分布采样,但它不是矢量化算法。