Adloun

Problème — Où chercher le canot ?

Application directe du cours · niveau 2 · mathématiques complémentaires (terminale), chapitre 16 — Thème 6 — Inférence bayésienne

Énoncé

Problème — Où chercher le canot ?

Un canot de sauvetage a dérivé après un naufrage. Les courants et l'heure du naufrage conduisent les secours à répartir leurs certitudes entre trois zones : la probabilité que le canot soit en zone 1 est , en zone 2 elle est , en zone 3 elle est . Un survol d'une zone repère le canot, s'il s'y trouve, avec une probabilité de pour les zones 1 et 3, dégagées, et de seulement pour la zone 2, souvent couverte de brume. Un survol d'une zone où le canot ne se trouve pas ne repère évidemment rien.

Corrigé

Notons , , les trois positions possibles ; elles sont incompatibles et recouvrent tous les cas, ce qui autorise la formule des probabilités totales à trois causes.

En divisant chaque chemin par ce total :

La somme fait bien . L'échec en zone 1 a fait monter les zones 2 et 3, qu'on n'a pourtant pas visitées : c'est le trait le plus contre-intuitif de l'inférence bayésienne. La zone 2 passe en tête, on la survole ensuite.

d'où

Les zones 1 et 3 sont désormais à égalité en tête, et la zone 2 — qui était la plus probable au coup précédent — est passée dernière. Comme la détection est meilleure en zone 1 et 3 () qu'en zone 2, on retourne en zone 1 (ou en zone 3, indifféremment).

et

Les trois numérateurs , et s'additionnent à : le contrôle est bon. La zone 3, la moins probable au départ, est maintenant la plus probable — uniquement parce qu'elle est la moins explorée.


def apres_echec(proba, zone, detection):
    # Actualise la liste des probabilites apres une recherche infructueuse.
    vraisemblance = [1.0] * len(proba)
    vraisemblance[zone] = 1 - detection
    poids = [p * v for p, v in zip(proba, vraisemblance)]
    total = sum(poids)
    return [w / total for w in poids]

p = [0.5, 0.3, 0.2]
p = apres_echec(p, 0, 0.6);  print([round(x, 4) for x in p])
p = apres_echec(p, 1, 0.5);  print([round(x, 4) for x in p])
p = apres_echec(p, 0, 0.6);  print([round(x, 4) for x in p])
# [0.2857, 0.4286, 0.2857]
# [0.3636, 0.2727, 0.3636]
# [0.186, 0.3488, 0.4651]

Il y a donc de chances que le canot ait été retrouvé au cours des trois premiers survols.

Une recherche bien conduite n'est pas une suite de coups indépendants : chaque échec est une information, et c'est elle qui désigne le survol suivant.

Les autres exercices de ce chapitre Le cours du chapitre

Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.