寻找最小空间距离

时间:2018-11-25 09:40:15

标签: python numpy scipy minimize scipy-spatial

任务是找到一个坐标为(x,0)的点,以使距原始集合的最远点(距离为欧几里得)的距离最小。 我的想法是找到找到像这样的欧氏距离的函数的最小值:

import matplotlib.pyplot as plt
from scipy.spatial.distance import cdist
from scipy.optimize import minimize

def function_3(points_x, points_y):
    dots = np.array([points_x,points_y])
    ans = minimize(cdist(dots,points1),x0=0)
    return(ans)

但是看来我做错了什么...有人可以提建议吗?

1 个答案:

答案 0 :(得分:2)

解决方案

下面是(x, 0)形式的拟合点的完整工作示例:

from scipy.spatial.distance import cdist
from scipy.optimize import minimize

# set up a test set of 100 points to fit against
n = 100
xyTestset = np.random.rand(n,2)*10

def fun(x, xycomp):
        # x is a vector, assumed to be of size 1
        # cdist expects a 2D array, so we reshape xy into a 1x2 array
        xy = np.array((x[0], 0)).reshape(1, -1)
        return cdist(xy, xycomp).max()

fit = minimize(fun, x0=0, args=xyTestset)
print(fit.x)

输出:

[5.06807808]

粗略地说,这意味着最小化正按预期找到随机测试点集的质心。如果您想对(x, y)形式的点进行2D拟合,则可以执行以下操作:

from scipy.spatial.distance import cdist
from scipy.optimize import minimize

# set up a test set of 100 points to fit against
n = 100
xyTestset = np.random.rand(n,2)*10

def fun(x, xycomp):
        # x is a vector, assumed to be of size 2
        return cdist(x.reshape(1, -1), xycomp).max()

fit = minimize(fun, x0=(0, 0), args=xyTestset)
print(fit.x)

输出:

[5.21292828 5.01491085]

正如您所期望的,它再次大致是xyTestset中100个随机点的质心。

完整的说明

您遇到的问题是scipy.optimize.minimize对第一个参数fun的形式有非常特定的期望。 fun应该是一个以x作为第一个参数的函数,其中x是要最小化的值的一维向量。 fun也可以接受其他参数。必须通过args参数将它们传递到最小化中,并且它们的值是恒定的(即,在最小化过程中它们不会改变)。

此外,您应该注意,适合(x, 0)的情况可以简化。它实际上是一维问题,因此您所需要做的就是计算点之间的x距离。您可以完全忽略y距离,而仍然得到相同的结果。

此外,您无需最小化即可解决您所陈述的问题。重心是使到最远点的距离最小的点(与说“最小化所有点的距离”相同)。质心的坐标是一组点中每个坐标的均值,因此,如果将点存储在Nx2数组xydata中,则可以通过执行以下操作来计算质心:

xydata.mean(axis=1)