2009-09-09 5 views
9

assignment problemは単一の行列の形で提出することができるので、numpyがそのような行列を解く関数を持っていれば私はさまよっています。今まで私は誰も見つけていない。たぶん、numpy/scipyに代入問題解決関数があるかどうか知っている人がいますか?割り当て問題、numpy関数ですか?

編集:一方、私はhttp://www.clapper.org/software/python/munkres/にpython(numpy/scipyではない)実装を見つけました。それでも、私はnumpy/scipyの実装がはるかに高速かもしれないと思いますよね?

+0

。それは速くなるだけでなく、numpyで表現する方がはるかに簡単でなければなりません。 – u0b34a0f6ae

答えて

3

いいえ、NumPyにはそのような機能はありません。組み合わせ最適化はNumPyの範囲外です。 scipy.optimizeのオプティマイザの1つで実行することは可能ですが、制約が正しい形式でない可能性があります。

NetworkXには、おそらく割り当て問題のアルゴリズムも含まれています。

+5

scipyバージョン0.18からの実装 'scipy.optimize.linear_sum_assignment'があります。 – joeln

2

numpyをサポートしているPython拡張モジュールとしてMunkres' algorithmの実装があります。私は古いラップトップでうまく使用しました。しかし、それは私の新しいマシンでは動作しません - 私は "新しい" numpyのバージョン(または64ビットのアーチ)に問題があると仮定します。

13

今度はscunk-learnのnumballの実装がsklearn/utils/linear_assignment_.pyの下にあります。その唯一の依存関係はnumpyです。私は約20x20行列で試してみましたが、それは質問にリンクされている行列の約4倍速いようです。 cProfilerは2.517秒と100回の反復で9.821秒を示します。

私は scipy.optimize.linear_sum_assignment新しい最速であってもよいが、あろうと期待していた
+2

これはscipyにバージョン0.18の 'scipy.optimize.linear_sum_assignment'として含まれます。 – joeln

4

(おそらく驚くことではないが)Cython library(ピップサポートしていません)少なくとも私のユースケースのために、非常に高速です:

$ python -m timeit -s 'from scipy.optimize import linear_sum_assignment; import numpy as np; np.random.seed(0); c = np.random.rand(20,30)' 'a,b = linear_sum_assignment(c)' 
100 loops, best of 3: 3.43 msec per loop 
$ python -m timeit -s 'from munkres import munkres; import numpy as np; np.random.seed(0); c = np.random.rand(20,30)' 'a = munkres(c)' 
10000 loops, best of 3: 139 usec per loop 
$ python -m timeit -s 'from scipy.optimize import linear_sum_assignment; import numpy as np; np.random.seed(0);' 'c = np.random.rand(20,30); a,b = linear_sum_assignment(c)' 
100 loops, best of 3: 3.01 msec per loop 
$ python -m timeit -s 'from munkres import munkres; import numpy as np; np.random.seed(0)' 'c = np.random.rand(20,30); a = munkres(c)' 
10000 loops, best of 3: 127 usec per loop 

I 2x2と100x120(10-40倍速い)の間で同様の結果が得られました。

2

すでに@Matthewによって暗示されているように、もう1つの高速実装:scipy.optimizeにはlinear_sum_assignmentという機能があります。ドキュメントから:

使用される方法はハンガリーのアルゴリズムで、MunkresまたはKuhn-Munkresアルゴリズムとしても知られています。それがnumpyので実装されていなかった何恥

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

関連する問題