给定一组点或向量,找到彼此最接近的 N 个点的集合

Posted

技术标签:

【中文标题】给定一组点或向量,找到彼此最接近的 N 个点的集合【英文标题】:Given a set of points or vectors, find the set of N points that are closest to each other 【发布时间】:2021-02-09 00:34:22 【问题描述】:

例如,我有 100 个向量,每个向量的维度为 12。我想找到例如 8 个彼此最接近的向量。换句话说,前 8 个匹配向量。我可以使用欧几里得或曼哈顿距离作为度量指标来量化向量之间的相似性。初步思考表明,我可以将这个问题表述为一个 0-1 非线性规划,随着向量数量的增加,它是 NP 难以解决的。我还使用了 k-means 聚类算法,但它没有使用欧几里得距离作为衡量标准。知道哪种算法可以解决这个问题。我问的原因是因为我确信这个问题在文献中得到了解决,但我找不到这样的算法。

【问题讨论】:

我认为您需要定义距离度量,以便可以很好地定义问题:如何将一组 N 点定义为比另一组更近?关于度量,问题可能或多或少是困难的。 This method 你可能会感兴趣。 为了将来参考,Mathematics Stack Exchange 或 Operations Research Stack Exchange 将是解决此类问题的更好场所,因为它们的用户群和对 LaTeX(数学符号)的支持。 【参考方案1】:

使用 OPL CPLEX,您可以使用 Mathematical Programming 和 Constraint Programming 解决此问题。

数学程序:

int scale=1000000;

int nbdim=2;
int m=8;
int n=50;

range dim=1..nbdim;
range points=1..n;

float x[p in points][d in dim]=rand(scale)/scale;

float distance[p1 in points][p2 in points]=sqrt(sum(d in dim)((x[p1][d]-x[p2][d])^2));

// Should we keep that point ?
dvar  boolean which[points];

dexpr float maxDist=max(ordered i,j in points) distance[i][j]*((which[i]==1) && (which[j]==1));

minimize maxDist;
subject to

  sum (p in points) which[p]==m;


int chosenPoints=k | k in points:which[k]==1;

约束规划:

using CP;

int scale=1000000;

int nbdim=2;
int m=8;
int n=50;

range dim=1..nbdim;
range points=1..n;

float x[p in points][d in dim]=rand(scale)/scale;

float distance[p1 in points][p2 in points]=sqrt(sum(d in dim)((x[p1][d]-x[p2][d])^2));

// which point for as the m th point ?
dvar int which[1..m] in points;

dexpr float maxDist=max(ordered i,j in 1..m) distance[which[i]][which[j]];

minimize maxDist;
subject to

  allDifferent(which);


int chosenPoints=which[k] | k in 1..m;

【讨论】:

【参考方案2】:

这实际上可以表述为二次或线性整数规划:

二次模型可能如下所示:

  min sum((i,j), x(i)*x(j)*dist(i,j))
      sum(i, x(i)) = 8
      x(i) ∈ 0,1 

线性 MIP 模型是二次模型的变体:

  min sum((i,j), y(i,j)*dist(i,j))
      sum(i, x(i)) = 8
      y(i,j) >= x(i)+x(j)-1
      x(i) ∈ 0,1 
      y(i,j) ∈ [0,1]

我们可以通过只考虑i < j 的距离来改进事物(基本上没有重复计算)。

除了对所有距离求和之外,我们还可以最小化所选点的最大距离:

 min z
     z >= y(i,j)*dist(i,j)   for all i<j
     sum(i, x(i)) = 8
     y(i,j) >= x(i)+x(j)-1 
     x(i) ∈ 0,1 
     y(i,j) ∈ [0,1]
  

这些模型与您使用的指标或维度无关。无论是使用欧几里得距离还是曼哈顿距离,或者是标准化还是使用权重,模型都保持不变。无论您拥有低维数据还是高维数据,情况都是一样的。这些模型只需要一个距离矩阵。

使用 Gurobi,MIP 模型求解速度非常快。使用使用您的大小的随机数据(使用 12 维坐标从 100 个点中选择 8 个点),这些模型需要 50 秒和 9 秒的时间用于线性总和和最大模型来找到经过验证的最佳解决方案。更多细节是here。

对于二维数据集,我们可以绘制结果:

【讨论】:

【参考方案3】:

我同意 Jérôme Richard 的观点,即需要澄清距离度量。是连接8个选定点对的56条线段的欧几里得长度之和,还是任意一对之间的最大距离,还是什么?

也就是说,如果“相似性”是目标,我们可能会问最小的球或盒子中包含哪八个点。找到最小的球是一个凸二次问题,找到最小的超矩形有一个非凸目标(我认为),但是找到适合最小超立方体的向量很容易表述为混合整数线性规划。

【讨论】:

以上是关于给定一组点或向量,找到彼此最接近的 N 个点的集合的主要内容,如果未能解决你的问题,请参考以下文章

用Matlab求解一组点的圆锥方程

洛谷P1257 平面上的最接近点对 数学 分治 排序

Paint Tree

给定一组 n 个点 (x,y),是不是有可能在 O(n logn) 时间内找到它们之间具有负斜率的点对的数量?

Prim算法

[CF1042F]Leaf Sets