├── .gitignore ├── Lab_01 ├── 2023 │ └── Exercise_01_2023.ipynb ├── Exercise_01.ipynb ├── Lecture_01.ipynb └── README.md ├── Lab_02 ├── Data │ ├── fish.jpg │ └── k_mean_points.npy ├── Lab_02_task.ipynb └── img │ ├── elbow_chart.png │ ├── elbow_sc.png │ ├── objective.png │ └── sil_score.png ├── Lab_03 ├── MPA_MLF_SVM_2students_comments.ipynb └── README.md ├── Lab_04 ├── MPA_MLF_PCA_2_students.ipynb └── README.md ├── Lab_05 ├── Lab_05_task.ipynb ├── README.md ├── img │ ├── Neural_network.png │ ├── network.png │ └── neuron.png └── voting_complete.csv ├── Lab_06 └── Ex_06.ipynb ├── Lab_07 ├── 2023 │ └── MLF_CNN.ipynb ├── Ex_07.ipynb └── img │ └── mnist_data_sample.png ├── Lab_08 ├── Ex_08.ipynb └── README.md ├── Lab_K01 └── README.md ├── Lab_K02 ├── Lab_K02.ipynb └── img │ └── mnist_data_sample.png ├── Lab_Q1 ├── MPA-MLF_QC1_students.ipynb └── README.md ├── Lab_Q2 ├── MPA-MLF_QC2.ipynb └── README.md └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | .ipynb_checkpoints 2 | -------------------------------------------------------------------------------- /Lab_01/2023/Exercise_01_2023.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "id": "z2Jdst0Khkeh" 7 | }, 8 | "source": [ 9 | "# Exercise 1.4.1" 10 | ] 11 | }, 12 | { 13 | "cell_type": "markdown", 14 | "metadata": { 15 | "id": "4mKrJYuxiFmd" 16 | }, 17 | "source": [ 18 | "print the following pattern.\n", 19 | "\n", 20 | "![image.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAE8AAACwCAYAAABO8DNKAAAEBElEQVR4nO2csXGrQBRF7/5xEVYnUuYOIFTo0CX8DqAEdwChS3CGOkFd7A+QJbSgP4a7gt3lnhkHZiSzPoCkdzSDsdZaiFn8WXsBMSN5BHfyznUOY3LU597GUzncJjqsQ1PAIqts2/1mC8AWjfsoYa21xlr3DeOE0hyAxuLt2+CABvbvfp0jGzgvw017vFcZdgcDIEPVStxDxk/I7nKFrtf/MiqvKWCB7kf+HjOU1xQWyGzV/kgsrPyN48hrbZX1L9fu8s2qdvGFxcCdvNEzrSl0+T5g5KOK+C0azwgkj0DyCCSPQPIIJI9A8ggkj0DyCDxm+BNKY2DKU/8vos7dbQnhzmtUhm8rm/Ue31ZZ72+lh/cMf65z7Ooj2k/gY1fj2H7h+Or5iIfCmNG2yi4xtOt607hU6A2U6Kdk+E7+HPFx4T/DX173ACT9emet9wzfK9EXiSlXaL8Zvife2p/LN93vQPxl+NEz7XIwEr18leEJNJ4RSB6B5BFIHoHkEUgegeQRSB6B5BEEk+FPpYExJe6eXeeDbUHhzmvrZXgnSrSVzQJvgiM97yasKaYH0auwOf/89TmdyNBzVnAZ/hZiw09Z4WX4iCJqYBn+8ro3+6xflqAy/K08xxFRA8rwzr6cd+4QCSTDjz8u9K8wleEJNJ4RSB6B5BFIHoHkEUgegeQRSB6B5BGkkeHPNXJjkN8vHOVgm2fceS3aDO9EiTkVfCpJZfjreptikRKdVobvhdglSnRyGX7J25mkleEv7XHuWT+VhDJ8r0QvdDuTZDK8u6/7Tw3PIY0MP7rG599MTBmeQOMZgeQRSB6B5BFIHoHkEUgegeQRSB6BMjyz7uGYuMEMP3PdyvDEupXhb3uevG5l+LtdT1u3Mvx119PXrQxPrFsZnli3MjyxbmV4Ao1nBJJHIHkEkkcgeQSSRyB5BJJHIHkEyvAMwzFxgxl+JsrwBMrwBMrwBMrwBMrwBMrwBMrwBMrwBBrPCCSPQPIIJI9A8ggkj0DyCCSPQPII0sjwazEcEyPN8CuQVIZfmrQy/MIkl+GXJK0MvzAJZfjlSSbDr0EaGX4llOEJNJ4RSB6B5BFIHoHkEUgegeQRSB6B5BEEk+GjxJ3X1svw8TEy255QmgPQWLx9GxzQwP7d//pgnOscu/qI9hP42NU4tl84vno+4qEwZnTNDB8T4WX4iAgsw8dFUBk+NgLK8PERSIaPE2V4Ao1nBJJHIHkEkkcgeQSSRyB5BJJHIHkEHjP8BnHnNSrDbwzvGX5LvAw37fFeZdgdDIAMVStxDxk/IZ9/c4MU8J/hN4TnDL8t/Gb4jeEvw28QZXgCjWcEkkcgeQSSRyB5BJJHIHkEkkcgeQSSRyB5BP8A6GfFYXaAVpYAAAAASUVORK5CYII=)\n", 21 | "\n", 22 | "Avoid using trivial solutions like:\n", 23 | "\n", 24 | "print('X') \n", 25 | "\n", 26 | "print('X X')\n", 27 | "\n", 28 | ".....\n", 29 | "\n", 30 | "print('X X')\n", 31 | "\n", 32 | "print('X')" 33 | ] 34 | }, 35 | { 36 | "cell_type": "markdown", 37 | "metadata": { 38 | "id": "nOAWuH8qp79q" 39 | }, 40 | "source": [ 41 | "# Exercise 1.4.2" 42 | ] 43 | }, 44 | { 45 | "cell_type": "markdown", 46 | "metadata": { 47 | "id": "Zz2j3lx6qH2K" 48 | }, 49 | "source": [ 50 | "Write a script that will sum all numbers in the following string. You can split each number into single digits, so for example, you can consider 45 to be 4 and 5" 51 | ] 52 | }, 53 | { 54 | "cell_type": "code", 55 | "execution_count": 1, 56 | "metadata": { 57 | "id": "15fJxcCsqBH7" 58 | }, 59 | "outputs": [], 60 | "source": [ 61 | "input_str = \"n45as29@#8ss6\"" 62 | ] 63 | }, 64 | { 65 | "cell_type": "markdown", 66 | "metadata": { 67 | "id": "NjNQc3AXMPmi" 68 | }, 69 | "source": [ 70 | "# Exercise 1.4.3" 71 | ] 72 | }, 73 | { 74 | "cell_type": "markdown", 75 | "metadata": { 76 | "id": "-algCktYMZ4Q" 77 | }, 78 | "source": [ 79 | "Write a script that will convert an arbitrary integer to a binary number (the number will be represented as a string with only *0* and *1*). Avoid using the *bin()* function or any other pythons default functions" 80 | ] 81 | }, 82 | { 83 | "cell_type": "markdown", 84 | "metadata": { 85 | "id": "pCSSAjAj0ZlY" 86 | }, 87 | "source": [ 88 | "# Exercise 1.5-1:" 89 | ] 90 | }, 91 | { 92 | "cell_type": "markdown", 93 | "metadata": { 94 | "id": "JPgVzgDG1pwt" 95 | }, 96 | "source": [ 97 | "The Fibonacci Sequence is a series of numbers. The next number is found by adding up the two numbers before it. The first two numbers are 0 and 1. For example, 0, 1, 1, 2, 3, 5, 8, 13. The next number in this series above is 8 + 13 = 21" 98 | ] 99 | }, 100 | { 101 | "cell_type": "markdown", 102 | "metadata": { 103 | "id": "uEHzKT7k1sfr" 104 | }, 105 | "source": [ 106 | "\n", 107 | "\n", 108 | "Create a function that takes an integer as an input and returns a list that contains all Fibonacci numbers smaller than the input integer\n", 109 | "\n", 110 | "example:\n", 111 | "\n", 112 | "*print(fibonaci(10))*\n", 113 | "\n", 114 | "[0, 1, 1, 2, 3, 5, 8]\n" 115 | ] 116 | }, 117 | { 118 | "cell_type": "code", 119 | "execution_count": null, 120 | "metadata": { 121 | "id": "Lu9nP9hG2VzU" 122 | }, 123 | "outputs": [], 124 | "source": [ 125 | "def fibonaci(upper_threshold: int) -> list:\n", 126 | "\n", 127 | " return []" 128 | ] 129 | }, 130 | { 131 | "cell_type": "markdown", 132 | "metadata": { 133 | "id": "eVT1qWQGgXm2" 134 | }, 135 | "source": [ 136 | "# Exercise 1.5-2:" 137 | ] 138 | }, 139 | { 140 | "cell_type": "markdown", 141 | "metadata": { 142 | "id": "2hv2gSRIzI7-" 143 | }, 144 | "source": [ 145 | "### Basic:" 146 | ] 147 | }, 148 | { 149 | "cell_type": "markdown", 150 | "metadata": { 151 | "id": "BN8bKPh6y7Dm" 152 | }, 153 | "source": [ 154 | "implement function *display_as_digi* that will print an arbitrary integer in segment display style\n", 155 | "\n", 156 | "\n", 157 | "example:\n", 158 | "\n", 159 | "*display_as_digi(588)*\n", 160 | "\n", 161 | "\n", 162 | "![digit.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGgAAABcCAIAAAANlWdNAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAUQSURBVHhe7ZrBUSw7DEV/KuRBEKRABD8BAiAA9qwJgBzIgS1btmz5p+Y2Kle3pbY0s/s6i1d2j+ZKunbPK7v457cp0cYVaeOKtHFF2rgic+M+Pz/v7+/f3t40fX5+fnh4+P7+/vj4uLu7418e/vz8/HuBgQXwfPfdIymRMWD33SkpEa9NTWPcHYcuokgzGOVIoykDK0WVkVgDK8UjJUIYwUw1CFyDrIjX5inRq0qap6cn0u9qpayXl5fHx0fybY8ulfHk9fWVeBkRkxIhhufE863tkU9WxGszJjLOVm+b/6FFs8U0bPW2eUhWhMj1HZES8dqMiYxDS+s2tqc07+/vVDAukdZTz0/by4oQQ/zids6KTNs8JfqNU2LqYGCrh7oSWwAPZYQSUwdcYl1SInxKDJFjgEdWxGvzlLlxyI3/eZFeO5989gqoApJ9fX0xAJ7wnE+JsYqPpETUsKmpMM87qa2LeG1qGhO9qk1AG1ekjSvSxhVp44q0cUXauCJtXJE2rkgbV2RunA4rdrLhLMKRhYOLplcyHnR2h6Qju4DdIenIWOquiyPXtOnuOIrTwY3BDV0T1CpNBoFrgjCCidQgcA1kNBZoELgmym1GrypZCzd8i9Db8SLTg5jpHeQUmid48Q4Kam1GxtnqbfObYvtom59B5PqOsH20zUNqbUbGoVW44VtBtR4vMj2IIf7Ki0yPWpvRb5wSUweDxdVbhBJlgWXZPpihvUmk7I7bG2NwBPTco9zm3Djkyjd8p9CVqanPwDu5Zv2rMM87qQEDpqQgUeDdNW1Gr2oT0MYVaeOKtHFF2rgibVyRNq5IG1ekjSvSxhVp44rMjdMpz46EHOJ0nBwPd+PB0AJ4vvvukZTIGLD77pSUiNempjHujkMXUaQZjHKk0ZSBlaLKSKyBleKREiGMYKYaBK5BVsRr85ToVSVN/ymrR2Scrd42/0OLZotp2Opt85CsCJHrOyIl4rUZExmH1vFqVGnW/wp1SlaEGOIXt3NWZNrmKdFvnBJTBwNbPdSV2AJ4KCOUmDrgEuuSEuFTYogcAzyyIl6bp8yNQ256NUo+ewVUAcn6T1mbBG1ckTauSBtXpI0r0sYVaeOKtHFF2rgibVyR2xjHYYUzDScbxjroeKciGA86u0PSkV3A7pB0JFXJLmD87im3MU7tkViDoFZBgEpkYKZ46KRJpAaBa5CtBDWdTxmsuwY3e1VJOb0+9KC340WmBzFEXnmR6YG5N77IzGKrt81DbB9t8zOIXN8RqUpsk27zNW5mnDbFlReZHsQQf+VFpgeW3fIiM4WMUGLqOF09ImUBjpy2p71J5JjFI1uJFYDdDBY3KdzAONUKDJiSm9ckqJiu7D3SdwPv5Jqp0WfhIlOfHpEa/2pK5PoLfsvfuP8VbVyRNq5IG1ekjSvSxhVp44q0cUXauCJtXJG5cTqs2MmGs4hOReMZZTzfWADPd989khIZA3bfnZIS8drUNMbdcegiijSDUY40mjKwUlQZiTWwUjxSIoQRzFSDwDXIinhtnhK9qqTpv8j0iIyz1dvmf2jRbDENW71tHpIVIXJ9R6REvDZjIuPQOt7wKc3xDlLreeVFpidCDPGL2zkrMm3zlOg3Tompg4GtHupKbAE8lBFKTB1wiXVJifApMUSOAR5ZEa/NU+bGITe94SOfvQKqgGT9F5lNgjauSBtXpI0r0sYVaeOKtHFF2rgibVyRNq5IG1fi9/c/pr/ZCf8bc3sAAAAASUVORK5CYII=)" 163 | ] 164 | }, 165 | { 166 | "cell_type": "code", 167 | "execution_count": null, 168 | "metadata": { 169 | "id": "3GcRk6OYzKuV" 170 | }, 171 | "outputs": [], 172 | "source": [ 173 | "def display_as_digi(number: int) -> None:\n", 174 | " pass" 175 | ] 176 | }, 177 | { 178 | "cell_type": "markdown", 179 | "metadata": { 180 | "id": "__gcTtmby5Yu" 181 | }, 182 | "source": [ 183 | "### Extension" 184 | ] 185 | }, 186 | { 187 | "cell_type": "markdown", 188 | "metadata": { 189 | "id": "ek8Z7Agx0H-Y" 190 | }, 191 | "source": [ 192 | "extend our segment number printer to be able to print decimal numbers" 193 | ] 194 | }, 195 | { 196 | "cell_type": "markdown", 197 | "metadata": { 198 | "id": "Tu7yI05aT1y5" 199 | }, 200 | "source": [ 201 | "# Exercise 2" 202 | ] 203 | }, 204 | { 205 | "cell_type": "markdown", 206 | "metadata": { 207 | "id": "7GaHLE8Zh8aJ" 208 | }, 209 | "source": [ 210 | "### 1\n" 211 | ] 212 | }, 213 | { 214 | "cell_type": "markdown", 215 | "metadata": { 216 | "id": "ZIyURJ6HZ5Rb" 217 | }, 218 | "source": [ 219 | "- Create a numpy array with shape 5x5, that contains numbers from 25..to 0\n", 220 | "- create a function that takes an arbitrary numpy array as an input and sets all numbers smaller than the user-defined threshold to 0\n", 221 | "- test your function on your array\n", 222 | "- make one implementation using loops and one without using loops, compare execution time with *time* library\n" 223 | ] 224 | }, 225 | { 226 | "cell_type": "markdown", 227 | "metadata": { 228 | "id": "tl_vFRrwiArx" 229 | }, 230 | "source": [ 231 | "### 2\n", 232 | " - let's return to our Digi display, and create a function that will take an arbitrary integer as an input and display it as a binary image in segment display style.\n", 233 | "*hint: to show an image use the library matplotlib.pyplot, also you will maybe find function np.concatenate useful*" 234 | ] 235 | }, 236 | { 237 | "cell_type": "code", 238 | "execution_count": null, 239 | "metadata": { 240 | "id": "ha5_BgE0mxoY" 241 | }, 242 | "outputs": [], 243 | "source": [ 244 | "def show_in_digi(input_integer: int) -> None:\n", 245 | " pass" 246 | ] 247 | }, 248 | { 249 | "cell_type": "markdown", 250 | "metadata": { 251 | "id": "pcOmCLI1muSr" 252 | }, 253 | "source": [ 254 | "show_in_digi(5289) will show:\n" 255 | ] 256 | }, 257 | { 258 | "cell_type": "markdown", 259 | "metadata": { 260 | "id": "aHN2vh9dm-S5" 261 | }, 262 | "source": [ 263 | "![image.png](data:image/png;base64,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)" 264 | ] 265 | }, 266 | { 267 | "cell_type": "markdown", 268 | "metadata": { 269 | "id": "6s8LqeO6fuS1" 270 | }, 271 | "source": [ 272 | "# Exercise 3" 273 | ] 274 | }, 275 | { 276 | "cell_type": "markdown", 277 | "metadata": { 278 | "id": "9MV_c3_3f9V0" 279 | }, 280 | "source": [ 281 | "Use google colab dataset loaded in the lecture and do following operations:" 282 | ] 283 | }, 284 | { 285 | "cell_type": "markdown", 286 | "metadata": { 287 | "id": "ZctJOSglgYjc" 288 | }, 289 | "source": [ 290 | "- check what *dataset.describe()* does" 291 | ] 292 | }, 293 | { 294 | "cell_type": "markdown", 295 | "metadata": { 296 | "id": "ANvmvaQzpp2k" 297 | }, 298 | "source": [ 299 | "- display all rows where *total_bedrooms* column is bigger than 310" 300 | ] 301 | }, 302 | { 303 | "cell_type": "markdown", 304 | "metadata": { 305 | "id": "AJnkbsLDpcrh" 306 | }, 307 | "source": [ 308 | "- drop also first and last row" 309 | ] 310 | }, 311 | { 312 | "cell_type": "markdown", 313 | "metadata": { 314 | "id": "jjj3NIPGheCC" 315 | }, 316 | "source": [ 317 | "- save a mean of values in *households* columns to variable, using *matplotlib* display number of households in the graph (x-axis would be ID, y-axis - numbers of households) as dots with the same color, display also mean as a single line in the graph with different color as dots is" 318 | ] 319 | }, 320 | { 321 | "cell_type": "markdown", 322 | "metadata": { 323 | "id": "Ga-8a7TFgFDT" 324 | }, 325 | "source": [ 326 | " - check if any of the columns contain NaN values, if yes, replace the NaN values with the arithmetic mean of the whole dataset " 327 | ] 328 | }, 329 | { 330 | "cell_type": "markdown", 331 | "metadata": { 332 | "id": "L6_0MzSRqYK9" 333 | }, 334 | "source": [ 335 | " - display *lat* and *long* into plot, *lat* would be on *x* axis and *long* on *y* axis " 336 | ] 337 | }, 338 | { 339 | "cell_type": "markdown", 340 | "metadata": { 341 | "id": "Eba6rEqcixWl" 342 | }, 343 | "source": [ 344 | "- choose two arbitrary columns and normalize all values inside using min-max normalization:" 345 | ] 346 | }, 347 | { 348 | "cell_type": "markdown", 349 | "metadata": { 350 | "id": "nZ5hAWKlpVKK" 351 | }, 352 | "source": [ 353 | "- Create a Correlation Matrix from all columns " 354 | ] 355 | }, 356 | { 357 | "cell_type": "code", 358 | "execution_count": null, 359 | "metadata": {}, 360 | "outputs": [], 361 | "source": [] 362 | } 363 | ], 364 | "metadata": { 365 | "colab": { 366 | "authorship_tag": "ABX9TyP5NBWcPh6gnd0fp49eBChn", 367 | "provenance": [] 368 | }, 369 | "kernelspec": { 370 | "display_name": "Python 3 (ipykernel)", 371 | "language": "python", 372 | "name": "python3" 373 | }, 374 | "language_info": { 375 | "codemirror_mode": { 376 | "name": "ipython", 377 | "version": 3 378 | }, 379 | "file_extension": ".py", 380 | "mimetype": "text/x-python", 381 | "name": "python", 382 | "nbconvert_exporter": "python", 383 | "pygments_lexer": "ipython3", 384 | "version": "3.10.12" 385 | } 386 | }, 387 | "nbformat": 4, 388 | "nbformat_minor": 4 389 | } 390 | -------------------------------------------------------------------------------- /Lab_01/Exercise_01.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "id": "z2Jdst0Khkeh" 7 | }, 8 | "source": [ 9 | "# Exercise 1" 10 | ] 11 | }, 12 | { 13 | "cell_type": "markdown", 14 | "metadata": {}, 15 | "source": [ 16 | "## Exercise 1.1" 17 | ] 18 | }, 19 | { 20 | "cell_type": "markdown", 21 | "metadata": { 22 | "id": "4mKrJYuxiFmd" 23 | }, 24 | "source": [ 25 | "write a code that prints the following pattern. Try to use as few loops as possible.\n", 26 | "\n", 27 | "![image.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAE8AAACwCAYAAABO8DNKAAAEBElEQVR4nO2csXGrQBRF7/5xEVYnUuYOIFTo0CX8DqAEdwChS3CGOkFd7A+QJbSgP4a7gt3lnhkHZiSzPoCkdzSDsdZaiFn8WXsBMSN5BHfyznUOY3LU597GUzncJjqsQ1PAIqts2/1mC8AWjfsoYa21xlr3DeOE0hyAxuLt2+CABvbvfp0jGzgvw017vFcZdgcDIEPVStxDxk/I7nKFrtf/MiqvKWCB7kf+HjOU1xQWyGzV/kgsrPyN48hrbZX1L9fu8s2qdvGFxcCdvNEzrSl0+T5g5KOK+C0azwgkj0DyCCSPQPIIJI9A8ggkj0DyCDxm+BNKY2DKU/8vos7dbQnhzmtUhm8rm/Ue31ZZ72+lh/cMf65z7Ooj2k/gY1fj2H7h+Or5iIfCmNG2yi4xtOt607hU6A2U6Kdk+E7+HPFx4T/DX173ACT9emet9wzfK9EXiSlXaL8Zvife2p/LN93vQPxl+NEz7XIwEr18leEJNJ4RSB6B5BFIHoHkEUgegeQRSB6B5BEEk+FPpYExJe6eXeeDbUHhzmvrZXgnSrSVzQJvgiM97yasKaYH0auwOf/89TmdyNBzVnAZ/hZiw09Z4WX4iCJqYBn+8ro3+6xflqAy/K08xxFRA8rwzr6cd+4QCSTDjz8u9K8wleEJNJ4RSB6B5BFIHoHkEUgegeQRSB6B5BGkkeHPNXJjkN8vHOVgm2fceS3aDO9EiTkVfCpJZfjreptikRKdVobvhdglSnRyGX7J25mkleEv7XHuWT+VhDJ8r0QvdDuTZDK8u6/7Tw3PIY0MP7rG599MTBmeQOMZgeQRSB6B5BFIHoHkEUgegeQRSB6BMjyz7uGYuMEMP3PdyvDEupXhb3uevG5l+LtdT1u3Mvx119PXrQxPrFsZnli3MjyxbmV4Ao1nBJJHIHkEkkcgeQSSRyB5BJJHIHkEyvAMwzFxgxl+JsrwBMrwBMrwBMrwBMrwBMrwBMrwBMrwBBrPCCSPQPIIJI9A8ggkj0DyCCSPQPII0sjwazEcEyPN8CuQVIZfmrQy/MIkl+GXJK0MvzAJZfjlSSbDr0EaGX4llOEJNJ4RSB6B5BFIHoHkEUgegeQRSB6B5BEEk+GjxJ3X1svw8TEy255QmgPQWLx9GxzQwP7d//pgnOscu/qI9hP42NU4tl84vno+4qEwZnTNDB8T4WX4iAgsw8dFUBk+NgLK8PERSIaPE2V4Ao1nBJJHIHkEkkcgeQSSRyB5BJJHIHkEHjP8BnHnNSrDbwzvGX5LvAw37fFeZdgdDIAMVStxDxk/IZ9/c4MU8J/hN4TnDL8t/Gb4jeEvw28QZXgCjWcEkkcgeQSSRyB5BJJHIHkEkkcgeQSSRyB5BP8A6GfFYXaAVpYAAAAASUVORK5CYII=)\n", 28 | "\n", 29 | "Avoid using trivial solutions like:\n", 30 | "\n", 31 | "print('X') \n", 32 | "\n", 33 | "print('X X')\n", 34 | "\n", 35 | "print('X X X')\n", 36 | "\n", 37 | ".....\n", 38 | "\n", 39 | "print('X X X')\n", 40 | "\n", 41 | "print('X X')\n", 42 | "\n", 43 | "print('X')\n" 44 | ] 45 | }, 46 | { 47 | "cell_type": "markdown", 48 | "metadata": { 49 | "id": "nOAWuH8qp79q" 50 | }, 51 | "source": [ 52 | "## Exercise 1.2" 53 | ] 54 | }, 55 | { 56 | "cell_type": "markdown", 57 | "metadata": { 58 | "id": "Zz2j3lx6qH2K" 59 | }, 60 | "source": [ 61 | "Write a script that will sum all numbers in the following string. You can split each number into single digits, so for example, you can consider 45 to be 4 and 5" 62 | ] 63 | }, 64 | { 65 | "cell_type": "code", 66 | "execution_count": 1, 67 | "metadata": { 68 | "id": "15fJxcCsqBH7" 69 | }, 70 | "outputs": [], 71 | "source": [ 72 | "input_str = \"n45as29@#8ss6\"" 73 | ] 74 | }, 75 | { 76 | "cell_type": "markdown", 77 | "metadata": { 78 | "id": "NjNQc3AXMPmi" 79 | }, 80 | "source": [ 81 | "## Exercise 1.3" 82 | ] 83 | }, 84 | { 85 | "cell_type": "markdown", 86 | "metadata": { 87 | "id": "-algCktYMZ4Q" 88 | }, 89 | "source": [ 90 | "Write a script that will convert an arbitrary integer to a binary number (the number will be represented as a string with only *0* and *1*). Avoid using the *bin()* function or any other pythons default functions" 91 | ] 92 | }, 93 | { 94 | "cell_type": "markdown", 95 | "metadata": { 96 | "id": "pCSSAjAj0ZlY" 97 | }, 98 | "source": [ 99 | "## Exercise 1.4 - The Fibonacci Sequence:" 100 | ] 101 | }, 102 | { 103 | "cell_type": "markdown", 104 | "metadata": { 105 | "id": "JPgVzgDG1pwt" 106 | }, 107 | "source": [ 108 | "The Fibonacci Sequence is a series of numbers. The following number is found by adding up the two numbers before it. The first two numbers are 0 and 1. For example, 0, 1, 1, 2, 3, 5, 8, 13. The following number in this series above is 8 + 13 = 21" 109 | ] 110 | }, 111 | { 112 | "cell_type": "markdown", 113 | "metadata": { 114 | "id": "uEHzKT7k1sfr" 115 | }, 116 | "source": [ 117 | "\n", 118 | "Your task is to implement a function *fibonacci* that takes an integer as an input and returns a list that contains all Fibonacci numbers with values lower than the input integer\n", 119 | "\n", 120 | "Example:\n", 121 | "\n", 122 | "*print(fibonaci(10))*\n", 123 | "\n", 124 | "[0, 1, 1, 2, 3, 5, 8]\n" 125 | ] 126 | }, 127 | { 128 | "cell_type": "code", 129 | "execution_count": 2, 130 | "metadata": { 131 | "id": "Lu9nP9hG2VzU" 132 | }, 133 | "outputs": [], 134 | "source": [ 135 | "def fibonacci(upper_threshold: int) -> list:\n", 136 | " return []" 137 | ] 138 | }, 139 | { 140 | "cell_type": "markdown", 141 | "metadata": {}, 142 | "source": [ 143 | "#### Advanced" 144 | ] 145 | }, 146 | { 147 | "cell_type": "markdown", 148 | "metadata": {}, 149 | "source": [ 150 | "Try to implement the function using multiple approaches: *Iterative approach*, *Recusrion*, *Memoization*" 151 | ] 152 | }, 153 | { 154 | "cell_type": "markdown", 155 | "metadata": { 156 | "id": "eVT1qWQGgXm2" 157 | }, 158 | "source": [ 159 | "## Exercise 1.5. - Rock, Paper, Scissors game:" 160 | ] 161 | }, 162 | { 163 | "cell_type": "markdown", 164 | "metadata": {}, 165 | "source": [ 166 | "#### basic" 167 | ] 168 | }, 169 | { 170 | "cell_type": "markdown", 171 | "metadata": {}, 172 | "source": [ 173 | "*Rock, Paper, Scissors* is a well-known and straightforward game. If you do not know the rules, google them. We will write a code for the Rock, Paper, Scissors game where the user plays against a random computer. The code can be written into one function *rock_paper_scissors*.\n", 174 | "\n", 175 | "Notes:\n", 176 | "- This implementation uses the **random** library to enable the computer to make a random choice.\n", 177 | "- Keyword **Input** may be helpful. Check it\n", 178 | "- After the function is run, the program will ask you about your movement, which you type in\n", 179 | "- The game is case-insensitive for user input (e.g., \"rock\", \"Rock\", and \"ROCK\" are all valid).\n", 180 | "- This script plays one round of the game.\n", 181 | "- The script prints the result ('You lose', 'You win', 'It is a tie')\n" 182 | ] 183 | }, 184 | { 185 | "cell_type": "code", 186 | "execution_count": 3, 187 | "metadata": {}, 188 | "outputs": [ 189 | { 190 | "name": "stdout", 191 | "output_type": "stream", 192 | "text": [ 193 | "I am empty\n" 194 | ] 195 | } 196 | ], 197 | "source": [ 198 | "def rock_paper_scissors() -> None:\n", 199 | " print('I am empty')\n", 200 | "\n", 201 | "rock_paper_scissors()" 202 | ] 203 | }, 204 | { 205 | "cell_type": "markdown", 206 | "metadata": {}, 207 | "source": [ 208 | "#### Advanced" 209 | ] 210 | }, 211 | { 212 | "cell_type": "markdown", 213 | "metadata": {}, 214 | "source": [ 215 | "Extend the Rock, Paper, Scissors game to be able to play *n* rounds. \n", 216 | "\n", 217 | "Notes: \n", 218 | "- The scrips will contain two counters - user score and computer score\n", 219 | "- After each run, the script prints the current scores and rounds.\n", 220 | "- When the number of rounds is reached, the script prints the result ('You lose', 'You win', 'It is a tie')" 221 | ] 222 | }, 223 | { 224 | "cell_type": "markdown", 225 | "metadata": { 226 | "id": "Tu7yI05aT1y5" 227 | }, 228 | "source": [ 229 | "# Exercise 2" 230 | ] 231 | }, 232 | { 233 | "cell_type": "markdown", 234 | "metadata": {}, 235 | "source": [ 236 | "The purpose of this excercise is to practise working with NumPy library" 237 | ] 238 | }, 239 | { 240 | "cell_type": "markdown", 241 | "metadata": { 242 | "id": "7GaHLE8Zh8aJ" 243 | }, 244 | "source": [ 245 | "## Exercise 2.1\n" 246 | ] 247 | }, 248 | { 249 | "cell_type": "markdown", 250 | "metadata": {}, 251 | "source": [ 252 | "In this exercise, you will work with NumPy arrays and learn how to efficiently modify and process them using both loops and vectorized operations. Your task is to:" 253 | ] 254 | }, 255 | { 256 | "cell_type": "markdown", 257 | "metadata": { 258 | "id": "ZIyURJ6HZ5Rb" 259 | }, 260 | "source": [ 261 | "1. Implement the function *create_array_nxn* that generates an n×n NumPy array filled with numbers from n² - 1 down to 0\n", 262 | "2. Using a loop-based approach (for-loop, while-loop), implement the function *apply_threshold_loop* that takes any NumPy array and replaces all numbers below a user-defined threshold with 0.\n", 263 | "3. Implement function *apply_threshold_vectorized* that performs the same operation as *apply_threshold_loop*, but without loops, using NumPy vectorized operations\n", 264 | "4. Implement function *compare_performance* that compares the execution time of functions *apply_threshold_vectorized* and *apply_threshold_loop* with **time** library and print the results\n" 265 | ] 266 | }, 267 | { 268 | "cell_type": "markdown", 269 | "metadata": {}, 270 | "source": [ 271 | "**Additional Notes**:\n", 272 | "\n", 273 | "- Ensure n is a positive integer (n > 0).\n", 274 | "- Use the time library to measure execution times for performance comparison.\n", 275 | "- The function *compare_performance(n, threshold)* should:\n", 276 | " - Generate an n×n array.\n", 277 | " - Apply both loop-based and vectorized thresholding.\n", 278 | " - Print execution times." 279 | ] 280 | }, 281 | { 282 | "cell_type": "code", 283 | "execution_count": 4, 284 | "metadata": {}, 285 | "outputs": [], 286 | "source": [ 287 | "import numpy as np\n", 288 | "import time" 289 | ] 290 | }, 291 | { 292 | "cell_type": "code", 293 | "execution_count": 5, 294 | "metadata": {}, 295 | "outputs": [], 296 | "source": [ 297 | "def create_array_nxn(n: int) -> np.ndarray:\n", 298 | " pass" 299 | ] 300 | }, 301 | { 302 | "cell_type": "code", 303 | "execution_count": 6, 304 | "metadata": {}, 305 | "outputs": [], 306 | "source": [ 307 | "def apply_threshold_loop(arr: np.ndarray, threshold: int) -> np.ndarray:\n", 308 | " pass" 309 | ] 310 | }, 311 | { 312 | "cell_type": "code", 313 | "execution_count": 7, 314 | "metadata": {}, 315 | "outputs": [], 316 | "source": [ 317 | "def apply_threshold_vectorized(arr: np.ndarray, threshold: int) -> np.ndarray:\n", 318 | " pass" 319 | ] 320 | }, 321 | { 322 | "cell_type": "code", 323 | "execution_count": 8, 324 | "metadata": {}, 325 | "outputs": [], 326 | "source": [ 327 | "def compare_performance(n: int, threshold: int) -> None:\n", 328 | " pass" 329 | ] 330 | }, 331 | { 332 | "cell_type": "markdown", 333 | "metadata": { 334 | "id": "tl_vFRrwiArx" 335 | }, 336 | "source": [ 337 | "## Exercise 2.2 - Digi display\n", 338 | "\n", 339 | "#### basic\n", 340 | "\n", 341 | "The task will be to create a simulation of a Digi display that will be able to display an arbitrary integer\n", 342 | " \n", 343 | "*hint: to show the image, use the library matplotlib.pyplot. Also, you may find function *np.concatenate* helpful" 344 | ] 345 | }, 346 | { 347 | "cell_type": "code", 348 | "execution_count": 9, 349 | "metadata": { 350 | "id": "ha5_BgE0mxoY" 351 | }, 352 | "outputs": [], 353 | "source": [ 354 | "def show_in_digi(input_integer: int) -> None:\n", 355 | " pass" 356 | ] 357 | }, 358 | { 359 | "cell_type": "code", 360 | "execution_count": 10, 361 | "metadata": {}, 362 | "outputs": [], 363 | "source": [ 364 | "import matplotlib.pyplot as plt" 365 | ] 366 | }, 367 | { 368 | "cell_type": "markdown", 369 | "metadata": { 370 | "id": "pcOmCLI1muSr" 371 | }, 372 | "source": [ 373 | "show_in_digi(5289) will show:\n" 374 | ] 375 | }, 376 | { 377 | "cell_type": "markdown", 378 | "metadata": { 379 | "id": "aHN2vh9dm-S5" 380 | }, 381 | "source": [ 382 | "![image.png](data:image/png;base64,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)" 383 | ] 384 | }, 385 | { 386 | "cell_type": "markdown", 387 | "metadata": {}, 388 | "source": [ 389 | "*hint2: you may find the following dict usefull*" 390 | ] 391 | }, 392 | { 393 | "cell_type": "code", 394 | "execution_count": 11, 395 | "metadata": {}, 396 | "outputs": [], 397 | "source": [ 398 | "numbs = {\n", 399 | " \"1\": np.array([[0, 1, 1], [1, 0, 1], [0, 0, 1], [0, 0, 1], [0, 0, 1]]), # 1\n", 400 | " \"2\": np.array([[1, 1, 1], [0, 0, 1], [1, 1, 1], [1, 0, 0], [1, 1, 1]]), # 2\n", 401 | " \"3\": np.array([[1, 1, 1], [0, 0, 1], [1, 1, 1], [0, 0, 1], [1, 1, 1]]), # 3\n", 402 | " \"4\": np.array([[1, 0, 1], [1, 0, 1], [1, 1, 1], [0, 0, 1], [0, 0, 1]]), # 4\n", 403 | " \"5\": np.array([[1, 1, 1], [1, 0, 0], [1, 1, 1], [0, 0, 1], [1, 1, 1]]), # 5\n", 404 | " \"6\": np.array([[1, 1, 1], [1, 0, 0], [1, 1, 1], [1, 0, 1], [1, 1, 1]]), # 6\n", 405 | " \"7\": np.array([[1, 1, 1], [0, 0, 1], [0, 0, 1], [0, 0, 1], [0, 0, 1]]), # 7\n", 406 | " \"8\": np.array([[1, 1, 1], [1, 0, 1], [1, 1, 1], [1, 0, 1], [1, 1, 1]]), # 8\n", 407 | " \"9\": np.array([[1, 1, 1], [1, 0, 1], [1, 1, 1], [0, 0, 1], [1, 1, 1]]), # 9\n", 408 | " \"0\": np.array([[1, 1, 1], [1, 0, 1], [1, 0, 1], [1, 0, 1], [1, 1, 1]]), # 0\n", 409 | " }" 410 | ] 411 | }, 412 | { 413 | "cell_type": "markdown", 414 | "metadata": {}, 415 | "source": [ 416 | "#### advanced" 417 | ] 418 | }, 419 | { 420 | "cell_type": "markdown", 421 | "metadata": {}, 422 | "source": [ 423 | "Extend your *show_in_digi* function to be able to display an arbitary float number and negative numbers" 424 | ] 425 | }, 426 | { 427 | "cell_type": "markdown", 428 | "metadata": { 429 | "id": "6s8LqeO6fuS1" 430 | }, 431 | "source": [ 432 | "# Exercise 3 - Playing with California Housing Dataset" 433 | ] 434 | }, 435 | { 436 | "cell_type": "markdown", 437 | "metadata": { 438 | "id": "9MV_c3_3f9V0" 439 | }, 440 | "source": [ 441 | "The purpose of this exercise is to learn basic operations of **pandas** library. Use *california_housing_dataset* you can find in google colab to do following operations:" 442 | ] 443 | }, 444 | { 445 | "cell_type": "markdown", 446 | "metadata": { 447 | "id": "ZctJOSglgYjc" 448 | }, 449 | "source": [ 450 | "- check what *dataset.describe()* does" 451 | ] 452 | }, 453 | { 454 | "cell_type": "markdown", 455 | "metadata": { 456 | "id": "ANvmvaQzpp2k" 457 | }, 458 | "source": [ 459 | "- display all rows where *total_bedrooms* column is bigger than 310" 460 | ] 461 | }, 462 | { 463 | "cell_type": "markdown", 464 | "metadata": { 465 | "id": "AJnkbsLDpcrh" 466 | }, 467 | "source": [ 468 | "- drop also first and last row" 469 | ] 470 | }, 471 | { 472 | "cell_type": "markdown", 473 | "metadata": { 474 | "id": "jjj3NIPGheCC" 475 | }, 476 | "source": [ 477 | "- save a mean of values in *households* columns to variable, using *matplotlib* display number of households in the graph (x-axis would be ID, y-axis - numbers of households) as dots with the same color, display also mean as a single line in the graph with different color as dots is" 478 | ] 479 | }, 480 | { 481 | "cell_type": "markdown", 482 | "metadata": { 483 | "id": "Ga-8a7TFgFDT" 484 | }, 485 | "source": [ 486 | " - check if any of the columns contain NaN values, if yes, replace the NaN values with the arithmetic mean of the whole dataset " 487 | ] 488 | }, 489 | { 490 | "cell_type": "markdown", 491 | "metadata": { 492 | "id": "L6_0MzSRqYK9" 493 | }, 494 | "source": [ 495 | " - display *lat* and *long* into plot, *lat* would be on *x* axis and *long* on *y* axis " 496 | ] 497 | }, 498 | { 499 | "cell_type": "markdown", 500 | "metadata": { 501 | "id": "Eba6rEqcixWl" 502 | }, 503 | "source": [ 504 | "- choose two arbitrary columns and normalize all values inside using *min-max normalization*:" 505 | ] 506 | }, 507 | { 508 | "cell_type": "markdown", 509 | "metadata": { 510 | "id": "nZ5hAWKlpVKK" 511 | }, 512 | "source": [ 513 | "- Create a Correlation Matrix from all columns " 514 | ] 515 | } 516 | ], 517 | "metadata": { 518 | "colab": { 519 | "authorship_tag": "ABX9TyP5NBWcPh6gnd0fp49eBChn", 520 | "provenance": [] 521 | }, 522 | "kernelspec": { 523 | "display_name": "Python 3 (ipykernel)", 524 | "language": "python", 525 | "name": "python3" 526 | }, 527 | "language_info": { 528 | "codemirror_mode": { 529 | "name": "ipython", 530 | "version": 3 531 | }, 532 | "file_extension": ".py", 533 | "mimetype": "text/x-python", 534 | "name": "python", 535 | "nbconvert_exporter": "python", 536 | "pygments_lexer": "ipython3", 537 | "version": "3.10.12" 538 | } 539 | }, 540 | "nbformat": 4, 541 | "nbformat_minor": 4 542 | } 543 | -------------------------------------------------------------------------------- /Lab_01/README.md: -------------------------------------------------------------------------------- 1 | # Lab_01 2 | 3 | -------------------------------------------------------------------------------- /Lab_02/Data/fish.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MPA-MLF/Exercises/1c9eafa7e033f2acf9ddb7d055fe59c3e9a0e687/Lab_02/Data/fish.jpg -------------------------------------------------------------------------------- /Lab_02/Data/k_mean_points.npy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MPA-MLF/Exercises/1c9eafa7e033f2acf9ddb7d055fe59c3e9a0e687/Lab_02/Data/k_mean_points.npy -------------------------------------------------------------------------------- /Lab_02/img/elbow_chart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MPA-MLF/Exercises/1c9eafa7e033f2acf9ddb7d055fe59c3e9a0e687/Lab_02/img/elbow_chart.png -------------------------------------------------------------------------------- /Lab_02/img/elbow_sc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MPA-MLF/Exercises/1c9eafa7e033f2acf9ddb7d055fe59c3e9a0e687/Lab_02/img/elbow_sc.png -------------------------------------------------------------------------------- /Lab_02/img/objective.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MPA-MLF/Exercises/1c9eafa7e033f2acf9ddb7d055fe59c3e9a0e687/Lab_02/img/objective.png -------------------------------------------------------------------------------- /Lab_02/img/sil_score.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MPA-MLF/Exercises/1c9eafa7e033f2acf9ddb7d055fe59c3e9a0e687/Lab_02/img/sil_score.png -------------------------------------------------------------------------------- /Lab_03/MPA_MLF_SVM_2students_comments.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "source": [ 6 | "# SVM for classification" 7 | ], 8 | "metadata": { 9 | "id": "qpzybxGIwnuz" 10 | } 11 | }, 12 | { 13 | "cell_type": "markdown", 14 | "source": [ 15 | "Load IRIS dataset, check its contents:\n" 16 | ], 17 | "metadata": { 18 | "id": "eMcpNqv-uk-K" 19 | } 20 | }, 21 | { 22 | "cell_type": "code", 23 | "execution_count": null, 24 | "metadata": { 25 | "colab": { 26 | "base_uri": "https://localhost:8080/" 27 | }, 28 | "id": "0Pw3iTT7-brT", 29 | "outputId": "a0abec69-5c50-41a3-f49a-1daeb8403341" 30 | }, 31 | "outputs": [ 32 | { 33 | "output_type": "stream", 34 | "name": "stdout", 35 | "text": [ 36 | "['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']\n", 37 | "[[5.1 3.5 1.4 0.2]\n", 38 | " [4.9 3. 1.4 0.2]\n", 39 | " [4.7 3.2 1.3 0.2]\n", 40 | " [4.6 3.1 1.5 0.2]\n", 41 | " [5. 3.6 1.4 0.2]]\n", 42 | "[0 0 0 0 0]\n" 43 | ] 44 | } 45 | ], 46 | "source": [ 47 | "from sklearn.datasets import load_iris\n", 48 | "iris=load_iris()\n", 49 | "iris.feature_names\n", 50 | "print(iris.feature_names)\n", 51 | "print(iris.data[0:5,:])\n", 52 | "print(iris.target[0:5])\n", 53 | "#print(iris.data)" 54 | ] 55 | }, 56 | { 57 | "cell_type": "markdown", 58 | "source": [ 59 | "Split data into training and testing parts:" 60 | ], 61 | "metadata": { 62 | "id": "H5VBL_QBussh" 63 | } 64 | }, 65 | { 66 | "cell_type": "code", 67 | "source": [ 68 | "from sklearn.model_selection import train_test_split\n", 69 | "X=iris.data\n", 70 | "y=iris.target\n", 71 | "X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.2)\n", 72 | "print(X_train.shape)\n", 73 | "print(X_test.shape)" 74 | ], 75 | "metadata": { 76 | "id": "rDk-PobDtp7b", 77 | "outputId": "2a5dfeca-2a34-4910-928c-b90dd538536c", 78 | "colab": { 79 | "base_uri": "https://localhost:8080/" 80 | } 81 | }, 82 | "execution_count": null, 83 | "outputs": [ 84 | { 85 | "output_type": "stream", 86 | "name": "stdout", 87 | "text": [ 88 | "(120, 4)\n", 89 | "(30, 4)\n" 90 | ] 91 | } 92 | ] 93 | }, 94 | { 95 | "cell_type": "markdown", 96 | "source": [ 97 | "Use a Support Vector Machine for classification:\n" 98 | ], 99 | "metadata": { 100 | "id": "3hjR3_OOuzZO" 101 | } 102 | }, 103 | { 104 | "cell_type": "code", 105 | "source": [ 106 | "from sklearn.svm import SVC\n", 107 | "SVMmodel=SVC(kernel='linear')\n", 108 | "SVMmodel.fit(X_train,y_train)\n", 109 | "SVMmodel.get_params()\n", 110 | "SVMmodel.score(X_test,y_test)" 111 | ], 112 | "metadata": { 113 | "id": "XKbwK1yht2In", 114 | "outputId": "8627d473-c57e-4429-d3c7-3a010a18ba74", 115 | "colab": { 116 | "base_uri": "https://localhost:8080/" 117 | } 118 | }, 119 | "execution_count": null, 120 | "outputs": [ 121 | { 122 | "output_type": "execute_result", 123 | "data": { 124 | "text/plain": [ 125 | "1.0" 126 | ] 127 | }, 128 | "metadata": {}, 129 | "execution_count": 91 130 | } 131 | ] 132 | }, 133 | { 134 | "cell_type": "markdown", 135 | "source": [ 136 | "Let's explore more now. \n", 137 | "\n", 138 | "* Choose only first two features (columns) of iris.data\n", 139 | "* SVM is in its basic form a 2-class classifier, so eliminate iris.target =2 from the data\n", 140 | "\n" 141 | ], 142 | "metadata": { 143 | "id": "XlCNzZsau7gg" 144 | } 145 | }, 146 | { 147 | "cell_type": "code", 148 | "execution_count": null, 149 | "metadata": { 150 | "id": "nYdW9o1GhwFA" 151 | }, 152 | "outputs": [], 153 | "source": [] 154 | }, 155 | { 156 | "cell_type": "markdown", 157 | "source": [ 158 | "Plot scatterplots of targets 0 and 1 and check the separability of the classes:" 159 | ], 160 | "metadata": { 161 | "id": "Vx6fPm3KvlyH" 162 | } 163 | }, 164 | { 165 | "cell_type": "code", 166 | "source": [ 167 | "import matplotlib.pyplot as plt \n" 168 | ], 169 | "metadata": { 170 | "id": "flQWBul_ZYjK" 171 | }, 172 | "execution_count": null, 173 | "outputs": [] 174 | }, 175 | { 176 | "cell_type": "markdown", 177 | "source": [ 178 | "Train and test the SVM classifier, play with regularization parameter C (either use the default value or try e.g. 200)" 179 | ], 180 | "metadata": { 181 | "id": "mu3qUUvHv1TP" 182 | } 183 | }, 184 | { 185 | "cell_type": "code", 186 | "execution_count": null, 187 | "metadata": { 188 | "id": "HOo58lvZo_Lf" 189 | }, 190 | "outputs": [], 191 | "source": [] 192 | }, 193 | { 194 | "cell_type": "markdown", 195 | "source": [], 196 | "metadata": { 197 | "id": "vpOHSYlCwdED" 198 | } 199 | }, 200 | { 201 | "cell_type": "markdown", 202 | "source": [ 203 | "Show support vectors in the 2D plot, plot the decision line from equation [w0 w1]*[x0 x1] + b = 0:" 204 | ], 205 | "metadata": { 206 | "id": "MshE_3pPwceK" 207 | } 208 | }, 209 | { 210 | "cell_type": "code", 211 | "execution_count": null, 212 | "metadata": { 213 | "colab": { 214 | "base_uri": "https://localhost:8080/", 215 | "height": 235 216 | }, 217 | "id": "MkZj_qEMvHeY", 218 | "outputId": "8ce5eb94-f2c8-4169-9894-80aac2daf302" 219 | }, 220 | "outputs": [ 221 | { 222 | "output_type": "error", 223 | "ename": "NameError", 224 | "evalue": "ignored", 225 | "traceback": [ 226 | "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", 227 | "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", 228 | "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0msupvectors\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mSVMmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msupport_vectors_\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0;31m# Plot the support vectors here\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;31m#Separating line coefficients:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", 229 | "\u001b[0;31mNameError\u001b[0m: name 'SVMmodel' is not defined" 230 | ] 231 | } 232 | ], 233 | "source": [ 234 | "supvectors=SVMmodel.support_vectors_\n", 235 | "# Plot the support vectors here\n", 236 | "\n", 237 | "\n", 238 | "#Separating line coefficients:\n", 239 | "W=SVMmodel.coef_\n", 240 | "b=SVMmodel.intercept_\n" 241 | ] 242 | }, 243 | { 244 | "cell_type": "markdown", 245 | "metadata": { 246 | "id": "TR9Kkzlrx6Pl" 247 | }, 248 | "source": [ 249 | "# Anomaly detection via SVM" 250 | ] 251 | }, 252 | { 253 | "cell_type": "markdown", 254 | "source": [ 255 | "Import one-class SVM and generate data (Gaussian blobs in 2D-plane):" 256 | ], 257 | "metadata": { 258 | "id": "D6e44AnXmxZi" 259 | } 260 | }, 261 | { 262 | "cell_type": "code", 263 | "source": [ 264 | "from sklearn.svm import OneClassSVM\n", 265 | "from sklearn.datasets import make_blobs\n", 266 | "from numpy import quantile, where, random\n", 267 | "\n", 268 | "random.seed(11)\n", 269 | "x, _ = make_blobs(n_samples=300, centers=1, cluster_std=.3, center_box=(4, 4))\n", 270 | "\n", 271 | "plt.scatter(x[:,0], x[:,1])\n", 272 | "plt.show()\n", 273 | "\n" 274 | ], 275 | "metadata": { 276 | "colab": { 277 | "base_uri": "https://localhost:8080/", 278 | "height": 265 279 | }, 280 | "id": "kA9NeGTXm2Ry", 281 | "outputId": "9a3e0733-183d-4c18-bc7a-a04d40cb919c" 282 | }, 283 | "execution_count": null, 284 | "outputs": [ 285 | { 286 | "output_type": "display_data", 287 | "data": { 288 | "text/plain": [ 289 | "
" 290 | ], 291 | "image/png": "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\n" 292 | }, 293 | "metadata": { 294 | "needs_background": "light" 295 | } 296 | } 297 | ] 298 | }, 299 | { 300 | "cell_type": "markdown", 301 | "source": [ 302 | "Train one-class SVM and plot the outliers (outputs of prediction being equal to -1)" 303 | ], 304 | "metadata": { 305 | "id": "HrWy_Y9Sw41V" 306 | } 307 | }, 308 | { 309 | "cell_type": "code", 310 | "source": [ 311 | "SVMmodelOne = OneClassSVM(kernel='rbf', gamma=0.001, nu=0.03)\n", 312 | "\n", 313 | "\n", 314 | "SVMmodelOne.fit(x)\n", 315 | "pred = SVMmodelOne.predict(x)\n", 316 | "anom_index = where(pred==-1)\n", 317 | "values = x[anom_index]\n", 318 | "\n", 319 | "plt.scatter(x[:,0], x[:,1])\n", 320 | "plt.scatter(values[:,0], values[:,1], color='red')\n", 321 | "plt.axis('equal')\n", 322 | "plt.show()\n", 323 | "\n" 324 | ], 325 | "metadata": { 326 | "id": "esEEn-KqoZic", 327 | "outputId": "2c0020b0-06d9-4a85-9420-26c8ca5c76a8", 328 | "colab": { 329 | "base_uri": "https://localhost:8080/", 330 | "height": 265 331 | } 332 | }, 333 | "execution_count": null, 334 | "outputs": [ 335 | { 336 | "output_type": "display_data", 337 | "data": { 338 | "text/plain": [ 339 | "
" 340 | ], 341 | "image/png": "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\n" 342 | }, 343 | "metadata": { 344 | "needs_background": "light" 345 | } 346 | } 347 | ] 348 | }, 349 | { 350 | "cell_type": "markdown", 351 | "source": [ 352 | "Plot the support vectors:" 353 | ], 354 | "metadata": { 355 | "id": "kIZmSPRGxNRK" 356 | } 357 | }, 358 | { 359 | "cell_type": "code", 360 | "source": [], 361 | "metadata": { 362 | "id": "RJcyvEHKsR8T" 363 | }, 364 | "execution_count": null, 365 | "outputs": [] 366 | }, 367 | { 368 | "cell_type": "markdown", 369 | "source": [ 370 | "What if we want to have a control what is outlier? Use e.g. 5% \"quantile\" to mark the outliers. Every point with lower score than threshold will be an outlier." 371 | ], 372 | "metadata": { 373 | "id": "VbEUVj8RxS1p" 374 | } 375 | }, 376 | { 377 | "cell_type": "code", 378 | "source": [ 379 | "scores = SVMmodelOne.score_samples(x)\n", 380 | "\n", 381 | "thresh = quantile(scores, 0.01)\n", 382 | "print(thresh)\n", 383 | "index = where(scores<=thresh)\n", 384 | "values = x[index]\n", 385 | "\n", 386 | "plt.scatter(x[:,0], x[:,1])\n", 387 | "plt.scatter(values[:,0], values[:,1], color='red')\n", 388 | "plt.axis('equal')\n", 389 | "plt.show()" 390 | ], 391 | "metadata": { 392 | "id": "DQzxxUePs6sN", 393 | "outputId": "4793cfe0-625f-4479-d6ed-a22c3c084b05", 394 | "colab": { 395 | "base_uri": "https://localhost:8080/", 396 | "height": 235 397 | } 398 | }, 399 | "execution_count": null, 400 | "outputs": [ 401 | { 402 | "output_type": "error", 403 | "ename": "NameError", 404 | "evalue": "ignored", 405 | "traceback": [ 406 | "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", 407 | "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", 408 | "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mscores\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mSVMmodelOne\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mscore_samples\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mthresh\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mquantile\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mscores\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0.01\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mthresh\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mindex\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mwhere\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mscores\u001b[0m\u001b[0;34m<=\u001b[0m\u001b[0mthresh\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", 409 | "\u001b[0;31mNameError\u001b[0m: name 'SVMmodelOne' is not defined" 410 | ] 411 | } 412 | ] 413 | } 414 | ], 415 | "metadata": { 416 | "colab": { 417 | "provenance": [], 418 | "toc_visible": true 419 | }, 420 | "kernelspec": { 421 | "display_name": "Python 3", 422 | "name": "python3" 423 | }, 424 | "language_info": { 425 | "name": "python" 426 | } 427 | }, 428 | "nbformat": 4, 429 | "nbformat_minor": 0 430 | } -------------------------------------------------------------------------------- /Lab_03/README.md: -------------------------------------------------------------------------------- 1 | # Support Vector Machine excercise 2 | -------------------------------------------------------------------------------- /Lab_04/MPA_MLF_PCA_2_students.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "id": "3o6JMoeFZDzB" 7 | }, 8 | "source": [ 9 | "# PCA through Singular Value Decomposition" 10 | ] 11 | }, 12 | { 13 | "cell_type": "markdown", 14 | "metadata": { 15 | "id": "qS9otgsuZCYy" 16 | }, 17 | "source": [] 18 | }, 19 | { 20 | "cell_type": "code", 21 | "execution_count": null, 22 | "metadata": { 23 | "colab": { 24 | "base_uri": "https://localhost:8080/" 25 | }, 26 | "id": "qMBJpNsDJMB2", 27 | "outputId": "3155670c-b0fc-4a9f-967e-76f62eff516b" 28 | }, 29 | "outputs": [ 30 | { 31 | "name": "stdout", 32 | "output_type": "stream", 33 | "text": [ 34 | "[[1.80720735 1.27357371 0. ]\n", 35 | " [4.08528566 2.87897923 0. ]]\n" 36 | ] 37 | } 38 | ], 39 | "source": [ 40 | "import numpy as np\n", 41 | "# Defined 3 points in 2D-space:\n", 42 | "X=np.array([[2, 1, 0],[4, 3, 0]])\n", 43 | "# Calculate the covariance matrix:\n", 44 | "\n", 45 | "# Calculate the SVD decomposition and new basis vectors:\n", 46 | "[U,D,V]=np.linalg.svd(R) # call SVD decomposition\n", 47 | "u1=U[:,0] # new basis vectors\n", 48 | "u2=U[:,1]\n", 49 | "\n", 50 | "# Calculate the coordinates in new orthonormal basis:\n", 51 | "\n", 52 | "# Calculate the approximation of the original from new basis\n", 53 | "#print(Xi1[:,None]) # add second dimention to array and test it\n", 54 | "\n", 55 | "\n", 56 | "# Check that you got the original\n" 57 | ] 58 | }, 59 | { 60 | "cell_type": "markdown", 61 | "metadata": { 62 | "id": "192DRCBxZLme" 63 | }, 64 | "source": [ 65 | "# PCA on Iris data" 66 | ] 67 | }, 68 | { 69 | "cell_type": "code", 70 | "execution_count": null, 71 | "metadata": { 72 | "id": "QOx-lPpVfbZ2" 73 | }, 74 | "outputs": [], 75 | "source": [ 76 | "# Load Iris dataset as in the last PC lab:\n", 77 | "from sklearn.datasets import load_iris\n", 78 | "iris=load_iris()\n", 79 | "iris.feature_names\n", 80 | "print(iris.feature_names)\n", 81 | "print(iris.data[0:5,:])\n", 82 | "print(iris.target[:])" 83 | ] 84 | }, 85 | { 86 | "cell_type": "code", 87 | "execution_count": null, 88 | "metadata": { 89 | "id": "8Oz3nlln8fOd" 90 | }, 91 | "outputs": [], 92 | "source": [ 93 | "# We have 4 dimensions of data, plot the first three colums in 3D\n", 94 | "X=iris.data\n", 95 | "y=iris.target\n", 96 | "import matplotlib.pyplot as plt\n", 97 | "axes1=plt.axes(projection='3d')\n", 98 | "axes1.scatter3D(X[y==0,1],X[y==0,1],X[y==0,2],color='green')\n", 99 | "axes1.scatter3D(X[y==1,1],X[y==1,1],X[y==1,2],color='blue')\n", 100 | "axes1.scatter3D(X[y==2,1],X[y==2,1],X[y==2,2],color='magenta')\n", 101 | "plt.show\n" 102 | ] 103 | }, 104 | { 105 | "cell_type": "code", 106 | "execution_count": null, 107 | "metadata": { 108 | "id": "uChB52LcAp5q" 109 | }, 110 | "outputs": [], 111 | "source": [ 112 | "# Pre-processing is an important step, you can try either StandardScaler (zero mean, unit variance of features)\n", 113 | "# or MinMaxScaler (to interval from 0 to 1)\n", 114 | "from sklearn import preprocessing\n", 115 | "from sklearn.preprocessing import StandardScaler\n", 116 | "Xscaler = StandardScaler()\n", 117 | "Xpp=Xscaler.fit_transform(X)\n", 118 | "\n", 119 | "# define PCA object (three components), fit and transform the data\n", 120 | "pca = decomposition.PCA(n_components=3)\n", 121 | "pca.fit(Xpp)\n", 122 | "Xpca = pca.transform(Xpp)\n", 123 | "print(pca.get_covariance())\n", 124 | "# you can plot the transformed feature space in 3D:\n", 125 | "axes2=plt.axes(projection='3d')\n", 126 | "axes2.scatter3D(Xpca[y==0,0],Xpca[y==0,1],Xpca[y==0,2],color='green')\n", 127 | "axes2.scatter3D(Xpca[y==1,0],Xpca[y==1,1],Xpca[y==1,2],color='blue')\n", 128 | "axes2.scatter3D(Xpca[y==2,0],Xpca[y==2,1],Xpca[y==2,2],color='magenta')\n", 129 | "plt.show\n" 130 | ] 131 | }, 132 | { 133 | "cell_type": "code", 134 | "execution_count": null, 135 | "metadata": { 136 | "colab": { 137 | "base_uri": "https://localhost:8080/" 138 | }, 139 | "id": "8ichkTAsH8yg", 140 | "outputId": "14c62de0-6a7b-4bd3-9753-e307d2cbad7c" 141 | }, 142 | "outputs": [ 143 | { 144 | "data": { 145 | "text/plain": [ 146 | "array([2.93808505, 0.9201649 , 0.14774182])" 147 | ] 148 | }, 149 | "execution_count": 336, 150 | "metadata": {}, 151 | "output_type": "execute_result" 152 | } 153 | ], 154 | "source": [ 155 | "# Compute pca.explained_variance_ and pca.explained_cariance_ratio_values\n", 156 | "pca.explained_variance_" 157 | ] 158 | }, 159 | { 160 | "cell_type": "code", 161 | "execution_count": null, 162 | "metadata": { 163 | "colab": { 164 | "base_uri": "https://localhost:8080/" 165 | }, 166 | "id": "GuWfGxtUIOQM", 167 | "outputId": "3d96e9cc-9244-4b61-ab36-afde47b85a5c" 168 | }, 169 | "outputs": [ 170 | { 171 | "data": { 172 | "text/plain": [ 173 | "array([0.72962445, 0.22850762, 0.03668922])" 174 | ] 175 | }, 176 | "execution_count": 337, 177 | "metadata": {}, 178 | "output_type": "execute_result" 179 | } 180 | ], 181 | "source": [ 182 | "pca.explained_variance_ratio_" 183 | ] 184 | }, 185 | { 186 | "cell_type": "code", 187 | "execution_count": null, 188 | "metadata": { 189 | "colab": { 190 | "base_uri": "https://localhost:8080/", 191 | "height": 282 192 | }, 193 | "id": "ThAl0rnHJ-cz", 194 | "outputId": "9254c8aa-98f0-4442-8540-50c857735ea2" 195 | }, 196 | "outputs": [ 197 | { 198 | "data": { 199 | "text/plain": [ 200 | "" 201 | ] 202 | }, 203 | "execution_count": 338, 204 | "metadata": {}, 205 | "output_type": "execute_result" 206 | }, 207 | { 208 | "data": { 209 | "image/png": "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\n", 210 | "text/plain": [ 211 | "
" 212 | ] 213 | }, 214 | "metadata": { 215 | "needs_background": "light" 216 | }, 217 | "output_type": "display_data" 218 | } 219 | ], 220 | "source": [ 221 | "# Plot the principal components in 2D, mark different targets in color\n" 222 | ] 223 | }, 224 | { 225 | "cell_type": "markdown", 226 | "metadata": { 227 | "id": "AwLpxYmgY9xK" 228 | }, 229 | "source": [ 230 | "# KNN classifier" 231 | ] 232 | }, 233 | { 234 | "cell_type": "code", 235 | "execution_count": null, 236 | "metadata": { 237 | "colab": { 238 | "base_uri": "https://localhost:8080/", 239 | "height": 335 240 | }, 241 | "id": "cTfzk7fHNecJ", 242 | "outputId": "2e92e8cc-cf03-41d9-9839-b56f747b933d" 243 | }, 244 | "outputs": [ 245 | { 246 | "name": "stdout", 247 | "output_type": "stream", 248 | "text": [ 249 | "(105, 4)\n", 250 | "(45, 4)\n" 251 | ] 252 | }, 253 | { 254 | "data": { 255 | "text/plain": [ 256 | "" 257 | ] 258 | }, 259 | "execution_count": 358, 260 | "metadata": {}, 261 | "output_type": "execute_result" 262 | }, 263 | { 264 | "data": { 265 | "image/png": "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\n", 266 | "text/plain": [ 267 | "
" 268 | ] 269 | }, 270 | "metadata": { 271 | "needs_background": "light" 272 | }, 273 | "output_type": "display_data" 274 | } 275 | ], 276 | "source": [ 277 | "# Import train_test_split as in last PC lab, split X (original) into train and test, train KNN classifier on full 4-dimensional X\n", 278 | "\n", 279 | "from sklearn.neighbors import KNeighborsClassifier\n", 280 | "knn1=KNeighborsClassifier(n_neighbors = 3)\n", 281 | "knn1.fit(,)\n", 282 | "Ypred=knn1.predict()\n", 283 | "# Import and show confusion matrix\n", 284 | "from sklearn.metrics import confusion_matrix\n", 285 | "from sklearn.metrics import ConfusionMatrixDisplay\n", 286 | "confusion_matrix(,)\n", 287 | "ConfusionMatrixDisplay.from_predictions(,)\n", 288 | "\n" 289 | ] 290 | }, 291 | { 292 | "cell_type": "code", 293 | "execution_count": null, 294 | "metadata": { 295 | "id": "4yDXwutPQjVC" 296 | }, 297 | "outputs": [], 298 | "source": [ 299 | "# Now do the same (data set split, KNN, confusion matrix), but for PCA-transformed data (1st two principal components, i.e., first two columns). \n", 300 | "# Compare the results with full dataset\n" 301 | ] 302 | }, 303 | { 304 | "cell_type": "code", 305 | "execution_count": null, 306 | "metadata": { 307 | "id": "M4xETx1sRbll" 308 | }, 309 | "outputs": [], 310 | "source": [ 311 | "# Now do the same, but use only 2-dimensional data of original X (first two columns)\n" 312 | ] 313 | } 314 | ], 315 | "metadata": { 316 | "colab": { 317 | "provenance": [] 318 | }, 319 | "kernelspec": { 320 | "display_name": "Python 3 (ipykernel)", 321 | "language": "python", 322 | "name": "python3" 323 | }, 324 | "language_info": { 325 | "codemirror_mode": { 326 | "name": "ipython", 327 | "version": 3 328 | }, 329 | "file_extension": ".py", 330 | "mimetype": "text/x-python", 331 | "name": "python", 332 | "nbconvert_exporter": "python", 333 | "pygments_lexer": "ipython3", 334 | "version": "3.10.12" 335 | } 336 | }, 337 | "nbformat": 4, 338 | "nbformat_minor": 4 339 | } 340 | -------------------------------------------------------------------------------- /Lab_04/README.md: -------------------------------------------------------------------------------- 1 | PCA and KNN classifier for students 2 | -------------------------------------------------------------------------------- /Lab_05/README.md: -------------------------------------------------------------------------------- 1 | # LAB 05 2 | 3 | Source of the dataset used in the second example: 4 | https://archive.ics.uci.edu/ml/datasets/congressional+voting+records 5 | -------------------------------------------------------------------------------- /Lab_05/img/Neural_network.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MPA-MLF/Exercises/1c9eafa7e033f2acf9ddb7d055fe59c3e9a0e687/Lab_05/img/Neural_network.png -------------------------------------------------------------------------------- /Lab_05/img/network.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MPA-MLF/Exercises/1c9eafa7e033f2acf9ddb7d055fe59c3e9a0e687/Lab_05/img/network.png -------------------------------------------------------------------------------- /Lab_05/img/neuron.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MPA-MLF/Exercises/1c9eafa7e033f2acf9ddb7d055fe59c3e9a0e687/Lab_05/img/neuron.png -------------------------------------------------------------------------------- /Lab_05/voting_complete.csv: -------------------------------------------------------------------------------- 1 | ,Class Name,handicapped-infants,water-project-cost-sharing,adoption-of-the-budget-resolution,physician-fee-freeze,el-salvador-aid,religious-groups-in-schools,anti-satellite-test-ban,aid-to-nicaraguan-contras,mx-missile,immigration,synfuels-corporation-cutback,education-spending,superfund-right-to-sue,crime,duty-free-exports,export-administration-act-south-africa 2 | 0,republican,n,y,n,y,y,y,n,n,n,y,?,y,y,y,n,y 3 | 1,republican,n,y,n,y,y,y,n,n,n,n,n,y,y,y,n,? 4 | 2,democrat,?,y,y,?,y,y,n,n,n,n,y,n,y,y,n,n 5 | 3,democrat,n,y,y,n,?,y,n,n,n,n,y,n,y,n,n,y 6 | 4,democrat,y,y,y,n,y,y,n,n,n,n,y,?,y,y,y,y 7 | 5,democrat,n,y,y,n,y,y,n,n,n,n,n,n,y,y,y,y 8 | 6,democrat,n,y,n,y,y,y,n,n,n,n,n,n,?,y,y,y 9 | 7,republican,n,y,n,y,y,y,n,n,n,n,n,n,y,y,?,y 10 | 8,republican,n,y,n,y,y,y,n,n,n,n,n,y,y,y,n,y 11 | 9,democrat,y,y,y,n,n,n,y,y,y,n,n,n,n,n,?,? 12 | 10,republican,n,y,n,y,y,n,n,n,n,n,?,?,y,y,n,n 13 | 11,republican,n,y,n,y,y,y,n,n,n,n,y,?,y,y,?,? 14 | 12,democrat,n,y,y,n,n,n,y,y,y,n,n,n,y,n,?,? 15 | 13,democrat,y,y,y,n,n,y,y,y,?,y,y,?,n,n,y,? 16 | 14,republican,n,y,n,y,y,y,n,n,n,n,n,y,?,?,n,? 17 | 15,republican,n,y,n,y,y,y,n,n,n,y,n,y,y,?,n,? 18 | 16,democrat,y,n,y,n,n,y,n,y,?,y,y,y,?,n,n,y 19 | 17,democrat,y,?,y,n,n,n,y,y,y,n,n,n,y,n,y,y 20 | 18,republican,n,y,n,y,y,y,n,n,n,n,n,?,y,y,n,n 21 | 19,democrat,y,y,y,n,n,n,y,y,y,n,y,n,n,n,y,y 22 | 20,democrat,y,y,y,n,n,?,y,y,n,n,y,n,n,n,y,y 23 | 21,democrat,y,y,y,n,n,n,y,y,y,n,n,n,?,?,y,y 24 | 22,democrat,y,?,y,n,n,n,y,y,y,n,n,?,n,n,y,y 25 | 23,democrat,y,y,y,n,n,n,y,y,y,n,n,n,n,n,y,y 26 | 24,democrat,y,n,y,n,n,n,y,y,y,n,n,n,n,n,y,? 27 | 25,democrat,y,n,y,n,n,n,y,y,y,y,n,n,n,n,y,y 28 | 26,democrat,y,n,y,n,n,n,y,y,y,n,y,n,n,n,y,y 29 | 27,democrat,y,y,y,n,n,n,y,y,y,n,y,n,n,n,y,y 30 | 28,republican,y,n,n,y,y,n,y,y,y,n,n,y,y,y,n,y 31 | 29,democrat,y,y,y,n,n,n,y,y,y,n,y,n,n,n,y,y 32 | 30,republican,n,y,n,y,y,y,n,n,n,n,n,y,y,y,n,n 33 | 31,democrat,y,y,y,n,n,n,y,y,y,n,y,n,n,n,y,? 34 | 32,democrat,y,y,y,n,n,n,y,y,y,y,n,n,y,n,y,y 35 | 33,republican,n,y,n,y,y,y,n,n,n,n,n,y,y,y,n,y 36 | 34,democrat,y,y,y,n,n,n,y,y,y,n,n,n,n,n,y,y 37 | 35,republican,n,y,n,y,y,y,n,n,n,n,n,y,y,y,n,n 38 | 36,republican,y,?,n,y,y,y,n,n,n,y,n,y,?,y,n,y 39 | 37,republican,y,y,n,y,y,y,n,n,n,n,n,n,y,y,n,y 40 | 38,republican,n,y,n,y,y,y,n,n,n,y,n,y,y,y,n,n 41 | 39,democrat,y,n,y,n,n,n,y,y,y,y,y,n,y,n,y,y 42 | 40,democrat,y,y,y,n,n,n,y,y,y,n,?,n,n,n,n,? 43 | 41,democrat,y,y,y,n,n,n,y,y,y,n,n,n,n,n,y,? 44 | 42,democrat,y,n,y,n,n,n,y,y,y,n,n,n,n,n,n,y 45 | 43,democrat,y,n,y,n,n,n,y,y,y,n,n,n,n,n,y,y 46 | 44,democrat,y,y,y,n,n,n,y,y,y,n,y,n,n,n,n,? 47 | 45,democrat,y,y,y,n,n,n,y,y,?,n,y,n,n,n,y,? 48 | 46,democrat,y,y,y,n,n,n,y,y,y,n,n,n,n,n,n,y 49 | 47,democrat,y,n,y,n,n,n,y,y,?,n,n,n,n,n,n,? 50 | 48,democrat,y,y,y,n,n,n,y,y,n,n,n,n,n,y,n,y 51 | 49,republican,n,?,n,y,y,y,n,n,n,n,n,y,y,y,n,n 52 | 50,democrat,y,y,y,n,n,n,y,y,y,n,y,n,n,n,y,y 53 | 51,republican,n,y,n,y,y,y,n,?,n,n,n,y,y,y,n,y 54 | 52,democrat,y,y,y,n,n,n,y,y,y,n,n,n,n,n,?,? 55 | 53,republican,y,y,n,y,y,y,n,n,n,y,n,y,y,y,n,n 56 | 54,democrat,y,y,y,n,n,y,?,y,n,n,y,y,n,y,n,? 57 | 55,republican,n,y,n,y,y,y,n,n,n,y,y,y,y,y,n,n 58 | 56,republican,n,y,n,y,y,y,n,n,n,y,y,y,y,y,n,y 59 | 57,republican,n,y,n,y,y,y,n,n,n,y,n,y,y,y,n,y 60 | 58,republican,n,y,n,y,y,y,n,n,n,y,n,y,y,y,n,y 61 | 59,republican,n,y,n,y,y,y,n,n,n,y,n,y,y,y,n,? 62 | 60,democrat,y,y,y,n,n,?,y,y,y,y,n,n,n,n,y,? 63 | 61,republican,n,y,n,y,y,y,n,n,n,n,n,y,y,y,n,n 64 | 62,democrat,y,y,y,n,n,n,y,y,y,n,n,n,n,n,n,? 65 | 63,democrat,y,y,y,n,n,n,y,y,y,n,y,n,n,n,n,y 66 | 64,democrat,y,y,y,n,n,n,y,y,y,n,y,?,n,n,n,y 67 | 65,republican,y,y,n,y,y,y,y,n,n,n,n,y,y,y,n,y 68 | 66,republican,n,y,n,y,y,y,y,n,n,n,y,y,y,y,n,y 69 | 67,republican,n,y,n,y,y,y,n,n,n,y,n,y,y,y,n,n 70 | 68,democrat,y,?,y,n,n,n,y,y,y,n,n,n,y,n,y,y 71 | 69,democrat,y,y,y,n,n,n,y,y,y,n,n,n,n,n,y,y 72 | 70,democrat,y,n,y,n,n,n,y,y,y,n,n,n,y,n,y,? 73 | 71,republican,y,y,y,y,n,n,y,y,y,y,y,n,n,y,n,y 74 | 72,democrat,y,y,y,n,n,n,y,y,y,n,y,n,n,n,y,? 75 | 73,republican,y,n,y,y,y,n,y,n,y,y,n,n,y,y,n,y 76 | 74,democrat,y,n,y,n,n,y,y,y,y,y,y,n,n,y,y,y 77 | 75,democrat,n,y,y,y,y,y,n,n,n,y,y,n,y,y,n,n 78 | 76,democrat,n,y,y,n,y,y,n,n,n,y,y,y,y,y,n,? 79 | 77,democrat,n,y,y,y,y,y,n,y,y,y,y,y,y,y,n,y 80 | 78,democrat,y,y,y,n,y,y,n,n,n,y,y,n,y,y,n,y 81 | 79,republican,n,n,n,y,y,n,n,n,n,y,n,y,y,y,n,n 82 | 80,democrat,y,n,y,n,n,y,y,y,y,y,n,y,n,y,n,? 83 | 81,democrat,y,n,y,n,n,n,y,y,?,y,y,y,n,y,n,y 84 | 82,republican,n,n,n,y,y,y,n,n,n,y,n,y,y,y,n,y 85 | 83,republican,n,n,n,y,y,y,n,n,n,n,n,y,y,y,n,n 86 | 84,republican,n,?,n,y,y,y,n,n,n,y,n,y,y,y,n,n 87 | 85,democrat,n,n,y,n,y,y,n,n,n,y,y,y,y,y,n,y 88 | 86,republican,n,n,n,y,y,y,n,n,n,y,n,y,y,y,n,n 89 | 87,republican,n,n,n,y,y,y,n,n,n,n,n,y,y,y,n,n 90 | 88,democrat,n,y,y,n,y,y,y,n,y,y,y,n,y,y,n,y 91 | 89,republican,n,n,n,y,y,y,n,n,n,y,n,?,y,y,n,? 92 | 90,democrat,y,n,y,n,n,n,y,y,y,y,n,n,n,n,y,y 93 | 91,democrat,y,n,y,n,n,n,y,y,y,y,y,n,n,n,y,y 94 | 92,democrat,y,y,y,n,n,n,y,y,n,y,y,n,n,?,y,y 95 | 93,democrat,y,n,y,n,n,n,y,n,y,y,y,n,n,n,y,y 96 | 94,democrat,y,n,y,n,y,y,n,n,n,n,n,n,n,n,n,y 97 | 95,democrat,y,n,y,n,y,y,n,?,?,n,y,?,?,?,y,y 98 | 96,democrat,n,n,?,n,y,y,n,n,n,n,y,y,y,y,n,y 99 | 97,democrat,y,n,n,n,y,y,y,n,n,y,y,n,n,y,n,y 100 | 98,democrat,y,y,y,n,n,y,y,y,y,y,n,n,n,n,n,y 101 | 99,republican,n,n,n,y,y,y,n,n,n,y,?,y,y,y,n,n 102 | 100,democrat,y,n,n,n,y,y,n,n,n,n,y,y,n,y,n,y 103 | 101,democrat,y,n,y,n,y,y,y,n,n,n,y,n,n,y,n,y 104 | 102,democrat,y,n,y,n,y,y,y,n,?,n,y,n,y,y,y,? 105 | 103,democrat,y,n,n,n,y,y,?,n,?,n,n,n,n,y,?,n 106 | 104,democrat,?,?,?,?,n,y,y,y,y,y,?,n,y,y,n,? 107 | 105,democrat,y,y,y,n,n,n,n,y,y,n,y,n,n,n,y,y 108 | 106,republican,n,y,n,y,y,y,n,n,n,n,n,y,y,y,n,y 109 | 107,republican,n,?,?,?,?,?,?,?,?,?,?,?,?,y,?,? 110 | 108,democrat,y,?,y,n,n,n,y,y,y,n,n,n,n,n,y,? 111 | 109,democrat,y,?,y,n,n,n,y,y,y,n,n,n,n,n,y,? 112 | 110,democrat,n,n,y,n,n,n,y,y,y,y,n,n,n,n,y,y 113 | 111,republican,n,?,n,y,y,y,n,n,n,y,n,y,y,y,n,y 114 | 112,democrat,n,?,y,n,n,y,y,y,n,y,n,n,n,n,y,? 115 | 113,republican,n,?,n,y,y,y,n,n,n,y,n,y,y,y,n,n 116 | 114,democrat,y,?,y,n,n,n,y,y,y,n,n,n,n,n,y,? 117 | 115,democrat,n,?,y,n,?,?,y,y,y,y,?,?,n,n,y,y 118 | 116,democrat,y,n,y,n,n,n,y,y,y,n,y,n,n,n,y,y 119 | 117,republican,y,y,y,y,y,n,y,n,n,n,n,y,y,y,n,y 120 | 118,democrat,n,y,y,n,n,n,n,y,y,y,y,n,n,n,y,y 121 | 119,republican,n,n,n,y,y,y,n,n,n,n,n,y,y,y,n,n 122 | 120,republican,n,?,?,y,y,y,n,n,n,y,n,y,y,y,?,y 123 | 121,republican,n,?,n,y,y,y,n,n,n,y,n,y,y,y,n,y 124 | 122,republican,n,n,n,y,y,y,n,n,n,y,n,y,n,y,n,y 125 | 123,republican,y,?,n,y,y,y,n,y,n,n,n,y,y,y,n,y 126 | 124,democrat,n,?,y,n,n,n,y,y,y,n,n,n,n,n,y,y 127 | 125,republican,n,?,n,y,y,y,n,n,n,y,n,y,y,y,n,y 128 | 126,republican,n,?,n,y,y,y,n,n,n,n,n,y,y,y,n,n 129 | 127,democrat,n,?,y,n,n,n,y,y,y,y,y,n,n,y,y,y 130 | 128,democrat,n,?,y,n,n,y,n,y,n,y,y,n,n,n,y,y 131 | 129,democrat,?,?,y,n,n,n,y,y,?,n,?,?,?,?,?,? 132 | 130,democrat,y,?,y,n,?,?,y,y,y,n,n,n,n,n,y,? 133 | 131,democrat,n,n,y,n,n,y,n,y,y,y,n,n,n,y,n,y 134 | 132,republican,n,n,n,y,y,y,n,n,n,y,n,y,y,y,n,? 135 | 133,republican,n,n,n,y,y,y,n,n,n,y,n,y,y,y,n,y 136 | 134,republican,n,n,n,y,y,y,n,n,n,n,n,y,y,y,n,? 137 | 135,republican,n,n,n,y,y,y,n,n,n,y,n,y,y,y,n,n 138 | 136,republican,n,y,n,y,y,y,n,n,n,y,y,y,y,n,n,y 139 | 137,democrat,n,?,y,n,n,y,y,y,y,y,n,n,n,y,y,y 140 | 138,democrat,n,n,y,n,n,y,y,y,y,y,n,n,n,y,n,y 141 | 139,democrat,y,n,y,n,n,y,y,y,y,n,n,n,n,n,y,y 142 | 140,republican,n,n,n,y,n,n,y,y,y,y,n,n,y,y,n,y 143 | 141,republican,n,n,n,y,y,y,y,y,y,y,n,y,y,y,?,y 144 | 142,republican,n,n,n,y,y,y,y,y,y,y,n,y,y,y,n,y 145 | 143,democrat,?,y,n,n,n,n,y,y,y,y,y,n,n,y,y,y 146 | 144,democrat,n,?,n,n,n,y,y,y,y,y,n,n,n,y,n,? 147 | 145,democrat,n,n,y,n,n,y,y,y,y,y,n,n,n,y,?,y 148 | 146,republican,n,y,n,y,y,y,n,n,n,n,n,y,y,y,n,y 149 | 147,democrat,n,n,n,n,n,n,y,y,y,y,n,y,y,y,y,y 150 | 148,republican,n,y,n,y,y,y,n,n,n,y,y,y,y,y,n,y 151 | 149,democrat,n,n,y,n,n,n,y,y,y,y,n,n,y,n,y,y 152 | 150,republican,y,y,n,y,y,y,n,n,n,y,n,y,y,y,n,y 153 | 151,democrat,y,y,?,y,y,y,n,n,y,n,y,?,y,y,n,n 154 | 152,democrat,n,y,y,n,n,y,n,y,y,y,y,n,y,n,y,y 155 | 153,democrat,n,n,y,n,n,y,y,y,y,y,y,n,y,y,n,y 156 | 154,republican,n,y,n,y,y,y,n,n,n,n,n,y,y,y,n,n 157 | 155,republican,y,y,n,y,y,y,n,?,n,n,y,y,y,y,n,n 158 | 156,republican,y,y,n,y,y,y,y,n,n,n,n,y,y,y,n,n 159 | 157,democrat,n,y,y,n,n,y,n,y,y,n,y,n,?,?,?,? 160 | 158,republican,n,y,n,y,y,y,n,n,n,y,n,y,y,y,n,n 161 | 159,democrat,n,y,y,n,?,y,y,y,y,y,y,n,n,?,n,? 162 | 160,democrat,n,y,n,n,y,y,n,n,n,n,n,y,y,y,y,y 163 | 161,democrat,n,n,n,n,y,y,y,n,n,n,n,y,y,y,n,y 164 | 162,democrat,n,y,y,n,y,y,y,n,n,n,y,y,y,y,n,y 165 | 163,republican,n,y,n,y,y,y,y,n,n,n,n,y,y,y,n,y 166 | 164,democrat,y,y,n,n,y,y,n,n,n,y,y,y,y,y,n,? 167 | 165,democrat,n,y,y,n,n,y,y,y,y,y,y,n,y,n,y,? 168 | 166,republican,y,n,y,y,y,y,y,y,n,y,n,y,n,y,y,y 169 | 167,republican,y,n,y,y,y,y,y,y,n,y,y,y,n,y,y,y 170 | 168,democrat,n,n,y,y,y,y,n,n,y,n,n,n,y,y,y,? 171 | 169,democrat,y,n,y,n,n,n,y,y,y,y,y,n,n,y,n,y 172 | 170,democrat,y,n,y,n,n,n,?,y,y,?,n,n,n,n,y,? 173 | 171,republican,n,?,n,y,y,y,n,n,n,y,n,y,y,y,n,y 174 | 172,democrat,n,y,y,n,n,n,y,y,y,y,n,n,?,n,y,y 175 | 173,democrat,n,n,n,n,y,y,n,n,n,y,y,y,y,y,n,y 176 | 174,democrat,y,?,y,n,n,n,y,y,y,n,n,n,n,n,y,? 177 | 175,democrat,n,y,y,n,n,n,y,y,y,y,n,n,n,n,y,y 178 | 176,republican,n,n,y,y,n,n,y,y,y,y,n,n,n,y,y,y 179 | 177,democrat,n,n,y,n,n,n,y,y,y,y,y,?,n,n,y,y 180 | 178,democrat,?,n,y,n,n,n,y,y,y,y,y,?,n,n,y,? 181 | 179,democrat,y,n,y,n,n,n,y,y,y,y,n,n,n,n,y,y 182 | 180,democrat,?,?,y,n,n,n,y,y,y,?,?,n,n,n,?,? 183 | 181,democrat,n,n,y,n,n,n,y,y,y,y,y,n,n,n,y,y 184 | 182,democrat,y,?,y,n,n,n,y,y,y,n,n,n,n,n,y,y 185 | 183,democrat,?,?,?,?,?,?,?,?,y,?,?,?,?,?,?,? 186 | 184,democrat,n,n,y,n,n,n,y,y,y,y,y,n,n,n,y,y 187 | 185,democrat,y,n,y,n,n,n,y,y,y,y,n,?,n,n,y,y 188 | 186,democrat,n,y,y,n,n,n,y,y,y,y,y,n,n,n,y,y 189 | 187,democrat,y,n,y,n,n,n,y,y,y,n,n,n,n,n,y,? 190 | 188,republican,y,?,n,y,y,y,y,y,n,n,n,y,?,y,?,? 191 | 189,democrat,y,n,y,n,n,n,y,y,y,n,n,n,n,n,y,y 192 | 190,republican,n,?,n,y,y,y,n,n,n,n,n,y,y,y,n,? 193 | 191,republican,n,y,n,y,y,y,n,?,n,y,n,y,y,y,n,? 194 | 192,democrat,n,n,n,n,n,y,y,y,y,n,y,n,n,y,y,y 195 | 193,democrat,n,n,y,n,n,n,y,y,y,n,n,n,n,n,y,y 196 | 194,democrat,n,n,y,n,n,y,y,?,y,y,y,n,n,n,y,y 197 | 195,republican,n,n,n,y,y,y,n,n,n,n,n,y,y,y,n,? 198 | 196,democrat,n,n,y,n,n,y,y,y,y,n,y,y,n,y,y,? 199 | 197,republican,n,?,y,y,y,y,n,n,n,y,n,n,n,y,n,y 200 | 198,democrat,n,n,y,n,n,n,y,y,y,y,y,n,?,n,y,? 201 | 199,democrat,y,y,n,n,n,n,y,y,?,n,y,n,n,n,y,? 202 | 200,democrat,n,n,y,n,n,n,y,y,y,n,n,n,n,y,y,y 203 | 201,democrat,y,y,y,n,n,n,y,y,y,n,n,n,n,n,y,y 204 | 202,democrat,y,n,y,n,n,y,y,y,y,y,y,n,n,n,y,y 205 | 203,democrat,y,n,y,n,n,n,y,y,y,y,n,n,n,n,y,y 206 | 204,republican,n,n,y,y,y,y,y,n,n,n,n,y,y,y,n,y 207 | 205,democrat,n,n,y,n,n,y,y,y,y,y,n,y,n,n,n,y 208 | 206,republican,n,n,n,y,y,y,n,n,n,y,n,y,n,y,n,y 209 | 207,republican,y,?,n,y,y,y,y,n,n,y,n,y,y,y,n,y 210 | 208,democrat,n,n,y,n,n,n,y,y,y,n,n,?,n,n,y,y 211 | 209,democrat,y,y,y,n,n,n,y,y,y,y,y,n,n,n,n,y 212 | 210,democrat,n,n,y,n,n,y,y,y,y,n,n,n,n,n,y,y 213 | 211,republican,n,y,n,y,y,y,n,n,n,y,n,y,y,y,n,y 214 | 212,democrat,n,n,y,n,n,n,y,y,y,n,y,n,n,n,y,y 215 | 213,democrat,n,y,y,n,n,y,n,y,y,n,y,n,y,n,y,y 216 | 214,republican,y,y,n,y,y,y,n,n,n,y,n,y,y,y,n,y 217 | 215,democrat,n,y,y,y,y,y,n,n,n,y,y,y,y,y,y,? 218 | 216,democrat,y,y,y,n,y,y,n,n,?,y,n,n,n,y,y,? 219 | 217,republican,n,y,n,y,y,y,n,n,n,y,n,y,y,y,n,n 220 | 218,democrat,y,?,y,n,n,n,y,y,y,n,?,n,n,n,y,? 221 | 219,democrat,n,y,y,n,n,n,n,y,y,n,y,n,n,y,y,y 222 | 220,democrat,n,n,y,n,n,n,y,y,y,n,n,n,n,n,y,? 223 | 221,democrat,n,y,y,n,y,y,n,n,n,n,y,n,n,n,y,? 224 | 222,democrat,y,n,y,n,n,n,y,y,y,n,y,n,n,n,y,? 225 | 223,republican,n,n,n,y,y,n,n,n,n,n,n,y,y,y,n,y 226 | 224,republican,n,y,n,y,y,y,n,n,n,y,n,?,y,y,n,n 227 | 225,republican,n,?,n,y,y,y,n,n,n,n,n,y,y,y,n,y 228 | 226,democrat,n,n,y,n,n,y,y,y,y,n,y,n,n,y,y,y 229 | 227,democrat,y,n,y,n,n,n,y,y,y,n,n,n,n,n,?,y 230 | 228,republican,n,y,n,y,y,y,n,n,n,n,n,y,y,?,n,y 231 | 229,republican,n,y,y,y,y,y,y,n,y,y,n,y,y,y,n,y 232 | 230,republican,n,y,n,y,y,y,n,n,n,n,n,y,y,y,n,y 233 | 231,republican,n,y,n,y,y,y,n,n,y,y,n,y,y,y,n,y 234 | 232,democrat,n,y,y,n,n,n,y,y,n,n,y,n,n,n,y,? 235 | 233,republican,n,y,n,y,y,y,n,n,n,y,n,y,y,y,n,y 236 | 234,democrat,n,n,y,n,n,y,y,y,y,y,n,y,n,y,y,? 237 | 235,republican,n,n,n,y,y,y,n,n,n,y,n,y,n,y,n,y 238 | 236,democrat,n,n,y,n,n,n,y,y,y,n,n,n,n,n,y,y 239 | 237,democrat,y,n,y,n,n,y,y,y,n,n,n,y,y,n,n,y 240 | 238,democrat,y,y,y,n,n,n,y,y,?,y,n,n,n,n,y,? 241 | 239,republican,n,n,n,y,y,y,y,n,n,y,n,n,n,y,y,y 242 | 240,republican,n,n,n,y,n,y,y,?,y,n,n,y,y,y,n,y 243 | 241,democrat,y,n,y,n,n,n,y,y,y,y,y,n,n,y,y,y 244 | 242,republican,n,n,n,n,y,y,y,n,n,n,n,?,n,y,y,y 245 | 243,democrat,n,y,y,n,n,n,y,y,?,y,n,n,y,n,y,y 246 | 244,democrat,y,n,y,n,n,n,n,y,y,y,n,n,n,n,y,y 247 | 245,democrat,y,n,y,n,n,n,y,y,y,y,y,n,n,n,y,y 248 | 246,democrat,n,n,y,n,y,n,y,y,y,n,n,n,n,y,?,y 249 | 247,republican,n,y,n,y,y,y,?,n,n,n,n,?,y,y,n,n 250 | 248,republican,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? 251 | 249,democrat,y,n,y,n,n,n,y,y,?,n,y,n,n,n,y,y 252 | 250,republican,n,y,n,y,y,y,n,n,n,n,n,y,y,y,n,n 253 | 251,republican,n,y,n,y,y,y,n,n,n,n,n,y,y,y,n,n 254 | 252,democrat,y,y,y,n,n,y,y,y,y,n,n,n,n,n,y,y 255 | 253,republican,n,y,n,y,y,y,n,n,n,n,n,y,y,y,n,y 256 | 254,democrat,y,n,y,n,n,n,y,y,y,y,n,n,n,n,n,y 257 | 255,democrat,y,n,y,n,n,n,y,y,y,y,n,n,n,y,y,y 258 | 256,republican,n,n,n,y,y,n,n,n,n,n,n,y,n,y,n,n 259 | 257,republican,n,n,n,y,y,n,n,n,n,n,n,y,n,y,?,y 260 | 258,democrat,n,n,y,n,n,n,y,y,y,n,y,n,n,n,y,y 261 | 259,democrat,y,n,y,n,n,n,y,y,y,n,n,n,n,n,n,y 262 | 260,democrat,y,n,y,n,n,n,y,y,y,y,n,n,n,n,n,y 263 | 261,democrat,y,n,y,n,n,?,y,y,y,n,?,?,n,?,?,? 264 | 262,democrat,y,n,y,n,n,n,y,y,y,y,n,n,?,n,y,y 265 | 263,democrat,y,n,y,n,n,n,y,y,y,n,n,n,n,n,y,? 266 | 264,democrat,y,n,y,n,n,n,y,y,y,n,n,n,n,n,y,? 267 | 265,democrat,y,n,y,n,n,n,y,y,y,y,n,n,n,n,n,y 268 | 266,republican,n,n,n,y,y,y,n,n,n,y,n,y,n,y,n,y 269 | 267,republican,y,n,n,n,n,n,y,y,y,y,n,n,n,y,n,y 270 | 268,democrat,y,n,y,n,n,n,y,y,y,n,n,n,n,n,y,? 271 | 269,democrat,y,n,y,n,n,n,y,y,y,n,n,n,n,n,n,y 272 | 270,democrat,y,y,y,n,n,n,y,y,y,n,n,n,n,n,y,y 273 | 271,democrat,n,y,y,n,n,y,y,y,y,n,?,n,n,n,n,y 274 | 272,democrat,y,n,y,n,n,n,y,y,y,y,n,n,n,n,y,? 275 | 273,republican,n,n,n,y,y,n,y,y,n,y,n,y,y,y,?,y 276 | 274,republican,y,n,n,y,y,n,y,n,n,y,n,n,n,y,y,y 277 | 275,democrat,n,n,y,n,y,y,n,n,n,n,?,n,y,y,n,n 278 | 276,republican,n,n,n,y,y,y,n,n,n,n,n,y,y,y,y,n 279 | 277,republican,n,n,y,y,y,y,y,y,n,y,n,n,n,y,n,y 280 | 278,republican,n,n,n,y,y,y,n,n,n,n,n,y,y,y,n,y 281 | 279,republican,n,n,n,y,y,y,n,n,n,y,n,y,y,y,n,n 282 | 280,democrat,n,n,y,n,n,n,y,y,y,y,n,n,n,y,n,y 283 | 281,republican,y,n,y,y,y,y,y,y,n,n,n,n,n,y,n,? 284 | 282,republican,y,n,n,y,y,y,n,n,n,y,n,?,y,y,n,n 285 | 283,republican,n,n,n,y,y,y,n,n,n,n,n,y,y,y,n,y 286 | 284,democrat,n,n,y,n,n,y,y,y,y,y,y,n,n,n,?,y 287 | 285,democrat,n,n,y,n,n,y,y,y,y,y,y,n,n,n,y,y 288 | 286,democrat,n,n,y,n,n,y,?,y,?,y,y,y,n,y,y,? 289 | 287,democrat,y,y,y,?,n,y,y,y,y,n,y,n,y,n,?,y 290 | 288,democrat,y,y,y,n,y,y,n,y,n,y,y,n,y,y,y,y 291 | 289,democrat,y,y,y,n,y,y,n,y,n,y,y,n,y,y,n,? 292 | 290,democrat,y,n,y,n,?,y,?,y,y,y,n,n,y,y,n,y 293 | 291,democrat,y,n,y,n,n,y,y,y,y,y,n,?,n,y,n,y 294 | 292,democrat,y,n,y,n,n,y,y,y,n,y,y,n,y,y,y,y 295 | 293,democrat,y,y,y,n,n,y,y,y,y,y,y,n,y,y,y,y 296 | 294,democrat,n,y,y,n,n,y,y,y,n,y,y,n,y,y,n,? 297 | 295,republican,n,y,n,y,y,y,?,?,n,y,n,y,?,?,?,? 298 | 296,republican,n,n,y,y,y,y,n,n,n,y,n,y,y,y,y,y 299 | 297,democrat,y,y,y,n,n,y,y,y,y,y,n,n,?,n,y,? 300 | 298,democrat,n,y,n,n,n,n,y,y,y,y,y,n,n,n,y,y 301 | 299,democrat,n,y,y,n,n,y,y,y,y,y,n,n,y,y,y,y 302 | 300,republican,n,n,n,y,y,n,y,y,y,y,n,y,y,y,n,y 303 | 301,democrat,n,n,?,n,n,y,y,y,y,n,n,n,n,n,y,y 304 | 302,republican,n,n,n,y,y,y,y,n,n,y,n,y,y,y,n,y 305 | 303,republican,n,n,n,y,y,y,n,n,n,n,n,y,y,y,n,n 306 | 304,republican,n,y,n,y,y,y,n,n,n,y,n,y,y,y,n,? 307 | 305,republican,n,n,n,y,y,y,n,n,n,y,n,y,y,y,n,n 308 | 306,republican,n,n,n,y,y,y,n,n,n,n,n,y,y,y,n,n 309 | 307,democrat,y,n,y,n,n,y,y,y,y,n,n,n,n,y,n,? 310 | 308,republican,n,n,n,y,y,y,n,n,n,y,n,y,y,y,n,n 311 | 309,democrat,y,n,n,n,n,y,y,y,y,y,n,n,n,y,y,y 312 | 310,republican,n,n,n,y,y,y,n,n,n,y,n,y,y,y,y,n 313 | 311,democrat,n,n,y,n,n,y,y,y,y,y,n,n,y,n,n,y 314 | 312,democrat,y,y,y,n,n,n,y,y,y,y,n,n,n,n,y,y 315 | 313,republican,n,y,y,y,y,y,n,n,n,y,n,y,y,y,n,y 316 | 314,republican,n,y,n,y,y,y,y,y,n,n,y,y,y,y,y,y 317 | 315,republican,n,y,y,y,y,y,y,?,n,n,n,n,?,?,y,? 318 | 316,democrat,n,n,n,n,n,y,n,y,y,n,y,y,y,y,y,n 319 | 317,democrat,y,n,n,n,n,n,y,y,y,y,n,n,n,n,y,y 320 | 318,democrat,n,n,y,n,n,n,y,y,y,n,n,n,n,n,y,? 321 | 319,democrat,y,n,y,n,n,n,y,y,y,n,n,n,n,n,y,? 322 | 320,democrat,n,y,y,n,n,y,n,y,y,y,n,n,y,y,n,y 323 | 321,democrat,y,y,y,n,n,n,y,y,y,y,n,n,y,n,n,y 324 | 322,democrat,y,y,y,n,?,y,n,?,n,n,y,n,y,y,n,? 325 | 323,democrat,y,y,y,n,y,y,n,y,?,y,n,n,y,y,n,? 326 | 324,republican,n,y,n,y,y,y,n,n,n,n,y,y,y,y,n,n 327 | 325,democrat,n,y,n,n,y,y,n,n,?,n,n,y,y,y,n,y 328 | 326,democrat,y,y,n,y,n,n,y,y,y,n,y,n,n,y,n,y 329 | 327,republican,n,y,n,y,y,y,n,n,n,n,n,y,y,y,n,y 330 | 328,democrat,y,y,y,n,n,n,y,y,y,n,y,n,n,n,n,y 331 | 329,democrat,y,?,y,n,n,y,y,y,y,y,n,n,n,n,y,? 332 | 330,republican,n,y,n,y,y,y,n,n,n,y,n,y,y,y,n,n 333 | 331,democrat,y,?,y,n,n,n,y,y,y,n,n,n,n,n,y,? 334 | 332,democrat,y,n,y,n,n,n,y,y,y,n,y,n,n,n,y,? 335 | 333,democrat,n,n,y,n,n,n,y,y,y,n,n,n,n,n,y,y 336 | 334,democrat,n,y,y,n,n,y,y,y,?,n,y,y,n,n,y,y 337 | 335,republican,n,n,n,y,y,y,n,n,n,y,y,y,y,y,n,? 338 | 336,democrat,n,n,y,n,n,y,y,y,n,n,y,n,n,y,?,y 339 | 337,democrat,y,n,y,n,n,n,y,y,y,n,n,n,n,n,y,y 340 | 338,democrat,y,n,y,n,n,n,y,y,y,y,n,n,n,y,y,y 341 | 339,republican,y,n,n,y,y,y,n,n,n,n,y,y,y,y,n,n 342 | 340,republican,n,n,n,y,y,y,n,n,n,y,y,y,n,y,n,y 343 | 341,democrat,n,?,y,?,n,y,y,y,y,y,y,n,?,?,y,y 344 | 342,democrat,n,y,y,n,y,?,y,n,n,y,y,n,y,n,y,y 345 | 343,republican,n,n,n,y,y,n,y,n,y,y,n,n,n,y,n,y 346 | 344,democrat,n,n,y,n,n,n,y,y,y,y,y,n,n,n,y,y 347 | 345,republican,n,n,n,y,y,y,y,n,n,y,n,y,n,y,y,y 348 | 346,republican,n,n,n,y,y,y,n,n,n,y,n,y,y,y,n,y 349 | 347,republican,y,n,n,y,y,y,n,n,n,y,n,y,y,y,n,n 350 | 348,democrat,y,n,y,n,n,n,y,y,y,y,n,y,n,n,y,? 351 | 349,republican,n,y,y,y,y,y,y,y,y,n,n,y,y,y,n,y 352 | 350,democrat,n,y,n,n,n,y,y,n,y,n,y,n,n,n,y,y 353 | 351,republican,n,n,y,y,y,y,y,y,y,y,n,y,y,y,y,y 354 | 352,democrat,n,y,n,y,n,y,y,y,y,n,y,n,y,n,y,? 355 | 353,republican,n,n,y,y,y,y,y,n,n,y,y,y,y,y,n,y 356 | 354,democrat,n,y,y,n,n,y,y,y,y,y,n,?,n,n,y,y 357 | 355,republican,y,n,y,y,n,n,n,y,y,y,n,n,n,y,y,y 358 | 356,republican,n,n,n,y,y,y,n,n,n,n,n,y,y,y,n,n 359 | 357,republican,n,n,n,y,y,y,n,n,n,n,n,y,y,y,n,n 360 | 358,democrat,y,y,y,n,n,y,y,y,y,y,y,y,y,y,n,? 361 | 359,republican,n,n,n,y,y,y,n,n,n,y,?,y,y,y,n,y 362 | 360,democrat,y,n,y,n,n,y,y,y,y,y,n,n,y,n,n,y 363 | 361,democrat,y,n,y,n,y,y,y,n,y,y,n,n,y,y,n,? 364 | 362,democrat,y,y,y,n,n,y,y,y,y,y,y,y,y,n,n,y 365 | 363,republican,y,y,n,y,y,y,n,n,n,y,y,n,y,n,n,n 366 | 364,republican,y,y,n,y,y,y,n,n,n,n,y,n,y,y,n,y 367 | 365,democrat,n,y,n,n,y,y,n,n,n,y,y,n,y,y,n,n 368 | 366,democrat,y,n,y,n,n,n,y,y,n,y,y,n,n,n,n,? 369 | 367,democrat,y,y,y,n,y,y,y,y,n,y,y,n,n,n,y,? 370 | 368,democrat,n,y,y,n,n,y,y,y,n,y,n,n,n,n,y,y 371 | 369,republican,n,y,n,y,y,y,n,n,n,n,n,n,y,y,n,y 372 | 370,democrat,y,y,y,n,?,y,y,y,n,y,?,?,n,n,y,y 373 | 371,democrat,y,y,y,n,?,n,y,y,y,y,n,n,n,n,y,? 374 | 372,democrat,n,y,y,y,y,y,n,n,n,n,y,y,?,y,n,n 375 | 373,democrat,n,y,y,?,y,y,n,y,n,y,?,n,y,y,?,y 376 | 374,republican,n,y,n,y,y,y,n,n,n,n,n,y,y,y,n,y 377 | 375,democrat,n,y,n,y,y,y,n,n,n,n,y,y,n,y,n,n 378 | 376,democrat,y,?,y,n,n,n,y,y,y,n,y,n,n,n,y,y 379 | 377,republican,n,y,n,y,y,y,?,?,n,n,?,?,y,?,?,? 380 | 378,republican,n,n,n,y,y,y,n,n,n,n,n,y,y,y,n,y 381 | 379,republican,n,n,n,y,y,y,n,n,n,n,n,y,y,y,n,y 382 | 380,democrat,y,y,y,n,n,y,?,y,y,n,y,n,y,n,y,y 383 | 381,democrat,y,y,y,n,y,y,y,y,y,y,y,n,y,y,n,? 384 | 382,democrat,y,y,n,y,y,y,n,n,n,n,y,n,y,y,n,? 385 | 383,democrat,y,y,y,n,y,y,n,y,y,y,y,n,n,n,n,y 386 | 384,democrat,y,y,y,y,y,y,n,n,n,n,y,y,y,y,n,y 387 | 385,democrat,y,y,n,n,y,y,n,n,n,n,y,y,y,y,y,n 388 | 386,democrat,n,?,y,n,y,y,n,y,n,n,y,n,n,n,n,? 389 | 387,democrat,y,y,y,n,y,y,n,y,y,n,y,n,n,y,n,? 390 | 388,democrat,n,y,y,y,y,y,n,n,n,n,n,y,y,y,n,? 391 | 389,democrat,y,n,y,n,n,n,y,y,y,?,y,n,n,n,y,? 392 | 390,democrat,?,?,n,n,?,y,?,n,n,n,y,y,n,y,n,? 393 | 391,democrat,y,y,n,n,n,n,n,y,y,n,y,n,n,n,y,n 394 | 392,republican,y,y,n,y,y,y,n,n,n,n,y,y,y,y,n,y 395 | 393,republican,?,?,?,?,n,y,n,y,y,n,n,y,y,n,n,? 396 | 394,democrat,y,y,?,?,?,y,n,n,n,n,y,n,y,n,n,y 397 | 395,democrat,y,y,y,?,n,n,n,y,n,n,y,?,n,n,y,y 398 | 396,democrat,y,y,y,n,y,y,n,y,n,n,y,n,y,n,y,y 399 | 397,democrat,y,y,n,n,y,?,n,n,n,n,y,n,y,y,n,y 400 | 398,democrat,n,y,y,n,y,y,n,y,n,n,n,n,n,n,n,y 401 | 399,republican,n,y,n,y,?,y,n,n,n,y,n,y,y,y,n,n 402 | 400,republican,n,y,n,y,y,y,n,?,n,n,?,?,?,y,n,? 403 | 401,republican,n,y,n,y,y,y,n,n,n,y,y,y,y,y,n,n 404 | 402,republican,?,n,y,y,n,y,y,y,y,y,n,y,n,y,n,y 405 | 403,republican,n,y,n,y,y,y,n,n,n,y,n,y,?,y,n,n 406 | 404,republican,y,y,n,y,y,y,n,n,n,y,n,y,y,y,n,y 407 | 405,republican,n,n,n,y,y,y,n,n,n,n,n,y,y,y,n,y 408 | 406,democrat,y,n,y,n,y,y,n,n,y,y,n,n,y,y,n,y 409 | 407,democrat,n,n,n,y,y,y,n,n,n,n,y,y,y,y,n,n 410 | 408,democrat,y,n,y,n,n,y,y,y,y,n,n,y,?,y,y,y 411 | 409,republican,n,n,n,y,y,y,n,n,n,n,n,y,y,y,n,n 412 | 410,republican,n,n,n,y,y,y,n,n,n,n,y,y,y,y,n,y 413 | 411,democrat,y,n,y,n,n,y,y,y,y,y,y,n,n,n,n,y 414 | 412,republican,n,n,n,y,y,y,n,n,n,y,n,y,y,y,n,y 415 | 413,republican,y,y,y,y,y,y,y,y,n,y,?,?,?,y,n,y 416 | 414,democrat,y,y,y,n,n,n,y,y,y,n,n,n,n,n,n,y 417 | 415,democrat,n,y,y,n,n,y,y,y,?,y,n,n,n,n,n,y 418 | 416,republican,y,y,n,y,y,y,n,n,n,y,n,n,y,y,n,y 419 | 417,democrat,y,y,y,n,n,n,y,y,y,y,y,n,y,n,n,y 420 | 418,democrat,y,y,y,n,n,n,y,y,n,y,n,n,n,n,n,y 421 | 419,democrat,y,y,y,n,n,n,y,y,y,n,n,n,n,n,n,y 422 | 420,republican,y,y,y,y,y,y,y,y,n,y,n,n,y,y,n,y 423 | 421,democrat,n,y,y,n,y,y,y,y,n,n,y,n,y,n,y,y 424 | 422,democrat,n,n,y,n,n,y,y,y,y,n,y,n,n,n,y,y 425 | 423,democrat,n,y,y,n,n,y,y,y,y,n,y,n,n,y,y,y 426 | 424,democrat,n,y,y,n,n,?,y,y,y,y,y,n,?,y,y,y 427 | 425,democrat,n,n,y,n,n,n,y,y,n,y,y,n,n,n,y,? 428 | 426,democrat,y,n,y,n,n,n,y,y,y,y,n,n,n,n,y,y 429 | 427,republican,n,n,n,y,y,y,y,y,n,y,n,y,y,y,n,y 430 | 428,democrat,?,?,?,n,n,n,y,y,y,y,n,n,y,n,y,y 431 | 429,democrat,y,n,y,n,?,n,y,y,y,y,n,y,n,?,y,y 432 | 430,republican,n,n,y,y,y,y,n,n,y,y,n,y,y,y,n,y 433 | 431,democrat,n,n,y,n,n,n,y,y,y,y,n,n,n,n,n,y 434 | 432,republican,n,?,n,y,y,y,n,n,n,n,y,y,y,y,n,y 435 | 433,republican,n,n,n,y,y,y,?,?,?,?,n,y,y,y,n,y 436 | 434,republican,n,y,n,y,y,y,n,n,n,y,n,y,y,y,?,n 437 | -------------------------------------------------------------------------------- /Lab_07/img/mnist_data_sample.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MPA-MLF/Exercises/1c9eafa7e033f2acf9ddb7d055fe59c3e9a0e687/Lab_07/img/mnist_data_sample.png -------------------------------------------------------------------------------- /Lab_08/README.md: -------------------------------------------------------------------------------- 1 | # Lab_08 2 | 3 | -------------------------------------------------------------------------------- /Lab_K01/README.md: -------------------------------------------------------------------------------- 1 | # Lab_K01 2 | 3 | -------------------------------------------------------------------------------- /Lab_K02/img/mnist_data_sample.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MPA-MLF/Exercises/1c9eafa7e033f2acf9ddb7d055fe59c3e9a0e687/Lab_K02/img/mnist_data_sample.png -------------------------------------------------------------------------------- /Lab_Q1/README.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /Lab_Q2/README.md: -------------------------------------------------------------------------------- 1 | 2nd PC lab on quantum computing 2 | Topic: Quantum teleportation 3 | For introduction see: https://learn.qiskit.org/course/basics/entanglement-in-action 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MPA-MLF 2 | 3 | This repository contains lab tasks for course *Machine learning fundamentals* *MLA-MLF*, taught at Brno University on Technology (BUT), Czech Republic 4 | 5 | **Note: the lab files are continuously updated according to the schedule of MPA-MLF course** 6 | 7 | 8 | 9 | ## Lab list 10 | 11 | 1. Python basics 12 | 1. Kmeans 13 | 1. SVM 14 | 1. PCA 15 | 1. Feedforward Neural Networks 16 | 1. Feedforward Neural Networks with regularization techniques and hyperparameter tunning 17 | 1. Convolutional Neural Networks 18 | 1. Recurent Neural Networks 19 | --------------------------------------------------------------------------------