Opgave 1

  1. Maak een lege lijst aan en noem deze lijst getallen_a.
  2. Vul deze lijst via een for loop met de getallen 2, 4, 6 , 8 en 10
  3. Check of de lijst er zo uitziet als verwacht, hoeveel elementen bevat je lijst? Welk getal staat op plek 0? En op plek 3? En op plek -1?
  4. Voeg het getal 14.0 toe achter aan je lijst, en het getal 7 op plek 2.
  5. Maak een lijst getallen_b aan: [3.14, 8, 0] en vervang getallen_a door de samenvoeging van getallen_a en getallen_b
  6. In getallen_a: op welke plek staat het getal 3.14? En het getal 8? Hoe vaak komt het getal 8 voor in de lijst? Bevat de lijst het getal 4? Wat zijn de minimale en maximale waarde die in de lijst voorkomen?
  7. Verwijder het getal op plek 4.
  8. Sorteer de lijst en geef hem ook eens van achter naar voren weer.

In [6]:
# 1.1
getallen_a = []
# 1.2
for i in range(2, 11, 2):
    getallen_a.append(i)
# 1.3
print("Lijst getallen_a:", getallen_a)
print("Lengte of aantal elementen:", len(getallen_a))
print("Getal op plek 0:", getallen_a[0])
print("Getal op plek 3:", getallen_a[3])
print("Getal op plek -1:", getallen_a[-1])
# 1.4
getallen_a.append(14.0)
getallen_a.insert(2, 7)
# 1.5
getallen_b = [3.14, 8, 0]
getallen_a = getallen_a + getallen_b  # ook: getallen_a += getallen_b
print("Lijst getallen_a:", getallen_a)
# 1.6
print("Index van 3.14:", getallen_a.index(3.14))
print("Aantal van 8:", getallen_a.count(8))
print("Is 4 element van de lijst:", 4 in getallen_a)
# of: print("Is 4 element van de lijst:", getallen_a.count(4) > 0)
print("Minimum van lijst:", min(getallen_a))
print("Maximum van lijst:", min(getallen_b))
# 1.7
del getallen_a[4]
print("Lijst getallen_a:", getallen_a)
# 1.8
getallen_a.sort()
print("Lijst getallen_a:", getallen_a)
getallen_a.reverse()
print("Lijst getallen_a:", getallen_a)


Lijst getallen_a: [2, 4, 6, 8, 10]
Lengte of aantal elementen: 5
Getal op plek 0: 2
Getal op plek 3: 8
Getal op plek -1: 10
Lijst getallen_a: [2, 4, 7, 6, 8, 10, 14.0, 3.14, 8, 0]
Index van 3.14: 7
Aantal van 8: 2
Is 4 element van de lijst: True
Minimum van lijst: 0
Maximum van lijst: 0
Lijst getallen_a: [2, 4, 7, 6, 10, 14.0, 3.14, 8, 0]
Lijst getallen_a: [0, 2, 3.14, 4, 6, 7, 8, 10, 14.0]
Lijst getallen_a: [14.0, 10, 8, 7, 6, 4, 3.14, 2, 0]

Opgave 2

  1. Schrijf een programma dat het aantal elementen (de lengte) van een list variable afdrukt naar het scherm zonder de len()-functie te gebruiken.
  2. Schrijf een programma dat alle elementen in een list vermenigvuldigt met een door de gebruiker opgegeven getal en de uitkomsten afdrukt.
  3. Schrijf een programma dat bepaalt of een door de gebruiker opgegeven getal een element is van een list. Gebruik daarbij niet de in-operator of de functies index() of count().
  4. Schrijf een programma dat kan bepalen of twee lists (minstens) een gemeenschappelijk element hebben. Gebruik een geneste (dubbele) for-loop om dit te bepalen.
  5. Schrijf en programma dat een 'histogram' kan afdrukken voor een list van integers. Voor de list [4, 9, 7] bijvoorbeeld, zou het onderstaande afgedrukt moeten worden:
****
*********
*******

In [15]:
# 2.1
numbers = [2, 4, 6, 8]
length = 0
for i in numbers:
    length += 1
print("Lengte van numbers:", length)
# 2.2
numbers = range(2, 10, 2)
multiplier = float(input("Geef de multiplier op:"))
for number in numbers:
    print(number * multiplier)
# of:
numbers = list(range(2, 10, 2))
multiplier = float(input("Geef de multiplier op:"))
for i in range(len(numbers)):
    numbers[i] *= multiplier  # dit past de inhoud van de list aan!
print("Producten:", numbers)
# 2.3
numbers = [1, 3, 5, 7]
print("Getallen:", numbers)
query = int(input("Welk geheel getal zoek je?"))
is_element = False
for number in numbers:
    if number == query:
        is_element = True
