繁体   English   中英

Python 4 维球体上点的均匀分布

[英]Python Uniform distribution of points on 4 dimensional sphere

我需要在 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 个维度的类似分布?

然而,一种标准方法,也许不是最快的,是使用穆勒的方法在 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 球体上生成点。

在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)

我喜欢@unutbu 的回答,如果高斯采样真的创建了一个均匀分布的球面分布(与从立方体采样不同),但是为了避免对高斯分布进行采样并且必须证明这一点,有一个简单的解决方案:在均匀分布采样分布在球体上(不是在立方体上)。

  1. 均匀分布上生成点。
  2. 计算每个点的平方半径(避免平方根)。
  3. 丢弃积分
    • 丢弃平方半径大于 1 的点(因此,非平方半径大于 1)。
    • 丢弃太接近零半径的点,以避免在下一步中与除法相关的数值不稳定性。
  4. 对于保留的每个采样点,将采样点除以范数,以将其重新归一化为单位半径。
  5. 由于丢弃的样品,清洗并重复更多点。

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

它很快,以避免在高斯分布上进行平方根和采样,但它不是矢量化算法。

我找到了一个从 N-dim 球体采样的好方法 主要思想是:

如果 Y 来自不相关的多元正态分布,则S = Y / ||Y|| 在单位 d 球面上具有均匀分布。 将 S 乘以U 1/d ,其中 U 在单位间隔 (0,1) 上具有均匀分布,在单位 d 维球中创建均匀分布。

这是执行此操作的python代码:

Y = np.random.multivariate_normal(mean=[0], cov=np.eye(1,1), size=(n_dims, n_samples))
Y = np.squeeze(Y, -1)
Y /= np.sqrt(np.sum(Y * sample_isotropic, axis=0))
U = np.random.uniform(low=0, high=1, size=(n_samples)) ** (1/n_dims)
Y *= distr * radius # in my case radius is one

这是我得到的球体:

领域

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM