从所有可能的成对距离列表中生成 P 个随机 N 维点

问题描述 投票:0回答:1

我想生成随机的 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
algorithm math computational-geometry euclidean-distance
1个回答
0
投票

空间维度比点更多(即N > P),如果距离有效,这应该是可能的,这特别意味着它们必须满足三角形不等式。

我们根据直觉取 N = 3。您可以在任何地方选择第一个点。第一个和第二个之间的距离定义了围绕第一个的球体。第二个必须位于该球体的某个位置。第三个与您已放置的点有两个距离。它必须位于两个相应球体的交点上,即一个圆。潜在的第四个点将位于三个球体相交的两点之一。对于第五点,您将耗尽尺寸,并且舍入误差可能会使其难以同时满足所有要求,即使距离源自真实的 3d 配置。这就是为什么 N > P 很有用,因为您可能会避免这种头痛。

在实现方面,上述内容表明您需要从维度递减的超球体中均匀采样。您还必须检查超球面,并将样本空间转换为实际位置。我不知道 numpy 必须提供什么来帮助解决这些问题。

就我个人而言,我还会探索一种不同的方法:以简单的明确定义的位置和方向生成整个配置,然后对其应用随机等距(旋转、平移,也许反射)。您可以将第一个点放置在原点。第二个点位于正 x1 轴上。第三个位于 x1-x2 平面上,具有正 x2 坐标,依此类推。因此,对于每个点,坐标向量中零的数量减少一个,并且最新的坐标始终为正。一般来说,这应该为您提供唯一确定的坐标,将整个随机化转移到完整配置上的操作。

我还没有读过文献,但我想应该在某个地方讨论等距随机抽样。但也许仅仅应用一系列随机操作,比如围绕特定轴的一些旋转,就已经使结果足够随机了?取决于您的要求。

© www.soinside.com 2019 - 2024. All rights reserved.