Ich möchte Binomialwahrscheinlichkeiten auf Python berechnen. Ich habe versucht, die Formel anzuwenden:
%Vor%Einige der Wahrscheinlichkeiten, die ich bekomme, sind unendlich. Ich habe einige Werte überprüft, für die p = inf. Für eine von ihnen, n = 450.000 und k = 17. Dieser Wert muss größer als 1e302 sein. Dies ist der Maximalwert, der von Floats behandelt wird.
Ich habe dann versucht, sum(np.random.binomial(n,p,numberOfTrials)==valueOfInterest)/numberOfTrials
Dies zeichnet numberOfTrials-Beispiele und berechnet die durchschnittliche Anzahl der Male, die der Wert valueOfInterest gezeichnet wird.
Dies erhöht keinen unendlichen Wert. Ist dies jedoch ein gültiger Weg? Und warum würde dieser Weg keinen unendlichen Wert aufbringen, während die Berechnung der Wahrscheinlichkeiten funktioniert?
Arbeiten Sie in der Log-Domäne, um Kombinations- und Potenzierungsfunktionen zu berechnen und sie dann auf den Exponenten zu heben.
In etwa so:
%Vor% Entfernt numerischen Überlauf / Überlauf wegen großer Zahlen. In Ihrem Beispiel mit n=450000
und p = 0.5, k = 17
wird p_log = -311728.4
, i zurückgegeben. e., der Logarithmus der endgültigen Wahrscheinlichkeit ist ziemlich klein und daher tritt ein Unterlauf auf, während np.exp
genommen wird. Sie können jedoch immer noch mit der log-Wahrscheinlichkeit arbeiten.
Weil Sie scipy verwenden, dachte ich, ich würde erwähnen, dass scipy bereits statistische Verteilungen implementiert hat. Beachten Sie auch, dass, wenn n so groß ist, die Binomialverteilung durch die Normalverteilung gut angenähert wird (oder Poisson, wenn p sehr klein ist).
%Vor%Um Multiplizität wie Null um Unendlichkeit zu vermeiden, verwenden Sie Schritt für Schritt die Multiplikation.
%Vor%Tags und Links python algorithm probability numpy binomial-coefficients