母集団内の要素の頻度を表すデータ系列が与えられた場合、それをダウンサンプリングする最も簡単な方法は何ですか?
次の母集団:pop = ['a', 'b', 'a', 'c', 'c', 'd', 'c', 'a', 'a', 'b', 'a']
次のように要約できます。freq = {'a': 5, 'c': 3, 'b': 2, 'd': 1}
シンプルな使用:from collections import Counter; Counter(pop)
その母集団をランダムに 5 人にダウンサンプリングするには、次のようにします。
>>> from random import sample
>>> from collections import Counter
>>> pop = ['a', 'b', 'a', 'c', 'c', 'd', 'c', 'a', 'a', 'b', 'a']
>>> smaller_pop = sample(pop, 5)
>>> smaller_freq = Counter(smaller_pop)
>>> print smaller_freq
Counter({'a': 3, 'c': 1, 'b': 1})
freq
しかし、リストを作成せずに情報から直接これを行う方法を探していpop
ます。あなたは、次のような手順が必要ないことに同意するものとします:
>>> from random import sample
>>> from collections import Counter
>>> flatten = lambda x: [item for sublist in x for item in sublist]
>>> freq = {'a': 5, 'c': 3, 'b': 2, 'd': 1}
>>> pop = flatten([[k]*v for k,v in freq.items()])
>>> smaller_pop = sample(pop, 5)
>>> smaller_freq = Counter(smaller_pop)
>>> print smaller_freq
Counter({'a': 2, 'c': 2, 'd': 1})
メモリの考慮事項と速度要件のために、リストをメモリに配置することは避けたいと思いpop
ます。これは、ある種の加重乱数発生器を使用して確実に実行できます。