<jupyter_start><jupyter_text>Huiswerkopgaven - deel 4: Machine LearningDit notebook bevat opgaven om thuis mee aan de slag te gaan. Het laden van (voorbeelden van) uitwerkingen gaat op dezelfde manier als in de opgaven die tijdens de cursus zijn gedaan. Het notebook is dit keer niet onderverdeeld in twee stukken. Het gebruikelijk eerste onderdeel is dit keer gewoon het afmaken van de opgaven van de cursusavond. De "bonus" hier kun je doen als je er zin in hebt en uitgedaagd wil worden. Je leert er op zich niet onmisbare stof, maar wel nieuwe dingen die leuk zijn (en van meer oefening leer je het beter). De overige opgaven van de cursusavondTijdens de cursusavond heb je van elk onderdeel waarschijnlijk slechts 1 van de oefeningen gedaan. Als huiswerk volstaat hier om de rest te doen. Je krijgt daarvan een goed overzicht van verschillende machine learning technieken en hoe je daar met behulp van Python mee om kan gaan.  De bonus!Hieronder vind je opgaven die je kunt maken als je wil. Er zit weer een uitwerking bij, waar van toepassing. De stof is niet noodzakelijk om in de data science aan de slag te gaan, maar het helpt wel. Het zou vooral leuk en uitdagend moeten zijn en je moeten helpen een betere Pythonista te worden. Manifold learners voor multimodale dataWe hebben in een van de opgaven over unsupervised learning gezien dat er verschillende manifold learners bestaan die iets zinnigs maken van een S-curve. IsoMap en t-SNE konden daar beiden een mooi resultaat opleveren, maar t-SNE doet dat daar wel een stuk langer over. Dat betekent echter niet dat dit altijd een slechtere keus is.Maak 2 S-curves naast elkaar en vergelijk de twee manifold learners. Zoek ook op hoe ze werken, en kijk of je begrijpt waar het verschil vandaan komt. Vergelijk eventueel ook nog meer manifold learners.<jupyter_code>to_include = os.path.join('uitwerkingen', '4h-manifolds.py') 
# %load $to_include<jupyter_output><empty_output><jupyter_text>Hoeveel clusters heb je nodig?Voor veel clusteringalgoritmes moet je het aantal clusters wat je algoritme gaat identificeren opgeven. Bij weer andere moet je waarden opgeven die bijvoorbeeld de grenswaarde voor dichtheid van punten aangeeft waarboven samples in hetzelfde cluster zitten. Kortom, er zit altijd, naast het gebruikte algoritme, enige arbitraire keuze in hyperparameters wanneer je met clustering bezig bent.Er is echter wel een soort vuistregel die je houvast biedt bij het kiezen hiervan. De vuistregel die we hier onderzoeken heet de "elleboogmethode". Als je KMeans hebt gefit, dan kent het model-object een attribuut "inertia_" en dat is de som van de afstanden van alle punten in het sample tot hun dichtsbijzijnde clustercentrum. Door toevoeging van meer clusters wordt dit natuurlijk altijd kleiner, maar als je de waarde van de inertia plot tegen het aantal clusters zie je altijd hetzelfde gedrag: in het begin neemt de inertia sterk af als je een cluster toevoegt, en nadat je er "genoeg hebt" wordt die afname veel langzamer. In een plotje van de inertia tegen het aantal clusters zie je dus vaak een "elleboog". De waarde van het aantal clusters waarbij dit optreedt is een goede keuze voor het aantal clusters dat je wil gebruiken. Hieronder worden weer twee groepjes blobs gedefinieerd. Gebruik KMeans en het inertia_ attribuut om te onderzoeken hoeveel clusters aangeraden zouden zijn. Vergelijk dit met de creatie van de blobs. Conclusies?<jupyter_code>from sklearn.datasets import make_blobs

X, y = make_blobs(n_samples=200, centers=4, random_state=42)
plt.figure(figsize=(12,6))
plt.subplot(121)
plt.scatter(X[:, 0], X[:, 1], c=y, s=20)
X2, y2 = make_blobs(random_state=101, centers=[[-8, -8],[0, 0], [2,2]], n_samples=1000, )
plt.subplot(122)
plt.scatter(X2[:, 0], X2[:, 1], c=y2, s=20);
to_include = os.path.join('uitwerkingen', '4h-inertia.py') 
# %load $to_include<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.05048943843379701, 'fraction_numerical': 0.01184956208140134, 'mean_word_length': 5.0957613814756675, 'pattern_counts': {'":': 0, '<': 9, '<?xml version=': 0, '>': 9, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '2', 'dir': 'jupyter-structured-clean-dedup', 'id': '153588', 'license': 'MIT', 'n_tokens_mistral': 1357, 'n_tokens_neox': 1316, 'n_words': 572, 'path': 'Huiswerk_4.ipynb', 'repo_name': 'harcel/PyDataScienceIntroNL', 'size': '3882'}