Combinaisons & Loi hypergéométrique
Aux fanas du calcul probabiliste.
Python 3.
Une fonction "combinaisons" fondée sur une des nombreuses propriétés du triangle de Pascal, elle ne récurre que sur p.
def cnp(n,p):
if p>0:
return int(cnp(n,p-1)/p*(n-p+1))
return 1
Et donc la fonction "Loi hypergéométrique"
Np=Nombre population
Sp=Succès population
Ne=Nombre échantillon
Se=Succès échantillon
def lhg(Se,Ne,Sp,Np):
return cnp(Np-Sp,Ne-Se)/cnp(Np,Ne)*cnp(Sp,Se)
Le contrôle de cohérence sera fait avant appel
Précautions sur la relation d'ordre des arguments
Merci, j'ai pris à mon compte les bons conseils.
A la fonction "Combinaison" j'ajoute la vérification de la relation d'ordre "0 <= p <= n".
(Par convention Cnp(n,p) = 0 si p > n)
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| def cnp(n,p):
"""Nombre de combinaisons"""
if 0 <= p <= n:
if p > n//2:
p = n-p
r, i, j = 1, 1, n-p+1
while j <= n:
r = (r*j)//i
i += 1
j += 1
return r
return 0 |
A la fonction "Loi hypergéométrique" j'ajoute aussi la vérification d'ordre "0 <= Ne <= Np" sur la combinaison en dénominateur, pour éviter une division par zéro, et puisque la probabilité est nulle si elle n'est pas calculable, et donc l'évènement impossible.
Code:
1 2 3 4 5 6 7 8
| def lhg(Se,Ne,Sp,Np):
"""Loi hypergéométrique"""
# Np = Nombre population # Sp = Succès population
# Ne = Nombre échantillon # Se = Succès échantillon
r = 0
if 0 <= Ne <= Np:
r = cnp(Np-Sp,Ne-Se)/cnp(Np,Ne)*cnp(Sp,Se)
return r |