Een derde soort
Tot nu toe kende je voorspeller twee soorten: appels en bananen. In deze stap
komen er citroenen bij. Ze liggen dicht bij de appels, en daardoor maakt de
keuze van k meer uit dan je zou denken.
Voorspel
def afstand(a, b):
return abs(a[0] - b[0]) + abs(a[1] - b[1])
citroen = (9, 5)
appel = (9, 8)
banaan = (18, 4)
print(afstand(citroen, appel))
print(afstand(citroen, banaan))
Wat print dit programma? Ligt een citroen dichter bij de appels of bij de bananen?
Antwoord
3
10
Een citroen ligt veel dichter bij een appel dan bij een banaan. Liggen er maar een paar citroenen, dan kan een appel de dichtstbijzijnde buur zijn.
Zo werkt het
Aan voorspel hoef je niets te veranderen. In stemmen komt een derde
sleutel bij, "citroen", en de loop over stemmen vindt nog steeds de soort
met de meeste stemmen. De functie werkt voor elk aantal soorten.
Wat wel verandert: met drie soorten kan een stuk fruit op de grens liggen
van twee soorten tegelijk. Dan geven k = 1 en k = 3 soms een ander
antwoord.
Bouw zelf: een derde soort
Zet citroenen bij de voorbeelden: vier citroenen van ongeveer 8 of 9
centimeter lang en 5 centimeter breed. Zoek met je functie voorspel een
stuk fruit waarbij k = 1 en k = 3 een ander antwoord geven.
Begin klein, en breid de code stap voor stap uit:
- Draai de code.
voorspeluit de vorige stappen staat klaar in de verborgen code onder de editor. - Zet vier citroenen in
voorbeelden. - Kies een stuk fruit, en print wat
voorspelzegt metk = 1en metk = 3. Probeer andere stukken tot de twee verschillen.
Tip
Kies een stuk fruit dat vlak bij één appel ligt, maar met meer citroenen dan appels iets verder weg. Varieer de maten van je citroenen een beetje, zodat ze niet allemaal op dezelfde plek liggen.
Antwoord
Dit vervangt alles in de editor; voorspel blijft in de verborgen code.
voorbeelden = [
((8, 8), "appel"), ((9, 8), "appel"), ((7, 7), "appel"),
((18, 4), "banaan"), ((20, 4), "banaan"), ((17, 3), "banaan"),
((10, 6), "banaan"),
((8, 5), "citroen"), ((9, 5), "citroen"),
((9, 6), "citroen"), ((8, 4), "citroen"),
]
print(voorspel((7, 6), voorbeelden, 1)) # appel
print(voorspel((7, 6), voorbeelden, 3)) # citroen
Bij k = 1 wint de appel
(7, 7), op afstand 1. Bij k = 3 stemmen ook de citroenen (8, 5) en
(9, 6) mee, allebei op afstand 2. Welk antwoord klopt, weet je pas als je
het fruit zelf bekijkt. Hoe je kiest welke k het beste werkt, zie je in
eerlijk testen.
Kies je zelf een voorbeeld, let dan op gelijke afstanden. Staan de derde en
de vierde buur even ver weg, dan kiest sorted op alfabet, en dan wint
"appel" van "citroen" zonder dat het fruit erop lijkt.
Door naar oefenen en toetsen.