【问题标题】:Python - Closest MinimumPython - 最接近的最小值
【发布时间】:2019-06-08 12:27:24
【问题描述】:

我有 2 个矩阵都包含 Nx2 元素。任何值都是带有 8-10 位小数的浮点数,它们分别代表一个点的“x”和“y”。

对于第一个数组中的任何元素对 (x, y)(x 在第一列,而 y 在第二列),我需要在第二个数组中找到最近的点。在任何循环中,一旦找到,我需要从第二个数组中删除该值。

最后,我的主要目标是获得最佳解决方案,以便在第一个数组的任何元素与第二个数组的一个元素之间存在一对一的映射,从而满足最接近的值子句。

我创建了一个 NxN 矩阵,通过

计算了从第一个数组的任意点到第二个数组的任意点的距离

scipy.spatial.distance.cdist

代码:

def find_nearest(X_start, X_end):
    mat = scipy.spatial.distance.cdist(X_start, X_end, metric='euclidean')
    new_df = pd.DataFrame(mat)
    return new_df;

下一步是将起点与终点耦合,不应有任何交集,即一对一映射。

我想通过整数编程来实现(使用this)。 所以如果 m[i][j] 是矩阵 NxN 的一个元素,我发现了那些约束

问题是我不知道如何编写目标函数,所以我确定是否需要添加任何其他相关的约束。

您认为这是一条好走的路吗? 最后一个问题似乎不受欢迎,因为我没有公开我已经做过的事情。

原来如此。

【问题讨论】:

  • 此类问题应在 Math SE 或 Computational Science SE 提出。
  • 我应该移动它吗?
  • 如果问题可以移动,我会将它移动到scicomp.stackexchange.com(其中也有 Python 和 SciPy 的标签)。
  • 如果您在两个SE网站上发布相同的问题,您应该通知读者并交叉链接。

标签: python scipy integer-programming


【解决方案1】:

这称为分配问题

   min sum((i,j), dist[i,j]*x[i,j])
   subject to
       sum(i, x[i,j]) = 1 for all j
       sum(j, x[i,j]) = 1 for all i
       x[i,j] in {0,1}

在哪里

 i = 1..n is an element of the first matrix
 j = 1..n is an element of the second matrix
 dist[i,j] is a distance matrix

这些问题可以用专门的求解器解决,也可以表述为 LP(线性规划)问题。

Scipy 有一个简单的赋值求解器 (link)。然而,这不是一个很快的实现:一个好的 LP 求解器更快(link)。

【讨论】:

    【解决方案2】:

    好的,我想这就是您要问的。以下代码将遍历p1 中的每个坐标并计算与p2 中每个坐标的距离(closest_node 函数来自here)然后返回最接近nearest 数组和相应元素的坐标从p2中删除

    p1nearest 之间会有一对一的对应关系,即p1[0] 映射到nearest[0] 等。

    import numpy as np
    
    def closest_node(node, nodes):
        dist_2 = np.sum((nodes - node)**2, axis=1)
        return np.argmin(dist_2)
    
    p1 = np.random.rand(10, 2)
    p2 = np.random.rand(10, 2)
    nearest = []
    
    for coord in p1:
        near = closest_node(coord, p2)
        nearest.append(p2[near])
        p2 = np.delete(p2, near, 0)
    
    nearest = np.array(nearest)
    

    【讨论】:

    • 它是否解决了一对一映射?我不这么认为
    • 它包含 p2 中的所有值,但映射到它们在 p1 中最接近的值。运行几次并自己检查
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-06
    • 1970-01-01
    • 2016-11-24
    相关资源
    最近更新 更多