Commits

Jure Žbontar committed 68708d6

Final touches.

Comments (0)

Files changed (8)

 k-kratno prečno preverjanje
 ===========================
 
-Učne primere razdelimo na `k` približno enako velikih kosov. Prvih
-`k - 1` kosov uporabimo za učenje modela s katerim napovemo zadnji
-kos. Postopek ponovimo `k`-krat, le da vsakič napovemo drug kos podatkov.
+Pri k-kratnem prečnem preverjanju učne primere razdelimo na `k`
+približno enako velikih kosov. Prvih `k - 1` kosov uporabimo za učenje
+modela s katerim napovemo zadnji kos. Postopek ponovimo `k`-krat, le da
+vsakič napovemo drug kos podatkov.
 
 *Q: Zakaj potrebujemo k-kratno prečno preverjanje? Ali ni dovolj skripta
 `validate.py`?*
 A: Če nismo pazljivi se lahko zgodi, da pri k-kratnem prečnem
 preverjanju nevede pogoljufamo (najbolj tipičen primer je, da pred
 prečnim preverjanjem izberemo atribute, ki dobro ločijo razred) in
-nas dobljeni rezultat lahko zavede. Nevarni so tudi algoritmi, ki 
-sprejemajo veliko parametrov, saj se lahko naučimo dobro ločevati
-le učne primere.
+nas dobljeni rezultat lahko zavede. Nevarni so tudi algoritmi, ki imajo
+veliko parametrov, saj se lahko naučimo dobro ločevati le učne primere.
 
 Vaj se bomo lotili tako, da bomo najprej sprogramirali mero `logloss`,
 nato se bomo lotili k-kratnega prečnega preverjanja, zaključili pa
 [Multi Class Log Loss](https://www.kaggle.com/wiki/MultiClassLogLoss) - mero,
 ki jo želimo na tekmovanju minimizirati.
 
+		>>> data = np.loadtxt('iris.data')
+		>>> X, y = sp.csr_matrix(data[:,:-1]), data[:,-1].astype(np.int)
         >>> P = majority(X, y, X)
         >>> logloss(y, P)
         1.098612288668108
 
 2. Napiši funkcijo `cv(X, y, fun, folds=4)`, ki sprejme redko matriko
 atributov `X`, seznam razredov `y`, klassifikator `fun` in `k`, ki sem
-ga v svoji kodi, iz neznanih razlogov, poimenoval `folds`.
+ga v svoji kodi, iz neznanih razlogov, poimenoval `folds`. Vrne pa
+`logloss` klasifikatorja `fun`, izračunan s `k`-kratnim prečnim
+preverjanjem.
 
 		>>> data = np.loadtxt('iris.data')
 		>>> X, y = sp.csr_matrix(data[:,:-1]), data[:,-1].astype(np.int)
 vseh `k` kosov izvajamo sočasno - vsak kos na
 svojem procesorju. Poglobite se v dokumentacijo modula
 [multiprocessing](http://docs.python.org/library/multiprocessing.html).
-Posebej pozorno preberite opis metod `apply_async` razreda `Pool` in
+Posebej pozorno preberite opis metode `apply_async` razreda `Pool` in
 sprogramirajte paralelno različio k-kratnega prečnega preverjanja.
 
 	<div class="solution">
 			pool.close()
 			pool.join()
 
-			return P, np.mean(score)
+			return P, np.mean(score)                        # +++
 	</div>
 

predavanja/head.html

 body {
 	font-family: Verdana; 
 	margin: auto; 
-	width: 800px;
+	max-width: 800px;
+	padding: 20px;
 }
 </style>
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>

predavanja/majority.md

 
 Najbrž je težko videti kdaj bi bil tako preprost algoritem sploh
 uporaben. Ponavadi ga boste uporabili, ko boste točnost svojega
-klasifikatorja želeli primerjati z nekim osnovnim modelom.
+klasifikatorja želeli primerjati z nekim osnovnim modelom. Če je
+točnost vašega modela blizu točnosti večinskega klasifikatorja,
+potem se z vašim algoritmom ne morete ravno hvaliti.
 
+Naloge
+------
 
-1. Naloži podatke `iris.data`. Prve štiri stolpce spravi v redko
-matriko `X`, zadnjega pa v navaden seznam `y`. Čeprav podatki niso redki,
-se bomo delali kot da so.
+V rešitvah predpostavljam, da se program začne z vrsticama
+
+    import numpy as np
+	import scipy.sparse as sp
+
+1. Naloži podatke `iris.data`, ki jih boš
+našel v direktoriju `/apps/poletna_sola/skupno/data`
+([namig](http://docs.scipy.org/doc/numpy/reference/generated/numpy.loadtxt.html)).
+Prve štiri stolpce spravi v [redko
+matriko](http://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.csr_matrix.html)
+`X`, zadnjega pa v numpyjev seznam `int`ov `y`. Čeprav podatki niso
+redki, se bomo delali kot da so.
 
 	<div class="solution">
 
 
 2. Napiši funkcijo `majority(X, y, X_test)`,
 ki implementira večinski klasifikator
-([namig](http://docs.scipy.org/doc/numpy/reference/generated/numpy.bincount.html)).
+([namig](http://docs.scipy.org/doc/numpy/reference/generated/numpy.bincount.html),
+[namig](http://docs.scipy.org/doc/numpy/reference/generated/numpy.tile.html)).
 Funkcijo preverite na podatkih iris.
 
 		>>> P = majority(X, y, X)
 [EMC_IO](http://www.kaggle.com/c/emc-data-science/data), ki so jo
 napisali organizatorji, preberite podatke tekmovanja. Redko matriko
 `X` sestavite tako, da zložite matriki `70_30_train_data.csv` in
-`70_30_test_data.csv` (v tem vrstnem redu), seznam `y` pa zgradite
-iz vsebine datoteke `70_30_train_labels.csv`. 
+`70_30_test_data.csv` (glej skico), seznam `y` pa zgradite iz vsebine
+datoteke `70_30_train_labels.csv`. Datoteke `70_30_*` se nahajajo, tako
+kot `iris.data`, v direktoriju `/apps/poletna_sola/skupno/data`.  Na koncu
+vse skupaj [zapiklajte](http://docs.python.org/library/pickle.html),
+da vam ne bo treba vsakič znova brati vhodnih podatkov, s čimer boste
+pohitrili zagon vašega programa.
+
+	![X_and_y_matrix](Xy.svg)
 
 		>>> X.shape
 		(175315, 592158)
 		>>> type(y)
 		<type 'numpy.ndarray'>
 
-	Na koncu vse skupaj
-	[zapiklajte](http://docs.python.org/library/pickle.html), da vam ne bo
-	treba vsakič znova brati vhodne podatke, s čimer boste pohitrili zagon
-	vašega programa.
-
 	<div class="solution">
 
 		import pickle
 	</div>
 
 3. Napiši funkcijo `submit(P)`, ki sprejme matriko napovedanih verjetnosti
-in jih, v csv formatu, zapiše v izhodno datoteko `submission.csv` 
+in jo, v csv formatu, zapiše v izhodno datoteko `submission.csv` 
 ([namig](http://docs.scipy.org/doc/numpy/reference/generated/numpy.savetxt.html)).
 Dodatne točke dobite, če vam uspe izhodno datoteko skompresirati.
 

predavanja/out/Xy.svg

+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="282.57407"
+   height="191.0625"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.3.1 r9886"
+   sodipodi:docname="New document 1">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.4"
+     inkscape:cx="258.57243"
+     inkscape:cy="69.164639"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:snap-bbox="false"
+     inkscape:bbox-paths="true"
+     inkscape:bbox-nodes="false"
+     inkscape:snap-grids="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     inkscape:window-width="1278"
+     inkscape:window-height="1004"
+     inkscape:window-x="0"
+     inkscape:window-y="18"
+     inkscape:window-maximized="0">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3019"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true"
+       originx="-39.988422px"
+       originy="-799.48718px" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-39.988422,-61.8125)">
+    <text
+       xml:space="preserve"
+       style="font-size:14px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+       x="101.87486"
+       y="143.71318"
+       id="text2985"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan2987"
+         x="101.87486"
+         y="143.71318">70_30_train_data</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:14px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+       x="108.57143"
+       y="233.79076"
+       id="text2989"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan2991"
+         x="108.57143"
+         y="233.79076">70_30_test_data</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:14px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+       x="-204.29076"
+       y="316.55902"
+       id="text2993"
+       sodipodi:linespacing="125%"
+       transform="matrix(0,-1,1,0,0,0)"><tspan
+         sodipodi:role="line"
+         x="-204.29076"
+         y="316.55902"
+         id="tspan2997">70_30_train_labels</tspan></text>
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:1.11803401"
+       id="rect3021"
+       width="170"
+       height="150"
+       x="80"
+       y="62.362183" />
+    <rect
+       style="fill:none;stroke:#000000"
+       id="rect3023"
+       width="170"
+       height="40"
+       x="80.000008"
+       y="212.36218" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:1.11803401"
+       id="rect3025"
+       width="20"
+       height="150"
+       x="302"
+       y="62.362183" />
+    <text
+       xml:space="preserve"
+       style="font-size:14px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+       x="39.57143"
+       y="162.36218"
+       id="text3027"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3029"
+         x="39.57143"
+         y="162.36218">X =</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:14px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+       x="267.85715"
+       y="162.6479"
+       id="text3031"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3033"
+         x="267.85715"
+         y="162.6479">y =</tspan></text>
+  </g>
+</svg>

predavanja/out/index.html

+<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+
+<ol>
+<li><a href="xgrid.html">xgrid</a></li>
+<li><a href="majority.html">Večinski klasifikator</a></li>
+<li><a href="sparse.html">Redke matrike</a></li>
+<li><a href="cv.html">Prečno preverjanje</a></li>
+</ol>

predavanja/out/xgrid.svg

+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="140.33496"
+   height="134.48453"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.3.1 r9886"
+   sodipodi:docname="New document 1">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2.8"
+     inkscape:cx="85.356865"
+     inkscape:cy="79.403788"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     inkscape:window-width="1278"
+     inkscape:window-height="1004"
+     inkscape:window-x="0"
+     inkscape:window-y="18"
+     inkscape:window-maximized="0" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-76.985771,-60.21875)">
+    <text
+       xml:space="preserve"
+       style="font-size:14px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+       x="87.14286"
+       y="130.93361"
+       id="text2989"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan2991"
+         x="87.14286"
+         y="130.93361">xgrid.fri.uni-lj.si</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:14px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+       x="75.714287"
+       y="194.50504"
+       id="text2993"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan2995"
+         x="75.714287"
+         y="194.50504">n2     n3     ...     n10</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 140.71429,60.219324 0,44.999996"
+       id="path2997"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 83.571429,174.50504 57.142861,-30.71429 -15.625,31.16072"
+       id="path2999"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 141.48985,143.42463 60.65301,31.08041"
+       id="path3001"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+  </g>
+</svg>

predavanja/sparse.md

 	import numpy as np
 	import scipy.sparse as sp
 
-ter da sta matriki `X` in `Xcsr` definirani tako
+ter da sta matriki `X` in `Xcsr` definirani kot
 
 	X = [[1.0, 0, 1.0, 2.0],
 		 [6.0, 0, 0  , 0  ],
 		print np.sum(Xcsr.data)
 	</div>
 
-3. Napiši program, ki matriko `Xcsr` popravi tako, da bo vsota vseh vrstic enaka 1.
+3. Napiši program, ki matriko `Xcsr` popravi tako, da bo vsota vseh
+vrstic enaka 1. Povedano malo drugače, vsako vrstico matrike `Xcsr`
+deli z vsoto te vrstice.
 
 	<div class="solution">
 		
 
 	<div class="solution">
 
+		row_indices = np.array([True, False, False, True, True])
 		Xcsr = Xcsr[np.nonzero(row_indices)[0]]
 		print Xcsr.toarray()
 	</div>
 
-5. Napiši program, ki v matriki `Xcsr` obdrži le stolpce, ki vsebujejo vsaj dve neničelni vrednosti.
+5. Napiši program, ki v matriki `Xcsr` obdrži le stolpce, ki vsebujejo
+vsaj dve neničelni vrednosti. V našem primeru obdrižimo prvi in zadnji
+stolpec, saj oba vsebujeta natako dve neničelni vrednosti.
 
 	<div class="solution">
 

predavanja/xgrid.md

 V laboratoriju imamo na voljo 10 8-jedrnih računalnikov, ki vam bodo
 olajšali delo na problemu. Uporabite jih tako, da se najprej povežete
 z glavnim računalnikom na naslovu `xgrid.fri.uni-lj.si`, od koder je
-dostopnih 9 ostalih računalnikov z imeni `n2`, `n3`, vse do `n10`. 
+dostopnih ostalih 9, z imeni `n2`, `n3`, vse do `n10`. 
 
 ![shema](xgrid.svg)
 
 v direktorij `xgrid` in ustvarjena datoteka se bo, namesto na vašem
 lokalnem računalniku, znašla na strežniku.
 
-Seveda boste morali program zagnati tako, da se prej povežete na `xgrid`.
+Seveda boste morali program zagnati tako, da se prej povežete na 
+`xgrid.fri.uni-lj.si`.
 
 	local$ ssh ps1@xgrid.fri.uni-lj.si
 	xgrid$ ssh n6
 Naloge
 ------
 
-1. Ustvarite certifikat in njegov javni del skopirajte
+1. Na `xgrid`u ustvarite datoteko z imenom `.profile`, ki vsebuje vrstici
+
+		export PATH=/apps/poletna_sola/skupno/bin:$PATH
+		source /apps/poletna_sola/bin/activate
+
+	Brez druge vrstice bi uporabljali verzijo Pythona, ki nima
+	nameščenih vseh knjižnic.
+
+2. Ustvarite certifikat in njegov javni del skopirajte
 na `xgrid`, da vam ne bo treba vsakič znova vpisovati gesla.
 [Linux](http://rcsg-gsir.imsb-dsgi.nrc-cnrc.gc.ca/documents/internet/node31.html),
 [Windows](http://www.howtoforge.com/ssh_key_based_logins_putty_p2).
 
-2. (Samo za tiste, ki programirate v Pythonu) Na `xgrid`u ustvarite
-datoteko z imenom `.profile`, ki vsebuje vrstico
 
-		source /apps/poletna_sola/bin/activate
-
-	Brez te datoteke, boste namreč uporabljali verzijo Pythona, ki nima
-	nameščenih vseh knjižnic.
-