我想生成随机的 N 维点,其约束是彼此之间具有精确的欧几里得距离(已知)。
点数
P = 100
超空间的维数 N = 512
因此,可能的成对距离数由公式
L = P*(P-1)/2
给出。
如果 P = 100
,则 L = 4950
。
假设我有一个包含 4950 个距离值的列表,其中每个值都指一个精确的点对点组合。
可以使用numpy来实现吗?
将点对(
P = 2
)视为L = 1
时,这样做很简单,但我试图弄清楚是否可以将其推广到更高的P
值?
这是我对
P = 2
的实现,将 set_dist
视为所需的距离值。
import numpy as np
from sklearn.metrics.pairwise import euclidean_distances
N = 512
set_dist = 5.
point_0 = np.random.rand(N).reshape(1, -1)
point_1 = np.random.rand(N).reshape(1, -1)
rand_dist = euclidean_distances(point_0, point_1)
point_0 = point_0 * set_dist / rand_dist
point_1 = point_1 * set_dist / rand_dist
空间维度比点更多(即N > P),如果距离有效,这应该是可能的,这特别意味着它们必须满足三角形不等式。
我们根据直觉取 N = 3。您可以在任何地方选择第一个点。第一个和第二个之间的距离定义了围绕第一个的球体。第二个必须位于该球体的某个位置。第三个与您已放置的点有两个距离。它必须位于两个相应球体的交点上,即一个圆。潜在的第四个点将位于三个球体相交的两点之一。对于第五点,您将耗尽尺寸,并且舍入误差可能会使其难以同时满足所有要求,即使距离源自真实的 3d 配置。这就是为什么 N > P 很有用,因为您可能会避免这种头痛。
在实现方面,上述内容表明您需要从维度递减的超球体中均匀采样。您还必须检查超球面,并将样本空间转换为实际位置。我不知道 numpy 必须提供什么来帮助解决这些问题。
就我个人而言,我还会探索一种不同的方法:以简单的明确定义的位置和方向生成整个配置,然后对其应用随机等距(旋转、平移,也许反射)。您可以将第一个点放置在原点。第二个点位于正 x1 轴上。第三个位于 x1-x2 平面上,具有正 x2 坐标,依此类推。因此,对于每个点,坐标向量中零的数量减少一个,并且最新的坐标始终为正。一般来说,这应该为您提供唯一确定的坐标,将整个随机化转移到完整配置上的操作。
我还没有读过文献,但我想应该在某个地方讨论等距随机抽样。但也许仅仅应用一系列随机操作,比如围绕特定轴的一些旋转,就已经使结果足够随机了?取决于您的要求。