2016-06-15 3 views
2

私はDEAPツールボックスをPython for Genetic Algorithmで使用しています。random.randintを使用して確率が等しくないランダムな0と1を見つける方法

toolbox.register("attr_bool", random.randint, 0, 1)は、GAの母集団に対してランダムに関数を選択します。私はGAにランダムに0と1を選択させたいが、例えば80%と残りの1つをゼロにしたい。

私はsrng.binomial(X.shape, p=retain_prob)が選択だと思いますが、私はrandom.randintの機能を使いたいと思います。私たちはそれをどうやってできるのだろうか?

+1

random.randint他の(0、4)== 0 '1'または '0ランダムな場合場合は '0のような何かを行うことができます.random()<0.2 else 1'。 – jamesdlin

+0

問題は、 'toolbox.register(" attr_bool "、random.randint、0、1)の' random.randint'の代わりに '0ならばrandom.randint(0、4)== 0 else 1'を使用すると、 '、それは私に以下のエラーを与えます::' TypeError:最初の引数は呼び出し可能でなければならない ' –

答えて

2

の引数は、関数と、あなたが0 if random.randint(0, 4) == 0 else 1は、あなたがエラーを得た機能(その乱数)ではないので、あなたが

それを実行すると、その関数に渡したい引数でなければなりません。この修正は、あなたがtoolbox.registerに渡すことができる関数内でこの式をパッケージ化することです。

# returns 1 with probability p and 0 with probability 1-p 
def bernoulli(p): 
    if random.random() < p: 
     return 1 
    else: 
     return 0 

toolbox.register("attr_bool", bernoulli, 0.8) 
1

random.randintはこのような機能を提供しませんが、randomパッケージに入れたい場合は、random.choice([0] * 1 + [1] * 4)を使用できます。

numpy.randomも、np.random.choice([0, 1], p=[0.2, 0.8])でこの機能を提供します。

+0

' np.random.choice'に固執すれば、100要素のリストを得る方法は?たとえば、[0.2 0.8]の確率を持つ100サイズのリストが必要です。私はループを使いたくない。 –

+0

'np.random.choice([0、1]、size = 100、p = [0.2、0.8])' –

+0

これはリストでありnumpy配列ではない場合、 'tolist'方法。もちろん、ランダムサンプルを再現可能に生成したい場合は、設定したシードを持つ 'RandomState'オブジェクトを生成し、それを使ってサンプルを生成する必要があります。 –

2

自然な方法は、あなたが関数にこの抽象表現でき

1 if random.random() <= 0.8 else 0 

を使用することです。そして、

def bernoulli(p): return 1 if random.random() <= p else 0 

bernoulli(0.8)は必須の確率で1または0を与えるだろう。私は使用しているGAライブラリに精通していませんが、bernoulli()が呼び出し可能であるため、動作するはずです。 toolbox.register

+0

またはこれに相当する 'random.randint': ' 1の場合random.randint(1,10)<= 8 else 0' –

+0

上記のコメントを参照してください –

+0

@AmnKh編集が有効かどうかを確認してください。 –

関連する問題