【发布时间】:2018-10-15 02:11:50
【问题描述】:
我还没有在 Python 上找到这种算法的实现
类似这样的:
有两个输入参数:
- n - 空间维度。
- m - n-1 球体上的点数。
我需要将它们大致均匀地排列在 n 球的表面上。
坐标轴位于 n-1 个球体的中心。 例如,在常规球体上的 3d 中,可以定位点 like this
在我看来,斐波那契算法在视觉上非常好。 我不知道n-sphere是否有类似的东西。 我有 512D 的空间,我要在里面放置 1000 甚至 10,000 个点。
如何在 python 中做到这一点?
【问题讨论】:
-
(1) 从均值 0、方差 1 的高斯分布生成样本的 n 个 d 元组,并将每个 d 元组标准化为长度 1。然后您的 n 个 d 元组在(d - 1)-球体的表面。 (通过 d,我假设您的意思是球体的嵌入维度,而不是球体本身的维度。例如,2 球体是局部二维的东西,它存在于 3 维空间中。)这种方法与什么是相同的下面由另一位受访者发布,但我认为这样解释更清楚。
-
(2)分层抽样:将球体分成若干等面积的块,从每一块中采样。您提到您的 n 不会比 d 大太多,这意味着纯随机抽样会留下很多空白。我的猜测是分层抽样,或另一种更均匀抽样的方法,在这个问题上会更好地工作。至于其他更均匀采样的方法,也许您可以在球体上找到一些关于低差异序列(又名准随机数)的信息。
-
同超球面。来自你的链接:
An n-sphere embedded in an (n + 1)-dimensional Euclidean space is called a hypersphere.你只需要避免一个错误。 (2-sphere 是 3d 空间中的表面等) -
我会从反转和移植到 ND 开始:Procedural generation of stars with skybox 所以只需 n 次生成伪随机 ND 向量
v,坐标在<-1,+1>范围内,然后将向量的长度更改为rv = v*r/|v|。这里也有一个很好的副本(不确定有多老,但至少有一两年)但现在找不到(关于生成点正态分布的伪随机超球面) -
OP,另一种方法是生成非均匀分布,然后对点进行不同的加权(即,对密度较小的区域中的点给予更大的权重)。这是否是一种可行的方法取决于你想要做什么。也许你可以在这里多谈谈你的更大目标。