├── .gitignore ├── LICENSE ├── README.md ├── data ├── 19th_bundestag_example.csv ├── 19th_bundestag_example.ods ├── age_to_getting_pension.csv ├── election_2017_parties.csv ├── election_2017_results.csv ├── msci_world_monthly.csv └── takeover_trajectories.csv.gz ├── slides.pdf └── src ├── example_to_be_imported.py ├── linear_regression_for_nonlinear_problems.py ├── logistic_regression_on_pension_dataset.py ├── matplotlib_in_jupyter.ipynb ├── mnist_keras_simple.py ├── neural_network_learns_the_sin_function.py ├── pandas_in_jupyter.ipynb ├── simple_linear_regression.py └── sklearn_neural_network_learns_the_sin_function.py /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # Spyder project settings 114 | .spyderproject 115 | .spyproject 116 | 117 | # Rope project settings 118 | .ropeproject 119 | 120 | # mkdocs documentation 121 | /site 122 | 123 | # mypy 124 | .mypy_cache/ 125 | .dmypy.json 126 | dmypy.json 127 | 128 | # Pyre type checker 129 | .pyre/ 130 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Felix 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # An Introductory Course to Scientific Computing & Machine Learning in Python 2 | 3 | This repository contains all the files (slides, source code & data) used in the first two days of the [Scientific Python Course at TU Braunschweig](https://musenzentrum.de/workshop2021/). 4 | 5 | Here you can find the material of the [3rd day](https://github.com/musen-rse/examples_python) which is on Research Software Engineering in Python and also covers Object-Oriented Aspects in Python that this course does not contain. 6 | 7 | The target audience is someone with a bit of prior programming knowledge, but in a different language like MATLAB. It is helpful to understand some linear algebra in order to follow the examples in the sections on Machine Learning & Deep Learning. 8 | 9 | The course is supposed to be interactive for people to code along the instructor. 10 | 11 | Do you like this? Then you might also enjoy my [YouTube channel on Machine Learning & Simulation](https://youtube.com/c/machinelearningsimulation) for which all material is also available in the [corresponding GitHub Repo](https://github.com/Ceyron/machine-learning-and-simulation). 12 | 13 | ## Copyrights of the datasets 14 | 15 | * *19th_bundestag_example.csv*, *19th_bundestag_example.ods*, *election_2017_parties.csv*, *election_2017_results.csv* : [Bundeswahlleiter](https://www.bundeswahlleiter.de/info/presse/mitteilungen/bundestagswahl-2017/34_17_endgueltiges_ergebnis.html) 16 | * *age_to_getting_pesion.csv* : Artifical dataset created from sampling a Logistic Regression with added noise 17 | * *msci_world_monthly.csv* : End of Month course value taken from [MCSI Homepage](https://www.msci.com/end-of-day-data-search) 18 | * *takeover_trajectories.csv.gz* : Private 19 | -------------------------------------------------------------------------------- /data/19th_bundestag_example.csv: -------------------------------------------------------------------------------- 1 | party,result,seats,chairman,budget_2020_pro,budget_2020_con,budget_2020_neutral 2 | cdu/csu,33.1,245,Ralph Brinkhaus,236,0,10 3 | spd,20.5,152,Rolf Mützenich,135,0,17 4 | afd,12.6,87,Alexander Gauland,0,83,8 5 | fdp,10.7,80,Christian Lindner,0,69,10 6 | linke,9.2,69,Dietmar Bartsch,0,57,12 7 | gruene,8.9,67,Anton Hofreiter,0,60,7 8 | others,5,9,ohne,0,1,3 9 | -------------------------------------------------------------------------------- /data/19th_bundestag_example.ods: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ceyron/scientific-python-course/a929a424a03c7ef00351b6eb1d6758a64eaa91a5/data/19th_bundestag_example.ods -------------------------------------------------------------------------------- /data/age_to_getting_pension.csv: -------------------------------------------------------------------------------- 1 | age,get_pension 2 | 54,0 3 | 77,1 4 | 34,0 5 | 93,1 6 | 53,0 7 | 62,1 8 | 79,1 9 | 46,0 10 | 74,1 11 | 55,0 12 | 81,1 13 | 79,1 14 | 65,1 15 | 32,0 16 | 80,1 17 | 47,0 18 | 25,0 19 | 88,1 20 | 42,0 21 | 83,1 22 | 93,1 23 | 95,1 24 | 92,1 25 | 76,1 26 | 81,1 27 | 38,0 28 | 96,1 29 | 22,0 30 | 26,0 31 | 50,0 32 | 29,0 33 | 36,0 34 | 53,0 35 | 94,1 36 | 54,0 37 | 50,0 38 | 54,0 39 | 23,0 40 | 25,0 41 | 25,0 42 | 27,0 43 | 92,1 44 | 93,1 45 | 45,0 46 | 80,1 47 | 35,0 48 | 36,0 49 | 46,0 50 | 54,0 51 | 36,0 52 | 94,1 53 | 58,0 54 | 24,0 55 | 79,1 56 | 67,1 57 | 23,0 58 | 66,0 59 | 87,1 60 | 38,0 61 | 55,0 62 | 64,0 63 | 20,0 64 | 50,0 65 | 83,1 66 | 86,1 67 | 60,0 68 | 28,0 69 | 73,1 70 | 61,0 71 | 31,0 72 | 64,1 73 | 50,0 74 | 56,0 75 | 48,0 76 | 75,1 77 | 33,0 78 | 85,1 79 | 58,0 80 | 55,0 81 | 49,0 82 | 50,0 83 | 51,0 84 | 92,1 85 | 67,1 86 | 87,1 87 | 81,1 88 | 78,1 89 | 29,0 90 | 18,0 91 | 44,0 92 | 42,0 93 | 20,0 94 | 50,0 95 | 63,0 96 | 50,0 97 | 49,0 98 | 52,0 99 | 75,1 100 | 52,0 101 | 95,1 102 | 48,0 103 | 30,0 104 | 86,1 105 | 32,0 106 | 67,1 107 | 32,0 108 | 86,1 109 | 42,0 110 | 58,0 111 | 81,1 112 | 71,1 113 | 85,1 114 | 29,0 115 | 30,0 116 | 48,0 117 | 35,0 118 | 76,1 119 | 47,0 120 | 97,1 121 | 98,1 122 | 42,0 123 | 84,1 124 | 54,0 125 | 77,1 126 | 36,0 127 | 98,1 128 | 85,1 129 | 41,0 130 | 65,0 131 | 78,1 132 | 83,1 133 | 39,0 134 | 46,0 135 | 95,1 136 | 68,1 137 | 42,0 138 | 56,0 139 | 73,1 140 | 23,0 141 | 82,1 142 | 89,1 143 | 89,1 144 | 28,0 145 | 94,1 146 | 47,0 147 | 51,0 148 | 25,0 149 | 47,0 150 | 86,1 151 | 62,0 152 | 56,0 153 | 52,0 154 | 47,0 155 | 66,0 156 | 76,1 157 | 49,0 158 | 22,0 159 | 26,0 160 | 42,0 161 | 72,1 162 | 79,1 163 | 26,0 164 | 50,0 165 | 24,0 166 | 32,0 167 | 43,0 168 | 95,1 169 | 41,0 170 | 80,1 171 | 92,1 172 | 55,0 173 | 66,1 174 | 77,1 175 | 71,1 176 | 27,0 177 | 45,0 178 | 97,1 179 | 48,0 180 | 81,1 181 | 24,0 182 | 67,1 183 | 19,0 184 | 93,1 185 | 95,1 186 | 25,0 187 | 30,0 188 | 30,0 189 | 78,1 190 | 64,0 191 | 98,1 192 | 27,0 193 | 50,0 194 | 65,1 195 | 93,1 196 | 67,1 197 | 92,1 198 | 91,1 199 | 92,1 200 | 53,0 201 | 41,0 202 | 74,1 203 | 65,0 204 | 19,0 205 | 19,0 206 | 94,1 207 | 93,1 208 | 20,0 209 | 83,1 210 | 47,0 211 | 78,1 212 | 52,0 213 | 25,0 214 | 76,1 215 | 91,1 216 | 72,1 217 | 40,0 218 | 54,0 219 | 81,1 220 | 88,1 221 | 59,0 222 | 25,0 223 | 19,0 224 | 70,1 225 | 64,1 226 | 36,0 227 | 77,1 228 | 64,0 229 | 54,0 230 | 41,0 231 | 37,0 232 | 43,0 233 | 96,1 234 | 69,0 235 | 86,1 236 | 67,0 237 | 33,0 238 | 56,0 239 | 45,0 240 | 29,0 241 | 19,0 242 | 40,0 243 | 57,0 244 | 38,0 245 | 68,1 246 | 23,0 247 | 96,1 248 | 57,1 249 | 95,1 250 | 63,1 251 | 61,0 252 | 51,0 253 | 64,1 254 | 18,0 255 | 26,0 256 | 44,0 257 | 64,1 258 | 39,0 259 | 64,1 260 | 19,0 261 | 98,1 262 | 73,1 263 | 49,0 264 | 61,0 265 | 71,1 266 | 48,0 267 | 66,1 268 | 51,0 269 | 49,0 270 | 33,0 271 | 56,0 272 | 65,1 273 | 54,0 274 | 59,0 275 | 41,0 276 | 24,0 277 | 48,0 278 | 46,0 279 | 66,1 280 | 21,0 281 | 32,0 282 | 20,0 283 | 79,1 284 | 26,0 285 | 74,1 286 | 37,0 287 | 48,0 288 | 53,0 289 | 98,1 290 | 88,1 291 | 24,0 292 | 58,0 293 | 92,1 294 | 55,0 295 | 85,1 296 | 54,0 297 | 33,0 298 | 81,1 299 | 87,1 300 | 93,1 301 | 93,1 302 | 67,1 303 | 95,1 304 | 42,0 305 | 41,0 306 | 70,1 307 | 68,0 308 | 37,0 309 | 40,0 310 | 24,0 311 | 72,1 312 | 87,1 313 | 51,0 314 | 92,1 315 | 77,1 316 | 48,0 317 | 91,1 318 | 44,0 319 | 78,1 320 | 71,1 321 | 59,0 322 | 88,1 323 | 73,1 324 | 37,0 325 | 48,0 326 | 20,0 327 | 86,1 328 | 38,0 329 | 20,0 330 | 28,0 331 | 86,1 332 | 36,0 333 | 55,0 334 | 84,1 335 | 62,0 336 | 48,0 337 | 90,1 338 | 42,0 339 | 25,0 340 | 65,1 341 | 77,1 342 | 59,0 343 | 23,0 344 | 79,1 345 | 49,0 346 | 71,1 347 | 87,1 348 | 63,0 349 | 71,1 350 | 66,1 351 | 52,0 352 | 31,0 353 | 87,1 354 | 43,0 355 | 81,1 356 | 91,1 357 | 53,0 358 | 79,1 359 | 48,0 360 | 46,0 361 | 80,1 362 | 72,1 363 | 53,0 364 | 37,0 365 | 96,1 366 | 94,1 367 | 18,0 368 | 39,0 369 | 89,1 370 | 80,1 371 | 93,1 372 | 56,0 373 | 26,0 374 | 63,0 375 | 49,0 376 | 19,0 377 | 61,0 378 | 84,1 379 | 19,0 380 | 63,0 381 | 27,0 382 | 36,0 383 | 90,1 384 | 25,0 385 | 87,1 386 | 68,0 387 | 71,1 388 | 34,0 389 | 71,1 390 | 18,0 391 | 73,1 392 | 56,0 393 | 86,1 394 | 45,0 395 | 50,0 396 | 92,1 397 | 57,0 398 | 21,0 399 | 68,1 400 | 31,0 401 | 22,0 402 | 45,0 403 | 22,0 404 | 55,0 405 | 73,1 406 | 56,0 407 | 28,0 408 | 64,1 409 | 71,1 410 | 20,0 411 | 30,0 412 | 84,1 413 | 18,0 414 | 91,1 415 | 76,1 416 | 69,1 417 | 57,0 418 | 48,0 419 | 65,0 420 | 65,0 421 | 18,0 422 | 54,0 423 | 59,0 424 | 96,1 425 | 40,0 426 | 85,1 427 | 50,0 428 | 97,1 429 | 35,0 430 | 52,0 431 | 64,0 432 | 37,0 433 | 92,1 434 | 29,0 435 | 98,1 436 | 60,0 437 | 91,1 438 | 77,1 439 | 65,1 440 | 69,1 441 | 41,0 442 | 92,1 443 | 91,1 444 | 77,1 445 | 82,1 446 | 77,1 447 | 41,0 448 | 38,0 449 | 34,0 450 | 89,1 451 | 58,0 452 | 40,0 453 | 69,1 454 | 30,0 455 | 60,1 456 | 42,0 457 | 92,1 458 | 57,0 459 | 36,0 460 | 76,1 461 | 93,1 462 | 25,0 463 | 40,0 464 | 97,1 465 | 33,0 466 | 39,0 467 | 26,0 468 | 22,0 469 | 70,1 470 | 69,1 471 | 21,0 472 | 80,1 473 | 58,0 474 | 76,1 475 | 37,0 476 | 44,0 477 | 57,0 478 | 76,1 479 | 62,0 480 | 35,0 481 | 47,0 482 | 43,0 483 | 30,0 484 | 55,0 485 | 71,1 486 | 42,0 487 | 38,0 488 | 92,1 489 | 19,0 490 | 34,0 491 | 43,0 492 | 90,1 493 | 70,1 494 | 49,0 495 | 91,1 496 | 54,0 497 | 28,0 498 | 51,0 499 | 70,1 500 | 47,0 501 | 27,0 502 | -------------------------------------------------------------------------------- /data/election_2017_parties.csv: -------------------------------------------------------------------------------- 1 | cdu 2 | spd 3 | afd 4 | fdp 5 | linke 6 | gruene 7 | csu 8 | others -------------------------------------------------------------------------------- /data/election_2017_results.csv: -------------------------------------------------------------------------------- 1 | 26.8 2 | 20.5 3 | 12.6 4 | 10.7 5 | 9.2 6 | 8.9 7 | 6.2 8 | 5.0 -------------------------------------------------------------------------------- /data/msci_world_monthly.csv: -------------------------------------------------------------------------------- 1 | date,value 2 | 1969-12-31,100.0 3 | 1970-01-30,94.249 4 | 1970-02-27,96.979 5 | 1970-03-31,97.075 6 | 1970-04-30,87.8 7 | 1970-05-29,82.06 8 | 1970-06-30,79.837 9 | 1970-07-31,84.585 10 | 1970-08-31,87.175 11 | 1970-09-30,89.788 12 | 1970-10-30,88.264 13 | 1970-11-30,90.035 14 | 1970-12-31,94.292 15 | 1971-01-29,98.42 16 | 1971-02-26,99.255 17 | 1971-03-31,103.407 18 | 1971-04-30,106.587 19 | 1971-05-31,103.859 20 | 1971-06-30,104.711 21 | 1971-07-30,102.836 22 | 1971-08-31,104.877 23 | 1971-09-30,103.676 24 | 1971-10-29,99.54 25 | 1971-11-30,100.176 26 | 1971-12-31,108.993 27 | 1972-01-31,112.774 28 | 1972-02-29,116.888 29 | 1972-03-31,118.297 30 | 1972-04-28,119.654 31 | 1972-05-31,121.882 32 | 1972-06-30,118.841 33 | 1972-07-31,120.466 34 | 1972-08-31,123.678 35 | 1972-09-29,121.59 36 | 1972-10-31,122.381 37 | 1972-11-30,128.591 38 | 1972-12-29,130.737 39 | 1973-01-31,130.825 40 | 1973-02-28,131.515 41 | 1973-03-30,131.476 42 | 1973-04-30,124.631 43 | 1973-05-31,124.046 44 | 1973-06-29,124.611 45 | 1973-07-31,127.351 46 | 1973-08-31,121.822 47 | 1973-09-28,125.11 48 | 1973-10-31,126.136 49 | 1973-11-30,109.548 50 | 1973-12-31,108.41 51 | 1974-01-31,109.006 52 | 1974-02-28,110.459 53 | 1974-03-29,107.416 54 | 1974-04-30,105.382 55 | 1974-05-31,100.892 56 | 1974-06-28,97.476 57 | 1974-07-31,91.462 58 | 1974-08-30,82.39 59 | 1974-09-30,74.454 60 | 1974-10-31,81.329 61 | 1974-11-29,79.808 62 | 1974-12-31,78.237 63 | 1975-01-31,89.398 64 | 1975-02-28,97.047 65 | 1975-03-31,97.51 66 | 1975-04-30,101.3 67 | 1975-05-30,103.447 68 | 1975-06-30,104.505 69 | 1975-07-31,98.483 70 | 1975-08-29,96.723 71 | 1975-09-30,92.428 72 | 1975-10-31,98.555 73 | 1975-11-28,101.013 74 | 1975-12-31,100.863 75 | 1976-01-30,109.636 76 | 1976-02-27,108.582 77 | 1976-03-31,109.621 78 | 1976-04-30,108.579 79 | 1976-05-31,106.525 80 | 1976-06-30,109.559 81 | 1976-07-30,108.288 82 | 1976-08-31,107.791 83 | 1976-09-30,108.443 84 | 1976-10-29,104.395 85 | 1976-11-30,103.725 86 | 1976-12-31,111.262 87 | 1977-01-31,107.261 88 | 1977-02-28,106.52 89 | 1977-03-31,105.581 90 | 1977-04-29,106.46 91 | 1977-05-31,104.734 92 | 1977-06-30,108.395 93 | 1977-07-29,106.659 94 | 1977-08-31,106.77 95 | 1977-09-30,107.812 96 | 1977-10-31,105.68 97 | 1977-11-30,106.709 98 | 1977-12-30,108.521 99 | 1978-01-31,105.02 100 | 1978-02-28,103.901 101 | 1978-03-31,108.282 102 | 1978-04-28,112.831 103 | 1978-05-31,113.929 104 | 1978-06-30,114.736 105 | 1978-07-31,122.678 106 | 1978-08-31,125.16 107 | 1978-09-29,126.266 108 | 1978-10-31,123.462 109 | 1978-11-30,118.757 110 | 1978-12-29,122.28 111 | 1979-01-31,125.06 112 | 1979-02-28,122.353 113 | 1979-03-30,127.068 114 | 1979-04-30,126.522 115 | 1979-05-31,123.964 116 | 1979-06-29,127.17 117 | 1979-07-31,127.746 118 | 1979-08-31,132.489 119 | 1979-09-28,135.076 120 | 1979-10-31,124.639 121 | 1979-11-30,128.077 122 | 1979-12-31,131.101 123 | 1980-01-31,138.591 124 | 1980-02-29,138.248 125 | 1980-03-31,122.959 126 | 1980-04-30,130.581 127 | 1980-05-30,136.573 128 | 1980-06-30,142.683 129 | 1980-07-31,146.628 130 | 1980-08-29,149.054 131 | 1980-09-30,153.086 132 | 1980-10-31,157.102 133 | 1980-11-28,163.233 134 | 1980-12-31,159.228 135 | 1981-01-30,154.155 136 | 1981-02-27,154.165 137 | 1981-03-31,159.204 138 | 1981-04-30,158.838 139 | 1981-05-29,155.298 140 | 1981-06-30,154.584 141 | 1981-07-31,151.506 142 | 1981-08-31,148.096 143 | 1981-09-30,136.528 144 | 1981-10-30,140.274 145 | 1981-11-30,150.253 146 | 1981-12-31,146.62 147 | 1982-01-29,144.023 148 | 1982-02-26,134.865 149 | 1982-03-31,130.746 150 | 1982-04-30,136.721 151 | 1982-05-31,132.831 152 | 1982-06-30,126.395 153 | 1982-07-30,124.336 154 | 1982-08-31,132.927 155 | 1982-09-30,133.113 156 | 1982-10-29,141.829 157 | 1982-11-30,148.919 158 | 1982-12-31,155.156 159 | 1983-01-31,158.034 160 | 1983-02-28,160.914 161 | 1983-03-31,166.139 162 | 1983-04-29,177.561 163 | 1983-05-31,175.383 164 | 1983-06-30,180.452 165 | 1983-07-29,176.796 166 | 1983-08-31,177.312 167 | 1983-09-30,180.467 168 | 1983-10-31,177.908 169 | 1983-11-30,182.061 170 | 1983-12-30,183.952 171 | 1984-01-31,185.039 172 | 1984-02-29,181.537 173 | 1984-03-30,189.609 174 | 1984-04-30,188.45 175 | 1984-05-31,173.852 176 | 1984-06-29,174.884 177 | 1984-07-31,168.266 178 | 1984-08-31,184.682 179 | 1984-09-28,183.518 180 | 1984-10-31,185.009 181 | 1984-11-30,183.845 182 | 1984-12-31,187.205 183 | 1985-01-31,197.057 184 | 1985-02-28,196.964 185 | 1985-03-29,203.303 186 | 1985-04-30,202.242 187 | 1985-05-31,212.126 188 | 1985-06-28,215.397 189 | 1985-07-31,219.314 190 | 1985-08-30,220.587 191 | 1985-09-30,221.702 192 | 1985-10-31,233.095 193 | 1985-11-29,245.573 194 | 1985-12-31,256.514 195 | 1986-01-31,259.748 196 | 1986-02-28,282.575 197 | 1986-03-31,309.601 198 | 1986-04-30,317.502 199 | 1986-05-30,315.983 200 | 1986-06-30,328.041 201 | 1986-07-31,330.052 202 | 1986-08-29,358.26 203 | 1986-09-30,343.351 204 | 1986-10-31,336.821 205 | 1986-11-28,350.458 206 | 1986-12-31,356.825 207 | 1987-01-30,398.106 208 | 1987-02-27,410.589 209 | 1987-03-31,435.354 210 | 1987-04-30,460.209 211 | 1987-05-29,460.177 212 | 1987-06-30,459.236 213 | 1987-07-31,467.738 214 | 1987-08-31,494.701 215 | 1987-09-30,485.4 216 | 1987-10-30,402.279 217 | 1987-11-30,391.765 218 | 1987-12-31,407.994 219 | 1988-01-29,417.213 220 | 1988-02-29,440.683 221 | 1988-03-31,453.227 222 | 1988-04-29,458.164 223 | 1988-05-31,448.228 224 | 1988-06-30,446.842 225 | 1988-07-29,454.478 226 | 1988-08-31,428.746 227 | 1988-09-30,446.168 228 | 1988-10-31,475.074 229 | 1988-11-30,490.802 230 | 1988-12-30,494.428 231 | 1989-01-31,511.511 232 | 1989-02-28,507.484 233 | 1989-03-31,503.406 234 | 1989-04-28,514.189 235 | 1989-05-31,500.763 236 | 1989-06-30,494.288 237 | 1989-07-31,549.295 238 | 1989-08-31,535.165 239 | 1989-09-29,549.417 240 | 1989-10-31,530.233 241 | 1989-11-30,550.528 242 | 1989-12-29,567.338 243 | 1990-01-31,539.944 244 | 1990-02-28,515.886 245 | 1990-03-30,483.818 246 | 1990-04-30,475.922 247 | 1990-05-31,525.101 248 | 1990-06-29,520.408 249 | 1990-07-31,524.178 250 | 1990-08-31,474.129 251 | 1990-09-28,423.145 252 | 1990-10-31,461.64 253 | 1990-11-30,453.05 254 | 1990-12-31,461.527 255 | 1991-01-31,477.387 256 | 1991-02-28,520.574 257 | 1991-03-29,504.264 258 | 1991-04-30,507.243 259 | 1991-05-31,517.764 260 | 1991-06-28,484.846 261 | 1991-07-31,506.778 262 | 1991-08-30,504.198 263 | 1991-09-30,516.432 264 | 1991-10-31,523.818 265 | 1991-11-29,499.994 266 | 1991-12-31,535.364 267 | 1992-01-31,524.448 268 | 1992-02-28,514.402 269 | 1992-03-31,489.176 270 | 1992-04-30,494.993 271 | 1992-05-29,513.665 272 | 1992-06-30,495.424 273 | 1992-07-31,495.645 274 | 1992-08-31,506.637 275 | 1992-09-30,500.953 276 | 1992-10-30,486.384 277 | 1992-11-30,494.113 278 | 1992-12-31,497.132 279 | 1993-01-29,497.833 280 | 1993-02-26,508.673 281 | 1993-03-31,537.2 282 | 1993-04-30,561.116 283 | 1993-05-31,573.068 284 | 1993-06-30,567.291 285 | 1993-07-30,578.019 286 | 1993-08-31,603.556 287 | 1993-09-30,591.436 288 | 1993-10-29,606.772 289 | 1993-11-30,571.488 290 | 1993-12-31,598.496 291 | 1994-01-31,637.008 292 | 1994-02-28,627.79 293 | 1994-03-31,599.737 294 | 1994-04-29,617.299 295 | 1994-05-31,617.906 296 | 1994-06-30,615.194 297 | 1994-07-29,625.894 298 | 1994-08-31,643.738 299 | 1994-09-30,625.806 300 | 1994-10-31,642.57 301 | 1994-11-30,613.676 302 | 1994-12-30,618.59 303 | 1995-01-31,608.263 304 | 1995-02-28,616.074 305 | 1995-03-31,644.674 306 | 1995-04-28,666.043 307 | 1995-05-31,670.635 308 | 1995-06-30,669.317 309 | 1995-07-31,701.687 310 | 1995-08-31,684.957 311 | 1995-09-29,703.797 312 | 1995-10-31,691.604 313 | 1995-11-30,714.509 314 | 1995-12-29,734.28 315 | 1996-01-31,746.451 316 | 1996-02-29,749.857 317 | 1996-03-29,761.184 318 | 1996-04-30,777.929 319 | 1996-05-31,777.437 320 | 1996-06-28,780.202 321 | 1996-07-31,751.451 322 | 1996-08-30,758.902 323 | 1996-09-30,787.436 324 | 1996-10-31,791.751 325 | 1996-11-29,834.929 326 | 1996-12-31,820.362 327 | 1997-01-31,829.082 328 | 1997-02-28,837.44 329 | 1997-03-31,686.467 330 | 1997-04-30,710.307 331 | 1997-05-30,750.988 332 | 1997-06-30,781.59 333 | 1997-07-31,828.325 334 | 1997-08-29,790.038 335 | 1997-09-30,832.006 336 | 1997-10-31,819.865 337 | 1997-11-28,856.958 338 | 1997-12-31,876.672 339 | 1998-01-30,961.488 340 | 1998-02-27,1025.297 341 | 1998-03-31,1067.354 342 | 1998-04-30,1076.53 343 | 1998-05-29,1061.791 344 | 1998-06-30,1085.737 345 | 1998-07-31,1082.741 346 | 1998-08-31,937.092 347 | 1998-09-30,952.393 348 | 1998-10-30,1037.208 349 | 1998-11-30,1097.621 350 | 1998-12-31,1149.952 351 | 1999-01-29,1173.844 352 | 1999-02-26,1141.327 353 | 1999-03-31,1187.545 354 | 1999-04-30,1233.057 355 | 1999-05-31,1186.701 356 | 1999-06-30,1240.75 357 | 1999-07-30,1235.701 358 | 1999-08-31,1232.161 359 | 1999-09-30,1218.897 360 | 1999-10-29,1280.942 361 | 1999-11-30,1315.675 362 | 1999-12-31,1420.885 363 | 2000-01-31,1338.246 364 | 2000-02-29,1340.583 365 | 2000-03-31,1431.938 366 | 2000-04-28,1370.108 367 | 2000-05-31,1334.136 368 | 2000-06-30,1377.722 369 | 2000-07-31,1337.647 370 | 2000-08-31,1379.87 371 | 2000-09-29,1305.245 372 | 2000-10-31,1282.138 373 | 2000-11-30,1203.054 374 | 2000-12-29,1221.253 375 | 2001-01-31,1244.222 376 | 2001-02-28,1137.879 377 | 2001-03-30,1061.262 378 | 2001-04-30,1138.087 379 | 2001-05-31,1121.088 380 | 2001-06-29,1084.788 381 | 2001-07-31,1069.669 382 | 2001-08-31,1016.732 383 | 2001-09-28,926.023 384 | 2001-10-31,943.2 385 | 2001-11-30,997.928 386 | 2001-12-31,1003.516 387 | 2002-01-31,972.418 388 | 2002-02-28,962.732 389 | 2002-03-29,1003.597 390 | 2002-04-30,968.25 391 | 2002-05-31,967.847 392 | 2002-06-28,907.81 393 | 2002-07-31,830.549 394 | 2002-08-30,830.582 395 | 2002-09-30,738.179 396 | 2002-10-31,791.883 397 | 2002-11-29,833.471 398 | 2002-12-31,792.215 399 | 2003-01-31,767.478 400 | 2003-02-28,752.864 401 | 2003-03-31,748.628 402 | 2003-04-30,813.302 403 | 2003-05-30,857.649 404 | 2003-06-30,871.066 405 | 2003-07-31,887.78 406 | 2003-08-29,905.324 407 | 2003-09-30,909.641 408 | 2003-10-31,962.707 409 | 2003-11-28,976.019 410 | 2003-12-31,1036.318 411 | 2004-01-30,1052.289 412 | 2004-02-27,1068.648 413 | 2004-03-31,1059.157 414 | 2004-04-30,1035.657 415 | 2004-05-31,1042.626 416 | 2004-06-30,1062.514 417 | 2004-07-30,1026.991 418 | 2004-08-31,1029.631 419 | 2004-09-30,1047.861 420 | 2004-10-29,1072.698 421 | 2004-11-30,1127.339 422 | 2004-12-31,1169.341 423 | 2005-01-31,1142.35 424 | 2005-02-28,1176.703 425 | 2005-03-31,1151.184 426 | 2005-04-29,1123.642 427 | 2005-05-31,1140.677 428 | 2005-06-30,1148.813 429 | 2005-07-29,1188.165 430 | 2005-08-31,1194.807 431 | 2005-09-30,1224.314 432 | 2005-10-31,1193.88 433 | 2005-11-30,1231.412 434 | 2005-12-30,1257.775 435 | 2006-01-31,1313.214 436 | 2006-02-28,1309.451 437 | 2006-03-31,1335.069 438 | 2006-04-28,1373.384 439 | 2006-05-31,1322.246 440 | 2006-06-30,1319.934 441 | 2006-07-31,1327.233 442 | 2006-08-31,1358.872 443 | 2006-09-29,1373.368 444 | 2006-10-31,1422.926 445 | 2006-11-30,1455.166 446 | 2006-12-29,1483.578 447 | 2007-01-31,1500.232 448 | 2007-02-28,1490.44 449 | 2007-03-30,1514.181 450 | 2007-04-30,1577.86 451 | 2007-05-31,1616.871 452 | 2007-06-29,1602.36 453 | 2007-07-31,1565.811 454 | 2007-08-31,1561.585 455 | 2007-09-28,1633.576 456 | 2007-10-31,1682.351 457 | 2007-11-30,1610.942 458 | 2007-12-31,1588.803 459 | 2008-01-31,1466.346 460 | 2008-02-29,1455.56 461 | 2008-03-31,1437.403 462 | 2008-04-30,1508.988 463 | 2008-05-30,1525.726 464 | 2008-06-30,1402.129 465 | 2008-07-31,1366.699 466 | 2008-08-29,1344.862 467 | 2008-09-30,1182.443 468 | 2008-10-31,957.245 469 | 2008-11-28,892.926 470 | 2008-12-31,920.226 471 | 2009-01-30,838.827 472 | 2009-02-27,750.863 473 | 2009-03-31,805.216 474 | 2009-04-30,893.025 475 | 2009-05-29,970.004 476 | 2009-06-30,964.048 477 | 2009-07-31,1044.753 478 | 2009-08-31,1085.599 479 | 2009-09-30,1126.985 480 | 2009-10-30,1106.17 481 | 2009-11-30,1149.007 482 | 2009-12-31,1168.468 483 | 2010-01-29,1119.537 484 | 2010-02-26,1133.348 485 | 2010-03-31,1200.53 486 | 2010-04-30,1198.564 487 | 2010-05-31,1079.801 488 | 2010-06-30,1041.323 489 | 2010-07-30,1124.826 490 | 2010-08-31,1080.699 491 | 2010-09-30,1179.194 492 | 2010-10-29,1222.226 493 | 2010-11-30,1193.558 494 | 2010-12-31,1280.071 495 | 2011-01-31,1308.083 496 | 2011-02-28,1351.647 497 | 2011-03-31,1334.925 498 | 2011-04-29,1388.62 499 | 2011-05-31,1354.607 500 | 2011-06-30,1331.182 501 | 2011-07-29,1306.054 502 | 2011-08-31,1211.224 503 | 2011-09-30,1104.065 504 | 2011-10-31,1217.296 505 | 2011-11-30,1184.604 506 | 2011-12-30,1182.595 507 | 2012-01-31,1240.894 508 | 2012-02-29,1298.72 509 | 2012-03-30,1312.011 510 | 2012-04-30,1293.991 511 | 2012-05-31,1177.645 512 | 2012-06-29,1235.716 513 | 2012-07-31,1250.569 514 | 2012-08-31,1279.208 515 | 2012-09-28,1311.504 516 | 2012-10-31,1301.522 517 | 2012-11-30,1315.493 518 | 2012-12-31,1338.5 519 | 2013-01-31,1405.466 520 | 2013-02-28,1405.18 521 | 2013-03-29,1434.515 522 | 2013-04-30,1476.139 523 | 2013-05-31,1471.933 524 | 2013-06-28,1433.548 525 | 2013-07-31,1507.913 526 | 2013-08-30,1472.738 527 | 2013-09-30,1543.672 528 | 2013-10-31,1602.86 529 | 2013-11-29,1628.424 530 | 2013-12-31,1661.069 531 | 2014-01-31,1598.456 532 | 2014-02-28,1675.4 533 | 2014-03-31,1673.874 534 | 2014-04-30,1687.742 535 | 2014-05-30,1715.184 536 | 2014-06-30,1743.415 537 | 2014-07-31,1714.353 538 | 2014-08-29,1748.688 539 | 2014-09-30,1698.408 540 | 2014-10-31,1708.092 541 | 2014-11-28,1739.497 542 | 2014-12-31,1709.672 543 | 2015-01-30,1677.537 544 | 2015-02-27,1772.862 545 | 2015-03-31,1740.814 546 | 2015-04-30,1778.4 547 | 2015-05-29,1779.307 548 | 2015-06-30,1735.613 549 | 2015-07-31,1765.604 550 | 2015-08-31,1645.43 551 | 2015-09-30,1581.922 552 | 2015-10-30,1705.803 553 | 2015-11-30,1694.397 554 | 2015-12-31,1662.794 555 | 2016-01-29,1562.178 556 | 2016-02-29,1547.174 557 | 2016-03-31,1648.118 558 | 2016-04-29,1670.796 559 | 2016-05-31,1674.613 560 | 2016-06-30,1653.229 561 | 2016-07-29,1721.788 562 | 2016-08-31,1719.524 563 | 2016-09-30,1725.665 564 | 2016-10-31,1690.922 565 | 2016-11-30,1712.089 566 | 2016-12-30,1751.219 567 | 2017-01-31,1792.403 568 | 2017-02-28,1838.699 569 | 2017-03-31,1853.69 570 | 2017-04-28,1878.276 571 | 2017-05-31,1911.74 572 | 2017-06-30,1916.426 573 | 2017-07-31,1961.1 574 | 2017-08-31,1959.743 575 | 2017-09-29,2000.553 576 | 2017-10-31,2036.804 577 | 2017-11-30,2077.36 578 | 2017-12-29,2103.448 579 | 2018-01-31,2213.238 580 | 2018-02-28,2117.993 581 | 2018-03-30,2066.845 582 | 2018-04-30,2086.514 583 | 2018-05-31,2092.923 584 | 2018-06-29,2089.301 585 | 2018-07-31,2153.096 586 | 2018-08-31,2175.498 587 | 2018-09-28,2184.009 588 | 2018-10-31,2021.982 589 | 2018-11-30,2041.359 590 | 2018-12-31,1883.901 591 | 2019-01-31,2028.492 592 | 2019-02-28,2085.845 593 | 2019-03-29,2107.742 594 | 2019-04-30,2178.674 595 | 2019-05-31,2046.246 596 | 2019-06-28,2178.347 597 | 2019-07-31,2187.564 598 | 2019-08-30,2138.521 599 | 2019-09-30,2180.018 600 | 2019-10-31,2233.526 601 | 2019-11-29,2292.259 602 | 2019-12-31,2358.468 603 | 2020-01-31,2342.414 604 | 2020-02-28,2141.124 605 | 2020-03-31,1852.727 606 | 2020-04-30,2052.845 607 | 2020-05-29,2147.882 608 | 2020-06-30,2201.788 609 | 2020-07-31,2304.982 610 | 2020-08-31,2455.512 611 | 2020-09-30,2367.27 612 | 2020-10-30,2292.925 613 | 2020-11-30,2583.143 614 | 2020-12-31,2690.044 615 | 2021-01-29,2661.691 616 | 2021-02-26,2726.91 617 | 2021-03-31,2811.699 618 | 2021-04-30,2938.764 619 | 2021-05-31,2975.701 620 | 2021-06-30,3017.222 621 | 2021-07-30,3069.249 622 | 2021-08-31,3141.351 623 | -------------------------------------------------------------------------------- /data/takeover_trajectories.csv.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ceyron/scientific-python-course/a929a424a03c7ef00351b6eb1d6758a64eaa91a5/data/takeover_trajectories.csv.gz -------------------------------------------------------------------------------- /slides.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ceyron/scientific-python-course/a929a424a03c7ef00351b6eb1d6758a64eaa91a5/slides.pdf -------------------------------------------------------------------------------- /src/example_to_be_imported.py: -------------------------------------------------------------------------------- 1 | def crazy_function(): 2 | print("Hello World") -------------------------------------------------------------------------------- /src/linear_regression_for_nonlinear_problems.py: -------------------------------------------------------------------------------- 1 | import pandas as pd 2 | import matplotlib.pyplot as plt 3 | import numpy as np 4 | from sklearn import linear_model 5 | from sklearn.linear_model import LinearRegression 6 | 7 | msci_world_monthly = pd.read_csv("https://github.com/Ceyron/machine-learning-and-simulation/files/7250723/msci_world_monthly.csv") 8 | print(msci_world_monthly) 9 | 10 | months_passed = np.array(list(msci_world_monthly.index)).reshape((-1, 1)) 11 | y = msci_world_monthly["value"] 12 | 13 | y_log = np.log(y) 14 | 15 | lin_regr = LinearRegression() 16 | lin_regr.fit(months_passed, y_log) 17 | 18 | # Once fitted, the lin_regr instance contains attributes corresponding to the 19 | # fitted weights and intercept. Only the slope is interest for the exponential 20 | # growth 21 | log_theta = lin_regr.coef_[0] 22 | theta = np.exp(log_theta) 23 | print(f"Theta: {theta:1.4f}") 24 | 25 | # Since we used monthly data, theta is corresponding to the monthly growth, the 26 | # yearly growth is just 12 consecutive applications of theta 27 | theta_yearly = theta**12 28 | print(f"Theta yearly: {theta_yearly:1.4f}") 29 | 30 | # The yearly percentage growth 31 | percentage_growth = (theta_yearly - 1.0) * 100.0 32 | print(f"Yearly growth in percent: {percentage_growth:1.4f} %") 33 | 34 | y_pred_log = lin_regr.predict(months_passed) 35 | y_pred = np.exp(y_pred_log) 36 | 37 | # Add the prediction to the DataFrame as a series to simply use pandas 38 | # integrated plotting routines (this prettily formats the apparent dates) 39 | msci_world_monthly["value_predicted"] = y_pred 40 | msci_world_monthly.plot.line(x="date", y=["value", "value_predicted"]) 41 | 42 | plt.title("End of Month Value for MSCI World, truth and predicted") 43 | plt.grid() 44 | plt.show() 45 | 46 | -------------------------------------------------------------------------------- /src/logistic_regression_on_pension_dataset.py: -------------------------------------------------------------------------------- 1 | import matplotlib.pyplot as plt 2 | import numpy as np 3 | import pandas as pd 4 | from sklearn.linear_model import LogisticRegression 5 | 6 | age_to_getting_pension = pd.read_csv("https://github.com/Ceyron/machine-learning-and-simulation/files/7251110/age_to_getting_pension.csv") 7 | 8 | classifier = LogisticRegression() 9 | classifier.fit(age_to_getting_pension[["age", ]], age_to_getting_pension["get_pension"]) 10 | 11 | age_set = np.linspace(18, 99, 100) 12 | prob = classifier.predict_proba(age_set.reshape((-1, 1)))[:, 1] 13 | 14 | age_to_getting_pension.plot.scatter(x="age", y="get_pension") 15 | plt.plot(age_set, prob, color="orange") 16 | plt.grid() 17 | plt.title("Logistic Regression on whether someone is receiving pension") 18 | plt.show() 19 | -------------------------------------------------------------------------------- /src/matplotlib_in_jupyter.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "import numpy as np\n", 10 | "import matplotlib.pyplot as plt" 11 | ] 12 | }, 13 | { 14 | "cell_type": "code", 15 | "execution_count": 18, 16 | "metadata": {}, 17 | "outputs": [], 18 | "source": [ 19 | "data = np.genfromtxt(\n", 20 | "\t\"https://www.marketwatch.com/investing/stock/aapl\"\n", 21 | "\t\"/downloaddatapartial?startdate=10/15/2020%\"\n", 22 | "\t\"2000:00:00&enddate=09/16/2021%2000:00:00&\"\n", 23 | "\t\"daterange=d30&frequency=p1d&csvdownload=\"\n", 24 | "\t\"true&downloadpartial=false&newdates=false\",\n", 25 | "\tskip_header=1,\n", 26 | "\tdelimiter=\",\",\n", 27 | "\tdtype=str\n", 28 | ")" 29 | ] 30 | }, 31 | { 32 | "cell_type": "code", 33 | "execution_count": 19, 34 | "metadata": {}, 35 | "outputs": [], 36 | "source": [ 37 | "days = data[:, 0]\n", 38 | "opening_price = np.char.replace(data[:, 1], '\"', '').astype(np.float32)\n" 39 | ] 40 | }, 41 | { 42 | "cell_type": "code", 43 | "execution_count": 20, 44 | "metadata": {}, 45 | "outputs": [ 46 | { 47 | "data": { 48 | "text/plain": [ 49 | "[]" 50 | ] 51 | }, 52 | "execution_count": 20, 53 | "metadata": {}, 54 | "output_type": "execute_result" 55 | }, 56 | { 57 | "data": { 58 | "image/png": "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", 59 | "text/plain": [ 60 | "
" 61 | ] 62 | }, 63 | "metadata": { 64 | "needs_background": "light" 65 | }, 66 | "output_type": "display_data" 67 | } 68 | ], 69 | "source": [ 70 | "plt.plot(days, opening_price)" 71 | ] 72 | }, 73 | { 74 | "cell_type": "code", 75 | "execution_count": null, 76 | "metadata": {}, 77 | "outputs": [], 78 | "source": [] 79 | } 80 | ], 81 | "metadata": { 82 | "interpreter": { 83 | "hash": "e67d943fbda5f55a95873df7202f1655ec17576088556fcd4cadffa736ad7751" 84 | }, 85 | "kernelspec": { 86 | "display_name": "Python 3.8.10 64-bit ('pythoncourse': conda)", 87 | "name": "python3" 88 | }, 89 | "language_info": { 90 | "codemirror_mode": { 91 | "name": "ipython", 92 | "version": 3 93 | }, 94 | "file_extension": ".py", 95 | "mimetype": "text/x-python", 96 | "name": "python", 97 | "nbconvert_exporter": "python", 98 | "pygments_lexer": "ipython3", 99 | "version": "3.8.10" 100 | }, 101 | "orig_nbformat": 4 102 | }, 103 | "nbformat": 4, 104 | "nbformat_minor": 2 105 | } -------------------------------------------------------------------------------- /src/mnist_keras_simple.py: -------------------------------------------------------------------------------- 1 | import tensorflow as tf 2 | import matplotlib.pyplot as plt 3 | 4 | (x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data() 5 | x_train = x_train / 255.0 6 | x_test = x_test / 255.0 7 | 8 | # plt.imshow(x_train[0], cmap="gray") 9 | # plt.show() 10 | 11 | model = tf.keras.models.Sequential([ 12 | tf.keras.layers.Flatten(input_shape=(28, 28)), 13 | tf.keras.layers.Dense(128, activation="relu"), 14 | tf.keras.layers.Dense(10), 15 | tf.keras.layers.Softmax() 16 | ]) 17 | 18 | # print(tf.keras.losses.SparseCategoricalCrossentropy()(y_train[:1], model(x_train[:1]))) 19 | 20 | model.compile(optimizer="adam", loss=tf.keras.losses.SparseCategoricalCrossentropy(), metrics=["accuracy"]) 21 | model.fit(x_train, y_train, epochs=5) 22 | 23 | print(model(x_test[:5])) 24 | print(tf.argmax(model(x_test[:5]), axis=1)) 25 | print(y_test[:5]) -------------------------------------------------------------------------------- /src/neural_network_learns_the_sin_function.py: -------------------------------------------------------------------------------- 1 | import tensorflow as tf 2 | import matplotlib.pyplot as plt 3 | 4 | # For reproducibility 5 | tf.random.set_seed(42) 6 | 7 | x = tf.random.uniform((50,), minval=0.0, maxval=2*3.141) 8 | y = tf.sin(x) + 0.2 * tf.random.normal((50, )) 9 | x = tf.reshape(x, (-1, 1)) 10 | y = tf.reshape(y, (-1, 1)) 11 | 12 | plt.scatter(x.numpy(), y.numpy(), color="black") 13 | 14 | model = tf.keras.Sequential([ 15 | # Play around with the model complexity 16 | tf.keras.layers.Dense( 17 | 1000, 18 | activation="relu", 19 | kernel_regularizer="l2" 20 | ), 21 | tf.keras.layers.Dense( 22 | 1000, 23 | activation="relu", 24 | kernel_regularizer="l2" 25 | ), 26 | tf.keras.layers.Dense(1, activation=None) 27 | ]) 28 | 29 | model.compile( 30 | optimizer="adam", 31 | loss=tf.keras.losses.MeanSquaredError(), 32 | ) 33 | 34 | x_set = tf.linspace(0.0, 2.0*3.141, 100) 35 | x_set = tf.reshape(x_set, (-1, 1)) 36 | y_pred = model(x_set) 37 | plt.plot(x_set, y_pred) 38 | 39 | 40 | for i in range(10): 41 | model.fit(x, y, epochs=50, validation_split=0.2) 42 | y_pred = model(x_set) 43 | plt.plot(x_set, y_pred) 44 | 45 | 46 | plt.show() 47 | -------------------------------------------------------------------------------- /src/pandas_in_jupyter.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "import pandas as pd" 10 | ] 11 | }, 12 | { 13 | "cell_type": "code", 14 | "execution_count": 2, 15 | "metadata": {}, 16 | "outputs": [ 17 | { 18 | "data": { 19 | "text/html": [ 20 | "
\n", 21 | "\n", 34 | "\n", 35 | " \n", 36 | " \n", 37 | " \n", 38 | " \n", 39 | " \n", 40 | " \n", 41 | " \n", 42 | " \n", 43 | " \n", 44 | " \n", 45 | " \n", 46 | " \n", 47 | " \n", 48 | " \n", 49 | " \n", 50 | " \n", 51 | " \n", 52 | " \n", 53 | " \n", 54 | " \n", 55 | " \n", 56 | " \n", 57 | " \n", 58 | " \n", 59 | " \n", 60 | " \n", 61 | " \n", 62 | " \n", 63 | " \n", 64 | " \n", 65 | " \n", 66 | " \n", 67 | " \n", 68 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | "
partyresultseatschairmanbudget_2020_probudget_2020_conbudget_2020_neutral
0cdu/csu33.1245Ralph Brinkhaus236010
1spd20.5152Rolf Mützenich135017
2afd12.687Alexander Gauland0838
3fdp10.780Christian Lindner06910
4linke9.269Dietmar Bartsch05712
5gruene8.967Anton Hofreiter0607
6others5.09ohne013
\n", 120 | "
" 121 | ], 122 | "text/plain": [ 123 | " party result seats chairman budget_2020_pro \\\n", 124 | "0 cdu/csu 33.1 245 Ralph Brinkhaus 236 \n", 125 | "1 spd 20.5 152 Rolf Mützenich 135 \n", 126 | "2 afd 12.6 87 Alexander Gauland 0 \n", 127 | "3 fdp 10.7 80 Christian Lindner 0 \n", 128 | "4 linke 9.2 69 Dietmar Bartsch 0 \n", 129 | "5 gruene 8.9 67 Anton Hofreiter 0 \n", 130 | "6 others 5.0 9 ohne 0 \n", 131 | "\n", 132 | " budget_2020_con budget_2020_neutral \n", 133 | "0 0 10 \n", 134 | "1 0 17 \n", 135 | "2 83 8 \n", 136 | "3 69 10 \n", 137 | "4 57 12 \n", 138 | "5 60 7 \n", 139 | "6 1 3 " 140 | ] 141 | }, 142 | "execution_count": 2, 143 | "metadata": {}, 144 | "output_type": "execute_result" 145 | } 146 | ], 147 | "source": [ 148 | "bundestag_19 = pd.read_csv(\"https://github.com/Ceyron/machine-learning-and-simulation/files/7235038/19th_bundestag_example.csv\")\n", 149 | "bundestag_19" 150 | ] 151 | }, 152 | { 153 | "cell_type": "code", 154 | "execution_count": null, 155 | "metadata": {}, 156 | "outputs": [], 157 | "source": [] 158 | } 159 | ], 160 | "metadata": { 161 | "interpreter": { 162 | "hash": "e67d943fbda5f55a95873df7202f1655ec17576088556fcd4cadffa736ad7751" 163 | }, 164 | "kernelspec": { 165 | "display_name": "Python 3.8.10 64-bit ('pythoncourse': conda)", 166 | "name": "python3" 167 | }, 168 | "language_info": { 169 | "codemirror_mode": { 170 | "name": "ipython", 171 | "version": 3 172 | }, 173 | "file_extension": ".py", 174 | "mimetype": "text/x-python", 175 | "name": "python", 176 | "nbconvert_exporter": "python", 177 | "pygments_lexer": "ipython3", 178 | "version": "3.8.10" 179 | }, 180 | "orig_nbformat": 4 181 | }, 182 | "nbformat": 4, 183 | "nbformat_minor": 2 184 | } -------------------------------------------------------------------------------- /src/simple_linear_regression.py: -------------------------------------------------------------------------------- 1 | # Code source: Jaques Grobler 2 | # License: BSD 3 clause 3 | 4 | 5 | import matplotlib.pyplot as plt 6 | import numpy as np 7 | from sklearn import datasets, linear_model 8 | from sklearn.metrics import mean_squared_error, r2_score 9 | 10 | # Load the diabetes dataset 11 | diabetes_X, diabetes_y = datasets.load_diabetes(return_X_y=True) 12 | 13 | # Use only one feature 14 | diabetes_X = diabetes_X[:, np.newaxis, 2] 15 | 16 | # Split the data into training/testing sets 17 | diabetes_X_train = diabetes_X[:-20] 18 | diabetes_X_test = diabetes_X[-20:] 19 | 20 | # Split the targets into training/testing sets 21 | diabetes_y_train = diabetes_y[:-20] 22 | diabetes_y_test = diabetes_y[-20:] 23 | 24 | # Create linear regression object 25 | regr = linear_model.LinearRegression() 26 | 27 | # Train the model using the training sets 28 | regr.fit(diabetes_X_train, diabetes_y_train) 29 | 30 | # Make predictions using the testing set 31 | diabetes_y_pred = regr.predict(diabetes_X_test) 32 | 33 | # The coefficients 34 | print('Coefficients: \n', regr.coef_) 35 | # The mean squared error 36 | print('Mean squared error: %.2f' 37 | % mean_squared_error(diabetes_y_test, diabetes_y_pred)) 38 | # The coefficient of determination: 1 is perfect prediction 39 | print('Coefficient of determination: %.2f' 40 | % r2_score(diabetes_y_test, diabetes_y_pred)) 41 | 42 | # Plot outputs 43 | plt.scatter(diabetes_X_test, diabetes_y_test, color='black') 44 | plt.plot(diabetes_X_test, diabetes_y_pred, color='blue', linewidth=3) 45 | 46 | plt.xticks(()) 47 | plt.yticks(()) 48 | 49 | plt.show() -------------------------------------------------------------------------------- /src/sklearn_neural_network_learns_the_sin_function.py: -------------------------------------------------------------------------------- 1 | from scipy.sparse.construct import rand, random 2 | from sklearn.neural_network import MLPRegressor 3 | import numpy as np 4 | import matplotlib.pyplot as plt 5 | 6 | # For reproducibility 7 | np.random.seed(42) 8 | 9 | x = np.random.uniform(size=(50,), low=0.0, high=2*3.141) 10 | y = np.sin(x) + 0.2 * np.random.normal(size=(50, )) 11 | x = np.reshape(x, (-1, 1)) 12 | # y = np.reshape(y, (-1, 1)) 13 | 14 | plt.scatter(x.flatten(), y, color="black") 15 | 16 | model = MLPRegressor(max_iter=1, random_state=42) 17 | model.fit(x, y) 18 | 19 | x_set = np.linspace(0.0, 2.0*3.141, 100) 20 | x_set = np.reshape(x_set, (-1, 1)) 21 | y_pred = model.predict(x_set) 22 | plt.plot(x_set, y_pred) 23 | 24 | 25 | for i in range(10): 26 | model = MLPRegressor(hidden_layer_sizes=(1000, ), max_iter=100*(i+1), random_state=42) 27 | model.fit(x, y) 28 | y_pred = model.predict(x_set) 29 | plt.plot(x_set, y_pred) 30 | 31 | 32 | plt.show() 33 | --------------------------------------------------------------------------------