1

任务是找到一个坐标为 (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)

但似乎我做错了什么......有人可以提供建议吗?

4

1 回答 1

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]

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

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对其第一个参数的形式有非常具体的期望funfun应该是一个以x第一个参数为参数的函数,其中x是要最小化的值的一维向量。fun也可以采用额外的参数。这些必须通过args参数传递给最小化,并且它们的值是恒定的(即它们不会在最小化过程中改变)。

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

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

xydata.mean(axis=1)
于 2018-11-25T10:09:39.037 回答