将欧几里得距离之和最小化到一组n点的点

时间:2019-07-30 17:40:04

标签: algorithm mathematical-optimization computational-geometry convex-optimization

我在2D平面上有一组点W={(x1, y1), (x2, y2),..., (xn, yn)}。您是否可以找到一种算法,将这些点作为输入并在2D平面上返回一个点(x, y),该点与W中的点的距离之和最小?换句话说,如果

di = Euclidean_distance((x, y), (xi, yi))

我要最小化:

d1 + d2 + ... + dn

2 个答案:

答案 0 :(得分:4)

问题

您正在寻找geometric median

简单的解决方案

没有针对此问题的封闭式解决方案,因此使用了迭代或概率方法。最简单的方法可能是使用Weiszfeld的算法:

Weiszfeld's algorithm

我们可以在Python中实现以下操作:

import numpy as np
from numpy.linalg import norm as npnorm
c_pt_old = np.random.rand(2)
c_pt_new = np.array([0,0])

while npnorm(c_pt_old-c_pt_new)>1e-6:
    num   = 0
    denom = 0
    for i in range(POINT_NUM):
        dist   = npnorm(c_pt_new-pts[i,:])
        num   += pts[i,:]/dist
        denom += 1/dist
    c_pt_old = c_pt_new
    c_pt_new = num/denom

print(c_pt_new)

Weiszfeld的算法有可能无法收敛,因此最好从不同的起点运行几次。

常规解决方案

您也可以使用second-order cone programming (SOCP)找到它。除了解决您的特定问题外,该通用公式还使您可以轻松地添加约束和权重,例如每个数据点位置的不确定性。

为此,您创建了许多指标变量,这些变量代表建议的中心点和数据点之间的距离。

然后将指标变量的总和最小化。结果如下

import cvxpy as cp
import numpy as np
import matplotlib.pyplot as plt

#Generate random test data
POINT_NUM = 100
pts       = np.random.rand(POINT_NUM,2)

c_pt      = cp.Variable(2)           #The center point we wish to locate
distances = cp.Variable(POINT_NUM)   #Distance from the center point to each data point

#Generate constraints. These are used to hold distances.
constraints = []                     
for i in range(POINT_NUM):
    constraints.append( cp.norm(c_pt-pts[i,:])<=distances[i] ) 

objective = cp.Minimize(cp.sum(distances))

problem = cp.Problem(objective,constraints)

optimal_value = problem.solve()

print("Optimal value = {0}".format(optimal_value))
print("Optimal location = {0}".format(c_pt.value))

plt.scatter(x=pts[:,0], y=pts[:,1], s=1)
plt.scatter(c_pt.value[0], c_pt.value[1], s=10)
plt.show()

SOCP在number of solvers中可用,包括CPLEX,Elemental,ECOS,ECOS_BB,GUROBI,MOSEK,CVXOPT和SCS。

我已经测试过,两种方法对公差范围内的问题给出相同的答案。

  

Weiszfeld,E.(1937)。 “最小距离倒数”。东北数学杂志。 43:355–386。

答案 1 :(得分:-1)

第三种方法是使用紧凑的非线性规划公式。不受约束的NLP模型将是:

  min sum(i,  ||x-p(i)|| )

这只有2个变量(x的坐标)。

有一个很好的起点。令p(i,c)为数据点的坐标。那么平均值是

  m(c) = sum(i, p(i,c)) / n

其中n是数据点的数量。这一点通常非常接近x的最佳值。因此,我们可以将m用作x的出色起点。

一些有限的实验表明,这种方法比大型n的锥编程公式要快得多。

有关详细信息,请参见Yet Another Math Programming Consultant - Finding the Central Point in a Point Cloud blog post