5

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

在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

如何在N球上随机生成均匀分布的点:http://en.wikipedia.org/wiki/N-sphere#Uniformly_at_random_from_the_.28n.C2.A0.E2.88.92.C2.A01。29球 – unutbu 2013-04-08 13:38:45

+1

等待,你想要点在一个球体上,但均匀分布在x,y,z,(第四维)?这对我来说并不合适。我不认为均匀分布在球体上的点将映射到均匀分布在4维空间中。 – 2013-04-08 14:00:13

+0

@SchighSchagh所以你不能在4个维度上运行蒙特卡罗模拟? – 2013-04-08 14:08:59

回答

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) 
+0

当然,这会在4球体上产生一个随机点,但分布是否均匀? – 2013-04-08 17:40:16

+0

@SchighSchagh:均匀分布?是。 – Manishearth 2013-04-08 17:44:14

+1

x,y,z,w相对于R^4最初是一致随机的,但是它们接受非线性变换,而且我还不清楚OP是否想随机地相对于球或相对于R^4。编辑:你可以指定关于你随机统一要求什么,并证明它? – 2013-04-08 17:54:47

5

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 = 3dim = 4以产生分在一个4球。

+0

进行均匀分布会产生一个采样点,该点的密度高于它将占据的立方体的角点。如何证明使用高斯分布也不会导致这个问题呢?如果我在思想上描绘它似乎是合理的,但它是真的吗?为什么?在指定尺寸时,我假设numpy的高斯分布对于每个坐标都是独立的。 – 2017-11-15 22:19:28

+0

那么零分为什么? – 2017-11-15 22:42:24

+1

@GuillaumeChevalier:我承认我不了解细节,但也许你会发现[此证明大纲有用](https://stats.stackexchange.com/questions/7977/how-to-generate-uniformly-distributed-points -on-表面的最-3- d-单元SPHE的#comment13055_7984)。关于零除的问题:我相信除数为0的概率本身就是0.在实际层面上,NumPy通过发出*警告*并返回'NaN'来处理除数除以(并且Matplotlib跳过等于NaN的点)。 – unutbu 2017-11-15 22:58:05

0

我喜欢@ unutbu的答案,如果高斯抽样确实创建了一个均匀间隔的球形分布(不像从一个立方体抽样),但为了避免在高斯分布上采样并且必须证明有一个简单的解决方案: 样品在球体上的均匀分布(不在立方体上)。

  1. 生成一个均匀分布点。
  2. 计算每个点的平方半径(避开平方根)
  3. 丢弃指向:针对
    • 丢弃点平方半径大于1(因此,该unsquared半径大于1)。
    • 放弃过于接近零半径的点以避免与下一步中划分相关的数值不稳定性。
  4. 对于每个采样点保持,通过常态划分取样点,以便它重新归一化的单元半径。
  5. 清洗并重复以获取更多积分,因为丢弃了样品。

这显然适用于n维空间,因为半径始终是较高维度的L2范数。

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