algorithm - 使到一组 n 个点的欧氏距离之和最小的点

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

我在二维平面上有一组点 W={(x1, y1), (x2, y2),..., (xn, yn)}。你能找到一种算法,将这些点作为输入并返回二维平面上的点 (x, y),该点与 W 中的点的距离总和最小>?换句话说,如果

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

我想最小化:

d1 + d2 + ... + dn

最佳答案

问题

您正在寻找 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). "Sur le point pour lequel la somme des distances de n points donnes est minimum". Tohoku Mathematical Journal. 43: 355–386.

关于algorithm - 使到一组 n 个点的欧氏距离之和最小的点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57277247/

相关文章:

c - 如何编写一个简单的基于文本的协议(protocol),最好是用 C

matlab - 在Matlab中使用离散参数进行优化

mathematical-optimization - 如何确定蚁群优化中的 Ant 数量

algorithm - 找到给定空间和约束点的距离最小的点?

c++ - 如何生成随机顶点以在 C++ 中形成凸多边形?

algorithm - 在 O(n) 时间内用排序的 y 坐标制作优先搜索树

algorithm - 最小化区间内整数的约数

c# - 在圆上转录多边形

c# - 计算功能限制的最佳方法是什么?

python - 使用python的分配优化问题