2016-06-15 7 views
2

Ich verwende DEAP Toolbox in Python für Genetic Algorithm.So verwenden Sie random.randint, um zufällige 0 und 1 mit nicht gleicher Wahrscheinlichkeit zu finden

toolbox.register("attr_bool", random.randint, 0, 1) ist eine Funktion wählt zufällig 0 und 1 für Populationen in GA. Ich möchte GA zwingen, 0 und 1 zufällig zu wählen, aber mit zum Beispiel 80% eins und dem Rest Null.

Ich denke, srng.binomial(X.shape, p=retain_prob) ist eine Wahl, aber ich möchte random.randint Funktion verwenden. Fragen Sie sich, wie wir das schaffen können?

+1

Sie könnten etwas tun, wie '0, wenn random.randint (0, 4) == 0, sonst 1 'oder' 0, wenn der zufall .random() <0,2 else 1 '. – jamesdlin

+0

Das Problem ist, wenn ich '0 wenn random.randint (0, 4) == 0 else 1' anstelle von 'random.randint' in' toolbox.register ("attr_bool", random.randint, 0, 1) ', es gibt mir den folgenden Fehler' TypeError: das erste Argument muss aufrufbar sein' –

Antwort

2

Die Argumente für toolbox.register muss eine Funktion und die Argumente, die Sie auf diese Funktion zu übergeben wollen, wenn Sie es ausführen

Da 0 if random.randint(0, 4) == 0 else 1 ist keine Funktion (es ist eine Zufallszahl) einen Fehler bekommen. Das Update ist diesen Ausdruck in einer Funktion zu verpacken, die Sie toolbox.register passieren können:

# 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 bietet keine solche Funktionalität, aber wenn Sie im random Paket bleiben möchten, können Sie random.choice([0] * 1 + [1] * 4) verwenden.

numpy.random bietet auch diese Funktionalität mit np.random.choice([0, 1], p=[0.2, 0.8]).

+0

Wenn ich auf 'np.random.choice' bleibe, wie können wir eine Liste von 100 Elementen bekommen? Zum Beispiel brauche ich eine Liste mit der Größe 100, die eine Wahrscheinlichkeit von [0,2 0,8] hat. Ich möchte keine Schleife verwenden. –

+0

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

+0

Wenn Sie es brauchen, um eine Liste und nicht ein numpy Array zu sein, sollten Sie sich die 'tolist' anschauen Methode. Und natürlich, wenn Sie eine zufällige Stichprobe reproduzierbar erzeugen möchten, sollten Sie ein 'RandomState'-Objekt mit einem von Ihnen festgelegten Seed erzeugen und dieses zur Erstellung der Stichproben verwenden. –

2

Eine natürliche Art und Weise ist der Ausdruck

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

Sie können abstrakt diese in eine Funktion verwenden:

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

Dann wird bernoulli(0.8) geben mit den erforderlichen Wahrscheinlichkeiten 1 oder 0. Ich bin nicht vertraut mit der GA-Bibliothek, die Sie verwenden, aber bernoulli() ist aufrufbar, daher sollte es funktionieren.

+0

oder, äquivalent mit 'random.randint': ' 1 wenn random.randint (1,10) <= 8 else 0' –

+0

Bitte beachten Sie den Kommentar oben –

+0

@AmnKh Sehen Sie, ob die Bearbeitung für Sie funktioniert. –