# Definition du domaine : attributs et leurs valeurs possibles
ATTRIBUTES = [
"Alternate", # Yes, No
"Bar", # Yes, No
"Fri/Sat", # Yes, No
"Hungry", # Yes, No
"Patrons", # None, Some, Full
"Price", # $, $$, $$$
"Raining", # Yes, No
"Reservation", # Yes, No
"Type", # French, Italian, Thai, Burger
"WaitEstimate", # 0-10, 10-30, 30-60, >60
]
ATTRIBUTE_VALUES = {
"Alternate": ["Yes", "No"],
"Bar": ["Yes", "No"],
"Fri/Sat": ["Yes", "No"],
"Hungry": ["Yes", "No"],
"Patrons": ["None", "Some", "Full"],
"Price": ["$", "$$", "$$$"],
"Raining": ["Yes", "No"],
"Reservation": ["Yes", "No"],
"Type": ["French", "Italian", "Thai", "Burger"],
"WaitEstimate": ["0-10", "10-30", "30-60", ">60"],
}
# Les 12 exemples du restaurant, adaptes de la Table 19.1 d'AIMA.
# Attention : les labels de X2 et X3 sont inverses par rapport au livre (et le
# WaitEstimate de X9 differe). Consequence pedagogique assumee : aucune clause
# conjonctive unique n'est consistante avec les 12 exemples, ce qui provoque
# l'effondrement du Version Space observe en section 5.
RAW_EXAMPLES = [
# (Alternate, Bar, Fri/Sat, Hungry, Patrons, Price, Raining, Reservation, Type, WaitEstimate, WillWait)
("Yes", "No", "No", "Yes", "Some", "$$$", "No", "Yes", "French", "0-10", True),
("Yes", "No", "No", "Yes", "Full", "$", "No", "No", "Thai", "30-60", True),
("No", "Yes", "No", "No", "Some", "$", "No", "No", "Burger", "0-10", False),
("Yes", "No", "Yes", "Yes", "Full", "$", "Yes", "No", "Thai", "10-30", True),
("Yes", "No", "Yes", "No", "Full", "$$$", "No", "Yes", "French", ">60", False),
("No", "Yes", "No", "Yes", "Some", "$$", "Yes", "Yes", "Italian","0-10", True),
("No", "Yes", "No", "No", "None", "$", "Yes", "No", "Burger", "0-10", False),
("No", "No", "No", "Yes", "Some", "$$", "Yes", "Yes", "Thai", "0-10", True),
("No", "Yes", "Yes", "No", "Full", "$", "Yes", "No", "Burger", "10-30", False),
("Yes", "Yes", "Yes", "Yes", "Full", "$$$", "No", "Yes", "Italian","10-30", False),
("No", "No", "No", "No", "None", "$", "No", "No", "Thai", "0-10", False),
("Yes", "Yes", "Yes", "Yes", "Full", "$", "No", "No", "Burger", "30-60", True),
]
def parse_example(raw: tuple) -> dict:
"""Convertit un tuple brut en dictionnaire avec attributs + label."""
attrs = {ATTRIBUTES[i]: raw[i] for i in range(len(ATTRIBUTES))}
attrs["WillWait"] = raw[len(ATTRIBUTES)]
return attrs
EXAMPLES = [parse_example(ex) for ex in RAW_EXAMPLES]
print(f"Domaine : {len(ATTRIBUTES)} attributs")
print(f"Exemples : {len(EXAMPLES)} ({sum(1 for e in EXAMPLES if e['WillWait'])} positifs, "
f"{sum(1 for e in EXAMPLES if not e['WillWait'])} negatifs)")