print("Het getal {} zit in de lijst: {}".format(query, is_element))
# 2.4
numbers_a = [1, 3, 5, 7]
numbers_b = [2, 4, 6, 8]
has_common_elem = False
for number_a in numbers_a:
    for number_b in numbers_b:
        if number_a == number_b:
            has_common_elem = True
print(("De lijsten hebben (minstens) een "
       "gemeenschappelijk element:"), has_common_elem)
# 2.5
values = [4, 9, 7]
for value in values:
    print("*" * value)


Lengte van numbers: 4
Geef de multiplier op:2.5
5.0
10.0
15.0
20.0
Geef de multiplier op:2.4
Producten: [4.8, 9.6, 14.399999999999999, 19.2]
Welk geheel getal zoek je?4
Het getal 4 zit in de lijst: False
De lijsten hebben (minstens) een gemeenschappelijk element: False
****
*********
*******

Opdracht 3

Tijdens het college is (naive) Bayesian spam detection besproken. Er werden twee voorbeelden behandeld en in beide gevallen werd de kans op spam bepaald voor een bericht van één woord. Maar de meeste e-mails bestaan uit meer woorden.

Wanneer we, helaas wat optimistisch, de aanname doen dat woorden in e-mails onafhankelijk van elkaar optreden, kunnen we met de behandelde vergelijking (Bayes' theorem) uitspraken doen over de kans dat een e-mail met meerdere woorden spam is.

  1. Gegeven de trainingsdata zoals gebruikt in het college, zie evt. hieronder, bereken met hand de kans op het bericht M = "rolex korting amsterdam" als je uitgaat van onderlinge onafhankelijkheid van de woorden in een bericht.
    • Spam berichten: rolex replica korting, klik korting viagra, korting politiek krediet
    • Ham berichten: politiek bepaalt korting, lariekoek in politiek, klik politiek verslag, journalist bespeelt politiek, politiek amsterdam stagneert
  2. Schrijf een programma om voor berichten van meerdere woorden (minstens 1) de kans op spam uit te kunnen rekenen.
    Je kunt een bericht eenvoudig in woorden splitsen in Python:
    message = "rolex korting amsterdam"
    words = message.split()  # split maakt een list van de elementen
                             # na het splitsen op whitespace
    

Hint: begin met uit uitdrukken van $P(M|Spam)$ als $P(W_1, W_2, W_3|Spam) = P(W_1|Spam) \cdot P(W_2|Spam) \cdot P(W_3|Spam)$ en evenzo voor $P(M|Ham)$.

3.1

$$ \begin{align*} P(Spam|M) &= \scriptsize{\frac{P(M|Spam) \cdot P(Spam)} {P(M|Spam) \cdot P(Spam) + P(M|Ham) \cdot P(Ham)}} \\ &= \scriptsize{\frac{P(W_1, W_2, W_3|Spam) \cdot P(Spam)} {P(W_1, W_2, W_3|Spam) \cdot P(Spam) + P(W_1, W_2, W_3|Ham) \cdot P(Ham)}} \\ &= \scriptsize{\frac{P(W_1|Spam) \cdot \ldots \cdot P(W_3|Spam) \cdot P(Spam)} {P(W_1|Spam) \cdot \ldots \cdot P(W_3|Spam) \cdot P(Spam) + P(W_1|Ham) \cdot \ldots \cdot P(W_3|Ham) \cdot P(Ham)}} \\ &= \scriptsize{\frac{1/9 \cdot 3/9 \cdot 1 \cdot 9/24} {1/9 \cdot 3/9 \cdot 1 \cdot 9/15 + 1 \cdot 1/15 \cdot 1/15 \cdot 15/24}} \\ &= \scriptsize{\frac{1/72}{1/72 + 1/360}} = \scriptsize{\frac{5}{6}} \end{align*} $$

In [27]:
# 3.2
spam = [
    "rolex", "replica", "korting",
    "klik", "korting", "viagra",
    "korting", "politiek", "krediet",
]
ham = [
    "politiek", "bepaalt", "korting",
    "lariekoek", "in", "politiek",
    "klik", "politiek", "verslag",
    "journalist", "bespeelt", "politiek",
    "politiek", "amsterdam", "stagneert",
]

message = "rolex korting amsterdam"
words = message.split()

P_words_spam = 1.0
P_words_ham = 1.0
for word in words:
    if word in spam:
        P_words_spam *= spam.count(word) / len(spam)
    if word in ham:
        P_words_ham *= ham.count(word) / len(ham)

P_spam = len(spam) / (len(spam) + len(ham))
P_ham = len(ham) / (len(spam) + len(ham))

P_message_spam = ((P_words_spam * P_spam) /
                  ((P_words_spam * P_spam) + (P_words_ham * P_ham)))
print("P(M|Spam) = {:.4f}".format(P_message_spam))


P(M|Spam) = 0.8333