- Je maakt een kansverdeling uit niet-negatieve gewichten.
- Je rekent met overlap en onderscheidt een gewone van een voorwaardelijke kans.
Een spamfilter kan aangeven hoe waarschijnlijk het vindt dat een bericht ongewenst is. Om zo'n getal te begrijpen, moet je weten welke uitkomsten meetellen en op welke groep het betrekking heeft. We beginnen daarom met tellen, voordat we voorspellingen beoordelen.
Een kans (probability) ligt tussen 0 en 1: in de eindige uitkomstenmodellen van deze les betekent 0 onmogelijk en 1 zeker. Een kans van 0.2 is hetzelfde als 20 procent: ongeveer twintig op honderd, bekeken over heel veel herhalingen. Dat belooft niet precies twee successen in elk groepje van tien.
1. Van aantallen naar delen van het geheel
Stel een doos bevat twee rode, drie blauwe en vijf groene kaarten. Je trekt blind één kaart, waarbij elke kaart even waarschijnlijk is. Er zijn 2 + 3 + 5 = 10 kaarten: rood krijgt kans 2/10, blauw 3/10 en groen 5/10.
| Uitkomst | Aantal | Kans |
|---|---|---|
| Rood | 2 | 0.2 |
| Blauw | 3 | 0.3 |
| Groen | 5 | 0.5 |
Deze drie uitkomsten sluiten elkaar uit en omvatten alle mogelijkheden. Daarom tellen hun kansen op tot 1. Zo'n overzicht heet een kansverdeling (probability distribution).
Dezelfde verhouding kun je maken uit niet-negatieve gewichten, ook als die geen gehele aantallen zijn. Normaliseren (normalization) deelt ieder gewicht door het totaal:
w is de lijst met gewichten, i kiest één positie en T is de som van alle gewichten. p op die positie is het bijbehorende aandeel. Voor de kaarten reken je dezelfde verdeling met twee lussen:
gewichten = [2, 3, 5]
totaal = 0
for i in range(len(gewichten)):
totaal = totaal + gewichten[i]
kansen = []
for i in range(len(gewichten)):
kansen.append(gewichten[i] / totaal)
print(kansen) # [0.2, 0.3, 0.5]
De eerste lus bepaalt de noemer; de tweede maakt een nieuwe lijst met aandelen. Bij totaal nul kun je niet delen: geef in normaliseer(gewichten) dan None terug, de Pythonwaarde voor “geen uitkomst”. Doe die controle vóór de tweede lus; de invoer bevat hier alleen niet-negatieve gewichten.
2. Een overlap telt maar één keer mee
Een gebeurtenis (event) is een verzameling uitkomsten die bij je vraag passen. In een groep van honderd berichten hebben er vijftig een link en veertig een bijlage. Twintig hebben allebei.
Tel je vijftig en veertig direct op, dan tel je die twintig dubbele gevallen tweemaal. Trek ze eenmaal af: 50 + 40 − 20 = 70 berichten hebben een link, een bijlage of allebei. “Of” omvat hier dus ook de overlap.
P betekent “kans op”; A is hier een link, B een bijlage. De twee regels vormen één berekening. Deel de aantallen door honderd en reken:
a = 0.5
b = 0.4
beide = 0.2
print(a + b - beide) # ongeveer 0.7
Veelgemaakte fout: onafhankelijk verwarren met elkaar uitsluiten. Bij één kaarttrekking kunnen rood en blauw niet tegelijk optreden: ze sluiten elkaar uit. Twee aparte eerlijke muntworpen zijn onafhankelijk: kennis van de eerste verandert de kans op de tweede niet, maar allebei kop kan wel gebeuren.
Bij onafhankelijke gebeurtenissen mag je hun kansen vermenigvuldigen voor “allebei”: voor die twee worpen 0.5 × 0.5 = 0.25. Bij willekeurige gebeurtenissen mag dat niet zomaar. Maak kans_of(a, b, beide); de opdracht geeft de overlap al mee als een geldige kans.
3. Je bekende informatie bepaalt de groep
Neem een andere verzameling van honderd berichten: dertig hebben een bijlage en tien zijn spam. Zes behoren tot beide groepen. Kies je alleen uit de dertig berichten met bijlage, dan zijn er zes ongewenst: kans 6/30 = 0.2.
De verticale streep lees je als “gegeven”. Dit is een voorwaardelijke kans (conditional probability): A is spam, B de bekende bijlage. De teller is 6/100 = 0.06; de noemer 30/100 = 0.30.
beide = 6 / 100
bijlage = 30 / 100
spam = 10 / 100
print(beide / bijlage) # 0.2
print(beide / spam) # 0.6
De omgekeerde vraag, “welke spam heeft een bijlage?”, gebruikt de tien spamberichten als groep en geeft 6/10 = 0.6. De volgorde maakt dus verschil. Maak voorwaardelijk(beide, b); geef bij b gelijk aan nul None, omdat de gekozen groep dan geen positieve kans heeft.
Wat neem je mee?
- Normaliseren maakt van niet-negatieve gewichten aandelen die samen 1 zijn, als het totaal positief is.
- Bij “A of B” trek je de dubbel getelde overlap eenmaal af.
- Bij “A gegeven B” beperk je je tot B; de omgekeerde vraag gebruikt een andere noemer.
Een voorspeld kansgetal is nog geen bewijs dat een model betrouwbaar is. In de volgende les onderzoek je wat een positieve spammelding betekent als spam zeldzaam is.