【问题标题】:Finding minimual spatial distance寻找最小空间距离
【发布时间】:2019-04-27 05:19:04
【问题描述】:

任务是找到这样一个具有 (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)

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

【问题讨论】:

  • 您为什么认为有问题? (“因为它不起作用”似乎是一个有效的答案,但我们需要的不止于此。请不要在 cmets 中回答;edit 你的问题是添加所有缺失的信息。)
  • 您基本上走在正确的轨道上,但您的基本问题归结为minimize(也可能还有cdist)的参数的语法/公式。 minimize 的第一个参数需要是满足一些特定要求的函数。详情见我的回答

标签: python numpy scipy minimize scipy-spatial


【解决方案1】:

解决方案

这是一个完整的工作示例,用于拟合(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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-03
    • 1970-01-01
    • 2011-07-23
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    相关资源
    最近更新 更多