由于assignment problem可以以单个矩阵的形式提出,如果numpy具有解决这种矩阵的函数,我就会徘徊。到目前为止,我没有找到。也许你们其中一个人知道numpy / scipy是否有一个赋值问题解决函数?
编辑:同时我在http://www.clapper.org/software/python/munkres/找到了一个python(非numpy / scipy)实现。我仍然认为numpy / scipy实现可能会快得多,对吗?
答案 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算法。
答案 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)