分配问题,一个numpy函数?

时间:2009-09-09 10:28:36

标签: python numpy scipy

由于assignment problem可以以单个矩阵的形式提出,如果numpy具有解决这种矩阵的函数,我就会徘徊。到目前为止,我没有找到。也许你们其中一个人知道numpy / scipy是否有一个赋值问题解决函数?

编辑:同时我在http://www.clapper.org/software/python/munkres/找到了一个python(非numpy / scipy)实现。我仍然认为numpy / scipy实现可能会快得多,对吗?

7 个答案:

答案 0 :(得分:16)

sklearn/utils/linear_assignment_.py下的scikit-learn中,现在有一个nunky实现的munkres算法,它唯一的依赖是numpy。我尝试了一些大约20x20的矩阵,它似乎是问题中链接速度的4倍。对于100次迭代,cProfiler显示2.517秒对9.821秒。

答案 1 :(得分:7)

我希望较新的GameObject最快,但(也许并不奇怪)Cython library(没有pip支持)明显更快,至少在我的用例中是这样的:< / p>

scipy.optimize.linear_sum_assignment

我看到大小介于2x2和100x120之间的类似结果(快10-40倍)。

答案 2 :(得分:4)

不,NumPy不包含这样的功能。组合优化不在NumPy的范围之内。可以使用scipy.optimize中的一个优化器来完成它,但我感觉约束可能不是正确的形式。

NetworkX可能还包括分配问题的算法。

答案 3 :(得分:4)

另一个快速实现,正如@Matthew所暗示的那样:scipy.optimize有一个名为linear_sum_assignment的函数。来自文档:

  

使用的方法是匈牙利语算法,也称为Munkres或Kuhn-Munkres算法。

https://docs.scipy.org/doc/scipy-0.18.1/reference/generated/scipy.optimize.linear_sum_assignment.html

答案 4 :(得分:2)

Munkres' algorithm的实现作为python扩展模块,它具有numpy支持。我在旧笔记本电脑上成功使用它。但是,它在我的新机器上不起作用 - 我认为“新”numpy版本(或64bit arch)存在问题。

答案 5 :(得分:1)

从版本2.4(于2019-10-16发行)开始,NetworkX通过nx.algorithms.bipartite.minimum_weight_full_matching解决了该问题。在撰写本文时,该实现在后台使用SciPy的scipy.optimize.linear_sum_assignment,因此期望具有相同的性能特征。

答案 6 :(得分:0)

除了在其他一些答案中已经提到的 scipy.optimize.linear_sum_assignment 中的求解器之外,SciPy(从 1.6.0 开始)还在 scipy.sparse.csgraph.min_weight_full_bipartite_matching 中提供了一个对稀疏友好的求解器。

In [2]: from scipy.sparse import random
In [3]: from scipy.sparse.csgraph import min_weight_full_bipartite_matching
In [4]: from scipy.optimize import linear_sum_assignment

In [15]: sparse = random(1000, 1000, density=0.01, format='csr')
In [16]: %timeit min_weight_full_bipartite_matching(sparse)
3.84 ms ± 12.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [17]: dense = sparse.toarray()
In [18]: %timeit linear_sum_assignment(dense)
18.8 ms ± 291 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)