我需要在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个维度的类似分布?
答案 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()
只需将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>球体上均匀分布的样本(不在立方体上)。
这显然适用于n维空间,因为半径始终是更高维度的L2范数。
快速避免平方根和高斯分布采样,但它不是矢量化算法。