|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : décembre 2006 Messages : 10 ![]() |
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 |
|
|
00
|
|
|
#2 |
![]() ![]() Matthieu BrucherDéveloppeur HPC Inscription : juillet 2005 Messages : 9 697 ![]() |
Sauf que si p et n sont entiers, il peut y avoir des problèmes d'arrondi ! Je mettrai la division en dernier, au moins.
|
|
|
00
|
|
|
#3 | ||||
|
Expert Confirmé
![]() ![]() Inscription : décembre 2007 Messages : 1 777 ![]() |
Bonjour,
Le code proposé pour le nombre de combinaisons est très concis et très élégant, mais pose 2 petits problèmes: - il est effectivement nécessaire d'utiliser la division entière comme le dit Matthieu Brucher (sinon, avec de fortes valeurs de n et p: OverflowError: integer division result too large for a float). Mais, dans la formule, il faut absolument que la multiplication soit faite avant la division, sinon, le résultat peut être faux. La formule corrigée est donc: Code :
Voilà un calcul non récursif qui n'a pas cet inconvénient: Code :
Avec un tel code, on peut faire un calcul comme combin(1000000, 100000) qui donne un nombre de 141179 chiffres en un peu moins de 2 minutes.
__________________
Ne rien ranger permet d'observer la loi universelle d'entropie: l'inévitable convergence vers le chaos... Mes recettes python: http://www.jpvweb.com |
||||
|
|
00
|
|
|
#4 | ||||
|
Invité de passage
![]() Inscription : décembre 2006 Messages : 10 ![]() |
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 :
Code :
|
||||
|
|
00
|
|
|
#5 | ||
|
Invité de passage
![]() Inscription : décembre 2006 Messages : 10 ![]() |
Mea culpa!! Je corrige mon erreur dans le contrôle de la relation d'ordre pour la fonction lhg().
L'ensemble des contrôles dans lhg() et cnp() est désormais exaustif et sans redondance des contraintes propres à la loi hypergéométrique. La fonction lhg() retourne 0.0 dans tous les cas où elle n'est pas calculable (Division par 0 notamment), donc quand la probabilité qu'elle calcule est celle d'un évènement impossible. Je fais ici le choix de retourner une probabilité nulle qui me dispense de traiter des erreurs. (Le 0.0 suffit pour le calcul de probabilités composées ET et OU tout en allègeant le programme du traitement d'erreurs.) Je conserve le contrôle de la relation d'ordre pour la fonction cnp() qui vient en complément indispensable au contrôle de la relation d'ordre dans lhg() pour cnp(Np-Sp,Ne-Se) et cnp(Sp,Se). Modifier le contrôle dans cnp() rend fausse la fonction lhg(). Pour ce qui concerne mon propre besoin (1), mes deux fonctions sont abouties. Elles calculent ce qui est calculable, ou renvoient 0 ou 0.0 (et non pas une erreur à traiter) pour ce qui est incalculable qui traduit une impossibilité et donc un évènement de probabilité nulle. Mes deux fonctions ont été vérifiées et confirmées en faisant varier les paramètres Se, Ne, Sp et Np chacun de 0 à 4, sous Python3 et sous Excel. Merci à Matthieu Brucher et à Tyrtamos pour le coup de main. Tyrtamos, merci du while vs récursion. Si vous passez par ici, giflez moi si j'ai fait une erreur. Mais bon, j'ai bossé. Cordialement Myshl Code :
|
||
|
|
00
|
Copyright © 2000-2013 - www.developpez.com