#!/usr/bin/env python # coding: utf-8 # Sveučilište u Zagrebu
# Fakultet elektrotehnike i računarstva # # ## Strojno učenje 2016./2017. # # http://www.fer.unizg.hr/predmet/su # ### Laboratorijska vježba 0: Uvod u Python # # (c) 2015-2016 Domagoj Alagić # # Verzija: 0.1
# Zadnji put ažurirano: 7. listopada 2016. # In[2]: import numpy as np import scipy as sp from scipy import stats import matplotlib.pyplot as plt from sklearn import datasets get_ipython().run_line_magic('pylab', 'inline') # ## 1. # __(a)__ Kreirajte dvije liste: $a = [2, 4, 5, 6, 8, 13]$ i $b = [1, 3, 10, 13, 15]$. # In[ ]: # __(b)__ Napišite kôd koji konkatenira liste $a$ i $b$ u listu $c$: # In[ ]: # __(c)__ Sortirajte listu $c$: # In[ ]: # __(d)__ Izbacite duplikate iz liste c: # In[ ]: # __(e)__ Dohvatite i ispišite (pazite na indeksiranje od 0): # * treći element, # * zadnja dva elementa, # * sve elemente između trećeg i šestog (uključujući treći element, isključujući šesti). # In[ ]: # __(f)__ Generirajte interval brojeva `ran` s elementima iz $[2, 20]$. # In[ ]: # __(g)__ Ispišite sve generirane brojeve iz intervala skupa s njihovim indeksima u listi: # In[ ]: # __(h)__ Korištenjem sažetog zapisa liste (engl. _list comprehension_) transformirajte listu `ran` tako da sve elemente zamijenite njihovim prirodnim logaritmom. # In[ ]: # ## 2. # __(a)__ Napišite funkciju `make_3sg_form(word)` koja vraća glagol u trećem licu jednine za dani glagol u infinitivu, npr. _try_ -> _tries_. Slijedite sljedeća pravila: # * Ako glagol završava na _y_, odbaci _y_ i dodaj _ies_. # * Ako glagol završava na _o_, _ch_, _s_, _sh_, _x_ ili _z_, dodaj _es_. # * Inače samo dodaj _s_. # # NB: Znakovni niz je zapravo polje znakova tako da vrijede "trikovi" za indeksiranje polja. # # __(b)__ Isprobajte implementiranu funkciju za _fix_, _brush_, _cry_, _play_ i _echo_. Primjetite da je ovo složen problem i da tri jednostavna pravila neće uspjeti pokriti sve slučajeve. # In[ ]: # ## 3. # Napišite funkciju `filterShortWords (word_list, min_length)` koja prima listu riječi i minimalnu dopuštenu duljinu riječi te vraća __novu__ listu riječi koja sadrži samo one riječi čija je duljina veća od minimalne dopuštene. Obavezno provjerite da je dana duljina riječi pozitivan broj veći od 1. Ako nije, bacite iznimku. U slučaju da korisnik nije zadao duljinu, funkcija radi jednako kao da je korisnik zadao duljinu od dva znaka (koristite podrazumijevane argumente, engl. _default arguments_). # # Zadatak riješite na dva načina: # # * __(a)__ korištenjem `for` petlji, # * __(b)__ korištenjem sažetog zapisa liste, # * __(c)__ korištenjem metode `filter` u kombinaciji s lambda-izrazom. # # __(d)__ Pokažite na primjeru da su izlazi implementiranih funkcija jednaki. # # NB: Podrazumijevani elementi (ili grupa istih) uvijek dolaze na kraju liste argumenata u definiciji funkcije. # In[ ]: # ## 4. # Dana vam je mapa koja za ključeve sadrži nazive programskih jezika, a za vrijednosti liste programskih paradigmi koje određeni jezik pokriva. # In[431]: langs_paradigms = { "Java" : ["object-oriented", "imperative"], "Haskell" : ["functional"], "Lisp" : ["functional", "procedural"] } # Napišite razred `ProgLanguageRepository` uzimajući u obzir sljedeće stvari: # * Konstruktor ovog razreda prima početnu mapu koja sadrži programske jezike i njihove paradigme. # * Dana mapa sprema se kao član klase imena `data`. # * Razred sadrži metodu `count` koja vraća broj programskih jezika dostupnih u repozitoriju. # * Razred sadrži metodu `get_langs_paradigms (lang)` koja za dano ime programskog jezika vraća listu njegovih paradigmi ili vraća `None` ako taj jezik ne postoji u repozitoriju. # * Razred sadrži metodu `add_lang_paradigm (lang, paradigm)` koja danom programskom jeziku dodaje paradigmu (ako je već nema). # * Razred sadrži metodu `remove_lang_paradigm (lang, paradigm)` koja danom programskom jeziku miče danu paradigmu (ako je ima). # * Razred ima nadjačanu metodu za znakovnu reprezentaciju koja samo ispisuje znakovnu reprezentaciju člana `data`. # # Pokažite na par primjera da vaša implementacija radi. # In[ ]: # ## 5. # __(a)__ Napišite kôd koji stvara sljedeća tri vektor-stupca, jedan vektor-redak i kvadratnu matricu ranga 2 (koristite `numpy` za cijeli zadatak): # # $ x_{1} = \begin{pmatrix} # 1\\ # 2\\ # \end{pmatrix}$, # $ x_{2} = \begin{pmatrix} # 3\\ # 5\\ # \end{pmatrix}$, # $ x_{3} = \begin{pmatrix} # -3\\ # 4\\ # \end{pmatrix}$, # $ x_{4} = \begin{pmatrix} # 4\\ # 0\\ # \end{pmatrix}^T$, # $ A = \begin{pmatrix} # 5 & 3 \\ # 10 & 6 \\ # \end{pmatrix} # $ # # __(b)__ Zatim napišite naredbe koje stvaraju dvije nove matrice: matricu $C$ dimenzija $2\times3$ koja se dobije tako da se vektor-stupci poredaju horizontalno jedan kraj drugog te matricu $D$ dimenzija $3\times2$ koja se dobije tako da se matrica $A$ postavi ispod danog vektor-retka. # In[ ]: # __(c)__ Izračunajte umnožak matrica $C$ i $D$ te ga pohranite u matricu $U$. # In[ ]: # __(d)__ Nadalje, napišite kôd koji izračunava inverz matrice $U$ (spremiti u matricu $I$) kojeg zatim transponira (i sprema u matricu $R$). # In[ ]: # __(e)__ Izračunajte sumu svih elemenata u matrici $D$ (spremite u varijablu `D_total`), ali i sume po zasebnim dimenzijama (`D_x`, `D_y`). # In[ ]: # __(f)__ Ispišite determinantu matrice $R$. # In[ ]: # __(g)__ Isprobajte vrijedi li $R\cdot R^{-1} = I$. # In[ ]: # __(h)__ Stvorite vektor-stupac $n$ dimenzija $4\times 1$ čiji su svi elementi 0 (bez ručnog pisanja svih elemenata). # In[ ]: # ## 6. # __(a)__ Napišite kôd koji iscrtava sljedeće funkcije: # # $f_{1}(x) = \sqrt{(1-(|x|-1)^2)}$ i $f_{2}(x) = -3 \cdot \sqrt{(1-\sqrt{\frac{|x|}{2}})}$ # # pritom definirajući domenu funkcija kao $x \in [-2, 2]$ (u 1000 točaka). Graf funkcije $f_{1}(x)$ prikažite plavom bojom, a graf funkcije $f_{2}(x)$ crvenom. Iscrtajte oba grafa na istoj slici tako da su vidljive točke iz intervala $x \in [-3, 3]$ i $y \in [-3, 1.5]$. # # __(b)__ Ostavite oznake osi jednostavno kao $x$ i $y$. Iscrtajte legendu u donjem desnom kutu tako da je naziv funkcije $f_{1}(x)$ _bolja polovica_, a naziv funkcije $f_{2}(x)$ _dobra polovica_. # In[ ]: # ## 7. # __(a)__ Učitajte skup podataka _Iris_. Ovaj skup podataka sadrži 150 instanci, 50 za svaku od tri klase (_Iris setosa_, _Iris virginica_ i _Iris versicolor_). Svaka instanca, to jest vektor, sadrži četiri značajke: širinu i dužinu latice te širinu i dužinu čašićnog listića. U polju _iris.data_ nalaze se instance, dok se u _iris.target_ nalaze oznake instanci (njihove stvarne klase). Ispišite dimenzije polja instanci te polja njihovih stvarnih oznaka. # In[ ]: # __(b)__ Budući da ne možemo vizualizirati 4-dimenzijske podatke, iz svake instance izdvojite samo prve dvije značajke. Koristite indeksiranje poljem brojeva. Ispišite dimenzije dobivenog polja instanci. # In[ ]: # __(c)__ Logičkim indeksiranjem razdvojite primjere za svaku od tri klase. Ispišite dimenzije dobivenih polja. # In[ ]: # __(d)__ Napišite kôd koji iscrtava četiri zasebna grafa (četiri podgrafa u 2x2 mreži), pri čemu tri grafa prikazuju instance određene klase (točke u 2-dimenzijskom prostoru), a četvrti ih prikazuje sve (u različitim bojama). Osigurajte da svi grafovi prikazuju isto područje grafa (npr. $x \in [4,9]$ i $y \in [1.5, 5]$). # # Proučite kako se postavlja veličina glavnog okvira (u koji se smještaju podgrafovi) te ju postavite na 10x8. # In[ ]: # ## 8. # __(a)__ Napišite kôd koji u petlji iscrtava grafove normalnih distribucija definiranih s parametarima $\mu$ i $\sigma$: # # * $\mu = 3$ # * $\sigma \in [1, 5]$ (korak 1) # # Dakle, generirat ćete pet grafova normalnih distribucija: $\mathcal{N}_{1}(\mu = 3, \sigma = 1)$, $\mathcal{N}_{2}(\mu = 3, \sigma = 2)$, ... , $\mathcal{N}_{1}(\mu = 3, \sigma = 5)$. # # Grafove iscrtajte na istoj slici tako da su vidljive točke iz intervala $x \in [-15, 15]$ i $y \in [0, 0.5]$. Za svaki graf upotrijebite drugu boju. Za domenu koristite $[-50, 50]$ (uzorkujte 1000 točaka). Također napravite legendu u gornjem lijevom kutu koji će sve grafove nazvati onako kako su i u zadatku # definirani ($\LaTeX$ kôd radi unutar znakovnih nizova koji definiraju oznaku unutar legende), npr. $\mathcal{N}_{1}(\mu = 3, \sigma = 5)$. # # In[ ]: # __(b)__ Sada pretpostavite da imate zadanu distribuciju ocjena na nekom kolegiju koja se pokorava normalnoj distribuciji $\mathcal{N}_{G}(\mu = 62, \sigma = 13)$. Najprije je iscrtajte (nebitno kako), ali osigurajte da je domena $[0, 100]$ (raspon mogućih bodova na kolegiju) također uzorkovana u 1000 točaka. # In[ ]: # __(c)__ Međutim, vi polažete kolegij naknadno na roku, a profesoru se zaista ne da ispravljati vaš ispit. Kako bi tome doskočio, profesor često koristi tradicionalnu metodu stubišta (https://www.linkedin.com/pulse/20140414044726-2259773-a-guide-to-grading-exams) koju možemo aproksimirati nasumičnim odabirom broja iz distribucije bodova na ispitu. Napišite kôd koji iz distribucije bodova $\mathcal{N}_{G}$ dohvaća slučajnu vrijednost koja predstavlja vaš broj bodova (zaokružite bodove na cijeli broj). # In[ ]: # ## 10. # Iscrtajte konture 2-dimenzijske Gausove distribucije $\mathcal{N} (\vec{\mu}, \Sigma)$ sa sljedećim parametrima: # # * $\vec{\mu} = [1, 1]$ # * $\Sigma = \begin{pmatrix} # 1 & 1 \\ # 0.5 & 3 \\ # \end{pmatrix}$ # # Za domenu uzmite $x_{1} \in [-1, 2]$ i $y_{2} \in [-2, 2]$. # In[ ]: