2020年3月18日水曜日

グループ分けの全ての可能な組み合わせ

複数の要素をグループ分けする際の可能な全ての組み合わせが知りたいことがありました。例えば要素A,B,Cがあった場合、グループ分けの全ての組み合わせは以下の5通りになります。

(ABC), (AB)(C), (AC)(B), (BC)(A), (A)(B)(C)

要素の数が4つまでであれば一つ一つ自力で書いていってもいいのですが、5つ以上になると組み合わせが50を超え、面倒な上に間違う可能性が高くなってしまいます。何かいい方法はないかとググってみたものの、探し方が悪いせいか見つかりませんでした。いまいちスマートではないのですが、何とか方法を思いついたので以下にそのPythonスクリプトを載せます。この方法ではitertoolsとmore_intertoolsというライブラリを使います。itertoolsはpythonに標準で入っていますが、more_itertoolsの方はpipかcondaでインストールする必要があります。

import itertools
import more_itertools

d = ['A','B','C']
n = len(d)
l = list(more_itertools.powerset(d))

m = []
for h in l[1:]:
    m.append(''.join(list(h)))
    
r = []
for i in range(1,n+1):
    r += list(itertools.combinations(m, i))
      
print([j for j in r if sorted("".join(list(j))) == d])

手順としては、最初にmore_itertools.powerset(d)で、各要素の全部分集合を生成します。次にグループ数ごとに、itertools.combinations(m, i)を使って部分集合の全ての組み合わせのリストを作成します。当然このリストの中には要素の数が異なっていたり重複が含まれていたりするので、最後にフィルタリングをかけます。このスクリプトを実行した結果は以下のようになります。

#要素がA,B,Cのとき
[('ABC',), ('A', 'BC'), ('B', 'AC'), ('C', 'AB'), ('A', 'B', 'C')]

#要素がA,B,C,Dのとき
[('ABCD',), ('A', 'BCD'), ('B', 'ACD'), ('C', 'ABD'), ('D', 'ABC'), ('AB', 'CD'), ('AC', 'BD'), ('AD', 'BC'), 
('A', 'B', 'CD'), ('A', 'C', 'BD'), ('A', 'D', 'BC'), ('B', 'C', 'AD'), ('B', 'D', 'AC'), ('C', 'D', 'AB'), 
('A', 'B', 'C', 'D')]

MaxEnt解析手順メモ

前回までの記事 で琵琶湖南湖の湖沼図から地形に関するラスターデータを作成しました。今回はこれを利用してMaxEnt解析を試みます。MaxEntはオープンソースのソフトで ここ からダウンロードできます。なお、ここではバージョン3.4.4を使用しています。サンプルとして、ブルーギル...