Een afstand
Je krijgt een stuk fruit en je weet niet wat het is. Je meet hoe lang en hoe breed het is, in centimeters. Daarna zoek je in je lijst voorbeelden het fruit dat er het meest op lijkt, en je zegt dat het dezelfde soort is. Dat heet de dichtstbijzijnde buur, en het is een van de eenvoudigste manieren waarop een computer leert voorspellen. In deze stap meet je eerst hoeveel twee stukken fruit verschillen: hun afstand.
Je gebruikt hier tuples uit Tuples, functies
met return uit Return-waarden, en het
patroon "onthoud de beste tot nu toe" uit
Vind het maximum.
Voorspel
def afstand(a, b):
return abs(a[0] - b[0]) + abs(a[1] - b[1])
print(afstand((8, 8), (10, 7)))
print(afstand((18, 4), (10, 7)))
abs maakt van een getal een positief getal: abs(-2) is 2. Wat print
dit programma?
Antwoord
3
11
Bij (8, 8) en (10, 7): de lengte scheelt 2, de breedte scheelt 1, samen
3. Bij (18, 4) en (10, 7): 8 en 3, samen 11.
Zo werkt het
Elk stuk fruit is een tuple (lengte, breedte). Met a[0] pak je de lengte,
met a[1] de breedte. De functie afstand telt op hoeveel de lengtes en de
breedtes schelen, en geeft dat met return terug. Hoe kleiner de afstand,
hoe meer twee stukken fruit op elkaar lijken.
abs is nieuw. Zonder abs kan een verschil negatief zijn, en dan valt het
weg tegen een ander verschil.
Onderzoek
- Draai de code. Welk stuk fruit lijkt het meest op
(10, 7)? - Is
afstand(appel, banaan)hetzelfde alsafstand(banaan, appel)? - Wat is de afstand van een stuk fruit tot zichzelf?
- Haal beide keren
absweg, zodat er(a[0] - b[0]) + (a[1] - b[1])staat. Wat is nu de afstand van(8, 8)tot(10, 6)?
Antwoorden
- De appel: afstand 3, tegen 11 voor de banaan.
- Ja, allebei 14. Het maakt niet uit welke van de twee je eerst noemt.
-
- Niets scheelt, dus elk stuk fruit is zijn eigen dichtstbijzijnde buur. Dat komt terug bij eerlijk testen.
- 0, terwijl de twee wel verschillen. De lengte scheelt -2 en de breedte +2,
en die vallen tegen elkaar weg. Met
absis het 4.
Opdracht: hoe ver is elk voorbeeld?
Je hebt een lijst voorbeelden: tuples van een maat en een soort, zoals
((8, 8), "appel"). Print bij elk voorbeeld de soort en de afstand tot
nieuw:
appel 3
appel 2
appel 3
banaan 11
banaan 13
banaan 11
Begin klein, en breid de code stap voor stap uit:
- Draai de code: hij print elk voorbeeld als een tuple.
- Pak elk voorbeeld uit in twee variabelen, met
for maten, soort in voorbeelden, en printsoortenmaten. - Print in plaats van
matende afstand:afstand(nieuw, maten).
Tip
Een voorbeeld is zelf een tuple met twee dingen erin. Staan er na for twee
namen met een komma ertussen, dan krijgt de eerste naam het eerste ding en de
tweede naam het tweede.
Antwoord
Dit vervangt de loop onderaan de editor:
for maten, soort in voorbeelden:
print(soort, afstand(nieuw, maten))
appel 3
appel 2
appel 3
banaan 11
banaan 13
banaan 11
De tweede appel, (9, 8), ligt het dichtst bij. In de volgende stap laat je
de computer die zelf vinden.
Er gaat iets mis
TypeError: 'int' object is not subscriptable
Oorzaak: je gaf afstand een los getal in plaats van een tuple, zoals
afstand(10, (9, 8)). In de functie staat a[0], maar van het getal 10 kun
je geen eerste element pakken.
Oplossing: geef beide maten mee als tuple, met haakjes eromheen.
# FOUT
afstand(10, (9, 8))
# GOED
afstand((10, 7), (9, 8))
Door naar de dichtstbijzijnde.