Python N球面上均匀分布随机点的生成算法

Python N球面上均匀分布随机点的生成算法,python,math,Python,Math,我还没有在Python上找到这种算法的实现 大概是这样的: 有两个输入参数: n-空间的维数 m—n-1球体上的点数 我需要将它们大致均匀地排列在n-球体的表面上 坐标轴位于n-1球体的中心。 例如,在规则球体上的3d中,可以定位点 在我看来,斐波那契算法在视觉上非常好。 我不知道是否有类似的n-球。 我有512D的空间,我将在其中放置1000甚至10000个点 如何在python中实现这一点?有一种简单的方法可以在超球体表面上生成均匀分布 生成具有高斯分布的n个变量(此处列出l)。它们形成

我还没有在Python上找到这种算法的实现

大概是这样的:

有两个输入参数:

  • n-空间的维数
  • m—n-1球体上的点数
我需要将它们大致均匀地排列在n-球体的表面上

坐标轴位于n-1球体的中心。 例如,在规则球体上的3d中,可以定位点

在我看来,斐波那契算法在视觉上非常好。 我不知道是否有类似的n-球。 我有512D的空间,我将在其中放置1000甚至10000个点

如何在python中实现这一点?

有一种简单的方法可以在超球体表面上生成均匀分布

生成具有高斯分布的n个变量(此处列出
l
)。它们形成了一些向量

找到该向量的长度并规范化其分量以提供单位长度结果

示例显示了在10d空间中生成球体上的一个点,还目视检查了圆上点组的均匀性(2d中的球体,hystogram值应接近)


使用与MBo相同的论点:(Muller 1959,Marsaglia 1972)-[https://mathworld.wolfram.com/HyperspherePointPicking.html]我使用numpy在python中展示了我的实现:

import numpy as np

def getRandomSamplesOnNSphere(N , R , numberOfSamples):
    # Return 'numberOfSamples' samples of vectors of dimension N 
    # with an uniform distribution on the (N-1)-Sphere surface of radius R.
    # RATIONALE: https://mathworld.wolfram.com/HyperspherePointPicking.html
    
    X = np.random.default_rng().normal(size=(numberOfSamples , N))

    return R / np.sqrt(np.sum(X**2, 1, keepdims=True)) * X
如果需要在N球体内部生成点,可以这样做(参考:)


(1)从平均值为0、方差为1的高斯分布中生成n个样本的d元组,并将每个d元组规格化为长度为1。那么你的nD元组在(d-1)-球面上近似均匀分布。(d,我假设你指的是球体的嵌入维度,而不是球体本身的维度。例如,一个2-球体是局部二维的东西,它生活在一个三维空间中。)这种方法与另一个受访者在下面发布的方法相同,但我认为这样解释更清楚。(2)分层抽样:将球体分成若干个面积相等的块,并从每个块中取样。你提到了n,它不比d大太多,这意味着纯粹的随机抽样会留下很多空白。我的猜测是,分层抽样,或其他抽样更均匀的方法,将更好地解决这个问题。至于其他更均匀采样的方法,也许你可以在球面上找到一些关于低差异序列(又称准随机数)的东西,这和超球面是一样的。从您的链接:
嵌入(n+1)维欧几里德空间的n-球体称为超球体。
您只需避免一个错误。(2-sphere是3d空间中的曲面等)我想从反转并移植到ND开始:因此只需n次生成伪随机ND矢量
v
,坐标范围
,然后通过
v=v*r/|v |
将矢量长度更改为
r
。这里也有一个非常好的重复(不确定有多大,但至少有一年或两年),但现在找不到(关于生成点正态分布的伪随机超球面)OP,另一种方法是生成非均匀分布,然后以不同的方式对点进行加权(也就是说,在不太密集的区域给点更多的权重)。这是否可行取决于你正在尝试做什么。也许你可以在这里更多地说明你的更大目标。
import numpy as np

def getRandomSamplesOnNSphere(N , R , numberOfSamples):
    # Return 'numberOfSamples' samples of vectors of dimension N 
    # with an uniform distribution on the (N-1)-Sphere surface of radius R.
    # RATIONALE: https://mathworld.wolfram.com/HyperspherePointPicking.html
    
    X = np.random.default_rng().normal(size=(numberOfSamples , N))

    return R / np.sqrt(np.sum(X**2, 1, keepdims=True)) * X
import numpy as np

def getRandomSamplesInNSphere(N , R , numberOfSamples):
    # Return 'numberOfSamples' samples of vectors of dimension N 
    # with an uniform distribution inside the N-Sphere of radius R.
    # RATIONALE: https://math.stackexchange.com/q/87238
    
    randomnessGenerator = np.random.default_rng()
    
    X = randomnessGenerator.normal(size=(numberOfSamples , N))
    U = randomnessGenerator.random((numberOfSamples , 1)) 
    
    return R * U**(1/N) / np.sqrt(np.sum(X**2, 1, keepdims=True)) * X