13.6 Bouwsteen 4 — itereren tot het stabiel is
Leerdoel: je herhaalt de update voor álle pagina's tot de ranks nauwelijks meer veranderen — dán heb je de PageRank.
Het kip-ei-probleem oplossen
Je kunt de rank van een pagina pas goed berekenen als je de ranks van de
anderen kent. De truc: begin met de startverdeling, reken één volledige
ronde uit (alle pagina's, op basis van de waarden uit de vorige
ronde), en herhaal. Na elke ronde veranderen de waarden minder; je stopt
als de grootste verandering kleiner is dan een kleine epsilon.
Let op: bereken een ronde altijd uit de ranks van de vorige ronde, niet uit ranks die je deze ronde al hebt aangepast.
Bouw en test
Code-omgeving wordt voorbereid…
Antwoord
def pagerank(web, d=0.85, epsilon=1e-9):
rank = startverdeling(web)
while True:
nieuw = {p: nieuwe_rank(web, rank, p, d) for p in web}
verschil = max(abs(nieuw[p] - rank[p]) for p in web)
rank = nieuw
if verschil < epsilon:
return rank
De dict-comprehension berekent álle nieuwe ranks uit de oude rank
voordat je rank overschrijft — precies wat je nodig hebt.
Door naar stap 7: compleet →.