Er gaat iets mis — top-3 fouten
Leerdoel: je herkent de drie fouten die je bij het bouwen van PageRank het makkelijkst maakt.
Het verschil is meteen nul
Symptoom: de test van bouwsteen 4 faalt, en de ranks zien eruit alsof er maar één ronde is gerekend:
AssertionError: {'A': 0.25, 'B': 0.1437, 'C': 0.4784, 'D': 0.0375}
Oorzaak: nieuw en rank zijn dezelfde dict. nieuw = rank maakt
geen kopie, maar geeft dezelfde dict een tweede naam. Alles wat je in
nieuw zet, staat dus meteen ook in rank. Het verschil tussen de twee is
daardoor altijd 0, en de lus stopt na de eerste ronde.
Oplossing: begin elke ronde met een lege dict.
# FOUT
nieuw = rank # geen nieuwe dict, maar een tweede naam
for p in web:
nieuw[p] = nieuwe_rank(web, rank, p, d)
# GOED
nieuw = {}
for p in web:
nieuw[p] = nieuwe_rank(web, rank, p, d)
Hetzelfde gebeurt als je rank = nieuw vóór het meten van het verschil
zet: dan vergelijk je nieuw met zichzelf. De test toont dan
'C': 0.5687.
Meer uitleg: Bouwsteen 4
Het basisdeel (1 − d)/N vergeten
Symptoom: de som van de ranks zakt onder de 1, en de pagina's lopen leeg.
Oorzaak: je rekent alleen d · Σ ... en laat de willekeurige sprong
weg. Elke ronde gaat er dan een deel van het belang verloren.
# FOUT
nieuw[p] = d * som # basisdeel ontbreekt
# GOED
nieuw[p] = (1 - d) / n + d * som
Dangling nodes — pagina's zonder uitgaande links
Symptoom: zodra een pagina nergens naartoe linkt, telt de som niet meer op tot 1.
Oorzaak: een doodlopende pagina geeft haar belang aan niemand door, dus het verdwijnt. In het mini-web linkt elke pagina ergens naartoe. Voeg je op de compleet-pagina een pagina zonder links toe, dan zie je het meteen aan de som.
Oplossing: doe alsof een pagina zonder uitgaande links naar alle pagina's linkt. De surfer springt dan vanaf die pagina willekeurig verder.
def uitgaande_links(web, i, paginas):
if web[i]:
return web[i]
return set(paginas)
Zo blijft het belang behouden en telt de som weer op tot 1.
Door naar cheatsheet →.
Doe je de route machine learning? Dan ga je nu door naar op weg naar PageRank. Die opstap zet de surfer en dit hoofdstuk samen in de vorm van PageRank van CS50.