Een kansmodel
Na de surfer en het hoofdstuk PageRank bouw je bij PageRank van CS50 AI allebei, de surfer en het rekenen in rondes, op je eigen computer. Wat je daarvoor nodig hebt, oefen je hier eerst op een ander probleem: het weer van morgen. Morgen hangt af van vandaag, zoals de volgende pagina van de surfer afhangt van de pagina waar hij is. Je begint met de kansen.
Je gebruikt in dit project een dictionary in een dictionary uit
Geneste dictionaries,
return uit Return-waarden,
while uit De while-loop,
abs en max uit
itereren tot het stabiel is,
en een set uit Sets. Kiezen met kansen en
afronden zijn nieuw: die leer je onderweg.
Voorspel
model = {
"zon": {"zon": 0.5, "wolken": 0.3, "regen": 0.2},
"wolken": {"zon": 0.3, "wolken": 0.4, "regen": 0.3},
"regen": {"zon": 0.2, "wolken": 0.4, "regen": 0.4},
}
print(model["zon"]["regen"])
print(model["regen"])
Wat print dit?
Antwoord
0.2
{'zon': 0.2, 'wolken': 0.4, 'regen': 0.4}
model["zon"] zijn de kansen voor morgen als het vandaag zonnig is, en daarin
is ["regen"] de kans dat het morgen regent: 0,2.
Zo werkt het
Het model is een kansmodel: per weer van vandaag een dictionary met de kans op elk weer van morgen. Na een zonnige dag is het morgen met kans 0,5 weer zonnig. Elke rij telt op tot 1, want morgen is het zeker één van de drie.
Het lijkt op het web van de surfer. Daar stond per pagina de lijst links, hier per weer de kansen. Zo'n model, waarin morgen alleen van vandaag afhangt, heet een Markov-keten.
Onderzoek
- Draai de code. Na welk weer regent het het vaakst?
- Zet
"regen"in de print op"zon". Na welk weer is zon het waarschijnlijkst? - Zet bij
"zon"de kans op regen op 0.4. Klopt het model dan nog?
Antwoorden
- Na regen, met kans 0,4.
- Na zon, met kans 0,5.
- Nee. De rij van zon telt dan op tot 1,2, en een kans van meer dan 1 bestaat niet. Zet je een kans hoger, dan moet een andere in die rij evenveel omlaag.
Opdracht: klopt het model?
In het model in de editor zit een fout. Print per weer de som van zijn rij, en verbeter het model tot je dit ziet:
zon 1.0
wolken 1.0
regen 1.0
Begin klein, en breid de code stap voor stap uit:
- Draai de code: hij print elke rij van het model.
- Tel de kansen van een rij op: zet in de loop
som = 0, loop metfor morgen in model[vandaag]:langs het weer van morgen, telmodel[vandaag][morgen]bijsomop, en printvandaagensom. Eén rij komt op 1.1 uit. - Verbeter die rij, zodat elke rij op 1.0 uitkomt.
Tip
som = 0 hoort ín de buitenste loop, vóór de binnenste: elke rij begint op 0.
Staat hij erboven, dan telt hij alle rijen bij elkaar op.
Antwoord
model = {
"zon": {"zon": 0.5, "wolken": 0.3, "regen": 0.2},
"wolken": {"zon": 0.3, "wolken": 0.4, "regen": 0.3},
"regen": {"zon": 0.2, "wolken": 0.4, "regen": 0.4},
}
for vandaag in model:
som = 0
for morgen in model[vandaag]:
som = som + model[vandaag][morgen]
print(vandaag, som)
zon 1.0
wolken 1.0
regen 1.0
De kans op regen na regen moest 0.4 zijn in plaats van 0.5. CS50 vraagt hetzelfde van jouw kansen: bij elke pagina tellen ze samen op tot 1.
Door naar kiezen met kansen.