├── .gitignore ├── images ├── setup.png ├── grid_shape.png ├── basis_vectors.png ├── tensor_image.png ├── diagonal_matrix.png ├── identity_matrix.png ├── matrix_addition.png ├── output_ch09_41_0.png ├── coordinate_vector.png ├── dot_product_vectors.png ├── scalars_to_tensors.png ├── triangle_inequality.png ├── matrix_transposition.png ├── system_column_picture.png ├── dot_product_vectors_geo.png ├── matrix_matrix_dot_product.png ├── matrix_vector_dot_product.png ├── solutions_systems_equations.png ├── linear_combination_two_vectors.png ├── matrix_matrix_dot_product_shapes.png └── matrix_vector_dot_product_weights.png ├── Pipfile ├── readme.md ├── Pipfile.lock └── ODSC_part1.ipynb /.gitignore: -------------------------------------------------------------------------------- 1 | .ipynb_checkpoints 2 | -------------------------------------------------------------------------------- /images/setup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hadrienj/odsc_training/HEAD/images/setup.png -------------------------------------------------------------------------------- /images/grid_shape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hadrienj/odsc_training/HEAD/images/grid_shape.png -------------------------------------------------------------------------------- /images/basis_vectors.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hadrienj/odsc_training/HEAD/images/basis_vectors.png -------------------------------------------------------------------------------- /images/tensor_image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hadrienj/odsc_training/HEAD/images/tensor_image.png -------------------------------------------------------------------------------- /images/diagonal_matrix.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hadrienj/odsc_training/HEAD/images/diagonal_matrix.png -------------------------------------------------------------------------------- /images/identity_matrix.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hadrienj/odsc_training/HEAD/images/identity_matrix.png -------------------------------------------------------------------------------- /images/matrix_addition.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hadrienj/odsc_training/HEAD/images/matrix_addition.png -------------------------------------------------------------------------------- /images/output_ch09_41_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hadrienj/odsc_training/HEAD/images/output_ch09_41_0.png -------------------------------------------------------------------------------- /images/coordinate_vector.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hadrienj/odsc_training/HEAD/images/coordinate_vector.png -------------------------------------------------------------------------------- /images/dot_product_vectors.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hadrienj/odsc_training/HEAD/images/dot_product_vectors.png -------------------------------------------------------------------------------- /images/scalars_to_tensors.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hadrienj/odsc_training/HEAD/images/scalars_to_tensors.png -------------------------------------------------------------------------------- /images/triangle_inequality.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hadrienj/odsc_training/HEAD/images/triangle_inequality.png -------------------------------------------------------------------------------- /images/matrix_transposition.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hadrienj/odsc_training/HEAD/images/matrix_transposition.png -------------------------------------------------------------------------------- /images/system_column_picture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hadrienj/odsc_training/HEAD/images/system_column_picture.png -------------------------------------------------------------------------------- /images/dot_product_vectors_geo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hadrienj/odsc_training/HEAD/images/dot_product_vectors_geo.png -------------------------------------------------------------------------------- /images/matrix_matrix_dot_product.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hadrienj/odsc_training/HEAD/images/matrix_matrix_dot_product.png -------------------------------------------------------------------------------- /images/matrix_vector_dot_product.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hadrienj/odsc_training/HEAD/images/matrix_vector_dot_product.png -------------------------------------------------------------------------------- /images/solutions_systems_equations.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hadrienj/odsc_training/HEAD/images/solutions_systems_equations.png -------------------------------------------------------------------------------- /images/linear_combination_two_vectors.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hadrienj/odsc_training/HEAD/images/linear_combination_two_vectors.png -------------------------------------------------------------------------------- /images/matrix_matrix_dot_product_shapes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hadrienj/odsc_training/HEAD/images/matrix_matrix_dot_product_shapes.png -------------------------------------------------------------------------------- /images/matrix_vector_dot_product_weights.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hadrienj/odsc_training/HEAD/images/matrix_vector_dot_product_weights.png -------------------------------------------------------------------------------- /Pipfile: -------------------------------------------------------------------------------- 1 | [[source]] 2 | name = "pypi" 3 | url = "https://pypi.org/simple" 4 | verify_ssl = true 5 | 6 | [dev-packages] 7 | 8 | [packages] 9 | jupyter = "*" 10 | notebook = "*" 11 | numpy = "*" 12 | matplotlib = "*" 13 | pandas = "*" 14 | sklearn = "*" 15 | keras = "*" 16 | pypandoc = "*" 17 | jupyter-nbextensions-configurator = "*" 18 | jupyter-contrib-nbextensions = "*" 19 | tensorflow = "*" 20 | 21 | [requires] 22 | python_version = "3.7" 23 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Background 2 | 3 | Here are the companion notebooks of my training session at the [Open Data Science Conference (ODSC)](https://odsc.com/europe/) (14th June 2022). 4 | 5 | Programming is a great way to get practical insights about math theoretical concepts. The goal of this session is to show you that you can start learning the math needed for machine learning and data science using code. You'll learn about scalars, vectors, matrices and tensors, and see how to use linear algebra on your data. 6 | 7 | This content is inspired from my book [Essential Math for Data Science](https://www.essentialmathfordatascience.com/). 8 | 9 | # Setup 10 | 11 | Here are the steps to do to follow the session using the Jupyter notebooks. This will allow you to do the exercises. 12 | 13 | ## Python 14 | 15 | First, check that you have Python installed on your computer. Open a terminal and run: 16 | 17 | ``` 18 | python --version 19 | ``` 20 | 21 | If Python 3 is installed, it should return, for instance, `python 3.7.6`. If not, here are the steps to install it: 22 | 23 | - Install Brew: 24 | 25 | ``` 26 | /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 27 | ``` 28 | 29 | - Install Python 30 | 31 | ``` 32 | brew install python 33 | ``` 34 | 35 | You can check that Python 3 is now installed: 36 | 37 | ``` 38 | python --version 39 | ``` 40 | 41 | ## Virtual environment 42 | 43 | Next, you'll install virtual environments. Virtual environments are used to install specific Python libraries (and specific versions) for a project. This avoids conflict if you need different versions of Python or of libraries in two projects. 44 | 45 | - Install pipenv: 46 | 47 | ``` 48 | brew install pipenv 49 | ``` 50 | 51 | Check that it worked: 52 | 53 | ``` 54 | pipenv --version 55 | ``` 56 | 57 | ## Get the Notebooks 58 | 59 | Download the Github repository that contains the notebooks at this address: https://github.com/hadrienj/odsc_training. 60 | 61 | 62 | Click the 'clone' button and then download the `.zip`. 63 | 64 | 65 | Unzip the file, open a terminal and go to that folder (replace with the correct path): 66 | 67 | ``` 68 | cd path/to/your/repo 69 | ``` 70 | 71 | Now, you can create a virtual environment with Python 3.7 for the project: 72 | 73 | ``` 74 | pipenv --python 3.7 75 | ``` 76 | 77 | Then, install the required libraries: 78 | 79 | ``` 80 | pipenv install 81 | ``` 82 | 83 | This line will install all the libraries listed in the file `Pipfile.lock`. 84 | 85 | Finally, you can start the notebook server (from the virtual environment `pipenv`) as following: 86 | 87 | ``` 88 | pipenv run jupyter notebook 89 | ``` 90 | 91 | It should start a web page listing the files in the repository. You can then open the notebook you want (the `.ipynb` files). 92 | -------------------------------------------------------------------------------- /Pipfile.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_meta": { 3 | "hash": { 4 | "sha256": "4e359fd999756b04c0efd0cf4bb515b0b3aff4966b25dc383e6adb538852a29a" 5 | }, 6 | "pipfile-spec": 6, 7 | "requires": { 8 | "python_version": "3.7" 9 | }, 10 | "sources": [ 11 | { 12 | "name": "pypi", 13 | "url": "https://pypi.org/simple", 14 | "verify_ssl": true 15 | } 16 | ] 17 | }, 18 | "default": { 19 | "absl-py": { 20 | "hashes": [ 21 | "sha256:b20f504a7871a580be5268a18fbad48af4203df5d33dbc9272426cb806245a45", 22 | "sha256:ea07d7d437798bffc14f39fccec3909d251a1e76e233205ded72b71c267e0178" 23 | ], 24 | "version": "==0.10.0" 25 | }, 26 | "appnope": { 27 | "hashes": [ 28 | "sha256:5b26757dc6f79a3b7dc9fab95359328d5747fcb2409d331ea66d0272b90ab2a0", 29 | "sha256:8b995ffe925347a2138d7ac0fe77155e4311a0ea6d6da4f5128fe4b3cbe5ed71" 30 | ], 31 | "markers": "sys_platform == 'darwin' and platform_system == 'Darwin'", 32 | "version": "==0.1.0" 33 | }, 34 | "argon2-cffi": { 35 | "hashes": [ 36 | "sha256:05a8ac07c7026542377e38389638a8a1e9b78f1cd8439cd7493b39f08dd75fbf", 37 | "sha256:0bf066bc049332489bb2d75f69216416329d9dc65deee127152caeb16e5ce7d5", 38 | "sha256:18dee20e25e4be86680b178b35ccfc5d495ebd5792cd00781548d50880fee5c5", 39 | "sha256:392c3c2ef91d12da510cfb6f9bae52512a4552573a9e27600bdb800e05905d2b", 40 | "sha256:57358570592c46c420300ec94f2ff3b32cbccd10d38bdc12dc6979c4a8484fbc", 41 | "sha256:6678bb047373f52bcff02db8afab0d2a77d83bde61cfecea7c5c62e2335cb203", 42 | "sha256:6ea92c980586931a816d61e4faf6c192b4abce89aa767ff6581e6ddc985ed003", 43 | "sha256:77e909cc756ef81d6abb60524d259d959bab384832f0c651ed7dcb6e5ccdbb78", 44 | "sha256:7d455c802727710e9dfa69b74ccaab04568386ca17b0ad36350b622cd34606fe", 45 | "sha256:9bee3212ba4f560af397b6d7146848c32a800652301843df06b9e8f68f0f7361", 46 | "sha256:9dfd5197852530294ecb5795c97a823839258dfd5eb9420233c7cfedec2058f2", 47 | "sha256:b160416adc0f012fb1f12588a5e6954889510f82f698e23ed4f4fa57f12a0647", 48 | "sha256:ba7209b608945b889457f949cc04c8e762bed4fe3fec88ae9a6b7765ae82e496", 49 | "sha256:cc0e028b209a5483b6846053d5fd7165f460a1f14774d79e632e75e7ae64b82b", 50 | "sha256:d8029b2d3e4b4cea770e9e5a0104dd8fa185c1724a0f01528ae4826a6d25f97d", 51 | "sha256:da7f0445b71db6d3a72462e04f36544b0de871289b0bc8a7cc87c0f5ec7079fa" 52 | ], 53 | "version": "==20.1.0" 54 | }, 55 | "astunparse": { 56 | "hashes": [ 57 | "sha256:5ad93a8456f0d084c3456d059fd9a92cce667963232cbf763eac3bc5b7940872", 58 | "sha256:c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8" 59 | ], 60 | "version": "==1.6.3" 61 | }, 62 | "attrs": { 63 | "hashes": [ 64 | "sha256:26b54ddbbb9ee1d34d5d3668dd37d6cf74990ab23c828c2888dccdceee395594", 65 | "sha256:fce7fc47dfc976152e82d53ff92fa0407700c21acd20886a13777a0d20e655dc" 66 | ], 67 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", 68 | "version": "==20.2.0" 69 | }, 70 | "backcall": { 71 | "hashes": [ 72 | "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e", 73 | "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255" 74 | ], 75 | "version": "==0.2.0" 76 | }, 77 | "bleach": { 78 | "hashes": [ 79 | "sha256:2bce3d8fab545a6528c8fa5d9f9ae8ebc85a56da365c7f85180bfe96a35ef22f", 80 | "sha256:3c4c520fdb9db59ef139915a5db79f8b51bc2a7257ea0389f30c846883430a4b" 81 | ], 82 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", 83 | "version": "==3.1.5" 84 | }, 85 | "cachetools": { 86 | "hashes": [ 87 | "sha256:513d4ff98dd27f85743a8dc0e92f55ddb1b49e060c2d5961512855cda2c01a98", 88 | "sha256:bbaa39c3dede00175df2dc2b03d0cf18dd2d32a7de7beb68072d13043c9edb20" 89 | ], 90 | "markers": "python_version ~= '3.5'", 91 | "version": "==4.1.1" 92 | }, 93 | "certifi": { 94 | "hashes": [ 95 | "sha256:5930595817496dd21bb8dc35dad090f1c2cd0adfaf21204bf6732ca5d8ee34d3", 96 | "sha256:8fc0819f1f30ba15bdb34cceffb9ef04d99f420f68eb75d901e9560b8749fc41" 97 | ], 98 | "version": "==2020.6.20" 99 | }, 100 | "cffi": { 101 | "hashes": [ 102 | "sha256:0da50dcbccd7cb7e6c741ab7912b2eff48e85af217d72b57f80ebc616257125e", 103 | "sha256:12a453e03124069b6896107ee133ae3ab04c624bb10683e1ed1c1663df17c13c", 104 | "sha256:15419020b0e812b40d96ec9d369b2bc8109cc3295eac6e013d3261343580cc7e", 105 | "sha256:15a5f59a4808f82d8ec7364cbace851df591c2d43bc76bcbe5c4543a7ddd1bf1", 106 | "sha256:23e44937d7695c27c66a54d793dd4b45889a81b35c0751ba91040fe825ec59c4", 107 | "sha256:29c4688ace466a365b85a51dcc5e3c853c1d283f293dfcc12f7a77e498f160d2", 108 | "sha256:57214fa5430399dffd54f4be37b56fe22cedb2b98862550d43cc085fb698dc2c", 109 | "sha256:577791f948d34d569acb2d1add5831731c59d5a0c50a6d9f629ae1cefd9ca4a0", 110 | "sha256:6539314d84c4d36f28d73adc1b45e9f4ee2a89cdc7e5d2b0a6dbacba31906798", 111 | "sha256:65867d63f0fd1b500fa343d7798fa64e9e681b594e0a07dc934c13e76ee28fb1", 112 | "sha256:672b539db20fef6b03d6f7a14b5825d57c98e4026401fce838849f8de73fe4d4", 113 | "sha256:6843db0343e12e3f52cc58430ad559d850a53684f5b352540ca3f1bc56df0731", 114 | "sha256:7057613efefd36cacabbdbcef010e0a9c20a88fc07eb3e616019ea1692fa5df4", 115 | "sha256:76ada88d62eb24de7051c5157a1a78fd853cca9b91c0713c2e973e4196271d0c", 116 | "sha256:837398c2ec00228679513802e3744d1e8e3cb1204aa6ad408b6aff081e99a487", 117 | "sha256:8662aabfeab00cea149a3d1c2999b0731e70c6b5bac596d95d13f643e76d3d4e", 118 | "sha256:95e9094162fa712f18b4f60896e34b621df99147c2cee216cfa8f022294e8e9f", 119 | "sha256:99cc66b33c418cd579c0f03b77b94263c305c389cb0c6972dac420f24b3bf123", 120 | "sha256:9b219511d8b64d3fa14261963933be34028ea0e57455baf6781fe399c2c3206c", 121 | "sha256:ae8f34d50af2c2154035984b8b5fc5d9ed63f32fe615646ab435b05b132ca91b", 122 | "sha256:b9aa9d8818c2e917fa2c105ad538e222a5bce59777133840b93134022a7ce650", 123 | "sha256:bf44a9a0141a082e89c90e8d785b212a872db793a0080c20f6ae6e2a0ebf82ad", 124 | "sha256:c0b48b98d79cf795b0916c57bebbc6d16bb43b9fc9b8c9f57f4cf05881904c75", 125 | "sha256:da9d3c506f43e220336433dffe643fbfa40096d408cb9b7f2477892f369d5f82", 126 | "sha256:e4082d832e36e7f9b2278bc774886ca8207346b99f278e54c9de4834f17232f7", 127 | "sha256:e4b9b7af398c32e408c00eb4e0d33ced2f9121fd9fb978e6c1b57edd014a7d15", 128 | "sha256:e613514a82539fc48291d01933951a13ae93b6b444a88782480be32245ed4afa", 129 | "sha256:f5033952def24172e60493b68717792e3aebb387a8d186c43c020d9363ee7281" 130 | ], 131 | "version": "==1.14.2" 132 | }, 133 | "chardet": { 134 | "hashes": [ 135 | "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", 136 | "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" 137 | ], 138 | "version": "==3.0.4" 139 | }, 140 | "cycler": { 141 | "hashes": [ 142 | "sha256:1d8a5ae1ff6c5cf9b93e8811e581232ad8920aeec647c37316ceac982b08cb2d", 143 | "sha256:cd7b2d1018258d7247a71425e9f26463dfb444d411c39569972f4ce586b0c9d8" 144 | ], 145 | "version": "==0.10.0" 146 | }, 147 | "decorator": { 148 | "hashes": [ 149 | "sha256:41fa54c2a0cc4ba648be4fd43cff00aedf5b9465c9bf18d64325bc225f08f760", 150 | "sha256:e3a62f0520172440ca0dcc823749319382e377f37f140a0b99ef45fecb84bfe7" 151 | ], 152 | "version": "==4.4.2" 153 | }, 154 | "defusedxml": { 155 | "hashes": [ 156 | "sha256:6687150770438374ab581bb7a1b327a847dd9c5749e396102de3fad4e8a3ef93", 157 | "sha256:f684034d135af4c6cbb949b8a4d2ed61634515257a67299e5f940fbaa34377f5" 158 | ], 159 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", 160 | "version": "==0.6.0" 161 | }, 162 | "entrypoints": { 163 | "hashes": [ 164 | "sha256:589f874b313739ad35be6e0cd7efde2a4e9b6fea91edcc34e58ecbb8dbe56d19", 165 | "sha256:c70dd71abe5a8c85e55e12c19bd91ccfeec11a6e99044204511f9ed547d48451" 166 | ], 167 | "markers": "python_version >= '2.7'", 168 | "version": "==0.3" 169 | }, 170 | "gast": { 171 | "hashes": [ 172 | "sha256:8f46f5be57ae6889a4e16e2ca113b1703ef17f2b0abceb83793eaba9e1351a45", 173 | "sha256:b881ef288a49aa81440d2c5eb8aeefd4c2bb8993d5f50edae7413a85bfdb3b57" 174 | ], 175 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", 176 | "version": "==0.3.3" 177 | }, 178 | "google-auth": { 179 | "hashes": [ 180 | "sha256:bcbd9f970e7144fe933908aa286d7a12c44b7deb6d78a76871f0377a29d09789", 181 | "sha256:f4d5093f13b1b1c0a434ab1dc851cd26a983f86a4d75c95239974e33ed406a87" 182 | ], 183 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", 184 | "version": "==1.21.1" 185 | }, 186 | "google-auth-oauthlib": { 187 | "hashes": [ 188 | "sha256:88d2cd115e3391eb85e1243ac6902e76e77c5fe438b7276b297fbe68015458dd", 189 | "sha256:a92a0f6f41a0fb6138454fbc02674e64f89d82a244ea32f98471733c8ef0e0e1" 190 | ], 191 | "version": "==0.4.1" 192 | }, 193 | "google-pasta": { 194 | "hashes": [ 195 | "sha256:4612951da876b1a10fe3960d7226f0c7682cf901e16ac06e473b267a5afa8954", 196 | "sha256:b32482794a366b5366a32c92a9a9201b107821889935a02b3e51f6b432ea84ed", 197 | "sha256:c9f2c8dfc8f96d0d5808299920721be30c9eec37f2389f28904f454565c8a16e" 198 | ], 199 | "version": "==0.2.0" 200 | }, 201 | "grpcio": { 202 | "hashes": [ 203 | "sha256:013287f99c99b201aa8a5f6bc7918f616739b9be031db132d9e3b8453e95e151", 204 | "sha256:0397616355760cd8282ed5ea34d51830ae4cb6613b7e5f66bed3be5d041b8b9a", 205 | "sha256:074871a184483d5cd0746fd01e7d214d3ee9d36e67e32a5786b0a21f29fb8304", 206 | "sha256:08a9b648dbe8852ff94b73a1c96da126834c3057ba2301d13e8c4adff334c482", 207 | "sha256:0fa86ac4452602c79774783aa68979a1a7625ebb7eaabee2b6550b975b9d61e6", 208 | "sha256:220c46b1fc9c9a6fcca4caac398f08f0ed43cdd63c45b7458983c4a1575ef6df", 209 | "sha256:259240aab2603891553e17ad5b2655693df79e02a9b887ff605bdeb2fcd3dcc9", 210 | "sha256:292635f05b6ce33f87116951d0b3d8d330bdfc5cac74f739370d60981e8c256c", 211 | "sha256:344b50865914cc8e6d023457bffee9a640abb18f75d0f2bb519041961c748da9", 212 | "sha256:3c2aa6d7a5e5bf73fdb1715eee777efe06dd39df03383f1cc095b2fdb34883e6", 213 | "sha256:43d44548ad6ee738b941abd9f09e3b83a5c13f3e1410321023c3c148ba50e796", 214 | "sha256:5043440c45c0a031f387e7f48527541c65d672005fb24cf18ef6857483557d39", 215 | "sha256:58d7121f48cb94535a4cedcce32921d0d0a78563c7372a143dedeec196d1c637", 216 | "sha256:5d7faa89992e015d245750ca9ac916c161bbf72777b2c60abc61da3fae41339e", 217 | "sha256:5fb0923b16590bac338e92d98c7d8effb3cfad1d2e18c71bf86bde32c49cd6dd", 218 | "sha256:63ee8e02d04272c3d103f44b4bce5d43ea757dd288673cea212d2f7da27967d2", 219 | "sha256:64077e3a9a7cf2f59e6c76d503c8de1f18a76428f41a5b000dc53c48a0b772ff", 220 | "sha256:739a72abffbd36083ff7adbb862cf1afc1e311c35834bed9c0361d8e68b063e1", 221 | "sha256:75e383053dccb610590aa53eed5278db5c09bf498d3b5105ce6c776478f59352", 222 | "sha256:7a11b1ebb3210f34913b8be6995936bf9ebc541a65ab69e75db5ce1fe5047e8f", 223 | "sha256:8002a89ea91c0078c15d3c0daf423fd4968946be78f08545e807ea9a5ff8054a", 224 | "sha256:8b42f0ac76be07a5fa31117a3388d754ad35ef05e2e34be185ca9ccbcfac2069", 225 | "sha256:8ca26b489b5dc1e3d31807d329c23d6cb06fe40fbae25b0649b718947936e26a", 226 | "sha256:92e54ab65e782f227e751c7555918afaba8d1229601687e89b80c2b65d2f6642", 227 | "sha256:a9a7ae74cb3108e6457cf15532d4c300324b48fbcf3ef290bcd2835745f20510", 228 | "sha256:ba3e43cb984399064ffaa3c0997576e46a1e268f9da05f97cd9b272f0b59ee71", 229 | "sha256:baaa036540d7ace433bdf38a3fe5e41cf9f84cdf10a88bac805f678a7ca8ddcc", 230 | "sha256:bf00ab06ea4f89976288f4d6224d4aa120780e30c955d4f85c3214ada29b3ddf", 231 | "sha256:bf39977282a79dc1b2765cc3402c0ada571c29a491caec6ed12c0993c1ec115e", 232 | "sha256:c22b19abba63562a5a200e586b5bde39d26c8ec30c92e26d209d81182371693b", 233 | "sha256:c9016ab1eaf4e054099303287195f3746bd4e69f2631d040f9dca43e910a5408", 234 | "sha256:d2c5e05c257859febd03f5d81b5015e1946d6bcf475c7bf63ee99cea8ab0d590", 235 | "sha256:e64bddd09842ef508d72ca354319b0eb126205d951e8ac3128fe9869bd563552", 236 | "sha256:e8c3264b0fd728aadf3f0324471843f65bd3b38872bdab2a477e31ffb685dd5b", 237 | "sha256:ea849210e7362559f326cbe603d5b8d8bb1e556e86a7393b5a8847057de5b084", 238 | "sha256:ebb2ca09fa17537e35508a29dcb05575d4d9401138a68e83d1c605d65e8a1770", 239 | "sha256:ef9fce98b6fe03874c2a6576b02aec1a0df25742cd67d1d7b75a49e30aa74225", 240 | "sha256:f04c59d186af3157dc8811114130aaeae92e90a65283733f41de94eed484e1f7", 241 | "sha256:f5b0870b733bcb7b6bf05a02035e7aaf20f599d3802b390282d4c2309f825f1d" 242 | ], 243 | "version": "==1.31.0" 244 | }, 245 | "h5py": { 246 | "hashes": [ 247 | "sha256:063947eaed5f271679ed4ffa36bb96f57bc14f44dd4336a827d9a02702e6ce6b", 248 | "sha256:13c87efa24768a5e24e360a40e0bc4c49bcb7ce1bb13a3a7f9902cec302ccd36", 249 | "sha256:16ead3c57141101e3296ebeed79c9c143c32bdd0e82a61a2fc67e8e6d493e9d1", 250 | "sha256:3dad1730b6470fad853ef56d755d06bb916ee68a3d8272b3bab0c1ddf83bb99e", 251 | "sha256:51ae56894c6c93159086ffa2c94b5b3388c0400548ab26555c143e7cfa05b8e5", 252 | "sha256:54817b696e87eb9e403e42643305f142cd8b940fe9b3b490bbf98c3b8a894cf4", 253 | "sha256:549ad124df27c056b2e255ea1c44d30fb7a17d17676d03096ad5cd85edb32dc1", 254 | "sha256:64f74da4a1dd0d2042e7d04cf8294e04ddad686f8eba9bb79e517ae582f6668d", 255 | "sha256:6998be619c695910cb0effe5eb15d3a511d3d1a5d217d4bd0bebad1151ec2262", 256 | "sha256:6ef7ab1089e3ef53ca099038f3c0a94d03e3560e6aff0e9d6c64c55fb13fc681", 257 | "sha256:769e141512b54dee14ec76ed354fcacfc7d97fea5a7646b709f7400cf1838630", 258 | "sha256:79b23f47c6524d61f899254f5cd5e486e19868f1823298bc0c29d345c2447172", 259 | "sha256:7be5754a159236e95bd196419485343e2b5875e806fe68919e087b6351f40a70", 260 | "sha256:84412798925dc870ffd7107f045d7659e60f5d46d1c70c700375248bf6bf512d", 261 | "sha256:86868dc07b9cc8cb7627372a2e6636cdc7a53b7e2854ad020c9e9d8a4d3fd0f5", 262 | "sha256:8bb1d2de101f39743f91512a9750fb6c351c032e5cd3204b4487383e34da7f75", 263 | "sha256:a5f82cd4938ff8761d9760af3274acf55afc3c91c649c50ab18fcff5510a14a5", 264 | "sha256:aac4b57097ac29089f179bbc2a6e14102dd210618e94d77ee4831c65f82f17c0", 265 | "sha256:bffbc48331b4a801d2f4b7dac8a72609f0b10e6e516e5c480a3e3241e091c878", 266 | "sha256:c0d4b04bbf96c47b6d360cd06939e72def512b20a18a8547fa4af810258355d5", 267 | "sha256:c54a2c0dd4957776ace7f95879d81582298c5daf89e77fb8bee7378f132951de", 268 | "sha256:cbf28ae4b5af0f05aa6e7551cee304f1d317dbed1eb7ac1d827cee2f1ef97a99", 269 | "sha256:d35f7a3a6cefec82bfdad2785e78359a0e6a5fbb3f605dd5623ce88082ccd681", 270 | "sha256:d3c59549f90a891691991c17f8e58c8544060fdf3ccdea267100fa5f561ff62f", 271 | "sha256:d7ae7a0576b06cb8e8a1c265a8bc4b73d05fdee6429bffc9a26a6eb531e79d72", 272 | "sha256:ecf4d0b56ee394a0984de15bceeb97cbe1fe485f1ac205121293fc44dcf3f31f", 273 | "sha256:f0e25bb91e7a02efccb50aba6591d3fe2c725479e34769802fcdd4076abfa917", 274 | "sha256:f23951a53d18398ef1344c186fb04b26163ca6ce449ebd23404b153fd111ded9", 275 | "sha256:ff7d241f866b718e4584fa95f520cb19405220c501bd3a53ee11871ba5166ea2" 276 | ], 277 | "version": "==2.10.0" 278 | }, 279 | "idna": { 280 | "hashes": [ 281 | "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6", 282 | "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0" 283 | ], 284 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", 285 | "version": "==2.10" 286 | }, 287 | "importlib-metadata": { 288 | "hashes": [ 289 | "sha256:90bb658cdbbf6d1735b6341ce708fc7024a3e14e99ffdc5783edea9f9b077f83", 290 | "sha256:dc15b2969b4ce36305c51eebe62d418ac7791e9a157911d58bfb1f9ccd8e2070" 291 | ], 292 | "markers": "python_version < '3.8'", 293 | "version": "==1.7.0" 294 | }, 295 | "ipykernel": { 296 | "hashes": [ 297 | "sha256:9b2652af1607986a1b231c62302d070bc0534f564c393a5d9d130db9abbbe89d", 298 | "sha256:d6fbba26dba3cebd411382bc484f7bc2caa98427ae0ddb4ab37fe8bfeb5c7dd3" 299 | ], 300 | "markers": "python_version >= '3.5'", 301 | "version": "==5.3.4" 302 | }, 303 | "ipython": { 304 | "hashes": [ 305 | "sha256:2e22c1f74477b5106a6fb301c342ab8c64bb75d702e350f05a649e8cb40a0fb8", 306 | "sha256:a331e78086001931de9424940699691ad49dfb457cea31f5471eae7b78222d5e" 307 | ], 308 | "markers": "python_version >= '3.3'", 309 | "version": "==7.18.1" 310 | }, 311 | "ipython-genutils": { 312 | "hashes": [ 313 | "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8", 314 | "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8" 315 | ], 316 | "version": "==0.2.0" 317 | }, 318 | "ipywidgets": { 319 | "hashes": [ 320 | "sha256:13ffeca438e0c0f91ae583dc22f50379b9d6b28390ac7be8b757140e9a771516", 321 | "sha256:e945f6e02854a74994c596d9db83444a1850c01648f1574adf144fbbabe05c97" 322 | ], 323 | "version": "==7.5.1" 324 | }, 325 | "jedi": { 326 | "hashes": [ 327 | "sha256:86ed7d9b750603e4ba582ea8edc678657fb4007894a12bcf6f4bb97892f31d20", 328 | "sha256:98cc583fa0f2f8304968199b01b6b4b94f469a1f4a74c1560506ca2a211378b5" 329 | ], 330 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", 331 | "version": "==0.17.2" 332 | }, 333 | "jinja2": { 334 | "hashes": [ 335 | "sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0", 336 | "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035" 337 | ], 338 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", 339 | "version": "==2.11.2" 340 | }, 341 | "joblib": { 342 | "hashes": [ 343 | "sha256:8f52bf24c64b608bf0b2563e0e47d6fcf516abc8cfafe10cfd98ad66d94f92d6", 344 | "sha256:d348c5d4ae31496b2aa060d6d9b787864dd204f9480baaa52d18850cb43e9f49" 345 | ], 346 | "markers": "python_version >= '3.6'", 347 | "version": "==0.16.0" 348 | }, 349 | "jsonschema": { 350 | "hashes": [ 351 | "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163", 352 | "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a" 353 | ], 354 | "version": "==3.2.0" 355 | }, 356 | "jupyter": { 357 | "hashes": [ 358 | "sha256:3e1f86076bbb7c8c207829390305a2b1fe836d471ed54be66a3b8c41e7f46cc7", 359 | "sha256:5b290f93b98ffbc21c0c7e749f054b3267782166d72fa5e3ed1ed4eaf34a2b78", 360 | "sha256:d9dc4b3318f310e34c82951ea5d6683f67bed7def4b259fafbfe4f1beb1d8e5f" 361 | ], 362 | "index": "pypi", 363 | "version": "==1.0.0" 364 | }, 365 | "jupyter-client": { 366 | "hashes": [ 367 | "sha256:49e390b36fe4b4226724704ea28d9fb903f1a3601b6882ce3105221cd09377a1", 368 | "sha256:c958d24d6eacb975c1acebb68ac9077da61b5f5c040f22f6849928ad7393b950" 369 | ], 370 | "markers": "python_version >= '3.5'", 371 | "version": "==6.1.7" 372 | }, 373 | "jupyter-console": { 374 | "hashes": [ 375 | "sha256:1d80c06b2d85bfb10bd5cc731b3db18e9023bc81ab00491d3ac31f206490aee3", 376 | "sha256:7f6194f4f4692d292da3f501c7f343ccd5e36c6a1becf7b7515e23e66d6bf1e9" 377 | ], 378 | "markers": "python_version >= '3.6'", 379 | "version": "==6.2.0" 380 | }, 381 | "jupyter-contrib-core": { 382 | "hashes": [ 383 | "sha256:1ec81e275a8f5858d56b0c4c6cd85335aa8e915001b8657fe51c620c3cdde50f", 384 | "sha256:e65bc0e932ff31801003cef160a4665f2812efe26a53801925a634735e9a5794" 385 | ], 386 | "version": "==0.3.3" 387 | }, 388 | "jupyter-contrib-nbextensions": { 389 | "hashes": [ 390 | "sha256:2c071f0aa208c569666f656bdc0f66906ca493cf9f06f46db6350db11030ff40", 391 | "sha256:eecd28ecc2fc410226c0a3d4932ed2fac4860ccf8d9e9b1b29548835a35b22ab" 392 | ], 393 | "index": "pypi", 394 | "version": "==0.5.1" 395 | }, 396 | "jupyter-core": { 397 | "hashes": [ 398 | "sha256:394fd5dd787e7c8861741880bdf8a00ce39f95de5d18e579c74b882522219e7e", 399 | "sha256:a4ee613c060fe5697d913416fc9d553599c05e4492d58fac1192c9a6844abb21" 400 | ], 401 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", 402 | "version": "==4.6.3" 403 | }, 404 | "jupyter-highlight-selected-word": { 405 | "hashes": [ 406 | "sha256:9545dfa9cb057eebe3a5795604dcd3a5294ea18637e553f61a0b67c1b5903c58", 407 | "sha256:9fa740424859a807950ca08d2bfd28a35154cd32dd6d50ac4e0950022adc0e7b" 408 | ], 409 | "version": "==0.2.0" 410 | }, 411 | "jupyter-latex-envs": { 412 | "hashes": [ 413 | "sha256:070a31eb2dc488bba983915879a7c2939247bf5c3b669b398bdb36a9b5343872" 414 | ], 415 | "version": "==1.4.6" 416 | }, 417 | "jupyter-nbextensions-configurator": { 418 | "hashes": [ 419 | "sha256:e5e86b5d9d898e1ffb30ebb08e4ad8696999f798fef3ff3262d7b999076e4e83" 420 | ], 421 | "index": "pypi", 422 | "version": "==0.4.1" 423 | }, 424 | "keras": { 425 | "hashes": [ 426 | "sha256:05e2faf6885f7899482a7d18fc00ba9655fe2c9296a35ad96949a07a9c27d1bb", 427 | "sha256:fedd729b52572fb108a98e3d97e1bac10a81d3917d2103cc20ab2a5f03beb973" 428 | ], 429 | "index": "pypi", 430 | "version": "==2.4.3" 431 | }, 432 | "keras-preprocessing": { 433 | "hashes": [ 434 | "sha256:7b82029b130ff61cc99b55f3bd27427df4838576838c5b2f65940e4fcec99a7b", 435 | "sha256:add82567c50c8bc648c14195bf544a5ce7c1f76761536956c3d2978970179ef3" 436 | ], 437 | "version": "==1.1.2" 438 | }, 439 | "kiwisolver": { 440 | "hashes": [ 441 | "sha256:03662cbd3e6729f341a97dd2690b271e51a67a68322affab12a5b011344b973c", 442 | "sha256:18d749f3e56c0480dccd1714230da0f328e6e4accf188dd4e6884bdd06bf02dd", 443 | "sha256:247800260cd38160c362d211dcaf4ed0f7816afb5efe56544748b21d6ad6d17f", 444 | "sha256:38d05c9ecb24eee1246391820ed7137ac42a50209c203c908154782fced90e44", 445 | "sha256:443c2320520eda0a5b930b2725b26f6175ca4453c61f739fef7a5847bd262f74", 446 | "sha256:4eadb361baf3069f278b055e3bb53fa189cea2fd02cb2c353b7a99ebb4477ef1", 447 | "sha256:556da0a5f60f6486ec4969abbc1dd83cf9b5c2deadc8288508e55c0f5f87d29c", 448 | "sha256:603162139684ee56bcd57acc74035fceed7dd8d732f38c0959c8bd157f913fec", 449 | "sha256:60a78858580761fe611d22127868f3dc9f98871e6fdf0a15cc4203ed9ba6179b", 450 | "sha256:63f55f490b958b6299e4e5bdac66ac988c3d11b7fafa522800359075d4fa56d1", 451 | "sha256:7cc095a4661bdd8a5742aaf7c10ea9fac142d76ff1770a0f84394038126d8fc7", 452 | "sha256:be046da49fbc3aa9491cc7296db7e8d27bcf0c3d5d1a40259c10471b014e4e0c", 453 | "sha256:c31bc3c8e903d60a1ea31a754c72559398d91b5929fcb329b1c3a3d3f6e72113", 454 | "sha256:c955791d80e464da3b471ab41eb65cf5a40c15ce9b001fdc5bbc241170de58ec", 455 | "sha256:d069ef4b20b1e6b19f790d00097a5d5d2c50871b66d10075dab78938dc2ee2cf", 456 | "sha256:d52b989dc23cdaa92582ceb4af8d5bcc94d74b2c3e64cd6785558ec6a879793e", 457 | "sha256:e586b28354d7b6584d8973656a7954b1c69c93f708c0c07b77884f91640b7657", 458 | "sha256:efcf3397ae1e3c3a4a0a0636542bcad5adad3b1dd3e8e629d0b6e201347176c8", 459 | "sha256:fccefc0d36a38c57b7bd233a9b485e2f1eb71903ca7ad7adacad6c28a56d62d2" 460 | ], 461 | "markers": "python_version >= '3.6'", 462 | "version": "==1.2.0" 463 | }, 464 | "lxml": { 465 | "hashes": [ 466 | "sha256:05a444b207901a68a6526948c7cc8f9fe6d6f24c70781488e32fd74ff5996e3f", 467 | "sha256:08fc93257dcfe9542c0a6883a25ba4971d78297f63d7a5a26ffa34861ca78730", 468 | "sha256:107781b213cf7201ec3806555657ccda67b1fccc4261fb889ef7fc56976db81f", 469 | "sha256:121b665b04083a1e85ff1f5243d4a93aa1aaba281bc12ea334d5a187278ceaf1", 470 | "sha256:1fa21263c3aba2b76fd7c45713d4428dbcc7644d73dcf0650e9d344e433741b3", 471 | "sha256:2b30aa2bcff8e958cd85d907d5109820b01ac511eae5b460803430a7404e34d7", 472 | "sha256:4b4a111bcf4b9c948e020fd207f915c24a6de3f1adc7682a2d92660eb4e84f1a", 473 | "sha256:5591c4164755778e29e69b86e425880f852464a21c7bb53c7ea453bbe2633bbe", 474 | "sha256:59daa84aef650b11bccd18f99f64bfe44b9f14a08a28259959d33676554065a1", 475 | "sha256:5a9c8d11aa2c8f8b6043d845927a51eb9102eb558e3f936df494e96393f5fd3e", 476 | "sha256:5dd20538a60c4cc9a077d3b715bb42307239fcd25ef1ca7286775f95e9e9a46d", 477 | "sha256:74f48ec98430e06c1fa8949b49ebdd8d27ceb9df8d3d1c92e1fdc2773f003f20", 478 | "sha256:786aad2aa20de3dbff21aab86b2fb6a7be68064cbbc0219bde414d3a30aa47ae", 479 | "sha256:7ad7906e098ccd30d8f7068030a0b16668ab8aa5cda6fcd5146d8d20cbaa71b5", 480 | "sha256:80a38b188d20c0524fe8959c8ce770a8fdf0e617c6912d23fc97c68301bb9aba", 481 | "sha256:8f0ec6b9b3832e0bd1d57af41f9238ea7709bbd7271f639024f2fc9d3bb01293", 482 | "sha256:92282c83547a9add85ad658143c76a64a8d339028926d7dc1998ca029c88ea6a", 483 | "sha256:94150231f1e90c9595ccc80d7d2006c61f90a5995db82bccbca7944fd457f0f6", 484 | "sha256:9dc9006dcc47e00a8a6a029eb035c8f696ad38e40a27d073a003d7d1443f5d88", 485 | "sha256:a76979f728dd845655026ab991df25d26379a1a8fc1e9e68e25c7eda43004bed", 486 | "sha256:aa8eba3db3d8761db161003e2d0586608092e217151d7458206e243be5a43843", 487 | "sha256:bea760a63ce9bba566c23f726d72b3c0250e2fa2569909e2d83cda1534c79443", 488 | "sha256:c3f511a3c58676147c277eff0224c061dd5a6a8e1373572ac817ac6324f1b1e0", 489 | "sha256:c9d317efde4bafbc1561509bfa8a23c5cab66c44d49ab5b63ff690f5159b2304", 490 | "sha256:cc411ad324a4486b142c41d9b2b6a722c534096963688d879ea6fa8a35028258", 491 | "sha256:cdc13a1682b2a6241080745b1953719e7fe0850b40a5c71ca574f090a1391df6", 492 | "sha256:cfd7c5dd3c35c19cec59c63df9571c67c6d6e5c92e0fe63517920e97f61106d1", 493 | "sha256:e1cacf4796b20865789083252186ce9dc6cc59eca0c2e79cca332bdff24ac481", 494 | "sha256:e70d4e467e243455492f5de463b72151cc400710ac03a0678206a5f27e79ddef", 495 | "sha256:ecc930ae559ea8a43377e8b60ca6f8d61ac532fc57efb915d899de4a67928efd", 496 | "sha256:f161af26f596131b63b236372e4ce40f3167c1b5b5d459b29d2514bd8c9dc9ee" 497 | ], 498 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", 499 | "version": "==4.5.2" 500 | }, 501 | "markdown": { 502 | "hashes": [ 503 | "sha256:1fafe3f1ecabfb514a5285fca634a53c1b32a81cb0feb154264d55bf2ff22c17", 504 | "sha256:c467cd6233885534bf0fe96e62e3cf46cfc1605112356c4f9981512b8174de59" 505 | ], 506 | "markers": "python_version >= '3.5'", 507 | "version": "==3.2.2" 508 | }, 509 | "markupsafe": { 510 | "hashes": [ 511 | "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473", 512 | "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161", 513 | "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235", 514 | "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5", 515 | "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42", 516 | "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff", 517 | "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b", 518 | "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1", 519 | "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e", 520 | "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183", 521 | "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66", 522 | "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b", 523 | "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1", 524 | "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15", 525 | "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1", 526 | "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e", 527 | "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b", 528 | "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905", 529 | "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735", 530 | "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d", 531 | "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e", 532 | "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d", 533 | "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c", 534 | "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21", 535 | "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2", 536 | "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5", 537 | "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b", 538 | "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6", 539 | "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f", 540 | "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f", 541 | "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2", 542 | "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7", 543 | "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be" 544 | ], 545 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", 546 | "version": "==1.1.1" 547 | }, 548 | "matplotlib": { 549 | "hashes": [ 550 | "sha256:0dc15e1ad84ec06bf0c315e6c4c2cced13a21ce4c2b4955bb75097064a4b1e92", 551 | "sha256:1507c2a8e4662f6fa1d3ecc760782b158df8a3244ecc21c1d8dbb1cd0b3f872e", 552 | "sha256:1f9cf2b8500b833714a193cb24281153f5072d55b2e486009f1e81f0b7da3410", 553 | "sha256:233bef5e3b3494f3b7057595ca814f23ba0ce67a03632ddf677be5132128b3db", 554 | "sha256:2375f039b8c6ad6c1d03f01bf31f086bbbf997bf25e246f3b67f69969cde3d98", 555 | "sha256:24392ac1a382ed753505286f1a1483bcfd67ed0c72d51be10c4c2013e386d0b7", 556 | "sha256:282f8a077a1217f9f2ac178596f27c1ae94abbc6e7b785e1b8f25e83918e9199", 557 | "sha256:2c3619ec2a5ead430a4536ebf8c77ea55d8ce36418919f831d35bc657ed5f27e", 558 | "sha256:5a42c84264a1acbbf01c073a7bd05a0e80d99f94f10020d613b1b0526af9dcc2", 559 | "sha256:636c6330a7dcb18bac114dbeaff314fbbb0c11682f9a9601de69a50e331d18d7", 560 | "sha256:6739b6cd9278d5cb337df0bd4400ad37bbd04c6dc7aa2c65e1e83a02bc4cc6fd", 561 | "sha256:6d0f03079f655ca0a2d2e0bf49c28e1ec43d9d544c33d8da1a88765f23018ecc", 562 | "sha256:73a493e340064e8fe03207d9333b68baca30d9f0da543ae4af6b6b4f13f0fe05", 563 | "sha256:79f0c4730ad422ecb6bda814c9a9b375df36d6bd5a49eaa14e92e5f5e3e95ac3", 564 | "sha256:83ae7261f4d5ab387be2caee29c4f499b1566f31c8ac97a0b8ab61afd9e3da92", 565 | "sha256:87f53bcce90772f942c2db56736788b39332d552461a5cb13f05ff45c1680f0e", 566 | "sha256:88c6ab4a32a7447dad236b8371612aaba5c967d632ff11999e0478dd687f2c58", 567 | "sha256:96a5e667308dbf45670370d9dffb974e73b15bac0df0b5f3fb0b0ac7a572290e", 568 | "sha256:9703bc00a94a94c4e94b2ea0fbfbc9d2bb21159733134639fd931b6606c5c47e", 569 | "sha256:bc978374b43737f2bbc4a6ec48e52ae8c92be6278a80d0e2ce92f0eb0841f15c", 570 | "sha256:bd8fceaa3494b531d43b6206966ba15705638137fc2dc5da5ee560cf9476867b", 571 | "sha256:c4ffb25b9855bdb6cdaf21bbd4ab2c229be539248304ac5215b94c816ea6e32e", 572 | "sha256:cc2d6b47c8fee89da982a312b54949ec0cd6a7976a8cafb5b62dea6c9883a14d", 573 | "sha256:e4d6d3afc454b4afc0d9d0ed52a8fa40a1b0d8f33c8e143e49a5833a7e32266b", 574 | "sha256:f62c0b9a5d38c26673a8862cbae4d26cffcda260848e4278246b4e00f5a95eaf", 575 | "sha256:fab11637734eb14affb9c5e20d44d69429c18b49595d6e67c69295de24827fc4", 576 | "sha256:ffbae66e2db70dc330cb3299525f97e1c0efdfc763e04e1a4e08f968c7ad21f0" 577 | ], 578 | "index": "pypi", 579 | "version": "==3.3.1" 580 | }, 581 | "mistune": { 582 | "hashes": [ 583 | "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e", 584 | "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4" 585 | ], 586 | "version": "==0.8.4" 587 | }, 588 | "nbconvert": { 589 | "hashes": [ 590 | "sha256:21fb48e700b43e82ba0e3142421a659d7739b65568cc832a13976a77be16b523", 591 | "sha256:f0d6ec03875f96df45aa13e21fd9b8450c42d7e1830418cccc008c0df725fcee" 592 | ], 593 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", 594 | "version": "==5.6.1" 595 | }, 596 | "nbformat": { 597 | "hashes": [ 598 | "sha256:54d4d6354835a936bad7e8182dcd003ca3dc0cedfee5a306090e04854343b340", 599 | "sha256:ea55c9b817855e2dfcd3f66d74857342612a60b1f09653440f4a5845e6e3523f" 600 | ], 601 | "markers": "python_version >= '3.5'", 602 | "version": "==5.0.7" 603 | }, 604 | "notebook": { 605 | "hashes": [ 606 | "sha256:07b6e8b8a61aa2f780fe9a97430470485bc71262bc5cae8521f1441b910d2c88", 607 | "sha256:687d01f963ea20360c0b904ee7a37c3d8cda553858c8d6e33fd0afd13e89de32" 608 | ], 609 | "index": "pypi", 610 | "version": "==6.1.4" 611 | }, 612 | "numpy": { 613 | "hashes": [ 614 | "sha256:0172304e7d8d40e9e49553901903dc5f5a49a703363ed756796f5808a06fc233", 615 | "sha256:34e96e9dae65c4839bd80012023aadd6ee2ccb73ce7fdf3074c62f301e63120b", 616 | "sha256:3676abe3d621fc467c4c1469ee11e395c82b2d6b5463a9454e37fe9da07cd0d7", 617 | "sha256:3dd6823d3e04b5f223e3e265b4a1eae15f104f4366edd409e5a5e413a98f911f", 618 | "sha256:4064f53d4cce69e9ac613256dc2162e56f20a4e2d2086b1956dd2fcf77b7fac5", 619 | "sha256:4674f7d27a6c1c52a4d1aa5f0881f1eff840d2206989bae6acb1c7668c02ebfb", 620 | "sha256:7d42ab8cedd175b5ebcb39b5208b25ba104842489ed59fbb29356f671ac93583", 621 | "sha256:965df25449305092b23d5145b9bdaeb0149b6e41a77a7d728b1644b3c99277c1", 622 | "sha256:9c9d6531bc1886454f44aa8f809268bc481295cf9740827254f53c30104f074a", 623 | "sha256:a78e438db8ec26d5d9d0e584b27ef25c7afa5a182d1bf4d05e313d2d6d515271", 624 | "sha256:a7acefddf994af1aeba05bbbafe4ba983a187079f125146dc5859e6d817df824", 625 | "sha256:a87f59508c2b7ceb8631c20630118cc546f1f815e034193dc72390db038a5cb3", 626 | "sha256:ac792b385d81151bae2a5a8adb2b88261ceb4976dbfaaad9ce3a200e036753dc", 627 | "sha256:b03b2c0badeb606d1232e5f78852c102c0a7989d3a534b3129e7856a52f3d161", 628 | "sha256:b39321f1a74d1f9183bf1638a745b4fd6fe80efbb1f6b32b932a588b4bc7695f", 629 | "sha256:cae14a01a159b1ed91a324722d746523ec757357260c6804d11d6147a9e53e3f", 630 | "sha256:cd49930af1d1e49a812d987c2620ee63965b619257bd76eaaa95870ca08837cf", 631 | "sha256:e15b382603c58f24265c9c931c9a45eebf44fe2e6b4eaedbb0d025ab3255228b", 632 | "sha256:e91d31b34fc7c2c8f756b4e902f901f856ae53a93399368d9a0dc7be17ed2ca0", 633 | "sha256:ef627986941b5edd1ed74ba89ca43196ed197f1a206a3f18cc9faf2fb84fd675", 634 | "sha256:f718a7949d1c4f622ff548c572e0c03440b49b9531ff00e4ed5738b459f011e8" 635 | ], 636 | "index": "pypi", 637 | "version": "==1.18.5" 638 | }, 639 | "oauthlib": { 640 | "hashes": [ 641 | "sha256:bee41cc35fcca6e988463cacc3bcb8a96224f470ca547e697b604cc697b2f889", 642 | "sha256:df884cd6cbe20e32633f1db1072e9356f53638e4361bef4e8b03c9127c9328ea" 643 | ], 644 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", 645 | "version": "==3.1.0" 646 | }, 647 | "opt-einsum": { 648 | "hashes": [ 649 | "sha256:2455e59e3947d3c275477df7f5205b30635e266fe6dc300e3d9f9646bfcea147", 650 | "sha256:59f6475f77bbc37dcf7cd748519c0ec60722e91e63ca114e68821c0c54a46549" 651 | ], 652 | "markers": "python_version >= '3.5'", 653 | "version": "==3.3.0" 654 | }, 655 | "packaging": { 656 | "hashes": [ 657 | "sha256:4357f74f47b9c12db93624a82154e9b120fa8293699949152b22065d556079f8", 658 | "sha256:998416ba6962ae7fbd6596850b80e17859a5753ba17c32284f67bfff33784181" 659 | ], 660 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", 661 | "version": "==20.4" 662 | }, 663 | "pandas": { 664 | "hashes": [ 665 | "sha256:026d764d0b86ee53183aa4c0b90774b6146123eeada4e24946d7d24290777be1", 666 | "sha256:02ec9f5f0b7df7227931a884569ef0b6d32d76789c84bcac1a719dafd1f912e8", 667 | "sha256:08783a33989a6747317766b75be30a594a9764b9f145bb4bcc06e337930d9807", 668 | "sha256:0936991228241db937e87f82ec552a33888dd04a2e0d5a2fa3c689f92fab09e0", 669 | "sha256:188cdfbf8399bc144fa95040536b5ce3429d2eda6c9c8b238c987af7df9f128c", 670 | "sha256:1edf6c254d2d138188e9987159978ee70e23362fe9197f3f100844a197f7e1e4", 671 | "sha256:474fa53e3b2f3a543cbca81f7457bd1f44e7eb1be7171067636307e21b624e9c", 672 | "sha256:59df9f0276aa4854d8bff28c5e5aeb74d9c6bb4d9f55d272b7124a7df40e47d0", 673 | "sha256:9e135ce9929cd0f0ba24f0545936af17ba935f844d4c3a2b979354a73c9440e0", 674 | "sha256:ab6ea0f3116f408a8a59cd50158bfd19d2a024f4e221f14ab1bcd2da4f0c6fdf", 675 | "sha256:b64ffd87a2cfd31b40acd4b92cb72ea9a52a48165aec4c140e78fd69c45d1444", 676 | "sha256:b821f239514a9ce46dd1cd6c9298a03ed58d0235d414ea264aacc1b14916bbe4", 677 | "sha256:c9235b37489168ed6b173551c816b50aa89f03c24a8549a8b4d47d8dc79bfb1e", 678 | "sha256:eb0ac2fd04428f18b547716f70c699a7cc9c65a6947ed8c7e688d96eb91e3db8", 679 | "sha256:eeb64c5b3d4f2ea072ca8afdeb2b946cd681a863382ca79734f1b520b8d2fa26", 680 | "sha256:f7008ec22b92d771b145150978d930a28fab8da3a10131b01bbf39574acdad0b" 681 | ], 682 | "index": "pypi", 683 | "version": "==1.1.2" 684 | }, 685 | "pandocfilters": { 686 | "hashes": [ 687 | "sha256:b3dd70e169bb5449e6bc6ff96aea89c5eea8c5f6ab5e207fc2f521a2cf4a0da9" 688 | ], 689 | "version": "==1.4.2" 690 | }, 691 | "parso": { 692 | "hashes": [ 693 | "sha256:97218d9159b2520ff45eb78028ba8b50d2bc61dcc062a9682666f2dc4bd331ea", 694 | "sha256:caba44724b994a8a5e086460bb212abc5a8bc46951bf4a9a1210745953622eb9" 695 | ], 696 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", 697 | "version": "==0.7.1" 698 | }, 699 | "pexpect": { 700 | "hashes": [ 701 | "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937", 702 | "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c" 703 | ], 704 | "markers": "sys_platform != 'win32'", 705 | "version": "==4.8.0" 706 | }, 707 | "pickleshare": { 708 | "hashes": [ 709 | "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca", 710 | "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56" 711 | ], 712 | "version": "==0.7.5" 713 | }, 714 | "pillow": { 715 | "hashes": [ 716 | "sha256:612cfda94e9c8346f239bf1a4b082fdd5c8143cf82d685ba2dba76e7adeeb233", 717 | "sha256:6edb5446f44d901e8683ffb25ebdfc26988ee813da3bf91e12252b57ac163727", 718 | "sha256:5e51ee2b8114def244384eda1c82b10e307ad9778dac5c83fb0943775a653cd8", 719 | "sha256:8dad18b69f710bf3a001d2bf3afab7c432785d94fcf819c16b5207b1cfd17d38", 720 | "sha256:ffe538682dc19cc542ae7c3e504fdf54ca7f86fb8a135e59dd6bc8627eae6cce", 721 | "sha256:431b15cffbf949e89df2f7b48528be18b78bfa5177cb3036284a5508159492b5", 722 | "sha256:6d7741e65835716ceea0fd13a7d0192961212fd59e741a46bbed7a473c634ed6", 723 | "sha256:725aa6cfc66ce2857d585f06e9519a1cc0ef6d13f186ff3447ab6dff0a09bc7f", 724 | "sha256:a060cf8aa332052df2158e5a119303965be92c3da6f2d93b6878f0ebca80b2f6", 725 | "sha256:25930fadde8019f374400f7986e8404c8b781ce519da27792cbe46eabec00c4d", 726 | "sha256:9c87ef410a58dd54b92424ffd7e28fd2ec65d2f7fc02b76f5e9b2067e355ebf6", 727 | "sha256:c92302a33138409e8f1ad16731568c55c9053eee71bb05b6b744067e1b62380f", 728 | "sha256:d08b23fdb388c0715990cbc06866db554e1822c4bdcf6d4166cf30ac82df8c41", 729 | "sha256:97f9e7953a77d5a70f49b9a48da7776dc51e9b738151b22dacf101641594a626", 730 | "sha256:f7e30c27477dffc3e85c2463b3e649f751789e0f6c8456099eea7ddd53be4a8a", 731 | "sha256:0295442429645fa16d05bd567ef5cff178482439c9aad0411d3f0ce9b88b3a6f", 732 | "sha256:1ca594126d3c4def54babee699c055a913efb01e106c309fa6b04405d474d5ae", 733 | "sha256:06aba4169e78c439d528fdeb34762c3b61a70813527a2c57f0540541e9f433a8", 734 | "sha256:09d7f9e64289cb40c2c8d7ad674b2ed6105f55dc3b09aa8e4918e20a0311e7ad", 735 | "sha256:94cf49723928eb6070a892cb39d6c156f7b5a2db4e8971cb958f7b6b104fb4c4", 736 | "sha256:9ad7f865eebde135d526bb3163d0b23ffff365cf87e767c649550964ad72785d", 737 | "sha256:ec29604081f10f16a7aea809ad42e27764188fc258b02259a03a8ff7ded3808d", 738 | "sha256:52125833b070791fcb5710fabc640fc1df07d087fc0c0f02d3661f76c23c5b8b", 739 | "sha256:c79f9c5fb846285f943aafeafda3358992d64f0ef58566e23484132ecd8d7d63", 740 | "sha256:d350f0f2c2421e65fbc62690f26b59b0bcda1b614beb318c81e38647e0f673a1", 741 | "sha256:e901964262a56d9ea3c2693df68bc9860b8bdda2b04768821e4c44ae797de117", 742 | "sha256:edf31f1150778abd4322444c393ab9c7bd2af271dd4dafb4208fb613b1f3cdc9", 743 | "sha256:0a80dd307a5d8440b0a08bd7b81617e04d870e40a3e46a32d9c246e54705e86f" 744 | ], 745 | "markers": "python_version >= '3.5'", 746 | "version": "==7.2.0" 747 | }, 748 | "prometheus-client": { 749 | "hashes": [ 750 | "sha256:983c7ac4b47478720db338f1491ef67a100b474e3bc7dafcbaefb7d0b8f9b01c", 751 | "sha256:c6e6b706833a6bd1fd51711299edee907857be10ece535126a158f911ee80915" 752 | ], 753 | "version": "==0.8.0" 754 | }, 755 | "prompt-toolkit": { 756 | "hashes": [ 757 | "sha256:822f4605f28f7d2ba6b0b09a31e25e140871e96364d1d377667b547bb3bf4489", 758 | "sha256:83074ee28ad4ba6af190593d4d4c607ff525272a504eb159199b6dd9f950c950" 759 | ], 760 | "markers": "python_full_version >= '3.6.1'", 761 | "version": "==3.0.7" 762 | }, 763 | "protobuf": { 764 | "hashes": [ 765 | "sha256:0bba42f439bf45c0f600c3c5993666fcb88e8441d011fad80a11df6f324eef33", 766 | "sha256:1e834076dfef9e585815757a2c7e4560c7ccc5962b9d09f831214c693a91b463", 767 | "sha256:339c3a003e3c797bc84499fa32e0aac83c768e67b3de4a5d7a5a9aa3b0da634c", 768 | "sha256:361acd76f0ad38c6e38f14d08775514fbd241316cce08deb2ce914c7dfa1184a", 769 | "sha256:3dee442884a18c16d023e52e32dd34a8930a889e511af493f6dc7d4d9bf12e4f", 770 | "sha256:4d1174c9ed303070ad59553f435846a2f877598f59f9afc1b89757bdf846f2a7", 771 | "sha256:5db9d3e12b6ede5e601b8d8684a7f9d90581882925c96acf8495957b4f1b204b", 772 | "sha256:6a82e0c8bb2bf58f606040cc5814e07715b2094caeba281e2e7d0b0e2e397db5", 773 | "sha256:8c35bcbed1c0d29b127c886790e9d37e845ffc2725cc1db4bd06d70f4e8359f4", 774 | "sha256:91c2d897da84c62816e2f473ece60ebfeab024a16c1751aaf31100127ccd93ec", 775 | "sha256:9c2e63c1743cba12737169c447374fab3dfeb18111a460a8c1a000e35836b18c", 776 | "sha256:9edfdc679a3669988ec55a989ff62449f670dfa7018df6ad7f04e8dbacb10630", 777 | "sha256:c0c5ab9c4b1eac0a9b838f1e46038c3175a95b0f2d944385884af72876bd6bc7", 778 | "sha256:c8abd7605185836f6f11f97b21200f8a864f9cb078a193fe3c9e235711d3ff1e", 779 | "sha256:d69697acac76d9f250ab745b46c725edf3e98ac24763990b24d58c16c642947a", 780 | "sha256:df3932e1834a64b46ebc262e951cd82c3cf0fa936a154f0a42231140d8237060", 781 | "sha256:e7662437ca1e0c51b93cadb988f9b353fa6b8013c0385d63a70c8a77d84da5f9", 782 | "sha256:f68eb9d03c7d84bd01c790948320b768de8559761897763731294e3bc316decb" 783 | ], 784 | "version": "==3.13.0" 785 | }, 786 | "ptyprocess": { 787 | "hashes": [ 788 | "sha256:923f299cc5ad920c68f2bc0bc98b75b9f838b93b599941a6b63ddbc2476394c0", 789 | "sha256:d7cc528d76e76342423ca640335bd3633420dc1366f258cb31d05e865ef5ca1f" 790 | ], 791 | "markers": "os_name != 'nt'", 792 | "version": "==0.6.0" 793 | }, 794 | "pyasn1": { 795 | "hashes": [ 796 | "sha256:014c0e9976956a08139dc0712ae195324a75e142284d5f87f1a87ee1b068a359", 797 | "sha256:03840c999ba71680a131cfaee6fab142e1ed9bbd9c693e285cc6aca0d555e576", 798 | "sha256:0458773cfe65b153891ac249bcf1b5f8f320b7c2ce462151f8fa74de8934becf", 799 | "sha256:08c3c53b75eaa48d71cf8c710312316392ed40899cb34710d092e96745a358b7", 800 | "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d", 801 | "sha256:5c9414dcfede6e441f7e8f81b43b34e834731003427e5b09e4e00e3172a10f00", 802 | "sha256:6e7545f1a61025a4e58bb336952c5061697da694db1cae97b116e9c46abcf7c8", 803 | "sha256:78fa6da68ed2727915c4767bb386ab32cdba863caa7dbe473eaae45f9959da86", 804 | "sha256:7ab8a544af125fb704feadb008c99a88805126fb525280b2270bb25cc1d78a12", 805 | "sha256:99fcc3c8d804d1bc6d9a099921e39d827026409a58f2a720dcdb89374ea0c776", 806 | "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba", 807 | "sha256:e89bf84b5437b532b0803ba5c9a5e054d21fec423a89952a74f87fa2c9b7bce2", 808 | "sha256:fec3e9d8e36808a28efb59b489e4528c10ad0f480e57dcc32b4de5c9d8c9fdf3" 809 | ], 810 | "version": "==0.4.8" 811 | }, 812 | "pyasn1-modules": { 813 | "hashes": [ 814 | "sha256:0845a5582f6a02bb3e1bde9ecfc4bfcae6ec3210dd270522fee602365430c3f8", 815 | "sha256:0fe1b68d1e486a1ed5473f1302bd991c1611d319bba158e98b106ff86e1d7199", 816 | "sha256:15b7c67fabc7fc240d87fb9aabf999cf82311a6d6fb2c70d00d3d0604878c811", 817 | "sha256:426edb7a5e8879f1ec54a1864f16b882c2837bfd06eee62f2c982315ee2473ed", 818 | "sha256:65cebbaffc913f4fe9e4808735c95ea22d7a7775646ab690518c056784bc21b4", 819 | "sha256:905f84c712230b2c592c19470d3ca8d552de726050d1d1716282a1f6146be65e", 820 | "sha256:a50b808ffeb97cb3601dd25981f6b016cbb3d31fbf57a8b8a87428e6158d0c74", 821 | "sha256:a99324196732f53093a84c4369c996713eb8c89d360a496b599fb1a9c47fc3eb", 822 | "sha256:b80486a6c77252ea3a3e9b1e360bc9cf28eaac41263d173c032581ad2f20fe45", 823 | "sha256:c29a5e5cc7a3f05926aff34e097e84f8589cd790ce0ed41b67aed6857b26aafd", 824 | "sha256:cbac4bc38d117f2a49aeedec4407d23e8866ea4ac27ff2cf7fb3e5b570df19e0", 825 | "sha256:f39edd8c4ecaa4556e989147ebf219227e2cd2e8a43c7e7fcb1f1c18c5fd6a3d", 826 | "sha256:fe0644d9ab041506b62782e92b06b8c68cca799e1a9636ec398675459e031405" 827 | ], 828 | "version": "==0.2.8" 829 | }, 830 | "pycparser": { 831 | "hashes": [ 832 | "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0", 833 | "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705" 834 | ], 835 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", 836 | "version": "==2.20" 837 | }, 838 | "pygments": { 839 | "hashes": [ 840 | "sha256:647344a061c249a3b74e230c739f434d7ea4d8b1d5f3721bc0f3558049b38f44", 841 | "sha256:ff7a40b4860b727ab48fad6360eb351cc1b33cbf9b15a0f689ca5353e9463324" 842 | ], 843 | "markers": "python_version >= '3.5'", 844 | "version": "==2.6.1" 845 | }, 846 | "pypandoc": { 847 | "hashes": [ 848 | "sha256:14a49977ab1fbc9b14ef3087dcb101f336851837fca55ca79cf33846cc4976ff" 849 | ], 850 | "index": "pypi", 851 | "version": "==1.5" 852 | }, 853 | "pyparsing": { 854 | "hashes": [ 855 | "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1", 856 | "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b" 857 | ], 858 | "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", 859 | "version": "==2.4.7" 860 | }, 861 | "pyrsistent": { 862 | "hashes": [ 863 | "sha256:28669905fe725965daa16184933676547c5bb40a5153055a8dee2a4bd7933ad3" 864 | ], 865 | "version": "==0.16.0" 866 | }, 867 | "python-dateutil": { 868 | "hashes": [ 869 | "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c", 870 | "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a" 871 | ], 872 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", 873 | "version": "==2.8.1" 874 | }, 875 | "pytz": { 876 | "hashes": [ 877 | "sha256:a494d53b6d39c3c6e44c3bec237336e14305e4f29bbf800b599253057fbb79ed", 878 | "sha256:c35965d010ce31b23eeb663ed3cc8c906275d6be1a34393a1d73a41febf4a048" 879 | ], 880 | "version": "==2020.1" 881 | }, 882 | "pyyaml": { 883 | "hashes": [ 884 | "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97", 885 | "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76", 886 | "sha256:4f4b913ca1a7319b33cfb1369e91e50354d6f07a135f3b901aca02aa95940bd2", 887 | "sha256:69f00dca373f240f842b2931fb2c7e14ddbacd1397d57157a9b005a6a9942648", 888 | "sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf", 889 | "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f", 890 | "sha256:7739fc0fa8205b3ee8808aea45e968bc90082c10aef6ea95e855e10abf4a37b2", 891 | "sha256:95f71d2af0ff4227885f7a6605c37fd53d3a106fcab511b8860ecca9fcf400ee", 892 | "sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d", 893 | "sha256:cc8955cfbfc7a115fa81d85284ee61147059a753344bc51098f3ccd69b0d7e0c", 894 | "sha256:d13155f591e6fcc1ec3b30685d50bf0711574e2c0dfffd7644babf8b5102ca1a" 895 | ], 896 | "version": "==5.3.1" 897 | }, 898 | "pyzmq": { 899 | "hashes": [ 900 | "sha256:00dca814469436455399660247d74045172955459c0bd49b54a540ce4d652185", 901 | "sha256:046b92e860914e39612e84fa760fc3f16054d268c11e0e25dcb011fb1bc6a075", 902 | "sha256:09d24a80ccb8cbda1af6ed8eb26b005b6743e58e9290566d2a6841f4e31fa8e0", 903 | "sha256:0a422fc290d03958899743db091f8154958410fc76ce7ee0ceb66150f72c2c97", 904 | "sha256:276ad604bffd70992a386a84bea34883e696a6b22e7378053e5d3227321d9702", 905 | "sha256:296540a065c8c21b26d63e3cea2d1d57902373b16e4256afe46422691903a438", 906 | "sha256:29d51279060d0a70f551663bc592418bcad7f4be4eea7b324f6dd81de05cb4c1", 907 | "sha256:36ab114021c0cab1a423fe6689355e8f813979f2c750968833b318c1fa10a0fd", 908 | "sha256:3fa6debf4bf9412e59353defad1f8035a1e68b66095a94ead8f7a61ae90b2675", 909 | "sha256:5120c64646e75f6db20cc16b9a94203926ead5d633de9feba4f137004241221d", 910 | "sha256:59f1e54627483dcf61c663941d94c4af9bf4163aec334171686cdaee67974fe5", 911 | "sha256:5d9fc809aa8d636e757e4ced2302569d6e60e9b9c26114a83f0d9d6519c40493", 912 | "sha256:654d3e06a4edc566b416c10293064732516cf8871a4522e0a2ba00cc2a2e600c", 913 | "sha256:720d2b6083498a9281eaee3f2927486e9fe02cd16d13a844f2e95217f243efea", 914 | "sha256:73483a2caaa0264ac717af33d6fb3f143d8379e60a422730ee8d010526ce1913", 915 | "sha256:8a6ada5a3f719bf46a04ba38595073df8d6b067316c011180102ba2a1925f5b5", 916 | "sha256:8b66b94fe6243d2d1d89bca336b2424399aac57932858b9a30309803ffc28112", 917 | "sha256:99cc0e339a731c6a34109e5c4072aaa06d8e32c0b93dc2c2d90345dd45fa196c", 918 | "sha256:a7e7f930039ee0c4c26e4dfee015f20bd6919cd8b97c9cd7afbde2923a5167b6", 919 | "sha256:ab0d01148d13854de716786ca73701012e07dff4dfbbd68c4e06d8888743526e", 920 | "sha256:c1a31cd42905b405530e92bdb70a8a56f048c8a371728b8acf9d746ecd4482c0", 921 | "sha256:c20dd60b9428f532bc59f2ef6d3b1029a28fc790d408af82f871a7db03e722ff", 922 | "sha256:c36ffe1e5aa35a1af6a96640d723d0d211c5f48841735c2aa8d034204e87eb87", 923 | "sha256:c40fbb2b9933369e994b837ee72193d6a4c35dfb9a7c573257ef7ff28961272c", 924 | "sha256:d46fb17f5693244de83e434648b3dbb4f4b0fec88415d6cbab1c1452b6f2ae17", 925 | "sha256:e36f12f503511d72d9bdfae11cadbadca22ff632ff67c1b5459f69756a029c19", 926 | "sha256:f1a25a61495b6f7bb986accc5b597a3541d9bd3ef0016f50be16dbb32025b302", 927 | "sha256:fa411b1d8f371d3a49d31b0789eb6da2537dadbb2aef74a43aa99a78195c3f76" 928 | ], 929 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", 930 | "version": "==19.0.2" 931 | }, 932 | "qtconsole": { 933 | "hashes": [ 934 | "sha256:7a42af4b1c51d870b41e4a1b67e2e71296c0edd1b2f46c647ad67dff421c2726", 935 | "sha256:f236ead8711dba0702507dd8fad473c7216a86eefa6098eff8ec4b54f57d7804" 936 | ], 937 | "version": "==4.7.7" 938 | }, 939 | "qtpy": { 940 | "hashes": [ 941 | "sha256:2db72c44b55d0fe1407be8fba35c838ad0d6d3bb81f23007886dc1fc0f459c8d", 942 | "sha256:fa0b8363b363e89b2a6f49eddc162a04c0699ae95e109a6be3bb145a913190ea" 943 | ], 944 | "version": "==1.9.0" 945 | }, 946 | "requests": { 947 | "hashes": [ 948 | "sha256:b3559a131db72c33ee969480840fff4bb6dd111de7dd27c8ee1f820f4f00231b", 949 | "sha256:fe75cc94a9443b9246fc7049224f75604b113c36acb93f87b80ed42c44cbb898" 950 | ], 951 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", 952 | "version": "==2.24.0" 953 | }, 954 | "requests-oauthlib": { 955 | "hashes": [ 956 | "sha256:7f71572defaecd16372f9006f33c2ec8c077c3cfa6f5911a9a90202beb513f3d", 957 | "sha256:b4261601a71fd721a8bd6d7aa1cc1d6a8a93b4a9f5e96626f8e4d91e8beeaa6a", 958 | "sha256:fa6c47b933f01060936d87ae9327fead68768b69c6c9ea2109c48be30f2d4dbc" 959 | ], 960 | "version": "==1.3.0" 961 | }, 962 | "rsa": { 963 | "hashes": [ 964 | "sha256:109ea5a66744dd859bf16fe904b8d8b627adafb9408753161e766a92e7d681fa", 965 | "sha256:6166864e23d6b5195a5cfed6cd9fed0fe774e226d8f854fcb23b7bbef0350233" 966 | ], 967 | "markers": "python_version >= '3.5'", 968 | "version": "==4.6" 969 | }, 970 | "scikit-learn": { 971 | "hashes": [ 972 | "sha256:0a127cc70990d4c15b1019680bfedc7fec6c23d14d3719fdf9b64b22d37cdeca", 973 | "sha256:0d39748e7c9669ba648acf40fb3ce96b8a07b240db6888563a7cb76e05e0d9cc", 974 | "sha256:1b8a391de95f6285a2f9adffb7db0892718950954b7149a70c783dc848f104ea", 975 | "sha256:20766f515e6cd6f954554387dfae705d93c7b544ec0e6c6a5d8e006f6f7ef480", 976 | "sha256:2aa95c2f17d2f80534156215c87bee72b6aa314a7f8b8fe92a2d71f47280570d", 977 | "sha256:5ce7a8021c9defc2b75620571b350acc4a7d9763c25b7593621ef50f3bd019a2", 978 | "sha256:6c28a1d00aae7c3c9568f61aafeaad813f0f01c729bee4fd9479e2132b215c1d", 979 | "sha256:7671bbeddd7f4f9a6968f3b5442dac5f22bf1ba06709ef888cc9132ad354a9ab", 980 | "sha256:914ac2b45a058d3f1338d7736200f7f3b094857758895f8667be8a81ff443b5b", 981 | "sha256:98508723f44c61896a4e15894b2016762a55555fbf09365a0bb1870ecbd442de", 982 | "sha256:a64817b050efd50f9abcfd311870073e500ae11b299683a519fbb52d85e08d25", 983 | "sha256:cb3e76380312e1f86abd20340ab1d5b3cc46a26f6593d3c33c9ea3e4c7134028", 984 | "sha256:d0dcaa54263307075cb93d0bee3ceb02821093b1b3d25f66021987d305d01dce", 985 | "sha256:d9a1ce5f099f29c7c33181cc4386660e0ba891b21a60dc036bf369e3a3ee3aec", 986 | "sha256:da8e7c302003dd765d92a5616678e591f347460ac7b53e53d667be7dfe6d1b10", 987 | "sha256:daf276c465c38ef736a79bd79fc80a249f746bcbcae50c40945428f7ece074f8" 988 | ], 989 | "markers": "python_version >= '3.6'", 990 | "version": "==0.23.2" 991 | }, 992 | "scipy": { 993 | "hashes": [ 994 | "sha256:00af72998a46c25bdb5824d2b729e7dabec0c765f9deb0b504f928591f5ff9d4", 995 | "sha256:0902a620a381f101e184a958459b36d3ee50f5effd186db76e131cbefcbb96f7", 996 | "sha256:1e3190466d669d658233e8a583b854f6386dd62d655539b77b3fa25bfb2abb70", 997 | "sha256:2cce3f9847a1a51019e8c5b47620da93950e58ebc611f13e0d11f4980ca5fecb", 998 | "sha256:3092857f36b690a321a662fe5496cb816a7f4eecd875e1d36793d92d3f884073", 999 | "sha256:386086e2972ed2db17cebf88610aab7d7f6e2c0ca30042dc9a89cf18dcc363fa", 1000 | "sha256:71eb180f22c49066f25d6df16f8709f215723317cc951d99e54dc88020ea57be", 1001 | "sha256:770254a280d741dd3436919d47e35712fb081a6ff8bafc0f319382b954b77802", 1002 | "sha256:787cc50cab3020a865640aba3485e9fbd161d4d3b0d03a967df1a2881320512d", 1003 | "sha256:8a07760d5c7f3a92e440ad3aedcc98891e915ce857664282ae3c0220f3301eb6", 1004 | "sha256:8d3bc3993b8e4be7eade6dcc6fd59a412d96d3a33fa42b0fa45dc9e24495ede9", 1005 | "sha256:9508a7c628a165c2c835f2497837bf6ac80eb25291055f56c129df3c943cbaf8", 1006 | "sha256:a144811318853a23d32a07bc7fd5561ff0cac5da643d96ed94a4ffe967d89672", 1007 | "sha256:a1aae70d52d0b074d8121333bc807a485f9f1e6a69742010b33780df2e60cfe0", 1008 | "sha256:a2d6df9eb074af7f08866598e4ef068a2b310d98f87dc23bd1b90ec7bdcec802", 1009 | "sha256:bb517872058a1f087c4528e7429b4a44533a902644987e7b2fe35ecc223bc408", 1010 | "sha256:c5cac0c0387272ee0e789e94a570ac51deb01c796b37fb2aad1fb13f85e2f97d", 1011 | "sha256:cc971a82ea1170e677443108703a2ec9ff0f70752258d0e9f5433d00dda01f59", 1012 | "sha256:dba8306f6da99e37ea08c08fef6e274b5bf8567bb094d1dbe86a20e532aca088", 1013 | "sha256:dc60bb302f48acf6da8ca4444cfa17d52c63c5415302a9ee77b3b21618090521", 1014 | "sha256:dee1bbf3a6c8f73b6b218cb28eed8dd13347ea2f87d572ce19b289d6fd3fbc59" 1015 | ], 1016 | "markers": "python_version >= '3.5'", 1017 | "version": "==1.4.1" 1018 | }, 1019 | "send2trash": { 1020 | "hashes": [ 1021 | "sha256:60001cc07d707fe247c94f74ca6ac0d3255aabcb930529690897ca2a39db28b2", 1022 | "sha256:f1691922577b6fa12821234aeb57599d887c4900b9ca537948d2dac34aea888b" 1023 | ], 1024 | "version": "==1.5.0" 1025 | }, 1026 | "six": { 1027 | "hashes": [ 1028 | "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259", 1029 | "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced" 1030 | ], 1031 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", 1032 | "version": "==1.15.0" 1033 | }, 1034 | "sklearn": { 1035 | "hashes": [ 1036 | "sha256:e23001573aa194b834122d2b9562459bf5ae494a2d59ca6b8aa22c85a44c0e31" 1037 | ], 1038 | "index": "pypi", 1039 | "version": "==0.0" 1040 | }, 1041 | "tensorboard": { 1042 | "hashes": [ 1043 | "sha256:d34609ed83ff01dd5b49ef81031cfc9c166bba0dabd60197024f14df5e8eae5e" 1044 | ], 1045 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", 1046 | "version": "==2.3.0" 1047 | }, 1048 | "tensorboard-plugin-wit": { 1049 | "hashes": [ 1050 | "sha256:ee775f04821185c90d9a0e9c56970ee43d7c41403beb6629385b39517129685b" 1051 | ], 1052 | "version": "==1.7.0" 1053 | }, 1054 | "tensorflow": { 1055 | "hashes": [ 1056 | "sha256:0cfb0fbe875408cdbfc7677f12aa0b23656f3e6d8c5f568b3100450ec29262a7", 1057 | "sha256:2d9994157d6a222d9ffd956e99af4b5e46e47338428d2d197e325362283ec835", 1058 | "sha256:36a4ce9bbc9865385c1bb606fe34f0da96b0496ce3997e652d2b765a4382fe48", 1059 | "sha256:44c8d979b2d19ed56dbe6b03aef87616d6138a58fd80c43e7a758c90105e9adf", 1060 | "sha256:5c9f9a36d5b4d0ceb67b985486fe4cc6999a96e2bf89f3ba82ffd8317e5efadd", 1061 | "sha256:6f74ef59dc59cf8f2002738c65dffa591e2c332e9b1b4ced33ff8d39b6fb477c", 1062 | "sha256:797d6ca09d4f69570458180b7813dc12efe9166ba60454b0df7bed531bb5e4f4", 1063 | "sha256:92430b6e91f00f38a602c4f547bbbaca598a3a90376f90d5b2acd24bc18fa1d7", 1064 | "sha256:b1699903cf3a9f41c379d79ada2279a206a071b7e05671646d7b5e7fc37e2eae", 1065 | "sha256:bc9d761a857839344930eef86f0d6409840b1c9ada9cbe56b92287b2077ef752", 1066 | "sha256:c33a423eb1f39c4c6acc44c044a138979868f0d4c91e380c191bd8fddc7c2e9b", 1067 | "sha256:c6fad4e944e20199e963e158fe626352e349865ea4ca71655f5456193a6d3b9d" 1068 | ], 1069 | "index": "pypi", 1070 | "version": "==2.3.0" 1071 | }, 1072 | "tensorflow-estimator": { 1073 | "hashes": [ 1074 | "sha256:b75e034300ccb169403cf2695adf3368da68863aeb0c14c3760064c713d5c486" 1075 | ], 1076 | "version": "==2.3.0" 1077 | }, 1078 | "termcolor": { 1079 | "hashes": [ 1080 | "sha256:1d6d69ce66211143803fbc56652b41d73b4a400a2891d7bf7a1cdf4c02de613b" 1081 | ], 1082 | "version": "==1.1.0" 1083 | }, 1084 | "terminado": { 1085 | "hashes": [ 1086 | "sha256:4804a774f802306a7d9af7322193c5390f1da0abb429e082a10ef1d46e6fb2c2", 1087 | "sha256:a43dcb3e353bc680dd0783b1d9c3fc28d529f190bc54ba9a229f72fe6e7a54d7" 1088 | ], 1089 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", 1090 | "version": "==0.8.3" 1091 | }, 1092 | "testpath": { 1093 | "hashes": [ 1094 | "sha256:60e0a3261c149755f4399a1fff7d37523179a70fdc3abdf78de9fc2604aeec7e", 1095 | "sha256:bfcf9411ef4bf3db7579063e0546938b1edda3d69f4e1fb8756991f5951f85d4" 1096 | ], 1097 | "version": "==0.4.4" 1098 | }, 1099 | "threadpoolctl": { 1100 | "hashes": [ 1101 | "sha256:38b74ca20ff3bb42caca8b00055111d74159ee95c4370882bbff2b93d24da725", 1102 | "sha256:ddc57c96a38beb63db45d6c159b5ab07b6bced12c45a1f07b2b92f272aebfa6b" 1103 | ], 1104 | "markers": "python_version >= '3.5'", 1105 | "version": "==2.1.0" 1106 | }, 1107 | "tornado": { 1108 | "hashes": [ 1109 | "sha256:0fe2d45ba43b00a41cd73f8be321a44936dc1aba233dee979f17a042b83eb6dc", 1110 | "sha256:22aed82c2ea340c3771e3babc5ef220272f6fd06b5108a53b4976d0d722bcd52", 1111 | "sha256:2c027eb2a393d964b22b5c154d1a23a5f8727db6fda837118a776b29e2b8ebc6", 1112 | "sha256:5217e601700f24e966ddab689f90b7ea4bd91ff3357c3600fa1045e26d68e55d", 1113 | "sha256:5618f72e947533832cbc3dec54e1dffc1747a5cb17d1fd91577ed14fa0dc081b", 1114 | "sha256:5f6a07e62e799be5d2330e68d808c8ac41d4a259b9cea61da4101b83cb5dc673", 1115 | "sha256:c58d56003daf1b616336781b26d184023ea4af13ae143d9dda65e31e534940b9", 1116 | "sha256:c952975c8ba74f546ae6de2e226ab3cc3cc11ae47baf607459a6728585bb542a", 1117 | "sha256:c98232a3ac391f5faea6821b53db8db461157baa788f5d6222a193e9456e1740" 1118 | ], 1119 | "markers": "python_version >= '3.5'", 1120 | "version": "==6.0.4" 1121 | }, 1122 | "traitlets": { 1123 | "hashes": [ 1124 | "sha256:86c9351f94f95de9db8a04ad8e892da299a088a64fd283f9f6f18770ae5eae1b", 1125 | "sha256:9664ec0c526e48e7b47b7d14cd6b252efa03e0129011de0a9c1d70315d4309c3" 1126 | ], 1127 | "markers": "python_version >= '3.7'", 1128 | "version": "==5.0.4" 1129 | }, 1130 | "urllib3": { 1131 | "hashes": [ 1132 | "sha256:91056c15fa70756691db97756772bb1eb9678fa585d9184f24534b100dc60f4a", 1133 | "sha256:e7983572181f5e1522d9c98453462384ee92a0be7fac5f1413a1e35c56cc0461" 1134 | ], 1135 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'", 1136 | "version": "==1.25.10" 1137 | }, 1138 | "wcwidth": { 1139 | "hashes": [ 1140 | "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784", 1141 | "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83" 1142 | ], 1143 | "version": "==0.2.5" 1144 | }, 1145 | "webencodings": { 1146 | "hashes": [ 1147 | "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", 1148 | "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923" 1149 | ], 1150 | "version": "==0.5.1" 1151 | }, 1152 | "werkzeug": { 1153 | "hashes": [ 1154 | "sha256:2de2a5db0baeae7b2d2664949077c2ac63fbd16d98da0ff71837f7d1dea3fd43", 1155 | "sha256:6c80b1e5ad3665290ea39320b91e1be1e0d5f60652b964a3070216de83d2e47c" 1156 | ], 1157 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", 1158 | "version": "==1.0.1" 1159 | }, 1160 | "wheel": { 1161 | "hashes": [ 1162 | "sha256:497add53525d16c173c2c1c733b8f655510e909ea78cc0e29d374243544b77a2", 1163 | "sha256:99a22d87add3f634ff917310a3d87e499f19e663413a52eb9232c447aa646c9f" 1164 | ], 1165 | "markers": "python_version >= '3'", 1166 | "version": "==0.35.1" 1167 | }, 1168 | "widgetsnbextension": { 1169 | "hashes": [ 1170 | "sha256:079f87d87270bce047512400efd70238820751a11d2d8cb137a5a5bdbaf255c7", 1171 | "sha256:bd314f8ceb488571a5ffea6cc5b9fc6cba0adaf88a9d2386b93a489751938bcd" 1172 | ], 1173 | "version": "==3.5.1" 1174 | }, 1175 | "wrapt": { 1176 | "hashes": [ 1177 | "sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7" 1178 | ], 1179 | "version": "==1.12.1" 1180 | }, 1181 | "zipp": { 1182 | "hashes": [ 1183 | "sha256:aa36550ff0c0b7ef7fa639055d797116ee891440eac1a56f378e2d3179e0320b", 1184 | "sha256:c599e4d75c98f6798c509911d08a22e6c021d074469042177c8c86fb92eefd96" 1185 | ], 1186 | "markers": "python_version >= '3.6'", 1187 | "version": "==3.1.0" 1188 | } 1189 | }, 1190 | "develop": {} 1191 | } 1192 | -------------------------------------------------------------------------------- /ODSC_part1.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 18, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "import matplotlib as mpl\n", 10 | "from cycler import cycler\n", 11 | "from matplotlib import ticker\n", 12 | "\n", 13 | "mpl.rcParams['lines.linewidth'] = 3\n", 14 | "mpl.rcParams['lines.markersize'] = 8\n", 15 | "\n", 16 | "mpl.rcParams['xtick.labelsize'] = 12\n", 17 | "mpl.rcParams['xtick.color'] = '#A9A9A9'\n", 18 | "mpl.rcParams['ytick.labelsize'] = 12\n", 19 | "mpl.rcParams['ytick.color'] = '#A9A9A9'\n", 20 | "\n", 21 | "mpl.rcParams['grid.color'] = '#ffffff'\n", 22 | "mpl.rcParams['axes.facecolor'] = '#ffffff'\n", 23 | "\n", 24 | "mpl.rcParams['axes.spines.left'] = False\n", 25 | "mpl.rcParams['axes.spines.right'] = False\n", 26 | "mpl.rcParams['axes.spines.top'] = False\n", 27 | "mpl.rcParams['axes.spines.bottom'] = False\n", 28 | "\n", 29 | "mpl.rcParams['axes.prop_cycle'] = cycler(color=['#2EBCE7', '#84EE29', '#FF8177'])" 30 | ] 31 | }, 32 | { 33 | "cell_type": "markdown", 34 | "metadata": {}, 35 | "source": [ 36 | "$$\n", 37 | "\\newcommand\\norm[1]{\\lVert#1\\rVert}\n", 38 | "\\def\\va{{\\boldsymbol{a}}} % Vectors\n", 39 | "\\def\\vb{{\\boldsymbol{b}}}\n", 40 | "\\def\\vi{{\\boldsymbol{i}}}\n", 41 | "\\def\\vj{{\\boldsymbol{j}}}\n", 42 | "\\def\\vp{{\\boldsymbol{p}}}\n", 43 | "\\def\\vq{{\\boldsymbol{q}}}\n", 44 | "\\def\\vu{{\\boldsymbol{u}}}\n", 45 | "\\def\\vv{{\\boldsymbol{v}}}\n", 46 | "\\def\\vw{{\\boldsymbol{w}}}\n", 47 | "\\def\\vx{{\\boldsymbol{x}}}\n", 48 | "\\def\\vy{{\\boldsymbol{y}}}\n", 49 | "\\def\\vz{{\\boldsymbol{z}}}\n", 50 | "\\def\\mA{{\\boldsymbol{A}}} % Matrices\n", 51 | "\\def\\mB{{\\boldsymbol{B}}}\n", 52 | "\\def\\mC{{\\boldsymbol{C}}}\n", 53 | "\\def\\mD{{\\boldsymbol{D}}}\n", 54 | "\\def\\mI{{\\boldsymbol{I}}}\n", 55 | "\\def\\mQ{{\\boldsymbol{Q}}}\n", 56 | "\\def\\mS{{\\boldsymbol{S}}}\n", 57 | "\\def\\mT{{\\boldsymbol{T}}}\n", 58 | "\\def\\mU{{\\boldsymbol{U}}}\n", 59 | "\\def\\mV{{\\boldsymbol{V}}}\n", 60 | "\\def\\mW{{\\boldsymbol{W}}}\n", 61 | "\\def\\mX{{\\boldsymbol{X}}}\n", 62 | "$$" 63 | ] 64 | }, 65 | { 66 | "cell_type": "markdown", 67 | "metadata": {}, 68 | "source": [ 69 | "# 1. Scalars, Vectors, matrices and tensors\n", 70 | "\n", 71 | "In linear algebra, you deal with vectors. Mathematical objects like *scalars* are defined according to their relationship to vectors: they are numbers that *scale* vectors." 72 | ] 73 | }, 74 | { 75 | "cell_type": "markdown", 76 | "metadata": {}, 77 | "source": [ 78 | "## 1.1 Geometric and coordinate vectors\n", 79 | "\n", 80 | "- Geometric vectors vs. coordinate vectors\n", 81 | "\n", 82 | "\n", 83 | "Example of a vector $\\vv$.\n", 84 | "\n", 85 | "The coordinate vector $\\vv$ represented in the figure is defined as:\n", 86 | "\n", 87 | "$$\n", 88 | "\\vv = \\begin{bmatrix}\n", 89 | "3 \\\\\\\\\n", 90 | "2\n", 91 | "\\end{bmatrix}\n", 92 | "$$\n", 93 | "\n", 94 | "\n", 95 | "You can use Numpy to create vectors:" 96 | ] 97 | }, 98 | { 99 | "cell_type": "code", 100 | "execution_count": 120, 101 | "metadata": {}, 102 | "outputs": [ 103 | { 104 | "data": { 105 | "text/plain": [ 106 | "array([3, 2])" 107 | ] 108 | }, 109 | "execution_count": 120, 110 | "metadata": {}, 111 | "output_type": "execute_result" 112 | } 113 | ], 114 | "source": [ 115 | "import numpy as np\n", 116 | "v = np.array([3, 2])\n", 117 | "v" 118 | ] 119 | }, 120 | { 121 | "cell_type": "markdown", 122 | "metadata": {}, 123 | "source": [ 124 | "You can represent these vectors as points in space (scatter plot) instead of arrows:" 125 | ] 126 | }, 127 | { 128 | "cell_type": "code", 129 | "execution_count": 19, 130 | "metadata": {}, 131 | "outputs": [ 132 | { 133 | "data": { 134 | "image/png": "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\n", 135 | "text/plain": [ 136 | "
" 137 | ] 138 | }, 139 | "metadata": { 140 | "needs_background": "dark" 141 | }, 142 | "output_type": "display_data" 143 | } 144 | ], 145 | "source": [ 146 | "import matplotlib.pyplot as plt\n", 147 | "plt.scatter(v[0], v[1])\n", 148 | "\n", 149 | "\n", 150 | "#### Plot axes, labels, etc.\n", 151 | "plt.xlabel(\"x\")\n", 152 | "plt.ylabel(\"y\")\n", 153 | "ax = plt.gca()\n", 154 | "ax.xaxis.set_major_locator(ticker.MultipleLocator(1))\n", 155 | "ax.yaxis.set_major_locator(ticker.MultipleLocator(1))\n", 156 | "plt.axhline(0, c='#a9a9a9', zorder=1)\n", 157 | "plt.axvline(0, c='#a9a9a9', zorder=1)\n", 158 | "plt.xlim(-1, 4)\n", 159 | "plt.ylim(-1, 4)\n", 160 | "plt.show()" 161 | ] 162 | }, 163 | { 164 | "cell_type": "markdown", 165 | "metadata": {}, 166 | "source": [ 167 | "- **Indexing**: you can retrieve values in a vector specifying its index (its position in the vector). Note that Python uses zero-based indexing: the first value is at index 0. So, you can get the first value of $\\vv$ with `v[0]` and the second one with `v[1]`.\n", 168 | "\n", 169 | "\n", 170 | "- **More dimensions**: you can create vectors with more values, it will just be harder to represent.\n", 171 | "\n", 172 | "\n", 173 | "- Representing **data** as vectors.\n", 174 | "\n", 175 | "Let's say that data corresponding to grades at two exams. You can create one vector per student: each vector contains two values for the two grades. However, to plot the data it can be more convenient to create one vector for each grade containing each all students grades. You'll have two vectors. For instance:" 176 | ] 177 | }, 178 | { 179 | "cell_type": "code", 180 | "execution_count": 42, 181 | "metadata": {}, 182 | "outputs": [], 183 | "source": [ 184 | "x = np.array([1, 2, 3])\n", 185 | "y = np.array([-1, 4, 6])" 186 | ] 187 | }, 188 | { 189 | "cell_type": "markdown", 190 | "metadata": {}, 191 | "source": [ 192 | "Then, you can plot the data:" 193 | ] 194 | }, 195 | { 196 | "cell_type": "code", 197 | "execution_count": 46, 198 | "metadata": {}, 199 | "outputs": [ 200 | { 201 | "data": { 202 | "image/png": "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\n", 203 | "text/plain": [ 204 | "
" 205 | ] 206 | }, 207 | "metadata": { 208 | "needs_background": "dark" 209 | }, 210 | "output_type": "display_data" 211 | } 212 | ], 213 | "source": [ 214 | "plt.scatter(x, y)\n", 215 | "\n", 216 | "#### Plot axes, labels, etc.\n", 217 | "plt.xlabel(\"x\")\n", 218 | "plt.ylabel(\"y\")\n", 219 | "ax = plt.gca()\n", 220 | "ax.xaxis.set_major_locator(ticker.MultipleLocator(1))\n", 221 | "ax.yaxis.set_major_locator(ticker.MultipleLocator(1))\n", 222 | "plt.axhline(0, c='#a9a9a9', zorder=1)\n", 223 | "plt.axvline(0, c='#a9a9a9', zorder=1)\n", 224 | "plt.xlim(-2, 7)\n", 225 | "plt.ylim(-2, 7)\n", 226 | "plt.show()" 227 | ] 228 | }, 229 | { 230 | "cell_type": "markdown", 231 | "metadata": {}, 232 | "source": [ 233 | "#### Exercise" 234 | ] 235 | }, 236 | { 237 | "cell_type": "markdown", 238 | "metadata": {}, 239 | "source": [ 240 | "Consider the following dataset:\n" 241 | ] 242 | }, 243 | { 244 | "cell_type": "code", 245 | "execution_count": 49, 246 | "metadata": {}, 247 | "outputs": [ 248 | { 249 | "data": { 250 | "text/html": [ 251 | "
\n", 252 | "\n", 265 | "\n", 266 | " \n", 267 | " \n", 268 | " \n", 269 | " \n", 270 | " \n", 271 | " \n", 272 | " \n", 273 | " \n", 274 | " \n", 275 | " \n", 276 | " \n", 277 | " \n", 278 | " \n", 279 | " \n", 280 | " \n", 281 | " \n", 282 | " \n", 283 | " \n", 284 | " \n", 285 | " \n", 286 | " \n", 287 | " \n", 288 | " \n", 289 | " \n", 290 | " \n", 291 | " \n", 292 | " \n", 293 | " \n", 294 | " \n", 295 | " \n", 296 | " \n", 297 | " \n", 298 | " \n", 299 | " \n", 300 | "
ageexperience (years)
0231
1252
25426
34117
4326
\n", 301 | "
" 302 | ], 303 | "text/plain": [ 304 | " age experience (years)\n", 305 | "0 23 1\n", 306 | "1 25 2\n", 307 | "2 54 26\n", 308 | "3 41 17\n", 309 | "4 32 6" 310 | ] 311 | }, 312 | "execution_count": 49, 313 | "metadata": {}, 314 | "output_type": "execute_result" 315 | } 316 | ], 317 | "source": [ 318 | "import pandas as pd\n", 319 | "df = pd.DataFrame({\"age\": [23, 25, 54, 41, 32], \"experience (years)\": [1, 2, 26, 17, 6]})\n", 320 | "df" 321 | ] 322 | }, 323 | { 324 | "cell_type": "markdown", 325 | "metadata": {}, 326 | "source": [ 327 | "Create Numpy vectors from the columns of the dataset and create a scatter plot (experience as a function of age) with Matplotlib." 328 | ] 329 | }, 330 | { 331 | "cell_type": "markdown", 332 | "metadata": {}, 333 | "source": [ 334 | "\n", 335 | "\n", 336 | "\n", 337 | "\n", 338 | "
\n", 339 | " Click to see a solution!\n", 340 | "
\n",
 341 |     "    age = df[\"age\"].to_numpy()\n",
 342 |     "    experience = df[\"experience (years)\"].to_numpy()\n",
 343 |     "    plt.scatter(age, experience)\n",
 344 |     "    plt.xlabel(\"Age\")\n",
 345 |     "    plt.ylabel(\"Experience\")\n",
 346 |     "\n",
 347 |     "    #### Plot axes, labels, etc.\n",
 348 |     "    plt.xlabel(\"x\")\n",
 349 |     "    plt.ylabel(\"y\")\n",
 350 |     "    ax = plt.gca()\n",
 351 |     "    ax.xaxis.set_major_locator(ticker.MultipleLocator(5))\n",
 352 |     "    ax.yaxis.set_major_locator(ticker.MultipleLocator(5))\n",
 353 |     "    plt.axhline(0, c='#a9a9a9', zorder=1)\n",
 354 |     "    plt.axvline(0, c='#a9a9a9', zorder=1)\n",
 355 |     "    plt.show()\n",
 356 |     "  
\n", 357 | "
" 358 | ] 359 | }, 360 | { 361 | "cell_type": "code", 362 | "execution_count": 123, 363 | "metadata": {}, 364 | "outputs": [ 365 | { 366 | "data": { 367 | "image/png": "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\n", 368 | "text/plain": [ 369 | "
" 370 | ] 371 | }, 372 | "metadata": { 373 | "needs_background": "dark" 374 | }, 375 | "output_type": "display_data" 376 | } 377 | ], 378 | "source": [ 379 | "age = df[\"age\"].to_numpy()\n", 380 | "experience = df[\"experience (years)\"].to_numpy()\n", 381 | "plt.scatter(age, experience)\n", 382 | "plt.xlabel(\"Age\")\n", 383 | "plt.ylabel(\"Experience\")\n", 384 | "\n", 385 | "#### Plot axes, labels, etc.\n", 386 | "ax = plt.gca()\n", 387 | "ax.xaxis.set_major_locator(ticker.MultipleLocator(5))\n", 388 | "ax.yaxis.set_major_locator(ticker.MultipleLocator(5))\n", 389 | "plt.axhline(0, c='#a9a9a9', zorder=1)\n", 390 | "plt.axvline(0, c='#a9a9a9', zorder=1)\n", 391 | "plt.show()" 392 | ] 393 | }, 394 | { 395 | "cell_type": "markdown", 396 | "metadata": {}, 397 | "source": [ 398 | "## 1.2 Matrices and Tensors\n", 399 | "\n", 400 | "As vectors, in data science, you can consider *matrices* as a way to store data: they are arrays of numbers organized as row and columns. Let's take an example:\n", 401 | "\n", 402 | "$$\n", 403 | "\\mA = \n", 404 | "\\begin{bmatrix}\n", 405 | "1 & 0 \\\\\\\\\n", 406 | "2 & 3\n", 407 | "\\end{bmatrix}\n", 408 | "$$\n", 409 | "\n", 410 | "- Any number of rows and columns\n", 411 | "\n", 412 | "\n", 413 | "- In Numpy, matrices are called *two-dimensional arrays*. Let's create one:" 414 | ] 415 | }, 416 | { 417 | "cell_type": "code", 418 | "execution_count": 125, 419 | "metadata": {}, 420 | "outputs": [], 421 | "source": [ 422 | "A = np.array([[2.1, 7.9, 8.4],\n", 423 | " [3.0, 4.5, 2.3],\n", 424 | " [12.2, 6.6, 8.9],\n", 425 | " [1.8, 1., 8.2]])" 426 | ] 427 | }, 428 | { 429 | "cell_type": "code", 430 | "execution_count": 126, 431 | "metadata": {}, 432 | "outputs": [ 433 | { 434 | "data": { 435 | "text/plain": [ 436 | "array([[ 2.1, 7.9, 8.4],\n", 437 | " [ 3. , 4.5, 2.3],\n", 438 | " [12.2, 6.6, 8.9],\n", 439 | " [ 1.8, 1. , 8.2]])" 440 | ] 441 | }, 442 | "execution_count": 126, 443 | "metadata": {}, 444 | "output_type": "execute_result" 445 | } 446 | ], 447 | "source": [ 448 | "A" 449 | ] 450 | }, 451 | { 452 | "cell_type": "markdown", 453 | "metadata": {}, 454 | "source": [ 455 | "- Note the two pairs of square brackets (`[[]]`)." 456 | ] 457 | }, 458 | { 459 | "cell_type": "markdown", 460 | "metadata": {}, 461 | "source": [ 462 | "### Shape\n", 463 | "\n", 464 | "- It is important to check the shape of the arrays you manipulate.\n", 465 | "\n", 466 | "\n", 467 | "- By convention, the first number corresponds to the rows and the second number to the columns.\n" 468 | ] 469 | }, 470 | { 471 | "cell_type": "code", 472 | "execution_count": 127, 473 | "metadata": {}, 474 | "outputs": [ 475 | { 476 | "data": { 477 | "text/plain": [ 478 | "(4, 3)" 479 | ] 480 | }, 481 | "execution_count": 127, 482 | "metadata": {}, 483 | "output_type": "execute_result" 484 | } 485 | ], 486 | "source": [ 487 | "A.shape" 488 | ] 489 | }, 490 | { 491 | "cell_type": "markdown", 492 | "metadata": {}, 493 | "source": [ 494 | "### Indexing\n", 495 | "\n", 496 | "As with vectors, you can get components of the matrix using indexing.\n", 497 | "\n", 498 | "\n", 499 | "- You'll need to indexes (one for the row index, and one for the column index):" 500 | ] 501 | }, 502 | { 503 | "cell_type": "code", 504 | "execution_count": 23, 505 | "metadata": { 506 | "scrolled": true 507 | }, 508 | "outputs": [ 509 | { 510 | "data": { 511 | "text/plain": [ 512 | "2.3" 513 | ] 514 | }, 515 | "execution_count": 23, 516 | "metadata": {}, 517 | "output_type": "execute_result" 518 | } 519 | ], 520 | "source": [ 521 | "A[1, 2]" 522 | ] 523 | }, 524 | { 525 | "cell_type": "markdown", 526 | "metadata": {}, 527 | "source": [ 528 | "`A[1, 2]` returns the component with the row index one and the column index two (with a zero-based indexing).\n", 529 | "\n", 530 | "- Colon means from the first to the last index:" 531 | ] 532 | }, 533 | { 534 | "cell_type": "code", 535 | "execution_count": 24, 536 | "metadata": {}, 537 | "outputs": [ 538 | { 539 | "data": { 540 | "text/plain": [ 541 | "array([ 2.1, 3. , 12.2, 1.8])" 542 | ] 543 | }, 544 | "execution_count": 24, 545 | "metadata": {}, 546 | "output_type": "execute_result" 547 | } 548 | ], 549 | "source": [ 550 | "A[:, 0]" 551 | ] 552 | }, 553 | { 554 | "cell_type": "code", 555 | "execution_count": 25, 556 | "metadata": {}, 557 | "outputs": [ 558 | { 559 | "data": { 560 | "text/plain": [ 561 | "array([3. , 4.5, 2.3])" 562 | ] 563 | }, 564 | "execution_count": 25, 565 | "metadata": {}, 566 | "output_type": "execute_result" 567 | } 568 | ], 569 | "source": [ 570 | "A[1, :]" 571 | ] 572 | }, 573 | { 574 | "cell_type": "markdown", 575 | "metadata": {}, 576 | "source": [ 577 | "- Use lists (or other Numpy arrays):" 578 | ] 579 | }, 580 | { 581 | "cell_type": "code", 582 | "execution_count": 26, 583 | "metadata": {}, 584 | "outputs": [ 585 | { 586 | "data": { 587 | "text/plain": [ 588 | "array([7.9, 6.6])" 589 | ] 590 | }, 591 | "execution_count": 26, 592 | "metadata": {}, 593 | "output_type": "execute_result" 594 | } 595 | ], 596 | "source": [ 597 | "A[[0, 2], 1]" 598 | ] 599 | }, 600 | { 601 | "cell_type": "code", 602 | "execution_count": 128, 603 | "metadata": {}, 604 | "outputs": [ 605 | { 606 | "data": { 607 | "text/plain": [ 608 | "array([2.1, 3. ])" 609 | ] 610 | }, 611 | "execution_count": 128, 612 | "metadata": {}, 613 | "output_type": "execute_result" 614 | } 615 | ], 616 | "source": [ 617 | "A[:2, 0]" 618 | ] 619 | }, 620 | { 621 | "cell_type": "markdown", 622 | "metadata": {}, 623 | "source": [ 624 | "### Tensors\n", 625 | "\n", 626 | "You can create data structures with more than two directions: in the context of data science, this is called tensors. *Tensors* are multi-dimensional arrays. Scalars, vectors, and matrices are also tensors with specific *rank* (the number of dimensions):\n", 627 | "\n", 628 | "\n", 629 | "Scalars, vectors, matrices and tensors.\n", 630 | "\n", 631 | "- Example 1: store color images:\n", 632 | "\n", 633 | "\n", 634 | "Illustration of the pixels of an image.\n", 635 | "\n", 636 | "You can store these pixel values in a three-dimensional Numpy array, that is, a *rank-3* tensor.\n", 637 | "\n", 638 | "- Example 2: rank-4 tensor with batch of images. Load the CIFAR dataset using keras, here is what you get:" 639 | ] 640 | }, 641 | { 642 | "cell_type": "code", 643 | "execution_count": 61, 644 | "metadata": {}, 645 | "outputs": [], 646 | "source": [ 647 | "from keras.datasets import cifar10\n", 648 | "\n", 649 | "(X_train, y_train), (X_test, y_test) = cifar10.load_data()\n" 650 | ] 651 | }, 652 | { 653 | "cell_type": "code", 654 | "execution_count": 62, 655 | "metadata": {}, 656 | "outputs": [ 657 | { 658 | "data": { 659 | "text/plain": [ 660 | "(50000, 32, 32, 3)" 661 | ] 662 | }, 663 | "execution_count": 62, 664 | "metadata": {}, 665 | "output_type": "execute_result" 666 | } 667 | ], 668 | "source": [ 669 | "X_train.shape" 670 | ] 671 | }, 672 | { 673 | "cell_type": "markdown", 674 | "metadata": {}, 675 | "source": [ 676 | "## 1.3 Exercises" 677 | ] 678 | }, 679 | { 680 | "cell_type": "markdown", 681 | "metadata": {}, 682 | "source": [ 683 | "1. Create a matrix of shape (4, 3) and check its shape. You can fill it with any numbers.\n", 684 | "\n", 685 | "
\n", 686 | " Click to see a solution!\n", 687 | "
\n",
 688 |     "      B = np.zeros((4, 3))\n",
 689 |     "      B.shape\n",
 690 |     "  
\n", 691 | "
" 692 | ] 693 | }, 694 | { 695 | "cell_type": "markdown", 696 | "metadata": {}, 697 | "source": [ 698 | "2. Take the following matrix:" 699 | ] 700 | }, 701 | { 702 | "cell_type": "code", 703 | "execution_count": 37, 704 | "metadata": {}, 705 | "outputs": [ 706 | { 707 | "data": { 708 | "text/plain": [ 709 | "array([[66, 92, 98],\n", 710 | " [17, 83, 57],\n", 711 | " [86, 97, 96]])" 712 | ] 713 | }, 714 | "execution_count": 37, 715 | "metadata": {}, 716 | "output_type": "execute_result" 717 | } 718 | ], 719 | "source": [ 720 | "np.random.seed(123)\n", 721 | "B = np.random.randint(0, 100, (3, 3))\n", 722 | "B" 723 | ] 724 | }, 725 | { 726 | "cell_type": "markdown", 727 | "metadata": {}, 728 | "source": [ 729 | "Index the matrix $B$ to get the following values:\n", 730 | "\n", 731 | "- the last column\n", 732 | "\n", 733 | "
\n", 734 | " Click to see a solution!\n", 735 | "
\n",
 736 |     "B[:, -1]\n",
 737 |     "    
\n", 738 | "
\n", 739 | "\n", 740 | "- the first two rows\n", 741 | "\n", 742 | "
\n", 743 | " Click to see a solution!\n", 744 | "
\n",
 745 |     "B[:2, :]\n",
 746 |     "    
\n", 747 | "
\n", 748 | "\n", 749 | "- 17 and 57\n", 750 | "\n", 751 | "
\n", 752 | " Click to see a solution!\n", 753 | "
\n",
 754 |     "B[1, [0, 2]]\n",
 755 |     "    
\n", 756 | "
" 757 | ] 758 | }, 759 | { 760 | "cell_type": "code", 761 | "execution_count": null, 762 | "metadata": {}, 763 | "outputs": [], 764 | "source": [] 765 | }, 766 | { 767 | "cell_type": "code", 768 | "execution_count": null, 769 | "metadata": {}, 770 | "outputs": [], 771 | "source": [] 772 | }, 773 | { 774 | "cell_type": "code", 775 | "execution_count": null, 776 | "metadata": {}, 777 | "outputs": [], 778 | "source": [] 779 | }, 780 | { 781 | "cell_type": "markdown", 782 | "metadata": {}, 783 | "source": [ 784 | "## 2. Operations on Vectors and Matrices\n", 785 | "\n", 786 | "In this part, you'll see how to operate on vectors and matrices.\n" 787 | ] 788 | }, 789 | { 790 | "cell_type": "markdown", 791 | "metadata": {}, 792 | "source": [ 793 | "### 2.1 Scalar Multiplication\n", 794 | "\n", 795 | "Scalar multiplication is the multiplication of a vector by a scalar: you get a new vector that is a scaled version of the initial one.\n", 796 | "\n", 797 | "- Example: $\\vv$ multiplied by the scalar -2:\n", 798 | "\n", 799 | "$$\n", 800 | "\\vv = \\begin{bmatrix}\n", 801 | "3 \\\\\\\\\n", 802 | "2\n", 803 | "\\end{bmatrix}\n", 804 | "$$\n", 805 | "\n", 806 | "\n", 807 | "$$\n", 808 | "\\vw = -2\\vv = -2 \\begin{bmatrix}\n", 809 | "3 \\\\\\\\\n", 810 | "2\n", 811 | "\\end{bmatrix} = \n", 812 | "\\begin{bmatrix}\n", 813 | "-2 \\cdot 3 \\\\\\\\\n", 814 | "-2 \\cdot 2\n", 815 | "\\end{bmatrix} =\n", 816 | "\\begin{bmatrix}\n", 817 | "-6 \\\\\\\\\n", 818 | "-4\n", 819 | "\\end{bmatrix}\n", 820 | "$$\n", 821 | "\n", 822 | "- Let's do this operation with Numpy and plot the initial vector $\\vv$ and the resulting vector $\\vw$:" 823 | ] 824 | }, 825 | { 826 | "cell_type": "code", 827 | "execution_count": 79, 828 | "metadata": {}, 829 | "outputs": [ 830 | { 831 | "data": { 832 | "image/png": "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\n", 833 | "text/plain": [ 834 | "
" 835 | ] 836 | }, 837 | "metadata": { 838 | "needs_background": "dark" 839 | }, 840 | "output_type": "display_data" 841 | } 842 | ], 843 | "source": [ 844 | "v = np.array([3, 2])\n", 845 | "w = -2 * v\n", 846 | "\n", 847 | "plt.quiver(0, 0, v[0], v[1], angles='xy', scale_units='xy', scale=1, color='#2EBCE7')\n", 848 | "plt.quiver(0, 0, w[0], w[1], angles='xy', scale_units='xy', scale=1, color='#84EE29')\n", 849 | "\n", 850 | "#### Plot axes, labels, etc.\n", 851 | "ax = plt.gca()\n", 852 | "ax.xaxis.set_major_locator(ticker.MultipleLocator(2))\n", 853 | "ax.yaxis.set_major_locator(ticker.MultipleLocator(2))\n", 854 | "plt.axhline(0, c='#a9a9a9', zorder=1)\n", 855 | "plt.axvline(0, c='#a9a9a9', zorder=1)\n", 856 | "plt.xlim(-7, 7)\n", 857 | "plt.ylim(-7, 7)\n", 858 | "plt.show()" 859 | ] 860 | }, 861 | { 862 | "cell_type": "markdown", 863 | "metadata": {}, 864 | "source": [ 865 | "- The initial vector (in blue) and the scaled vectors (in green) are both are on the same line.\n" 866 | ] 867 | }, 868 | { 869 | "cell_type": "markdown", 870 | "metadata": {}, 871 | "source": [ 872 | "#### Matrices\n", 873 | "\n", 874 | "$$\n", 875 | "c \\cdot\n", 876 | "\\begin{bmatrix}\n", 877 | "A_{1,1} & A_{1,2} \\\\\\\\\n", 878 | "A_{2,1} & A_{2,2} \\\\\\\\\n", 879 | "A_{3,1} & A_{3,2}\n", 880 | "\\end{bmatrix}\n", 881 | "= \\begin{bmatrix} \n", 882 | "c \\cdot A_{1,1} & c \\cdot A_{1,2} \\\\\\\\\n", 883 | "c \\cdot A_{2,1} & c \\cdot A_{2,2} \\\\\\\\\n", 884 | "c \\cdot A_{3,1} & c \\cdot A_{3,2}\n", 885 | "\\end{bmatrix}\n", 886 | "$$\n" 887 | ] 888 | }, 889 | { 890 | "cell_type": "markdown", 891 | "metadata": {}, 892 | "source": [ 893 | "### 2.2 Addition\n", 894 | "\n", 895 | "Addition of vectors results in another vector.\n", 896 | "\n", 897 | "- For instance, let's add the two vectors:\n", 898 | "\n", 899 | "$$\n", 900 | "\\vu = \\begin{bmatrix}\n", 901 | "1 \\\\\\\\\n", 902 | "2\n", 903 | "\\end{bmatrix}\n", 904 | "$$\n", 905 | "\n", 906 | "and \n", 907 | "\n", 908 | "$$\n", 909 | "\\vv = \\begin{bmatrix}\n", 910 | "5 \\\\\\\\\n", 911 | "2\n", 912 | "\\end{bmatrix}\n", 913 | "$$\n", 914 | "\n", 915 | "$$\n", 916 | "\\vw = \\vu + \\vv = \n", 917 | "\\begin{bmatrix}\n", 918 | "1 \\\\\\\\\n", 919 | "2\n", 920 | "\\end{bmatrix} + \\begin{bmatrix}\n", 921 | "5 \\\\\\\\\n", 922 | "2\n", 923 | "\\end{bmatrix} =\n", 924 | "\\begin{bmatrix}\n", 925 | "1 + 5 \\\\\\\\\n", 926 | "2 + 2\n", 927 | "\\end{bmatrix} = \n", 928 | "\\begin{bmatrix}\n", 929 | "6 \\\\\\\\\n", 930 | "4\n", 931 | "\\end{bmatrix}\n", 932 | "$$\n", 933 | "\n", 934 | "- Add each component with the same index\n", 935 | "\n", 936 | "\n", 937 | "- Now with Numpy:" 938 | ] 939 | }, 940 | { 941 | "cell_type": "code", 942 | "execution_count": 100, 943 | "metadata": {}, 944 | "outputs": [ 945 | { 946 | "data": { 947 | "text/plain": [ 948 | "array([6, 4])" 949 | ] 950 | }, 951 | "execution_count": 100, 952 | "metadata": {}, 953 | "output_type": "execute_result" 954 | } 955 | ], 956 | "source": [ 957 | "u = np.array([1, 2])\n", 958 | "v = np.array([5, 2])\n", 959 | "\n", 960 | "w = u + v\n", 961 | "w" 962 | ] 963 | }, 964 | { 965 | "cell_type": "markdown", 966 | "metadata": {}, 967 | "source": [ 968 | "- Plot of the vectors:" 969 | ] 970 | }, 971 | { 972 | "cell_type": "code", 973 | "execution_count": 83, 974 | "metadata": {}, 975 | "outputs": [ 976 | { 977 | "data": { 978 | "image/png": "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\n", 979 | "text/plain": [ 980 | "
" 981 | ] 982 | }, 983 | "metadata": { 984 | "needs_background": "dark" 985 | }, 986 | "output_type": "display_data" 987 | } 988 | ], 989 | "source": [ 990 | "plt.quiver(0, 0, u[0], u[1], angles='xy', scale_units='xy', scale=1, color='#2EBCE7')\n", 991 | "plt.quiver(0, 0, v[0], v[1], angles='xy', scale_units='xy', scale=1, color='#2EBCE7')\n", 992 | "plt.quiver(0, 0, w[0], w[1], angles='xy', scale_units='xy', scale=1, color='#84EE29')\n", 993 | "\n", 994 | "#### Plot axes, labels, etc.\n", 995 | "ax = plt.gca()\n", 996 | "ax.xaxis.set_major_locator(ticker.MultipleLocator(2))\n", 997 | "ax.yaxis.set_major_locator(ticker.MultipleLocator(2))\n", 998 | "plt.axhline(0, c='#a9a9a9', zorder=1)\n", 999 | "plt.axvline(0, c='#a9a9a9', zorder=1)\n", 1000 | "plt.xlim(-7, 7)\n", 1001 | "plt.ylim(-7, 7)\n", 1002 | "plt.show()" 1003 | ] 1004 | }, 1005 | { 1006 | "cell_type": "markdown", 1007 | "metadata": {}, 1008 | "source": [ 1009 | "#### Matrices\n", 1010 | "\n", 1011 | "\n", 1012 | "Addition of two matrices." 1013 | ] 1014 | }, 1015 | { 1016 | "cell_type": "markdown", 1017 | "metadata": {}, 1018 | "source": [ 1019 | "#### Broadcasting" 1020 | ] 1021 | }, 1022 | { 1023 | "cell_type": "code", 1024 | "execution_count": 135, 1025 | "metadata": {}, 1026 | "outputs": [], 1027 | "source": [ 1028 | "A = np.array([[2, 7],\n", 1029 | " [3, 4],\n", 1030 | " [8, 2]])" 1031 | ] 1032 | }, 1033 | { 1034 | "cell_type": "code", 1035 | "execution_count": 136, 1036 | "metadata": {}, 1037 | "outputs": [ 1038 | { 1039 | "data": { 1040 | "text/plain": [ 1041 | "(3, 2)" 1042 | ] 1043 | }, 1044 | "execution_count": 136, 1045 | "metadata": {}, 1046 | "output_type": "execute_result" 1047 | } 1048 | ], 1049 | "source": [ 1050 | "A.shape" 1051 | ] 1052 | }, 1053 | { 1054 | "cell_type": "code", 1055 | "execution_count": 137, 1056 | "metadata": {}, 1057 | "outputs": [], 1058 | "source": [ 1059 | "B = np.array([[7],\n", 1060 | " [1],\n", 1061 | " [3]])" 1062 | ] 1063 | }, 1064 | { 1065 | "cell_type": "code", 1066 | "execution_count": 138, 1067 | "metadata": {}, 1068 | "outputs": [ 1069 | { 1070 | "data": { 1071 | "text/plain": [ 1072 | "(3, 1)" 1073 | ] 1074 | }, 1075 | "execution_count": 138, 1076 | "metadata": {}, 1077 | "output_type": "execute_result" 1078 | } 1079 | ], 1080 | "source": [ 1081 | "B.shape" 1082 | ] 1083 | }, 1084 | { 1085 | "cell_type": "code", 1086 | "execution_count": 139, 1087 | "metadata": { 1088 | "scrolled": true 1089 | }, 1090 | "outputs": [ 1091 | { 1092 | "data": { 1093 | "text/plain": [ 1094 | "array([[ 9, 14],\n", 1095 | " [ 4, 5],\n", 1096 | " [11, 5]])" 1097 | ] 1098 | }, 1099 | "execution_count": 139, 1100 | "metadata": {}, 1101 | "output_type": "execute_result" 1102 | } 1103 | ], 1104 | "source": [ 1105 | "A + B" 1106 | ] 1107 | }, 1108 | { 1109 | "cell_type": "code", 1110 | "execution_count": 140, 1111 | "metadata": {}, 1112 | "outputs": [ 1113 | { 1114 | "data": { 1115 | "text/plain": [ 1116 | "(3, 2)" 1117 | ] 1118 | }, 1119 | "execution_count": 140, 1120 | "metadata": {}, 1121 | "output_type": "execute_result" 1122 | } 1123 | ], 1124 | "source": [ 1125 | "(A + B).shape" 1126 | ] 1127 | }, 1128 | { 1129 | "cell_type": "markdown", 1130 | "metadata": {}, 1131 | "source": [ 1132 | "### 2.3 Transposition\n", 1133 | "\n", 1134 | "#### Vectors\n", 1135 | "\n", 1136 | "You can distinguish *row vectors* from *column vectors*. Transposition converts rows vectors into column vectors and column vectors into rows vectors.\n", 1137 | "\n", 1138 | "$$\n", 1139 | "\\begin{bmatrix}\n", 1140 | "2 \\\\\\\\\n", 1141 | "5\n", 1142 | "\\end{bmatrix}^\\text{T}\n", 1143 | "=\n", 1144 | "\\begin{bmatrix}\n", 1145 | "2 & 5\n", 1146 | "\\end{bmatrix}\n", 1147 | "$$\n", 1148 | "\n", 1149 | "- Note: With Numpy, one-dimensional array can't be transpose:\n" 1150 | ] 1151 | }, 1152 | { 1153 | "cell_type": "code", 1154 | "execution_count": 85, 1155 | "metadata": {}, 1156 | "outputs": [ 1157 | { 1158 | "data": { 1159 | "text/plain": [ 1160 | "array([2, 5])" 1161 | ] 1162 | }, 1163 | "execution_count": 85, 1164 | "metadata": {}, 1165 | "output_type": "execute_result" 1166 | } 1167 | ], 1168 | "source": [ 1169 | "v = np.array([2, 5])\n", 1170 | "v" 1171 | ] 1172 | }, 1173 | { 1174 | "cell_type": "code", 1175 | "execution_count": 86, 1176 | "metadata": {}, 1177 | "outputs": [ 1178 | { 1179 | "data": { 1180 | "text/plain": [ 1181 | "array([2, 5])" 1182 | ] 1183 | }, 1184 | "execution_count": 86, 1185 | "metadata": {}, 1186 | "output_type": "execute_result" 1187 | } 1188 | ], 1189 | "source": [ 1190 | "v.T" 1191 | ] 1192 | }, 1193 | { 1194 | "cell_type": "markdown", 1195 | "metadata": {}, 1196 | "source": [ 1197 | "#### Matrices\n" 1198 | ] 1199 | }, 1200 | { 1201 | "cell_type": "markdown", 1202 | "metadata": {}, 1203 | "source": [ 1204 | "\n", 1205 | "Matrix transposition" 1206 | ] 1207 | }, 1208 | { 1209 | "cell_type": "code", 1210 | "execution_count": 101, 1211 | "metadata": {}, 1212 | "outputs": [ 1213 | { 1214 | "data": { 1215 | "text/plain": [ 1216 | "array([[ 2.1, 3. , 12.2, 1.8],\n", 1217 | " [ 7.9, 4.5, 6.6, 1.3],\n", 1218 | " [ 8.4, 2.1, 8.9, 8.2]])" 1219 | ] 1220 | }, 1221 | "execution_count": 101, 1222 | "metadata": {}, 1223 | "output_type": "execute_result" 1224 | } 1225 | ], 1226 | "source": [ 1227 | "A = np.array([[2.1, 7.9, 8.4],\n", 1228 | " [3.0, 4.5, 2.1],\n", 1229 | " [12.2, 6.6, 8.9],\n", 1230 | " [1.8, 1.3, 8.2]])\n", 1231 | "A.T" 1232 | ] 1233 | }, 1234 | { 1235 | "cell_type": "markdown", 1236 | "metadata": {}, 1237 | "source": [ 1238 | "### 2.4 Exercises\n", 1239 | "\n", 1240 | "Implement vector operations from mathematical notation.\n", 1241 | "\n", 1242 | "You'll use the following vectors and matrices:" 1243 | ] 1244 | }, 1245 | { 1246 | "cell_type": "code", 1247 | "execution_count": 84, 1248 | "metadata": {}, 1249 | "outputs": [], 1250 | "source": [ 1251 | "u = np.array([3, 1])\n", 1252 | "v = np.array([4, -2])\n", 1253 | "w = np.array([-5, 3])\n", 1254 | "\n", 1255 | "A = np.array([[7.2, 4.8, 9.1, 2.5, 1.4],\n", 1256 | " [1.2, 0.3, 1, 5.4, 3.3]])\n", 1257 | "B = np.array([[1.1, 3.4],\n", 1258 | " [4.5, 4.3]])" 1259 | ] 1260 | }, 1261 | { 1262 | "cell_type": "markdown", 1263 | "metadata": {}, 1264 | "source": [ 1265 | "- $2 \\vu + 3 \\vv - \\vw$\n", 1266 | "\n", 1267 | "
\n", 1268 | " Click to see a solution!\n", 1269 | "
\n",
1270 |     "2 * u + 3 * v - w\n",
1271 |     "    
\n", 1272 | "
" 1273 | ] 1274 | }, 1275 | { 1276 | "cell_type": "markdown", 1277 | "metadata": {}, 1278 | "source": [ 1279 | "- $(BA)^{\\text{T}}$\n", 1280 | "\n", 1281 | "
\n", 1282 | " Click to see a solution!\n", 1283 | "
\n",
1284 |     "(B @ A).T\n",
1285 |     "    
\n", 1286 | "
" 1287 | ] 1288 | }, 1289 | { 1290 | "cell_type": "code", 1291 | "execution_count": null, 1292 | "metadata": {}, 1293 | "outputs": [], 1294 | "source": [] 1295 | }, 1296 | { 1297 | "cell_type": "code", 1298 | "execution_count": null, 1299 | "metadata": {}, 1300 | "outputs": [], 1301 | "source": [] 1302 | }, 1303 | { 1304 | "cell_type": "code", 1305 | "execution_count": null, 1306 | "metadata": {}, 1307 | "outputs": [], 1308 | "source": [] 1309 | }, 1310 | { 1311 | "cell_type": "markdown", 1312 | "metadata": {}, 1313 | "source": [ 1314 | "## 3. Norms\n", 1315 | "\n", 1316 | "In machine learning, it is crucial to compare vectors, like for instance to evaluate the error of a model (you compare a vector of estimated values with a vector of true values).\n", 1317 | "\n", 1318 | "- Norms associate a single number to a vector.\n", 1319 | "\n", 1320 | "\n", 1321 | "- The norm of a vector $u$ is denoted as $\\norm{\\vu}$.\n", 1322 | "\n", 1323 | "\n", 1324 | "- Distance between two vectors.\n" 1325 | ] 1326 | }, 1327 | { 1328 | "cell_type": "markdown", 1329 | "metadata": {}, 1330 | "source": [ 1331 | "- There are different ways to calculate distances, so there are different norms. More generally, a mathematical entity can be called a norm only if:\n", 1332 | "\n", 1333 | "1. Non-Negativity.\n", 1334 | "2. Zero-Vector Norm.\n", 1335 | "3. Scalar Multiplication: $\\norm{k \\cdot \\vu} = \\left| k \\right| \\cdot \\norm{\\vu}$.\n", 1336 | "4. Triangle Inequality: $\\norm{\\vu + \\vv} \\leq \\norm{\\vu} + \\norm{\\vv}$.\n", 1337 | "\n", 1338 | "\n", 1339 | "Illustration of the triangle inequality." 1340 | ] 1341 | }, 1342 | { 1343 | "cell_type": "markdown", 1344 | "metadata": {}, 1345 | "source": [ 1346 | "### 3.1 $L^1$\n", 1347 | "\n", 1348 | "- Lasso regression when $L^1$ is used as regularization.\n", 1349 | "- The equivalent loss function is Mean Absolute Error (MAE).\n", 1350 | "\n", 1351 | "$$\n", 1352 | "\\norm{\\vu}_1 = \\sum_{i=1}^m \\left| u_i \\right|\n", 1353 | "$$\n", 1354 | "\n", 1355 | "with $\\vu$ the vector, $m$ its number of components, and $i$ the index of current component.\n", 1356 | "\n", 1357 | "- With Numpy:" 1358 | ] 1359 | }, 1360 | { 1361 | "cell_type": "code", 1362 | "execution_count": 141, 1363 | "metadata": {}, 1364 | "outputs": [ 1365 | { 1366 | "data": { 1367 | "text/plain": [ 1368 | "3.0" 1369 | ] 1370 | }, 1371 | "execution_count": 141, 1372 | "metadata": {}, 1373 | "output_type": "execute_result" 1374 | } 1375 | ], 1376 | "source": [ 1377 | "u = np.array([2, 1])\n", 1378 | "np.linalg.norm(u, ord=1)" 1379 | ] 1380 | }, 1381 | { 1382 | "cell_type": "markdown", 1383 | "metadata": {}, 1384 | "source": [ 1385 | "### 3.2 $L^2$\n", 1386 | "\n", 1387 | "- Ridge regression when $L^2$ is used as regularization.\n", 1388 | "- The equivalent loss function is the Mean Squared Error (MSE).\n", 1389 | "- Corresponds to physical distance.\n", 1390 | "\n", 1391 | "$$\n", 1392 | "\\norm{\\vu}_2 = \\sqrt{\\sum_{i=1}^m u_i^2}\n", 1393 | "$$\n", 1394 | "\n", 1395 | "with $\\vu$ the vector, $m$ its number of components, and $i$ the index of current component.\n", 1396 | "\n", 1397 | "- With Numpy:" 1398 | ] 1399 | }, 1400 | { 1401 | "cell_type": "code", 1402 | "execution_count": 87, 1403 | "metadata": {}, 1404 | "outputs": [ 1405 | { 1406 | "data": { 1407 | "text/plain": [ 1408 | "2.23606797749979" 1409 | ] 1410 | }, 1411 | "execution_count": 87, 1412 | "metadata": {}, 1413 | "output_type": "execute_result" 1414 | } 1415 | ], 1416 | "source": [ 1417 | "u = np.array([2, 1])\n", 1418 | "np.linalg.norm(u, ord=2)" 1419 | ] 1420 | }, 1421 | { 1422 | "cell_type": "markdown", 1423 | "metadata": {}, 1424 | "source": [ 1425 | "### 3.3 Squared $L^2$\n", 1426 | "\n", 1427 | "$$\n", 1428 | "\\norm{\\vu}_2^2 = \\sum_{i=1}^m u_i^2\n", 1429 | "$$\n", 1430 | "\n", 1431 | "with $\\vu$ the vector, $m$ its number of components, and $i$ the index of current component.\n", 1432 | "\n", 1433 | "- Advantageous for computation reasons.\n", 1434 | "\n", 1435 | "\n", 1436 | "- Possible to calculate using the dot product of a vector with itself:\n" 1437 | ] 1438 | }, 1439 | { 1440 | "cell_type": "code", 1441 | "execution_count": 107, 1442 | "metadata": {}, 1443 | "outputs": [ 1444 | { 1445 | "data": { 1446 | "text/plain": [ 1447 | "5.000000000000001" 1448 | ] 1449 | }, 1450 | "execution_count": 107, 1451 | "metadata": {}, 1452 | "output_type": "execute_result" 1453 | } 1454 | ], 1455 | "source": [ 1456 | "np.linalg.norm(u, ord=2) ** 2" 1457 | ] 1458 | }, 1459 | { 1460 | "cell_type": "code", 1461 | "execution_count": 108, 1462 | "metadata": {}, 1463 | "outputs": [ 1464 | { 1465 | "data": { 1466 | "text/plain": [ 1467 | "5" 1468 | ] 1469 | }, 1470 | "execution_count": 108, 1471 | "metadata": {}, 1472 | "output_type": "execute_result" 1473 | } 1474 | ], 1475 | "source": [ 1476 | "u @ u" 1477 | ] 1478 | }, 1479 | { 1480 | "cell_type": "markdown", 1481 | "metadata": {}, 1482 | "source": [ 1483 | "### 3.3 Exercise\n", 1484 | "\n", 1485 | "Let's say you have some data corresponding to the prices of apartments. You built two models to predict the price from various features. The vector `y` contains the true prices of the apartment. The vector `y_hat_first_model` contains the estimated prices obtained from the first model and `y_hat_second_model` the estimated prices from the second model." 1486 | ] 1487 | }, 1488 | { 1489 | "cell_type": "code", 1490 | "execution_count": 93, 1491 | "metadata": {}, 1492 | "outputs": [], 1493 | "source": [ 1494 | "y = np.array([110, 1200, 650, 300, 420])\n", 1495 | "y_hat_first_model = np.array([90, 1000, 620, 330, 340])\n", 1496 | "y_hat_second_model = np.array([100, 1260, 600, 320, 440])\n" 1497 | ] 1498 | }, 1499 | { 1500 | "cell_type": "markdown", 1501 | "metadata": {}, 1502 | "source": [ 1503 | "Which model is better?\n", 1504 | "\n", 1505 | "Use the $L^2$ norm to calculate the distance between the true and the estimated prices for the two models.\n" 1506 | ] 1507 | }, 1508 | { 1509 | "cell_type": "markdown", 1510 | "metadata": {}, 1511 | "source": [ 1512 | "
\n", 1513 | " Click to see a solution!\n", 1514 | "
\n",
1515 |     "error_first_model = y - y_hat_first_model\n",
1516 |     "error_second_model = y - y_hat_second_model\n",
1517 |     "np.linalg.norm(error_first_model, ord=2)\n",
1518 |     "np.linalg.norm(error_second_model, ord=2)\n",
1519 |     "    
\n", 1520 | " You can deduce that the second model is better than the first because the error, calculated as the distance between the true prices and the estimated prices, is lower.\n", 1521 | "
" 1522 | ] 1523 | }, 1524 | { 1525 | "cell_type": "code", 1526 | "execution_count": 143, 1527 | "metadata": {}, 1528 | "outputs": [ 1529 | { 1530 | "data": { 1531 | "text/plain": [ 1532 | "220.45407685048602" 1533 | ] 1534 | }, 1535 | "execution_count": 143, 1536 | "metadata": {}, 1537 | "output_type": "execute_result" 1538 | } 1539 | ], 1540 | "source": [ 1541 | "error_first_model = y - y_hat_first_model\n", 1542 | "error_second_model = y - y_hat_second_model\n", 1543 | "\n", 1544 | "np.linalg.norm(error_first_model, ord=2)\n" 1545 | ] 1546 | }, 1547 | { 1548 | "cell_type": "code", 1549 | "execution_count": 144, 1550 | "metadata": {}, 1551 | "outputs": [ 1552 | { 1553 | "data": { 1554 | "text/plain": [ 1555 | "83.66600265340756" 1556 | ] 1557 | }, 1558 | "execution_count": 144, 1559 | "metadata": {}, 1560 | "output_type": "execute_result" 1561 | } 1562 | ], 1563 | "source": [ 1564 | "np.linalg.norm(error_second_model, ord=2)" 1565 | ] 1566 | }, 1567 | { 1568 | "cell_type": "code", 1569 | "execution_count": null, 1570 | "metadata": {}, 1571 | "outputs": [], 1572 | "source": [] 1573 | }, 1574 | { 1575 | "cell_type": "markdown", 1576 | "metadata": {}, 1577 | "source": [ 1578 | "## 4. The Dot Product\n", 1579 | "\n", 1580 | "The *dot product* is an operation that takes two vectors and returns a scalar. It is an example of a more general operation named the *inner product*.\n", 1581 | "\n", 1582 | "\n", 1583 | "Illustration of the dot product.\n", 1584 | "\n", 1585 | "- It is the sum of products of the components with the same index" 1586 | ] 1587 | }, 1588 | { 1589 | "cell_type": "markdown", 1590 | "metadata": {}, 1591 | "source": [ 1592 | "$$\n", 1593 | "\\vu \\cdot \\vv = \\sum_{i=1}^m u_i v_i\n", 1594 | "$$" 1595 | ] 1596 | }, 1597 | { 1598 | "cell_type": "markdown", 1599 | "metadata": {}, 1600 | "source": [ 1601 | "- With Numpy, you can use the following syntax to calculate the dot product of vectors:" 1602 | ] 1603 | }, 1604 | { 1605 | "cell_type": "code", 1606 | "execution_count": 152, 1607 | "metadata": {}, 1608 | "outputs": [ 1609 | { 1610 | "data": { 1611 | "text/plain": [ 1612 | "32" 1613 | ] 1614 | }, 1615 | "execution_count": 152, 1616 | "metadata": {}, 1617 | "output_type": "execute_result" 1618 | } 1619 | ], 1620 | "source": [ 1621 | "u = np.array([1, 2, 3])\n", 1622 | "v = np.array([4, 5, 6])\n", 1623 | "u.dot(v)" 1624 | ] 1625 | }, 1626 | { 1627 | "cell_type": "markdown", 1628 | "metadata": {}, 1629 | "source": [ 1630 | "Or with Python 3.5+:" 1631 | ] 1632 | }, 1633 | { 1634 | "cell_type": "code", 1635 | "execution_count": 153, 1636 | "metadata": {}, 1637 | "outputs": [ 1638 | { 1639 | "data": { 1640 | "text/plain": [ 1641 | "32" 1642 | ] 1643 | }, 1644 | "execution_count": 153, 1645 | "metadata": {}, 1646 | "output_type": "execute_result" 1647 | } 1648 | ], 1649 | "source": [ 1650 | "u @ v" 1651 | ] 1652 | }, 1653 | { 1654 | "cell_type": "markdown", 1655 | "metadata": {}, 1656 | "source": [ 1657 | "#### Calculating the Squared $L^2$ Norm\n", 1658 | "\n", 1659 | "- The dot product of a vector with itself gives you the $L^2$ norm:\n", 1660 | "\n", 1661 | "$$\n", 1662 | "\\vu \\cdot \\vu =\n", 1663 | "\\begin{bmatrix}\n", 1664 | "u_1 \\\\\\\\\n", 1665 | "u_2 \\\\\\\\\n", 1666 | "u_3\n", 1667 | "\\end{bmatrix} \\cdot\n", 1668 | "\\begin{bmatrix}\n", 1669 | "u_1 \\\\\\\\\n", 1670 | "u_2 \\\\\\\\\n", 1671 | "u_3\n", 1672 | "\\end{bmatrix} =\n", 1673 | "u_1^2 + u_2^2 + u_3^2 = \\sum_{i=1}^m u_i^2\n", 1674 | "$$\n" 1675 | ] 1676 | }, 1677 | { 1678 | "cell_type": "markdown", 1679 | "metadata": {}, 1680 | "source": [ 1681 | "#### What is this value?\n", 1682 | "\n", 1683 | "\n", 1684 | "\n", 1685 | "- The dot product corresponds to the length of $\\vv$ multiplied by the length of the projection (the vector $\\vu_{\\text{proj}}$).\n" 1686 | ] 1687 | }, 1688 | { 1689 | "cell_type": "markdown", 1690 | "metadata": {}, 1691 | "source": [ 1692 | "### 4.2 Matrix-Vector Product\n" 1693 | ] 1694 | }, 1695 | { 1696 | "cell_type": "markdown", 1697 | "metadata": {}, 1698 | "source": [ 1699 | "Product of a matrix with a vector:\n", 1700 | "\n", 1701 | "\n", 1702 | "Steps of product between a matrix and a vector.\n", 1703 | "\n", 1704 | "- Take one row, consider it as a vector and do the dot product with the column vector." 1705 | ] 1706 | }, 1707 | { 1708 | "cell_type": "code", 1709 | "execution_count": 145, 1710 | "metadata": {}, 1711 | "outputs": [], 1712 | "source": [ 1713 | "A = np.array([\n", 1714 | " [1, 2],\n", 1715 | " [5, 6],\n", 1716 | " [7, 8]\n", 1717 | "])\n", 1718 | "v = np.array([3, 4])" 1719 | ] 1720 | }, 1721 | { 1722 | "cell_type": "code", 1723 | "execution_count": 146, 1724 | "metadata": {}, 1725 | "outputs": [ 1726 | { 1727 | "data": { 1728 | "text/plain": [ 1729 | "array([11, 39, 53])" 1730 | ] 1731 | }, 1732 | "execution_count": 146, 1733 | "metadata": {}, 1734 | "output_type": "execute_result" 1735 | } 1736 | ], 1737 | "source": [ 1738 | "A @ v" 1739 | ] 1740 | }, 1741 | { 1742 | "cell_type": "markdown", 1743 | "metadata": {}, 1744 | "source": [ 1745 | "- Weighting of the matrix columns with the elements of the vector (I recommend: Strang, G. \"Introduction to linear algebra, 5th edn. Wellesley.\" (2016).):\n", 1746 | "\n", 1747 | "\n", 1748 | "The vectors values are weighting the columns of the matrix.\n" 1749 | ] 1750 | }, 1751 | { 1752 | "cell_type": "markdown", 1753 | "metadata": {}, 1754 | "source": [ 1755 | "### 4.3 Matrix-Matrix Product\n", 1756 | "\n", 1757 | "You can use the same idea to calculate the product of two matrices (if their shapes are allowing it). For instance:\n", 1758 | "\n", 1759 | "\n", 1760 | "Matrix product.\n" 1761 | ] 1762 | }, 1763 | { 1764 | "cell_type": "code", 1765 | "execution_count": 99, 1766 | "metadata": { 1767 | "code_folding": [] 1768 | }, 1769 | "outputs": [ 1770 | { 1771 | "data": { 1772 | "text/plain": [ 1773 | "array([[11, 9],\n", 1774 | " [39, 45],\n", 1775 | " [53, 63]])" 1776 | ] 1777 | }, 1778 | "execution_count": 99, 1779 | "metadata": {}, 1780 | "output_type": "execute_result" 1781 | } 1782 | ], 1783 | "source": [ 1784 | "A = np.array([\n", 1785 | " [1, 2],\n", 1786 | " [5, 6],\n", 1787 | " [7, 8],\n", 1788 | "])\n", 1789 | "B = np.array([\n", 1790 | " [3, 9],\n", 1791 | " [4, 0]\n", 1792 | "])\n", 1793 | "\n", 1794 | "A @ B" 1795 | ] 1796 | }, 1797 | { 1798 | "cell_type": "markdown", 1799 | "metadata": {}, 1800 | "source": [ 1801 | "\n", 1802 | "\n", 1803 | "\n", 1804 | "\n", 1805 | "- Shapes must match for the dot product between two matrices.\n" 1806 | ] 1807 | }, 1808 | { 1809 | "cell_type": "markdown", 1810 | "metadata": {}, 1811 | "source": [ 1812 | "#### Transpose of a Matrix Product\n", 1813 | "\n", 1814 | "The transpose of the dot product between two matrices is equals to:\n", 1815 | "\n", 1816 | "$$\n", 1817 | "(\\mA \\mB)^{\\text{T}} = \\mB^{\\text{T}} \\mA^{\\text{T}}\n", 1818 | "$$\n" 1819 | ] 1820 | }, 1821 | { 1822 | "cell_type": "markdown", 1823 | "metadata": {}, 1824 | "source": [ 1825 | "### 4.3 Exercises\n", 1826 | "\n", 1827 | "Take the following vectors and matrices:" 1828 | ] 1829 | }, 1830 | { 1831 | "cell_type": "code", 1832 | "execution_count": 148, 1833 | "metadata": {}, 1834 | "outputs": [], 1835 | "source": [ 1836 | "A = np.array([\n", 1837 | " [1, 2, 3],\n", 1838 | " [4, 5, 6]\n", 1839 | "])\n", 1840 | "B = np.array([\n", 1841 | " [3, 9],\n", 1842 | " [4, 0]\n", 1843 | "])\n", 1844 | "C = np.array([\n", 1845 | " [7, 2],\n", 1846 | " [9, 3],\n", 1847 | " [2, 1]\n", 1848 | "])\n", 1849 | "\n", 1850 | "u = np.array([1, 2, 3])\n", 1851 | "v = np.array([4, 2])" 1852 | ] 1853 | }, 1854 | { 1855 | "cell_type": "markdown", 1856 | "metadata": {}, 1857 | "source": [ 1858 | "1. Calculate $(\\mB \\mA)^{\\text{T}}$ and check that it equals $\\mA^{\\text{T}} \\mB^{\\text{T}}$\n", 1859 | "\n", 1860 | "
\n", 1861 | " Click to see a solution!\n", 1862 | "
\n",
1863 |     "(B @ A).T\n",
1864 |     "A.T @ B.T\n",
1865 |     "    
\n", 1866 | "
" 1867 | ] 1868 | }, 1869 | { 1870 | "cell_type": "code", 1871 | "execution_count": 154, 1872 | "metadata": {}, 1873 | "outputs": [ 1874 | { 1875 | "data": { 1876 | "text/plain": [ 1877 | "array([[39, 4],\n", 1878 | " [51, 8],\n", 1879 | " [63, 12]])" 1880 | ] 1881 | }, 1882 | "execution_count": 154, 1883 | "metadata": {}, 1884 | "output_type": "execute_result" 1885 | } 1886 | ], 1887 | "source": [ 1888 | "(B @ A).T" 1889 | ] 1890 | }, 1891 | { 1892 | "cell_type": "code", 1893 | "execution_count": 155, 1894 | "metadata": {}, 1895 | "outputs": [ 1896 | { 1897 | "data": { 1898 | "text/plain": [ 1899 | "array([[39, 4],\n", 1900 | " [51, 8],\n", 1901 | " [63, 12]])" 1902 | ] 1903 | }, 1904 | "execution_count": 155, 1905 | "metadata": {}, 1906 | "output_type": "execute_result" 1907 | } 1908 | ], 1909 | "source": [ 1910 | "A.T @ B.T" 1911 | ] 1912 | }, 1913 | { 1914 | "cell_type": "markdown", 1915 | "metadata": {}, 1916 | "source": [ 1917 | "2. Check that the shapes match for the following transformations (answer 0 or 1).\n", 1918 | "\n", 1919 | "- $Au$\n", 1920 | "- $BA$\n", 1921 | "- $AB$\n", 1922 | "- $uv$\n", 1923 | "- $Cv$" 1924 | ] 1925 | }, 1926 | { 1927 | "cell_type": "markdown", 1928 | "metadata": {}, 1929 | "source": [ 1930 | "
\n", 1931 | " Click to see a solution!\n", 1932 | " - $Au$: 1\n", 1933 | " - $BA$: 1\n", 1934 | " - $AB$: 0\n", 1935 | " - $uv$: 0\n", 1936 | " - $Cv$: 1\n", 1937 | "
" 1938 | ] 1939 | } 1940 | ], 1941 | "metadata": { 1942 | "kernelspec": { 1943 | "display_name": "Python 3", 1944 | "language": "python", 1945 | "name": "python3" 1946 | }, 1947 | "language_info": { 1948 | "codemirror_mode": { 1949 | "name": "ipython", 1950 | "version": 3 1951 | }, 1952 | "file_extension": ".py", 1953 | "mimetype": "text/x-python", 1954 | "name": "python", 1955 | "nbconvert_exporter": "python", 1956 | "pygments_lexer": "ipython3", 1957 | "version": "3.7.6" 1958 | }, 1959 | "toc": { 1960 | "base_numbering": 1, 1961 | "nav_menu": {}, 1962 | "number_sections": false, 1963 | "sideBar": true, 1964 | "skip_h1_title": false, 1965 | "title_cell": "Table of Contents", 1966 | "title_sidebar": "Contents", 1967 | "toc_cell": false, 1968 | "toc_position": {}, 1969 | "toc_section_display": true, 1970 | "toc_window_display": true 1971 | } 1972 | }, 1973 | "nbformat": 4, 1974 | "nbformat_minor": 4 1975 | } 1976 | --------------------------------------------------------------------------------