Théorème de bayes sur Python

Fermé
Maxensuel - Modifié le 21 janv. 2022 à 22:48
mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 - 21 janv. 2022 à 23:09
Bonjour,

J'aimerais réussir à créer un petit programme python pour pouvoir facilement trouver des probabilités conditionnelles grâce à la [update_geometric_aligment_fsm' formule de Bayes].

Cependant je n'ai jamais vraiment appris le langage python, et j'ai fait un programme qui ne marche malheureusement pas pour "tenter" de calculer une probabilité P(B/A) en ayant les probas de P(A), P(B) et P(A/B).
Voici mon "programme" actuel :

# Type your text here
print ("theoreme de bayes")
a = float(input("P(A/B) = "))
b = float(input("P(B) = "))
c = float(input("P(A) = "))
d = (a * b) / c
e = (a * b) / ((a * b) + d)
print ("P(B/A)=",round(e, 3),"\n",round(e * 100, 1)"%")

1 réponse

mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 7 751
Modifié le 21 janv. 2022 à 23:19
Bonjour,

Merci d'utiliser les [balises de code] dans tes prochains messages.

Réponse rapide
  • Ton erreur vient du
    print
    (il manque une virgule devant le
    "%"
    )
  • D'un point de vue maths, le calcul me paraît étrange, mais ça n'est pas ma spécialité.


Partie maths

D'après cette page, la formule de Bayes est :

P(A|B) = P(B|A) * P(A) / P(B)


... donc si on se ramène aux probabilités que tu demandes dans ton script, on transforme juste la formule par symétrie :

P(B|A) = P(A|B) * P(B) / P(A)


Tu as donc déjà toutes ces probabilités pour faire ton calcul. Dans ton programme, j'ai l'impression que pour ton calcul tu t'es inspiré de cette page mais la formule utilisée est :

P(B|A) = [P(A|B) * P(A)] / [P(A|B) * P(A) + P(A|!B) * P(B)]


... et donc :
  • ce que tu appelles
    a
    est
    P(A|B)
    ;
  • ce que tu appelles
    b
    est
    P(A)
    ;
  • ce que tu appelles
    d
    pourrait correspondre à
    P(A|!B) * P(B)
    , mais dans ton programme c'est
    P(A|B) * P(B) / P(A)
    et donc ça voudrait dire que
    P(A|!B) = P(A|B) / P(A)
    ...


Partie python

Bref, par rapport aux probabilités que tu demandes, tu peux directement appliquer la formule de Bayes. Et plutôt que de nommer tes variables
a, b, c, d, e,
on peut leur donner des noms plus parlants. Enfin, je te recommande les f-strings pour écrire tes chaînes ce sera peut être plus simple (entre accolade, tu peux récupérer le retour d'un code python, en particulier la valeur d'une variable).

Programme final

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

print("theoreme de bayes")
p_a_b = float(input("P(A/B) = "))
p_b = float(input("P(B) = "))
p_a = float(input("P(A) = "))
# P(B|A) = P(A|B) * P(B) / P(A)
p_b_a = p_a_b * p_b / p_a
print(f"P(B/A) = {round(p_b_a, 3)}")
print(f"{round(p_b_a * 100, 1)}%")


Exemple : Si on reproduit cet exemple, P(A) vaut d'après la fin du calcul 0.19 + 0.045 = 0.235. On a maintenant les valeurs demandées par ton programme :

theoreme de bayes
P(A/B) = 0.9
P(B) = 0.05
P(A) = 0.235
P(B/A) = 0.191
19.1%


Bonne chance
0