[
  {
    "path": ".github/workflows/deploy-vuepress.yml",
    "content": "name: Build and deploy an updated version of the website\n\non:\n  push\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n    - name: Checkout virgili0/Virgilio\n      uses: actions/checkout@v2\n      with:\n        repository: virgili0/Virgilio\n        path: folder/repo\n    - name: Checkout virgili0/Virgilio master\n      uses: actions/checkout@v2\n      with:\n        repository: virgili0/Virgilio\n        ref: master\n        path: folder/build\n\n    - name: Set up Python 3.5\n      uses: actions/setup-python@v1\n      with:\n        python-version: 3.5\n\n    - name: Install Python dependencies\n      run: |\n        python -m pip install --upgrade pip\n        pip install jupyter\n        \n    - uses: actions/setup-node@v1\n      with:\n        node-version: '12'\n\n    - name: Install npm dependencies\n      working-directory: folder/repo/\n      run: |\n        cd content\n        npm install\n        \n    - name: Vuepress build and deploy\n      working-directory: folder/\n      run: |\n        cd repo\n        find . -type f -name \"*.ipynb\" -exec jupyter nbconvert --to markdown {} \\;\n        cd content\n        npm run build\n        cd ..\n        mkdir dist\n        cp content/.vuepress/dist/* dist/ -r\n        cd ..\n        cp -a repo/dist/. build/\n        cd build\n        mkdir -m 700 ~/.ssh\n        echo \"${{ secrets.SSH_KEY_SECRET }}\" > ~/.ssh/id_ed25519\n        chmod 0600 ~/.ssh/id_ed25519\n        git config --local user.name \"GitHub Action\"\n        git config --global user.email \"virgilio.datascience@gmail.com\"\n        git add .\n        git commit -m \"Update build\" && git push || :\n"
  },
  {
    "path": ".gitignore",
    "content": ".DS_Store\n.vscode/*\n\n# Node things\nnode_modules/\npackage-lock.json\n\n# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packaging\n.Python\nbuild/\ndevelop-eggs/\ndist/\ndownloads/\neggs/\n.eggs/\nlib/\nlib64/\nparts/\nsdist/\nvar/\nwheels/\npip-wheel-metadata/\nshare/python-wheels/\n*.egg-info/\n.installed.cfg\n*.egg\nMANIFEST\n\n# PyInstaller\n#  Usually these files are written by a python script from a template\n#  before PyInstaller builds the exe, so as to inject date/other infos into it.\n*.manifest\n*.spec\n\n# Installer logs\npip-log.txt\npip-delete-this-directory.txt\n\n# Unit test / coverage reports\nhtmlcov/\n.tox/\n.nox/\n.coverage\n.coverage.*\n.cache\nnosetests.xml\ncoverage.xml\n*.cover\n.hypothesis/\n.pytest_cache/\n\n# Translations\n*.mo\n*.pot\n\n# Django stuff:\n*.log\nlocal_settings.py\ndb.sqlite3\n\n# Flask stuff:\ninstance/\n.webassets-cache\n\n# Scrapy stuff:\n.scrapy\n\n# Sphinx documentation\ndocs/_build/\n\n# PyBuilder\ntarget/\n\n# Jupyter Notebook\n.ipynb_checkpoints\n\n# IPython\nprofile_default/\nipython_config.py\n\n# pyenv\n.python-version\n\n# pipenv\n#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.\n#   However, in case of collaboration, if having platform-specific dependencies or dependencies\n#   having no cross-platform support, pipenv may install dependencies that don’t work, or not\n#   install all needed dependencies.\n#Pipfile.lock\n\n# celery beat schedule file\ncelerybeat-schedule\n\n# SageMath parsed files\n*.sage.py\n\n# Environments\n.env\n.venv\nenv/\nvenv/\nENV/\nenv.bak/\nvenv.bak/\n\n# Spyder project settings\n.spyderproject\n.spyproject\n\n# Rope project settings\n.ropeproject\n\n# mkdocs documentation\n/site\n\n# mypy\n.mypy_cache/\n.dmypy.json\ndmypy.json\n\n# Pyre type checker\n.pyre/\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.\n\n## Our Standards\n\nExamples of behavior that contributes to creating a positive environment include:\n\n* Using welcoming and inclusive language\n* Being respectful of differing viewpoints and experiences\n* Gracefully accepting constructive criticism\n* Focusing on what is best for the community\n* Showing empathy towards other community members\n\nExamples of unacceptable behavior by participants include:\n\n* The use of sexualized language or imagery and unwelcome sexual attention or advances\n* Trolling, insulting/derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or electronic address, without explicit permission\n* Other conduct which could reasonably be considered inappropriate in a professional setting\n\n## Our Responsibilities\n\nProject maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.\n\nProject maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.\n\n## Scope\n\nThis Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at `virgilio.datascience (at) gmail.com`. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.\n\nProject maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]\n\n[homepage]: http://contributor-covenant.org\n[version]: http://contributor-covenant.org/version/1/4/\n"
  },
  {
    "path": "LICENSE",
    "content": "Attribution-NonCommercial-ShareAlike 4.0 International\n\n=======================================================================\n\nCreative Commons Corporation (\"Creative Commons\") is not a law firm and\ndoes not provide legal services or legal advice. Distribution of\nCreative Commons public licenses does not create a lawyer-client or\nother relationship. Creative Commons makes its licenses and related\ninformation available on an \"as-is\" basis. Creative Commons gives no\nwarranties regarding its licenses, any material licensed under their\nterms and conditions, or any related information. Creative Commons\ndisclaims all liability for damages resulting from their use to the\nfullest extent possible.\n\nUsing Creative Commons Public Licenses\n\nCreative Commons public licenses provide a standard set of terms and\nconditions that creators and other rights holders may use to share\noriginal works of authorship and other material subject to copyright\nand certain other rights specified in the public license below. The\nfollowing considerations are for informational purposes only, are not\nexhaustive, and do not form part of our licenses.\n\n     Considerations for licensors: Our public licenses are\n     intended for use by those authorized to give the public\n     permission to use material in ways otherwise restricted by\n     copyright and certain other rights. Our licenses are\n     irrevocable. Licensors should read and understand the terms\n     and conditions of the license they choose before applying it.\n     Licensors should also secure all rights necessary before\n     applying our licenses so that the public can reuse the\n     material as expected. Licensors should clearly mark any\n     material not subject to the license. This includes other CC-\n     licensed material, or material used under an exception or\n     limitation to copyright. More considerations for licensors:\n    wiki.creativecommons.org/Considerations_for_licensors\n\n     Considerations for the public: By using one of our public\n     licenses, a licensor grants the public permission to use the\n     licensed material under specified terms and conditions. If\n     the licensor's permission is not necessary for any reason--for\n     example, because of any applicable exception or limitation to\n     copyright--then that use is not regulated by the license. Our\n     licenses grant only permissions under copyright and certain\n     other rights that a licensor has authority to grant. Use of\n     the licensed material may still be restricted for other\n     reasons, including because others have copyright or other\n     rights in the material. A licensor may make special requests,\n     such as asking that all changes be marked or described.\n     Although not required by our licenses, you are encouraged to\n     respect those requests where reasonable. More considerations\n     for the public:\n    wiki.creativecommons.org/Considerations_for_licensees\n\n=======================================================================\n\nCreative Commons Attribution-NonCommercial-ShareAlike 4.0 International\nPublic License\n\nBy exercising the Licensed Rights (defined below), You accept and agree\nto be bound by the terms and conditions of this Creative Commons\nAttribution-NonCommercial-ShareAlike 4.0 International Public License\n(\"Public License\"). To the extent this Public License may be\ninterpreted as a contract, You are granted the Licensed Rights in\nconsideration of Your acceptance of these terms and conditions, and the\nLicensor grants You such rights in consideration of benefits the\nLicensor receives from making the Licensed Material available under\nthese terms and conditions.\n\n\nSection 1 -- Definitions.\n\n  a. Adapted Material means material subject to Copyright and Similar\n     Rights that is derived from or based upon the Licensed Material\n     and in which the Licensed Material is translated, altered,\n     arranged, transformed, or otherwise modified in a manner requiring\n     permission under the Copyright and Similar Rights held by the\n     Licensor. For purposes of this Public License, where the Licensed\n     Material is a musical work, performance, or sound recording,\n     Adapted Material is always produced where the Licensed Material is\n     synched in timed relation with a moving image.\n\n  b. Adapter's License means the license You apply to Your Copyright\n     and Similar Rights in Your contributions to Adapted Material in\n     accordance with the terms and conditions of this Public License.\n\n  c. BY-NC-SA Compatible License means a license listed at\n     creativecommons.org/compatiblelicenses, approved by Creative\n     Commons as essentially the equivalent of this Public License.\n\n  d. Copyright and Similar Rights means copyright and/or similar rights\n     closely related to copyright including, without limitation,\n     performance, broadcast, sound recording, and Sui Generis Database\n     Rights, without regard to how the rights are labeled or\n     categorized. For purposes of this Public License, the rights\n     specified in Section 2(b)(1)-(2) are not Copyright and Similar\n     Rights.\n\n  e. Effective Technological Measures means those measures that, in the\n     absence of proper authority, may not be circumvented under laws\n     fulfilling obligations under Article 11 of the WIPO Copyright\n     Treaty adopted on December 20, 1996, and/or similar international\n     agreements.\n\n  f. Exceptions and Limitations means fair use, fair dealing, and/or\n     any other exception or limitation to Copyright and Similar Rights\n     that applies to Your use of the Licensed Material.\n\n  g. License Elements means the license attributes listed in the name\n     of a Creative Commons Public License. The License Elements of this\n     Public License are Attribution, NonCommercial, and ShareAlike.\n\n  h. Licensed Material means the artistic or literary work, database,\n     or other material to which the Licensor applied this Public\n     License.\n\n  i. Licensed Rights means the rights granted to You subject to the\n     terms and conditions of this Public License, which are limited to\n     all Copyright and Similar Rights that apply to Your use of the\n     Licensed Material and that the Licensor has authority to license.\n\n  j. Licensor means the individual(s) or entity(ies) granting rights\n     under this Public License.\n\n  k. NonCommercial means not primarily intended for or directed towards\n     commercial advantage or monetary compensation. For purposes of\n     this Public License, the exchange of the Licensed Material for\n     other material subject to Copyright and Similar Rights by digital\n     file-sharing or similar means is NonCommercial provided there is\n     no payment of monetary compensation in connection with the\n     exchange.\n\n  l. Share means to provide material to the public by any means or\n     process that requires permission under the Licensed Rights, such\n     as reproduction, public display, public performance, distribution,\n     dissemination, communication, or importation, and to make material\n     available to the public including in ways that members of the\n     public may access the material from a place and at a time\n     individually chosen by them.\n\n  m. Sui Generis Database Rights means rights other than copyright\n     resulting from Directive 96/9/EC of the European Parliament and of\n     the Council of 11 March 1996 on the legal protection of databases,\n     as amended and/or succeeded, as well as other essentially\n     equivalent rights anywhere in the world.\n\n  n. You means the individual or entity exercising the Licensed Rights\n     under this Public License. Your has a corresponding meaning.\n\n\nSection 2 -- Scope.\n\n  a. License grant.\n\n       1. Subject to the terms and conditions of this Public License,\n          the Licensor hereby grants You a worldwide, royalty-free,\n          non-sublicensable, non-exclusive, irrevocable license to\n          exercise the Licensed Rights in the Licensed Material to:\n\n            a. reproduce and Share the Licensed Material, in whole or\n               in part, for NonCommercial purposes only; and\n\n            b. produce, reproduce, and Share Adapted Material for\n               NonCommercial purposes only.\n\n       2. Exceptions and Limitations. For the avoidance of doubt, where\n          Exceptions and Limitations apply to Your use, this Public\n          License does not apply, and You do not need to comply with\n          its terms and conditions.\n\n       3. Term. The term of this Public License is specified in Section\n          6(a).\n\n       4. Media and formats; technical modifications allowed. The\n          Licensor authorizes You to exercise the Licensed Rights in\n          all media and formats whether now known or hereafter created,\n          and to make technical modifications necessary to do so. The\n          Licensor waives and/or agrees not to assert any right or\n          authority to forbid You from making technical modifications\n          necessary to exercise the Licensed Rights, including\n          technical modifications necessary to circumvent Effective\n          Technological Measures. For purposes of this Public License,\n          simply making modifications authorized by this Section 2(a)\n          (4) never produces Adapted Material.\n\n       5. Downstream recipients.\n\n            a. Offer from the Licensor -- Licensed Material. Every\n               recipient of the Licensed Material automatically\n               receives an offer from the Licensor to exercise the\n               Licensed Rights under the terms and conditions of this\n               Public License.\n\n            b. Additional offer from the Licensor -- Adapted Material.\n               Every recipient of Adapted Material from You\n               automatically receives an offer from the Licensor to\n               exercise the Licensed Rights in the Adapted Material\n               under the conditions of the Adapter's License You apply.\n\n            c. No downstream restrictions. You may not offer or impose\n               any additional or different terms or conditions on, or\n               apply any Effective Technological Measures to, the\n               Licensed Material if doing so restricts exercise of the\n               Licensed Rights by any recipient of the Licensed\n               Material.\n\n       6. No endorsement. Nothing in this Public License constitutes or\n          may be construed as permission to assert or imply that You\n          are, or that Your use of the Licensed Material is, connected\n          with, or sponsored, endorsed, or granted official status by,\n          the Licensor or others designated to receive attribution as\n          provided in Section 3(a)(1)(A)(i).\n\n  b. Other rights.\n\n       1. Moral rights, such as the right of integrity, are not\n          licensed under this Public License, nor are publicity,\n          privacy, and/or other similar personality rights; however, to\n          the extent possible, the Licensor waives and/or agrees not to\n          assert any such rights held by the Licensor to the limited\n          extent necessary to allow You to exercise the Licensed\n          Rights, but not otherwise.\n\n       2. Patent and trademark rights are not licensed under this\n          Public License.\n\n       3. To the extent possible, the Licensor waives any right to\n          collect royalties from You for the exercise of the Licensed\n          Rights, whether directly or through a collecting society\n          under any voluntary or waivable statutory or compulsory\n          licensing scheme. In all other cases the Licensor expressly\n          reserves any right to collect such royalties, including when\n          the Licensed Material is used other than for NonCommercial\n          purposes.\n\n\nSection 3 -- License Conditions.\n\nYour exercise of the Licensed Rights is expressly made subject to the\nfollowing conditions.\n\n  a. Attribution.\n\n       1. If You Share the Licensed Material (including in modified\n          form), You must:\n\n            a. retain the following if it is supplied by the Licensor\n               with the Licensed Material:\n\n                 i. identification of the creator(s) of the Licensed\n                    Material and any others designated to receive\n                    attribution, in any reasonable manner requested by\n                    the Licensor (including by pseudonym if\n                    designated);\n\n                ii. a copyright notice;\n\n               iii. a notice that refers to this Public License;\n\n                iv. a notice that refers to the disclaimer of\n                    warranties;\n\n                 v. a URI or hyperlink to the Licensed Material to the\n                    extent reasonably practicable;\n\n            b. indicate if You modified the Licensed Material and\n               retain an indication of any previous modifications; and\n\n            c. indicate the Licensed Material is licensed under this\n               Public License, and include the text of, or the URI or\n               hyperlink to, this Public License.\n\n       2. You may satisfy the conditions in Section 3(a)(1) in any\n          reasonable manner based on the medium, means, and context in\n          which You Share the Licensed Material. For example, it may be\n          reasonable to satisfy the conditions by providing a URI or\n          hyperlink to a resource that includes the required\n          information.\n       3. If requested by the Licensor, You must remove any of the\n          information required by Section 3(a)(1)(A) to the extent\n          reasonably practicable.\n\n  b. ShareAlike.\n\n     In addition to the conditions in Section 3(a), if You Share\n     Adapted Material You produce, the following conditions also apply.\n\n       1. The Adapter's License You apply must be a Creative Commons\n          license with the same License Elements, this version or\n          later, or a BY-NC-SA Compatible License.\n\n       2. You must include the text of, or the URI or hyperlink to, the\n          Adapter's License You apply. You may satisfy this condition\n          in any reasonable manner based on the medium, means, and\n          context in which You Share Adapted Material.\n\n       3. You may not offer or impose any additional or different terms\n          or conditions on, or apply any Effective Technological\n          Measures to, Adapted Material that restrict exercise of the\n          rights granted under the Adapter's License You apply.\n\n\nSection 4 -- Sui Generis Database Rights.\n\nWhere the Licensed Rights include Sui Generis Database Rights that\napply to Your use of the Licensed Material:\n\n  a. for the avoidance of doubt, Section 2(a)(1) grants You the right\n     to extract, reuse, reproduce, and Share all or a substantial\n     portion of the contents of the database for NonCommercial purposes\n     only;\n\n  b. if You include all or a substantial portion of the database\n     contents in a database in which You have Sui Generis Database\n     Rights, then the database in which You have Sui Generis Database\n     Rights (but not its individual contents) is Adapted Material,\n     including for purposes of Section 3(b); and\n\n  c. You must comply with the conditions in Section 3(a) if You Share\n     all or a substantial portion of the contents of the database.\n\nFor the avoidance of doubt, this Section 4 supplements and does not\nreplace Your obligations under this Public License where the Licensed\nRights include other Copyright and Similar Rights.\n\n\nSection 5 -- Disclaimer of Warranties and Limitation of Liability.\n\n  a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE\n     EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS\n     AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF\n     ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,\n     IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,\n     WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR\n     PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,\n     ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT\n     KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT\n     ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.\n\n  b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE\n     TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,\n     NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,\n     INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,\n     COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR\n     USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN\n     ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR\n     DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR\n     IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.\n\n  c. The disclaimer of warranties and limitation of liability provided\n     above shall be interpreted in a manner that, to the extent\n     possible, most closely approximates an absolute disclaimer and\n     waiver of all liability.\n\n\nSection 6 -- Term and Termination.\n\n  a. This Public License applies for the term of the Copyright and\n     Similar Rights licensed here. However, if You fail to comply with\n     this Public License, then Your rights under this Public License\n     terminate automatically.\n\n  b. Where Your right to use the Licensed Material has terminated under\n     Section 6(a), it reinstates:\n\n       1. automatically as of the date the violation is cured, provided\n          it is cured within 30 days of Your discovery of the\n          violation; or\n\n       2. upon express reinstatement by the Licensor.\n\n     For the avoidance of doubt, this Section 6(b) does not affect any\n     right the Licensor may have to seek remedies for Your violations\n     of this Public License.\n\n  c. For the avoidance of doubt, the Licensor may also offer the\n     Licensed Material under separate terms or conditions or stop\n     distributing the Licensed Material at any time; however, doing so\n     will not terminate this Public License.\n\n  d. Sections 1, 5, 6, 7, and 8 survive termination of this Public\n     License.\n\n\nSection 7 -- Other Terms and Conditions.\n\n  a. The Licensor shall not be bound by any additional or different\n     terms or conditions communicated by You unless expressly agreed.\n\n  b. Any arrangements, understandings, or agreements regarding the\n     Licensed Material not stated herein are separate from and\n     independent of the terms and conditions of this Public License.\n\n\nSection 8 -- Interpretation.\n\n  a. For the avoidance of doubt, this Public License does not, and\n     shall not be interpreted to, reduce, limit, restrict, or impose\n     conditions on any use of the Licensed Material that could lawfully\n     be made without permission under this Public License.\n\n  b. To the extent possible, if any provision of this Public License is\n     deemed unenforceable, it shall be automatically reformed to the\n     minimum extent necessary to make it enforceable. If the provision\n     cannot be reformed, it shall be severed from this Public License\n     without affecting the enforceability of the remaining terms and\n     conditions.\n\n  c. No term or condition of this Public License will be waived and no\n     failure to comply consented to unless expressly agreed to by the\n     Licensor.\n\n  d. Nothing in this Public License constitutes or may be interpreted\n     as a limitation upon, or waiver of, any privileges and immunities\n     that apply to the Licensor or You, including from the legal\n     processes of any jurisdiction or authority.\n\n=======================================================================\n\nCreative Commons is not a party to its public\nlicenses. Notwithstanding, Creative Commons may elect to apply one of\nits public licenses to material it publishes and in those instances\nwill be considered the “Licensor.” The text of the Creative Commons\npublic licenses is dedicated to the public domain under the CC0 Public\nDomain Dedication. Except for the limited purpose of indicating that\nmaterial is shared under a Creative Commons public license or as\notherwise permitted by the Creative Commons policies published at\ncreativecommons.org/policies, Creative Commons does not authorize the\nuse of the trademark \"Creative Commons\" or any other trademark or logo\nof Creative Commons without its prior written consent including,\nwithout limitation, in connection with any unauthorized modifications\nto any of its public licenses or any other arrangements,\nunderstandings, or agreements concerning use of licensed material. For\nthe avoidance of doubt, this paragraph does not form part of the\npublic licenses.\n\nCreative Commons may be contacted at creativecommons.org.\n"
  },
  {
    "path": "README.md",
    "content": "\n\n\n\n\n# [I've Launched a GenAI Framework that's robust and easy to learn and maintain, check it!](https://github.com/datapizza-labs/datapizza-ai)\n\nVirgilio is an **open-source initiative**, aiming to **mentor and guide** anyone in the world of the **Data Science**.\nOur vision is to give *everyone* the chance to get involved in this field, **get self-started** as a practitioner, **gain new skills** and **learn to navigate** through the infinite web of resources and find the ones useful for *you*.\n\n[Find me](https://twitter.com/giac290595) on Twitter to have a chat!\n\n## -----> [**Meet Virgilio now!**](https://virgili0.github.io/Virgilio/)\n![Figure 1](virgilio.PNG \"1\") \n\n\n### Table of Contents\n\n- [What is Virgilio](#what-is-virgilio)\n- [About](#About)\n  * [License](#license)\n  * [Contribute](#contribute)\n\n\n# What is Virgilio?\n\nStudying and reading through the Internet means swimming in an **infinite jungle of chaotic information**, even more so in rapidly changing innovative fields. \n\n_Have you ever felt overwhelmed_ when trying to approach **Data Science** without a real “path” to follow? \n\nAre you tired of clicking “Run”, “Run”, “Run”.. on a Jupyter Notebook, with that false sense of confidence given by the comfort zone of the work of others?\n\nHave you ever got confused because of the several and contradicting names for the same algorithm or approach, from different websites and fragmented tutorials? \n\n**Virgilio addresses these critical issues for free, for everyone.**\n\n## [**Enter in the new web version of Virgilio!**](https://virgili0.github.io/Virgilio/)\n\n## About\n\nVirgilio is developed and maintained by [these awesome people](docs/contributors.md).\n[Find me](https://twitter.com/giac290595) on Twitter to have a chat!\n\n### Contribute\n\nThat's awesome! Check the [contribution guidelines](docs/contributing.md) and get involved in our project!\n\n### License\n\nContents are released under the Creative Commons BY-NC-SA 4.0 [license](https://github.com/virgili0/Virgilio/blob/dev/LICENSE). Code is released under the [MIT license](https://github.com/virgili0/Virgilio/blob/dev/.vuepress/LICENSE).\nThe Virgilio image comes from [here](https://upload.wikimedia.org/wikipedia/commons/c/ce/Virgil_.jpg).\n"
  },
  {
    "path": "Specializations/HardSkills/DataPreprocessing.md",
    "content": "# Data Preprocessing\n\nData preprocessing (also known as Data Preparation, but \"Preprocessing\" sounds more like magic) is the [iterative process](http://www.jsoftware.us/vol12/306-JSW15277.pdf) of gathering, combining, structuring and organizing data so it can be analyzed as part of data visualization, analytics, and machine learning applications.\n\n[Real-world data](https://www.quanticate.com/blog/real-world-data-analysis-in-clinical-trials) is often incomplete, inconsistent, and/or lacking in certain behaviors or trends, and is likely to contain many errors. Data preprocessing is a proven method of resolving such issues.\n\nIt's the [core ability](https://blogs.sas.com/content/hiddeninsights/2017/11/30/analytical-data-preparation-important/) of any data scientist or data engineer, and you must _be able to manipulate, clean, and structure_ your data during the everyday work (besides expecting that this will take the most of your [daily-time](https://www.infoworld.com/article/3228245/the-80-20-data-science-dilemma.html)!).\n\nThere are a lot of different data types out there, and they deserve [different treatments](http://blog.appliedinformaticsinc.com/data-mining-challenges-in-data-cleaning/).\n\nAs usual the structure I've planned to get you started consists of having a [general overview](https://searchbusinessanalytics.techtarget.com/definition/data-preparation), and then dive deep into each data processing situation you can encounter. \n\n[Here](https://towardsdatascience.com/data-pre-processing-techniques-you-should-know-8954662716d6) you have a gentle end-to-end panoramic view of the entire process.\n\nThe concepts through which we're going are the following:\n\n- [Don't Joke With Data](#Don't-Joke-With-Data)\n- [Business Questions](#Business-Questions)\n- [Data Profiling](#Data-Profiling)\n- [Who To Leave Behind](#Who-To-Leave-Behind)\n- [Start Small](#Start-small)\n- [The Toolkit](#The-Toolkit)\n- [Data Cleaning](#Data-Cleaning)\n  - [Get Rid of Extra Spaces](#Get-Rid-of-Extra-Spaces)\n  - [Select and Treat All Blank Cells](#Select-and-Treat-All-Blank-Cells)\n  - [Convert Values Type](#Convert-Values-Type)\n  - [Remove Duplicates](#Remove-Duplicates)\n  - [Change Text to Lower/Upper Case](#Change-Text-to-Lower/Upper-Case)\n  - [Spell Check](#Spell-Check)\n  - [Dealing with Special Characters](#Dealing-with-Special-Characters)\n  - [Normalizing Dates](#Normalizing-Dates)\n  - [Verification To Enrich Data](#Verification-To-Enrich-Data)\n  - [Data Discretization](#Data-Discretization)\n  - [Feature Scaling](#Feature-Scaling)\n  - [Data Cleaning Tools](#Data-Cleaning-Tools)\n- [Merge Data Sets and Integration](#Merge-Data-Sets-and-Integration)\n- [Sanity Check](#Sanity-Check)\n- [Automate These Boring Stuffs!](#Automate-These-Boring-Stuffs!)\n\n**Let's Start!**\n\n### Don't Joke With Data\nFirst, [**data is King**](https://www.edq.com/glossary/data-quality-importance/). In the [data-driven epoch](https://www.venturi-group.com/qa-with-helen-mannion/), having [data quality issues](https://www.ringlead.com/blog/7-common-data-quality-issues/) means to lose tremendous amounts of value for a company, in the present and in the future. So, respect your King and care a lot about him. The most immediate way to do this is to plan and [work hard](https://nektardata.com/high-quality-data/) to _produce_ good quality data.\nYour goal is to plan a collecting data infrastructure that fixes problems beforehand. This means to care to a lot about planning well your database schemas (do I need [third-normal form](https://social.technet.microsoft.com/Forums/Lync/en-US/7bf4ca30-a1bc-415d-97e6-ce0ac3137b53/normalized-3nf-vs-denormalizedstar-schema-data-warehouse-?forum=sqldatawarehousing) or not?), how do you collect data from sensors (physical or conceptual) and so on. These are problems if you're building a system up from the ground, but most of the times in you're gonna facing real-world problems that someone wants to solve with [_already available_](https://www.wired.com/insights/2013/05/more-data-more-problems-is-big-data-always-right/) data.  \n\n### Business Questions\nAsking the [right business questions](https://www.datapine.com/blog/data-analysis-questions/) is hard, but it has the [biggest impact](https://towardsdatascience.com/start-your-data-exploration-with-questions-2f1d42cff29e) on your performance of solving a particular problem. Remember, you want to [solve a problem](http://www.informit.com/articles/article.aspx?p=2271188&seqNum=2), not to create new ones! \n\n### Data Profiling\nAccording to the (cold as ice) [Wikipedia definition](https://en.wikipedia.org/wiki/Data_profiling): \"Data profiling is the process of examining the data available from an existing information source (e.g. a database or a file) and collecting statistics and informative data summaries.\"\\\nSo Wikipedia is subtly suggesting us to take a coffee with the data. \n\nDuring this informal meeting, ask the data questions like:\n- which business problem are you meant to solve? (what is important, and what is not) \n- how have you been collected (with noise, missing values...)?\n- how many friends of yours are there and where can I find them? (data dimensions and retrieving from storages)\n\nEventually, you may find the data too much quiet, maybe they're just shy! \\\nAnyway, you're going to [ask these questions to the business user](https://business-analysis-excellence.com/business-requirements-meeting/)!\n\n_Best practices and exercises:_ [1](https://www.iqint.org/idq2013/presentations/downloads/di_loreto_data_profiling_tutorial_monday_am.pdf), [2](https://community.alteryx.com/t5/Alteryx-Designer-Discussions/Data-profiling-tutorials-use-cases-and-exercise/td-p/145347)\n\n### Who To Leave Behind\nDuring the data profiling process, it's common to realize that often some of your data are [useless](https://ambisense.net/why-useless-data-is-worse-than-no-data/). Your data may have too much noise or they are partial, and most likely you don't all of them to answer your business problems.\n[To drop or not to drop, the Dilemma](https://www.theanalysisfactor.com/outliers-to-drop-or-not-to-drop/).\nEach time you're facing a data related problem, try to understand what data you need and what you' don't - that is, for each piece of information, ask yourself (and ask the _business user_): \n- How this data is going to help me?\n- Is possible to use them, reducing noise o missing values?\n- Considering the benefits/costs of the preparation process versus the business value created, Is this data worth it?\n\n### Start Small\nIt's stupid to handle GBs of data each time you want to try a data preparation step. Just use [small subsets](https://sdtimes.com/bi/data-gets-big-best-practices-data-preparation-scale/) of the data (but take care that they are representative and you catch all the problems). Remember, if you want to experiment with string cleaning, you don't need to launch your script on 10M rows. \n\n### The Toolkit\nThe tools we're gonna use are Python3 and his [Pandas library](https://pandas.pydata.org/), the de-facto standard to manipulate datasets.\nThe heavy lifting here is done by the [DataFrame class](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html), which comes with a bunch of useful functions for your daily data tasks.\nHopefully, you already know Python, if not start from there (do the steps I suggest you in the ML guide requirements), and then take this [Beginner Pandas tutorial](https://pandas.pydata.org/pandas-docs/stable/getting_started/10min.html). Don't worry if now some ideas are not totally clear, but try to get the big picture of the common [Pandas operations](https://www.analyticsvidhya.com/blog/2016/01/12-pandas-techniques-python-data-manipulation/). \n\n_Best practices and exercises:_ [1](https://github.com/guipsamora/pandas_exercises), [2](https://www.w3resource.com/python-exercises/pandas/index.php), [3](https://www.machinelearningplus.com/python/101-pandas-exercises-python/), [4](https://www.kaggle.com/pistak/pandas-tutorial-with-interactive-exercises), [5](http://disi.unitn.it/~teso/courses/sciprog/python_pandas_exercises.html)\n\n### Data Cleaning\n[Data cleaning](https://en.wikipedia.org/wiki/Data_cleansing) is the general process of taking data, after you have a clear big picture of them, and you need to realize the actual process of replacing characters, dropping incomplete rows, fill missing values and so forth. In the next sections, we'll explore all the common data cleaning situations.\n\n### Get Rid of Extra Spaces\nOne of the first things you want to do is [remove extra spaces](https://stackoverflow.com/questions/43332057/pandas-strip-white-space). Take care! Some space can carry information, but it heavily depends on the situation. For example, in \"Complete Name\": \"Giacomo Ciarlini\" in nice to have space so we can later split this into \"Name\": \"Giacomo\" and \"Surname\": \"Ciarlini\". I want you to notice that in general, apart from recommending and suggestion customization systems, unique identifiers like names or IDs are something you can generally drop. Often, they do not carry information. \n_Bonus tip_: learn how to use [Regex](https://www.analyticsvidhya.com/blog/2015/06/regular-expression-python/) for pattern matching, this is one of the powerful tools each data guy need to master.\n\n_Best practices and exercises:_ [1](https://www.quora.com/How-do-you-remove-all-whitespace-from-a-Python-string), [2](https://towardsdatascience.com/5-methods-to-remove-the-from-your-data-in-python-and-the-fastest-one-281489382455), [3](https://www.tutorialspoint.com/How-to-remove-all-leading-whitespace-in-string-in-Python)\n\n_RegeX exercises_: [1](https://www.w3resource.com/python-exercises/re/), [2](https://pycon2016.regex.training/exercises)\n\n_Bonus Resource_: A super useful [tool](http://regviz.org/) for visualizing RegeX expressions and their effect on the text.\n\n###  Select and Treat All Blank Cells\nOften real-world data is incomplete and is necessary to handle this situation. [These](https://code.likeagirl.io/how-to-use-python-to-remove-or-modify-empty-values-in-a-csv-dataset-34426c816347) are two ways of dealing with it. [Here](https://hackersandslackers.com/pandas-dataframe-drop/) you have a more in-depth tutorial.\n\n_Best practices and exercises:_ [1](https://www.kaggle.com/nirmal51194/data-cleaning-challenge-handling-missing-values), [2](https://stefvanbuuren.name/fimd/missing-data-pattern.html), [3](https://www.ethz.ch/content/dam/ethz/special-interest/math/statistics/sfs/Education/Advanced%20Studies%20in%20Applied%20Statistics/course-material-1719/Multivariate/w10-in-class-exercise-imputation-solution.pdf), [4](http://uc-r.github.io/missing_values)\n\n###  Convert Values Type\n[Different data types](https://pbpython.com/pandas_dtypes.html) carries different information, and you need to care about this.\n[Here](https://www.geeksforgeeks.org/python-pandas-series-astype-to-convert-data-type-of-series/) is a good tutorial on how to convert type values. Remember that Python has some shortcut for doing this (executing str(3) will give you back the \"3\" string) but I recommend you to learn how to do it with Pandas.\n\n###  Remove Duplicates\nYou don't want to duplicate data, they both are noise and occupy space! Learn [how to handle them simply](https://www.geeksforgeeks.org/python-pandas-dataframe-drop_duplicates/) with Pandas.\n\n###  Change Text to Lower/Upper Case\nYou want to _Capitalize_ names, or maybe make them uniform (some people can enter data with or without capital letters!). Check [here](https://www.geeksforgeeks.org/python-pandas-series-str-lower-upper-and-title/) for the Pandas way to do it.\n\n###  Spell Check\nYou want to correct wrong words, for the sake of evenness. Check [here](https://www.tutorialspoint.com/python/python_spelling_check.htm) for a good Python module to do it. Also, this is a good starting point to [implement it](https://stackoverflow.com/questions/46409475/spell-checker-in-pandas). \n\n_Best practices and exercises:_ [1](https://stackoverflow.com/questions/7315114/spell-check-program-in-python), [2](https://norvig.com/spell-correct.html), [3](https://github.com/garytse89/Python-Exercises/tree/master/autoCorrect)\n\n###  Reshape your data\nMaybe you're going to feed your data into a neural network or show them in a colorful bars plot. Anyway, you need to transform your data and give them the right shape for your data pipeline. [Here](https://towardsdatascience.com/seven-clean-steps-to-reshape-your-data-with-pandas-or-how-i-use-python-where-excel-fails-62061f86ef9c) is a very good tutorial for this task. \n\n_Best practices and exercises:_ [1](https://pandas.pydata.org/pandas-docs/stable/user_guide/reshaping.html), [2](https://discuss.codecademy.com/t/faq-data-cleaning-with-pandas-reshaping-your-data/384794).\n\n###  Dealing with Special Characters\nUTF-encoding is the standard to follow, but remember that not everyone follows the rules (otherwise, we'd not need [crime predictive analytics](http://scholarworks.sjsu.edu/cgi/viewcontent.cgi?article=1633&context=etd_projects). You can learn [here](https://stackoverflow.com/questions/45596529/replacing-special-characters-in-pandas-dataframe) how to deal with strange accents or special characters.\n\n_Best practices and exercises:_ [1](https://www.w3resource.com/python-exercises/python-basic-exercise-92.php), [2](https://stackoverflow.com/questions/22518703/escape-sequences-exercise-in-python?rq=1), [3](https://learnpythonthehardway.org/book/ex2.html)\n\n###  Normalizing Dates\nI think there could be one hundred ways to write down a date. You need to decide your format and make them uniform across your dataset, and [here](https://medium.com/jbennetcodes/dealing-with-datetimes-like-a-pro-in-pandas-b80d3d808a7f) you learn how to do it.\n\n_Best practices and exercises:_ [1](https://www.w3resource.com/python-exercises/python-conditional-exercise-41.php), [2](https://www.w3resource.com/python-exercises/date-time-exercise/), [3](https://www.kaggle.com/anezka/data-cleaning-challenge-parsing-dates)\n\n###  Verification to enrich data\nSometimes can be useful to engineer some data, for example: suppose you're dealing with [e-commerce data](https://www.edataindia.com/why-data-cleansing-is-important/), and you have the prices of each object sold. You may want to add a new column in your dataset, with a label carrying handy information like a Price_level [low, medium, high] based on upper and lower bounds you can decide. This is really simple in Pandas, check [here](https://stackoverflow.com/questions/19913659/pandas-conditional-creation-of-a-series-dataframe-column). Another example is to add a Gender column (M, F) to easily explore data and gain insights in a customers dataset.\n\n_Best practices and exercises:_ [1](http://www.inweb.org.br/w3c/dataenrichment/), [2](https://solutionsreview.com/data-integration/best-practices-for-data-enrichment-after-etl/), [3](http://www.inweb.org.br/w3c/dataenrichment/)\n\n### Data Discretization\nMany Machine Learning and Data Analysis methods cannot handle continuous data, and dealing with them can be computationally prohibitive. [Here](https://www.youtube.com/watch?v=TF3_6lwITQg) you find a good video explaining why and how you need to discretize data.\n\n_Best practices and exercises:_ [1](https://www.researchgate.net/post/What_are_the_best_methods_for_discretization_of_continuous_features), [2](https://towardsdatascience.com/discretisation-using-decision-trees-21910483fa4b), [3](https://docs.microsoft.com/en-us/sql/analysis-services/data-mining/discretization-methods-data-mining)\n\n### Feature Scaling\nFeature scaling is a method used to standardize the range of independent variables or features of data. In data processing, it is also known as data normalization and is generally performed during the data preprocessing step.\n[Here](Feature scaling is a method used to standardize the range of independent variables or features of data. In data processing, it is also known as data normalization and is generally performed during the data preprocessing step.) you find a serious tutorial about this fundamental step.\n\n_Best practices and exercises:_ [1](https://www.kaggle.com/jfeng1023/data-cleaning-challenge-scale-and-normalize-data), [2](https://www.quora.com/When-should-you-perform-feature-scaling-and-mean-normalization-on-the-given-data-What-are-the-advantages-of-these-techniques), [3](https://www.quora.com/When-do-I-have-to-do-feature-scaling-in-machine-learning)\n\n### Data Cleaning Tools\nYou're not going to hunt tigers without a rifle! You have a ton of tools out there that will help you during the data cleaning process, the one I want to suggest you is [this](https://www.analyticsindiamag.com/10-best-data-cleaning-tools-get-data/) open source tool from Google. Check [here](https://www.quora.com/What-are-the-best-open-source-data-cleansing-tools-software-available) for more.  \n\n### Merge Data Sets and Integration\nNow that you hopefully have been successful in your data cleaning process, you can merge data from different source to create big [de-normalized](https://www.researchgate.net/post/When_and_why_do_we_need_data_normalization_in_data_mining_algorithms) data tables, ready to be explored and consumed. [This](https://www.quora.com/Is-data-warehouse-normalized-or-denormalized-Why) is why.\n\n_Best practices and exercises:_ [1](https://www.ssc.wisc.edu/sscc/pubs/sfr-combine.htm), [2](https://rpubs.com/wsundstrom/t_merge), [3](https://jakevdp.github.io/PythonDataScienceHandbook/03.07-merge-and-join.html), [4](https://searchbusinessanalytics.techtarget.com/feature/Using-data-merging-and-concatenation-techniques-to-integrate-data), [5](https://www.analyticsvidhya.com/blog/2016/06/9-challenges-data-merging-subsetting-r-python-beginner/)\n\n### Sanity Check\nYou always want to be sure that your data are _exactly_ how you want them to be, and because of this is a good rule of thumb to apply a sanity check after each complete iteration of the data preprocessing pipeline (i.e. each step we have seen until now)\nLook [here](https://www.trifacta.com/blog/4-key-steps-to-sanity-checking-your-data/) for a good overview. Depending on your case, the sanity check can vary a lot.\n\n_Best practices and exercises:_ [1](https://blog.socialcops.com/academy/resources/4-data-checks-clean-data/), [2](https://www.r-bloggers.com/data-sanity-checks-data-proofer-and-r-analogues/), [3](https://www.quora.com/What-is-the-example-of-Sanity-testing-and-smoke-testing)\n\n### Automate These Boring Stuffs!\nAs I told you at the very beginning, the data preprocessing process can take a long time and be very tedious. Because of this, you want to [automate](https://www.youtube.com/watch?v=UZUoH7_mYx4) the most you can. Also, **automation is married with iteration**, so this is the way you need to plan your data preprocessing pipelines. [Here](https://github.com/mdkearns/automated-data-preprocessing) you find a good command line tool for doing that, but I'm almost sure you'll need to build your own (remember, each problem is unique!), but this is a good starting point.\n\n_Best practices and exercises:_ [1](https://blog.panoply.io/5-data-preparation-tools-1-automated-data-platform), [2](https://www.quora.com/How-do-I-make-an-automated-data-cleaning-in-Python-for-ML-Is-there-a-trick-for-that), [3](https://www.quora.com/Is-there-a-python-package-to-automate-data-preparation-in-machine-learning), [4](https://machinelearningmastery.com/prepare-data-machine-learning-python-scikit-learn/), [5](https://www.analyticsvidhya.com/blog/2018/10/rapidminer-data-preparation-machine-learning/)\n\n### Conclusions\nNow you're ready to take your data and play with them in a variety of ways, and you have a nice panoramic overview of the entire process. You can refer to this page when you clean data, to check if you're not missing some steps. Remember that probably each situation requires a subset of these steps.\n\n-------------------------\nWritten by [_clone95_](https://github.com/clone95)\n"
  },
  {
    "path": "Specializations/HardSkills/DataVisualization.md",
    "content": "# Data Visualization \n\nIt was hard for the Homo Sapiens to survive in the African savannah: a human or animal could kill you at any time.\nThe human brain has evolved in this wild and unpredictable context, and evolution has \"coincidentally\" chosen to devote a great deal of computing power to capturing and understanding the world through **sight** ([more than 60 %](https://www.quora.com/How-much-of-the-brain-is-involved-with-vision-What-about-hearing-touch-etc)).\\\nSo, it' trivial that a clear and effective data visualization it's one of your best weapons in the Data Science world.\n\nThe track which inspired me for this guide is one of the must-buy book [**Storytelling with Data**](https://www.amazon.it/Storytelling-Data-Visualization-Business-Professionals/dp/1119002257/ref=sr_1_1?adgrpid=52005426669&gclid=CjwKCAjwndvlBRANEiwABrR32EhKMtGs8M5mBgl5lQJZCf9fglkx87ujqYVZk6gHsMDxKOd9yQa7uRoCin8QAvD_BwE&hvadid=255222968297&hvdev=c&hvlocphy=1008297&hvnetw=g&hvpos=1t3&hvqmt=e&hvrand=3841532584099296285&hvtargid=kwd-297573901809&keywords=storytelling+with+data&qid=1555538994&s=gateway&sr=8-1). By far is the best data visualization book I've ever read.\n\nYou can find [here](http://www.bdbanalytics.ir/media/1123/storytelling-with-data-cole-nussbaumer-knaflic.pdf) the free PDF. \n\nAnother piece of dense knowledge, with exceptional conciseness and \"father\" of every data visualization book: [**The Visual Display of Quantitative Information**](https://www.amazon.it/Visual-Display-Quantitative-Information/dp/0961392142).\n\nI assume you know [basic Python](https://github.com/clone95/Virgilio/blob/master/NewToDataScience/PythonBasic.md).\n\nEach content listed here **is not** tool-specific (apart from \"tools\", did you ever imagine that?).\n\nThe concepts through which we're going are the following:\n\n- [Legolas, how do your elf eyes see?](#Legolas,-how-do-your-elf-eyes-see?)\n- [The Importance of Context](#The-importance-of-context)\n- [The Data / Ink Ratio](#The-Information-/-Ink-Ratio)\n- [Choose an Effective Visual](#Choose-an-Effective-Visual)\n- [Focus your Audience’s Attention](#Focus-your-Audience’s-Attention)\n- [Think like a Designer](#Think-like-a-Designer)\n- [Exploring Model Visuals](#Exploring-Model-Visuals)\n  - [Line Graph](#Line-Graph)\n  - [Annotated Line Graph](#Annotated-Line-Graph)\n  - [Stacked Bars](#Stacked-Bars)\n  - [Positive and Negative Stacked Bars](#Positive-and-Negative-Stacked-Bars)\n  - [Horizontal Stacked Bars](#Horizontal-Stacked-Bars)\n- [Data Visualization tools](#Data-Visualization-tools)\n  - [Microsoft Excel](#Microsoft-Excel)\n  - [MatplotLib](#MatplotLib)\n  - [Seaborn](#Seaborn)\n  - [Bokeh](#Bokeh)\n  - [Tableau](#Tableau)\n  - [Power Bi](#Power-Bi)\n- [Take Inspiration](#Take-Inspiration)\n- [Storytelling with Data](#Storytelling-with-Data)\n- [Common Visualization Mistakes](#Common-Visualization-Mistakes)\n- [Additional Resources](#Additional-Resources)\n- [Wrapping up and looking forward](#Wrapping-up-and-looking-forward)\n\n#### **Let's Start!**\n------------------------------------------------\n\n\n\n### Legolas, how do your elf eyes see?\nWhat do I intend with Data Visualization?\\\nLet's consider the [Tableau](https://www.tableau.com/learn/articles/data-visualization) definition:\n>Data visualization is a graphical representation of information. By using visual elements like charts, graphs, and maps, data visualization tools provide an accessible way to see and understand trends, outliers, and patterns in data.\nIn the world of Big Data, data visualization tools and technologies are essential to analyze massive amounts of information and make data-driven decisions.\"\n\nAnd according to [Wikipedia](https://en.wikipedia.org/wiki/Data_visualization):\n\n>Effective visualization helps users analyze and reason about data and evidence. It makes complex data more accessible, understandable and usable. Users may have particular analytical tasks, such as making comparisons or understanding causality, and the design principle of the graphic should follow the task.\n\nSo, the **goal** of Data Visualization is to _communicate data facts_ to drive wise business decisions. Often these decisions have to be taken by executives, councils or managers and maybe they don't know all the technical stuff behind data!\n\nAnother interesting concept you should be familiar with, is the Data-Driven company, a business model that more and more convincing organization to marry it.\n\n[Here](https://triggerbee.com/data-driven-marketing) you find a nice definition of Data-Driven company and [here](https://www.businessmodelsinc.com/big-data-business-models/) an interesting article about it.\n\nAs a data scientist, you are the interface among several business functions: product, research, techies and managers, and your main goal is to convince people into taking the right decisions, based on data.\n\nOften you intend to abstract the representation of the data from the underlying technical details and make them available for others. \nAs usual, the target you refer to is fundamental in the decision of what data to communicate, and how.\n\nThe natural consequence of this statement is that you need to consider the importance of context. \n\n### The Importance of Context\nAs in any other field of communication, knowing your audience is critical to understand what you need to communicate.\\\n[Here](https://www.watershedlrs.com/blog/data-storytelling-know-your-audience) you find an article with some tips to know your audience.\\\nBasically, the more you know about your audience interests, jobs, and individual situations, the more you can intercept their business needs and desires.\nThe more you can be specific about who your audience is, the more effective your position will be for successful communication.\\\nAvoid a general audience, such as \"external stakeholders\" or \"anyone in the product department\", trying to communicate to too many different individuals with different needs at once, you risk not communicating to any of them as effectively as you would if you narrowed your target audience.\\\nIf _you must_ remain general for some reason, try to simplify the most you can, and check [here](https://www.anl.gov/education/writing-a-general-audience-abstract) for some useful tips.\\\n[Here](https://www.techchange.org/2015/05/21/audience-matters-in-data-visualization/) you have some other reason why your data presentation should be driven by the target audience.\\\nOnce you've clear in mind your target, you can start developing the content you want to present.\n\n\n### The Data / Ink Ratio\nThe human brain has limited resources and overkilling it with numbers and notions can only lead to negative effects. People become bored easily, especially if your charts are hard to read or they offer _too much_ information. \nAs most of the concepts I taught you in the [Impactful presentation guide](https://github.com/clone95/Virgilio/blob/master/Specializations/SoftSkills/ImpactfulPresentations.md), Less Is More is one of the principles you need to follow strictly.\nThe Tufte's book stresses this out mercilessly calling it \"Information / Ink Ratio\".\n[Here](https://www.darkhorseanalytics.com/blog/data-looks-better-naked) you find an interesting journey of a chart, that brings it to un-readable to the state-of-art of minimalism.\\ The general lesson here is to get rid of everything is not needed to communicate the core of your data: extra lines, numbers, legends, names, points and so on. \n\nThe more noise you can avoid, the more your information will flow gently to your audience and the more they'll remember it.\n\n**Data/Ink Ratio = Amount of Ink used on Data / Amount of Ink used** \n\nSome additional resources to learn how to optimize the Data / Ink Ratio:\n- [1](https://thedoublethink.com/tuftes-principles-for-visualizing-quantitative-information/), [2](https://medium.com/@sudharsanasai/declutter-your-chart-with-data-ink-ratio-6f6908727842), [3](http://davidgiard.com/2011/05/12/DataVisualizationPart5DataInk.aspx), [4](https://www.blue-granite.com/blog/data-visualization-remove-chart-clutter-and-focus-on-the-insights), [5](https://www.idashboards.com/blog/2016/05/19/spring-cleaning-eliminate-the-data-clutter/), [6](http://www.storytellingwithdata.com/blog/2016/3/1/declutter-your-data-visualizations)\n\n\n### Choose an Effective Visual\nAs a warrior choose his weapon depending on the context, you have to wisely choose the chart to use to represent each number you want to communicate.\\\n[Here](https://chartio.com/learn/dashboards-and-charts/what-are-common-chart-types-and-how-to-use-them/) is a list of the most common shapes and ideas to present data.\\\nAs you can see, there are many different graphs and other types of visual displays of information, but a handful will work for the majority of your needs ([please don't use cake charts](https://www.businessinsider.com/pie-charts-are-the-worst-2013-6?IR=T)!).\\\n[Here](https://support.geckoboard.com/hc/en-us/articles/115002929972-How-to-choose-the-right-data-visualization) and [here](https://blog.hubspot.com/marketing/types-of-graphs-for-data-visualization) you have a detailed checklist easy to follow, in order to decide which type of chart suits best for your case.\n\n### Focus your Audience’s Attention\nWithin the brain, there are three types of memory that are important to understand as we design visual communications: [iconic](https://en.wikipedia.org/wiki/Iconic_memory) memory, [short‐term](https://en.wikipedia.org/wiki/Short-term_memory) memory, and [long‐term](https://en.wikipedia.org/wiki/Long-term_memory) memory. What we need to leverage well for our presentations is the iconic one. In fact, she's responsible for the most part of the first impression about what we see, and has by far the most important impact on our perception.\\\n[Here](https://brevitaz.com/data-visualisations/) you find a good explanation about how to understand how to leverage iconic memory.\\\n[Here](https://www.clarityinsights.com/blog/perception-communication) another good read about this topic.\n\n### Think like a Designer\nThe most important principle in design is that \"the design of _____ should be driven by its function\".\\\nImagine a [gladius](https://it.wikipedia.org/wiki/Gladius_hispaniensis), the bread-and-butter weapon of the Roman army: you can _easily understand_ what's his purpose, even if no one told you!\\\nRead [here](https://www.team-consulting.com/insights/design-drivers-what-drives-great-design/) a gentle introduction to design theory, really recommended!\\\n[Here](http://guides.lib.berkeley.edu/data-visualization/design) you find useful design guidelines, and [here](https://uxdesign.cc/designing-a-dashboard-how-to-make-sure-it-will-show-useful-data-23af7e233d21) how to design an effective dashboard. \n\n### Exploring Model visuals\n#### Line Graph\nDespite its simplicity is the most effective chart you can show (remember, less is more!). Probably the most part of the data you have can be presented through a line graph.\\\n[Here](https://www.smartdraw.com/line-graph/) you find how to use its power with awareness. \n\n#### Annotated Line Graph\nLike the previous one, but with annotations that can help readability.\\\n[Here](http://www.storytellingwithdata.com/blog/2018/1/22/88-annotated-line-graphs) you find only 88 examples of that :-)\n\n#### Stacked Bars\nProbably the most effective chart to compare quantities, they were used more than [270 years ago](https://gizmodo.com/these-250-year-old-charts-and-graphs-were-the-very-firs-1445388576)!\\\n[Here](https://www.smashingmagazine.com/2017/03/understanding-stacked-bar-charts/) you find complete guidelines to use them. \n[Here](https://peltiertech.com/excel-3d-charts-charts-with-no-value/) you can understand why is important to keep them as simple as possible, without 3D effects. Really interesting and in-depth read.\n\n#### Positive and Negative Stacked Bars\nWith negative values, you can easily show bad-vs-good performance or in-vs-out flows.\\\n[Here](https://peltiertech.com/diverging-stacked-bar-charts/) a detailed explanation about how and when to use them.\n\n#### Horizontal Stacked Bars\nYou don't need to be a fan of the Flat Earth \"theory\" to use Horizontal bar chart! They're similar to their vertical cousins, but orienting the chart horizontally means the category names along the left are easy to read in the horizontal text.\\\n[Here](https://apexcharts.com/javascript-chart-demos/bar-charts/) a guide about using them.\n[Here](https://depictdatastudio.com/when-to-use-horizontal-bar-charts-vs-vertical-column-charts/) an interesting article that explains when to choose horizontal or vertical bars. \n\n### Storytelling with Data\nWhen you see a great play, watch a captivating movie, or read a fantastic book, you’ve experienced the magic of the story. A good story grabs your attention and takes you on a journey, evoking an emotional response. In the middle of it, you find yourself not wanting to turn away or put it down. After finishing it—a day, a week, or even a month later—you could easily describe it to a friend.\n\nIf you reach this goal in your audience, you've arrived, and you have won the first prize! \n\n- **Find a subject you care about**. It is this genuine caring, and not your games with language, which will be the most compelling and seductive element in your style.\n- **Keep it simple**. Great masters wrote sentences which were almost childlike when their subjects were most profound. “To be or not to be?” asks Shakespeare’s Hamlet. The longest word is three letters.\n- **Choose who to leave behind**. If a sentence or a chart, no matter how excellent, does not illuminate your subject in some new and useful way, scratch it out.\n- **Don't fool people with data**. [These](https://venngage.com/blog/misleading-graphs/) are clear examples of what I'm saying.  \n- **Be clear**. If I broke punctuation, or I bend the meaning of the words (technical and not), I would simply won't be understood.\n- **Pity the readers**. Our audience requires us to be sympathetic and patient teachers, ever willing to simplify and clarify.\n- **Be suggestive**. Try to summon pictures, sounds, and feeling during your stories.\n- **Have a great End**. Leave your audience with a sentence that will be the remainder of your presentation, the most internal core of your topic. The things you want your audience this about when they remember your presentation. \n\nFor other tips and suggestions about storytelling, check my other [Impactful presentation guide](https://github.com/clone95/Virgilio/blob/master/Specializations/SoftSkills/ImpactfulPresentations.md).\n\nSorry, I'm a [DRY principle](https://it.wikipedia.org/wiki/Don%27t_repeat_yourself) hopeless fan.\n\n\n### Data Visualization tools\nI this section I introduce you to the most accessible and well-known tools, that will give you an expendable skill in Data Visualization. \n\n#### Microsoft Excel\nDo a favor to yourself, learn [**Excel now!**](https://www.youtube.com/watch?v=-ujVQzTtxSg&list=PLWPirh4EWFpEpO6NjjWLbKSCb-wx3hMql)\\\nExcel is the swiss-knife for a lot of basic data management, computation, and representation.\\\nDespite its scalability limits, it's still one of the tools that _support companies_ today.\\\nTake [this](https://www.youtube.com/watch?v=RwUSUjRGKVM) course about data visualization with Microsoft Excel.  \n[Here](https://www.keynotesupport.com/excel-basics/excel-charts-beginners.shtml) you have another good one.\\\n[Here](https://www.webucator.com/tutorial/intermediate-microsoft-excel/visualizing-your-data.cfm) you have some exercises to test your skill.\\\n[Here](https://policyviz.com/2017/07/25/my-top-10-data-visualization-excel-websites/) a list of cool websites about Excel visualizations.\n\n#### Matplotlib\n\n[Matplotlib](https://matplotlib.org/) is one of the most used libraries for graphical representation in Python and a lot of other libraries are built on the top of it.\nMy personal opinion about it is that it's not too easy to understand and implement, but today is still relevant to grasp the most out of the tutorials on the Internet. You also have a lot of examples in [StackOverflow](https://stackoverflow.com/).\\\nThe [official beginner's guide](https://matplotlib.org/users/beginner.html) is really complete and contains everything you need to get started and then proficient with the library.\\\n[Here](https://matplotlib.org/Matplotlib.pdf) you have the complete documentation.\\\n[Here](https://pythonspot.com/matplotlib/) another bunch of chart-specific tutorials.\\\n[Here](https://www.machinelearningplus.com/plots/top-50-matplotlib-visualizations-the-master-plots-python/) an ensemble of the 50 most useful visualizations with code.\\\n[Here](http://www.randalolson.com/2014/06/28/how-to-make-beautiful-data-visualizations-in-python-with-matplotlib/) you find advanced charts and the code to realize them.\n[Here](https://www.cheatography.com/gabriellerab/cheat-sheets/matplotlib-pyplot/) an handy cheat-sheet.\n\nChallenge yourself:\n- [1](http://www.ceda.ac.uk/static/media/uploads/ncas-reading-2015/matplotlib_exercises_solutions.pdf), [2](https://pynative.com/python-matplotlib-exercise/), [3](https://anaconda.org/gwinnen/matplotlib-exercises/notebook), [4](https://www.w3resource.com/graphics/matplotlib/)\n\nBest Practices\n- [1](https://www.scivision.dev/best-practices-for-matplotlib-plots/), [2](https://www.quora.com/What-are-some-best-practices-for-matplotlib-to-improve-the-quality-and-appearance-of-your-graphs-and-plots), [3](https://stackoverflow.com/questions/18059269/best-practices-to-write-function-embedding-matplotlib-plot-call), [4](https://matplotlib.org/tutorials/introductory/lifecycle.html)\n\n#### Seaborn\nAs your brain is fascinated by the beauty in humans, art, or cute puppies, it is by beautiful visualizations. A common library **built on top of Matplotlib** is [Seaborn](https://seaborn.pydata.org/). It's used to enhance Matplotlib charts, so you need to become comfortable with the \"mother library\" first.\\\nFollow [this](https://www.youtube.com/playlist?list=PL998lXKj66MpNd0_XkEXwzTGPxY2jYM2d) Youtube tutorial, it covers the most you need to get started with it.\\\nThen read [this](https://stepupanalytics.com/introduction-to-python-for-data-visualization-with-seaborn/) long and complete blog post.\\\n[Here](https://www.kaggle.com/kanncaa1/seaborn-tutorial-for-beginners) you find another long tutorial for beginners. \n\nChallenge yourself: [1](https://anaconda.org/gwinnen/seaborn-exercises/notebook), [2](http://unsupervisedlearning.co.uk/2017/11/08/seaborn-exercises-solutions/), [3](https://www.codecademy.com/courses/learn-seaborn/lessons/seaborn-distributions/exercises/box-plots-ii), [4](https://anaconda.org/gwinnen/seaborn-exercises/notebook)\n\nBest practices: [1](http://walkerke.github.io/geog30323/slides/data-visualization/), [2](https://mode.com/resources/analytics-dispatch/data-visualization-best-practices/), [3](https://www.datacamp.com/courses/improving-your-data-visualizations-in-python), \n\nAdditional examples: [1](https://python-graph-gallery.com/category/seaborn/), [2](https://jakevdp.github.io/PythonDataScienceHandbook/04.14-visualization-with-seaborn.html), [3](https://towardsdatascience.com/data-visualization-using-seaborn-fc24db95a850), [4](https://www.kaggle.com/mchirico/plotly-seaborn-examples)\n\n#### Bokeh\nFrom the [Bokeh](http://bokeh.pydata.org/en/latest/) documentation:\n\n>Bokeh is an interactive visualization library that targets modern web browsers for presentation. Its goal is to provide elegant, concise construction of versatile graphics, and to extend this capability with high-performance interactivity over very large or streaming datasets. Bokeh can help anyone who would like to quickly and easily create interactive plots, dashboards, and data applications.\n\nBokeh prides itself on being a library for interactive data visualization.\n\nUnlike popular counterparts in the Python visualization space, like Matplotlib and Seaborn, Bokeh renders its graphics using HTML and JavaScript. This makes it a great candidate for building interactive web-based dashboards and applications. \n\nBut what's the real difference among Bokeh, Matplotlib and Seaborn?\n\nAs a comment in this Reddit [thread](https://www.reddit.com/r/Python/comments/4tuwoz/how_do_you_decide_between_the_plotting_libraries/) says: \n\nEach library has its own distinct purpose:\n\nMatplotlib is for basic plotting -- bars, pies, lines, scatter plots, etc.\n\nSeaborn is for statistical visualization -- use it if you're creating heatmaps or somehow summarizing your data and still want to show the distribution of your data\n\nBokeh is for interactive visualization -- if your data is so complex (or you haven't yet found the \"message\" in your data), then use Bokeh to create interactive visualizations that will allow your viewers to explore the data themselves.\n\n[Here](https://mybinder.org/v2/gh/bokeh/bokeh-notebooks/master?filepath=tutorial%2F00%20-%20Introduction%20and%20Setup.ipynb) you have the official tutorial. It covers pretty everything you need to know, go through it. It contains exercises too.\\\n[Here](http://bokeh.pydata.org/en/latest/docs/user_guide.html) you have the official user guide.\n\nAnother list of useful additional tutorials: [1](https://towardsdatascience.com/data-visualization-with-bokeh-in-python-part-one-getting-started-a11655a467d4), [2](https://realpython.com/python-data-visualization-bokeh/), [3](https://towardsdatascience.com/data-visualization-with-bokeh-in-python-part-one-getting-started-a11655a467d4)\n\nAdditional examples: [1](https://www.journaldev.com/19527/bokeh-python-data-visualization), [2](https://programminghistorian.org/en/lessons/visualizing-with-bokeh), [3](https://www.analyticsvidhya.com/blog/2015/08/interactive-data-visualization-library-python-bokeh/), [4](https://www.geeksforgeeks.org/python-data-visualization-using-bokeh/), [5](https://github.com/bokeh/bokeh/tree/master/examples)\n\n#### Power BI\n[Power Bi](https://powerbi.microsoft.com/it-it/) is a super cool tool from Microsoft, used mostly in Business Intelligence to build relationships among data, cleaning and visualizing them in wonderful interactive dashboards. The thing that I love of Power BI is that's free for personal usage and very cheap for enterprise purposes. It's also super easy to use.\\\nCheck [this](https://www.youtube.com/watch?v=gqO0EiCn4cY) tutorial for beginners and then explore the official [Guided Learning](https://docs.microsoft.com/en-us/power-bi/guided-learning/), they have a lot of step-by-step tutorials and side projects to challenge yourself. \n\nGood additional resources to follow: [1](https://www.youtube.com/user/mspowerbi), [2](https://www.youtube.com/channel/UCFp1vaKzpfvoGai0vE5VJ0w), [3](https://www.youtube.com/channel/UC-h-wArcxJC8zBOD-UxfCOg), [4](https://www.youtube.com/channel/UCaTn-yDjPDvf-1CtJJHTNcQ), [5](https://www.youtube.com/user/ModernExcel)\n\nBest practices: [1](https://www.c-sharpcorner.com/article/power-bi-best-practices-part-3/), [2](https://docs.microsoft.com/it-it/power-bi/visuals/power-bi-visualization-best-practices), [3](https://community.powerbi.com/t5/Community-Blog/Best-Practices-For-Power-BI-Desktop-Development/ba-p/521710), [4](https://www.c-sharpcorner.com/article/power-bi-best-practices-part-3/), [5](https://powerpivotpro.com/2017/06/top-5-power-bi-visual-design-practices-transforming-good-great/)\n\n### Take Inspiration\nThe best way you can get self-confident with data visualization is to watch, watch, and watch data visualization.\nI put here plenty of resources where you can take inspiration and ideas from.\n\nWebsites: [1](https://www.idashboards.com/blog/2018/07/06/get-inspired-19-inspiring-data-viz-designs/), [2](https://medium.com/@Infogram/18-data-visualization-resources-for-education-and-inspiration-529c6f528983), [3](https://www.pinterest.it/stevenschillema/data-visualization-inspiration/?lp=true), [4](https://www.designyourway.net/blog/inspiration/data-visualization-designs-that-should-inspire-you-23-infographics/), [5](https://www.awwwards.com/websites/data-visualization/), [6](https://mode.com/resources/analytics-dispatch/data-visualization-examples/), [7](https://visme.co/blog/examples-data-visualizations/), [8](https://datavizproject.com/)\n\nBonus point!\nTry [Google Facets](https://pair-code.github.io/facets/), a super useful web-tool for fast visualizations. It's really EASY to use, and you can upload your dataset and get the first insights from it. It's also awesome for showing data to not-technical people.\n\n### Storytelling with Data\nI can't stress more on this point. When you prepare data visualizations, focus on a story to tell to your audience.\\\nThis approach has several [proven and positive](https://www.dataplusscience.com/files/Kosara_Computer_2013.pdf) effects.\\\n[**Definitely check this**](https://www.slideshare.net/kris77chan/edward-segel-interactivestorytelling), is the best resource I've ever found on this concept applied in data visualization.\\\n[Here](http://www.nickdiakopoulos.com/2013/04/12/storytelling-with-data-what-are-the-impacts-on-the-audience/) you find a good article that explains _why_.\\\n[Here](https://www.slideshare.net/kris77chan/edward-segel-interactivestorytelling)'s a great presentation about storytelling with data.\\\n[Here](https://www.forbes.com/sites/brentdykes/2016/03/31/data-storytelling-the-essential-data-science-skill-everyone-needs/#202002b852ad) another interesting read.\n\n### Common Visualization Mistakes\nFrom an old Chinese statement:\n> Look at the other's mistakes, and correct your ones.\n\nTo know what are the most frequent mistakes is fundamental to master a skill, so I list here for you a bunch of resources that will give you the awareness of the \"Don't\"s in data visualization:\n\n- [1](https://www.anychart.com/blog/2017/08/29/data-visualization-mistakes-avoid/), [2](https://undullify.com/data-visualization-102-common-mistakes-visualizing-data/), [3](https://www.rtinsights.com/what-are-the-5-most-common-data-visualization-mistakes/), [4](https://thenextweb.com/dd/2015/05/15/7-most-common-data-visualization-mistakes/), [5](https://www.reddit.com/r/datascience/comments/8wj1nr/play_your_charts_right_an_illustrated_collection/)\n\n### Additional Resources\nI really love data visualization and during the last years, I've collected a lot of cool websites and \"need-to-bookmark\" places. I've already given you a lot of them, here I list everything else is remaining.\n\n- [Data is Beautiful SubReddit](https://www.reddit.com/r/dataisbeautiful/)\n- [Analytics SubReddit](https://www.reddit.com/r/dataviz/)\n- [The Pudding](https://pudding.cool/)\n- [Flow Data](https://flowingdata.com/)\n- [Small Multiples](https://smallmultiples.com.au/projects/)\n- [Awesome Interactive Journalism](https://github.com/wbkd/awesome-interactive-journalism)\n- [EdwardTufte Twitter account](https://twitter.com/EdwardTufte)\n- [Fivethirtyeight](https://fivethirtyeight.com/)\n- [List of super cool websites](https://www.reddit.com/r/dataisbeautiful/comments/435g7b/i_love_live_data_visualizations_heres_every_one/)\n- [Every line of Hamilton](https://pudding.cool/2017/03/hamilton/)\n- [Storytelling with Data blog](http://www.storytellingwithdata.com/)\n\n### Wrapping up and looking forward\nWhat I've tried to here is to list a map of the most useful resources about data visualization (I've searched and compared a lot of them), trying to give you a reference point of the subject.\\\nAs I suggested to you earlier, the only way to become really comfortable with something is to face it in the first person. So the best tip I can give you is \"find your project\". \n\n- Choose an argument that interests you in some way. You can find a lot o free public dataset to experiment with. Check your country websites or enter [Kaggle](https://www.kaggle.com/) or  [UCI](https://archive.ics.uci.edu/ml/index.php) to find a lot of them. \n- Plot the data in every way you can experiment, applying the techniques you have seen.\n- Inspire yourself watching how people visualized similar datasets. Search in Kaggle for \"Visualization\" and you'll be stunned by the number of examples.\n\nIt's better to be proficient in one tool and barely know other ones, than being the jack of all trades but masters of none. So, I suggest you choose the tool that inspires you more and diving deep into that. In fact, the tools we've seen overlap with each other in many ways, but they are different in scale and approach.\n\nHappy Learning and good luck with your studies!\n\n-------------------------\nWritten by [_clone95_](https://github.com/clone95)\n"
  },
  {
    "path": "Specializations/SoftSkills/ImpactfulPresentations.md",
    "content": "# Impactful Presentations\n\n## Why do you need to impress your audience?\n\nIn my day, in the ancient Rome, data scientists were called [haruspexes](https://en.wikipedia.org/wiki/Haruspex). \nThe state-of-art technique they used to represent data and make decisions based on it was to spread the entrails of a bird on a sacred table and try to interpret them. \n\"Such a small stomach? Aha! I'm going to tell the general now that it's time to attack decisively!\"\n\nBut they always had that problem that they couldn't exceed an average success of 50 percent!\nToday, fortunately, we have more effective tools and the core field \"Data Science\" is looking at the factual evidence of the past to try to make better decisions in the present that affect the future. In the age of data-driven decisions, it is increasingly important to have a clear representation of them and how they advise us to act in practice. \n\nLet us give a few examples:\n\nE-Commerce may want to understand which products are best sold, to what kind of target, in what volumes. \nIt may want to understand which products are often bought together so you can \nget the famous \"hey, the other users who bought X also bought Y!\".\\\nA newspaper might be interested in how age groups are divided and in what numbers, among its readers, \nand might also want to see at what time of day its articles are consulted and from what type of device (mobile, desktop, real paper?).\\\nA bank wants to understand what are the maximum margins that can be put on policies and loans, to find the best compromise between competitiveness and gain. These are just a few examples, now let's try to make a game:\ntry to think of any kind of human activity, involving more than 5 humans, that would benefit from a clear representation\nof the data of their activity, to make actual decisions. \n\nYou will find that this reasoning applies to anything, _if you have enough data!_\n\nExtracting knowledge from the data, however, is useless if then the audience \nto which we must communicate(managers, customers, colleagues, departments) \ndoes not perceive the urgency of looking at the data to make decisions!\n\nWith this guide, I want to introduce you to the key principles for effectively presenting your data and the conclusions\nthat can be drawn from them. Remember! Every decision you propose will always have a certain risk of not being the right one \n(the real world is based on unpredictable and chaotic mechanics and interactions), but the important point in all this is to \nget as far away as possible from the success achieved by the haruspex and their weak and random 50 percent.\n\nDuring this guide, I consider that you're presenting with the tech support of simple slides.\n\n## Prerequisites\nNo one! But read [this book](https://www.amazon.it/Pyramid-Principle-BarbaraMinto/dp/0273710516) if you have time!\n\n# Index\n- [How to build the content](#How-to-build-the-content)\n   - [Know your audience](#Know-your-audience)\n   - [Develop high quality content](#Develop-high-quality-content)\n   - [Build a structure](#Build-a-structure)\n   - [Less is more](#Less-is-more)\n   - [Leverage data power wisely](#Leverage-data-power-wisely)\n   \n- [How to present the content](#How-to-present-the-content)\n   - [Connect with your audience](#Connect-with-your-audience) \n   - [Don’t read](#Don’t-read)\n   - [Be intriguing](#Be-intriguing)\n   - [Use humor](#Use-humor)\n   - [Do not tell lies](#Do not tell lies)\n   - [Take care with contradictions](#Take care with contradictions)\n   - [The Pragmatic Storyteller](#The-Pragmatic-Storyteller)\n \nLet's dive right in!\n\n## How to build the content\n\n### Know your audience\nAre you talking to managers or developers? Are you educating your sellers, or are you the same seller who has to convince a customer?\nIn any case, the first rule is [**Know your audience**](https://www.asme.org/career-education/articles/public-speaking/public-speaking-know-your-audience).\nIf you know your audience, their tastes, their interests, you can build your presentation in the best and most targeted way. [Here](https://www.ethos3.com/2009/10/5-ways-to-get-to-know-your-audience/) you find 5 more ways to do it.  \n\n### Develop high-quality content\nThe content is the nucleus of your presentation. While all the other ideas below will help you make your content more effective, a great presentation starts and ends with great content. So don't shorten your audience by shortening the effort you spend developing your content. You will need to invest many hours of research, writing and asking feedbacks if you want to create a presentation that your audience will love. You want to refine your material as more as you can, but don't over prepare everything, otherwise, you'll seem too much rigid and artificial: we'll see that one of the key points in this guide will be \"be authentic\".\n\n### Build a structure\nI strongly advise you to build an organic structure that you then follow in your presentation.\n\n[Here](https://virtualspeech.com/blog/how-to-structure-your-presentation) you find a good overview of \"how to build a structure\".\n[Here](https://visme.co/blog/presentation-structure/) you find 7 common structures.\nA simple and well-known structure is the 3-act one.\n\nAlthough not all presentations fit easily into the 3-act structure, it is generally a good general method to follow (with the necessary adjustments according to the situation).\n\n**1** - The first Step is the introduction, the setting of the presentation. This is the moment when you capture the audience's attention, giving them the expectation of what will come out of it and a reason to keep listening.\n\n**2** - The intermediate Step is the moment when you support their interest. You are usually detailing a problem and offering a solution while you educate and inform along the way. It is here where you truly build your case and sell the benefits. This is where you want to provide compelling examples, data, statistics, etc. to support your points.\n\n**3** - The final Step is where you solve the problem, summarizes it and reminds the audience of the highlights of your presentation. Then leave the audience with a call to action and a list of practical points. What is supposed to be taken away from your presentation by the audience? This should be clearly defined in the closing Step. Also, a final story or illustration and questions from the audience are a great way to end the presentation and help people remember the sense of your discourse.\n\n### Less is more\nPacking slides with information do not necessarily make them more effective. In fact, you often get the opposite effect by producing confusing slides that take away, rather than adding value to a  presentation.\nWell-designed slides help the speaker to emphasize his or her point of view and the audience to understand the key steps of a presentation.\\\nFollow the principle of [\"Less is More\"](https://www.presentation-guru.com/when-it-comes-to-presentations-less-is-more/).\\\n[The Hemingway Editor](http://www.hemingwayapp.com/) will help a lot you writing in a good style, preferring conciseness and fluency.\n\n### Leverage data power wisely\nAccording to SpiderMan's uncle:\n> From great power comes great responsibility.\n\nThe data can be of help or your enemies during a presentation, depending on how you use them and especially you show them graphically. Don't put too much data in your presentation (remember, Less is More)!\nTake this [awesome read](https://moz.com/blog/data-visualization-principles-lessons-from-tufte), then find [here](http://mkweb.bcgsc.ca/talks/datavisualization/datavisualization.pdf) great examples of what I'm saying. \n\n## How to present the content\n\n### Connect with your audience\nFirst, you need to [create a link](https://www.forbes.com/sites/lisaroepe/2017/03/14/6-ways-to-connect-with-your-audience-during-a-presentation/#73e158396516) between you and your audience. In this way, they'll follow you because they trust that you're useful for them and you genuinely want them to learn something. I like to call this process [\"building trust\"](https://www.trainingjournal.com/articles/opinion/how-build-trust-audience-when-making-presentation). \n\n### Don’t read\nReally, don't do it. Reading slides will bore your audience and you'll seem less confident.\n[Here's](https://www.techwell.com/2013/10/give-better-presentation-don-t-read-your-slides) why.\n[Here's](https://academia.stackexchange.com/questions/76370/why-do-most-people-think-its-a-bad-idea-to-read-from-slides) a mine full of other reasons.\n\n### Be intriguing\nThe best way to attract people is to grab their attention. Doing this it's not so easy, but with some psychological tricks you can bewitch and convince them. [Here](https://www.inc.com/sims-wyeth/how-to-capture-and-hold-audience-attention.html) you have a really good explanation of what I'm saying.\n\n### Use humor\nIf you're here, it's mostly because I've been intrigued and caught your attention. A big part of this game has been played by humor.\n[Here](https://www.writersdigest.com/online-editor/how-to-mix-humor-into-your-writing) you can learn how to embed humor in your writings, and [here](https://www.fastcompany.com/3068891/how-to-incorporate-humor-into-presentations-in-the-most-un-cringeworthy-way) you can learn how to do it in your speeches.\n\n### Do not tell lies.\nNowadays is very easy check a lot of information. Always be sure your information is true. When the audience know or figure out your information is false, they disconnect from you and you lose your credibility.\n\n### Take care with contradictions.\nCheck before start all your speech is connect and have not contradictions. Say something and a few minutes later say the opposite is very bad for your credibility. Always take care with that.\n\n### The Pragmatic Storyteller\nA sunny morning, in the 44 B.C.\n> \"Good morning, noble court legislators. Today I want to tell you a personal story. At the age of 7, my father took me to the Colosseum in Rome for the first time to see the gladiators fight.  Like all children, I was very excited about that day, I saw all the older boys playing the game of gladiators with fake swords and talk about the furious fights between men, lions, and elephants!\nTens of thousands of people were there for the same reason, seeing two prisoners fighting in blood until one of them wins.\nI was feeling different sensations in the air: the excitement in the audience, who wants to vent their repressed violence, the fear in the eyes of the fighters, who know that everyone will fight with the utmost commitment because it is at stake his life.\nThe clash begins, the crowd screams and enjoys seeing this show that I can only consider terrifying. In the end, the strongest physically wins and kills mercilessly the other.\nDear noble legislators, today I'm 50 years old and I'm here to ask you: is this the symbol we want for the Roman civilization? How do we differ from the barbarians beyond the Alps?\nHow can we consider ourselves a refined people rich in culture, if we fall into easy vices like that of gratuitous violence? For these reasons, appealing to your intelligence, _I suggest you abolish the violent games in the Colosseum, for the sake of the image of our civilization._\n\nThis was **the personal Virgilio's story** that was talking, not me.\nThis was Storytelling.\n\nYou can notice several things:\n- Coherent flow (I didn't improvise.)\n   - Setting\n   - Story \n   - Emotions and sensations (you need to reproduce them in your audience)\n   - Motivations for the conclusion\n   - Conclusion\n- Use of the first person\n- Rhetorical questions\n- Naturalness\n- Confidence with the public that grows with the story, while we show spontaneity and humility\n- In the end, a wrap-up of reasons and the practical suggestion\n\nApply [StoryTelling](https://blog.hubspot.com/marketing/storytelling) in a coherent fashion.\n\nThe more authentic, visceral and suggestive you are, the more your audience will trust you and remember\nthe concepts.\n\n[Here](https://www.youtube.com/watch?v=Nj-hdQMa3uA) a brief Ted Talk about this.\\\n[Here](https://www.articulatemarketing.com/blog/22-rules-of-storytelling-from-pixar) you find a great list of storytelling best practices from Pixar.\\\n[Here](https://visme.co/blog/visual-storytelling-rules/) you find the rules of thumb of visual storytelling.\n\n----\nWritten by [_clone95_](https://github.com/clone95)\n"
  },
  {
    "path": "Tools/GeoGebra.md",
    "content": "# GeoGebra\n[GeoGebra](https://www.geogebra.org) (GG) is a powerful dynamic mathematics application for all levels of education that combines geometry, algebra, spreadsheet, grapher, statistics and infinitesimal calculation into a single easy-to-use software. The GeoGebra community is growing exponentially with millions of users based in many countries. GeoGebra has become the leading provider of software for advanced mathematics, science support, technology, engineering and mathematics and innovations in teaching and learning around the world.\n\n## Installation\nGeoGebra applications can be used offline for [iOS](https://itunes.apple.com/us/app/geogebra-graphing-calculator/id1146717204), [Android](https://play.google.com/store/apps/details?id=org.geogebra.android), [Windows](https://www.geogebra.org/download), Mac, Chromebook and Linux.\n\nWe also advise you that all installers are subject to the non-commercial license. If you intend to install GeoGebra on several devices, you may be interested in GeoGebra Mass Installation.\n\n\n## Features\n- Geometry, Algebra and Spreadsheet are connected and fully dynamic\n- Ease of use of the interface with many powerful features\n- Innovative tool for creating interactive learning resources in the form of web pages\n- Open source software freely usable by non-commercial users\n\nIn the simplest way, you can make constructions containing points, vectors, segments, lines and conics as well as functions, which can then be modified dynamically with the mouse.\n\n## Mathematical representations of GeoGebra\nGeoGebra includes three different representations of mathematical objects: _a graphical representation, an algebraic representation and a spreadsheet representation_.\nThese allow each of the three different representations of mathematical objects to be displayed: graphical (e. g. points, function curves), algebraic (e. g. point coordinates, equations), and in spreadsheet cells. \n\n## GeoGebra applications\nWe will demonstrate how easy it is to use GeoGebra applications by presenting:\n\n- [Scientific Calculator](#scientific-calculator)\n- [Graphing Calculator](#graphing-calculator)\n\nAll GeoGebra applications are fully compatible because they are based on the same powerful GeoGebra math engine. Your GeoGebra folders will run in all applications and on all your devices.\n\n### Scientific Calculator\nThe GeoGebra scientific calculator is available online via this [site](https://www.geogebra.org/calculator).\nGeoGebra is a scientific calculator that includes:\n- Calculations using fractions\n- Trigonometric functions: `sin`, `cos`, `tan`\n- Statistical functions\n- Exponential functions and logarithms\n- Mode examen pour les tests\n\nThe GeoGebra scientific calculator consists of a header bar, an input bar and a scientific calculation keyboard. The scientific calculator consists of three different keyboards. The keyboards can be switched by selecting the one you want to use.\n-  _`123` keyboard_: provide keys for numbers and basic mathematical operations and symbols. Keys for numbers and basic arithmetic, trigonometric and logarithmic operators are available.\n- _`f(x)` keyboard_: provide statistical and other mathematical functions.  The keys are used to select other mathematical and statistical functions.\n- _`ABC` keyboard_: contains letter keys. It includes alphabetical keys \n\n### Graphing Calculator\nThe GeoGebra Graphing calculator is available online via this [site](https://www.geogebra.org/graphing). This graphing calculator gives you the possibility to draw functions and to explore equations.\n \nIn or to create a new curve, please type your expression in the input field. The software then traces the representative curve of your expression as you type.\nFor example, you can draw a simple line by typing this expression `y = 2x + 3`. In order to make the graph more dynamic, you can use parameters instead of constants (as an example, `y = ax + b`).\nAdd cursors in the parameters by clicking on the relevant buttons or define them yourself by entering `a=2` and `b=3`. If you assign constant values to parameters such as `a` and `b`, you will automatically be able to adjust these values using cursors. \n\nGraphing Calculator features include: \n- Representing functions, polar and parametric curves\n- Solving equations with a powerful mathematical engine\n- Experimenting transformations with cursors\n- Calculating derivatives and integrals\n- Making statistics and regressions with fitting lines\n\n------------\nCreated by Khaled Bayoudh. Contacts: [mail](mailto:khaled.isimm@gmail.com) [platform](http://deep-tech.cf)\n\n\n"
  },
  {
    "path": "Tools/Latex.md",
    "content": "# LaTeX\r\nLaTeX is a markup language (or, as said in the [official website](https://www.latex-project.org/about/), \"a document preparation system for high-quality typesetting\") used to create wonderful papers and presentations. Almost all papers you will read during your career are written using LaTeX. So, let's see how it works!\r\n\r\n## Why LaTeX?\r\nFor years now LaTeX has been the go-to tool whenever someone needs to create a document that will contain mathematical formulas. LaTeX is used a lot to write scientific papers and it is also used by bloggers and scientific content creators in the internet. You can even use LaTeX syntax on facebook messenger! (which only renders if you are on your computer)\r\n\r\n## Installation\r\nThere are several LaTeX distributios, you can see a complete list [here](http://www.tug.org/interest.html#free).\r\n\r\nUnder Unix systems, you can install [TeXLive](http://www.tug.org/texlive/). In particular, under Ubuntu you can type in the terminal `sudo apt-get install texlive-full`. \r\nUnder Windows systems, you can install [MiKTeX](https://miktex.org/) or also [TexLive](http://www.tug.org/texlive/).\r\nUnder MacOs, [MacTex](http://www.tug.org/mactex/).\r\n\r\nAfter the installation, you need an editor to write your LaTeX document. You can use whatever editor you want (notepad, vim, nano, gedit and so on) but I recommend you to choose [Texmaker](http://www.xm1math.net/texmaker/) which is free and cross platform. It is also worth saying that Visual Studio Code with some dedicated extensions (such as [LaTeX Workshop](https://marketplace.visualstudio.com/items?itemName=James-Yu.latex-workshop)) is pretty good to use.\r\n\r\n## Writing a document\r\nThere are tons of on-line guides about LaTeX to get you started. Among them:\r\n- A comprehensive guide can be found [here](https://en.wikibooks.org/wiki/LaTeX).\r\n- Another cool guide [here](https://www.latex-tutorial.com/tutorials/).\r\n- [This one](http://www.docs.is.ed.ac.uk/skills/documents/3722/3722-2014.pdf) is perfect for beginners.\r\n- Also [here](http://web.mit.edu/rsi/www/pdfs/new-latex.pdf) another guide.\r\n\r\nIt's also possible to write your LaTeX document on-line and share it with your collaborators using [OverLeaf](https://www.overleaf.com/).\r\n\r\nThere are already lots of templates made. You can find some of them [here](https://www.latextemplates.com/).\r\n\r\nTo draw awesome graphs and charts, you can use the package [TikZ](https://en.wikipedia.org/wiki/PGF/TikZ).\r\n\r\nAlso a good site to keep in mind when facing a problem with LaTeX is [StackOverflow](https://tex.stackexchange.com/) with the LaTeX dedicated section.\r\n\r\n### Tools to increase productivity\r\nThe LaTeX syntax can seem daunting at first, with plenty of new commands for all the mathematical symbols you know and need to use.\r\n  - [This website](https://www.codecogs.com/latex/eqneditor.php) allows one to write a formula online, and it also has plenty of symbols in which you can just click, generating the code you need. You can also preview your formula, so that it is easier for you to make sure everything is being properly written.\r\n  - Whenever you need a symbol but you don't know the command, use [this site](http://detexify.kirelabs.org/classify.html). All you have to do is draw the symbol and then suggestions will appear on the right.\r\n  - Creating tables in LaTeX can be particularly annoying. I usually do it [here](https://www.tablesgenerator.com/) and then ask the site to generate the appropriate code.\r\n  - [MathJax](https://www.mathjax.org/) is one of the ways in which you can get LaTeX to render, say, in your blog! (example [here](http://mathspp.blogspot.com/2018/11/twitter-proof-roots-go-hand-in-hand.html), where the formulas are rendered with MathJax)\r\n  - [Mathpix Snipping Tool](https://mathpix.com/) helps you to convert images to LaTeX by just taking a screenshort of desired math formula. It can also recognize arrays and various math fonts.\r\n\r\n## Useful Packages\r\n\r\nNow that you know how to produce a (simple) LaTeX document, you may feel the need to write or draw particular content. To do so, you can use specific packages. All you need to do is to include them at the beginning of your document with the command `\\usepackage{name_of_the_package}`.\r\n\r\n### Displaying Math\r\n\r\nThe [`amsmath` package](https://ctan.org/pkg/amsmath) provides miscellaneous enhancements for improving the information structure and printed output of documents that contain mathematical formulas, as stated in [this useful guide](http://texdoc.net/texmf-dist/doc/latex/amsmath/amsldoc.pdf). \r\n\r\nExtra mathematical fonts and symbols can be used by including the [`amssymb` package](https://ctan.org/pkg/amsfonts). A recap can be found [here](http://milde.users.sourceforge.net/LUCR/Math/mathpackages/amssymb-symbols.pdf).\r\n\r\n### Code Blocks\r\n\r\nThe [`listings` package](https://ctan.org/pkg/listings) allows to insert programming code in your LaTeX document. You can highlight code, or specify your language of choice and let the package automatically colour special words, comments, etc for you. [Here](https://www.overleaf.com/learn/latex/Code_listing) a guide with examples.\r\n\r\nBased on the previous package, [`pythonhighlight`](https://ctan.org/pkg/pythonhighlight) is a simple Python highlighting style to be used with LaTeX. You can find the very simple instructions [here](https://github.com/olivierverdier/python-latex-highlighting).\r\n\r\nTo write pseudocode, you can use [algorithms](https://ctan.org/pkg/algorithms), which consists in two packages: `al­go­rithm` and `al­go­rith­mic`. [Here](https://math-linux.com/latex-26/faq/latex-faq/article/how-to-write-algorithm-and-pseudocode-in-latex-usepackage-algorithm-usepackage-algorithmic) you can find examples and useful commands.\r\n\r\n### Logic\r\n\r\nFor natural deductions there's the [`bussproofs` package](https://ctan.org/pkg/bussproofs). You can find the user guide with examples [here](https://www.math.ucsd.edu/~sbuss/ResearchWeb/bussproofs/BussGuide2_Smith2012.pdf).\r\n\r\nIf you find tedious manually writing truth tables, [here](http://www.siafoo.net/snippet/249) you'll find an incredibly useful Pyhton script. It automatically generates the LaTeX code of a compiled truth table given one or more propositional logic formulas. (Note: remember that in Python you can write *p* &rarr; *q* as `not p or q` as they are logically equivalent).\r\n\r\n### Automata\r\n\r\nTo draw finite state machines with LaTeX you can use the `tikz-automata` package, [here](https://www3.nd.edu/~kogge/courses/cse30151-fa17/Public/other/tikz_tutorial.pdf) a quick tutorial. You can also automatically generate the code using [this website](https://notendur.hi.is/aee11/automataLatexGen/).\r\n\r\n### This is why you need to learn Machine Learning \r\nOh damn, take a look at [this](https://mathpix.com/).\r\n\r\n------------\r\nCreated by Damiano Azzolini. Contacts: [mail](mailto:damiazz94@gmail.com) [github](https://github.com/damianoazzolini)\r\n\r\nExpanded upon by the editor of the [Mathspp Blog](https://mathspp.blogspot.com), [RojerGS](https://github.com/RojerGS), and by Lara Vignotto ([mail](mailto:lara.vignotto@gmail.com), [github](https://github.com/laravignotto))\r\n"
  },
  {
    "path": "Tools/MLDemos/README.md",
    "content": "# MLDemos\n\n[MLDemos](http://mldemos.b4silio.com/) is an open-source visualization tool for machine learning algorithms created to help studying and understanding how several algorithms function and how their parameters affect and modify the results in problems of classification, regression, clustering, dimensionality reduction, dynamical systems and reward maximization.\n\nMLDemos is open-source and free for personal and academic use.\n\n![organizations](organizations.png)\n\n## Install\n\n### Binary Packages\n\n#### Legalities  \n\nThe packages contain binary versions of a number of opensource libraries. I am including them here with the knowledge that this might not be entirely compatible with the distribution policies of each respective library. I will try to contact and get the necessary permissions, to the extent to which this is possible, from the related parties. In the meantime, I distribute this software in good faith, my goal is for people to be able to study and work with the different methods implemented here. See the acknowledgements section below for a list of the people who contributed.\nYou are free to use this software for personal and educational purposes, you are not allowed to use it for commercial purposes. You can redistribute the software as long as you provide a link to this page. Then again, this page will always link to the latest version of the software so you may be better off taking the version here anyway.\n\n### Source Code\n\nThe MLDemos source code can be obtained directly via git or from the public repository (get the *devel* branch for the latest release)\n\n```sh\ngit clone git://gitorious.org/mldemos/mldemos.git -b devel\n```\n\n[public GitHub repository](https://github.com/b4silio/MLDemos)\n[source_backup](http://mldemos.b4silio.com/MLDemos-0.3.0-source.zip) (0.3.0)\n\n#### **Requirements**\n\nThe code requires Qt (5.10) and (in part) OpenCV (3.1) and Boost (1.47). Previous versions of these libraries might work as well but you might as well use the newer version. Be sure to adjust your include and lib paths to point them to the correct directories.\n\nThe software was compiled and tested on Mac OSX High Sierra, Windows 10, Gentoo, Ubuntu and Kubuntu 10.04, using QtCreator 2.1 and 2.6.\n\n* Windows\nIn order to compile MLDemos in windows, you will need MinGW (commonly installed with the QtSDK for MinGW.\n\n* Debian\nProf. Barak A. Pearlmutter has created a debian package, which will be available soon. In the meantime you can build it following the instruction below:\n\n```sh\ngit clone git://github.com/barak/mldemos.git\ncd mldemos\ngit checkout debian\ndpkg-checkbuilddeps\nfakeroot debian/rules binary\nsudo dpkg --install ../mldemos_*.deb\n```\n\n> Note: OpenCV 2.4 is not available directly (only 2.1 is), which will require you to build OpenCV2.4\\. This is only necessary to use MLP and Boosting. These are two important algorithms, so you might as well make the effort:\n\n```sh\ngit clone git://github.com/barak/opencv.git\ncd opencv\ngit checkout master\ndpkg-checkbuilddeps\nfakeroot debian/rules binary\nsudo dpkg --install ../*opencv*.deb\n```\n\nAgain, a huge thanks to Barak!\n\n### **Known Bugs**\n\n* WINDOWS: Clearing the canvas while in the 3D display leaves part of the memory occupied, which can accumulate when this is done several times (part of a memory bug on Windows only)\n* LINUX (CDE package) loading and saving of external files does not work\n* Approximate KNN classification creates weird blank spaces on some machines and with some metrics.\n* Saving does not work on the linux CDE package\n* Resizing the canvas when a reward map has been drawn does not update the underlying data (avoid doing it).\n* In Boosting, changing the data does not recompute the learners, which can lead to bad results if the data has changed boundaries significantly\n\n### **What's New** [Changelog](http://mldemos.b4silio.com/changelog.txt)\n\nv0.5.0\n\n### *New Visualization and Dataset Features*\n\n* *Added 3D visualization of samples and classification, regression and maximization results*\n* *Added Visualization panel with individual plots, correlations, density, etc.*\n* *Added Editing tools to drag/magnet data, change class, increase or decrease dimensions of the dataset*\n* *Added categorical dimensions (indexed dimensions with non-numerical values)*\n* *Added Dataset Editing panel to swap, delete and rename dimensions, classes or categorical values*\n* *Several bug-fixes for display, import/**export** of data, classification performance*\n\n### *New Algorithms and methodologies*\n\n* *Added Grid-Search panel for batch-testing ranges of values for up to two parameters at a time*\n\n* *Added One-vs-All multi-class classification for non-multi-class algorithms*\n\n* *Trained models can now be kept and tested on new data (training on one dataset, testing on another)*\n\n* *Added Automatic Relevance Determination for SVM with RBF kernel (Thanks to Ashwini Shukla!)*\n\n* *Added Growing Hierarchical Self Organizing Maps (original code by Michael Dittenbach)*\n\n* *Added Random Forest classification*\n\n* *Added LDA as a classifier (in addition to projector)*\n\n* *Added Save/Load Model option for GMMs and SVMs*\n\n## Screenshots\n\n![MLDemos](MLDemos.png)\n\n## Algorithms\n\n### Implemented Methods\n\n#### **Classification**\n\n* Support Vector Machine (SVM) (C, nu, Pegasos)\n* Relevance Vector Machine (RVM)\n* Gaussian Mixture Models (GMM)\n* Multi-Layer Perceptron + BackPropagation\n* Gentle AdaBoost + Naive Bayes\n* Approximate K-Nearest Neighbors (KNN)\n* Gaussian Process Classification (GP)\n* Random Forests\n\n#### **Regression**\n\n* Support Vector Regression (SVR)\n* Relevance Vector Regression (RVR)\n* Gaussian Mixture Regression (GMR)\n* MLP + BackProp\n* Approximate KNN\n* Gaussian Process Regression (GPR)\n* Sparse Optimized Gaussian Processes (SOGP)\n* Locally Weighed Scatterplot Smoothing (LOWESS)\n* Locally Weighed Projection Regression (LWPR)\n\n#### **Dynamical Systems**\n\n* GMM+GMR\n* LWPR\n* SVR\n* SEDS\n* SOGP (Slow!)\n* MLP\n* KNN\n* Augmented-SVM (ASVM)\n\n#### **Clustering**\n\n* K-Means\n* Soft K-Means\n* Kernel K-Means\n* K-Means++\n* GMM\n* One Class SVM\n* FLAME\n* DBSCAN\n\n#### **Projections**\n\n* Principal Component Analysis (PCA)\n* Kernel PCA\n* Independent Component Analysis (ICA)\n* Canonical Correlation Analysis (CCA)\n* Linear Discriminant Analysis (LDA)\n* Fisher Linear Discriminant\n* EigenFaces to 2D (using PCA)\n\n#### **Reward Maximization** *(Reinforcement Learning)*\n\n* Random Search\n* Random Walk\n* PoWER\n* Genetic Algorithms (GA)\n* Particle Swarm Optimization\n* Particle Filters\n* Donut\n* Gradient-Free Methods (nlopt)\n\n### Contributing\n\nIf you are developing a new algorithm that could fit into the MLDemos framework and would like to see it integrated into the software, please get in contact (see info below) and describe what type of help you require for the implementation of a MLDemos plugin.\n\n### Acknowledgements\n\nThis program would not exist if a number of people had not put a lot of effort into implementing the different algorithms that are combined here into a single program.\n\n* Florent D'Hallouin (GMM + GMR) - [LASA](http://lasa.epfl.ch/)\n* Dan Grollman (SOGP) - [LASA](http://lasa.epfl.ch/)\n* Mohammad Khansari (SEDS + DSAvoid) - [LASA](http://lasa.epfl.ch/)\n* Ashwini Shukla (ASVM, ARD Kernels) - [LASA](http://lasa.epfl.ch/)\n* Stephane Magnenat (ESMLR) - [website](http://stephane.magnenat.net/)\n* Chih-Chung Chang and Chih-Jen Lin (libSVM) - [website](http://www.csie.ntu.edu.tw/~cjlin/libsvm/)\n* David Mount and Sunik Arya (ANN library) - [website](http://www.cs.umd.edu/~mount/ANN/)\n* Davis E. King (DLIB) - [website](http://dlib.net/)\n* Stefan Klanke and Sethu Vijayakumar (LWPR) - [website](http://www.ipab.inf.ed.ac.uk/slmc/software/lwpr/)\n* Robert Davies (Newmat) - [website](http://www.robertnz.net/nm_intro.htm)\n* JF Cardoso (ICA) - [website](http://www.tsi.enst.fr/icacentral/algos.html)\n* Steven G. Johnson (NLOpt) - [website](http://ab-initio.mit.edu/wiki/index.php/NLopt)\n* The WillowGarage crowd (OpenCV) - [website](http://opencv.org/)\n* Trolltech/Nokia/Digia (Qt) - [website](http://qt.digia.com/)\n* The authors of several of the icons - [website](http://www.iconeasy.com/)\n* The PhD students following the 2012 ML class at EPFL (Julien Eberle, Pierre-Antoine Sondag, Guillaume deChambrier, Klas Kronander, Renaud Richardet, Raphael Ullman)\n\nMoreover, the program itself would be far less performant without the work of the support and development team at LASA: Christophe Paccolat, Nicolas Sommer and Otpal Vittoz.\n\nThanks also to the people who have not contributed code but have contributed no less directly: Aude Billard, for being one of the best bosses one could wish for, François Fleuret, for a bunch of fruitful discussions, and the AML 2010,  and 2011 classes for patiently giving it a first test-drive.\n\n## quick start\n\n### Very quick start\n\n1. Launch the software\n1. Draw samples by clicking either the left or right mouse button.\n    1. left-click generates samples of class 0\n    1. right-click generates samples of the class selected in the toolbar (default: 1)\n1. Select the Display Options icon\n    1. this will allow you to display model information, confidence/likelihood maps and to hide the original samples\n    1. the mouse wheel will allow you to zoom in and out\n    1. alt+dragging will allow you to pan around the space\n1. Select the Algorithms Options icon\n1. Select one of the algorithm icons to open their respective option panels\n1. Click the Classify button to run the algorithm on the current data\n\n### Importing data\n\nGenerating data in MLDemos is done in three different ways: by manually drawing samples, by projecting image data through PCA (via the PCAFaces plugin), or by loading external data.\n\nComma separated values, or other text-file based value tables can be drag-and-dropped into the interface. In this case a Data Loading dialog will appear to allow choosing which columns or rows should loaded, interpreted as class labels or headers, etc.\n\nAlternatively, a native data format used by the software is ascii-based and contains:\n\n1. The # of samples followed by # of dimensions\n1. For each sample, one line containing\n    1. The sample values space-separated (float, one per each dimension)\n    1. The sample class index (integer 0 ... 255)\n    1. A flag value (integer 0-3) to terminate the line (unused for the time being)\n\nA simple example would be\n\n```code\n4 3\n0.10 0.11 0.12 0 0\n0.14 0.91 0.11 0 0\n0.43 0.74 0.41 1 0\n0.28 0.34 0.33 1 0\n```\n\nwhich presents 4 three-dimensional samples, two from class 0 and one from class 1.\n\nWhen the file is saved from MLDemos, the software adds the current algorithm parameters (provided an algorithm was selected), which can be useful for demonstration purposes. If no such information is present, the default algorithm parameters are selected.\n\nDrawing manually some samples, or importing a standard dataset and saving it from within MLDemos should give you ample examples on the file syntax.\n\n------------\nCreated by Dr. Basilio Noris at the [Learning Algorithms and Systems Laboratory](http://lasa.epfl.ch/)\n\nExpanded upon by the editor of the [iOSDevLog Blog](http://iosdevlog.com/), [jiaxianhua](https://github.com/iOSDevLog)"
  },
  {
    "path": "Tools/Regex.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Regex introduction\\n\",\n    \"\\n\",\n    \"## What is a regex?\\n\",\n    \"[**Regex**](https://en.wikipedia.org/wiki/Regular_expression) stands for _regular expression_, and regular expressions are a way of writing patterns that match strings. Usually these patterns can be used to search strings for specific things, or to search and then replace certain things, etc. Regular expressions are great for string manipulation!\\n\",\n    \"\\n\",\n    \"## Why do regular expressions matter?\\n\",\n    \"From the first paragraph in this guide you might have guessed it, but regular expressions can be very useful **whenever you have to deal with strings**. From the basic renaming of a set of similarly named variables in your source code to [data preprocessing](https://github.com/clone95/Virgilio/blob/master/Specializations/HardSkills/DataPreprocessing.md). Regular expressions usually offer a concise way of expressing whatever type of things you want to find. For example, if you wanted to parse a form and look for the year that someone might have been born in, you could use something like `(19)|(20)[0-9][0-9]`. This is an example of a regular expression!\\n\",\n    \"\\n\",\n    \"## Prerequisites\\n\",\n    \"This guide does not assume any prior knowledge. Examples will be coded in Python, but mastery of the programming language is neither assumed nor needed. You are welcome to read the guide in your browser or to download it and to run the examples/toying around with them.\\n\",\n    \"\\n\",\n    \"# Index\\n\",\n    \" - [Basic regex](#Basic-regex)\\n\",\n    \"   - [Using Python re](#Using-Python-re)\\n\",\n    \"   - [$\\\\pi$ lookup](#$\\\\pi$-lookup)\\n\",\n    \" - [Matching options](#Matching-options)\\n\",\n    \"   - [Virgilio or Virgil?](#Virgilio-or-Virgil?)\\n\",\n    \" - [Matching repetitions](#Matching-repetitions)\\n\",\n    \"   - [Greed](#Greed)\\n\",\n    \"   - [Removing excessive spaces](#Removing-excessive-spaces)\\n\",\n    \" - [Character classes](#Character-classes)\\n\",\n    \"   - [Phone numbers v1](#Phone-numbers-v1)\\n\",\n    \" - [More `re` functions](#More-re-functions)\\n\",\n    \"   - [`search` with `match`](#search-with-match)\\n\",\n    \"   - [Count matches with `findall`](#Count-matches-with-findall)\\n\",\n    \" - [Special characters](#Special-characters)\\n\",\n    \"   - [Phone numbers v2](#Phone-numbers-v2)\\n\",\n    \" - [Groups](#Groups)\\n\",\n    \"   - [Phone numbers v3](#Phone-numbers-v3)\\n\",\n    \" - [Toy project about regex](#Toy-project-about-regex)\\n\",\n    \" - [Further reading](#Further-reading)\\n\",\n    \" - [Suggested solutions](#Suggested-solutions)\\n\",\n    \" \\n\",\n    \"Let's dive right in!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Just a quick word:** I tried to include some small exercises whenever I show you something new, so that you can try and test your knowledge. Examples of solutions are provided in the [end of the notebook](#Suggested-solutions).\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Basic regex\\n\",\n    \"\\n\",\n    \"A regex is just a string written in a certain format, that can then be used by specific tools/libraries/programs to perform pattern matching on strings. Throughout this guide we will use `this formatting` to refer to regular expressions!\\n\",\n    \"\\n\",\n    \"The simplest regular expressions that one can create are just composed of regular characters. If you wanted to find all the occurrences of the word _\\\"Virgilio\\\"_ in a text, you could write the regex `Virgilio`. In this regular expression, no character is doing anything special or different. In fact, this regular expression is just a normal word. That is ok, regular expressions are strings, after all!\\n\",\n    \"\\n\",\n    \"If you were given the text _\\\"Project Virgilio is great\\\"_, you could use your `Virgilio` regex to find the occurrence of the word _\\\"Virgilio\\\"_. However, if the text was _\\\"Project virgilio is great\\\"_, then your regex wouldn't work, because regular expressions are **case-sensitive** by default and thus should match everything exactly. We say that `Virgilio` matches the sequence of characters \\\"Virgilio\\\" literally.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Using Python re\\n\",\n    \"\\n\",\n    \"To check if our regular expressions are working well and to give you the opportunity to directly experiment with them, we will be using Python's `re` module to work with regular expressions. To use the `re` module we first import it, then define a regular expression and then use the `search()` function over a string! Pretty simple:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"'Virgilio' is in 'Project Virgilio is great'\\n\",\n      \"'Virgilio' is not in 'Project virgilio is great'\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"import re\\n\",\n    \"\\n\",\n    \"regex = \\\"Virgilio\\\"\\n\",\n    \"str1 = \\\"Project Virgilio is great\\\"\\n\",\n    \"str2 = \\\"Project virgilio is great\\\"\\n\",\n    \"\\n\",\n    \"if re.search(regex, str1):\\n\",\n    \"    print(\\\"'{}' is in '{}'\\\".format(regex, str1))\\n\",\n    \"else:\\n\",\n    \"    print(\\\"'{}' is not in '{}'\\\".format(regex, str1))\\n\",\n    \"    \\n\",\n    \"if re.search(regex, str2):\\n\",\n    \"    print(\\\"'{}' is in '{}'\\\".format(regex, str2))\\n\",\n    \"else:\\n\",\n    \"    print(\\\"'{}' is not in '{}'\\\".format(regex, str2))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The `re.search(regex, string)` function takes a regex as first argument and then searches for any matches over the string that was given as the second argument. However, the return value of the function is **not** a boolean, but a *match object*:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"<re.Match object; span=(8, 16), match='Virgilio'>\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(re.search(regex, str1))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Match objects have relevant information about the match(es) encountered: the start and end positions, the string that was matched, and even some other things for more complex regular expressions.\\n\",\n    \"\\n\",\n    \"We can see that in this case the match is exactly the same as the regular expression, so it may look like the `match` information inside the match object is irrelevant... but it becomes relevant as soon as we introduce options or repetitions into our regex.\\n\",\n    \"\\n\",\n    \"If no matches are found, then the `.search()` function returns `None`:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"None\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(re.search(regex, str2))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Whenever the match is not `None`, we can save the returned match object and use it to extract all the needed information!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"The match started at pos 8 and ended at pos 16\\n\",\n      \"Or with tuple notation, the match is at (8, 16)\\n\",\n      \"And btw, the actual string matched was 'Virgilio'\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"m = re.search(regex, str1)\\n\",\n    \"if m is not None:\\n\",\n    \"    print(\\\"The match started at pos {} and ended at pos {}\\\".format(m.start(), m.end()))\\n\",\n    \"    print(\\\"Or with tuple notation, the match is at {}\\\".format(m.span()))\\n\",\n    \"    print(\\\"And btw, the actual string matched was '{}'\\\".format(m.group()))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now you should try to get some more matches and some fails with your own literal regular expressions. I provide three examples of my own:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"The match is at (20, 25)\\n\",\n      \"\\n\",\n      \"Woops, did I just got the alphabet wrong..?\\n\",\n      \"\\n\",\n      \"I just matched 'a' inside 'aaaaa aaaaaa a aaa'\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"m1 = re.search(\\\"regex\\\", \\\"This guide is about regexes\\\")\\n\",\n    \"if m1 is not None:\\n\",\n    \"    print(\\\"The match is at {}\\\\n\\\".format(m1.span()))\\n\",\n    \"\\n\",\n    \"m2 = re.search(\\\"abc\\\", \\\"The alphabet goes 'abdefghij...'\\\")\\n\",\n    \"if m2 is None:\\n\",\n    \"    print(\\\"Woops, did I just got the alphabet wrong..?\\\\n\\\")\\n\",\n    \"    \\n\",\n    \"s = \\\"aaaaa aaaaaa a aaa\\\"\\n\",\n    \"m3 = re.search(\\\"a\\\", s)\\n\",\n    \"if m3 is not None:\\n\",\n    \"    print(\\\"I just matched '{}' inside '{}'\\\".format(m3.group(), s))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### $\\\\pi$ lookup\\n\",\n    \"\\n\",\n    \"$$\\\\pi = 3.1415\\\\cdots$$\\n\",\n    \"\\n\",\n    \"right? Well, what comes after the dots? An infinite sequence of digits, right? Could it be that your date of birth appears in the first million digits of $\\\\pi$? Well, we could use a regex to find that out! Change the `regex` variable below to look for your date of birth or for any number you want, in the first million digits of $\\\\pi$!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"pifile = \\\"regex-bin/pi.txt\\\"\\n\",\n    \"regex = \\\"\\\"  # define your regex to look your favourite number up\\n\",\n    \"\\n\",\n    \"with open(pifile, \\\"r\\\") as f:\\n\",\n    \"    pistr = f.read()  # pistr is a string that contains 1M digits of pi\\n\",\n    \"    \\n\",\n    \"## search for your number here\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"To search for numbers in the first 100 million digits of $\\\\pi$ (or 200 million, I didn't really get it) you can check [this](https://www.angio.net/pi/piquery) website.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Matching options\\n\",\n    \"\\n\",\n    \"We just saw a very simple regular expression that was trying to find the word _\\\"Virgilio\\\"_ in text, but we also saw that we had zero flexibility and we couldn't even handle the fact that someone may have forgotten to capitalize the name properly, spelling it like _\\\"virgilio\\\"_ instead.\\n\",\n    \"\\n\",\n    \"To prevent problems like this, regular expressions can be written in a way to handle different possibilities. For our case, we want the first letter to be either _\\\"V\\\"_ or _\\\"v\\\"_, and that should be followed by _\\\"irgilio\\\"_.\\n\",\n    \"\\n\",\n    \"In order to handle different possibilities, we use the character `|`. For instance, `V|v` matches the letter vee, regardless of its capitalization:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"small v found\\n\",\n      \"big V found\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"v = \\\"v\\\"\\n\",\n    \"V = \\\"V\\\"\\n\",\n    \"regex = \\\"v|V\\\"\\n\",\n    \"if re.search(regex, v):\\n\",\n    \"    print(\\\"small v found\\\")\\n\",\n    \"if re.search(regex, V):\\n\",\n    \"    print(\\\"big V found\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now we can concatenate the regex for the first letter and the `irgilio` regex (for the rest of the name) to get a regex that matches the name of Virgilio, regardless of the capitalization of its first letter:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"virgilio found!\\n\",\n      \"Virgilio found!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"virgilio = \\\"virgilio\\\"\\n\",\n    \"Virgilio = \\\"Virgilio\\\"\\n\",\n    \"regex = \\\"(V|v)irgilio\\\"\\n\",\n    \"if re.search(regex, virgilio):\\n\",\n    \"    print(\\\"virgilio found!\\\")\\n\",\n    \"if re.search(regex, Virgilio):\\n\",\n    \"    print(\\\"Virgilio found!\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Notice that we write the regex with parenthesis: `(V|v)irgilio`\\n\",\n    \"\\n\",\n    \"If we only wrote `V|virgilio`, then the regular expression would match either \\\"V\\\" or \\\"virgilio\\\", instead of \\\"Virgilio\\\" or \\\"virgilio\\\":\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"<re.Match object; span=(29, 30), match='V'>\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"V|virgilio\\\"\\n\",\n    \"print(re.search(regex, \\\"This sentence only has a big V\\\"))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"So we really need to parenthesize the `(V|v)` there. If we do, it will work as expected!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"<re.Match object; span=(27, 35), match='virgilio'>\\n\",\n      \"None\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"(V|v)irgilio\\\"\\n\",\n    \"print(re.search(regex, \\\"The name of the project is virgilio, but with a big V!\\\"))\\n\",\n    \"print(re.search(regex, \\\"This sentence only has a big V\\\"))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Maybe you didn't even notice, but there is something else going on! Notice that we used the characteres `|`, `(` and `)`, and those are not present in the word _\\\"virgilio\\\"_, but nonetheless our regex `(V|v)irgilio` matched it... that is because these three characters have special meanings in the regex world, and hence are **not** interpreted literally, contrary to what happens to any letter in `irgilio`.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Virgilio or Virgil?\\n\",\n    \"\\n\",\n    \"Here is a couple of paragraphs from Wikipedia's [article on Virgil](https://en.wikipedia.org/wiki/Virgil):\\n\",\n    \"\\n\",\n    \" > Publius Vergilius Maro (Classical Latin: [ˈpuː.blɪ.ʊs wɛrˈɡɪ.lɪ.ʊs ˈma.roː]; traditional dates October 15, 70 BC – September 21, 19 BC[1]), usually called Virgil or Vergil (/ˈvɜːrdʒɪl/) in English, was an ancient Roman poet of the Augustan period. He wrote three of the most famous poems in Latin literature: the Eclogues (or Bucolics), the Georgics, and the epic Aeneid. A number of minor poems, collected in the Appendix Vergiliana, are sometimes attributed to him.[2][3]\\n\",\n    \"\\n\",\n    \" > Virgil is traditionally ranked as one of Rome's greatest poets. His Aeneid has been considered the national epic of ancient Rome since the time of its composition. Modeled after Homer's Iliad and Odyssey, the Aeneid follows the Trojan refugee Aeneas as he struggles to fulfill his destiny and reach Italy, where his descendants Romulus and Remus were to found the city of Rome. Virgil's work has had wide and deep influence on Western literature, most notably Dante's Divine Comedy, in which Virgil appears as Dante's guide through Hell and Purgatory.\\n\",\n    \" \\n\",\n    \"\\\"Virgilio\\\" is the italian form of \\\"Virgil\\\", and I edited the above paragraphs to have the italian version instead of the english one. I want you to revert this!\\n\",\n    \"\\n\",\n    \"You might want to take a look at [`while` cycles in Python](https://realpython.com/python-while-loop/), [string indexing](https://www.digitalocean.com/community/tutorials/how-to-index-and-slice-strings-in-python-3) and [string concatenation](https://realpython.com/python-string-split-concatenate-join/). The point is that you find a match, you break the string into the part _before_ the match and the part _after_ the match, and you glue those two together with _Virgilio_ in between.\\n\",\n    \"\\n\",\n    \"Notice that [string replacement](https://www.tutorialspoint.com/python/string_replace.htm) would probably be faster and easier, but that would defeat the purpose of this exercise. After fixing everything, print the final results to be sure that you fixed every occurrence of the name.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"paragraphs = \\\\\\n\",\n    \"\\\"\\\"\\\"Publius Vergilius Maro (Classical Latin: [ˈpuː.blɪ.ʊs wɛrˈɡɪ.lɪ.ʊs ˈma.roː]; traditional dates October 15, 70 BC – September 21, 19 BC[1]), usually called virgilio or Vergil (/ˈvɜːrdʒɪl/) in English, was an ancient Roman poet of the Augustan period. He wrote three of the most famous poems in Latin literature: the Eclogues (or Bucolics), the Georgics, and the epic Aeneid. A number of minor poems, collected in the Appendix Vergiliana, are sometimes attributed to him.[2][3]\\n\",\n    \"\\n\",\n    \"Virgilio is traditionally ranked as one of Rome's greatest poets. His Aeneid has been considered the national epic of ancient Rome since the time of its composition. Modeled after Homer's Iliad and Odyssey, the Aeneid follows the Trojan refugee Aeneas as he struggles to fulfill his destiny and reach Italy, where his descendants Romulus and Remus were to found the city of Rome. virgilio's work has had wide and deep influence on Western literature, most notably Dante's Divine Comedy, in which virgilio appears as Dante's guide through Hell and Purgatory.\\\"\\\"\\\"\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Matching repetitions\\n\",\n    \"\\n\",\n    \"Sometimes we want to find patterns that have bits that will be repeated. For example, people make a _\\\"awww\\\"_ or _\\\"owww\\\"_ sound when they see something cute, like a baby. But the number of _\\\"w\\\"_ I used there was completely arbitrary! If the baby is really really cute, someone might write _\\\"awwwwwwwwwww\\\"_. So how can I write a regex that matches _\\\"aww\\\"_ and _\\\"oww\\\"_, but with an arbitrary number of characters _\\\"w\\\"_?\\n\",\n    \"\\n\",\n    \"I will illustrate several ways of capturing repetitions, by testing regular expressions against the following strings:\\n\",\n    \"\\n\",\n    \" - \\\"awww\\\" (3 letters \\\"w\\\")\\n\",\n    \" - \\\"awwww\\\" (4 letters \\\"w\\\")\\n\",\n    \" - \\\"awwwwwww\\\" (7 letters \\\"w\\\")\\n\",\n    \" - \\\"awwwwwwwwwwwwwwww\\\" (16 letters \\\"w\\\")\\n\",\n    \" - \\\"aw\\\" (1 letter \\\"w\\\")\\n\",\n    \" - \\\"a\\\" (0 letters \\\"w\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"cute_strings = [\\n\",\n    \"    \\\"awww\\\",\\n\",\n    \"    \\\"awwww\\\",\\n\",\n    \"    \\\"awwwwwww\\\",\\n\",\n    \"    \\\"awwwwwwwwwwwwwwww\\\",\\n\",\n    \"    \\\"aw\\\",\\n\",\n    \"    \\\"a\\\"\\n\",\n    \"]\\n\",\n    \"\\n\",\n    \"def match_cute_strings(regex):\\n\",\n    \"    \\\"\\\"\\\"Takes a regex, prints matches and non-matches\\\"\\\"\\\"\\n\",\n    \"    for s in cute_strings:\\n\",\n    \"        m = re.search(regex, s)\\n\",\n    \"        if m:\\n\",\n    \"            print(\\\"match: {}\\\".format(s))\\n\",\n    \"        else:\\n\",\n    \"            print(\\\"non match: {}\\\".format(s))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### At least once\\n\",\n    \"\\n\",\n    \"If I want to match all strings that containt **at least** one \\\"w\\\", we can use the character `+`. A `+` means that we want to find **one or more repetitions** of whatever was to the left of it. For example, the regex `a+` will match any string that has at least one \\\"a\\\".\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"match: awww\\n\",\n      \"match: awwww\\n\",\n      \"match: awwwwwww\\n\",\n      \"match: awwwwwwwwwwwwwwww\\n\",\n      \"match: aw\\n\",\n      \"non match: a\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"aw+\\\"\\n\",\n    \"match_cute_strings(regex)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Any number of times\\n\",\n    \"\\n\",\n    \"If I want to match all strings that contain an arbitrary number of letters \\\"w\\\", I can use the character `*`. The character `*` means **match any number of repetitions** of whatever comes on the left of it, _even 0 repetitions_! So the regex `a*` would match the empty string \\\"\\\", because the empty string \\\"\\\" has 0 repetitions of the letter \\\"a\\\".\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"match: awww\\n\",\n      \"match: awwww\\n\",\n      \"match: awwwwwww\\n\",\n      \"match: awwwwwwwwwwwwwwww\\n\",\n      \"match: aw\\n\",\n      \"match: a\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"aw*\\\"\\n\",\n    \"match_cute_strings(regex)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### A specific number of times\\n\",\n    \"\\n\",\n    \"If I want to match a string that contains a certain particle a specific number of times, I can use the `{n}` notation, where `n` is replaced by the number of repetitions I want. For example, `a{3}` matches the string \\\"aaa\\\" but not the string \\\"aa\\\".\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"match: awww\\n\",\n      \"match: awwww\\n\",\n      \"match: awwwwwww\\n\",\n      \"match: awwwwwwwwwwwwwwww\\n\",\n      \"non match: aw\\n\",\n      \"non match: a\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"aw{3}\\\"\\n\",\n    \"match_cute_strings(regex)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Wait a minute**, why did the pattern `aw{3}` match the longer expressions of cuteness, like \\\"awwww\\\" or \\\"awwwwwww\\\"? Because the regular expressions try to find _substrings_ that match the pattern. Our pattern is `awww` (if I write the `w{3}` explicitly) and the string **awww**w has that substring, just like the string **awww**wwww has it, or the longer version with 16 letters \\\"w\\\". If we wanted to exclude the strings \\\"awwww\\\", \\\"awwwwwww\\\" and \\\"awwwwwwwwwwwwwwww\\\" we would have to fix our regex. A better example that demonstrates how `{n}` works is by considering, instead of expressions of cuteness, expressions of amusement like \\\"wow\\\", \\\"woow\\\" and \\\"wooooooooooooow\\\". We define some expressions of amusement:\\n\",\n    \"\\n\",\n    \" - \\\"wow\\\"\\n\",\n    \" - \\\"woow\\\"\\n\",\n    \" - \\\"wooow\\\"\\n\",\n    \" - \\\"woooow\\\"\\n\",\n    \" - \\\"wooooooooow\\\"\\n\",\n    \" \\n\",\n    \"and now we test our `{3}` pattern.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"wow_strings = [\\n\",\n    \"    \\\"wow\\\",\\n\",\n    \"    \\\"woow\\\",\\n\",\n    \"    \\\"wooow\\\",\\n\",\n    \"    \\\"woooow\\\",\\n\",\n    \"    \\\"wooooooooow\\\"\\n\",\n    \"]\\n\",\n    \"\\n\",\n    \"def match_wow_strings(regex):\\n\",\n    \"    \\\"\\\"\\\"Takes a regex, prints matches and non-matches\\\"\\\"\\\"\\n\",\n    \"    for s in wow_strings:\\n\",\n    \"        m = re.search(regex, s)\\n\",\n    \"        if m:\\n\",\n    \"            print(\\\"match: {}\\\".format(s))\\n\",\n    \"        else:\\n\",\n    \"            print(\\\"non match: {}\\\".format(s))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"non match: wow\\n\",\n      \"non match: woow\\n\",\n      \"match: wooow\\n\",\n      \"non match: woooow\\n\",\n      \"non match: wooooooooow\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"wo{3}w\\\"\\n\",\n    \"match_wow_strings(regex)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Between $n$ and $m$ times\\n\",\n    \"\\n\",\n    \"Expressing amusement with only three \\\"o\\\" is ok, but people might also use two or four \\\"o\\\". How can we capture a variable number of letters, but within a range? Say I only want to capture versions of \\\"wow\\\" that have between 2 and 4 letters \\\"o\\\". I can do it with `{2,4}`.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"non match: wow\\n\",\n      \"match: woow\\n\",\n      \"match: wooow\\n\",\n      \"match: woooow\\n\",\n      \"non match: wooooooooow\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"wo{2,4}w\\\"\\n\",\n    \"match_wow_strings(regex)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Up to $n$ times or at least $m$ times\\n\",\n    \"\\n\",\n    \"Now we are just playing with the type of repetitions we might want, but of course we might say that we want **no more** than $n$ repetitions, which you would do with `{,n}`, or that we want **at least** $m$ repetitions, which you would do with `{m,}`.\\n\",\n    \"\\n\",\n    \"In fact, take a look at these regular expressions:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"match: wow\\n\",\n      \"match: woow\\n\",\n      \"match: wooow\\n\",\n      \"match: woooow\\n\",\n      \"non match: wooooooooow\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"wo{,4}w\\\" # should not match strings with more than 4 o's\\n\",\n    \"match_wow_strings(regex)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"non match: wow\\n\",\n      \"non match: woow\\n\",\n      \"match: wooow\\n\",\n      \"match: woooow\\n\",\n      \"match: wooooooooow\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"wo{3,}w\\\" # should not match strings with less than 3 o's\\n\",\n    \"match_wow_strings(regex)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### To be or not to be\\n\",\n    \"\\n\",\n    \"Last but not least, sometimes we care about something that might or might not be present. For example, above we dealed with the English and Italian versions of the name Virgilio. If we wanted to write a regular expression to capture both versions, we could write `((V|v)irgil)|((V|v)irgilio)`, or slightly more compact, `(V|v)((irgil)|(irgilio))`. But this does not look good at all, right? All we need to say is that the final \\\"io\\\" might or might not be present. We do this with the `?` character. So the regex `(V|v)irgil(io)?` matches the upper and lower case versions of \\\"Virgil\\\" and \\\"Virgilio\\\".\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"The name virgil was matched!\\n\",\n      \"The name Virgil was matched!\\n\",\n      \"The name virgilio was matched!\\n\",\n      \"The name Virgilio was matched!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"(V|v)irgil(io)?\\\"\\n\",\n    \"names = [\\\"virgil\\\", \\\"Virgil\\\", \\\"virgilio\\\", \\\"Virgilio\\\"]\\n\",\n    \"for name in names:\\n\",\n    \"    m = re.search(regex, name)\\n\",\n    \"    if m:\\n\",\n    \"        print(\\\"The name {} was matched!\\\".format(name))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Greed\\n\",\n    \"\\n\",\n    \"The `+`, `?`, `*` and `{,}` operators are all greedy. What does this mean? It means that they will try to match as much as possible. They have this default behaviour, as opposed to stopping to try and find more matches as soon as the regex is satisfied. To better illustrate what I mean by this, let us look again at the information contained in the `match` object we have been dealing with:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 26,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"<re.Match object; span=(0, 3), match='aaa'>\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"a+\\\"\\n\",\n    \"s = \\\"aaa\\\"\\n\",\n    \"m = re.search(regex, s)\\n\",\n    \"print(m)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Notice the part of the printed information that says `match='aaa'`. The function `m.group()` will let me know what was the actual string that was matched by the regular expression, and in this case it was \\\"aaa\\\". Why does it make sense to have access to this information? Well, the regex I wrote, `a+`, will match one or more letters \\\"a\\\" in a row. If I use the regex over a string and I get a match, how would I be able to know how many \\\"a\\\"s were matched, if I didn't have access to that type of information?\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 29,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"aaa\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(m.group())\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"So let us verify that, in fact, the operators I mentioned are all greedy. Again, because they all match as many characters as they can.\\n\",\n    \"\\n\",\n    \"Below, we see that given a string of thirty times the letter \\\"a\\\",\\n\",\n    \"\\n\",\n    \"  - the pattern `a?` matches 1 \\\"a\\\", which is as much as it could\\n\",\n    \"  - the pattern `a+` matches 30 \\\"a\\\"s, which is as much as it could\\n\",\n    \"  - the pattern `a*` also matches 30\\n\",\n    \"  - the pattern `a{5,10}` matches 10 \\\"a\\\"s, which was the limit imposed by us\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 31,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"a\\n\",\n      \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\n\",\n      \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\n\",\n      \"aaaaaaaaaa\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"s = \\\"a\\\"*30\\n\",\n    \"print(re.search(\\\"a?\\\", s).group())\\n\",\n    \"print(re.search(\\\"a+\\\", s).group())\\n\",\n    \"print(re.search(\\\"a*\\\", s).group())\\n\",\n    \"print(re.search(\\\"a{5,10}\\\", s).group())\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"If we don't want our operators to be greedy, we just put an extra `?` after them. So the following regular expressions are **not** greedy:\\n\",\n    \"\\n\",\n    \"  - the pattern `a??` will match **no** characters, much like `a*?`, because now their goal is to match as little as possible. But a match of length 0 is the shortest match possible!\\n\",\n    \"  - the pattern `a+?` will only match 1 \\\"a\\\"\\n\",\n    \"  - the pattern `a{5,10}?` will only match 5 \\\"a\\\"s\\n\",\n    \"  \\n\",\n    \"We can easily confirm what I just said by running the code below. Notice that now I print things differently, because otherwise we wouldn't be able to see the `a??` and `a*?` patterns matching nothing.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 34,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"''\\n\",\n      \"'a'\\n\",\n      \"''\\n\",\n      \"'aaaaa'\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"s = \\\"a\\\"*30\\n\",\n    \"print(\\\"'{}'\\\".format(re.search(\\\"a??\\\", s).group()))\\n\",\n    \"print(\\\"'{}'\\\".format(re.search(\\\"a+?\\\", s).group()))\\n\",\n    \"print(\\\"'{}'\\\".format(re.search(\\\"a*?\\\", s).group()))\\n\",\n    \"print(\\\"'{}'\\\".format(re.search(\\\"a{5,10}?\\\", s).group()))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Removing excessive spaces\\n\",\n    \"\\n\",\n    \"Now that we know about repetitions, I am going to tell you about the `sub` function and we are going to use that to parse a piece of text and remove all extra spaces that are present. Typing in `re.sub(regex, rep, string)` will use the given regex on the given string, and whenever it matches, it removes the match and puts the `rep` in there.\\n\",\n    \"\\n\",\n    \"For example, I can use that to replace all English/Italian occurrences of the name Virgilio with a standardized one:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 39,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Virgilio has many names, like Virgilio, Virgilio, Virgilio, Virgilio, or even Virgilio.\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"s = \\\"Virgilio has many names, like virgil, virgilio, Virgil, Vergil, or even vergil.\\\"\\n\",\n    \"regex = \\\"(V|v)(e|i)rgil(io)?\\\"\\n\",\n    \"\\n\",\n    \"print(\\n\",\n    \"    re.sub(regex, \\\"Virgilio\\\", s)\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"    Now   it  is your   turn.  I am     going  to give   you this    sentence as        input, and   your  job    is to      fix the     whitespace         in it. When you    are  done,    save the    result in a  string  named   `s`, and   check    if  `s.count(\\\"  \\\")` is   equal   to    0  or not.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"weird_text = \\\"Now   it  is your   turn.  I am     going  to give   you this    sentence as        input, and   your  job    is to      fix the     whitespace         in it. When you    are  done,    save the    result in a  string  named   `s`, and   check    if  `s.count(\\\"  \\\")` is   equal   to    0  or not.\\\"\\n\",\n    \"regex = \\\"\\\"  # put your regex here\\n\",\n    \"\\n\",\n    \"# substitute the extra whitespace here\\n\",\n    \"# save the result in 's'\\n\",\n    \"\\n\",\n    \"# this print should be 0\\n\",\n    \"print(s.count(\\\"  \\\"))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Character classes\\n\",\n    \"\\n\",\n    \"So far we have been using writing some simple regular expressions that have been matching some words, and some names, and things like that. Now we have a different plan. We will write a regular expression that will match on US phone numbers, which we will assume are of the form xxx-xxx-xxxx. The first three digits are the area code, but we will not care about whether the area code actually makes sense or not. How do we match this, then?\\n\",\n    \"\\n\",\n    \"In fact, how can I match the first digit? It can be any number from 0 to 9, so should I write `(0|1|2|3|4|5|6|7|8|9)` to match the first digit, and then repeat? Actually, we could do that, yes, to get this regex:\\n\",\n    \"\\n\",\n    \"`(0|1|2|3|4|5|6|7|8|9){3}-(0|1|2|3|4|5|6|7|8|9){3}-(0|1|2|3|4|5|6|7|8|9){4}`\\n\",\n    \"\\n\",\n    \"Does this work?\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 45,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"<re.Match object; span=(0, 12), match='202-555-0181'>\\n\",\n      \"None\\n\",\n      \"None\\n\",\n      \"<re.Match object; span=(0, 12), match='512-555-0191'>\\n\",\n      \"None\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"(0|1|2|3|4|5|6|7|8|9){3}-(0|1|2|3|4|5|6|7|8|9){3}-(0|1|2|3|4|5|6|7|8|9){4}\\\"\\n\",\n    \"numbers = [\\n\",\n    \"    \\\"202-555-0181\\\",\\n\",\n    \"    \\\"202555-0181\\\",\\n\",\n    \"    \\\"202 555 0181\\\",\\n\",\n    \"    \\\"512-555-0191\\\",\\n\",\n    \"    \\\"96-125-3546\\\",\\n\",\n    \"]\\n\",\n    \"for nr in numbers:\\n\",\n    \"    print(re.search(regex, nr))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"It looks like it works, but surely there must be a better way... and there is! Instead of writing out every digit like we did, we can actually write a range of values! In fact, the regex `[0-9]` matches all digits from 0 to 9. So we can actually shorten our regex to `[0-9]{3}-[0-9]{3}-[0-9]{4}`:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 46,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"<re.Match object; span=(0, 12), match='202-555-0181'>\\n\",\n      \"None\\n\",\n      \"None\\n\",\n      \"<re.Match object; span=(0, 12), match='512-555-0191'>\\n\",\n      \"None\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"[0-9]{3}-[0-9]{3}-[0-9]{4}\\\"\\n\",\n    \"numbers = [\\n\",\n    \"    \\\"202-555-0181\\\",\\n\",\n    \"    \\\"202555-0181\\\",\\n\",\n    \"    \\\"202 555 0181\\\",\\n\",\n    \"    \\\"512-555-0191\\\",\\n\",\n    \"    \\\"96-125-3546\\\",\\n\",\n    \"]\\n\",\n    \"for nr in numbers:\\n\",\n    \"    print(re.search(regex, nr))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The magic here is being done by the `[]`, which denotes a character class. The way `[]` works is, the regex will try to match any of the things that are inside, and it just so happens that `0-9` is a shorter way of listing all the digits. Of course you could also do `[0123456789]{3}-[0123456789]{3}-[0123456789]{4}` which is slightly shorter than our first attempt, but still pretty bad. Similar to `0-9`, we have `a-z` and `A-Z`, which go through all letters of the alphabet.\\n\",\n    \"\\n\",\n    \"You can also start and end in different places, for example `c-o` can be used to match words that only use letters between the \\\"c\\\" and the \\\"o\\\", like \\\"hello\\\":\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 47,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"<re.Match object; span=(0, 5), match='hello'>\\n\",\n      \"<re.Match object; span=(1, 4), match='ice'>\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"[c-o]+\\\"\\n\",\n    \"print(re.search(regex, \\\"hello\\\"))\\n\",\n    \"print(re.search(regex, \\\"rice\\\"))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"With these character classes we can actually rewrite our Virgilio regex into something slightly shorter, going from `(V|v)(e|i)rgil(io)?` to `[Vv][ie]rgil(io)?`.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 53,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Virgilio has many names, like Virgilio, Virgilio, Virgilio, Virgilio, or even Virgilio.\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"s = \\\"Virgilio has many names, like virgil, virgilio, Virgil, Vergil, or even vergil.\\\"\\n\",\n    \"regex = \\\"[Vv][ie]rgil(io)?\\\"\\n\",\n    \"\\n\",\n    \"print(\\n\",\n    \"    re.sub(regex, \\\"Virgilio\\\", s)\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Again we see that our regular expression matched the **ice** in r**ice**, because the \\\"r\\\" was not inside the legal range of letters, but **ice** was.\\n\",\n    \"\\n\",\n    \"The _character class_ is the square brackets `[]` and whatever goes inside it. Also, note that the special characters we have been using lose their meaning inside a character class! So `[()?+*{}]` will actually look to match any of those characters:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 54,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"<re.Match object; span=(25, 26), match='?'>\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"[()?+*{}]\\\"\\n\",\n    \"print(re.search(regex, \\\"Did I just ask a question?\\\"))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"A final note on character classes, if they start with `^` then we are actually saying \\\"use everything _except_ what is inside this\\\":\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 55,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"None\\n\",\n      \"<re.Match object; span=(0, 1), match='r'>\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"[^c-o]+\\\"\\n\",\n    \"print(re.search(regex, \\\"hello\\\"))\\n\",\n    \"print(re.search(regex, \\\"rice\\\"))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Phone numbers v1\\n\",\n    \"\\n\",\n    \"Now that you know how to use character classes to denote ranges, you need to write a regular expression that matches american phone numbers with the format xxx-xxx-xxxx. Not only that, but you must also cope with the fact that the numbers may or may not be preceeded by the country indicator, which you can assume that will look like \\\"+1\\\" or \\\"001\\\". The country indicator may be separated from the rest of the number with a space or with a dash.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"regex = \\\"\\\"  # write your regex here\\n\",\n    \"matches = [  # you should be able to match those\\n\",\n    \"    \\\"202-555-0181\\\",\\n\",\n    \"    \\\"001 202-555-0181\\\",\\n\",\n    \"    \\\"+1-512-555-0191\\\"\\n\",\n    \"]\\n\",\n    \"non_matches = [  # for now, none of these should be matched\\n\",\n    \"    \\\"202555-0181\\\",\\n\",\n    \"    \\\"96-125-3546\\\",\\n\",\n    \"    \\\"(+1)5125550191\\\"\\n\",\n    \"]\\n\",\n    \"for s in matches:\\n\",\n    \"    print(re.search(regex, s))\\n\",\n    \"for s in non_matches:\\n\",\n    \"    print(re.search(regex, s))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## More `re` functions\\n\",\n    \"\\n\",\n    \"So far we only looked at the `.search()` function of the `re` module, but now I am going to tell you about a couple more function that can be quite handy when you are dealing with pattern matching. By the time you are done with this small section, you will now the following functions: `match()`, `search()`, `findall()`, `sub()` and `split()`.\\n\",\n    \"\\n\",\n    \"If you are here mostly for the regular expressions, and you don't care much about using them with Python, you can just skim through this section... even though it is still a nice read.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### `search()` and `sub()`\\n\",\n    \"\\n\",\n    \"You already know these two functions, `re.search(regex, string)` will try to find your pattern given by `regex` in the given `string` and return the information of the match in a `match` object. The function `re.sub(regex, rep, string)` will take a regex and two strings; it will then look for the pattern you specified in `string` and replace the matches with the other string `rep` you gave it.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### `match()`\\n\",\n    \"\\n\",\n    \"The function `re.match(regex, string)` is similar to the function `re.search()`, except that `.match()` will only check if your pattern applies to the **beginning** of the string. That is, if your string does not **start** with the pattern you provided, the function returns `None`.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \".search() found abc in abcdef\\n\",\n      \".search() found abc in the alphabet starts with abc\\n\",\n      \".match() says that abcdef starts with abc\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"abc\\\"\\n\",\n    \"string1 = \\\"abcdef\\\"\\n\",\n    \"string2 = \\\"the alphabet starts with abc\\\"\\n\",\n    \"# the .search() function finds the patterns, regardless of position\\n\",\n    \"if re.search(regex, string1):\\n\",\n    \"    print(\\\".search() found {} in {}\\\".format(regex, string1))\\n\",\n    \"if re.search(regex, string2):\\n\",\n    \"    print(\\\".search() found {} in {}\\\".format(regex, string2))\\n\",\n    \"    \\n\",\n    \"# the .match() function only checks if the string STARTS with the pattern\\n\",\n    \"if re.match(regex, string1):\\n\",\n    \"    print(\\\".match() says that {} starts with {}\\\".format(string1, regex))\\n\",\n    \"if re.match(regex, string2):  # this one should NOT print\\n\",\n    \"    print(\\\".match() says that {} starts with {}\\\".format(string2, regex))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### `findall()`\\n\",\n    \"\\n\",\n    \"The `re.findall(regex, string)` is exactly like the `.search()` function, except that it will return **all** the matches it can find, instead of just the first one. Instead of returning a `match` object, it just returns the string that matched.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"<re.Match object; span=(0, 3), match='wow'>\\n\",\n      \"['wow', 'wow', 'wow']\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"wow\\\"\\n\",\n    \"string = \\\"wow wow wow!\\\"\\n\",\n    \"\\n\",\n    \"print(re.search(regex, string))\\n\",\n    \"\\n\",\n    \"print(re.findall(regex, string))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"<re.Match object; span=(0, 3), match='ab1'>\\n\",\n      \"['ab1', 'ab2', 'ab3']\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"ab[0-9]\\\"\\n\",\n    \"string = \\\"ab1 ab2 ab3\\\"\\n\",\n    \"\\n\",\n    \"print(re.search(regex, string))\\n\",\n    \"\\n\",\n    \"print(re.findall(regex, string))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"It is important to note that the `findall()` function only returns _non-overlaping_ matches. That is, one could argue that `wow` appears twice in \\\"wowow\\\", in the beginning: **wow**ow, and in the end: wo**wow**. Nonetheless, `findall()` only returns one match because the second match overlaps with the first:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"['wow']\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"wow\\\"\\n\",\n    \"string = \\\"wowow\\\"\\n\",\n    \"print(re.findall(regex, string))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"With this information it now makes a bit more sense to consider the greediness of the operators we showed before, like `?` and `+`. Imagine we are dealing with the regex `a+` and we have a string \\\"aaaaaaaaa\\\". If we use the greedy version of `+`, then we get a single match which is the whole string. If we use the non-greedy version of the operator `+`, perhaps because we want as many matches as possible, we will get a bunch of \\\"a\\\" matches!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"['aaaaaaaaa']\\n\",\n      \"['a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a']\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex_greedy = \\\"a+\\\"\\n\",\n    \"regex_nongreedy = \\\"a+?\\\"\\n\",\n    \"string = \\\"aaaaaaaaa\\\"\\n\",\n    \"\\n\",\n    \"print(re.findall(regex_greedy, string))\\n\",\n    \"\\n\",\n    \"print(re.findall(regex_nongreedy, string))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### `split()`\\n\",\n    \"\\n\",\n    \"The `re.split(regex, string)` splits the given string into bits wherever it is able to find the pattern you specified. Say we are interested in finding all the sequences of consecutive consonants in a sentence (I don't know why you would want that...). Then we can use the vowels and the space \\\" \\\" to break up the sentence:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"['Th', 's', 's', 'j', 'st', 'r', 'g', 'l', 'r', 's', 'nt', 'nc', '']\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"[aeiou ]+\\\" # this will eliminate all vowels/spaces that appear consecutively\\n\",\n    \"string = \\\"This is just a regular sentence\\\"\\n\",\n    \"\\n\",\n    \"print(re.split(regex, string))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### `search` with `match`\\n\",\n    \"\\n\",\n    \"Recall that the `match()` function only checks if your pattern is in the beginning of the string. What I want you to do is define your own `search` function that takes a regex and a string, and returns `True` if the pattern is inside the string, and `False` otherwise. Can you do it?\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def my_search(regex, string):\\n\",\n    \"    pass  # write your code here\\n\",\n    \"\\n\",\n    \"regex = \\\"[0-9]{2,4}\\\"\\n\",\n    \"\\n\",\n    \"# your function should be able to match in all these strings\\n\",\n    \"string1 = \\\"1984 was already some years ago.\\\"\\n\",\n    \"string2 = \\\"There is also a book whose title is '1984', but the story isn't set in the year of 1984.\\\"\\n\",\n    \"string3 = \\\"Sometimes people write '84 for short.\\\"\\n\",\n    \"\\n\",\n    \"# your function should also match with this regex and this string\\n\",\n    \"regex = \\\"a*\\\"\\n\",\n    \"string = \\\"\\\"\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Count matches with `findall`\\n\",\n    \"\\n\",\n    \"Now I want you to define the `count_matches` function, which takes a regex and a string, and returns the number of non-overlaping matches there exist in the given string. Can you do it?\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 25,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def count_matches(regex, string):\\n\",\n    \"    pass  # your code goes here\\n\",\n    \"\\n\",\n    \"regex = \\\"wow\\\"\\n\",\n    \"\\n\",\n    \"string1 = \\\"wow wow wow\\\" # this should be 3\\n\",\n    \"string2 = \\\"wowow\\\" # this should be 1\\n\",\n    \"string3 = \\\"wowowow\\\" # this should be 2\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Special characters\\n\",\n    \"\\n\",\n    \"It is time to ramp things up a bit! We have seen some characters that have special meanings, and now I am going to introduce a couple more of those! I will start by listing them, and then I'll explain them in more detail:\\n\",\n    \"\\n\",\n    \" - `.` is used to match **any** character, except for a newline\\n\",\n    \" - `^` is used to match at the beginning of the string\\n\",\n    \" - `$` is used to match at the end of the string\\n\",\n    \" - `\\\\d` is used to match any digit\\n\",\n    \" - `\\\\w` is used to match any alphanumeric character\\n\",\n    \" - `\\\\s` is used to match any type of whitespace\\n\",\n    \" - `\\\\` is used to remove the special meaning of the characters\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Dot `.`\\n\",\n    \"\\n\",\n    \"The `.` can be used in a regular expression to capture any character that might have been used there, as long as we are still in the same line. That is, the only place where `.` doesn't work is if we changed lines in the text. Imagine the pattern was `d.ck`. Then the pattern would match\\n\",\n    \"\\n\",\n    \"```\\n\",\n    \"\\\"duck\\\"```\\n\",\n    \"\\n\",\n    \"but it would not match\\n\",\n    \"\\n\",\n    \"```\\n\",\n    \"\\\"d\\n\",\n    \"ck\\\"```\\n\",\n    \"\\n\",\n    \"because we changed lines in the middle of the string.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Caret `^`\\n\",\n    \"\\n\",\n    \"If we use a `^` in the beginning of the regular expression, then we only care about matches in the beginning of the string. That is, `^wow` would only match if the string started with \\\"wow\\\":\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 30,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"<re.Match object; span=(0, 3), match='wow'>\\n\",\n      \"None\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"^wow\\\"\\n\",\n    \"\\n\",\n    \"print(re.search(regex, \\\"wow, this is awesome\\\"))\\n\",\n    \"print(re.search(regex, \\\"this is awesome, wow\\\"))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Recall that `^` inside the character class can also mean \\\"anything but whatever is in this class\\\", so the regular expression `[^d]uck` would match any string that has **uck** in it, as long as it is not the word \\\"duck\\\". If the caret `^` appears inside a character class `[]` but it is not the first character, than it has no special meaning and it just stands for the character itself. This means that the regex `[()^{}]` is looking to match any of the characters listed:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 29,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"<re.Match object; span=(0, 1), match='^'>\\n\",\n      \"<re.Match object; span=(0, 1), match='('>\\n\",\n      \"<re.Match object; span=(0, 1), match='}'>\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"[()^{}]\\\"\\n\",\n    \"print(re.search(regex, \\\"^\\\"))\\n\",\n    \"print(re.search(regex, \\\"(\\\"))\\n\",\n    \"print(re.search(regex, \\\"}\\\"))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Dollar sign `$`\\n\",\n    \"\\n\",\n    \"Contrary to the caret `^`, the dollar sign only matches at the end of the string!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 31,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"None\\n\",\n      \"<re.Match object; span=(17, 20), match='wow'>\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"wow$\\\"\\n\",\n    \"\\n\",\n    \"print(re.search(regex, \\\"wow, this is awesome\\\"))\\n\",\n    \"print(re.search(regex, \\\"this is awesome, wow\\\"))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Combining the `^` with the `$` means we are looking to match the whole string with our pattern. For example `^[a-zA-Z ]*$` checks if our string only contains letters and spaces and nothing else:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 32,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"<re.Match object; span=(0, 47), match='this is a sentence with only letters and spaces'>\\n\",\n      \"None\\n\",\n      \"None\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"^[a-zA-Z ]*$\\\"\\n\",\n    \"\\n\",\n    \"s1 = \\\"this is a sentence with only letters and spaces\\\"\\n\",\n    \"s2 = \\\"this sentence has 1 number\\\"\\n\",\n    \"s3 = \\\"this one has punctuation...\\\"\\n\",\n    \"\\n\",\n    \"print(re.search(regex, s1))\\n\",\n    \"print(re.search(regex, s2))\\n\",\n    \"print(re.search(regex, s3))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Character groups `\\\\d`, `\\\\w` and `\\\\s`\\n\",\n    \"\\n\",\n    \"Whenever you see a backslash followed by a letter, that probably means that something _special_ is going on. These three special \\\"characters\\\" are shorthand notation for some character classes `[]`. For example, the `\\\\d` is the same as `[0-9]`. The `\\\\w` represents any alphanumeric character (like letters, numbers and `_`), and `\\\\s` represents any whitespace character (like the space \\\" \\\", the tab, the newline, etc).\\n\",\n    \"\\n\",\n    \"All these three special characters I showed, can be capitalized. If they are, then they mean the exact opposite! So `\\\\D` means \\\"anything **except** a digit\\\", `\\\\W` means \\\"anything **except** an alphanumeric character\\\" and `\\\\S` means \\\"anything **except** whitespace characters.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 43,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"['these are some words']\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"\\\\D+\\\"\\n\",\n    \"s = \\\"these are some words\\\"\\n\",\n    \"print(re.findall(regex, s))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Adding up to that, these special characters can be used inside a character class, so for instance `[abc\\\\d]` would match any digit and the letters \\\"a\\\", \\\"b\\\" and \\\"c\\\". If the caret character `^` is used, then we are excluding whatever the special character refers to. As an example, if `[\\\\d]` would match any digit, then `[^\\\\d]` will match anything that is not a digit.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### The backslash `\\\\`\\n\",\n    \"\\n\",\n    \"We already saw the backslash being used before letters to give them some special meaning... Well, the backslash before a special character also strips it of its special meaning! So, if you wanted to match a backslash, you could use `\\\\\\\\`. If you want to match any of the other special characters we already saw, you could put a `\\\\` before them, like `\\\\+` to match a plus sign. The next regular expression can be used to match an addition expression like \\\"16 + 6\\\"\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 45,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"<re.Match object; span=(0, 6), match='16 + 6'>\\n\",\n      \"<re.Match object; span=(0, 6), match='4325+2'>\\n\",\n      \"<re.Match object; span=(0, 6), match='4+ 564'>\\n\",\n      \"None\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"[\\\\d]+ ?\\\\+ ?[\\\\d]+\\\"\\n\",\n    \"add1 = \\\"16 + 6\\\"\\n\",\n    \"add2 = \\\"4325+2\\\"\\n\",\n    \"add3 = \\\"4+ 564\\\"\\n\",\n    \"mult1 = \\\"56 * 2\\\"\\n\",\n    \"\\n\",\n    \"print(re.search(regex, add1))\\n\",\n    \"print(re.search(regex, add2))\\n\",\n    \"print(re.search(regex, add3))\\n\",\n    \"print(re.search(regex, mult1))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Phone numbers v2\\n\",\n    \"\\n\",\n    \"Now I invite you to take a look at [Phone numbers v1](#Phone-numbers-v1) and rewrite your regular expression to include some new special characters that you didn't know before!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"regex = \\\"\\\"  # write your regex here\\n\",\n    \"matches = [  # you should be able to match those\\n\",\n    \"    \\\"202-555-0181\\\",\\n\",\n    \"    \\\"001 202-555-0181\\\",\\n\",\n    \"    \\\"+1-512-555-0191\\\"\\n\",\n    \"]\\n\",\n    \"non_matches = [  # for now, none of these should be matched\\n\",\n    \"    \\\"202555-0181\\\",\\n\",\n    \"    \\\"96-125-3546\\\",\\n\",\n    \"    \\\"(+1)5125550191\\\"\\n\",\n    \"]\\n\",\n    \"for s in matches:\\n\",\n    \"    print(re.search(regex, s))\\n\",\n    \"for s in non_matches:\\n\",\n    \"    print(re.search(regex, s))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Groups\\n\",\n    \"\\n\",\n    \"So far, when we used a regex to match a string we could retrieve the whole information of the match by using the `.group()` function on the match object:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"my nam is\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"my name? is\\\"\\n\",\n    \"\\n\",\n    \"m = re.search(regex, \\\"my nam is Virgilio\\\")\\n\",\n    \"if m is not None:\\n\",\n    \"    print(m.group())\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Say we are dealing with phone numbers again, and we want to look for phone numbers in a big text. But after that, we also want to extract the country from where the number is from. How could we do it..? Well, we can use a regex to match the phone numbers, and then use a second regex to extract the country code, right? (Let us just assume that phone numbers are written with the digits all in a sequence, with no spaces or \\\"-\\\" separating them.)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"The country code is: +351\\n\",\n      \"The country code is: 001\\n\",\n      \"The country code is: +1\\n\",\n      \"The country code is: 0048\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex_number = \\\"((00|[+])\\\\d{1,3}[ -])\\\\d{8,12}\\\"\\n\",\n    \"regex_code = \\\"((00|[+])\\\\d{1,3})\\\"\\n\",\n    \"matches = [  # you should be able to match those\\n\",\n    \"    \\\"+351 2025550181\\\",\\n\",\n    \"    \\\"001 2025550181\\\",\\n\",\n    \"    \\\"+1-5125550191\\\",\\n\",\n    \"    \\\"0048 123456789\\\"\\n\",\n    \"]\\n\",\n    \"\\n\",\n    \"for s in matches:\\n\",\n    \"    m = re.search(regex_number, s)  # match the phone number\\n\",\n    \"    if m is not None:\\n\",\n    \"        phone_number = m.group()    # extract the phone number\\n\",\n    \"        code = re.search(regex_code, phone_number)  # match the country code\\n\",\n    \"        print(\\\"The country code is: {}\\\".format(code.group()))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"But not only is this repetitive, because I just copied the beginning of the `regex_number` into the `regex_code`, but it becomes very cumbersome if I am trying to retrieve several different parts of my match. Because of this, there is a functionality of regular expressions that is _grouping_. By grouping parts of the regular expression, you can do things like using the repetition operators on them and **retrieve their information** later on.\\n\",\n    \"\\n\",\n    \"To do grouping, one only needs to use the `()` parenthesis. For example, the regex `(ab)+` looks for matches of the form \\\"ab\\\", \\\"abab\\\", \\\"ababab\\\", etcetera.\\n\",\n    \"\\n\",\n    \"We also used the grouping [in the beginning](#Matching-options) to create a regex that matched \\\"Virgilio\\\" and \\\"virgilio\\\", by writing `(V|v)irgilio`.\\n\",\n    \"\\n\",\n    \"Now off to the part that really matters! We can use grouping to retrieve portions of the matches, and we do that with the `.group()` function! Any set of `()` defines a group, and then we can use the `.group(i)` function to retrieve group `i`. Just note that the 0th group is always the whole match, and then you start counting from the left!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"abc defghi\\n\",\n      \"abc defghi\\n\",\n      \"abc\\n\",\n      \"defghi\\n\",\n      \"fg\\n\",\n      \"('abc', 'defghi', 'fg')\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex_with_grouping = \\\"(abc) (de(fg)hi)\\\"\\n\",\n    \"m = re.search(regex_with_grouping, \\\"abc defghi jklm n opq\\\")\\n\",\n    \"print(m.group())\\n\",\n    \"print(m.group(0))\\n\",\n    \"print(m.group(1))\\n\",\n    \"print(m.group(2))\\n\",\n    \"print(m.group(3))\\n\",\n    \"print(m.groups())\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Notice that `match.group()` and `match.group(0)` are the same thing. Also note that the function `match.groups()` returns all the groups in a tuple!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Phone numbers v3\\n\",\n    \"\\n\",\n    \"Using what you learned so far, write a regex that matches phone numbers with different country codes. Assume the following:\\n\",\n    \"\\n\",\n    \"  - The country code starts with either `00` or `+`, followed by one to three digits\\n\",\n    \"  - The phone number has length between 8 and 12\\n\",\n    \"  - The phone number and country code are separated by a space \\\" \\\" or by a hyphen \\\"-\\\"\\n\",\n    \"  \\n\",\n    \"Have your code look for phone numbers in the string I will provide next, and have it print the different country codes it finds.\\n\",\n    \"\\n\",\n    \"You might want to read what the exact behaviour of `re.findall()` is when the regex has groups in it. You can do that by checking the [documentation of the `re` module](https://docs.python.org/3/library/re.html#re.findall).\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"paragraph = \\\"\\\"\\\"Hello, I am Virgilio and I am from Italy.\\n\",\n    \"If phones were a thing when I was alive, my number would've probably been 0039 3123456789.\\n\",\n    \"I would also love to get a house with 3 floors and something like +1 000 square meters.\\n\",\n    \"Now that we are at it, I can also tell you that the number 0039 3135313531 would have suited Leo da Vinci very well...\\n\",\n    \"And come to think of it, someone told me that Socrates had dibs on +30-2111112222\\\"\\\"\\\"\\n\",\n    \"# you should find 3 phone numbers\\n\",\n    \"# and you should not be fooled by the other numbers that show up in the text\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Toy project about regex\\n\",\n    \"\\n\",\n    \"For the toy project, that is far from trivial, you are left with mimicking what [I did here](http://mathspp.blogspot.com/2017/11/on-computing-all-patterns-matched-by.html). If you follow that link, you will find a piece of code that takes a regular expression and then prints all the strings that the given regex would match.\\n\",\n    \"\\n\",\n    \"I'll just give you a couple of examples on how this works:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import sys\\n\",\n    \"sys.path.append(\\\"./regex-bin\\\")\\n\",\n    \"import regexPrinter\\n\",\n    \"\\n\",\n    \"def get_iter(regex):\\n\",\n    \"    return regexPrinter.printRegex(regex).print()\\n\",\n    \"\\n\",\n    \"def printall(regex):\\n\",\n    \"    for poss_match in get_iter(regex):\\n\",\n    \"        print(poss_match)\\n\",\n    \"\\n\",\n    \"regex = \\\"V|virgilio\\\"\\n\",\n    \"printall(regex)\\n\",\n    \"print(\\\"-\\\"*30)\\n\",\n    \"regex = \\\"wo+w\\\"\\n\",\n    \"printall(regex)\\n\",\n    \"print(\\\"-\\\"*30)\\n\",\n    \"# notice that for some reason, dumb me used {n:m} instead of {n,m}\\n\",\n    \"# also note that I only implemented {n,m}, and not {n,} nor {,m} nor {n}\\n\",\n    \"# also note that this does not support nor \\\\d nor [0-9]\\n\",\n    \"regex = \\\"((00|[+])1[ -])?[0123456789]{3:3}\\\"\\n\",\n    \"printall(regex)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note that the code is protected against infinite patterns, which are signaled with `...`.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 47,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"this is infinite!\\n\",\n      \"this is infinite!!\\n\",\n      \"this is infinite!...!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"printall(\\\"this is infinite!+\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"If you are completely new to this sort of things, then this will look completely impossible... but it is not, because I am a normal person and I was able to do it! So if you really want you can also do it! In the link you have listed all the functionality I decided to include, which excluded `\\\\d`, for example.\\n\",\n    \"\\n\",\n    \"I was only able to do this in the way I did because I had gone through some (not all) of the blog posts in [this amazing series](https://ruslanspivak.com/lsbasi-part1/).\\n\",\n    \"\\n\",\n    \"Maybe you can implement a smaller subset of the features without too much trouble? The point of this is that you could only print the strings matched by a regex if you know how regular expressions work. Try starting with only implementing literal matching and the `|` and `?` operators. Can you now include grouping `()` so that `(ab)?` would work as expected? Can you add `[]`? What about `+` and `*`? Or maybe start with `{n,m}` and write `?`, `+` and `*` as `{0,1}`, `{1,}` and `{0,}` respectively.\\n\",\n    \"\\n\",\n    \"You can also postpone this project for a bit, and dig deeper into the world of regex. The next section contains some additional references and some websites with exercises to practice your new knowledge!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Further reading\\n\",\n    \"For regular expressions in Python, you can take a look at the [documentation](https://docs.python.org/3/library/re.html) of the `re` module, as well as this [regex HOWTO](https://docs.python.org/3/howto/regex.html).\\n\",\n    \"\\n\",\n    \"Some nice topics to follow up on this would include, but are not limited to:\\n\",\n    \"  - Non capturing groups (and named groups for Python)\\n\",\n    \"  - Lookaheads (positive, negative, ...)\\n\",\n    \"  - Regex compilation and flags (for Python)\\n\",\n    \"  - Recursive regular expressions\\n\",\n    \"\\n\",\n    \"[This](https://regexr.com/) interesting website (and [this one](https://regex101.com/) as well) provides an interface for you to type regular expressions and see what they match in a text. The tool also gives you an explanation of what your regular expression is doing.\\n\",\n    \"\\n\",\n    \"---\\n\",\n    \"\\n\",\n    \"I found some interesting websites with exercises on regular expressions. [This one](https://regexone.com/lesson/introduction_abcs) has more \\\"basic\\\" exercises, each one of them preceeded by an explanation of whatever you will need to complete the exercise. I suggest you to go through them. [Hackerrank](https://www.hackerrank.com/domains/regex) and [regexplay](http://play.inginf.units.it/#/) also have some interesting exercises, but those require you to login in some way.\\n\",\n    \"\\n\",\n    \"---\\n\",\n    \"\\n\",\n    \"If you enjoyed this guide and/or it was useful, consider leaving a star in the [Virgilio repository](https://github.com/clone95/Virgilio) and sharing it with your friends!\\n\",\n    \"\\n\",\n    \"This was brought to you by the editor of the [Mathspp Blog](https://mathspp.blogspot.com), [RojerGS](https://github.com/RojerGS).\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Suggested solutions\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### $\\\\pi$ lookup (solved)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Found the number '9876' at positions (4087, 4091)\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"pifile = \\\"regex-bin/pi.txt\\\"\\n\",\n    \"regex = \\\"9876\\\"  # define your regex to look your favourite number up\\n\",\n    \"\\n\",\n    \"with open(pifile, \\\"r\\\") as f:\\n\",\n    \"    pistr = f.read()  # pistr is a string that contains 1M digits of pi\\n\",\n    \"    \\n\",\n    \"## search for your number here\\n\",\n    \"m = re.search(regex, pistr)\\n\",\n    \"if m:\\n\",\n    \"    print(\\\"Found the number '{}' at positions {}\\\".format(regex, m.span()))\\n\",\n    \"else:\\n\",\n    \"    print(\\\"Sorry, the first million digits of pi can't help you with that...\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Virgilio or Virgil? (solved)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Publius Vergilius Maro (Classical Latin: [ˈpuː.blɪ.ʊs wɛrˈɡɪ.lɪ.ʊs ˈma.roː]; traditional dates October 15, 70 BC – September 21, 19 BC[1]), usually called Virgil or Vergil (/ˈvɜːrdʒɪl/) in English, was an ancient Roman poet of the Augustan period. He wrote three of the most famous poems in Latin literature: the Eclogues (or Bucolics), the Georgics, and the epic Aeneid. A number of minor poems, collected in the Appendix Vergiliana, are sometimes attributed to him.[2][3]\\n\",\n      \"\\n\",\n      \"Virgil is traditionally ranked as one of Rome's greatest poets. His Aeneid has been considered the national epic of ancient Rome since the time of its composition. Modeled after Homer's Iliad and Odyssey, the Aeneid follows the Trojan refugee Aeneas as he struggles to fulfill his destiny and reach Italy, where his descendants Romulus and Remus were to found the city of Rome. Virgil's work has had wide and deep influence on Western literature, most notably Dante's Divine Comedy, in which Virgil appears as Dante's guide through Hell and Purgatory.\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"paragraphs = \\\\\\n\",\n    \"\\\"\\\"\\\"Publius Vergilius Maro (Classical Latin: [ˈpuː.blɪ.ʊs wɛrˈɡɪ.lɪ.ʊs ˈma.roː]; traditional dates October 15, 70 BC – September 21, 19 BC[1]), usually called virgilio or Vergil (/ˈvɜːrdʒɪl/) in English, was an ancient Roman poet of the Augustan period. He wrote three of the most famous poems in Latin literature: the Eclogues (or Bucolics), the Georgics, and the epic Aeneid. A number of minor poems, collected in the Appendix Vergiliana, are sometimes attributed to him.[2][3]\\n\",\n    \"\\n\",\n    \"Virgilio is traditionally ranked as one of Rome's greatest poets. His Aeneid has been considered the national epic of ancient Rome since the time of its composition. Modeled after Homer's Iliad and Odyssey, the Aeneid follows the Trojan refugee Aeneas as he struggles to fulfill his destiny and reach Italy, where his descendants Romulus and Remus were to found the city of Rome. virgilio's work has had wide and deep influence on Western literature, most notably Dante's Divine Comedy, in which virgilio appears as Dante's guide through Hell and Purgatory.\\\"\\\"\\\"\\n\",\n    \"\\n\",\n    \"regex = \\\"(V|v)irgilio\\\"\\n\",\n    \"parsed_str = paragraphs\\n\",\n    \"m = re.search(regex, parsed_str)\\n\",\n    \"while m is not None:\\n\",\n    \"    parsed_str = parsed_str[:m.start()] + \\\"Virgil\\\" + parsed_str[m.end():]\\n\",\n    \"    m = re.search(regex, parsed_str)\\n\",\n    \"\\n\",\n    \"print(parsed_str)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Removing excessive spaces (solved)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"0\\n\",\n      \"Now it is your turn. I am going to give you this sentence as input, and your job is to fix the whitespace in it. When you are done, save the result in a string named `s`, and check if `s.count()` is equal to 0 or not.\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"weird_text = \\\"Now   it  is your   turn.  I am     going  to give   you this    sentence as        input, and   your  job    is to      fix the     whitespace         in it. When you    are  done,    save the    result in a  string  named   `s`, and   check    if  `s.count(\\\"  \\\")` is   equal   to    0  or not.\\\"\\n\",\n    \"regex = \\\" +\\\"  # put your regex here\\n\",\n    \"# there are several possible solutions, I chose this one\\n\",\n    \"\\n\",\n    \"# substitute the extra whitespace here\\n\",\n    \"s = re.sub(regex, \\\" \\\", weird_text)\\n\",\n    \"\\n\",\n    \"# this print should be 0\\n\",\n    \"print(s.count(\\\"  \\\"))\\n\",\n    \"print(s)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Phone numbers v1 (solved)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 48,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"<re.Match object; span=(0, 12), match='202-555-0181'>\\n\",\n      \"<re.Match object; span=(0, 16), match='001 202-555-0181'>\\n\",\n      \"<re.Match object; span=(0, 15), match='+1-512-555-0191'>\\n\",\n      \"None\\n\",\n      \"None\\n\",\n      \"None\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"((00|[+])1[ -])?[0-9]{3}-[0-9]{3}-[0-9]{4}\\\"  # write your regex here\\n\",\n    \"matches = [  # you should be able to match those\\n\",\n    \"    \\\"202-555-0181\\\",\\n\",\n    \"    \\\"001 202-555-0181\\\",\\n\",\n    \"    \\\"+1-512-555-0191\\\"\\n\",\n    \"]\\n\",\n    \"non_matches = [  # for now, none of these should be matched\\n\",\n    \"    \\\"202555-0181\\\",\\n\",\n    \"    \\\"96-125-3546\\\",\\n\",\n    \"    \\\"(+1)5125550191\\\"\\n\",\n    \"]\\n\",\n    \"for s in matches:\\n\",\n    \"    print(re.search(regex, s))\\n\",\n    \"for s in non_matches:\\n\",\n    \"    print(re.search(regex, s))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### `search` with `matched` (solved)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"True\\n\",\n      \"True\\n\",\n      \"True\\n\",\n      \"True\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"def my_search(regex, string):\\n\",\n    \"    found = False\\n\",\n    \"    while string:\\n\",\n    \"        m = re.match(regex, string)\\n\",\n    \"        if m:\\n\",\n    \"            return True\\n\",\n    \"        string = string[1:]\\n\",\n    \"    # check if the pattern matches the empty string\\n\",\n    \"    if re.match(regex, string):\\n\",\n    \"        return True\\n\",\n    \"    else:\\n\",\n    \"        return False\\n\",\n    \"\\n\",\n    \"regex = \\\"[0-9]{2,4}\\\"\\n\",\n    \"\\n\",\n    \"# your function should be able to match in all these strings\\n\",\n    \"string1 = \\\"1984 was already some years ago.\\\"\\n\",\n    \"print(my_search(regex, string1))\\n\",\n    \"string2 = \\\"There is also a book whose title is '1984', but the story isn't set in the year of 1984.\\\"\\n\",\n    \"print(my_search(regex, string2))\\n\",\n    \"string3 = \\\"Sometimes people write '84 for short.\\\"\\n\",\n    \"print(my_search(regex, string3))\\n\",\n    \"\\n\",\n    \"# your function should also match with this regex and this string\\n\",\n    \"regex = \\\"a*\\\"\\n\",\n    \"string = \\\"\\\"\\n\",\n    \"print(my_search(regex, string))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Count matches with `findall` (solved)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 24,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"3\\n\",\n      \"1\\n\",\n      \"2\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"def count_matches(regex, string):\\n\",\n    \"    return len(re.findall(regex, string))\\n\",\n    \"\\n\",\n    \"regex = \\\"wow\\\"\\n\",\n    \"\\n\",\n    \"string1 = \\\"wow wow wow\\\" # this should be 3\\n\",\n    \"print(count_matches(regex, string1))\\n\",\n    \"string2 = \\\"wowow\\\" # this should be 1\\n\",\n    \"print(count_matches(regex, string2))\\n\",\n    \"string3 = \\\"wowowow\\\" # this should be 2\\n\",\n    \"print(count_matches(regex, string3))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Phone numbers v2 (solved)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 49,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"<re.Match object; span=(0, 12), match='202-555-0181'>\\n\",\n      \"<re.Match object; span=(0, 16), match='001 202-555-0181'>\\n\",\n      \"<re.Match object; span=(0, 15), match='+1-512-555-0191'>\\n\",\n      \"None\\n\",\n      \"None\\n\",\n      \"None\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"((00|[+])1[ -])?\\\\d{3}-\\\\d{3}-\\\\d{4}\\\"  # write your regex here\\n\",\n    \"matches = [  # you should be able to match those\\n\",\n    \"    \\\"202-555-0181\\\",\\n\",\n    \"    \\\"001 202-555-0181\\\",\\n\",\n    \"    \\\"+1-512-555-0191\\\"\\n\",\n    \"]\\n\",\n    \"non_matches = [  # for now, none of these should be matched\\n\",\n    \"    \\\"202555-0181\\\",\\n\",\n    \"    \\\"96-125-3546\\\",\\n\",\n    \"    \\\"(+1)5125550191\\\"\\n\",\n    \"]\\n\",\n    \"for s in matches:\\n\",\n    \"    print(re.search(regex, s))\\n\",\n    \"for s in non_matches:\\n\",\n    \"    print(re.search(regex, s))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Phone numbers v3 (solved)\\n\",\n    \"\\n\",\n    \"For this \\\"problem\\\", one thinks of using the `.findall()` function to look for all matches. When we do that, we don't get a list of the match objects, but instead a list with tuples, where each tuple has a specific group from our regex. This is the behaviour that is [documented for the `re.findall()` function](https://docs.python.org/3/library/re.html#re.findall).\\n\",\n    \"\\n\",\n    \"This is fine, because we really only cared about the number code, and we can print it easily. If we wanted the match objects, then the alternative would be to use the [`re.finditer()`](https://docs.python.org/3/library/re.html#re.finditer) function.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 26,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"('0039', '00')\\n\",\n      \"('0039', '00')\\n\",\n      \"('+30', '+')\\n\",\n      \"The number '0039 3123456789' has country code: 0039\\n\",\n      \"The number '0039 3135313531' has country code: 0039\\n\",\n      \"The number '+30-2111112222' has country code: +30\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"paragraph = \\\"\\\"\\\"Hello, I am Virgilio and I am from Italy.\\n\",\n    \"If phones were a thing when I was alive, my number would've probably been 0039 3123456789.\\n\",\n    \"I would also love to get a house with 3 floors and something like +1 000 square meters.\\n\",\n    \"Now that we are at it, I can also tell you that the number 0039 3135313531 would have suited Leo da Vinci very well...\\n\",\n    \"And come to think of it, someone told me that Socrates had dibs on +30-2111112222\\\"\\\"\\\"\\n\",\n    \"# you should find 3 phone numbers\\n\",\n    \"# and you should not be fooled by the other numbers that show up in the text\\n\",\n    \"\\n\",\n    \"regex = \\\"((00|[+])\\\\d{1,3})[ -]\\\\d{8,12}\\\"\\n\",\n    \"ns = re.findall(regex, paragraph)  # find numbers\\n\",\n    \"for n in ns:\\n\",\n    \"    # n is a tuple with the two groups our string has\\n\",\n    \"    print(n)\\n\",\n    \"    \\n\",\n    \"for n in re.finditer(regex, paragraph):\\n\",\n    \"    print(\\\"The number '{}' has country code: {}\\\".format(n.group(), n.group(1)))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": []\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.7.1\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "Tools/WolframAlpha.md",
    "content": "# WolframAlpha\n[WolframAlpha](https://www.wolframalpha.com) (WA) is a computational knowledge engine, which is a very fancy way of saying that WolframAlpha is a platform that can answer your questions. WolframAlpha is most notable for its capabilities regarding mathematics and it can be a very powerful tool to help you with your computations.\n\n## Accessing WolframAlpha\nWolframAlpha's knowledge engine can be accessed online through [wolframalpha.com](https://www.wolframalpha.com) but if you have access to a license, perhaps through your university/research center/company, you might want to install [Wolfram Mathematica](https://www.wolfram.com/mathematica/), _\"a modern technical computing system spanning most areas of technical computing — including neural networks, machine learning, image processing, geometry, data science, visualizations, and others\"_.\n\n## WolframAlpha's mathematical capabilities\nThis little guide will focus on teaching some of the WA's mathematical capabilities. Please bear in mind that there is much more that it can do! This is what we will be covering:\n\n  - [Basic calculations](#basic-calculations)\n  - [Plotting functions](#plotting-functions)\n  - [Solving equations](#solving-equations)\n  - [Solving inequalities](#solving-inequalities)\n  - [Matrix algebra](#matrix-algebra)\n  - [Computing series and summations](#computing-series-and-summations)\n  - [Finding derivatives](#finding-derivatives)\n  - [Computing integrals](#computing-integrals)\n  - [Finding limits](#finding-limits)\n  - [Miscellaneous](#miscellaneous)\n  \nWhenever you input something into WA, you get the link of your query, so that you can actually share what you asked and the answer given pretty easily. For example, following [this link](https://www.wolframalpha.com/input/?i=Who+is+the+US+president) you can see what WA told me when I asked him who the US president is. Through this guide, blue letters with a gray background give a link to a WA query. So if you click this -> [`What is the 345th decimal place of pi`](https://www.wolframalpha.com/input/?i=What+is+the+345th+decimal+place+of+pi) you will see what WA answered me when I asked for the 345th decimal place of pi (it's 5, by the way).\n\nAnother important thing to notice is that you don't have to follow a strict syntax when asking things to WA, even though the more you can facilitate WA's life, the better.\n\nAlso note that Mathematica - the language developed by the creators of WA -, uses `[]` for function calls, instead of `()`, and all function names are capitalized, so `Sqrt[n]` would give you the usual square root function, that in many languages would probably be used as `sqrt(n)`. This is relevant because WA supports a subset of Mathematica's functions.\n\nOne final **very important** hint is that if you have Mathematica, you can get step-by-step solutions to limits, integrals and derivatives (only to name a few) by starting a command with `==`.\n  \n### Basic calculations\nWolframAlpha can, of course, be used as a pretty advanced calculator. Typing in `2^100` will give you the well-known answer of `1267650600228229401496703205376`. Some useful operators to know include:\n  - The usual addition `+`, subtraction `-`, multiplication `*` and division `/`\n  - The power operator `^`, used as `x^y`, which can also be used as `Power[x, y]`\n  - To find the remainder of a division, either type in `x mod m` or use `Mod[x, y]`\n  - The square root is `Sqrt[x]`, and the `n`-th root of `x` is given by `Root[x, n]`, so the cubic root of 8 would be found by typing in [`Root[8, 3]`](https://www.wolframalpha.com/input/?i=Root%5B8,+3%5D)\n  - The factorial operator can be written as `n!` or as `Factorial[n]`\n  - The logarithm and the exponential function are respectively written as `Log[x]` and `Exp[x]`\n  - Trigonometric functions have the usual names, but capitalized; for example, `Tan[x]`, `Sin[x]`, `ArcCos[x]` are respectively the tangent, sine and arc-cosine functions\n\n### Plotting functions\nThere are several different types of plots you can ask WA to do, but perhaps the most basic one would be to plot a simple function from the reals to the reals, like [plotting x^2](https://www.wolframalpha.com/input/?i=plot+x%5E2), which can be done by typing in `plot x^2` or `plot Power[x, 2]`.\\\nWhen plotting functions, we don't always want the range that WA suggests, so [`plot x^2 from -5 to 1`](https://www.wolframalpha.com/input/?i=plot+x%5E2+from+-5+to+1) would change the range from the default to the interval from -5 to 1.\n\nFor simpler plots, writing in plain English what we want works just fine, but for more complex or intricated plots, we will be better of using the Mathematica syntax. So a regular plot like `plot x^2 from -5 to 1` becomes `Plot[x^2, {x, -5, 1}]`, where the function `Plot[]` is used to say we want a plot, the first argument `x^2` is the function we want to plot and the second argument `{x, -5, 1}` is a list (lists in Mathematica are denoted with `{}`) with the variable, the left limit and the right limit. So [`Plot[x^2, {x, -5, 1}]`](https://www.wolframalpha.com/input/?i=Plot%5Bx%5E2,+%7Bx,-5,1%7D%5D) produces the same plot as before.\n\nTo plot more than one function, we can give a list of functions as first argument, instead of just a function. For example, [`Plot[ {x^2, x^3, x^4}, {x, 1, 5} ]`](https://www.wolframalpha.com/input/?i=Plot%5B%7Bx%5E2,+x%5E3,+x%5E4%7D,+%7Bx,+1,+5%7D%5D) will plot three different polynomials, from 1 to 5.\n\nTo plot functions of two variables, we can use the function `Plot3D`, so if we type in [`Plot3D[x^2 + y^2 + x*y, {x, -2, 2}, {y, -2, 0}]`](https://www.wolframalpha.com/input/?i=Plot3D%5Bx%5E2+%2B+y%5E2+%2B+x*y,+%7Bx,+-2,+2%7D,+%7By,+-2,+0%7D%5D) we will be plotting the function `x^2 + y^2 + xy` when `x` varies between -2 and 2 and when `y` varies between -2 and 0.\n\n### Solving equations\nSolving equations can be done very easily. In fact, just typing in [`solve x^2 + x - 1 = 0 for x`](https://www.wolframalpha.com/input/?i=solve+x%5E2+%2B+x+-+1+%3D+0+for+x) gives you what you would expect. Using Mathematica notation, you would type [`Solve[x^2 + x - 1 == 0, x]`](https://www.wolframalpha.com/input/?i=Solve%5Bx%5E2+%2B+x+-+1+%3D%3D+0,+x%5D).\n\nA great thing of WA and of Mathematica as well is their ability to do symbolic calculations, which also means your equations can have parameters or other unknowns, and WA will try to give you the answer in terms of those parameters. For example, we can ask WA for the general formula to solve a polynomial equation of degree 4 with [`Solve[x^4 + b*x^3 + c*x^2 + d*x + e == 0, x]`](https://www.wolframalpha.com/input/?i=Solve%5Bx%5E4+%2B+b+x%5E3+%2B+c+x%5E2+%2B+d+x+%2B+e+%3D%3D+0,+x%5D) which returns the nasty formulas.\n\nThe equations you want to solve do not need to be polynomial ones! For example, [`Solve[Log[x] + Exp[x] == 1, x]`](https://www.wolframalpha.com/input/?i=Solve%5B+Log%5Bx%5D+%2B+Exp%5Bx%5D+%3D%3D+1,+x%5D) gives the value of the number `x` that solves the equation `Log[x] + Exp[x] == 1`.\n\nSystems of equations can also be solved. Just like you would give a list of functions to the `Plot[]`, now we give a list of equations to the `Solve[]`. For example, we want to solve the two equations `Log[x] + y == 1` and `Log[x] + Log[y] == 2`, which we do by typing in [`Solve[ {Log[x] + y == 1, Log[y] + Log[x] == 2}, {x,y} ]`](https://www.wolframalpha.com/input/?i=Solve%5B+%7BLog%5Bx%5D+%2B+y+%3D%3D+1,+Log%5By%5D+%2B+Log%5Bx%5D+%3D%3D+2%7D,+%7Bx,y%7D+%5D). Two **important** things to notice here! First, the result that WA gives includes a function `W` that most people won't know; WA helps people by writing slightly to the right what each component of the solution is, so WA actually says here that _\"W(z) is the product log function\"_, which we can then google for. Second, notice how the second argument of `Solve[]` was `{x,y}` and **not** `x`! We need to tell WA all the variables we have; if we only write `x`, then WA is trying to solve a different problem: [`Solve[ {Log[x] + y == 1, Log[y] + Log[x] == 2}, x ]`](https://www.wolframalpha.com/input/?i=Solve%5B+%7BLog%5Bx%5D+%2B+y+%3D%3D+1,+Log%5By%5D+%2B+Log%5Bx%5D+%3D%3D+2%7D,+x+%5D)\n\n### Solving inequalities\nTo solve inequalities you do it in a similar way to equations, but instead use the function `Reduce[]`. As an example, we solve the simultaneous system of inequalities `x y > 3` and `x + y < 0` by typing in [`Reduce[{x + y < 0, x y > 3}, {x,y}]`](https://www.wolframalpha.com/input/?i=Reduce%5B%7Bx+%2B+y+%3C+0,+x+y+%3E+3%7D,+%7Bx,y%7D%5D)\n\n### Matrix algebra\nMatrices are used a lot, and sometimes we just need some place to go to check a determinant, the eigenvalues or the eigenvectors of a matrix, or maybe even invert it. You may need that, and when you do, WA has got your back.\n\nIn WA, matrices are lists of lists. The outer lists collects all the rows, and the inner lists have the elements of each row, so the identity matrix of dimension 2 would be represented as [`{ {1, 0}, {0, 1} }`](https://www.wolframalpha.com/input/?i=%7B%7B1,+0%7D,+%7B0,+1%7D%7D) (by just inputing the matrix WA will automatically give you plenty of information about the matrix).\n\nTo find the determinant or the trace of a matrix, you would respectively use the functions `Det[]` and `Trace[]`, so for example [`Det[{ {a, b}, {c, d} }]`](https://www.wolframalpha.com/input/?i=Det%5B%7B%7Ba,+b%7D,+%7Bc,+d%7D%7D%5D) gives the determinant of a general 2 by 2 matrix, and [`Trace[{ {a, b}, {c, d} }]`](https://www.wolframalpha.com/input/?i=Trace%5B%7B%7Ba,+b%7D,+%7Bc,+d%7D%7D%5D) gives its trace.\n\nTo find the inverse, you use [`Inverse[{ {a, b}, {c, d} }]`](https://www.wolframalpha.com/input/?i=Inverse%5B%7B%7Ba,+b%7D,+%7Bc,+d%7D%7D%5D).\n\nTo ask for the eigenvalues (resp. the eigenvectors) you would type in [`Eigenvalues[{ {a, b}, {c, d} }]`](https://www.wolframalpha.com/input/?i=Eigenvalues%5B%7B%7Ba,+b%7D,+%7Bc,+d%7D%7D%5D) (resp. [`Eigenvectors[{ {a, b}, {c, d} }]`](https://www.wolframalpha.com/input/?i=Eigenvectors%5B%7B%7Ba,+b%7D,+%7Bc,+d%7D%7D%5D)), even though asking for one usually also gives the other.\n\nOf course that all of this can be done with bigger matrices, and matrices with actual numbers, not just parameters! For example, we can compute the eigenvalues of some 5 by 5 matrix, say [`Eigenvalues[{ {1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20},{21,22,23,24,25} }]`](https://www.wolframalpha.com/input/?i=Eigenvalues%5B%7B%7B1,2,3,4,5%7D,%7B6,7,8,9,10%7D,%7B11,12,13,14,15%7D,%7B16,17,18,19,20%7D,%7B21,22,23,24,25%7D%7D%5D) gives `0, 0, 0, -3.642, 68.64`.\n\nProbably more relevant for university courses, but WA also diagonalizes matrices/finds their Jordan canonical form. For that, use [`JordanDecomposition[{ {1, 2}, {0, 3} }]`](https://www.wolframalpha.com/input/?i=JordanDecomposition%5B%7B%7B1,+2%7D,+%7B0,+3%7D%7D%5D) which also gives the similarity matrix and the matrix in diagonal/Jordan canonical form.\n\n### Computing series and summations\nAnother thing that Wolfram  Alpha can do is compute summations and series; both with known values and with unknown values. For example, I never know by heart what is the formula to compute the sum of the first terms of a geometric series like `1 + x + x^2 + x^3 + ... + x^n`. WA can help me by just inputing [`sum x^i with i from 0 to n`](https://www.wolframalpha.com/input/?i=sum+x%5Ei+with+i+from+0+to+n), which gives the formula I always forget! But then again, we would be better off using Mathematica's syntax, which for sums/series is through the function `Sum[]`. The first argument is the expression you want to sum, the second argument is the range of the dummy variable! For example, [`Sum[x^i, {i, 0, n}]`](https://www.wolframalpha.com/input/?i=Sum%5Bx%5Ei,+%7Bi,+0,+n%7D%5D) gives the same result as before.\n\nWe can also sum, for example, the first 20 factorials with [`Sum[Factorial[n], {n, 1, 20}]`](https://www.wolframalpha.com/input/?i=Sum%5BFactorial%5Bn%5D,+%7Bn,+1,+20%7D%5D) (which gives `2561327494111820313` by the way).\n\nInfinite sums, which are called series, are computed by replacing the upper limit of the dummy variable with `infty`. So if we input [`Sum[1/n, {n, 1, infty}]`](https://www.wolframalpha.com/input/?i=Sum%5B1%2Fn,+%7Bn,+1,+infty%7D%5D) our dear WA lets us know that the [harmonic series diverges](http://mathspp.blogspot.com/2018/10/twitter-proof-sum-of-inverses-diverges.html).\n\nAnother interesting example is [`Sum[1/n^2, {n, 1, infty}]`](https://www.wolframalpha.com/input/?i=Sum%5B1%2Fn%5E2,+%7Bn,+1,+infty%7D%5D), which actually gives `pi^2/6`.\n\nFinite/infinite products work the same way, except that we use the function `Product[]`. For example, there is an interesting product formula that gives `pi/2`, and the first 100 terms of that product show that it is close: [`Product[(4i^2)/((2i-1)*(2i+1)), {i, 1, 100}]`](https://www.wolframalpha.com/input/?i=Product%5B(4i%5E2)%2F((2i-1)*(2i%2B1)),+%7Bi,+1,+100%7D%5D) is close to [`Pi/2`](https://www.wolframalpha.com/input/?i=pi%2F2) (more on this example in the limits section).\n\n### Finding derivatives\nDifferentiating a function is something that can get really nasty. Thankfully, WA does it for us with little effort! We can get some basic derivatives with [`differentiate cos(sin(x)) wrt x`](https://www.wolframalpha.com/input/?i=differentiate+cos(sin(x))+wrt+x). The equivalent Mathematica command would be [`D[Cos[Sin[x]], x]`](https://www.wolframalpha.com/input/?i=D%5BCos%5BSin%5Bx%5D%5D,+x%5D), where the `D` stands for differentiation, probably. Notice that the first argument is the function you want to differentiate, and the second argument is the variable with respect to which you want to differentiate.\n\nHigher-order derivatives can be done by specifying the variable and the order: [`D[x^5, {x, 5}]`](https://www.wolframalpha.com/input/?i=D%5Bx%5E5,+%7Bx,+5%7D%5D) gives the fifth derivative of the function `x^5`.\n\nFunctions of several variables can also be differentiated easily, as WA and Mathematica will treat as constants everything that is not the variable specified. For example, [`D[x^2 + y^2, x]`](https://www.wolframalpha.com/input/?i=D%5Bx%5E2+%2B+y%5E2,+x%5D) gives `2x`, obviously.\n\nTo find mixed partial derivatives, just put the function as the first argument, and then all the variables you want to differentiate with respect to, in order. For example, if you want to find the mixed partial derivative of `f` with respect to `a`, then `b`, then `c`, do [`D[f[a,b,c], a, b, c]`](https://www.wolframalpha.com/input/?i=D%5Bf%5Ba,b,c%5D,+a,+b,+c%5D). Notice how for this last one, WA returns the symbolic expression, as `f` was just some generic function. This means we can also get WA to tell us the rules of differentiation. For example, we can ask WA to differentiate the product `f(x)g(x)`: [`D[f[x] * g[x], x]`](https://www.wolframalpha.com/input/?i=D%5Bf%5Bx%5D+*+g%5Bx%5D,+x%5D) that gives the product rule `(fg)' = f'g + fg'`.\n\nTypical operations on (usually scalar) functions that include derivatives can be computed with WA as well. In the following list I assume we are working with some function `f(x, y, z)` of three variables. The number of variables can be easily changed!\n  - Gradient of `f` can be computed with [`gradient f[x,y,z]`](https://www.wolframalpha.com/input/?i=gradient+f%5Bx,y,z%5D) in WA and `D[f[x,y,z], { {x,y,z} }]` in Mathematica\n  - The divergence of the vector function `(f1(x,y,z), f2(x,y,z), f3(x,y,z))` can be found with [`divergence {f1[x,y,z], f2[x,y,z], f3[x,y,z]}`](https://www.wolframalpha.com/input/?i=divergence+%7Bf1%5Bx,y,z%5D,+f2%5Bx,y,z%5D,+f3%5Bx,y,z%5D%7D) in WA and `Div[{f1[x, y, z], f2[x, y, z], f3[x, y, z]}, {x, y, z}]` in Mathematica\n  - The curl is similar, expect that we replace `divergence` with `curl` for the WA computation and use the function `Curl[]` in Mathematica, instead of `Div`\n  - Laplacian of `f` can be computed with [`laplacian f[x,y,z]`](https://www.wolframalpha.com/input/?i=laplacian+f%5Bx,y,z%5D) in WA and `Laplacian[f[x, y, z], {x, y, z}]` in Mathematica\n\n### Computing integrals\nUnfortunately, computing integrals with WolframAlpha is very difficult... Not! It works just like anything else. You just type it in in WA and you get an answer: [`integrate exp(-x^2) with x from 0 to infinity`](https://www.wolframalpha.com/input/?i=integrate+exp(-x%5E2)+with+x+from+0+to+infinity). Mathematica's way of doing things would be [`Integrate[ Exp[-x^2], {x, 0, infty}]`](https://www.wolframalpha.com/input/?i=Integrate%5B+Exp%5B-x%5E2%5D,+%7Bx,+0,+infty%7D%5D).\n\nOf course the variable of integration can be any variable and the bounds can be changed as well, and they can include plus and minus infinity.\n\nTo find anti-derivatives, you just omit the bounds of the variable. For example, to find an anti-derivative of `cos(sin(x))tan(x)` we could type in [`Integrate[Cos[Sin[x]]Tan[x], x]`](https://www.wolframalpha.com/input/?i=Integrate%5BCos%5BSin%5Bx%5D%5DTan%5Bx%5D,+x%5D) and we get a very long answer. Sometimes WA can't find an anti-derivative, and it will let you know that.\n\nIf all we need is an (accurate) numerical value and we don't need WA to give us the exact answer (which it will try to give always and whenever possible) we can explicitly use the function `NIntegrate[]` instead of `Integrate`: [`NIntegrate[Cos[1/x + Pi/2]^5, {x,1,infty}]`](https://www.wolframalpha.com/input/?i=NIntegrate%5BCos%5B1%2Fx+%2B+Pi%2F2%5D%5E5,+%7Bx,1,infty%7D%5D).\n\nAs a final remark, note that if you use WA/Mathematica to check if you are doing your antiderivatives correctly, remember that sometimes a function has more than one antiderivative. If you were trying to find the antiderivative of a function `h` and arrived at some function `f` but then WA got to a different function `g`, it doesn't necessarily mean you got it wrong! Just try deriving your function `f` and see if that gives `h`, as it should!\n\n### Finding limits\nTo find a limit of an expression or function, just type it as you would expect it: [`limit of 1/x as x goes to -infty`](https://www.wolframalpha.com/input/?i=limit+of+1%2Fx+as+x+goes+to+-infty). The function one may want to use here is `Limit[]`. It works like almost all other function we've seen. The first argument is the expression and the second argument is the variable; the only thing to be careful here is the way in which we tell WA to where the variable is converging. The previous example would be written [`Limit[1/x, x -> -infty]`](https://www.wolframalpha.com/input/?i=Limit%5B1%2Fx,+x+-%3E+-infty%5D).\n\nIt is often useful to also define the direction from which the variable approaches the limiting value. For example we know that the limit of `1/x` when `x` goes to 0 changes as `x` approaches 0 from the left or from the right. So we can actually check that [`Limit[1/x, x -> 0^+]`](https://www.wolframalpha.com/input/?i=Limit%5B1%2Fx,+x+-%3E+0%5E%2B%5D) is different from [`Limit[1/x, x -> 0^-]`](https://www.wolframalpha.com/input/?i=Limit%5B1%2Fx,+x+-%3E+0%5E-%5D) where the exponent notation `0^+` and `0^-` is used to define the side from which we approach 0 here.\n\nAlso, in the [summations and series](#computing-series-and-summations) I mentioned that a certain product could be used to compute `pi/2`. The product I am talking about is [`Product[(4i^2)/((2i-1)*(2i+1)), {i, 1, infty}]`](https://www.wolframalpha.com/input/?i=Product%5B(4i%5E2)%2F((2i-1)*(2i%2B1)),+%7Bi,+1,+infty%7D%5D) and if you follow the link you will see that WA can't actually give you the exact value. Instead, it gave me the value of the product if I only go up to 5 terms and it gave me a **closed** formula for the product up to `n`: [`Product[(4i^2)/((2i-1)*(2i+1)), {i, 1, n}]`](https://www.wolframalpha.com/input/?i=Product%5B(4i%5E2)%2F((2i-1)*(2i%2B1)),+%7Bi,+1,+n%7D%5D). Now I will use the `Limit[]` function to prove that I am actually not lying! If I put that closed formula inside the `Limit` function and ask `n` to go to infinity like so: [`Limit[(Pi Gamma[1 + n]^2)/(2 Gamma[1/2 + n] Gamma[3/2 + n]), n -> infty]`](https://www.wolframalpha.com/input/?i=Limit%5B(Pi+Gamma%5B1+%2B+n%5D%5E2)%2F(2+Gamma%5B1%2F2+%2B+n%5D+Gamma%5B3%2F2+%2B+n%5D),+n+-%3E+infty%5D), we get the desired `pi/2`.\n\n### Miscellaneous\nTo find if a number is prime, you can use the function `PrimeQ[]`, for example type [`PrimeQ[4234523457]`](https://www.wolframalpha.com/input/?i=PrimeQ%5B4234523457%5D) to conclude that 4234523457 is not a prime number because `4234523457 = 3×53×97×463×593`.\n\nSimilarly, use the function `Prime[]` to find out the `n`-th prime. For example, type [`Prime[4234523457]`](https://www.wolframalpha.com/input/?i=Prime%5B4234523457%5D) to find out that the 4234523457th prime is `102951556637`.\n\n---\nBrought to you by the editor of the [Mathspp Blog](https://mathspp.blogspot.com/), [RojerGS](https://github.com/RojerGS).\n"
  },
  {
    "path": "Tools/regex-bin/pi.txt",
    "content": "3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196442881097566593344612847564823378678316527120190914564856692346034861045432664821339360726024914127372458700660631558817488152092096282925409171536436789259036001133053054882046652138414695194151160943305727036575959195309218611738193261179310511854807446237996274956735188575272489122793818301194912983367336244065664308602139494639522473719070217986094370277053921717629317675238467481846766940513200056812714526356082778577134275778960917363717872146844090122495343014654958537105079227968925892354201995611212902196086403441815981362977477130996051870721134999999837297804995105973173281609631859502445945534690830264252230825334468503526193118817101000313783875288658753320838142061717766914730359825349042875546873115956286388235378759375195778185778053217122680661300192787661119590921642019893809525720106548586327886593615338182796823030195203530185296899577362259941389124972177528347913151557485724245415069595082953311686172785588907509838175463746493931925506040092770167113900984882401285836160356370766010471018194295559619894676783744944825537977472684710404753464620804668425906949129331367702898915210475216205696602405803815019351125338243003558764024749647326391419927260426992279678235478163600934172164121992458631503028618297455570674983850549458858692699569092721079750930295532116534498720275596023648066549911988183479775356636980742654252786255181841757467289097777279380008164706001614524919217321721477235014144197356854816136115735255213347574184946843852332390739414333454776241686251898356948556209921922218427255025425688767179049460165346680498862723279178608578438382796797668145410095388378636095068006422512520511739298489608412848862694560424196528502221066118630674427862203919494504712371378696095636437191728746776465757396241389086583264599581339047802759009946576407895126946839835259570982582262052248940772671947826848260147699090264013639443745530506820349625245174939965143142980919065925093722169646151570985838741059788595977297549893016175392846813826868386894277415599185592524595395943104997252468084598727364469584865383673622262609912460805124388439045124413654976278079771569143599770012961608944169486855584840635342207222582848864815845602850601684273945226746767889525213852254995466672782398645659611635488623057745649803559363456817432411251507606947945109659609402522887971089314566913686722874894056010150330861792868092087476091782493858900971490967598526136554978189312978482168299894872265880485756401427047755513237964145152374623436454285844479526586782105114135473573952311342716610213596953623144295248493718711014576540359027993440374200731057853906219838744780847848968332144571386875194350643021845319104848100537061468067491927819119793995206141966342875444064374512371819217999839101591956181467514269123974894090718649423196156794520809514655022523160388193014209376213785595663893778708303906979207734672218256259966150142150306803844773454920260541466592520149744285073251866600213243408819071048633173464965145390579626856100550810665879699816357473638405257145910289706414011097120628043903975951567715770042033786993600723055876317635942187312514712053292819182618612586732157919841484882916447060957527069572209175671167229109816909152801735067127485832228718352093539657251210835791513698820914442100675103346711031412671113699086585163983150197016515116851714376576183515565088490998985998238734552833163550764791853589322618548963213293308985706420467525907091548141654985946163718027098199430992448895757128289059232332609729971208443357326548938239119325974636673058360414281388303203824903758985243744170291327656180937734440307074692112019130203303801976211011004492932151608424448596376698389522868478312355265821314495768572624334418930396864262434107732269780280731891544110104468232527162010526522721116603966655730925471105578537634668206531098965269186205647693125705863566201855810072936065987648611791045334885034611365768675324944166803962657978771855608455296541266540853061434443185867697514566140680070023787765913440171274947042056223053899456131407112700040785473326993908145466464588079727082668306343285878569830523580893306575740679545716377525420211495576158140025012622859413021647155097925923099079654737612551765675135751782966645477917450112996148903046399471329621073404375189573596145890193897131117904297828564750320319869151402870808599048010941214722131794764777262241425485454033215718530614228813758504306332175182979866223717215916077166925474873898665494945011465406284336639379003976926567214638530673609657120918076383271664162748888007869256029022847210403172118608204190004229661711963779213375751149595015660496318629472654736425230817703675159067350235072835405670403867435136222247715891504953098444893330963408780769325993978054193414473774418426312986080998886874132604721569516239658645730216315981931951673538129741677294786724229246543668009806769282382806899640048243540370141631496589794092432378969070697794223625082216889573837986230015937764716512289357860158816175578297352334460428151262720373431465319777741603199066554187639792933441952154134189948544473456738316249934191318148092777710386387734317720754565453220777092120190516609628049092636019759882816133231666365286193266863360627356763035447762803504507772355471058595487027908143562401451718062464362679456127531813407833033625423278394497538243720583531147711992606381334677687969597030983391307710987040859133746414428227726346594704745878477872019277152807317679077071572134447306057007334924369311383504931631284042512192565179806941135280131470130478164378851852909285452011658393419656213491434159562586586557055269049652098580338507224264829397285847831630577775606888764462482468579260395352773480304802900587607582510474709164396136267604492562742042083208566119062545433721315359584506877246029016187667952406163425225771954291629919306455377991403734043287526288896399587947572917464263574552540790914513571113694109119393251910760208252026187985318877058429725916778131496990090192116971737278476847268608490033770242429165130050051683233643503895170298939223345172201381280696501178440874519601212285993716231301711444846409038906449544400619869075485160263275052983491874078668088183385102283345085048608250393021332197155184306354550076682829493041377655279397517546139539846833936383047461199665385815384205685338621867252334028308711232827892125077126294632295639898989358211674562701021835646220134967151881909730381198004973407239610368540664319395097901906996395524530054505806855019567302292191393391856803449039820595510022635353619204199474553859381023439554495977837790237421617271117236434354394782218185286240851400666044332588856986705431547069657474585503323233421073015459405165537906866273337995851156257843229882737231989875714159578111963583300594087306812160287649628674460477464915995054973742562690104903778198683593814657412680492564879855614537234786733039046883834363465537949864192705638729317487233208376011230299113679386270894387993620162951541337142489283072201269014754668476535761647737946752004907571555278196536213239264061601363581559074220202031872776052772190055614842555187925303435139844253223415762336106425063904975008656271095359194658975141310348227693062474353632569160781547818115284366795706110861533150445212747392454494542368288606134084148637767009612071512491404302725386076482363414334623518975766452164137679690314950191085759844239198629164219399490723623464684411739403265918404437805133389452574239950829659122850855582157250310712570126683024029295252201187267675622041542051618416348475651699981161410100299607838690929160302884002691041407928862150784245167090870006992821206604183718065355672525325675328612910424877618258297651579598470356222629348600341587229805349896502262917487882027342092222453398562647669149055628425039127577102840279980663658254889264880254566101729670266407655904290994568150652653053718294127033693137851786090407086671149655834343476933857817113864558736781230145876871266034891390956200993936103102916161528813843790990423174733639480457593149314052976347574811935670911013775172100803155902485309066920376719220332290943346768514221447737939375170344366199104033751117354719185504644902636551281622882446257591633303910722538374218214088350865739177150968288747826569959957449066175834413752239709683408005355984917541738188399944697486762655165827658483588453142775687900290951702835297163445621296404352311760066510124120065975585127617858382920419748442360800719304576189323492292796501987518721272675079812554709589045563579212210333466974992356302549478024901141952123828153091140790738602515227429958180724716259166854513331239480494707911915326734302824418604142636395480004480026704962482017928964766975831832713142517029692348896276684403232609275249603579964692565049368183609003238092934595889706953653494060340216654437558900456328822505452556405644824651518754711962184439658253375438856909411303150952617937800297412076651479394259029896959469955657612186561967337862362561252163208628692221032748892186543648022967807057656151446320469279068212073883778142335628236089632080682224680122482611771858963814091839036736722208883215137556003727983940041529700287830766709444745601345564172543709069793961225714298946715435784687886144458123145935719849225284716050492212424701412147805734551050080190869960330276347870810817545011930714122339086639383395294257869050764310063835198343893415961318543475464955697810382930971646514384070070736041123735998434522516105070270562352660127648483084076118301305279320542746286540360367453286510570658748822569815793678976697422057505968344086973502014102067235850200724522563265134105592401902742162484391403599895353945909440704691209140938700126456001623742880210927645793106579229552498872758461012648369998922569596881592056001016552563756785667227966198857827948488558343975187445455129656344348039664205579829368043522027709842942325330225763418070394769941597915945300697521482933665556615678736400536665641654732170439035213295435291694145990416087532018683793702348886894791510716378529023452924407736594956305100742108714261349745956151384987137570471017879573104229690666702144986374645952808243694457897723300487647652413390759204340196340391147320233807150952220106825634274716460243354400515212669324934196739770415956837535551667302739007497297363549645332888698440611964961627734495182736955882207573551766515898551909866653935494810688732068599075407923424023009259007017319603622547564789406475483466477604114632339056513433068449539790709030234604614709616968868850140834704054607429586991382966824681857103188790652870366508324319744047718556789348230894310682870272280973624809399627060747264553992539944280811373694338872940630792615959954626246297070625948455690347119729964090894180595343932512362355081349490043642785271383159125689892951964272875739469142725343669415323610045373048819855170659412173524625895487301676002988659257866285612496655235338294287854253404830833070165372285635591525347844598183134112900199920598135220511733658564078264849427644113763938669248031183644536985891754426473998822846218449008777697763127957226726555625962825427653183001340709223343657791601280931794017185985999338492354956400570995585611349802524990669842330173503580440811685526531170995708994273287092584878944364600504108922669178352587078595129834417295351953788553457374260859029081765155780390594640873506123226112009373108048548526357228257682034160504846627750450031262008007998049254853469414697751649327095049346393824322271885159740547021482897111777923761225788734771881968254629812686858170507402725502633290449762778944236216741191862694396506715157795867564823993917604260176338704549901761436412046921823707648878341968968611815581587360629386038101712158552726683008238340465647588040513808016336388742163714064354955618689641122821407533026551004241048967835285882902436709048871181909094945331442182876618103100735477054981596807720094746961343609286148494178501718077930681085469000944589952794243981392135055864221964834915126390128038320010977386806628779239718014613432445726400973742570073592100315415089367930081699805365202760072774967458400283624053460372634165542590276018348403068113818551059797056640075094260878857357960373245141467867036880988060971642584975951380693094494015154222219432913021739125383559150310033303251117491569691745027149433151558854039221640972291011290355218157628232831823425483261119128009282525619020526301639114772473314857391077758744253876117465786711694147764214411112635835538713610110232679877564102468240322648346417663698066378576813492045302240819727856471983963087815432211669122464159117767322532643356861461865452226812688726844596844241610785401676814208088502800541436131462308210259417375623899420757136275167457318918945628352570441335437585753426986994725470316566139919996826282472706413362221789239031760854289437339356188916512504244040089527198378738648058472689546243882343751788520143956005710481194988423906061369573423155907967034614914344788636041031823507365027785908975782727313050488939890099239135033732508559826558670892426124294736701939077271307068691709264625484232407485503660801360466895118400936686095463250021458529309500009071510582362672932645373821049387249966993394246855164832611341461106802674466373343753407642940266829738652209357016263846485285149036293201991996882851718395366913452224447080459239660281715655156566611135982311225062890585491450971575539002439315351909021071194573002438801766150352708626025378817975194780610137150044899172100222013350131060163915415895780371177927752259787428919179155224171895853616805947412341933984202187456492564434623925319531351033114763949119950728584306583619353693296992898379149419394060857248639688369032655643642166442576079147108699843157337496488352927693282207629472823815374099615455987982598910937171262182830258481123890119682214294576675807186538065064870261338928229949725745303328389638184394477077940228435988341003583854238973542439564755568409522484455413923941000162076936368467764130178196593799715574685419463348937484391297423914336593604100352343777065888677811394986164787471407932638587386247328896456435987746676384794665040741118256583788784548581489629612739984134427260860618724554523606431537101127468097787044640947582803487697589483282412392929605829486191966709189580898332012103184303401284951162035342801441276172858302435598300320420245120728725355811958401491809692533950757784000674655260314461670508276827722235341911026341631571474061238504258459884199076112872580591139356896014316682831763235673254170734208173322304629879928049085140947903688786878949305469557030726190095020764334933591060245450864536289354568629585313153371838682656178622736371697577418302398600659148161640494496501173213138957470620884748023653710311508984279927544268532779743113951435741722197597993596852522857452637962896126915723579866205734083757668738842664059909935050008133754324546359675048442352848747014435454195762584735642161981340734685411176688311865448937769795665172796623267148103386439137518659467300244345005449953997423723287124948347060440634716063258306498297955101095418362350303094530973358344628394763047756450150085075789495489313939448992161255255977014368589435858775263796255970816776438001254365023714127834679261019955852247172201777237004178084194239487254068015560359983905489857235467456423905858502167190313952629445543913166313453089390620467843877850542393905247313620129476918749751910114723152893267725339181466073000890277689631148109022097245207591672970078505807171863810549679731001678708506942070922329080703832634534520380278609905569001341371823683709919495164896007550493412678764367463849020639640197666855923356546391383631857456981471962108410809618846054560390384553437291414465134749407848844237721751543342603066988317683310011331086904219390310801437843341513709243530136776310849135161564226984750743032971674696406665315270353254671126675224605511995818319637637076179919192035795820075956053023462677579439363074630569010801149427141009391369138107258137813578940055995001835425118417213605572752210352680373572652792241737360575112788721819084490061780138897107708229310027976659358387589093956881485602632243937265624727760378908144588378550197028437793624078250527048758164703245812908783952324532378960298416692254896497156069811921865849267704039564812781021799132174163058105545988013004845629976511212415363745150056350701278159267142413421033015661653560247338078430286552572227530499988370153487930080626018096238151613669033411113865385109193673938352293458883225508870645075394739520439680790670868064450969865488016828743437861264538158342807530618454859037982179945996811544197425363443996029025100158882721647450068207041937615845471231834600726293395505482395571372568402322682130124767945226448209102356477527230820810635188991526928891084555711266039650343978962782500161101532351605196559042118449499077899920073294769058685778787209829013529566139788848605097860859570177312981553149516814671769597609942100361835591387778176984587581044662839988060061622984861693533738657877359833616133841338536842119789389001852956919678045544828584837011709672125353387586215823101331038776682721157269495181795897546939926421979155233857662316762754757035469941489290413018638611943919628388705436777432242768091323654494853667680000010652624854730558615989991401707698385483188750142938908995068545307651168033373222651756622075269517914422528081651716677667279303548515420402381746089232839170327542575086765511785939500279338959205766827896776445318404041855401043513483895312013263783692835808271937831265496174599705674507183320650345566440344904536275600112501843356073612227659492783937064784264567633881880756561216896050416113903906396016202215368494109260538768871483798955999911209916464644119185682770045742434340216722764455893301277815868695250694993646101756850601671453543158148010545886056455013320375864548584032402987170934809105562116715468484778039447569798042631809917564228098739987669732376957370158080682290459921236616890259627304306793165311494017647376938735140933618332161428021497633991898354848756252987524238730775595559554651963944018218409984124898262367377146722606163364329640633572810707887581640438148501884114318859882769449011932129682715888413386943468285900666408063140777577257056307294004929403024204984165654797367054855804458657202276378404668233798528271057843197535417950113472736257740802134768260450228515797957976474670228409995616015691089038458245026792659420555039587922981852648007068376504183656209455543461351341525700659748819163413595567196496540321872716026485930490397874895890661272507948282769389535217536218507962977851461884327192232238101587444505286652380225328438913752738458923844225354726530981715784478342158223270206902872323300538621634798850946954720047952311201504329322662827276321779088400878614802214753765781058197022263097174950721272484794781695729614236585957820908307332335603484653187302930266596450137183754288975579714499246540386817992138934692447419850973346267933210726868707680626399193619650440995421676278409146698569257150743157407938053239252394775574415918458215625181921552337096074833292349210345146264374498055961033079941453477845746999921285999993996122816152193148887693880222810830019860165494165426169685867883726095877456761825072759929508931805218729246108676399589161458550583972742098090978172932393010676638682404011130402470073508578287246271349463685318154696904669686939254725194139929146524238577625500474852954768147954670070503479995888676950161249722820403039954632788306959762493615101024365553522306906129493885990157346610237122354789112925476961760050479749280607212680392269110277722610254414922157650450812067717357120271802429681062037765788371669091094180744878140490755178203856539099104775941413215432844062503018027571696508209642734841469572639788425600845312140659358090412711359200419759851362547961606322887361813673732445060792441176399759746193835845749159880976674470930065463424234606342374746660804317012600520559284936959414340814685298150539471789004518357551541252235905906872648786357525419112888773717663748602766063496035367947026923229718683277173932361920077745221262475186983349515101986426988784717193966497690708252174233656627259284406204302141137199227852699846988477023238238400556555178890876613601304770984386116870523105531491625172837327286760072481729876375698163354150746088386636406934704372066886512756882661497307886570156850169186474885416791545965072342877306998537139043002665307839877638503238182155355973235306860430106757608389086270498418885951380910304235957824951439885901131858358406674723702971497850841458530857813391562707603563907639473114554958322669457024941398316343323789759556808568362972538679132750555425244919435891284050452269538121791319145135009938463117740179715122837854601160359554028644059024964669307077690554810288502080858008781157738171917417760173307385547580060560143377432990127286772530431825197579167929699650414607066457125888346979796429316229655201687973000356463045793088403274807718115553309098870255052076804630346086581653948769519600440848206596737947316808641564565053004988161649057883115434548505266006982309315777650037807046612647060214575057932709620478256152471459189652236083966456241051955105223572397395128818164059785914279148165426328920042816091369377737222999833270820829699557377273756676155271139225880552018988762011416800546873655806334716037342917039079863965229613128017826797172898229360702880690877686605932527463784053976918480820410219447197138692560841624511239806201131845412447820501107987607171556831540788654390412108730324020106853419472304766667217498698685470767812051247367924791931508564447753798537997322344561227858432968466475133365736923872014647236794278700425032555899268843495928761240075587569464137056251400117971331662071537154360068764773186755871487839890810742953094106059694431584775397009439883949144323536685392099468796450665339857388878661476294434140104988899316005120767810358861166020296119363968213496075011164983278563531614516845769568710900299976984126326650234771672865737857908574664607722834154031144152941880478254387617707904300015669867767957609099669360755949651527363498118964130433116627747123388174060373174397054067031096767657486953587896700319258662594105105335843846560233917967492678447637084749783336555790073841914731988627135259546251816043422537299628632674968240580602964211463864368642247248872834341704415734824818333016405669596688667695634914163284264149745333499994800026699875888159350735781519588990053951208535103572613736403436753471410483601754648830040784641674521673719048310967671134434948192626811107399482506073949507350316901973185211955263563258433909982249862406703107683184466072912487475403161796994113973877658998685541703188477886759290260700432126661791922352093822787888098863359911608192353555704646349113208591897961327913197564909760001399623444553501434642686046449586247690943470482932941404111465409239883444351591332010773944111840741076849810663472410482393582740194493566516108846312567852977697346843030614624180358529331597345830384554103370109167677637427621021370135485445092630719011473184857492331816720721372793556795284439254815609137281284063330393735624200160456645574145881660521666087387480472433912129558777639069690370788285277538940524607584962315743691711317613478388271941686066257210368513215664780014767523103935786068961112599602818393095487090590738613519145918195102973278755710497290114871718971800469616977700179139196137914171627070189584692143436967629274591099400600849835684252019155937037010110497473394938778859894174330317853487076032219829705797511914405109942358830345463534923498268836240433272674155403016195056806541809394099820206099941402168909007082133072308966211977553066591881411915778362729274615618571037217247100952142369648308641025928874579993223749551912219519034244523075351338068568073544649951272031744871954039761073080602699062580760202927314552520780799141842906388443734996814582733720726639176702011830046481900024130835088465841521489912761065137415394356572113903285749187690944137020905170314877734616528798482353382972601361109845148418238081205409961252745808810994869722161285248974255555160763716750548961730168096138038119143611439921063800508321409876045993093248510251682944672606661381517457125597549535802399831469822036133808284993567055755247129027453977621404931820146580080215665360677655087838043041343105918046068008345911366408348874080057412725867047922583191274157390809143831384564241509408491339180968402511639919368532255573389669537490266209232613188558915808324555719484538756287861288590041060060737465014026278240273469625282171749415823317492396835301361786536737606421667781377399510065895288774276626368418306801908046098498094697636673356622829151323527888061577682781595886691802389403330764419124034120223163685778603572769415417788264352381319050280870185750470463129333537572853866058889045831114507739429352019943219711716422350056440429798920815943071670198574692738486538334361457946341759225738985880016980147574205429958012429581054565108310462972829375841611625325625165724980784920998979906200359365099347215829651741357984910471116607915874369865412223483418877229294463351786538567319625598520260729476740726167671455736498121056777168934849176607717052771876011999081441130586455779105256843048114402619384023224709392498029335507318458903553971330884461741079591625117148648744686112476054286734367090466784686702740918810142497111496578177242793470702166882956108777944050484375284433751088282647719785400065097040330218625561473321177711744133502816088403517814525419643203095760186946490886815452856213469883554445602495566684366029221951248309106053772019802183101032704178386654471812603971906884623708575180800353270471856594994761242481109992886791589690495639476246084240659309486215076903149870206735338483495508363660178487710608098042692471324100094640143736032656451845667924566695510015022983307984960799498824970617236744936122622296179081431141466094123415935930958540791390872083227335495720807571651718765994498569379562387555161757543809178052802946420044721539628074636021132942559160025707356281263873310600589106524570802447493754318414940148211999627645310680066311838237616396631809314446712986155275982014514102756006892975024630401735148919457636078935285550531733141645705049964438909363084387448478396168405184527328840323452024705685164657164771393237755172947951261323982296023945485797545865174587877133181387529598094121742273003522965080891777050682592488223221549380483714547816472139768209633205083056479204820859204754998573203888763916019952409189389455767687497308569559580106595265030362661597506622250840674288982659075106375635699682115109496697445805472886936310203678232501823237084597901115484720876182124778132663304120762165873129708112307581598212486398072124078688781145016558251361789030708608701989758898074566439551574153631931919810705753366337380382721527988493503974800158905194208797113080512339332219034662499171691509485414018710603546037946433790058909577211808044657439628061867178610171567409676620802957665770512912099079443046328929473061595104309022214393718495606340561893425130572682914657832933405246350289291754708725648426003496296116541382300773133272983050016025672401418515204189070115428857992081219844931569990591820118197335001261877280368124819958770702075324063612593134385955425477819611429351635612234966615226147353996740515849986035529533292457523888101362023476246690558164389678630976273655047243486430712184943734853006063876445662721866617012381277156213797461498613287441177145524447089971445228856629424402301847912054784985745216346964489738920624019435183100882834802492490854030778638751659113028739587870981007727182718745290139728366148421428717055317965430765045343246005363614726181809699769334862640774351999286863238350887566835950972655748154319401955768504372480010204137498318722596773871549583997184449072791419658459300839426370208756353982169620553248032122674989114026785285996734052420310917978999057188219493913207534317079800237365909853755202389116434671855829068537118979526262344924833924963424497146568465912489185566295893299090352392333336474352037077010108438800329075983421701855422838616172104176030116459187805393674474720599850235828918336929223373239994804371084196594731626548257480994825099918330069765693671596893644933488647442135008407006608835972350395323401795825570360169369909886711321097988970705172807558551912699306730992507040702455685077867906947661262980822516331363995211709845280926303759224267425755998928927837047444521893632034894155210445972618838003006776179313813991620580627016510244588692476492468919246121253102757313908404700071435613623169923716948481325542009145304103713545329662063921054798243921251725401323149027405858920632175894943454890684639931375709103463327141531622328055229729795380188016285907357295541627886764982741861642187898857410716490691918511628152854867941736389066538857642291583425006736124538491606741373401735727799563410433268835695078149313780073623541800706191802673285511919426760912210359874692411728374931261633950012395992405084543756985079570462226646190001035004901830341535458428337643781119885563187777925372011667185395418359844383052037628194407615941068207169703022851522505731260930468984234331527321313612165828080752126315477306044237747535059522871744026663891488171730864361113890694202790881431194487994171540421034121908470940802540239329429454938786402305129271190975135360009219711054120966831115163287054230284700731206580326264171161659576132723515666625366727189985341998952368848309993027574199164638414270779887088742292770538912271724863220288984251252872178260305009945108247835729056919885554678860794628053712270424665431921452817607414824038278358297193010178883456741678113989547504483393146896307633966572267270433932167454218245570625247972199786685427989779923395790575818906225254735822052364248507834071101449804787266919901864388229323053823185597328697809222535295910173414073348847610055640182423921926950620831838145469839236646136398910121021770959767049083050818547041946643713122996923588953849301363565761861060622287055994233716310212784574464639897381885667462608794820186474876727272220626764653380998019668836809941590757768526398651462533363124505364026105696055131838131742611844201890888531963569869627950367384243130113317533053298020166888174813429886815855778103432317530647849832106297184251843855344276201282345707169885305183261796411785796088881503296022907056144762209150947390359466469162353968092013945781758910889319921122600739281491694816152738427362642980982340632002440244958944561291670495082358124873917996486411334803247577752197089327722623494860150466526814398770516153170266969297049283162855042128981467061953319702695072143782304768752802873541261663917082459251700107141808548006369232594620190022780874098597719218051585321473926532515590354102092846659252999143537918253145452905984158176370589279069098969111643811878094353715213322614436253144901274547726957393934815469163116249288735747188240715039950094467319543161938554852076657388251396391635767231510055560372633948672082078086537349424401157996675073607111593513319591971209489647175530245313647709420946356969822266737752099451684506436238242118535348879893956731878066061078854400055082765703055874485418057788917192078814233511386629296671796434687600770479995378833878703487180218424373421122739402557176908196030920182401884270570460926225641783752652633583242406612533115294234579655695025068100183109004112453790153329661569705223792103257069370510908307894799990049993953221536227484766036136776979785673865846709366795885837887956259464648913766521995882869338018360119323685785585581955560421562508836502033220245137621582046181067051953306530606065010548871672453779428313388716313955969058320834168984760656071183471362181232462272588419902861420872849568796393254642853430753011052857138296437099903569488852851904029560473461311382638788975517885604249987483163828040468486189381895905420398898726506976202019955484126500053944282039301274816381585303964399254702016727593285743666616441109625663373054092195196751483287348089574777752783442210910731113518280460363471981856555729571447476825528578633493428584231187494400032296906977583159038580393535213588600796003420975473922967333106493956018122378128545843176055617338611267347807458506760630482294096530411183066710818930311088717281675195796753471885372293096161432040063813224658411111577583585811350185690478153689381377184728147519983505047812977185990847076219746058874232569958288925350419379582606162118423687685114183160683158679946016520577405294230536017803133572632670547903384012573059123396018801378254219270947673371919872873852480574212489211834708766296672072723256505651293331260595057777275424712416483128329820723617505746738701282095755443059683955556868611883971355220844528526400812520276655576774959696266126045652456840861392382657685833846984997787267065551918544686984694784957346226062942196245570853712727765230989554501930377321666491825781546772920052126671434632096378918523232150189761260343736840671941930377468809992968775824410478781232662531818459604538535438391144967753128642609252115376732588667226040425234910870269580996475958057946639734190640100363619040420331135793365424263035614570090112448008900208014780566037101541223288914657223931450760716706435568274377439657890679726874384730763464516775621030986040927170909512808630902973850445271828927496892121066700816485833955377359191369501531620189088874842107987068991148046692706509407620465027725286507289053285485614331608126930056937854178610969692025388650345771831766868859236814884752764984688219497397297077371871884004143231276365048145311228509900207424092558592529261030210673681543470152523487863516439762358604191941296976904052648323470099111542426012734380220893310966863678986949779940012601642276092608234930411806438291383473546797253992623387915829984864592717340592256207491053085315371829116816372193951887009577881815868504645076993439409874335144316263303172477474868979182092394808331439708406730840795893581089665647758599055637695252326536144247802308268118310377358870892406130313364773710116282146146616794040905186152603600925219472188909181073358719641421444786548995285823439470500798303885388608310357193060027711945580219119428999227223534587075662469261776631788551443502182870266856106650035310502163182060176092179846849368631612937279518730789726373537171502563787335797718081848784588665043358243770041477104149349274384575871071597315594394264125702709651251081155482479394035976811881172824721582501094960966253933953809221955919181885526780621499231727631632183398969380756168559117529984501320671293924041445938623988093812404521914848316462101473891825101090967738690664041589736104764365000680771056567184862814963711188321924456639458144914861655004956769826903089111856879869294705135248160917432430153836847072928989828460222373014526556798986277679680914697983782687643115988321090437156112997665215396354644208691975673700057387649784376862876817924974694384274652563163230055513041742273416464551278127845777724575203865437542828256714128858345444351325620544642410110379554641905811686230596447695870540721419852121067343324107567675758184569906930460475227701670056845439692340417110898889934163505851578873534308155208117720718803791040469830695786854739376564336319797868036718730796939242363214484503547763156702553900654231179201534649779290662415083288583952905426376876689688050333172278001858850697362324038947004718976193473443084374437599250341788079722358591342458131440498477017323616947197657153531977549971627856631190469126091825912498903676541769799036237552865263757337635269693443544004730671988689019681474287677908669796885225016369498567302175231325292653758964151714795595387842784998664563028788319620998304945198743963690706827626574858104391122326187940599415540632701319898957037611053236062986748037791537675115830432084987209202809297526498125691634250005229088726469252846661046653921714820801305022980526378364269597337070539227891535105688839381132497570713310295044303467159894487868471164383280506925077662745001220035262037094660234146489983902525888301486781621967751945831677187627572005054397944124599007711520515461993050983869825428464072555409274031325716326407929341833421470904125425335232480219322770753555467958716383587501815933871742360615511710131235256334858203651461418700492057043720182617331947157008675785393360786227395581857975872587441025420771054753612940474601000940954449596628814869159038990718659805636171376922272907641977551777201042764969496110562205925024202177042696221549587264539892276976603105249808557594716310758701332088614632664125911486338812202844406941694882615295776253250198703598706743804698219420563812558334364219492322759372212890564209430823525440841108645453694049692714940033197828613181861888111184082578659287574263844500599442295685864604810330153889114994869354360302218109434667640000223625505736312946262960961987605642599639461386923308371962659547392346241345977957485246478379807956931986508159776753505539189911513352522987361127791827485420086895396583594219633315028695611920122988898870060799927954111882690230789131076036176347794894320321027733594169086500719328040171638406449878717537567811853213284082165711075495282949749362146082155832056872321855740651610962748743750980922302116099826330339154694946444910045152809250897450748967603240907689836529406579201983152654106581368237919840906457124689484702093577611931399802468134052003947819498662026240089021501661638135383815150377350229660746279529103840686855690701575166241929872444827194293310048548244545807188976330032325258215812803274679620028147624318286221710543528983482082734516801861317195933247110746622285087106661177034653528395776259977446721857158161264111432717943478859908928084866949141390977167369002777585026866465405659503948678411107901161040085727445629384254941675946054871172359464291058509099502149587931121961359083158826206823321561530868337308381732793281969838750870834838804638847844188400318471269745437093732983624028751979208023218787448828728437273780178270080587824107493575148899789117397461293203510814327032514090304874622629423443275712600866425083331876886507564292716055252895449215376517514921963671810494353178583834538652556566406572513635750643532365089367904317025978781771903148679638408288102094614900797151377170990619549696400708676671023300486726314755105372317571143223174114116806228642063889062101923552235467116621374996932693217370431059872250394565749246169782609702533594750209138366737728944386964000281103440260847128990007468077648440887113413525033678773167977093727786821661178653442317322646378476978751443320953400016506921305464768909850502030150448808342618452087305309731894929164253229336124315143065782640702838984098416029503092418971209716016492656134134334222988279099217860426798124572853458013382609958771781131021673402565627440072968340661984806766158050216918337236803990279316064204368120799003162644491461902194582296909921227885539487835383056468648816555622943156731282743908264506116289428035016613366978240517701552196265227254558507386405852998303791803504328767038092521679075712040612375963276856748450791511473134400018325703449209097124358094479004624943134550289006806487042935340374360326258205357901183956490893543451013429696175452495739606214902887289327925206965353863964432253883275224996059869747598823299162635459733244451637553343774929289905811757863555556269374269109471170021654117182197505198317871371060510637955585889055688528879890847509157646390746936198815078146852621332524738376511929901561091897779220087057933964638274906806987691681974923656242260871541761004306089043779766785196618914041449252704808819714988015420577870065215940092897776013307568479669929554336561398477380603943688958876460549838714789684828053847017308711177611596635050399793438693391197898871091565417091330826076474063057114110988393880954814378284745288383680794188843426662220704387228874139478010177213922819119923654055163958934742639538248296090369002883593277458550608013179884071624465639979482757836501955142215513392819782269842786383916797150912624105487257009240700454884856929504481107380879965474815689139353809434745569721289198271770207666136024895814681191336141212587838955773571949863172108443989014239484966592517313881716026632619310653665350414730708044149391693632623737677770958503132559900957627319573086480424677012123270205337426670531424482081681303063973787366424836725398374876909806021827857862165127385635132901489035098832706172589325753639939790557291751600976154590447716922658063151110280384360173747421524760851520990161585823125715907334217365762671423904782795872815050956330928026684589376496497702329736413190609827406335310897924642421345837409011693919642504591288134034988106354008875968200544083643865166178805576089568967275315380819420773325979172784376256611843198910250074918290864751497940031607038455494653859460274524474668123146879434416109933389089926384118474252570445725174593257389895651857165759614812660203107976282541655905060424791140169579003383565748692528007430256234194982864679144763227740055294609039401775363356554719310001754300475047191448998410400158679461792416100164547165513370740739502604427695385538343975505488710997852054011751697475813449260794336895437832211724506873442319898788441285420647428097356258070669831069799352606933921356858813912148073547284632277849080870024677763036055512323866562951788537196730346347012229395816067925091532174890308408865160611190114984434123501246469280288059961342835118847154497712784733617662850621697787177438243625657117794500644777183702219991066950216567576440449979407650379999548450027106659878136038023141268369057831904607927652972776940436130230517870805465115424693952651271010529270703066730244471259739399505146284047674313637399782591845411764133279064606365841529270190302760173394748669603486949765417524293060407270050590395031485229213925755948450788679779252539317651564161971684435243697944473559642606333910551268260615957262170366985064732812667245219890605498802807828814297963366967441248059821921463395657457221022986775997467381260693670691340815594120161159601902377535255563006062479832612498812881929373434768626892192397778339107331065882568137771723283153290825250927330478507249771394483338925520811756084529665905539409655685417060011798572938139982583192936791003918440992865756059935989100029698644609747147184701015312837626311467742091455740418159088000649432378558393085308283054760767995243573916312218860575496738322431956506554608528812019023636447127037486344217272578795034284863129449163184753475314350413920961087960577309872013524840750576371992536504709085825139368634638633680428917671076021111598288755399401200760139470336617937153963061398636554922137415979051190835882900976566473007338793146789131814651093167615758213514248604422924453041131606527009743300884990346754055186406773426035834096086055337473627609356588531097609942383473822220872924644976845605795625167655740884103217313456277358560523582363895320385340248422733716391239732159954408284216666360232965456947035771848734420342277066538373875061692127680157661810954200977083636043611105924091178895403380214265239489296864398089261146354145715351943428507213534530183158756282757338982688985235577992957276452293915674775666760510878876484534936360682780505646228135988858792599409464460417052044700463151379754317371877560398159626475014109066588661621800382669899619655805872086397211769952194667898570117983324406018115756580742841829106151939176300591943144346051540477105700543390001824531177337189558576036071828605063564799790041397618089553636696031621931132502238517916720551806592635180362512145759262383693482226658955769946604919381124866090997981285718234940066155521961122072030922776462009993152442735894887105766238946938894464950939603304543408421024624010487233287500817491798755438793873814398942380117627008371960530943839400637561164585609431295175977139353960743227924892212670458081833137641658182695621058728924477400359470092686626596514220506300785920024882918608397437323538490839643261470005324235406470420894992102504047267810590836440074663800208701266642094571817029467522785400745085523777208905816839184465928294170182882330149715542352359117748186285929676050482038643431087795628929254056389466219482687110428281638939757117577869154301650586029652174595819888786804081103284327398671986213062055598552660364050462821523061545944744899088390819997387474529698107762014871340001225355222466954093152131153379157980269795557105085074738747507580687653764457825244326380461430428892359348529610582693821034980004052484070844035611678171705128133788057056434506161193304244407982603779511985486945591520519600930412710072778493015550388953603382619293437970818743209499141595933963681106275572952780042548630600545238391510689989135788200194117865356821491185282078521301255185184937115034221595422445119002073935396274002081104655302079328672547405436527175958935007163360763216147258154076420530200453401835723382926619153083540951202263291650544261236191970516138393573266937601569144299449437448568097756963031295887191611292946818849363386473927476012269641588489009657170861605981472044674286642087653347998582220906198021732116142304194777549907387385679411898246609130916917722742072333676350326783405863019301932429963972044451792881228544782119535308989101253429755247276357302262813820918074397486714535907786335301608215599113141442050914472935350222308171936635093468658586563148555758624478186201087118897606529698992693281787055764351433820601410773292610634315253371822433852635202177354407152818981376987551575745469397271504884697936195004777209705617939138289898453274262272886471088832701737232588182446584362495805925603381052156062061557132991560848920643403033952622634514542836786982880742514225674518061841495646861116354049718976821542277224794740335715274368194098920501136534001238467142965518673441537416150425632567134302476551252192180357801692403266995417460875924092070046693403965101781348578356944407604702325407555577647284507518268904182939661133101601311190773986324627782190236506603740416067249624901374332172464540974129955705291424382080760983648234659738866913499197840131080155813439791948528304367390124820824448141280954437738983200598649091595053228579145768849625786658859991798675205545580990045564611787552493701245532171701942828846174027366499784755082942280202329012216301023097721515694464279098021908266898688342630716092079140851976952355534886577434252775311972474308730436195113961190800302558783876442060850447306312992778889427291897271698905759252446796601897074829609491906487646937027507738664323919190422542902353189233772931667360869962280325571853089192844038050710300647768478632431910002239297852553723755662136447400967605394398382357646069924652600890906241059042154539279044115295803453345002562441010063595300395988644661695956263518780606885137234627079973272331346939714562855426154676506324656766202792452085813477176085216913409465203076733918411475041401689241213198268815686645614853802875393311602322925556189410429953356400957864953409351152664540244187759493169305604486864208627572011723195264050230997745676478384889734643172159806267876718380052476968840849891850861490034324034767426862459523958903585821350064509981782446360873177543788596776729195261112138591947254514003011805034378752776644027626189410175768726804281766238606804778852428874302591452470739505465251353394595987896197789110418902929438185672050709646062635417329446495766126519534957018600154126239622864138977967333290705673769621564981845068422636903678495559700260798679962610190393312637685569687670292953711625280055431007864087289392257145124811357786276649024251619902774710903359333093049483805978566288447874414698414990671237647895822632949046798120899848571635710878311918486302545016209298058292083348136384054217200561219893536693713367333924644161252231969434712064173754912163570085736943973059797097197266666422674311177621764030686813103518991122713397240368870009968629225464650063852886203938005047782769128356033725482557939129852515068299691077542576474883253414121328006267170940090982235296579579978030182824284902214707481111240186076134151503875698309186527806588966823625239378452726345304204188025084423631903833183845505223679923577529291069250432614469501098610888999146585518818735825281643025209392852580779697376208456374821144339881627100317031513344023095263519295886806908213558536801610002137408511544849126858412686958991741491338205784928006982551957402018181056412972508360703568510553317878408290000415525118657794539633175385320921497205266078312602819611648580986845875251299974040927976831766399146553861089375879522149717317281315179329044311218158710235187407572221001237687219447472093493123241070650806185623725267325407333248757544829675734500193219021991199607979893733836732425761039389853492787774739805080800155447640610535222023254094435677187945654304067358964910176107759483645408234861302547184764851895758366743997915085128580206078205544629917232020282229148869593997299742974711553718589242384938558585954074381048826246487880533042714630119415898963287926783273224561038521970111304665871005000832851773117764897352309266612345888731028835156264460236719966445547276083101187883891511493409393447500730258558147561908813987523578123313422798665035227253671712307568610450045489703600795698276263923441071465848957802414081584052295369374997106655948944592462866199635563506526234053394391421112718106910522900246574236041300936918892558657846684612156795542566054160050712766417660568742742003295771606434486062012398216982717231978268166282499387149954491373020518436690767235774000539326626227603236597517189259018011042903842741855078948874388327030632832799630072006980122443651163940869222207453202446241211558043545420642151215850568961573564143130688834431852808539759277344336553841883403035178229462537020157821573732655231857635540989540332363823192198921711774494694036782961859208034038675758341115188241774391450773663840718804893582568685420116450313576333555094403192367203486510105610498727264721319865434354504091318595131451812764373104389725070049819870521762724940652146199592321423144397765467083517147493679861865527917158240806510637995001842959387991583501715807598837849622573985121298103263793762183224565942366853767991131401080431397323354490908249104991433258432988210339846981417157560108297065830652113470768036806953229719905999044512090872757762253510409023928887794246304832803191327104954785991801969678353214644411892606315266181674431935508170818754770508026540252941092182648582138575266881555841131985600221351588872103656960875150631875330029421186822218937755460272272912905042"
  },
  {
    "path": "Tools/regex-bin/regexPrinter.py",
    "content": "\"\"\"Implements a parser for a subset of the regular expressions grammar\r\n        The parser returns a generator for all the strings recognized\r\n        by a given regular expression.\r\nThe grammar parsed is as follows:\r\nexpr := orexpr EOF\r\norexpr := word (OR word)*\r\nword := quantchar(quantchar)*\r\nquantchar := (char|digit)quant?\r\nchar := CHAR | (LPARENS orexpr RPARENS) | (LCHOOSE orexpr RCHOOSE)\r\ndigit := 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9\r\nquant := PLUS | TIMES | QUESTION | CURLYQUANT\r\nwhere\r\n    LPARENS = (\r\n    RPARENS = )\r\n    LCHOOSE = [\r\n    RCHOOSE = ]\r\n    PLUS = +\r\n    TIMES = *\r\n    QUESTION = ?\r\n    CURLYQUANT = {NUM:NUM}\r\n        and NUM is a non-negative integer\r\n    OR = |\r\n    EOF represents end-of-file\r\n    CHAR is any other character other than the ones with special meaning above\r\nFor each production rule R, a function parse_R has been implemented,\r\n    which receives a stream of tokens and\r\n    returns the subtree generated by parsing such rule\r\n        and the remaining tokens\r\n\"\"\"\r\n\r\nfrom enum import Enum\r\n\r\nclass Token(Enum):\r\n    # enumerator quantifiers\r\n    TIMES = \"*\"\r\n    PLUS = \"+\"\r\n    QUESTION = \"?\"\r\n    LCURLY = \"{\"\r\n    RCURLY = \"}\"\r\n    CURLYQUANT = \"curlyquant\"\r\n    \r\n    LPARENS = \"(\"\r\n    RPARENS = \")\"\r\n    LCHOOSE = \"[\"\r\n    RCHOOSE = \"]\"\r\n    OR = \"|\"\r\n    COLON = \":\"\r\n\r\n    DIGIT = \"digit\"\r\n    CHARACTER = \"character\"\r\n    EOF = \"eof\"\r\n\r\nclass TreeNode(object):\r\n    def __init__(self, token, value, next_node):\r\n        self.token = token\r\n        self.value = value\r\n        self.next_node = next_node\r\n\r\n    def print(self):\r\n        raise NotImplementedError(\"This should be overriden in subclasses\")\r\n\r\nclass LiteralNode(TreeNode):\r\n    def __init__(self, token, value, quantifier, next_node):\r\n        TreeNode.__init__(self, token, value, next_node)\r\n        self.quantifier = quantifier\r\n\r\n    def print(self):\r\n        printer = self.quantifier.get_printer(self.value)\r\n        for value in printer():\r\n            for sub in self.next_node.print():\r\n                yield value+sub\r\n\r\nclass ChooseNode(TreeNode):\r\n    def __init__(self, token, value, quantifier, value_range, next_node):\r\n        TreeNode.__init__(self, token, value, next_node)\r\n        self.quantifier = quantifier\r\n        self.value_range = value_range\r\n    \r\n    def print(self):\r\n        printer = self.quantifier.get_printer(self.value_range)\r\n        for value in printer():\r\n            for sub in self.next_node.print():\r\n                yield value+sub\r\n\r\nclass OrNode(TreeNode):\r\n    def __init__(self, token, value, children, quantifier, next_node):\r\n        TreeNode.__init__(self, token, value, next_node)\r\n        self.children = children\r\n        self.quantifier = quantifier\r\n\r\n    def print(self):\r\n        temp = [c for child in self.children for c in child.print()]\r\n        printer = self.quantifier.get_printer(temp)\r\n        for child_print in printer():\r\n            for sub in self.next_node.print():\r\n                yield child_print+sub\r\n\r\nclass NoQuantifierNode(TreeNode):\r\n    def __init__(self):\r\n        TreeNode.__init__(self, None, None, None)\r\n\r\n    def get_printer(self, values):\r\n        def printer():\r\n            for value in values:\r\n                yield value\r\n        return printer\r\n\r\nclass QuantifierNode(TreeNode):\r\n    def __init__(self, token, value):\r\n        TreeNode.__init__(self, token, value, None)\r\n\r\n    def get_printer(self, values):\r\n        if self.token == Token.QUESTION:\r\n            temp = [\"\"] + [v for v in values]\r\n            ss = sorted(temp)\r\n        elif self.token in (Token.TIMES, Token.PLUS):\r\n            sub_result = [v for v in values]\r\n            temp = sub_result[::]\r\n            sub_result = [v+sub for v in values for sub in sub_result]\r\n            temp += sub_result\r\n            temp += (self.token == Token.TIMES)*[\"\"]\r\n            ss = sorted(temp)\r\n            if isinstance(values, list) or len(values) > 1:\r\n                ss += [\"[...]\"]\r\n            else:\r\n                ss += [values+\"...\"+values]\r\n                \r\n        else:                \r\n            try:\r\n                l, r = self.value\r\n            except:\r\n                raise ValueError(\"Was expecting a curly quantifier\")\r\n            sub_result = [\"\"]\r\n            temp = []\r\n            for i in range(1, r+1):\r\n                sub_result = [v+sub for v in values for sub in sub_result]\r\n                if i >= l:\r\n                    temp += sub_result\r\n            ss = sorted(temp)\r\n        def printer():\r\n            for s in ss:\r\n                yield s\r\n        return printer\r\n\r\nclass EOFNode(TreeNode):\r\n    def __init__(self):\r\n        TreeNode.__init__(self, None, None, None)\r\n\r\n    def print(self):\r\n        yield \"\"\r\n\r\ndef tokenize(s):\r\n    tokens = []\r\n    for char in s:\r\n        for token in Token:\r\n            if char == token.value:\r\n                tokens.append((token, char))\r\n                break\r\n        else:\r\n            if char in \"0123456789\":\r\n                tokens.append((Token.DIGIT, char))\r\n            else:\r\n                tokens.append((Token.CHARACTER, char))\r\n    tokens.append((Token.EOF, \"eof\"))\r\n\r\n    i = 0\r\n    while i < len(tokens):\r\n        if tokens[i][0] == Token.LCURLY:\r\n            l, r, j = 0, 0, i+1\r\n            acc = \"\"\r\n            while j < len(tokens) and tokens[j][0] == Token.DIGIT:\r\n                acc += tokens[j][1]\r\n                tokens = tokens[:j] + tokens[j+1:]\r\n            try:\r\n                l = int(acc)\r\n            except ValueError:\r\n                raise SyntaxError(\"Curly quantifier with no left integer\")\r\n            if j >= len(tokens) or tokens[j][0] != Token.COLON:\r\n                raise SyntaxError(\"Could not tokenize the expression\")\r\n            tokens = tokens[:j] + tokens[j+1:]\r\n            acc = \"\"\r\n            while j < len(tokens) and tokens[j][0] == Token.DIGIT:\r\n                acc += tokens[j][1]\r\n                tokens = tokens[:j] + tokens[j+1:]\r\n            try:\r\n                r = int(acc)\r\n            except ValueError:\r\n                raise SyntaxError(\"Curly quantifier with no right integer\")\r\n            if j >= len(tokens) or tokens[j][0] != Token.RCURLY:\r\n                raise SyntaxError(\"Could not tokenize the expression\")\r\n            tokens = tokens[:j] + tokens[j+1:]\r\n            tokens[i] = (Token.CURLYQUANT, (l,r))\r\n        i += 1\r\n\r\n    return tokens\r\n\r\ndef printRegex(r):\r\n    return parse_expr(tokenize(r))\r\n\r\ndef parse_expr(tokens):\r\n    tree, tokens = parse_orexpr(tokens)\r\n    if tokens[0][0] == Token.EOF:\r\n        tree.next_node = EOFNode()\r\n        return tree\r\n    else:\r\n        raise SyntaxError(\"expected eof!\")\r\n\r\ndef parse_orexpr(tokens):\r\n    temp, tokens = parse_word(tokens)\r\n    topOrNode = OrNode(Token.OR, Token.OR.value, [temp], NoQuantifierNode(), EOFNode())\r\n    ornode = topOrNode\r\n    while tokens[0][0] == Token.OR:\r\n        temp, tokens = parse_word(tokens[1:])\r\n        if temp is not None:\r\n            topOrNode.children.append(temp)\r\n    return topOrNode, tokens\r\n\r\ndef parse_word(tokens):\r\n    topnode, tokens = parse_quantchar(tokens)\r\n    if topnode is None:\r\n        raise SyntaxError(\"Empty word :/\")\r\n    sub = node = topnode\r\n    # while the next token could start a quantified character, grab it\r\n    while tokens[0][0] in (Token.CHARACTER, Token.DIGIT, Token.LPARENS, Token.LCHOOSE):\r\n        sub, tokens = parse_quantchar(tokens)\r\n        node.next_node = sub\r\n        node = sub\r\n    return topnode, tokens\r\n\r\ndef parse_quantchar(tokens):\r\n    if tokens[0][0] == Token.DIGIT:\r\n        node, tokens = parse_digit(tokens)\r\n    else:\r\n        node, tokens = parse_char(tokens)\r\n        if node is None:\r\n            return None, tokens\r\n    quant, tokens = parse_quant(tokens)\r\n    node.quantifier = quant\r\n    return node, tokens\r\n\r\ndef parse_char(tokens):\r\n    if tokens[0][0] == Token.CHARACTER:\r\n        return LiteralNode(tokens[0][0], tokens[0][1], NoQuantifierNode(), EOFNode()), tokens[1:]\r\n    elif tokens[0][0] == Token.LPARENS:\r\n        node, temptokens = parse_orexpr(tokens[1:])\r\n        if temptokens[0][0] == Token.RPARENS:\r\n            return node, temptokens[1:]\r\n        else:\r\n            raise SyntaxError(\"Could not parse parenthesized expression\")\r\n    elif tokens[0][0] == Token.LCHOOSE:\r\n        i = 1\r\n        value_range = \"\"\r\n        while i < len(tokens) and tokens[i][0] != Token.RCHOOSE:\r\n            value_range += tokens[i][1]\r\n            i += 1\r\n        if i >= len(tokens):\r\n            raise SyntaxError(\"Could not close CHOOSE section\")\r\n        else:\r\n            tokens = tokens[i+1:]\r\n        return ChooseNode(Token.LCHOOSE, Token.LCHOOSE.value, NoQuantifierNode(), value_range, EOFNode()), tokens\r\n\r\ndef parse_quant(tokens):\r\n    if tokens[0][0] in (Token.PLUS, Token.TIMES, Token.QUESTION, Token.CURLYQUANT):\r\n        return QuantifierNode(tokens[0][0], tokens[0][1]), tokens[1:]\r\n    else:\r\n        return NoQuantifierNode(), tokens\r\n\r\ndef parse_digit(tokens):\r\n    if tokens[0][0] == Token.DIGIT:\r\n        return LiteralNode(tokens[0][0], tokens[0][1], NoQuantifierNode(), EOFNode()), tokens[1:]\r\n    else:\r\n        return None, tokens\r\n\r\nif __name__ == \"__main__\":\r\n    print(\"regexPrinter: a printer of regular expressions\")\r\n    print(\"\\tjust write a regex to get all its matches printed\")\r\n    print(\"\\tto exit just hit Enter in the prompt\")\r\n    while True:\r\n        s = input(\" >> \")\r\n        if not s:\r\n            break\r\n        i = 1\r\n        for v in printRegex(s).print():\r\n            print(\"{}: {}\".format(i, v))\r\n            i += 1"
  },
  {
    "path": "Topics/ANN.md",
    "content": "### Deep Learning\nTo deal with problems of great complexity, such as the recognition of images or the understanding of human language, mathematical models that approximately known functions are often insufficient (underfitting problem). The expression \"Deep Learning\" was used for the first time when talking about Artificial Neural Networks (ANNs) by Igor Aizenberg and colleagues in 2000, although already in the 1970s prototypes of representation of Artificial Neurons were designed, but they needed computational power to be trained and had major limitations in practical terms. The term Deep learning implies the use of neural networks (we'll soon see what they are) that have various \"levels\" of depth, and are therefore called \"deep\". In the last few years, they are becoming more and more important because they can manage extremely complex tasks, such as the classification of videos (frame by frame), the recognition of objects in a photograph, the understanding of human language in multiple languages. Every system of user customization of large platforms (Amazon, Netflix, Google, LinkedIn...) is Saturday on huge deep neural networks (even tens of millions of parameters) that can handle all the complexity given, for example, by the catalog of Netflix, which contains tens of thousands of titles and tries to figure out which is the most suitable for the user, based on everything he has seen before, what he saw recently, the time of day, or many other factors!\n\n\n### Neural networks\n## Introduction and connections with biology\nWhat is a neural network? A neural network is a component of an ML system (usually the Deep Learning sub-module) that has a large number of parameters (called weights) that are progressively adjusted during the training process, trying to achieve an effective representation of the data they process, so you can generalize well on new cases that will be presented to you. It is called in this way because it emulates the structure of the biological brain, in which neurons exchange electrochemical impulses through the synapses, generating as a whole the representations and thoughts that the outside world stimulates in our mind. For example, if we see the image of a horse, the neurons of sight (a particular type of neurons placed in the part of the cerebral cortex called the visual cortex) are activated and send electrical impulses according to the scheme that, in our memory, is connected to the thought \"I am seeing a horse\". Even if we look away, in the short term we are very clear about the image we have just seen, and this happens thanks to the fact that the neurons and synapses constantly collaborate with memory and previous experiences to provide us with perception as realistic and solid as possible of reality. The patterns according to which neurons work are mostly patterns that we cannot understand, even if we see daily efforts in this direction both by neurobiologists and in various transversal fields. \n\n![Figure 1-1](./neuron.png) \n\nDuring growth, the individual's brain grows and develops its connections thanks to the sensory experiences we live (the concept of neuroplasticity, which allows our body to build neurons and connections throughout life). Every time we have a sensory experience or learn something new (like tying our shoes as children) our brain strengthens a part of the neurons and especially their connections. In a certain sense, wanting to slightly force the biological analogy, it may be useful to imagine all the experiences we have lived up to this moment (visual, tactile, emotional...) as a huge \"training set\" on which our network of neurons in the brain is shaped and changes continuously, trying to represent reality in the most sensible way possible to allow us to make conscious choices that aim at the safety of the individual (and a successful reproduction!).\nFor example, when for the first time as children we interact with fire and we get burned, we could say that by simplifying extremely, this happens at a high level:\n1 Our brain completes the sequence \"I recognize a flame\" -> \"I touch it with my finger\".\n2 The event is \"labeled\" as bad (the pain we feel).\n3 The brain takes these two pieces of information (a datum and its label) as input and tries to understand what sequences of neurons were activated when I recognized a flame.\n4 The brain \"updates\" its structure (building new neurons, synapses and swelling existing ones) to improve and learn not to repeat the action. \nSimplifying as much as possible, it's as if the brain \"chained\" the concept of \"burning\" to the sequence of \"I see a flame\" -> \"I touch it with my skin\".\n5 The next time the brain sees a flame, the series of neurons that the brain had set up to \"learn not to burn\" is activated and by collaborating with the amygdala (where our memory resides) it saves us from the new danger.\n\n\n\n## Single neuron as a classifier\nThe process we have just seen (learning not to touch the fire) contains some key elements that have inspired the design of neural networks used today. We'll see in the next chapters how artificial neural nets take labeled data (we could call them \"facts\") as input, try to understand how each neuron has weighed on a correct or incorrect attempt at classification, and try to \"ambush the shot\", later, modifying them slightly.\nArtificial neurons are made up as follows: they have a central \"body\" (represented by a number), an output activation function that \"decides\" whether that neuron will communicate with the neurons to which it is connected (or will activate itself), and a series of inputs from other neurons that from time to time contribute to the activation or not of the individual neuron. An artificial neuron then takes as input a series of inputs (the outputs of previous neurons), adds these values and combines them with its current value, and if this calculation reaches a certain threshold the neuron is activated, applying its activation function to the calculation just made and propagating it forward towards the neurons \"downstream\" from it. We can imagine that the activation function \"shoots forward\" (feed-forward pass) if the sum of its inputs is greater than 0.5 and that it does not do so otherwise. In this case, we can train the neuron to take the input and classify it in two different cases depending on whether it is active or not (binary classification). \nIn the image: x0 is the input received from another neuron, w0 is the connection between that neuron and the current one.\nF is the activation function of the neuron (there are several used in practice) and is applied on the internal calculation of the neuron if it reaches the chosen activation threshold.\nTo encode the concept of \"activation threshold\" we use a number called bias that acts as an offset to be added to the activation calculation (b in the image).\n\n![Figure 1-1](./Aneuron.png) \n\n## Introduction to neural networks\nIn practice, a single artificial neuron is useless in solving problems, because it is too simple a model. But by structuring many copies of this neuron into hierarchical levels, complex structures can be created that are able, for example, to capture the complexity of an image and classify it. The term neural network refers to a series of neurons connected together in an acyclic graph, organized into layers. The most basic layer is made up of a certain number of neurons that are connected to all the neurons of the next layer (but not to the neurons on the same layer) and is called fully-connected layer. A neural network that has at least one layer in addition to input and output is called a deep neural network, where the hidden layers are the internal ones.\n\n![Figure 1-1](./net1.png) \n\nIn the image, the network has an input layer with 3 neurons, a hidden layer with 4, and an out with 2 (binary classification). In this case the network has, without counting the inputs, [3 x 5]+[5 x 2] + 5 (bias hidden) + 2 (bias output) = 27 modifiable parameters. Modern networks with hundreds of millions of parameters are organized in approximately 15-25 levels. \nAnother name used for multi-layer neural networks is MPL (Multi-Layer Perceptron).\nThis kind of neural network is called a feed-forward neural network because the data is only propagated \"forward\". There are other types of networks (RNN) whose neurons instead see the passage of the same data several times, and implement the concept of \"memory\" of the network. These are widely used in the recognition of human language, where subjects change from sentence to sentence, but often the context remains the same and must be \"remembered\" by the network as new sentences are interpreted. \n\nHopefully you're now familiar with the concept of Artificial Neural Network. In the next high level guides we'll see how to build and train this kind of network to tackle classification problems.\n\nIf you like Virgil's content and share our vision of open education accessible to all, share and register in the Google Form, you'll be updated every time a new guide comes out! \n\n\n------------------\n\nWritten by _clone95_\n\n"
  },
  {
    "path": "Topics/Computer Vision/Introduction_to_Computer_Vision_using_OpenCV_and_Python.ipynb",
    "content": "{\n  \"nbformat\": 4,\n  \"nbformat_minor\": 0,\n  \"metadata\": {\n    \"colab\": {\n      \"name\": \"Introduction to Computer Vision using OpenCV and Python.ipynb\",\n      \"version\": \"0.3.2\",\n      \"provenance\": [],\n      \"collapsed_sections\": []\n    },\n    \"kernelspec\": {\n      \"name\": \"python3\",\n      \"display_name\": \"Python 3\"\n    }\n  },\n  \"cells\": [\n    {\n      \"metadata\": {\n        \"id\": \"OmqAkANMsWql\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"# Introduction to Computer Vision using OpenCV and Python\\n\",\n        \"\\n\",\n        \"---\\n\",\n        \"\\n\",\n        \"![Introduction](https://i.ibb.co/L03Rvcq/introduction.jpg)\\n\",\n        \" \\n\",\n        \"In this guide, we will introduce a brief overview of Deep Learning. Then, we will discuss the purpose of Computer Vision in Python. After that, we' ll be taught the basics of dealing with data using OpenCV libraries by creating and displaying images. The fundamental tasks of Computer Vision such as object recognition and semantic segmentation will be explained. We will also cover the process of feature extraction, edge and face detection and object classification..\\n\",\n        \"\\n\",\n        \"## Prerequisites\\n\",\n        \"Before starting this guide, it is essential to be familiar with the basics of Python programming and Image Processing concepts.\\n\",\n        \"\\n\",\n        \"## Guide map\\n\",\n        \"We will provide a structured content according to the following map:\\n\",\n        \"\\n\",\n        \"1.\\tIntroduction;\\n\",\n        \"2. A brief introduction to Deep Learning;\\n\",\n        \"3.\\tComputer vision tasks;\\n\",\n        \"4.\\tComputer Vision Systems;\\n\",\n        \"5.\\tPython libraries for Computer Vision;\\n\",\n        \"6. OpenCV library on Windows and Ubuntu;\\n\",\n        \"7. Processing images with OpenCV;\\n\",\n        \"8. Use cases for Computer Vision;\\n\",\n        \"9. Conclusion.\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"## 1.\\tIntroduction: \\n\",\n        \"\\n\",\n        \"Computer Vision is a branch of Computer Science, which aims to build up intelligent systems that can understand the content in images as they are perceived by humans. The data may be presented in different modalities such as sequential (video) images from multiple sensors (cameras) or multidimensional data from a biomedical camera, and so on. It is the discipline that integrates the methods of acquiring, processing, analyzing and understanding large-scale images from the real world. It is also about depicting and reconstructing the world that we perceive in images, such as edge, lighting, color and pattern. The recognition of images, by decoding them into meaningful information from image-based data using models created by engineering, physics, statistics and learning theories. It is intended to simulate human vision, including the ability to learn, make decisions and react to actions based on visual information. Computer Vision is one aspect of Artificial Intelligence and Image Processing, which generally aims to simulate intelligent human capabilities. In computer Vision concept, object recognition is one of the fundamental tasks, which depends on how these objects are defined, whether in the form of images or video sequences, and human beings are able to recognize many entities, even if these objects, which are images, vary greatly in size and lighting.\\n\",\n        \"\\n\",\n        \"![Computer Vision](https://i.ibb.co/X5d74Ft/CVV.jpg)\\n\",\n        \"\\n\",\n        \"Some examples of Computer Vision applications:\\n\",\n        \"* Any application that can recognize objects or humans in an image;\\n\",\n        \"*  Automatic control applications (industrial robots, vehicles);\\n\",\n        \"*  Object construction models (industrial inspection, medical image analysis);\\n\",\n        \"*  Applications make it possible to track a moving object.\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"Useful books for learning various aspects of Computer Vision: [Multiple View Geometry in Computer Vision](http://www.robots.ox.ac.uk/~vgg/hzbook/),  [Computer Vision: Algorithms and Applications](http://szeliski.org/Book/)\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"VyNV5akJzJEP\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"## 2.\\tA brief introduction to Deep Learning: \\n\",\n        \"\\n\",\n        \"###2.1. What is Deep Learning?\\n\",\n        \"Deep Learning is an Machine Learning strategy that has greatly enhanced performance in many fields such as Computer Vision, Speech Recognition, Machine Tanslation, and so on.  The use of deep learning techniques, through raw data, allows many challenges to be solved in many economic sectors such as health, transport, finance, etc.\\n\",\n        \"\\n\",\n        \"The favourable conditions that allowed the rise of Deep Learning:\\n\",\n        \"\\n\",\n        \"*   Availability of very large spatio-temporal datasets (Big Data);\\n\",\n        \"*   Availability of high-performance computing (GPU);\\n\",\n        \"*   Flexibility of new training models (Deep Neural Networks).\\n\",\n        \"\\n\",\n        \"###2.2. Deep Learning Frameworks\\n\",\n        \"\\n\",\n        \"In this section, we present the most popular frameworks for Deep Learning.\\n\",\n        \"\\n\",\n        \"| Framework | Features   | Supports languages |  Download     |\\n\",\n        \"|------|------|------|------|\\n\",\n        \"|   Tensorflow  |Highly flexible system architecture|  Python, C++ and R  | [here](https://www.tensorflow.org/)\\n\",\n        \"|   Caffe  |Speed, transposability and applicability in modelling Convolution Neural Networks (CNN)|  C, C++, Python, MATLAB  | [here](http://caffe.berkeleyvision.org/)\\n\",\n        \"|   CNTK  |Easy training and combination of popular model types across servers|  Python, C++ and the Command Line Interface  | [here](https://www.microsoft.com/en-us/cognitive-toolkit/)\\n\",\n        \"|   Torch/PyTorch  | The entire deep modeling process is far more simpler as well as transparent | Lua, Python    | [here](http://torch.ch/) or [here](http://pytorch.org/)\\n\",\n        \"|   Keras  | Provide a simplistic interface for the purpose of quick prototyping by constructing effective neural networks that can work with TensorFlow |Python    | [here](https://keras.io/) \"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"5PEB8FNsuEFX\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"##3.\\tComputer vision tasks:\\n\",\n        \" \\n\",\n        \"In this section, we will successively examine some tasks of Computer Vision, in particular Image Recognition, Semantic Segmentation, Image Retrieval, Image Restoration, Object Recognition, Video Tracking, and so on.\\n\",\n        \"\\n\",\n        \"![CV tasks](https://i.ibb.co/NxVsrHf/cvt.jpg)\\n\",\n        \"\\n\",\n        \"###3.1.\\t Image Recognition\\n\",\n        \"\\n\",\n        \"Traditionally, Computer Vision is about deciding whether or not the image contains an object. This task can be solved simply with little effort by human beings, but a certain activity is still not solved effectively and finely by computer in its general state. The only way to solve this issue is to find the best solutions to match certain features (edges, shapes, etc), and in some cases only, often with specific lighting conditions, a background and a certain position for the camera.\\n\",\n        \"\\n\",\n        \"####Types of recognition:\\n\",\n        \"\\n\",\n        \"**A - Identification:**\\n\",\n        \"Predefined objects are often identified from different viewpoints of the camera in their different locations.\\n\",\n        \"\\n\",\n        \"**B - Selection:**\\n\",\n        \"Define a unique identifier in the shape. For example: identify a person's face or identify the specific type of a person or car.\\n\",\n        \"\\n\",\n        \"**C - Examination:**\\n\",\n        \"Image data is treated for a specific object. For example: check for the presence of diseased cells in medical form, check if a car is present on a highway.\\n\",\n        \"\\n\",\n        \"You will find here some projects and scripts based on Image Recognition task using a Deep Learning paradigm:\\n\",\n        \"\\n\",\n        \"- Fast MPN-COV: [here](https://github.com/jiangtaoxie/fast-MPN-COV);\\n\",\n        \"- Fine-Grained Representation Learning and Recognition by Exploiting Hierarchical Semantic Embedding: [here](https://github.com/HCPLab-SYSU/HSE); \\n\",\n        \"- Fine grained classification: [here](https://github.com/xcnkx/fine_grained_classification).\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"zrHJj09uvaWC\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"###3.2.\\tImage Retrieval:\\n\",\n        \"Images stored in a visual dataset are retrieved based on the content as well as similar concepts of the database query where an image is inserted, and the output is a similar set of images. Content-based visual information retrieval is the implementation of the computer vision system in order to target images, i.e. the problem of retrieving images from large datasets. Image retrieval systems seek to find images similar to a query image among a dataset. The following figure represents the general process of retrieving images from content.\\n\",\n        \"\\n\",\n        \"![Image retrieval](https://i.ibb.co/VTLpZgD/SFS.jpg)\\n\",\n        \"\\n\",\n        \"You will find here some projects and scripts based on Image Retrieval tasks using a Deep Learning paradigm:\\n\",\n        \"\\n\",\n        \"- Deep Local Feature (DeLF): [here](https://github.com/nashory/DeLF-pytorch);\\n\",\n        \"- MILDNet: [here](https://github.com/gofynd/mildnet); \\n\",\n        \"- MultiGrain: [here](https://github.com/facebookresearch/multigrain).\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"Dq13xQrBwOvf\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"###3.3.\\tImage Restoration:\\n\",\n        \"This is the process of restoring degraded images that cannot be recovered. Original images can be restored by prior-knowledge of damage or distortions that cause deterioration of images such as scratches, dust and stains. Restoration also includes images taken by sophisticated cameras that have been distorted due to the weather conditions in which they were taken, such as scanned images.\\n\",\n        \"\\n\",\n        \"You will find here some projects and scripts based on Image Restoration task using a Deep Learning paradigm:\\n\",\n        \"\\n\",\n        \"- Image Super Resolution using in Keras 2+: [here](https://github.com/titu1994/Image-Super-Resolution);\\n\",\n        \"- RED-net: [here](https://github.com/ved27/RED-net);\\n\",\n        \"- Noise2Noise: [here](https://github.com/NVlabs/noise2noise).\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"s6pzqNlKwaMf\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"###3.4.\\tObject Recognition:\\n\",\n        \"It is a branch of Computer Vision dedicated to the detection of a particular object in an image or video. Humans can recognize many objects in images with little effort, although the image may differ slightly from different aspects, such as variations, or even when they are moved or rotated. Although humans can recognize objects when they are partially hidden, this task remains a challenge for computer vision systems. The  object recognition process is given by the following figure:\\n\",\n        \"\\n\",\n        \"![Object recognition](https://www.mathworks.com/content/mathworks/www/en/solutions/deep-learning/object-recognition/jcr:content/mainParsys/band_copy_1227855798_2052140687/mainParsys/columns_1606542234/2/image_copy_copy_copy.adapt.full.low.svg/1541451136966.svg)\\n\",\n        \"\\n\",\n        \"Unlike Machine Learning, the Deep Learning paradigm consists of an end-to-end feature representation learning from raw data without any prior data processing steps.\\n\",\n        \"\\n\",\n        \"You will find here some projects and scripts based on Object Recognition task using a Deep Learning paradigm:\\n\",\n        \"\\n\",\n        \"- TF-slim: [here](https://github.com/tensorflow/models/tree/master/research/slim);\\n\",\n        \"- DenseNet: [here](https://github.com/liuzhuang13/DenseNet);\\n\",\n        \"- DeepBeliefSDK: [here](https://github.com/jetpacapp/DeepBeliefSDK).\\n\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"3utQKUl1wotP\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"###3.5. Semantic Segmentation\\n\",\n        \"Semantic segmentation is a Deep Learning algorithm that assigns a label or category for each pixel in an image. It makes it possible to recognize a set of pixels that are in distinct classes. For example, an autonomous vehicle must be able to recognize vehicles, pedestrians, traffic signs, sidewalks and other environmental components of the road network. Semantic segmentation is involved in a wide range of solutions such as computer-controlled driving, autonomous vehicles, diagnostic imaging, industrial controls, and so on. The splitting of images into two classes is a simple example of semantic segmentation. In fact, it has no restriction in terms of categories. The number of classes can be changed in order to classify image content. For example, the image could be segmented into 4 classes: person, sky, sea and background. The example in the following figure is based on ICCV 2015 paper [Conditional Random Fields as Recurrent Neural Networks](http://www.robots.ox.ac.uk/~szheng/papers/CRFasRNN.pdf), which utilizes deep learning techniques and probabilistic graphical models for semantic image segmentation. \\n\",\n        \"\\n\",\n        \"\\n\",\n        \"![Semantic Segmentation](https://i.ibb.co/gdWgGd4/ss.jpg)\\n\",\n        \"\\n\",\n        \"You will find here some projects and scripts based on Semantic Segmentation task using a Deep Learning paradigm:\\n\",\n        \"\\n\",\n        \"- PSPNet: [here](https://github.com/hszhao/PSPNet);\\n\",\n        \"- TorchSeg: [here](https://github.com/ycszen/TorchSeg);\\n\",\n        \"- Deeplab: [here](https://github.com/tensorflow/models/tree/master/research/deeplab).\\n\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"7G6p8zL4xIKC\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"###3.6.\\tVideo Tracking\\n\",\n        \"It is the process of locating or tracking a moving object (or several moving objects) using static or mobile cameras, while having many uses, such as human-computer interaction, security, three-dimensional reality, medical images and video editing. Tracking can be time-consuming due to video content and the need to use complex algorithms to identify and track objects.\\n\",\n        \"Tracking aims to follow the desired object to be tracked in a sequence of successive images. Tracking is a difficult task when this object moves faster than the capture-rate of these successive images. It is even more difficult when this entity changes direction as it shifts. For this reason, tracking systems apply a motion model that explains how this object's image will change as it moves in different directions. The following figure illustrates the overall scheme of the object tracking process:\\n\",\n        \"\\n\",\n        \"![Object Tracking](https://i.ibb.co/hY5GhdB/track.jpg)\\n\",\n        \"\\n\",\n        \"You will find here some projects and scripts based on Video Tracking task using a Deep Learning paradigm:\\n\",\n        \"\\n\",\n        \"- GOT-10k Python Toolkit: [here](https://github.com/got-10k/toolkit);\\n\",\n        \"- SiamMask: [here](https://github.com/foolwood/SiamMask);\\n\",\n        \"- Deep SORT: [here](https://github.com/guanfuchen/deep_sort);\\n\",\n        \"- Object tracking (tutorial): [here](https://www.pyimagesearch.com/2018/07/30/opencv-object-tracking/).\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"9TF1Sp6PxcTf\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"##4.\\tComputer Vision Systems\\n\",\n        \"Computer vision systems are very diverse and are divided into large and sophisticated systems that perform general and complete tasks as well as small systems that perform specific and simple ones. Most computer vision systems mainly include the following:\\n\",\n        \"\\n\",\n        \"### 4.1.\\tCollecting images\\n\",\n        \"\\n\",\n        \"The image is generated by using one or more image sensors. These include many digital camera sensors, distance sensors, radars, and ultrasonic cameras.  \\n\",\n        \"\\n\",\n        \"###4.2.\\tPre-processing operations\\n\",\n        \"\\n\",\n        \"Before applying the computer vision algorithm in order to extract valuable information, it is necessary to perform prior data operations to ensure that the data are consistent with the algorithm's specific hypotheses. Some examples of these processes include:  \\n\",\n        \"\\n\",\n        \"1. Select the image resolution to confirm that its coordinate system is correct.\\n\",\n        \"2. Reduce the interference to ensure that the sensor does not provide inaccurate information.\\n\",\n        \"3. Increase the variance in order to ensure that the required information will be available.\\n\",\n        \"\\n\",\n        \"###4.3.\\tFeatures extraction\\n\",\n        \"\\n\",\n        \"Visual data features are extracted at different levels of abstraction from data raw. These benchmarks are categorized into:\\n\",\n        \"1. Global features such as color and shape.\\n\",\n        \"2. Local features such as edges and points.\\n\",\n        \"More complex features related to colors and patterns can be obtained.\\n\",\n        \"\\n\",\n        \"###4.4.\\tSegmentation\\n\",\n        \"All zones of the image can be recognized as important locations for subsequent operations. For example: select a set of key points, divide one or more images that contain the region of interest.\\n\",\n        \"3.5.\\tHigh-level processing operations\\n\",\n        \"At this stage, the input data consists of a small set of data, such as a set of points or a portion of the image that is suspected to contain the interest object. The other operations are:\\n\",\n        \"1. Ensure that the collected data are consistent with the hypotheses of the intended application.\\n\",\n        \"2. Evaluate the transaction values assigned to the request, such as steering or shape size.\\n\",\n        \"3. Classify the recognized objects into several classes\\n\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"cktRfUeFx_Xy\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"##5.\\tPython libraries for Computer Vision\\n\",\n        \"The main toolkits for image processing in python are OpenCV, scikit-image and Pillow. The most general Python libraries (Numpy and Scipy) also provide some image processing tools. All these libraries can easily dialog with each other due to the common use of Numpy arrays to store images. A grayscale image is usually stored in a 2-dimensional integer or real value Numpy array with H rows and W columns (W=width,H=height). A color image is stored in a 3-dimensional Numpy array (H, W, 3).\\n\",\n        \"\\n\",\n        \"* OpenCV is a library that is written in C++, which is rich and widely used in computer vision.\\n\",\n        \"* [Pillow](http://pillow.readthedocs.org/en/latest/) is a PIL Fork (Python IMage Library). It is a library that is specific to Python, but is mainly written in C. It allows basic operations to be performed on images including read/write, transformations, histograms, filtering.\\n\",\n        \"* [Scikit-Imag](http://scikit-image.org/)e is a fairly recent and actively developed library. The advantage of this library is that it is written in Python and Cython (Python typed and compiled for acceleration) which makes it easy to read its code.\\n\",\n        \"*\\t[Scipy.ndimage](http://docs.scipy.org/doc/scipy/reference/ndimage.\\n\",\n        \"htm): Scipy's ndimage module provides a number of functions for shaping, interpolation, mathematical morphology and statistics.\\n\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"zIk09vPayrOn\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"##6.\\t\\tOpenCV library on Windows and Ubuntu\\n\",\n        \"Gary Bradsky started OpenCV at Intel in 1999. Compatible with a variety of languages such as C++, Python, etc., OpenCV-Python is an API that allows OpenCV to simultaneously release the power of Python and C++ API. In the case of Python, it is a library of binaries intended to address computer vision challenges. This library is based on NumPy and its array structures. That means we can also integrate it easily into other libraries such as SciPy and Matplotlib.\\n\",\n        \"\\n\",\n        \"As we have explained previously, all operations on images are purely mathematical operations. But we can't say that programmers will do all these operations every time they use images, hence the development of OpenCV library, which includes functions that perform the most necessary operations in the images.\\n\",\n        \"\\n\",\n        \"###Windows:\\n\",\n        \"In order to download the Python program (x,y), click [here](https://python-xy.github.io/downloads.html, it’s possible to download each file individually).  First, download the following [file](https://drive.google.com/file/d/0B0kFf-FN5r9tS1EzSlppUGItNUU/view?usp=sharing) which contains the collection of the OpenCV library. Then, install the python program (x,y) as shown in the figures:\\n\",\n        \"![Windows](https://i.ibb.co/WgLMMHs/122.png)\\n\",\n        \"\\n\",\n        \"###Ubuntu:\\n\",\n        \"There are two ways to install OpenCV on Linux systems. The first one consists in installing pre-compiled files from repositories. For instance, in the case of the Ubuntu platform, it is sufficient to execute the following command:\\n\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"WYwqBYgvzzvg\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"sudo apt-get install libopencv-dev python-opencv\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"koAtONVGz2yX\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"The second method consists in compiling the source files immediately beforehand (this method allows you to obtain the latest version of the library).\\n\",\n        \"\\n\",\n        \"Open the terminal line and proceed as follows:\\n\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"rr05G_iDz6RP\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"sudo apt-get update \\n\",\n        \"sudo apt-get upgrade\\n\",\n        \"sudo apt-get install build-essential cmake git pkg-config\\n\",\n        \"sudo apt-get install libjpeg8-dev libtiff4-dev libjasper-dev libpng12-dev \\n\",\n        \"sudo apt-get install libatlas-base-dev gfortran\\n\",\n        \"# install Pip package \\n\",\n        \"wget https://bootstrap.pypa.io/get-pip.py \\n\",\n        \"sudo python get-pip.py\\n\",\n        \"sudo pip install virtualenv virtualenvwrapper \\n\",\n        \"sudo rm -rf ~/.cache/pip\\n\",\n        \"# virtualenv and virtualenvwrapper \\n\",\n        \"export WORKON_HOME=$HOME/.virtualenvs source /usr/local/bin/virtualenvwrapper.sh\\n\",\n        \"source ~/.bashrc\\n\",\n        \"mkvirtualenv cv\\n\",\n        \"# Install Python2.7 \\n\",\n        \"sudo apt-get install python2.7-dev\\n\",\n        \"# Install Numby libraries\\n\",\n        \"pip install numpy\\n\",\n        \"# Download OpenCV library\\n\",\n        \"\\n\",\n        \"cd ~ \\n\",\n        \"git clone https://github.com/Itseez/opencv.git \\n\",\n        \"cd opencv \\n\",\n        \"git checkout 3.0.0\\n\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"S__70Mvu0JYp\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"After that, try downloading the opencv_contrib package. It will be used to use some features such as SIFT, SURF, which were in the OpenCV 2.4.2 library, and then deleted in OpenCV 3.0.\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"cu2qCiI90KYK\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"cd ~ \\n\",\n        \"git clone https://github.com/Itseez/opencv_contrib.git \\n\",\n        \"cd opencv_contrib\\n\",\n        \"git checkout 3.0.0\\n\",\n        \"cd ~/opencv \\n\",\n        \"mkdir build \\n\",\n        \"cd build\\n\",\n        \"cmake -D CMAKE_BUILD_TYPE=RELEASE \\\\ -D CMAKE_INSTALL_PREFIX=/usr/local \\\\ -D INSTALL_C_EXAMPLES=ON \\\\ -D INSTALL_PYTHON_EXAMPLES=ON \\\\ -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \\\\ -D BUILD_EXAMPLES=ON ..\\n\",\n        \"make\\n\",\n        \"sudo make install\\n\",\n        \"sudo ldconfig\\n\",\n        \"cd ~/.virtualenvs/cv/lib/python2.7/site-packages/ \\n\",\n        \"ln -s /usr/local/lib/python2.7/site-packages/cv2.so cv2.so\\n\",\n        \"\\n\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"0SAAY5fQd0iI\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"##7. Processing images with OpenCV\\n\",\n        \"\\n\",\n        \"Now we have successfully installed OpenCV, let's start by doing it.\\n\",\n        \"\\n\",\n        \"###7.1. Reading images in Python\\n\",\n        \"\\n\",\n        \"To read an image, we have the ` imread ()` function. It should be mentioned that previously, we have moved to the directory that contains the image.\\n\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"Vu3cyESDeIn_\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"img = cv2.imread ('img.jpg')\\n\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"2Z9OfGtkeSzI\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"As an alternative, it is also possible to pass a value for a flag, which is the second argument\\n\",\n        \"\\n\",\n        \"cv2.IMREAD_COLOR: For loading a color image by overlooking existing transparency;\\n\",\n        \"cv2.IMREAD_GRAYSCALE: For loading a grayscale image;\\n\",\n        \"cv2.IMREAD_UNCHANGED: For loading an image that includes an alpha channel\\n\",\n        \"It is possible to use integers 1, 0 or -1:\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"zB8tW_3ceU7o\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"img = cv2. imread ('img.jpg', 0)\\n\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"oUBkmlUUeYCF\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"Note that sending an invalid image path does not result in any errors.\\n\",\n        \"\\n\",\n        \"###7.2. Displaying images in Python\\n\",\n        \"\\n\",\n        \"The `cv2.imshow ()` function enables to display an image in a frame that can be adjusted to its size. The first argument is the name of the frame and the second one is the image.\\n\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"ClkgZCvhehgG\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"\\n\",\n        \"img = cv2. imread ('img.jpg')\\n\",\n        \"cv2.imshow('Images', img)\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"9jG40wsVejLm\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"Note that we have two frames at once as we have not attempted to title them in the same way. `cv2.destroyAllWindows ()` function is another function that destroys all the frames that we have already created. `cv2.destroyWindow ()` also destroys a specific frame.\\n\",\n        \"\\n\",\n        \"###7.3. Creating images in Python\\n\",\n        \"\\n\",\n        \"To do this, there is the ` cv2.imwrite ()`function. The first argument is the file name and the second one is the image to be saved.\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"srTWfL38e6aO\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"cv2.imwrite('img_gray.png', img)\\n\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"kzEjMU7ke681\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"This will store the grayscale image named \\\"img_gray.png\\\" in the current location.\\n\",\n        \"\\n\",\n        \"###7.4. Displaying images using Matplotlib\\n\",\n        \"\\n\",\n        \"By using [Matplotlib](https://matplotlib.org/index.html) library, we can display that image.\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"s7XZT_McfGJH\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"import matplotlib.pyplot as plt\\n\",\n        \"plt.imshow(img, cmap = \\\"gray\\\", interpolation = \\\"bilinear\\\")\\n\",\n        \"plt.xticks([]), pl.ticks ([])\\n\",\n        \"(([], ), ([], ))\\n\",\n        \"plt.display ()\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"EVqyYGe5fHwf\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"\\n\",\n        \"###7.5. Core operations on images\\n\",\n        \"\\n\",\n        \"Let's now look at the basic operations applicable on the image.\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"ia5rzt_cfMJi\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"import cv2\\n\",\n        \"img = cv2.imread ('img.jpg')\\n\",\n        \"y, x = 100,50\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"FmrfgC9AfN9_\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"Reading of color values at positions y, x:\\n\",\n        \"\\n\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"arC6GdqpfP68\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"(b, g, r) = img[y,x]\\n\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"mwa-7_0ufRRF\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"Region of interest at (x, y) whose dimensions are 100x100:\\n\",\n        \"\\n\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"B1YJOQ9YfT7c\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"roi = img[y:y+100,x:x+100] \\n\",\n        \"cv2.imshow ('image', img)\\n\",\n        \"cv2.imshow('ROI', roi)\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"yHVyOsVefVyp\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"Pixelization of the new color :\\n\",\n        \"\\n\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"rxmt6fXnfXcO\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"\\n\",\n        \"roi[:,:]= (55,44,87) \\n\",\n        \"cv2.imshow('New image', img)\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"IOsx9s8Pf0ZE\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"##8. Use cases for Computer Vision\\n\",\n        \"In this section, we will look at some tasks related to computer vision such as *edge detection, face detection, *feature detection and description, object classification performed by OpenCV and Python.\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"###8.1.Edge detection \\n\",\n        \"In OpenCV we can choose only to display the edges of objects with the `Canny ()` function:\\n\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"sI-NcW48f56o\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"import numpy as np\\n\",\n        \"img = cv2.imread('img.jpg')\\n\",\n        \"cv2.imwrite ('edge_img.jpg', cv2.Canny (img, 512, 415))\\n\",\n        \"cv2.imshow ('edges', cv2.imread('edge_img.jpg'))\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"3MwM6bgwf7an\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"###8.2. Face detection\\n\",\n        \"\\n\",\n        \"OpenCV will also enable to detect faces in images. Let's now use Haar's cascading classifier.\\n\",\n        \"\\n\",\n        \"Now, there is one last point that we would really like to address, and that is the face detection. The Haar classifier is used. It is a matter of locating the position of faces in an image in order to standardize the size of the face area.\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"TbvZE86RgGl3\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"import sys, os\\n\",\n        \"import cv2\\n\",\n        \"  \\n\",\n        \"def face_detection(image, image_out, show = False):\\n\",\n        \"    # Load the image in memory\\n\",\n        \"    img = cv2.imread(image)\\n\",\n        \"    # Load the face detection model\\n\",\n        \"    face_model = cv2.CascadeClassifier(\\\"haarcascade_frontalface_alt2.xml\\\")\\n\",\n        \"     \\n\",\n        \"     \\n\",\n        \"    # detection of the face(s)\\n\",\n        \"    faces = face_model.detectMultiScale(img)\\n\",\n        \"     \\n\",\n        \"    # we place a bounding boxe around the faces\\n\",\n        \"    print (\\\"number of faces\\\", len(faces), \\\"image size\\\", img.shape, \\\"image\\\", image)\\n\",\n        \"    for face in faces:\\n\",\n        \"        cv2.rectangle(img, (face[0], face[1]), (face[0] + face[2], face[0] + face[3]), (255, 0, 0), 3)\\n\",\n        \"         \\n\",\n        \"    # we store the final result\\n\",\n        \"    cv2.imwrite(image_out, img)\\n\",\n        \"     \\n\",\n        \"    # to see the image, press ESC to exit\\n\",\n        \"    if show :\\n\",\n        \"        cv2.imshow(\\\"face\\\",img)\\n\",\n        \"        if cv2.waitKey(5000) == 27: cv2.destroyWindow(\\\"face\\\")\\n\",\n        \"   \\n\",\n        \"if __name__ == \\\"__main__\\\":\\n\",\n        \"    # wall lamp \\n\",\n        \"    for file in os.listdir(\\\".\\\"\\\") :\\n\",\n        \"        if file.startswith(\\\"face\\\") : continues # already processed\\n\",\n        \"        if os.path.splitext(file)[-1].lower() in [\\\".jpg\\\",\\\".jpeg\\\",\\\".png\\\" ] :\\n\",\n        \"            face_detect (file, \\\"face_\\\" + file)\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"OZtycY15gLSv\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"As you can see, it drew a blue square (bounding boxe) around the face in the image.\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"wrce4QQ80YBa\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"###8.3.\\tFeature Detection and Description\\n\",\n        \"In this section, we will present a brief description of the SIFT (Scale-Invariant Feature Transform) algorithm. \\n\",\n        \" The main idea of this approach is to transform an image into feature vectors (feature maps), which should ideally be invariant to geometric transformations (rotation and scaling). This involves the detection of interest points, which will make it possible to detect an object. The detection of these points leads to the implementation of feature vectors whose components are specific to the point under consideration.\\n\",\n        \" \\n\",\n        \"\\n\",\n        \"***SIFT in OpenCV and Python:***\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"rNTXBl4B0q6Z\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"import cv2\\n\",\n        \"import numpy as np\\n\",\n        \"\\n\",\n        \"img = cv2.imread('my_img.jpg')\\n\",\n        \"gray= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)\\n\",\n        \"\\n\",\n        \"sift = cv2.SIFT()\\n\",\n        \"kp = sift.detect(gray,None)\\n\",\n        \"\\n\",\n        \"img=cv2.drawKeypoints(gray,kp)\\n\",\n        \"\\n\",\n        \"cv2.imwrite('sift_img.jpg',img)\\n\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"TYWymgUI0tyQ\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"###8.4.\\tObject Classification\\n\",\n        \"To correctly identify an object in an image, it may be interesting to simply detect its edges and shapes when extracting features.\\n\",\n        \"How will we proceed to recognize objects?\\n\",\n        \"These are the 3 steps that we will perform: (1) extracting features in the image, (2) estimating each feature and (3) classifying of edges.\\n\",\n        \"* Let's start by importing and loading an image.\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"\\n\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"P4nlnByg02do\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"import numpy as np \\n\",\n        \"import cv2 \\n\",\n        \"image = cv2.imread('my_image.bmp')\\n\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"i18X_cDl07Aq\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"* Step 1: Edge detection\\n\",\n        \"In order to improve edge detection, we will convert the color image to grayscale before performing a thresholding.\\n\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"W-KDt17J1FYg\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)\\n\",\n        \"ret,thresh = cv2.threshold(gray,250,255,cv2.THRESH_BINARY_INV)\\n\",\n        \"\\n\",\n        \"img,edges,h=cv2.findEdges(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)\\n\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"iIROM1FR1HvM\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"* Step 2: Edge estimation\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"OIYl__da1OmC\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"for cnt in edges:\\n\",\n        \"perimeter =cv2.arcLength(cnt,True)\\n\",\n        \"approx = cv2.approxPolyDP(cnt,0.01* perimeter,True)\\n\",\n        \"\\n\",\n        \"M = cv2.moments(cnt)\\n\",\n        \"cX = int(M[\\\"m10\\\"] / M[\\\"m00\\\"])\\n\",\n        \"cY = int(M[\\\"m01\\\"] / M[\\\"m00\\\"])\\n\",\n        \"cv2.drawEdges(image,[cnt],-1,(0,255,0),2)\\n\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"8snGzFoo1Sec\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"* Step 3 : Pattern classification\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"JxtYXTKq1WkN\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"All you need to do is to recall how many peaks there are in each shape.\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"RVRgjJe11ZLD\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"if len(approx)==3:\\n\",\n        \"shape = \\\"triangle\\\"\\n\",\n        \"elif len(approx)==4:\\n\",\n        \"(x, y, w, h) = cv2.boundingRect(approx)\\n\",\n        \"ratio = w / float(h)\\n\",\n        \"if ratio >= 0.95 and ratio <= 1.05:\\n\",\n        \"shape = \\\" square\\\"\\n\",\n        \"else:\\n\",\n        \"shape = \\\"rectangle\\\"\\n\",\n        \"elif len(approx)==5:\\n\",\n        \"shape = \\\" pentagon\\\"\\n\",\n        \"elif len(approx)==6:\\n\",\n        \"shape = \\\" hexagon \\\"\\n\",\n        \"else:\\n\",\n        \"shape= \\\"circle\\\"\\n\",\n        \"cv2.putText(image, shape, (cX, cY), cv2.FONT_HERSHEY_SIMPLEX,0.5, (255, 255, 255), 2)\\n\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"XwA6Ph0u1ct4\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"We just have to display the result to check out our work:\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"N54tEW351emc\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"cv2.imshow('Final_image',image)\\n\",\n        \"cv2.waitKey(0)\\n\",\n        \"cv2.destroyAllWindows()\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"J1DxqSPp4yF1\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"##9. Conclusion\\n\",\n        \"\\n\",\n        \"In this guide, we discussed the topic of Computer Vision using OpenCV and Python. We presented some fundamental tasks of Computer Vision such as Object Recognition and Semantic Segmentation. We also examined some case studies about the process of edge and face detection, feature extraction and object classification.\"\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "Topics/Computer Vision/Object_Instance_Segmentation_using_TensorFlow_Framework_and_Cloud_GPU_Technology.ipynb",
    "content": "{\n  \"nbformat\": 4,\n  \"nbformat_minor\": 0,\n  \"metadata\": {\n    \"colab\": {\n      \"name\": \"Object Instance Segmentation using TensorFlow Framework and Cloud GPU Technology.ipynb\",\n      \"version\": \"0.3.2\",\n      \"provenance\": [],\n      \"collapsed_sections\": []\n    },\n    \"kernelspec\": {\n      \"name\": \"python3\",\n      \"display_name\": \"Python 3\"\n    }\n  },\n  \"cells\": [\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"s7QFZ6ztHsSC\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"# Object Instance Segmentation using TensorFlow Framework and Cloud GPU Technology\\n\",\n        \"\\n\",\n        \"![](https://i.ibb.co/SPJWCgc/zzed.jpg)\\n\",\n        \"---\\n\",\n        \"In this guide, we will discuss a Computer Vision task: Instance Segmentation. Then, we will present the purpose of this  task  in TensorFlow Framework. Next, we will provide a brief overview of Mask R-CNN network (state-of-the-art model for Instance Segmentation). We also offer a demonstration on Mask R-CNN  model using a jupyter notebook environment: Google Colab \\n\",\n        \"\\n\",\n        \"## What is Instance Segmentation?\\n\",\n        \"\\n\",\n        \"On the one hand, the Semantic Segmentation (SS) task is one of the Computer Vision task which consists in assigning to each pixel a label among a set of semantic categories. \\n\",\n        \"\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"![](https://i.ibb.co/L6TLXFQ/22E2.jpg)\\n\",\n        \"\\n\",\n        \"Ultimately, it is intended to predict a segmentation mask that indicates the category of each pixel. These pixels are classified starting from high-quality feature representations. On the other hand, Instance Segmentation (IS) is based on Semantic Segmentation techniques. It permits to recognize each object instance per pixel for each detected object. These labels are maintained by instance.\\n\",\n        \"\\n\",\n        \"The common applications and use cases that take place using the Semantic / Instance Segmentation task are the following: \\n\",\n        \"- Autonomous navigation;\\n\",\n        \"- Facial Segmentation;\\n\",\n        \"- Categorizing clothing items;\\n\",\n        \"- Precision Agriculture.\\n\",\n        \"- Etc\\n\",\n        \" \\n\",\n        \"For more details, you can look at two use cases related to Semantic Segmentation challenge:\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"**Use case 1: **[Semantic Segmentation for Autonomous vehicles](https://blog.playment.io/semantic-segmentation-for-autonomous-vehicles/)\\n\",\n        \"\\n\",\n        \"**Use case 1: **[Semantic Segmentation for Facial recognition](https://blog.playment.io/improve-facial-recognition-using-semantic-segmentation-landmark-annotation/)\\n\",\n        \"\\n\",\n        \"Examples of Instance Segmentation projects and tutorials:\\n\",\n        \"\\n\",\n        \"- [Instance segmentation with OpenCV](https://www.pyimagesearch.com/2018/11/26/instance-segmentation-with-opencv/)\\n\",\n        \"\\n\",\n        \"- [ Instance Segmentation by Deep Coloring](https://github.com/kulikovv/DeepColoring)\\n\",\n        \"\\n\",\n        \"- [How to do Semantic Segmentation using Deep learning](https://medium.com/nanonets/how-to-do-image-segmentation-using-deep-learning-c673cc5862ef)\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"Useful books for learning various aspects of Instance Segmentation: \\n\",\n        \"1. Practical Convolutional Neural Networks: Implement advanced deep learning models using Python: [Here](https://www.amazon.com/Practical-Convolutional-Neural-Networks-Implement/dp/1788392302)\\n\",\n        \"2. Deep Learning for Computer Vision: [Here](https://)\\n\",\n        \"\\n\",\n        \"## TensorFlow Framework for Deep Learning\\n\",\n        \"\\n\",\n        \"[TensorFlow](https://www.tensorflow.org/) is an integral open source platform for Machine Learning. It has a scalable and exhaustive environment consisting of tools, libraries and community resources that provide researchers and developers the ability to easily develop and deploy applications based on ML technology. The main features of TensorFlow are illustrated in the Figure below:\\n\",\n        \"\\n\",\n        \"![](https://d2h0cx97tjks2p.cloudfront.net/blogs/wp-content/uploads/sites/2/2018/07/Tensorflow-Features.jpg)\"\n      ]\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"O3JYSxvKQ5H_\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"## Prerequisites\\n\",\n        \"Before starting this guide, it is essential to be familiar with the basics of Python programming, Computer Vision concepts, Deep Learning Libraries (TensorFlow + Keras Framework), and OpenCV library.\"\n      ]\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"ExHZadHFRc1A\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"## Guide map\\n\",\n        \"The content of this guide will be organized according to the following map:\\n\",\n        \"\\n\",\n        \"* What is Instance Segmentation?;\\n\",\n        \"* TensorFlow Framework for Deep Learning\\n\",\n        \"* An overview of Mask R-CNN model for Instance Segmentation;\\n\",\n        \"* Using Google Colab with GPU (enabled);\\n\",\n        \"* Mask R-CNN : Demonstration.\\n\",\n        \"* References.\\n\",\n        \" \"\n      ]\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"SMyycVuaRh6_\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"## An overview of Mask R-CNN model for Instance Segmentation\\n\",\n        \"\\n\",\n        \"Thanks to Mask R-CNN, we can automatically segment and construct pixel masks for each object in input image. We will apply Mask R-CNN  to  visual data such as images and videos.\\n\",\n        \"Mask R-CNN algorithm was presented by He et al[1]. In fact, It builds on previous object detection works, by R-CNN (2013)[2], Fast R-CNN (2015)[3] and Faster R-CNN (2015)[4] respectively. Mask R-CNN not only generates the bounding box for a detected object, but also generates a predictive mask.\\n\",\n        \"\\n\",\n        \"Mask R-CNN model is based on Faster R-CNN architecture with 2 major contributions:\\n\",\n        \"\\n\",\n        \"1. Replacement of the ROI Pooling module by a more precise module named *ROI Align*;\\n\",\n        \"2. Inserting an additional branch from the ROI Align module.\\n\",\n        \"\\n\",\n        \"This additional branch takes the output of the ROI Align and then sends it into two  convolution layers (CONV). The output of the convolution layers (CONV) is the predicted mask itself. \\n\",\n        \"In the following figure, we can see the block diagram  of Mask R-CNN:\\n\",\n        \"\\n\",\n        \"![Mask R-CNN](https://www.pyimagesearch.com/wp-content/uploads/2018/11/mask_rcnn_mask_resizing.jpg)\\n\",\n        \"\\n\",\n        \"## Using Google Colab with GPU (enabled)\\n\",\n        \"\\n\",\n        \"Google Colab has been developped to facilitate collaboration between Machine Learning professionals in a more transparent way.\\n\",\n        \"\\n\",\n        \"Sign in to your Google Gmail account in the top right corner, if you haven't already done so. It\\n\",\n        \"will ask you to open it with Colab at the top of the screen. Then you will make a copy so that you can edit it.\\n\",\n        \"\\n\",\n        \"![](https://i.ibb.co/pzH18dw/1.png)\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"It is now possible to click on \\\"*Runtime*\\\" menu button to select the Python version and use GPU/CPU device to speed up the calculation.\\n\",\n        \"\\n\",\n        \"![](https://i.ibb.co/T1JFqCf/2.png)\\n\",\n        \"\\n\",\n        \"Now, everything is ready for the environment.\"\n      ]\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"aRJJXhQmXFNY\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"### Verification  that TensorFlow is able to detect the GPU device:\\n\",\n        \"\\n\",\n        \"Just select \\\"GPU\\\" from the Notebook Settings Accelerator drop-down menu (via Edit menu or  cmd/ctrl-shift-P command).\\n\",\n        \"\\n\",\n        \"Execute this psedo-code to confirm that TensorFlow can detect the GPU:\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"Oh2w3SQBX4dA\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"import tensorflow as tf\\n\",\n        \"device_name = tf.test.gpu_device_name() \\n\",\n        \"if device_name != '/device:GPU:0':\\n\",\n        \"raise SystemError('GPU device is not detected') \\n\",\n        \"print('Detected GPU at: {}'.format(device_name))\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"qtNjNnbTYSWC\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"It's coming out:\\n\",\n        \"\\n\",\n        \"`Found GPU at: /device:GPU:0`\\n\",\n        \"\\n\",\n        \"If you are interested in the type of GPU being used. It's a Nvidia Tesla K80 with 24G of memory. Quite powerful.\\n\",\n        \"\\n\",\n        \"Run this code to find out for yourself.\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"b-_yVJ8HY9Ry\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"from tensorflow.python.client import device_lib \\n\",\n        \"device_lib.list_local_devices()\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"KPRodnl0ZFUP\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"It's coming out:\\n\",\n        \"\\n\",\n        \"`physical_device_desc: \\\"device: 0, name: Tesla K80, pci bus id: 0000:00:04.0, compute capability: 3.7\\\"]`\"\n      ]\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"oFfV3KU1ZKqH\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"## Mask R-CNN : Demonstration\\n\",\n        \"\\n\",\n        \"This section provides an implementation of Mask R-CNN on Keras+TensorFlow Framework. \\n\",\n        \"\\n\",\n        \"###1. Installing dependencies and running the demo \\n\",\n        \"\\n\",\n        \"Mask R-CNN has some dependencies to install before you can run the demo. Colab allows you to install Python packages via the `pip` command, and general Linux packaging/libraries via the ` apt-get` command.\\n\",\n        \"\\n\",\n        \"In case you haven't heard yet. Your current instance of Google Colab runs on an Ubuntu virtual machine. You can execute almost all the Linux commands that you usually do on a Linux machine.\\n\",\n        \"Mask R-CNN depends on [`pycocotools`](https://pypi.org/project/pycocotools/) package, you can install it with the following commands:\\n\",\n        \"\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"6i5_N3Yjb2gI\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"!pip install Cython\\n\",\n        \"!git clone https://github.com/waleedka/coco\\n\",\n        \"!pip install -U setuptools\\n\",\n        \"!pip install -U wheel\\n\",\n        \"!make install -C coco/PythonAPI\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"7Stzjs90b3zr\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"It clones GitHub's repository. Install the compilation dependencies. Finally, compile and install the coco API library. All this happens in the cloud virtual machine quite quickly.\\n\",\n        \"\\n\",\n        \"You are now ready to clone the Mask R-CNN directory of GitHub and access into this directory.\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"6_zLtdwWcp9X\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"!git clone https://github.com/matterport/Mask_RCNNN\\n\",\n        \"# cd to the reference directory and possibility to download the pre-trained weight. \\n\",\n        \"import os\\n\",\n        \"os.chdir('./Mask_RCNN')\\n\",\n        \"!wget https://github.com/matterport/Mask_RCNNN/releases/download/v2.0/mask_rcnn_coco.h5\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"nI1lGdSxdC9f\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"Note that you change directories with the Python script instead of executing a `cd` shell command since you execute Python in the current notebook.\\n\",\n        \"\\n\",\n        \"Now you can run the demo of Mask R-CNN on Colab, as you would on a local machine.\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"Follow the below Python codes in order to familiarize yourself with the use of a pre-trained model for detecting and segmenting objects. All psedo-codes will be commented on.\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"hkyHh46gekfx\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"#import of the necessary packages\\n\",\n        \"import os \\n\",\n        \"import sys \\n\",\n        \"import random \\n\",\n        \"import math\\n\",\n        \"import numpy as np \\n\",\n        \"import skimage.io \\n\",\n        \"import matplotlib\\n\",\n        \"import matplotlib.pyplot as plt \\n\",\n        \"import coco\\n\",\n        \"import utils\\n\",\n        \"import visualize\\n\",\n        \"%matplotlib inline\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"1WofmwQ2etJ3\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"# Root directory of the project \\n\",\n        \"ROOT = os.getcwd()\\n\",\n        \"# Directory to save the trained model and logs files\\n\",\n        \"MODEL= os.path.join(ROOT, \\\"logs\\\")\\n\",\n        \"# Local path to trained weights file\\n\",\n        \"COCO_MODEL = os.path.join(ROOT, \\\"mask_rcnn_coco.h5\\\") \\n\",\n        \"# Download COCO trained weights\\n\",\n        \"if not os.path.exists(COCO_MODEL): utils.download_trained_weights(COCO_MODEL)\\n\",\n        \"# Image directory to be detected\\n\",\n        \"IMAGE = os.path.join(ROOT, \\\"images\\\")\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"pErwlnMNf5Wa\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"###2. Model configurations\\n\",\n        \"\\n\",\n        \"We will use a model trained on the [MS-COCO dataset](http://cocodataset.org/) (It is a large-scale object detection, segmentation, and captioning dataset). The model configurations are in ` CocoConfig class` of coco.py file.\\n\",\n        \"\\n\",\n        \"Make slight changes to the configurations depending on the task. To do this, subclassify the CocoConfig class and replace its attributes that you need to modify.\\n\",\n        \"\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"0iJ4dYkSg5cI\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"class InferenceConfig(coco.CocoConfig):\\n\",\n        \"# Set the batch size to 1 as we will perform the inference on 1 image at a time. Batch size = GPU_NB * IMAGES_PER_GPU \\n\",\n        \"GPU_NB = 1\\n\",\n        \"IMAGES_PER_GPU = 1\\n\",\n        \"config = InferenceConfig() \\n\",\n        \"config.display()\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"_S0AXek0hqmK\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"###3. Building models and importing trained weights\\n\",\n        \"\\n\",\n        \"In order to create models and load trained weights , please type the following psedo-codes:\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"82VyMN90iH0J\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"# Create model \\n\",\n        \"model = modellib.MaskRCNN(mode=\\\"inference\\\", model_dir=MODEL, config=config)\\n\",\n        \"\\n\",\n        \"# Load COCO trained weights\\n\",\n        \"model.load_weights(COCO_MODEL, by_name=True)\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"ZcjpyPT-iYlT\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"###4. Data preparation: MS-COCO dataset\\n\",\n        \"\\n\",\n        \"The model classifies objects and returns class IDs, which are integer values that identify each class. Some datasets assign integer values to their classes and others do not. For example, in the MS-COCO dataset, the \\\"person\\\" class is 1. IDs are often sequential, but not always. The COCO dataset, for example, has classes associated with class IDs of classes 70 and 72, but not 71.\\n\",\n        \"\\n\",\n        \"To get the list of class names, you can load the dataset and then use the `class_names` property like this:\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"kGP3iqPhjBsY\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"# Loading MS-COCO dataset\\n\",\n        \"dataset = coco.CocoDataset() \\n\",\n        \"dataset.load_coco(COCO_DIR, \\\"train\\\")\\n\",\n        \"dataset.prepare()\\n\",\n        \"# Print class names\\n\",\n        \"print(dataset.class_names)\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"VGHQAwAKjRir\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"You have included the list of class names below. The name index of the class in the list represents its ID (first class is 0, second is 1, etc.)\\n\",\n        \"\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"2KqxRF7rjlxE\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"# COCO Class names by indexes\\n\",\n        \"class_names = ['BG','person','bicycle','car','motorcycle','airplane','bus','train','truck','boat','traffic light']\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"TWRH2AiBj-TA\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"###5. Starting object detection process\\n\",\n        \"\\n\",\n        \"To perform object detection, just type the following psedo-codes:\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"Dryw6gJrkPkB\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"# Loading a random image from the dataset\\n\",\n        \"\\n\",\n        \"file_names = next(os.walk(IMAGE))[2]\\n\",\n        \"image = skimage.io.imread(os.path.join(IMAGE, random.choice(file_names)))\\n\",\n        \"# Running object detection\\n\",\n        \"results = model.detect([image], verbose=1)\\n\",\n        \"# Evaluating results \\n\",\n        \"r = results[0]\\n\",\n        \"visualize.display_instances(image, r['kings'], r['masks'], r['class_ids'],\\n\",\n        \"class_names, r['scores'])\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"ubLoZzuvlIKL\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"###6. Customization of images to be segmented\\n\",\n        \"\\n\",\n        \"You can download an image from a third party website such as:\\n\",\n        \"\\n\",\n        \"- [Imgbbbb](https://imgbbb.com/)\\n\",\n        \"- [GitHub](https://github.com)\\n\",\n        \"\\n\",\n        \"You can download your image using `wget` command.\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"isUQbRBblt8K\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"# Loading a random image from the dataset\\n\",\n        \"file_names = next(os.walk(IMAGE_DIR))[2]\\n\",\n        \"image = skimage.io.imread(os.path.join(IMAGE,'my_image.jpg'))\\n\",\n        \"# Running object detection\\n\",\n        \"results = model.detect([image], verbose=1)\\n\",\n        \"# Evaluating results \\n\",\n        \"r = results[0]\\n\",\n        \"visualize.display_instances(image, r['kings'], r['masks'], r['class_ids'],\\n\",\n        \"class_names, r['scores'])\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"bTrSeup9mN8K\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"For example, the result of object detection and segmentation is shown below:\\n\",\n        \"\\n\",\n        \"![](https://cdn-images-1.medium.com/max/1200/1*8eIcVM-M506P4bA0Y7pbag.png)\"\n      ]\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"TvmswGRNmwIz\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"### 7. Video object segmentation\\n\",\n        \"\\n\",\n        \"There are 3  steps to processing a video file.\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"1. Transforming video frames into static images;\\n\",\n        \"2. Image processing;\\n\",\n        \"3. Converting processed images into output videos.\\n\",\n        \"\\n\",\n        \"In our previous demo, we asked the model to process only 1 image at a time, as configured in `IMAGES_PER_GPU` option.\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"LvhNTSXWoMSZ\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"class InferenceConfig(coco.CocoConfig):\\n\",\n        \"#  Set the batch size to 1 as we will perform the inference on 1 image at a time. Batch size = GPU_NB * IMAGES_PER_GPU \\n\",\n        \"IMAGES_PER_GPU = 1\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"nV7e6XeqoU9e\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"If we are going to process all the video at once, it will take a long time. We will therefore use the GPU to operate several frames simultaneously.\\n\",\n        \"The Mask R-CNN pipeline is quite computationally intensive and requires a lot of GPU memory. In Colab, The Tesla K80 GPU with 24G of memory can safely process 3 images at a time. If you go any further, the notebook may crash in the middle of video processing.\\n\",\n        \"Thus, in the psedo-code below, we set the ` batch_size` to 3 and use the `cv2 library` to take 3 images at a time before processing them with the model.\\n\",\n        \"\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"CxeiWbrVpIp6\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"capture = cv2.VideoCapture(os.path.join(VIDEO, 'demo.mp4')) \\n\",\n        \"while True:\\n\",\n        \"ret, frame = capture.read()\\n\",\n        \"# Save each frame of the video to a list\\n\",\n        \"frame_count += 1\\n\",\n        \"frames.append(frame)\\n\",\n        \"if len(frames) == batch_size:\\n\",\n        \"results = model.detect(frames, verbose=0)\\n\",\n        \"for i, item in enumerate(zip(frames, results)): frame = item[0]\\n\",\n        \"r = item[1]\\n\",\n        \"frame = display_instances(\\n\",\n        \"frame, r['kings'], r['masks'], r['class_ids'], class_names, r['scores']\\n\",\n        \")\\n\",\n        \"name = '{0}.jpg'.format(frame_count + i - batch_size) \\n\",\n        \"name = os.path.join(VIDEO_SAVE_DIR, name)\\n\",\n        \"cv2.imwrite(name, frame)\\n\",\n        \"# For starting the next batch \\n\",\n        \"frames = []\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"kLGk-3yMqFeb\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"After running this psedo-code, you should now have all the processed image files in `./videos/save folder.`\\n\",\n        \"The next step is easy, you have to generate the new video from these images. We will use `VideoWriter ()` function from OpenCV (cv2) to do this.\\n\",\n        \"\\n\",\n        \"But there are two things you want to be sure of:\\n\",\n        \"\\n\",\n        \"**1. Images must be indexed in the same way**\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"tZ9NiNaoqq9D\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"# Get all image file paths.\\n\",\n        \"images = list(glob.iglob(os.path.join(VIDEO_SAVE,' *.*'))\\n\",\n        \"# Sort the images by index.\\n\",\n        \"images = sorted(images, key=lambda x: float(os.path.split(x)[1][:-3]))\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"Zveb1kbWrAwK\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"**2. The frame rate corresponds to the original video. You can use the following psedo-code to check it or simply open the file property.**\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"mTz7DryBrQgz\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"video = cv2.VideoCapture(os.path.join(VIDEO_DIR, trailer1.mp4'));\\n\",\n        \"# Get OpenCV version\\n\",\n        \"(major_ver, minor_ver, subminor_ver) = (cv2. version).split('.'')\\n\",\n        \"if int(major_ver) < 3 :\\n\",\n        \"fps = video.get(cv2.cv.CV_CAP_PROP_FPS)\\n\",\n        \"print(\\\"Frames per second: {0}\\\".format(fps)) else :\\n\",\n        \"fps = video.get(cv2.CAP_PROP_FPS)\\n\",\n        \"print(\\\"Frames per second: {0}\\\".format(fps))\\n\",\n        \"video.release();\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"N4cFHtElrroi\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"Finally, you can use this psedo-code to generate video from the processed images.\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"YhHx3vlXr3PD\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"def generate_video(outvid, images=None, fps=30, size=None,is_color=True, format=\\\"FMP4\\\"):\\n\",\n        \"  \\n\",\n        \"  \\\"\\\"\\\"\\n\",\n        \"Create a video from a list of images.\\n\",\n        \"@param outvid output video\\n\",\n        \"@param images list of images to use in the video \\n\",\n        \"@param fps frame per second\\n\",\n        \"@param size size of each frame \\n\",\n        \"@param is_color color\\n\",\n        \"\\n\",\n        \"\\\"\\\"\\\"\\n\",\n        \"from cv2 import VideoWriter, VideoWriter_fourcc, imread, resize \\n\",\n        \"fourcc = VideoWriter_fourcc(*format)\\n\",\n        \"vid = None\\n\",\n        \"for image in images:\\n\",\n        \"if not os.path.path.exists(image):\\n\",\n        \"  raise FileNotFoundError(image)\\n\",\n        \"img = imread(image) \\n\",\n        \"if vid is None:\\n\",\n        \"  if size is None:\\n\",\n        \"size = img.shape[1], img.shape[0]\\n\",\n        \"vid = VideoWriter(outvid, fourcc, float(fps), size, is_color)\\n\",\n        \"  if size[0] != img.shape[1] and size[1] != img.shape[0]:\\n\",\n        \"img = resize(img, size) \\n\",\n        \"vid.write(img)\\n\",\n        \"vid.release() \\n\",\n        \"return vid\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"8YkUTlnnsxAs\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"import glob import os\\n\",\n        \"# Image directory to be detected\\n\",\n        \"ROOT = os.getcwd()\\n\",\n        \"VIDEO = os.path.join(ROOT, \\\"videos\\\")\\n\",\n        \"VIDEO_SAVE = os.path.join(VIDEO, \\\"save\\\")\\n\",\n        \"images = list(glob.iglob(os.path.join(VIDEO_SAVE, '*.*'))) \\n\",\n        \"# Sort the images by index\\n\",\n        \"images = sorted(images, key=lambda x: float(os.path.split(x)[1][:-3]))\\n\",\n        \"outvid = os.path.join(VIDEO, \\\"out_video.mp4\\\") \\n\",\n        \"generate_video(outvid, images, fps=30)\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"bpMhDs4Etea2\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"Once this step is completed, the segmented video should now be ready to be downloaded into your local machine.\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"dTSrXbg-thkT\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"from google.colab import files \\n\",\n        \"files.download('videos/out_video.mp4')\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"UWYja1LGvxt1\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"##List of References:\\n\",\n        \"[1] K. He, G. Gkioxari, P. Dollár, and R. Girshick, \\\"Mask R-CNN\\\", arXiv:1703.06870[cs], March 2017.\\n\",\n        \"\\n\",\n        \"[2] R. Girshick, J. Donahue, T. Darrell, et J. Malik, « Rich feature hierarchies for accurate object detection and semantic segmentation », arXiv:1311.2524 [cs], nov. 2013.\\n\",\n        \"\\n\",\n        \"[3] R. Girshick, \\\"Fast R-CNN\\\", arXiv:1504.08083[cs], Apr. 2015.\\n\",\n        \"\\n\",\n        \"[4] S. Ren, K. He, R. Girshick, et J. Sun, « Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks », arXiv:1506.01497 [cs], juin 2015.\\n\",\n        \"\\n\",\n        \"####Other sources :\\n\",\n        \"TensorFlow, https://www.tensorflow.org/\\n\",\n        \"\\n\",\n        \"Keras, https://keras.io/\"\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "Topics/Computer Vision/Object_Tracking_based_on_Deep_Learning.ipynb",
    "content": "{\n  \"nbformat\": 4,\n  \"nbformat_minor\": 0,\n  \"metadata\": {\n    \"colab\": {\n      \"name\": \"Object Tracking based on Deep Learning.ipynb\",\n      \"provenance\": [],\n      \"collapsed_sections\": [],\n      \"toc_visible\": true\n    },\n    \"kernelspec\": {\n      \"name\": \"python3\",\n      \"display_name\": \"Python 3\"\n    }\n  },\n  \"cells\": [\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"_3CcxHNErMI2\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"# **Object Tracking based on Deep Learning**\\n\",\n        \"![Fig1](https://i.ibb.co/0JXbPjm/Capture.png)\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"## What is Video tracking?\\n\",\n        \"\\n\",\n        \"Target tracking is the process of locating moving targets in a video camera for a very wide range of real-world applications. Real-time target tracking is an important task for many computer vision applications, such as surveillance, perception-based user interfaces, augmented reality, object-based video compression and autonomous driving.\\n\",\n        \"\\n\",\n        \"![Fig2](https://i.ibb.co/KymdPrW/2.png)\\n\",\n        \"\\n\",\n        \"Historically, there are many ways to track video targets: when you track all moving objects, the difference between the images becomes useful; for tracking the moving hand in the video, the average shift method based on skin color is the best solution; Model matching is a good technique for tracking an aspect of an object.\\n\",\n        \"\\n\",\n        \"Since the results of the [ImageNet 2012 challenge](http://www.image-net.org/challenges/LSVRC/2012/), Deep Learning (and in particular, Convolutional Neural Networks (CNNs)) has become the main method for solving this kind of problem. Object tracking studies have therefore naturally integrated recognition models, which has made it possible to create tracking algorithms.\\n\",\n        \"\\n\",\n        \"For more details, you can look at the following projects and tutorials related to the video track challenge:\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"*   [Zero to Hero: A Quick Guide to Object Tracking: MDNET, GOTURN, ROLO\\n\",\n        \"](https://cv-tricks.com/object-tracking/quick-guide-mdnet-goturn-rolo/)\\n\",\n        \"*   [TRACKING THINGS IN OBJECT DETECTION VIDEOS\\n\",\n        \"](https://www.move-lab.com/blog/tracking-things-in-object-detection-videos)\\n\",\n        \"\\n\",\n        \"*   [Multiple Object Tracking Algorithms\\n\",\n        \"](https://medium.com/@manivannan_data/multiple-object-tracking-algorithms-a01973272e52)\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"*   [ImageAI : Video Object Detection, Tracking and Analysis](https://github.com/OlafenwaMoses/ImageAI/blob/master/imageai/Detection/VIDEO.md)\\n\",\n        \"\\n\",\n        \"*   [Tensorflow Object Tracking Video](https://github.com/DrewNF/Tensorflow_Object_Tracking_Video)\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"Practical books that will allow you to learn the different aspects of video tracking:\\n\",\n        \"\\n\",\n        \"1.   [Video Tracking: Theory and Practice 1st Edition](https://www.amazon.com/Video-Tracking-Practice-Emilio-Maggio/dp/0470749644)\\n\",\n        \"2.   [Video object Tracking: Image Processing and Tracking Paperback – July 16, 2011](https://www.amazon.com/Video-object-Tracking-Image-Processing/dp/3844386238)\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"\\n\",\n        \" \\n\",\n        \"\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"EGnFpuSL0IqO\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"## Conventional methods for object detection and tracking\\n\",\n        \"\\n\",\n        \"**1. Basic object detection**\\n\",\n        \"\\n\",\n        \"To make a baseline movement detection, given the difference between the \\\"background\\\" and the other frames, this method is still quite good, but you must first define the background frame, if it is outside, changes in lighting can cause a false detection. Therefore, this method is very limited.\\n\",\n        \"OpenCV offers a class, called BackgroundSubtractor, which is useful for splitting the foreground from the background. There are three background separators in OpenCV3: *K-Nearest (KNN)*,* Gaussian Mixture (MOG2)*, and *Geometric Multigid (GMG)*. The BackgroundSubtractor class used for video analysis, i.e. the BackgroundSubtractor class *learns* the context of each image. The BackgroundSubtractor class is often used to compare different frames as well as to record previous frames, which can be used to improve the results of motion analysis.\\n\",\n        \"![Img3](https://www.researchgate.net/profile/Venkatesh_Saligrama/publication/224396654/figure/download/fig1/AS:393809457369095@1470902899537/Background-subtraction-results-for-synthetic-objects-moving-against-quasi-static.png)\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"**2. Background splitter by MOG2**\\n\",\n        \"\\n\",\n        \"One of the basic features of the BackgroundSubtractor class is that it can compute shadows. This is absolutely essential for accurate playback of video images: by detecting shadows, it is possible to exclude shadow areas from the detected image (in threshold mode) so that real attributes can be focused.\\n\",\n        \"![image.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAmEAAAGLCAYAAACPwkUyAAAgAElEQVR4Ae3dC5acOLYF0PLrGph7ZLZH1u6R5YtbXdclk0DwEUjAzrWyIgKEPltUcixw+ssff/zx8fr2RYAAAQIECBAgcKLA/53YlqYIECBAgAABAgT+FhDCnAoECBAgQIAAgQYCQlgDdE0SIECAAAECBIQw5wABAgQIECBAoIGAENYAXZMECBAgQIAAASHMOUCAAAECBAgQaCAghDVA1yQBAgQIECBAQAhzDhAgQIAAAQIEGggIYQ3QNUmAAAECBAgQEMKcAwQIECBAgACBBgJCWAN0TRIgQIAAAQIEhDDnAAECBAgQIECggYAQ1gBdkwQIECBAgMB1BT4+Pqp0/surljo1VemOSggQIECAAAECzxCwEvaMeTZKAgQIECBAoDMBIayzCdEdAgQIECBA4BkCQtgz5tkoCRAgQIAAgc4EhLDOJkR3CBAgQIAAgWcICGHPmGejJECAAAECBDoTEMI6mxDdIUCAAAECBJ4hIIQ9Y56NkgABAgQIEOhMQAjrbEJ0hwABAgQIEHiGgBD2jHk2SgIECBAgQKAzASGsswnRHQIECBAgQOAZAkLYM+bZKAkQIECAAIHOBISwziZEdwgQIECAAIFnCAhhz5hnoyRAgAABAgQ6ExDCOpsQ3SFAgAABAgSeISCEPWOejZIAAQIECBDoTEAI62xCdIcAAQIECBB4hoAQ9ox5NkoCBAgQIECgMwEhrLMJ0R0CBAgQIEDgGQJC2DPm2SgJECBAgACBzgSEsM4mRHcIECBAgACBZwgIYc+YZ6MkQIAAAQIEOhMQwjqbEN0hQIAAAQIEniEghD1jno2SAAECBAgQ6ExACOtsQnSHAAECBAgQeIaAEPaMeTZKAgQIECBAoDMBIayzCdEdAgQIECBA4BkCQtgz5tkoCRAgQIAAgc4EhLDOJkR3CBAgQIAAgWcICGHPmGejJECAAAECBDoTEMI6mxDdIUCAAAECBJ4hIIQ9Y56NkgABAgQIEOhMQAjrbEJ0hwABAgQIEHiGgBD2jHk2SgIECBAgQKAzASGsswnRHQIECBAgQOAZAkLYM+bZKAkQIECAAIHOBISwziZEdwgQIECAAIFnCAhhz5hnoyRAgAABAgQ6ExDCOpsQ3SFAgAABAgSeISCEPWOejZIAAQIECBDoTEAI62xCdIcAAQIECBB4hoAQ9ox5NkoCBAgQIECgMwEhrLMJ0R0CBAgQIEDgGQJC2DPm2SgJECBAgACBzgSEsM4mRHcIECBAgACBZwgIYc+YZ6MkQIAAAQIEOhMQwjqbEN0hQIAAAQIEniEghD1jno2SAAECBAgQ6ExACOtsQnSHAAECBAgQeIaAEPaMeTZKAgQIECBAoDMBIayzCdEdAgQIECBAYF7g4+NjvsBF9n559fMeI7kIuG4SIECAAAECBELASpjzgAABAgQIECDQQEAIa4CuSQIECBAgQICAEOYcIECAAAECBAg0EBDCGqBrkgABAgQIECAghDkHCBAgQIAAAQINBISwBuiaJECAAAECBAgIYc4BAgQIECBAgEADASGsAbomCRAgQIAAAQJCmHOAAAECBAgQINBAQAhrgK5JAgQIECBAgIAQ5hwgQIAAAQIECDQQEMIaoGuSAAECBAgQICCEOQcIECBAgAABAg0EhLAG6JokQIAAAQIECAhhzgECBAgQIECAQAMBIawBuiYJECBAgAABAkKYc4AAAQIECBAg0EBACGuArkkCBAgQIECAgBDmHCBAgAABAgQINBAQwhqga5IAAQIECBAgIIQ5BwgQIECAAAECDQSEsAbomiRAgAABAgQICGHOAQIECBAgQIBAAwEhrAG6JgkQIECAAAECQphzgAABAgQIECDQQEAIa4CuSQIECBAgQICAEOYcIECAAAECBAg0EBDCGqBrkgABAgQIECAghDkHCBAgQIAAAQINBISwBuiaJECAAAECBAgIYc4BAgQIECBAgEADASGsAbomCRAgQIAAAQJCmHOAAAECBAgQINBAQAhrgK5JAgQIECBAgIAQ5hwgQIAAAQIECDQQEMIaoGuSAAECBAgQICCEOQcIECBAgAABAg0EhLAG6JokQIAAAQIECAhhzgECBAgQIECAwMkC379//0MIOxldcwQIECBAgACBEPgTAwECBAgQIECAwDkCsQKWX0JYSnglQIAAAQIECBwkUIavaOLbt29uRx5krVoCBAgQIECAwF8CYwHsx48fbkc6PwgQIECAAAECRwl8fHx8qjoCWHx5MP8TjQ0ECBAgQIAAgf0CcwEsavdM2H5jNRAgQIAAAQIEfgkMbz/mjlwBi89RRghLGa8ECBAgQIAAgZ0CEa7iofv8KoNXbIv9+eV2ZEp4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)\\n\",\n        \"\\n\",\n        \"**3. Background splitter by KNN**\\n\",\n        \"\\n\",\n        \"The images can be viewed from left to right: detected moving targets, background segmentation, thresholding after background segmentation.\\n\",\n        \"![Fig5](https://www.ccoderun.ca/programming/doxygen/opencv/Background_Subtraction_Tutorial_Scheme.png)\\n\",\n        \"\\n\",\n        \"**4. Kalman object tracking**\\n\",\n        \"\\n\",\n        \"Kalman is a Hungarian mathematician, who developed a filter from his PhD thesis work and the 1960 [paper](https://asmedigitalcollection.asme.org/fluidsengineering/article/82/1/35/397706/A-New-Approach-to-Linear-Filtering-and-Prediction) entitled \\\"A New Approach to Linear Filtering and Prediction Problems\\\".\\n\",\n        \"\\n\",\n        \"Kalman filtering has been applied in many domains, particularly in the navigation guidance of aircraft and missiles.\\n\",\n        \"The Kalman filter works repeatedly on a noisy input data stream (such as a video input in computer vision) and produces a statistically optimal estimate of the state of the underlying system (such as the position in the video).\\n\",\n        \"\\n\",\n        \"The Kalman filter algorithm is divided into two phases:\\n\",\n        \"- Prediction phase: the Kalman filter uses the covariance computed from the current position to estimate the target's new position.\\n\",\n        \"- Update phase: the Kalman filter stores the target position and calculates the corrected covariance for the next iteration.\\n\",\n        \"\\n\",\n        \"![Fig5](https://i.stack.imgur.com/zS2OB.png)\"\n      ]\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"NVNytefY8qCm\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"## Deep Learning based methods for object detection and tracking\\n\",\n        \"\\n\",\n        \"In recent years, Deep Learning methods have been successfully applied in the field of object tracking and are gradually exceeding traditional performance methods. In this section, we will present current target tracking algorithms based on Deep Learning.\\n\",\n        \"\\n\",\n        \"**1. Trends in object tracking**\\n\",\n        \"\\n\",\n        \"Unlike the trend towards of Deep Learning in the visual domain, such as detection and recognition, the application of this paradigm in the object tracking domain is not seamless. The main problem is the lack of learning data: one of the complications of the deep model comes from the effective learning of a large number of labelled learning data, while target tracking only provides the context for selecting the first image as learning data. In this case, it is difficult to train a deep model from scratch at the beginning of the tracking. Currently, the target tracking algorithm based on Deep Learning takes several ideas to solve this problem, including the following and finally the recurrent neural network in the current tracking field to solve the target tracking problem. Where training data for target tracking is very limited, complementary non-supervised training data is used for pre-training to achieve a high-level feature epresentation of object, and in actual tracking, using the limited sample information from the current tracking target. The accuracy of the pre-training model confers a higher classification performance on the model for the current tracking goal, which significantly reduces the need to track target training samples and improves the performance of the tracking algorithm.\\n\",\n        \"\\n\",\n        \"**2. Overall multi-target tracking process**\\n\",\n        \"\\n\",\n        \"In order to track a target, first this target is detected. This step is called *target detection*, then the target in each image is mapped based on the detection result. Today, there are multi-target detectors, such as [SSD](https://arxiv.org/abs/1512.02325) and [YOLO](https://arxiv.org/abs/1506.02640), etc.\\n\",\n        \"\\n\",\n        \"**3. State-of-the-art methods for object tracking**\\n\",\n        \"##### 3.1.GOTURN\\n\",\n        \"\\n\",\n        \"A further great strength of deep learning is the end-to-end learning process. We believe that this opens up a promising future for tracking. Here is an example of the [*GOTURN* method](https://www.learnopencv.com/goturn-deep-learning-based-object-tracking/). GOTURN's current method has been included in OpenCV 3.2.0 development version.\\n\",\n        \"\\n\",\n        \"![Fig6](https://www.learnopencv.com/wp-content/uploads/2018/07/goturn-inputs-ouputs-1024x487.jpg)\\n\",\n        \"GOTURN involves a convolution network based on the input of a pair of images using the ALOV300+ video sequence set and the ImageNet sensing data set, and generates the position change from the previous frame in the detection area to obtain the target's position on the current frame.\\n\",\n        \"\\n\",\n        \"##### 3.2. Specific-target tracking\\n\",\n        \"\\n\",\n        \"In practice, a significant aspect of tracking is the tracking of specific objects, such as face tracking, gesture tracking and human tracking. Tracking a particular object is different from the approach described above and relies more on the training of a particular detector. Due to its obvious features, face tracking is mainly implemented through detection task, such as the state-of-the-art Viola-Jones detection model and the current face detection or face point detection model using Deep learning.\\n\",\n        \"\\n\",\n        \"##### 3.3. Compression tracking\\n\",\n        \"\\n\",\n        \"This approach involves using the compressed detection method to represent feature maps, by achieving dimensional reduction and obtaining small-size cues in order to capture large-size feature space (The block diagram is shown in Figure).\\n\",\n        \"![Fig7](https://img-blog.csdn.net/20170418162336895?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hmc2h1YWlzaQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"xUewec8GXEn1\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"## Use case: Motion Tracker\\n\",\n        \"Here, we will see how to track the motion of moving objects in the video using OpenCV 3.0 and basic techniques (MOG2). Motion tracking is used to track the motion of objects and then transmit the detected information to an application for further processing.\\n\",\n        \"\\n\",\n        \"![Fig7](https://i.ytimg.com/vi/XmI2kE2hUgE/maxresdefault.jpg)\\n\",\n        \"**Basic dependencies:**\\n\",\n        \"\\n\",\n        \"- OpenCV 3.0;\\n\",\n        \"- Numpy lib.\\n\",\n        \"\\n\",\n        \"The tracker implementation is as follows:\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"l8F889KYUHPQ\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"%%writefile points.py\\n\",\n        \"import numpy as np\\n\",\n        \"import numpy.linalg.linalg as la\\n\",\n        \"import matplotlib.pyplot as plt\\n\",\n        \"\\n\",\n        \"fst = lambda x: x[0]\\n\",\n        \"snd = lambda x: x[1]\\n\",\n        \"\\n\",\n        \"distance = lambda p1,p2: la.norm(p1 - p2)\\n\",\n        \"\\n\",\n        \"matchPaths = lambda r, a, paths: [neighborhoodPath(r,paths,ai) for ai in a]\\n\",\n        \"\\n\",\n        \"neighborhoodPath = lambda r, paths, pnt: [path for path in paths if distance(path[0],pnt) < r]\\n\",\n        \"\\n\",\n        \"def itemMatcher(choice, items):\\n\",\n        \"    items = list(sorted(items, key = lambda x: len(x[1])))\\n\",\n        \"    accumulator = []\\n\",\n        \"    for index in range(len(items)):\\n\",\n        \"        (a, bs) = items[index]\\n\",\n        \"        if bs == []:\\n\",\n        \"            accumulator.append((a, None))\\n\",\n        \"        else:\\n\",\n        \"            b = choice(a,bs)\\n\",\n        \"            accumulator.append((a, b))\\n\",\n        \"            for ind in range(len(items)):\\n\",\n        \"                (a2, bs2) = items[ind]\\n\",\n        \"                if any(np.array_equal(b,belement) for belement in bs):\\n\",\n        \"                    bs2 = [belement for belement in bs2 if not np.array_equal(belement, b)]\\n\",\n        \"                items[ind] = (a2, bs2)\\n\",\n        \"    return accumulator\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"def extendPaths(r, paths, scatter, filterWith, noisy = False, discard = True):\\n\",\n        \"    matches = matchPaths(r,scatter,paths)\\n\",\n        \"    zipped = zip(scatter, matches)\\n\",\n        \"    def choice(point, pathOptions): \\n\",\n        \"        return max(pathOptions,key=len)\\n\",\n        \"    def combine(tup):\\n\",\n        \"        (pnt, val) = tup\\n\",\n        \"        if val == None:\\n\",\n        \"            if not noisy:\\n\",\n        \"                return [pnt]\\n\",\n        \"            else:\\n\",\n        \"                return []\\n\",\n        \"        else:\\n\",\n        \"            return [pnt] + val\\n\",\n        \"    lst = itemMatcher(choice, zipped)\\n\",\n        \"    extended_paths = map(snd,lst)\\n\",\n        \"    if discard:\\n\",\n        \"       return filter(lambda x: x != [], map(combine,lst))\\n\",\n        \"    unextended_paths = [p for p in paths if not array_in(p,extended_paths)]  \\n\",\n        \"    unextended_paths = filter(filterWith, unextended_paths)\\n\",\n        \"    return ( unextended_paths, filter(lambda x: x!=[], map(combine, lst)) ) # First element is paths to be archived, second element is the extended paths\\n\",\n        \"   \\n\",\n        \"\\n\",\n        \"def array_in(arr, lst):\\n\",\n        \"    return any(np.array_equal(arr,elem) for elem in lst)\\n\",\n        \"\\n\",\n        \"import pickle\\n\",\n        \"def loaddata(filename):\\n\",\n        \"    return pickle.load(open(filename))\\n\",\n        \"\\n\",\n        \"def stringPaths(r, scatters):\\n\",\n        \"    paths = []\\n\",\n        \"    for sc in scatters:\\n\",\n        \"        paths = extendPaths(r, paths, sc)\\n\",\n        \"    return paths\\n\",\n        \"\\n\",\n        \"def plotit(paths):\\n\",\n        \"    p = [reduce(lambda x,y: np.append(x,y,axis=0),pa) for pa in paths]\\n\",\n        \"    p = map(lambda x: x.T, p)\\n\",\n        \"    plt.hold(True)\\n\",\n        \"    map(lambda x: plt.plot(x[0],x[1],'x'),p)\\n\",\n        \"\\n\",\n        \"def shortcut(r, filename):\\n\",\n        \"    plotit(stringPaths(r, loaddata(filename)))\\n\",\n        \"def rawpoints(filename):\\n\",\n        \"    scatters = loaddata(filename)\\n\",\n        \"    plotit(scatters)\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"b8Vhzbz1R6Or\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"from __future__ import division\\n\",\n        \"import numpy as np\\n\",\n        \"import cv2\\n\",\n        \"import scipy\\n\",\n        \"import pickle\\n\",\n        \"import points\\n\",\n        \"\\n\",\n        \"from sys import argv\\n\",\n        \"\\n\",\n        \"OBJ = True\\n\",\n        \"### THE SETTING PARAMETERS FOR VIDEO.MP4\\n\",\n        \"if OBJ:\\n\",\n        \"    KERN_SIZE = 8\\n\",\n        \"    RADIUS = 20\\n\",\n        \"    THRESHOLD_AT = 100\\n\",\n        \"    INPUT_SIZE_THRESHOLD = 75\\n\",\n        \"    MIN_PATH_SIZE = 10\\n\",\n        \"    MIN_PATH_STD = 3*RADIUS\\n\",\n        \"    WRITE_TO_FILE = True\\n\",\n        \"###END PARAMETERS\\n\",\n        \"else:\\n\",\n        \"    KERN_SIZE = 8\\n\",\n        \"    RADIUS = 5\\n\",\n        \"    THRESHOLD_AT = 127\\n\",\n        \"    INPUT_SIZE_THRESHOLD = 150\\n\",\n        \"    MIN_PATH_SIZE = 10\\n\",\n        \"    MINI_PATH_STD = 3*RADIUS\\n\",\n        \"    WRITE_TO_FILE = True\\n\",\n        \"\\n\",\n        \"video_output = \\\"output_tracking.avi\\\"\\n\",\n        \"\\n\",\n        \"def avgit(y):\\n\",\n        \"    return x.sum(axis=0)/np.shape(y)[0]\\n\",\n        \"def plotp(p,mat,color=0):\\n\",\n        \"    mat[p[0,1],p[0,0]] = color\\n\",\n        \"\\n\",\n        \"if len(argv) != 3:\\n\",\n        \"    cap = cv2.VideoCapture('vid1.mp4')\\n\",\n        \"else:\\n\",\n        \"    cap = cv2.VideoCapture(argv[1])\\n\",\n        \"    video_outputfile = argv[2]\\n\",\n        \"fourcc = cv2.VideoWriter_fourcc(*'XVID')\\n\",\n        \"ret, frame = cap.read()\\n\",\n        \"height, width, layers = frame.shape\\n\",\n        \"video_out = cv2.VideoWriter(video_outputfile, fourcc, 30, (width, height), True)\\n\",\n        \"print video_out.isOpened()\\n\",\n        \"\\n\",\n        \"fgbg = cv2.createBackgroundSubtractorMOG2()\\n\",\n        \"bwsub= cv2.createBackgroundSubtractorMOG2()\\n\",\n        \"\\n\",\n        \"kernlen = KERN_SIZE\\n\",\n        \"kern = np.ones((kernlen,kernlen))/(kernlen**2)\\n\",\n        \"ddepth = -1\\n\",\n        \"def blur(image):\\n\",\n        \"    return cv2.filter2D(image,ddepth,kern)\\n\",\n        \"def blr_thr(image, val=127):\\n\",\n        \"    return cv2.threshold(blur(image),val,255,cv2.THRESH_BINARY)[1]\\n\",\n        \"def normalize(image):\\n\",\n        \"    s = np.sum(image)\\n\",\n        \"    if s == 0:\\n\",\n        \"       return image\\n\",\n        \"    return height*width* image / s\\n\",\n        \"#collection = []\\n\",\n        \"paths = []\\n\",\n        \"archive = []\\n\",\n        \"\\n\",\n        \"r = RADIUS\\n\",\n        \"thresh_at = THRESHOLD_AT\\n\",\n        \"THIS_MUCH_IS_NOISE = INPUT_SIZE_THRESHOLD\\n\",\n        \"\\n\",\n        \"while(cap.isOpened()):\\n\",\n        \"    ret, frame = cap.read()\\n\",\n        \"    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)\\n\",\n        \"    fgmask = fgbg.apply(frame)\\n\",\n        \"    mask = blur(fgmask)\\n\",\n        \"    ret2, mask = cv2.threshold(mask, thresh_at, 255, cv2.THRESH_BINARY)\\n\",\n        \"    \\n\",\n        \"    res = cv2.findContours(mask, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)\\n\",\n        \"    cons = res[1]\\n\",\n        \"    scatter = map(avgit, cons)\\n\",\n        \"    filterWith = lambda x: len(x) > MIN_PATH_SIZE and np.std(x) > MINIMUM_PATH_STD\\n\",\n        \"    (toArchive, paths) = points.extendPaths(r, paths, scatter, filterWith, noisy=(len(scatter) > THIS_MUCH_IS_NOISE), discard=False)\\n\",\n        \"    archive += toArchive\\n\",\n        \"    img = (1 - mask)*gray\\n\",\n        \"    for path in archive:\\n\",\n        \"        #color = 255\\n\",\n        \"        cv2.polylines(img, np.int32([reduce(lambda x,y: np.append(x,y,axis=0), path)]), 0, (255,0,0))\\n\",\n        \"    for path in paths:\\n\",\n        \"        cv2.polylines(img, np.int32([reduce(lambda x,y: np.append(x,y,axis=0), path)]), 1, (0,0,255))\\n\",\n        \"    cv2.imshow('frame', img)\\n\",\n        \"    video_out.write(img)\\n\",\n        \"    if cv2.waitKey(1) & 0xFF == ord('q'):\\n\",\n        \"        break\\n\",\n        \"cap.release()\\n\",\n        \"video_out.release()\\n\",\n        \"cv2.destroyAllWindows()\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"if WRITE_TO_FILE:\\n\",\n        \"    pickle.dump(archive, open('my_path' + str(np.floor(1000*np.random.rand())) + '.pickle','w'))\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    }\n  ]\n}\n"
  },
  {
    "path": "Topics/Computer Vision/Object_detection_based_on_Deep_Learning.ipynb",
    "content": "{\n  \"nbformat\": 4,\n  \"nbformat_minor\": 0,\n  \"metadata\": {\n    \"colab\": {\n      \"name\": \"Object detection based on  Deep Learning.ipynb\",\n      \"provenance\": [],\n      \"toc_visible\": true\n    },\n    \"kernelspec\": {\n      \"name\": \"python3\",\n      \"display_name\": \"Python 3\"\n    }\n  },\n  \"cells\": [\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"OaEGVW0XCzhL\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"#**Object Detection based on Deep Learning**\\n\",\n        \"\\n\",\n        \"![DL](https://i.ibb.co/GVbs5bV/fig.png)\\n\",\n        \"\\n\",\n        \"##What is object detection?\\n\",\n        \"In recent years, object detection in images has been greatly improved through numerous implementations of the Deep Learning paradigm. Creating trainable models helps to rapidly detect and classify discriminating features without having to develop a sophisticated algorithm. In fact, detecting objects and locating them in an image is an increasingly vital aspect of computer vision research. This discipline seeks out instances, their class labels and their positions in the visual data. This domain stands at the overlap of two other fields: image classification and object localization. Indeed, object detection is based on the following principle: for a specific image, we look for regions of the image that might contain an object and then, for each of these detected regions, we extract and classify it using an image classification model. Those regions of the initial image showing good classification results are maintained and the remainder is discarded. Thus, for a good object detection method, it is necessary to have a robust region detection algorithm as well as a good image classification model.\\n\",\n        \"\\n\",\n        \"The following projects and tutorials related to the video detection task are provided for further details:\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"*    [Object detection project for real-time (webcam) and offline (video processing) application.](https://github.com/lbeaucourt/Object-detection)\\n\",\n        \"\\n\",\n        \"*   [Object-detection: Single Shot MultiBox Detector(SSD) in TensorFlow.](https://github.com/hjptriplebee/SSD_tensorflow)\\n\",\n        \"\\n\",\n        \"* [Darknet](https://github.com/rlan/darknet)\\n\",\n        \"\\n\",\n        \"* [PyTorch implementation of RetinaNet with the goal to reproduce results in the \\\"focal loss for dense object detection\\\" paper.](https://github.com/cedrickchee/pytorch-RetinaNet)\\n\",\n        \"\\n\",\n        \"* [Robosapien object detector using Darkflow](https://github.com/ogbanugot/Robosapien-Object-Detector-using-Darkflow)\\n\",\n        \"\\n\",\n        \"* [Object Detection Application](https://github.com/siddartha19/Object-Detection-Application)\\n\",\n        \"* [Understanding Object Detection](https://towardsdatascience.com/understanding-object-detection-9ba089154df8)\\n\",\n        \"\\n\",\n        \"The following are some useful books that will help you learn the different aspects of object detection:\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"1.   [Advanced Applied Deep Learning](https://aax-us-east.amazon-adsystem.com/x/c/Qja79-QaoJHEO-MVQ1oDZwsAAAFwtKQVSwEAAAFKAQDMYqQ/https://assoc-redirect.amazon.com/g/r/https://www.amazon.com/Advanced-Applied-Deep-Learning-Convolutional/dp/1484249755?creativeASIN=1484249755&linkCode=w61&imprToken=bnWxJoN9ehtfoAkba-1ChA&slotNum=3&tag=uuid10-20)\\n\",\n        \"2.   [Object Detection in Low-spatial-resolution Aerial Imagery Using Convolutional Neural Networks](https://aax-us-east.amazon-adsystem.com/x/c/Qja79-QaoJHEO-MVQ1oDZwsAAAFwtKQVSwEAAAFKAQDMYqQ/https://assoc-redirect.amazon.com/g/r/https://www.amazon.com/Detection-Low-spatial-resolution-Imagery-Convolutional-Networks/dp/1688093427?creativeASIN=1688093427&linkCode=w61&imprToken=bnWxJoN9ehtfoAkba-1ChA&slotNum=9&tag=uuid10-20)\\n\",\n        \"3. [Hierarchical approach for object detection using shape descriptors](https://aax-us-east.amazon-adsystem.com/x/c/Qja79-QaoJHEO-MVQ1oDZwsAAAFwtKQVSwEAAAFKAQDMYqQ/https://assoc-redirect.amazon.com/g/r/https://www.amazon.com/Hierarchical-approach-object-detection-descriptors/dp/3330353066?creativeASIN=3330353066&linkCode=w61&imprToken=bnWxJoN9ehtfoAkba-1ChA&slotNum=15&tag=uuid10-20)\\n\",\n        \"4. [Application of Deep Learning in Object Detection\\n\",\n        \"Application of Deep Learning in Object Detection using Tensorflow](https://aax-us-east.amazon-adsystem.com/x/c/Qja79-QaoJHEO-MVQ1oDZwsAAAFwtKQVSwEAAAFKAQDMYqQ/https://assoc-redirect.amazon.com/g/r/https://www.amazon.com/Application-Deep-Learning-Object-Detection/dp/613945705X?creativeASIN=613945705X&linkCode=w61&imprToken=bnWxJoN9ehtfoAkba-1ChA&slotNum=21&tag=uuid10-20)\\n\",\n        \"\\n\",\n        \"###**Object localization v.s. object classification**\\n\",\n        \"Object detection consists of identifying and locating one or several objects in the image. Depending on a given input, a detector will return information of two dimensions: the class labels and location of each instance. Locating an object in an image is complex and measuring the localization performance needs an adapted metric. Moreover, unlike classification, several targets can be located in the same image and the detector must be able to accurately locate them. For a single input, an object detector returns the detected objects in the image and their associated bounding boxes. Some strategies are available to address this challenge. The first one(see Figure 1), based on object recognition approaches, essentially consists of simply predicting the size of a bounding box and the class to which it belongs. The second approach (see Figure 2), probably the best known, is the proposed region approach where another model extracts a reduced number of candidate frames (i.e. proposals) that contain an object and the problem is then simplified into a recognition problem.\\n\",\n        \"\\n\",\n        \"**Figure 1:** Object detection based on a single-stage method ![Fig1](https://i.ibb.co/fCjNBpw/1.png)\\n\",\n        \"\\n\",\n        \"**Figure 2:** Object detection based on a two-stages method (region proposals) ![Fig2](https://i.ibb.co/1MkgbS4/2.png)\\n\",\n        \"\\n\",\n        \"###**Contour-based object detection**\\n\",\n        \"\\n\",\n        \"cIn this section, we will discuss different methods of contour detection and compare them with each other.\\n\",\n        \"\\n\",\n        \"**1. SOBEL detector**\\n\",\n        \"\\n\",\n        \"The Sobel detector is one of the methods we're looking at right now. Like most detectors, this one is based on calculating the gradients of the image at each point. Sobel's discrete method is based on multiplying the intensity matrix around the desired pixel by the following matrices, representing the \\\" mixture \\\" between filters derived according to x and y, and Gaussian filters that add importance to the nearest pixels.\\n\",\n        \"\\n\",\n        \"![Sobel](https://i.ibb.co/6cQx0b0/3.png)\\n\",\n        \"\\n\",\n        \"**2. LAPLACIAN detector**\\n\",\n        \"\\n\",\n        \"An alternative method that has been explored is the use of the Laplacian. The principle is quite similar and is based on the second derivative of the intensity. Discretely, the Laplacian matrix is implemented by the product of the intensity matrices of the pixel contour with the following matrices :\\n\",\n        \"\\n\",\n        \"[0 1 0]\\n\",\n        \"\\n\",\n        \"[1 -4 1]\\n\",\n        \"\\n\",\n        \"[0 1 0]\\n\",\n        \"\\n\",\n        \"![Lap](https://i.ibb.co/M7L0nbr/4.png)\\n\",\n        \"\\n\",\n        \"**3. CANNY detector**\\n\",\n        \"\\n\",\n        \"The Canny method uses a Gaussian filter and then derivation matrices along both axes to determine the magnitude and angle of the gradient. Finally, a hysteresis is applied to smooth out the most important edges.\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"![Canny](https://i.ibb.co/3C8xHxX/5.png)\\n\",\n        \"\\n\",\n        \"**4. PREWITT detector**\\n\",\n        \"\\n\",\n        \"This detector is pretty close to Sobel's. Concretely, it operates on the principle of gradient detection along the two major axes, in combination with an averaging filter.  \\n\",\n        \"\\n\",\n        \"\\n\",\n        \"![prewitt](https://i.ibb.co/XZLpZCk/6.png)\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"###**Conventional methods for object detection: A use case**\\n\",\n        \"\\n\",\n        \"The objective of this use case is to develop and program algorithms to detect faces in images. To do this, one approach using [Viola-Jones' algorithm](https://www.cs.cmu.edu/~efros/courses/LBMV07/Papers/viola-cvpr-01.pdf) will be tested.\\n\",\n        \"The Viola-Jones technique (Haar Cascade Face Detector) is a method of detecting objects in images proposed by Paul Viola and Michael Jones in 2001 and widely used for face detection. This method detects objects by learning a classifier.\\n\",\n        \"\\n\",\n        \"The implementation of this detector is as follows:\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"MQGRq7uGmv-F\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"class HaarCascadeFaceDetector(AbstractSkinDetector):\\n\",\n        \"    \\\"\\\"\\\"\\n\",\n        \"    Face detector with the Viola Jones method\\n\",\n        \"    \\\"\\\"\\\"\\n\",\n        \"    METHOD_NAME = \\\"viola_jones\\\"\\n\",\n        \"\\n\",\n        \"    def process(self):\\n\",\n        \"        # greyscale image for haar cascades\\n\",\n        \"        self.original = self.original.switch_color_space(\\\"GRAY\\\")\\n\",\n        \"        cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')\\n\",\n        \"\\n\",\n        \"        # face detections\\n\",\n        \"        faces = cascade.detectMultiScale(self.original.img, scaleFactor=1.1,\\n\",\n        \"                                         minNeighbors=5, minSize=(30, 30),\\n\",\n        \"                                         flags = cv2.cv.CV_HAAR_SCALE_IMAGE)\\n\",\n        \"\\n\",\n        \"        if DEBUG:\\n\",\n        \"            print(\\\"%s faces detected\\\" % len(faces))\\n\",\n        \"\\n\",\n        \"        # Bounding boxes are drawn around the faces on the resulting image.\\n\",\n        \"        for (x, y, w, h) in faces:\\n\",\n        \"            cv2.rectangle(self.result.img, (x, y), (x + w, y + h), (255, 0, 0), 2)\\n\",\n        \"        self.result.save()\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"def run_haar_cascade():\\n\",\n        \"    \\\"\\\"\\\"\\n\",\n        \"    Detects faces via haar cascades in all images.\\n\",\n        \"    \\\"\\\"\\\"\\n\",\n        \"    for img_name in chain(train_dataset(), test_dataset()):\\n\",\n        \"        _ = HaarCascadeFaceDetector(img_name)\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"def benchmark(Detector, extra_args, use_test_data=True):\\n\",\n        \"    \\\"\\\"\\\"\\n\",\n        \"    Run a benchmark of the detector passed in arg\\n\",\n        \"        \\\"\\\"\\\"\\n\",\n        \"    print(\\\"Benchmark started for %s(%s)\\\" % (Detector.__name__, extra_args))\\n\",\n        \"\\n\",\n        \"    true_positive_rates = []\\n\",\n        \"    false_positive_rates = []\\n\",\n        \"\\n\",\n        \"    for image_name in (test_dataset() if use_test_data else train_dataset()):\\n\",\n        \"        detector = Detector(\\n\",\n        \"            image_name, *extra_args) if extra_args else Detector(image_name)\\n\",\n        \"        true_positive_rate, false_positive_rate = detector.rates()\\n\",\n        \"        true_positive_rates.append(true_positive_rate)\\n\",\n        \"        false_positive_rates.append(false_positive_rate)\\n\",\n        \"\\n\",\n        \"    # tp: true positive / fp: false positive\\n\",\n        \"    # avg: average     / std: standard deviation\\n\",\n        \"    tp_avg = np.mean(true_positive_rates)\\n\",\n        \"    tp_std = np.std(true_positive_rates)\\n\",\n        \"    fp_avg = np.mean(false_positive_rates)\\n\",\n        \"    fp_std = np.std(false_positive_rates)\\n\",\n        \"\\n\",\n        \"    print(\\\"Benchmark finished for %s(%s)\\\" % (Detector.__name__, extra_args))\\n\",\n        \"\\n\",\n        \"    return tp_avg, tp_std, fp_avg, fp_std\\n\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"AXk0eyIno4Xm\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"The method is implemented with Opencv's haar cascade. We tested a few different parameters for this detector. Finally, we get an optimal result (see Figure) with a slight scaling of the image (10%), a minimum detection size of 30 pixels by 30 pixels and a minimum number of neighbors for the detection to be valid of 5.\\n\",\n        \"\\n\",\n        \"![res](https://i.ibb.co/R3PhwjP/8.png)\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"cqThgDJGmu6P\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"###**Deep CNN -based object detection**\\n\",\n        \"\\n\",\n        \"Convolutional neural networks (CNN) are particular deep neural network (DNN) structures since the basic operation has become a convolution rather than a matrix multiplication. These networks have been developed to take advantage of big data with a structure (spatial, temporal, ...) such as images, videos, etc. As shown in Figure 3, their functioning is straightforward and requires some convolution operations.  The output is obtained by convolving the input image by a fixed number of kernels. The output of a kernel is obtained by multiplying the current position of a sliding window (i.e. receptive field) applied to the image. Besides, pooling or subsampling layers are added to the basic operations. They allow to reduce the spatial size of the representation in this way, they allow controlling overfitting problems. \\n\",\n        \"\\n\",\n        \"**Figure 3:** A basic structure of CNN![CNN](https://miro.medium.com/max/1000/1*zNs_mYOAgHpt3WxbYa7fnw.png)\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"###**Use case 2:** CNN-based generic object detector\\n\",\n        \"\\n\",\n        \"**Deep Learning Framework:** [Pytorch](https://pytorch.org/) (An open source machine learning framework that accelerates the path from research prototyping to production deployment). Please follow the installation instructions on the framework's official [website](https://pytorch.org/).\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"**Architecture:** The CNN model consists of three convolutional layers and two fully connected layers. Each convolutional layer uses a kernel of size 5 with a stride of 1 and rectified linear units, ReLU, are used as the activation function. After each of the first two convolutional layers, a max-pooling layer of size 2 with a stride of 2 is used. The network was trained over 50 epochs using the stochastic gradient descent (SGD) optimizer. For the first 30 epochs, the learning rate is set to 0.0001 and then it is updated to 0.00001. \\n\",\n        \"\\n\",\n        \"The CNN implementation is as follows:\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"WiBuD8NtgZTW\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"import torch.nn as nn\\n\",\n        \"import torch.nn.functional as f\\n\",\n        \"class cnn_model(nn.Module):\\n\",\n        \"\\n\",\n        \"    def __init__(self):\\n\",\n        \"\\n\",\n        \"        super(cnn_model, self).__init__()\\n\",\n        \"\\n\",\n        \"        self.conv1 = nn.Conv2d(\\n\",\n        \"            in_channels=1,\\n\",\n        \"            out_channels=32,\\n\",\n        \"            kernel_size=5,\\n\",\n        \"            stride=1,\\n\",\n        \"            padding=0\\n\",\n        \"        )\\n\",\n        \"\\n\",\n        \"        self.conv2 = nn.Conv2d(\\n\",\n        \"            in_channels=32,\\n\",\n        \"            out_channels=64,\\n\",\n        \"            kernel_size=5,\\n\",\n        \"            stride=1,\\n\",\n        \"            padding=0\\n\",\n        \"        )\\n\",\n        \"\\n\",\n        \"        self.conv3 = nn.Conv2d(\\n\",\n        \"            in_channels=64,\\n\",\n        \"            out_channels=128,\\n\",\n        \"            kernel_size=5,\\n\",\n        \"            stride=1,\\n\",\n        \"            padding=0\\n\",\n        \"        )\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"        self.fc1 = nn.Linear(\\n\",\n        \"            in_features=18*18*128,\\n\",\n        \"            out_features=2046\\n\",\n        \"        )\\n\",\n        \"\\n\",\n        \"        self.fc2 = nn.Linear(\\n\",\n        \"            in_features=2046,\\n\",\n        \"            out_features=4\\n\",\n        \"        )\\n\",\n        \"\\n\",\n        \"    def forward(self, val):\\n\",\n        \"        val = f.relu(self.conv1(val))\\n\",\n        \"        val = f.max_pool2d(val, kernel_size=2, stride=2)\\n\",\n        \"        val = f.relu(self.conv2(val))\\n\",\n        \"        val = f.max_pool2d(val, kernel_size=2, stride=2)\\n\",\n        \"        val = f.relu(self.conv3(val))\\n\",\n        \"        val = val.view(-1, 18*18*128)\\n\",\n        \"        val = f.dropout(f.relu(self.fc1(val)), p=0.5, training=self.training)\\n\",\n        \"        val = self.fc2(val)\\n\",\n        \"\\n\",\n        \"        return val\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"vXGZsTKNhVku\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"Source code to learn the model:\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"vM_g3_yyhvvX\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"import torch\\n\",\n        \"import torch.nn as nn\\n\",\n        \"import torch.optim as optim\\n\",\n        \"from torch.utils.data import DataLoader\\n\",\n        \"import numpy as np\\n\",\n        \"import pandas as pd\\n\",\n        \"from functions import overlapScore\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"from cnn_model import *\\n\",\n        \"from training_dataset import *\\n\",\n        \"\\n\",\n        \"def train_model(net, dataloader, batchSize, lr, momentum):\\n\",\n        \"    criterion = nn.MSELoss()\\n\",\n        \"    optimization = optim.SGD(net.parameters(), lr=lr, momentum=momentum)\\n\",\n        \"    scheduler = optim.lr_scheduler.StepLR(optimization, step_size=30, gamma=0.1)\\n\",\n        \"\\n\",\n        \"    for epoch in range(50):\\n\",\n        \"\\n\",\n        \"        scheduler.step()\\n\",\n        \"\\n\",\n        \"        for i, data in enumerate(dataloader):\\n\",\n        \"            optimization.zero_grad()\\n\",\n        \"\\n\",\n        \"            inputs, labels = data\\n\",\n        \"\\n\",\n        \"            inputs, labels = inputs.view(batchSize,1, 100, 100), labels.view(batchSize, 4)\\n\",\n        \"\\n\",\n        \"            outputs = net(inputs)\\n\",\n        \"\\n\",\n        \"            loss = criterion(outputs, labels)\\n\",\n        \"            loss.backward()\\n\",\n        \"            optimization.step()\\n\",\n        \"\\n\",\n        \"            pbox = outputs.detach().numpy()\\n\",\n        \"            gbox = labels.detach().numpy()\\n\",\n        \"            score, _ = overlapScore(pbox, gbox)\\n\",\n        \"\\n\",\n        \"            print('[epoch %5d, step: %d, loss: %f, Average Score = %f' % (epoch+1, i+1, loss.item(), score/batchSize))\\n\",\n        \"\\n\",\n        \"    print('Finish Training')\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"if __name__ == '__main__':\\n\",\n        \"    # Hyper parameters\\n\",\n        \"    learning_rate = 0.0001\\n\",\n        \"    momentum = 0.9\\n\",\n        \"    batch = 100\\n\",\n        \"    no_of_workers = 2\\n\",\n        \"    shuffle = True\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"    trainingdataset = training_dataset()\\n\",\n        \"    dataLoader = DataLoader(\\n\",\n        \"        dataset=trainingdataset,\\n\",\n        \"        batch_size=batch,\\n\",\n        \"        shuffle=shuffle,\\n\",\n        \"        num_workers=no_of_workers\\n\",\n        \"    )\\n\",\n        \"\\n\",\n        \"    model = cnn_model()\\n\",\n        \"    model.train()\\n\",\n        \"\\n\",\n        \"    train_model(model, dataLoader, batch,learning_rate, momentum)\\n\",\n        \"    torch.save(model.state_dict(), './trained_CNN_model.pth')\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"02KjSj_7iFF6\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"Source code for handling the dataset (reading data samples):\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"UtzZlSuEictH\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"import numpy as np\\n\",\n        \"import pandas as pd\\n\",\n        \"import torch\\n\",\n        \"from torch.utils.data import Dataset, DataLoader\\n\",\n        \"\\n\",\n        \"class training_dataset(Dataset):\\n\",\n        \"    def __init__(self):\\n\",\n        \"      # Training set and corresponding ground truth images\\n\",\n        \"        trainX = np.asarray(pd.read_csv('./my_dataset/trainingData.csv', sep=',', header=None))\\n\",\n        \"        trainY = np.asarray(pd.read_csv('./my_dataset/ground-truth.csv', sep=',', header=None))\\n\",\n        \"        self.features_train = torch.Tensor(trainX)\\n\",\n        \"        self.groundTruth_train = torch.Tensor(trainY)\\n\",\n        \"\\n\",\n        \"        self.len = len(trainX)\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"    def __getitem__(self, item):\\n\",\n        \"        return self.features_train[item], self.groundTruth_train[item]\\n\",\n        \"\\n\",\n        \"    def __len__(self):\\n\",\n        \"        return self.len\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"rK5S_NLIjn9Y\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"The following pseudo-code entails a function to calculate the overlap rate taking into account the ground truth boxes and the predicted bounding boxes.\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"YWM0OdPHjpDl\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"import numpy as np\\n\",\n        \"\\n\",\n        \"def overlap(rect1, rect2):\\n\",\n        \"\\n\",\n        \"    avgScore = 0\\n\",\n        \"    scores = []\\n\",\n        \"\\n\",\n        \"    for i, _ in enumerate(rects1):\\n\",\n        \"\\n\",\n        \"        rect1 = rect1[i]\\n\",\n        \"        rect2 = rect2[i]\\n\",\n        \"\\n\",\n        \"        left = np.max((rect1[0], rect2[0]))\\n\",\n        \"        right = np.min((rect1[0]+rect1[2], rect2[0]+rect2[2]))\\n\",\n        \"\\n\",\n        \"        top = np.max((rect1[1], rect2[1]))\\n\",\n        \"        bottom = np.min((rect1[1]+rect1[3], rect2[1]+rect2[3]))\\n\",\n        \"\\n\",\n        \"        # area of intersection\\n\",\n        \"        i = np.max((0, right-left))*np.max((0,bottom-top))\\n\",\n        \"\\n\",\n        \"        # combined area of two rectangles\\n\",\n        \"        u = rect1[2]*rect1[3] + rect2[2]*rect2[3] - i\\n\",\n        \"\\n\",\n        \"        # return the overlap ratio\\n\",\n        \"        # value is always between 0 and 1\\n\",\n        \"        score = np.clip(i/u, 0, 1)\\n\",\n        \"        avgScore += score\\n\",\n        \"        scores.append(score)\\n\",\n        \"\\n\",\n        \"    return avgScore, scores\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"AyocdnccwjuL\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"###**Real-time object detection and segmentation with Tensorflow**\\n\",\n        \"The objective of this use case is to explain the real-time object detection and segmentation by an example. To do this, we will develop a real-time segmentation application with a simple webcam. We will use the [Tensorflow framework](https://www.tensorflow.org/), the Mask RCNN network learned with the COCO dataset; which allows us to detect up to 100 different types of objects.\\n\",\n        \"\\n\",\n        \" First of all, let's make a list of our tools and libraries to install.\\n\",\n        \" \\n\",\n        \"* Linux Ubuntu \\n\",\n        \"* Python\\n\",\n        \"* Tensorflow\\n\",\n        \"* Open CV\\n\",\n        \"\\n\",\n        \"In order to check if your computer is ready, open a python3 console in the terminal by typing python3. Do the following imports:\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"hsXW3Y8iyKGa\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"import cv2\\n\",\n        \"import numpy as np\\n\",\n        \"import tensorflow as tf\\n\",\n        \"from object_detection.utils import label_map_util\\n\",\n        \"from object_detection.utils import ops as utils_ops\\n\",\n        \"from object_detection.utils import visualization_utils as vis_util\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"ajRj5Dbfyecu\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"To make the model work, you need to load the network and its weights. You will find a list of all object detection models available with Tensorflow on this zoo model. For this tutorial, download mask_rcnn_resnet101_atrous_coco.\"\n      ]\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"ek6qk08Pyffo\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"We start with the last point: initialize the webcam. This allows two things: (1) to create the video stream and (2) to get the width and height of a frame of the stream in order to configure the output tensor of the mask.\\n\",\n        \" \"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"7w99Egz4yrvA\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"# Init the video stream (with the first plugged webcam)\\n\",\n        \"cap = cv2.VideoCapture(0)\\n\",\n        \"if cap.isOpened():\\n\",\n        \"  # get vcap property\\n\",\n        \"  global_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))\\n\",\n        \"  global_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"nY1oa5fMyvfL\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"The next step is to import the label_map file. It is done using methods delivered with Tensorflow's object_detection.\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"NV2FQ3uQy3WW\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"label_map = label_map_util.load_labelmap(\\\"PATH/TO/LABELS\\\")\\n\",\n        \"categories = label_map_util.convert_label_map_to_categories(\\n\",\n        \"  label_map, \\n\",\n        \"  max_num_classes=NUM_CLASSES,\\n\",\n        \"  use_display_name=True)\\n\",\n        \"category_index = label_map_util.create_category_index(categories)\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"RQ7xygEdy_Ap\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"We then proceed with the import of the model and the collection of the tensors.\\n\",\n        \" \"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"dfTxujJjzGK1\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"# Init TF Graph and get all needed tensors\\n\",\n        \"detection_graph = tf.Graph()\\n\",\n        \"with detection_graph.as_default():\\n\",\n        \"  # Init the graph\\n\",\n        \"  od_graph_def = tf.GraphDef()\\n\",\n        \"  with tf.gfile.GFile(\\\"/chemin/vers/*.pbb') as fid:\\n\",\n        \"    serialized_graph = fid.read()\\n\",\n        \"    od_graph_def.ParseFromString(serialized_graph)\\n\",\n        \"    tf.import_graph_def(od_graph_def, name='')\\n\",\n        \"\\n\",\n        \"  # Get all tensors\\n\",\n        \"  ops = tf.get_default_graph().get_operations()\\n\",\n        \"  all_tensor_names = {output.name for op in ops for output in op.outputs}\\n\",\n        \"  tensor_dict = {}\\n\",\n        \"  for key in ['num_detections', 'detection_boxes', 'detection_scores', 'detection_classes', 'detection_masks']:\\n\",\n        \"    tensor_name = key + ':0'\\n\",\n        \"      if tensor_name in all_tensor_names:\\n\",\n        \"        tensor_dict[key] = tf.get_default_graph().get_tensor_by_name(tensor_name)\\n\",\n        \"\\n\",\n        \"  # detection_masks tensor need ops\\n\",\n        \"  detection_boxes = tf.squeeze(tensor_dict['detection_boxes'], [0])\\n\",\n        \"  detection_masks = tf.squeeze(tensor_dict['detection_masks'], [0])\\n\",\n        \"  # Reframe is required to translate mask from box coordinates to image coordinates and fit the image size.\\n\",\n        \"  real_num_detection = tf.cast(tensor_dict['num_detections'][0], tf.int32)\\n\",\n        \"  detection_boxes = tf.slice(detection_boxes, [0, 0], [real_num_detection, -1])\\n\",\n        \"  detection_masks = tf.slice(detection_masks, [0, 0, 0], [real_num_detection, -1, -1])\\n\",\n        \"  detection_masks_reframed =  utils_ops.reframe_box_masks_to_image_masks(\\n\",\n        \"detection_masks, detection_boxes, global_height, global_width)\\n\",\n        \"  detection_masks_reframed = tf.cast(tf.greater(detection_masks_reframed, 0.5), tf.uint8)\\n\",\n        \"  # Follow the convention by adding back the batch dimension\\n\",\n        \"  tensor_dict['detection_masks'] = tf.expand_dims(detection_masks_reframed, 0)\\n\",\n        \"\\n\",\n        \"  image_tensor = tf.get_default_graph().get_tensor_by_name('image_tensor:0')\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"USBUtCurzMbv\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"Let's continue our program with the main method. In this method which is called after the initializations we just presented, we capture the last image of the webcam, we process it, we display the modified image and we start again. So the main method works like this:\\n\",\n        \"\\n\",\n        \" \"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"GGYtunLbzflm\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"if __name__ == '__main__':\\n\",\n        \"  # Do that here and save a lot of time\\n\",\n        \"  with detection_graph.as_default():\\n\",\n        \"    with tf.Session(graph=detection_graph) as sess:\\n\",\n        \"      while True:\\n\",\n        \"        # Get the last frame\\n\",\n        \"        frame = cap.read()[1]\\n\",\n        \"        # Process last img\\n\",\n        \"        new_frame = detect_objects(image_np, sess)\\n\",\n        \"        # Display the resulting frame\\n\",\n        \"        cv2.imshow('new_frame', new_frame)\\n\",\n        \"        if cv2.waitKey(1) & 0xFF == ord('q'):\\n\",\n        \"          break\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"wvcjTFG1ziiF\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"And so the core of the program is in the detect_objects() method which takes as arguments the image (in NumPy array format) and the Tensorflow session which will allow us to run our model.\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"6wVWXWvCztXn\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"def detect_objects(image_np, sess):\\n\",\n        \"  # Run inference\\n\",\n        \"  output_dict = sess.run(tensor_dict, feed_dict={image_tensor: np.expand_dims(image_np, 0)})\\n\",\n        \"\\n\",\n        \"  # all outputs are float32 numpy arrays, so convert types as appropriate\\n\",\n        \"  output_dict['num_detections'] = int(output_dict['num_detections'][0])\\n\",\n        \"  output_dict['detection_classes'] = output_dict['detection_classes'][0].astype(np.uint8)\\n\",\n        \"  output_dict['detection_boxes'] = output_dict['detection_boxes'][0]\\n\",\n        \"  output_dict['detection_scores'] = output_dict['detection_scores'][0]\\n\",\n        \"  output_dict['detection_masks'] = output_dict['detection_masks'][0]\\n\",\n        \"\\n\",\n        \"  # Display boxes and color pixels\\n\",\n        \"  vis_util.visualize_boxes_and_labels_on_image_array(\\n\",\n        \"    image_np,\\n\",\n        \"    output_dict['detection_boxes'],\\n\",\n        \"    output_dict['detection_classes'],\\n\",\n        \"    output_dict['detection_scores'],\\n\",\n        \"    category_index,\\n\",\n        \"    instance_masks=output_dict.get('detection_masks    use_normalized_coordinates=True)\\n\",\n        \"\\n\",\n        \"  return image_np\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    }\n  ]\n}"
  },
  {
    "path": "Topics/Deep learning in cloud/README.md",
    "content": "# Deep learning in cloud\n\nEver had a laptop which is not powerful enough to run your models? Forget about it and use **Cloud GPUs** to train your model faster and cheaper!\n\n* Also get to know where you can [**deploy**](https://github.com/zszazi/Deep-learning-in-cloud/blob/master/README.md#deploy-your-model-as-a-web-app) your model to serve millions of people\n\n* Check out the **free credits** and [**Perks/offer**](https://github.com/zszazi/Deep-learning-in-cloud/blob/master/README.md#perks-and-offers) section to get some free gpu hours \n\nLast updated : 20 April 2019\n\n |# | Cloud vendor   |      Website      |  Pricing | Free Trial / Free Credits | \n| ---|----------|---------| -------- | ----------|\n|1 | Google Colaboratory❤️ | https://colab.research.google.com | FREE | FREE FOREVER* | \n|2 | Kaggle Kernels |   https://www.kaggle.com |  FREE | FREE FOREVER* |\n|3| Tensorpad | https://www.tensorpad.com |  1080ti at $0.49/hour | 5 free GPU hours |\n|4| FloydHub | https://www.floydhub.com | https://www.floydhub.com/pricing | free 2 GPU powerups in 14 days [trial plan](https://docs.floydhub.com/faqs/plans/#what-is-in-the-trial-plan) |\n|5| Onepanel | https://www.onepanel.io | https://www.onepanel.io/pricing | - |\n|6| Nimblebox | https://nimblebox.ai | https://nimblebox.ai/plans | free $5 worth of cloud credits|\n|7| paperspace | https://www.paperspace.com | https://www.paperspace.com/pricing | $10 credits |\n|8| Overture |https://www.overture.ai | - | free credits on signup|\n|9| Dataiku | https://www.dataiku.com | - | [Free Plans](https://www.dataiku.com/dss/trynow/free-edition) |\n|10| Cloudalize | https://www.cloudalize.com | https://www.cloudalize.com/pricing/ | - |\n|11|Deepcognition| https://deepcognition.ai | https://deepcognition.ai/products | Desktop version [free](https://deepcognition.ai/products/desktop/) to use |\n|12| GPUeater | https://gpueater.com | https://gpueater.com/#pricing | - |\n|13| Vast.ai| https://vast.ai | https://vast.ai/console/create/ | -|\n|14| Clusterone | https://clusterone.com | https://clusterone.com/pricing | $25 Sign up credit |\n|15| Snark | https://snark.ai | https://scale.snark.ai/pricing | - |\n|16| Crestle |https://crestle.ai | https://crestle.ai/#pricing| 1 hour of free GPU usage on sign up [fast.ai](https://course.fast.ai/start_crestle.html#pricing) |\n|17| Vector Dash(gaming) | https://vectordash.com |-| free 7 day plan|\n|18| Spell | https://spell.run/developers| https://spell.run/pricing | $10 GPU credit on signup |\n|19|Rapid Switch|https://www.rapidswitch.com|[pricing](https://www.rapidswitch.com/dedicated-servers/low-price-guarantee/)|-|\n|20| Salamander|https://salamander.ai|https://salamander.ai|-|\n|21| Leadergpu | https://www.leadergpu.com | https://www.leadergpu.com | - |\n|22| vscaler | https://www.vscaler.com |[on request](https://www.vscaler.com/private-cloud-appliance/)| -|\n|23| AWS Sagemaker |https://aws.amazon.com/sagemaker/ |[pricing](https://aws.amazon.com/sagemaker/pricing/)| [Free plans](https://aws.amazon.com/free/) |\n|24| Exoscale |https://www.exoscale.com/gpu/|[pricing](https://www.exoscale.com/pricing/#/gpu/small) |-|\n|25|Cirrascale|http://www.cirrascale.com| [Work station](http://www.cirrascale.com/pricing_waas.php)|-|\n|26| Alibaba cloud |https://alibabacloud.com|[pay as you go](https://www.alibabacloud.com/product/gpu/pricing)| $300 [credits](https://www.alibabacloud.com/campaign/free-trial)\n|27|IBM Cloud|https://www.ibm.com/cloud/gpu|[pay as you go](https://www.alibabacloud.com/product/gpu/pricing)|$200 [credits](https://console.bluemix.net/registration/free)|\n|28|Google Cloud Platform|https://cloud.google.com/gpu/|https://cloud.google.com/pricing/|$300 [credits](https://cloud.google.com/free/)|\n|29| Valohai|https://valohai.com| https://valohai.com/pricing/ | free trial avaliable|\n|30| Nvidia cloud|https://www.nvidia.com/en-us/data-center/gpu-cloud-computing/|-|-|\n|31|One stop System|https://www.onestopsystems.com|-|-|\n|32| Azure|https://azure.microsoft.com/en-in/services/machine-learning-studio/|[pricing](https://azure.microsoft.com/en-in/pricing/)| $200 [credits](https://azure.microsoft.com/en-us/free/)\n|33| Omnisci | https://www.omnisci.com | https://www.omnisci.com/cloud | 14 day free trial|\n|34| Rendsolve | https://rendsolve.com | https://rendsolve.com/pricing | - |\n|35| Golem | https://golem.network | - |- |\n\n\n# Deploy your model as a Web app\nHave an idea and want to serve to world 🌎 , create a Webapp and deploy it as a flask , Django  etc\n\n |# | Vendor   |      Website      |  Pricing | Free Trial / Free Credits |\n| ---|----------|---------| -------- | ----------|\n| 1  | Render  | https://render.com  |  https://render.com/pricing |-|\n|  2 |  Heroku |  https://www.heroku.com |  https://www.heroku.com/pricing | [Free plan](https://www.heroku.com/free) (model<500MB)|\n|  3 | Digtal Ocean  | https://www.digitalocean.com  |  [pay as you go](https://www.digitalocean.com/pricing/) | free $100 credits with [github student pack](https://education.github.com/pack)|\n| 4 | Glitch | https://glitch.com |-|-|\n| 5 | Zeit | https://zeit.co | https://zeit.co/pricing | Free plan available|\n\n# Perks and offers\nIf you are a student or researcher you can get extra credts , contact the provider\n\n* Paperspace provides $10 of free Gradient° credit [fast.ai link](https://course.fast.ai/start_gradient.html#promotional-credit)\n* Do you have a GPU lying around rent your machine to Earn money using [Vast.ai](https://vast.ai/console/host/setup/)*\n* Test Drive Nvidia GPU [link](https://www.nvidia.com/en-us/data-center/tesla/gpu-test-drive/)\n* Google Cloud Research program - gives **$5000+ credits** [link](https://lp.google-mkto.com/gcp-research-credits-FAQ.html)\n* AWS Cloud Credits for Research -[link](https://aws.amazon.com/research-credits/)\n* Nvidia GPU Grant Program- [link](https://developer.nvidia.com/academic_gpu_seeding)\n* **If you are a Startup** then google has you covered wth Startup Program giving you credits from **$1000 to $100000** - [link](https://cloud.google.com/developers/startups/)\n* Google giving cluster of **1000 TPUs to researcher** In total, this cluster delivers a total of more than **180 petaflops of raw compute power!** [techcrunch link](https://techcrunch.com/2017/05/17/the-tensorflow-research-cloud-program-gives-the-latest-cloud-tpus-to-scientists/)  - [application link](https://www.tensorflow.org/tfrc/)\n* Google cloud Education Grant - [link](https://cloud.google.com/edu/)\n* Github Education pack - along with many offers has upto $110 credits for AWS - [link](https://education.github.com/pack)\n* Watch out on [fast.ai Forums](https://forums.fast.ai) to get coupon code for free credits\n* Valohai gives you an [researcher license](https://valohai.com/research-license/) for students and researchers\n* Want to use a **Super Computer** but don't have one, go for Golem - [Golem](https://golem.network) is a *decentralized marketplace for computing power*. It enables CPUs and GPUs to connect in a peer-to-peer network, enabling both application owners and individual users to rent resources from other users machines, so turbo charge your next model training.\n\n## * Notes\n* Google colab and Kaggle kernels have limited session time \n* Most of the gpu providers run on top of AWS , GCP etc so may have more or less same pricing as the latter\n* Information given above is best to my searching ability , you may recheck with the provider for pricing and other info\n* [license](https://github.com/zszazi/Deep-learning-in-cloud/blob/master/LICENSE)\n\n\n------------------------------------------\nWritten by _zszazi_\n"
  },
  {
    "path": "Topics/Demystification.md",
    "content": "---\ntitle: Demystification of the key concepts of AI and ML\nauthor: clone95\ndescription: Clarify the jargon and the ideas behind Artificial Intelligence and Machine Learning. Describe what their applications and potential are.\n---\n\n# What is Artificial Intelligence, Machine Learning and Deep Learning\n\n# What you will learn \nThis guide wants to clarify ideas about terms such as Artificial Intelligence and Machine Learning and what their applications and potential are. You will also be introduced to the [Jargon](https://en.wikipedia.org/wiki/Jargon) of these incredible themes in continuous evolution. You will understand the hierarchy and contexts in which to read any news or fact that mentions AI or Machine Learning. \n\nYou will learn to distinguish hype from reality.\n\n## Prerequisites\nNone, welcome on board! :-)\n\n## Time to complete\n30 minutes.\n\n# Index\n- [Naming](#Naming)\n- [Definition](#Definition) \n- [Machine Learning, differences from the algorithmic approach](#Machine-Learning-differences-from-the-algorithmic-approach)\n- [Why use Machine Learning techniques?](#Why-use-Machine-Learning-techniques)\n\n### Naming\n\nThe term Machine Learning is often confused with the term Artificial Intelligence (AI), which however refers to a set of techniques, methodologies, and algorithms that includes those of Machine Learning (abbreviated to ML). The objective of the AI field is to create \"intelligent\" agents, which can have a perception of the real world through sensors, make decisions thanks to their \"intelligence\", and finally implement them through actuators.\nIf you want to make an analogy with a human being, you can think of sensors as the sense organs (eyes, ears...), the intelligence is that of our brain and the actuators can be the hands, feet or more generally the muscles. \nHowever, the biological analogy is limited, since it is not necessary for the sensors of an agent to detect physical phenomena, such as temperature or time, but it could detect data, relations, or inputs of any other kind.\nMachine learning is generally considered as a subset of the AI field. Specifically, the term Machine Learning means the science of programming a machine so that it can learn to perform a task from the data, rather than through programming.\nDeep Learning is a subset of the Machine Learning field a further ensemble of techniques and algorithms that exploit neural networks for the solution of problems such as Computer Vision or Natural Language Understanding. \nMore specifically Virgilio will provide you guides to become experienced in the Machine Learning field, with a strong focus on Deep Learning techniques.\n\n![Figure 1-1](./sets.png) \n\n### Definition\n\nA more engineering definition of **Machine Learning** is that given by Tom Mitchell:\n\"A machine is learning from experience E with respect to task T and a metric of P, if its performance on T, measured with P, improves with experience E.\"\n\nThis theoretical classification may be difficult to distinguish in practice, but it becomes clearer with an example, such as the autonomous driving system of a new generation car.\nThis can, in fact, be considered as a whole an AI system: it collects data from the real world (road, cars, road signs, speed) through sensors, possesses a set of \"rules\" of behavior that constitutes its intelligence (\"if you are about to collide with an object, brake preventively\") and possesses a set of actuators through which it implements decisions (brakes, steering, ABS). \nIn this example, the AI system of the car has a sub-module of Machine Learning that allows it to improve over time, as the car \"sees\" different roads and situations, and increases its performance compared to some metric (safety, reaction time to braking, consumption).\nThis Machine Learning module is then made up of further sub-modules, among which there can be a Deep Learning module that specifically deals with the vision that the car has of the real world, through a neural network trained to recognize the route of the road, the shapes of cars, distinguish them from those of trees and pedestrians, and so on.\n\n\n## Machine Learning differences from the algorithmic approach\n\nIn computer science, the classic approach to the problem consists in designing a process (algorithm) that is then realized in a programming language (implementation), thus solving the problem in a deterministic way. This determinism can be identified with the ability to consciously interpret each step of the algorithm and understand what action is taken at each step and why. It is important to note that I do not need examples of input data to produce the output considered correct. \n\n\nThe approach of Machine Learning, at an intuitive level, consists instead in \"seeing\" a lot of input examples, each matched with the output considered correct, and programming the machine to detect the recurring patterns that occur in the data. These patterns will then be used by the machine as a \"knowledge base\", to try to return the correct output, if a new input is provided (never seen before). The process of \"training\" the machine is called training, and its result is a model (a set of parameters properly \"adjusted\" so that they recognize the patterns that interest us for the given problem). Once a model is obtained, it can be used to assign the correct output to inputs that it has never \"seen\". As it arises spontaneously to think, for a model it is determinant the ability to generalize starting from the examples on which it has been trained, otherwise, it would need to see every possible input that could be presented to it in input!\n\nLet's see some practical examples of how Machine Learning is applied in the real world.\n\nIt is an application of Machine Learning:\n\n- An \"intelligent\" spam email filter, which the more spam emails it processes, the more effective it becomes in recognizing and distinguishing them from useful emails.\n\n- A recognizer of hand-drawn figures or symbols, such as numbers, letters, or figures.\n\n- A system of customization of content suggested based on what you've already seen (Netflix that recommends the next movie to watch, Facebook that suggests groups that might interest you, Amazon that shows products often purchased together).\n\n- A sentiment analysis system capable of extracting important information from tweets or other data generated by humans about a particular event or character.\nFor example, you can do a sentimental analysis of the \"Donald Trump\" concept during elections, and understand how it is perceived by people who post tweets about it (negative, positive, neutral...).\n\n- A system of writing assistance that, as the text is composed, foresees the next words and suggests them. Examples of this system are extremely popular, such as the automatic completion of smartphones or the Facebook search bar.\n\n- A Computer Vision system that recognizes the model and brand of a car by \"seeing\" it with a sensor (typically a video camera).\n\n\nWe also see some counter-examples.\n\nIt is not a Machine Learning application:\n\n- A search engine based on keywords: it does not improve with experience, and to make it more \"intelligent\" you have to program it explicitly. \n\n- A customer service interface that has pre-programmed responses to specific needs. For example, if I detect the word \"ORDER\" and an alphanumeric code in the customer's request message, then I show the status of the shipment identified by that code. \n\n- A sensor programmed to detect car number plates (e.g. the Safety Tutor system). Although it \"sees\" license plates and can, therefore, be confused with the concept of Computer Vision, it does not improve with experience, and its performance is determined solely by its programming at the design stage, where it is explicitly calibrated to detect a standard object (the license plate). \n\n- The famous mobile application Akinator, which tries to guess which historical or cinematic character the user is thinking about. Through a series of targeted questions (does he have hair? is he an alien? appears in Star Wars?) he explores a database of characters and by asking questions, by exclusion, he arrives at the answer. This, although it may seem like an \"intelligent\" program, is not really: it doesn't learn by improving with experience without being programmed to do so and follows a deterministic process easily explained by a human being.\n\n\n## Why use Machine Learning techniques\n\nImagine having to create a spam e-mail filter with traditional programming techniques:\n\n1.    First, we would try to understand what the typical spam e-mail looks like. We might notice that some words or phrases (for example \"For Yourself\", \"Occasion\", \"Free only for today!\") tend to appear often in annoying spam emails.\nMaybe we could notice further patterns in other parts of the mail, for example in the string representing the sender's mailbox, or that several emails are received from the same mailboxes in a few days.\n\n2.    We would write an algorithm to detect these patterns that we have noticed, for example using regular expressions to detect sequences of \"suspicious\" words and the algorithm would report as spam an email that contains a number of these patterns. \n\n3.    We would test the program and repeat steps 1 and 2 until we get a satisfactory version that signals malicious e-mails fairly accurately.\n\nFrom the moment the task is not trivial, and those who create spam emails reinvent themselves every day to escape the control of the filters (fooling, for example, the ML anti-spam model of Gmail), the program would very soon become a huge set of complex \"hard-coded\" rules, chaotic and very difficult to maintain. Its main limit, however, is that to remain effective day after day, it must be updated daily and rules on rules must be added by hand!\n\nInstead, a spam filter consisting of a Machine Learning model would automatically learn which sentences, words, and patterns are valid indicators of spam danger, updating itself every time a new spam mail is recognized. The program is much shorter, easy to maintain and accurate in recognition.\n\nIn summary, Machine Learning techniques are appropriate for:\n\n- Fluid environments, where the problem changes constantly and in an unpredictable way (a mountain road never \"seen\" before, an email containing words never encountered, an unknown pattern in the peaks of users in a website).\n\n- Complex problems where the traditional approach would be impracticable or would lead to \"Frankenstein\" of code with high maintenance cost. The Machine Learning approach can greatly simplify the code and achieve better performance.\n\n- Get information about complex problems and discover patterns through large amounts of data.\n\n\nNow you should be more comfortable with high-level ideas of the concepts of AI and ML, and every time you see a term you'll know how to contextualize it.\n\nYou will also see how the terms are crippled and misused, and maybe you could recommend this guide to the next person to clarify his ideas!"
  },
  {
    "path": "Topics/DialogFlow.md",
    "content": "\n# ChatBots with DialogFlow, Python, and Flask\n\n## We have 99.94847 percent probability of death, Luke\nIn simple terms, a [Chatbot](https://medium.com/swlh/what-is-a-chatbot-and-how-to-use-it-for-your-business-976ec2e0a99f) is a computer program that simulates human conversation (in the form of texts and audio) \nwhich we would perceive as being intelligent and useful. \nTheir most important application is personal or enterprise virtual assistants.\nChatbots can _dig through huge amounts of data_ to pick out\nthe best nugget for a customer, whether it is a troubleshooting solution or a recommendation for a\nnew product to try. Also, they offer an extremely _intuitive interface_ between your business and your customers.\nDepending on the situation, a chatbot can learn from what a user\nsays to personalize the interaction and build off previous interaction, giving \na [satisfying and futuristic customer experience](https://mobilemonkey.com/chatbots/chatbot-examples).\n\n## Why Dialogflow\n[DialogFlow](https://dialogflow.com/) is the beginner-friendly chatbot platform from Google, and albeit there are several platforms out \nthere ([here](https://chatbotsmagazine.com/choosing-the-best-chatbot-platform-101-a-beginners-guide-e841b41192c7) a cool guide on choosing the right \nplatforms), DialogFlow has the best tradeoffs in particular for a beginner. [Here](https://chatbotsjournal.com/25-chatbot-platforms-a-comparative-table-aeefc932eaff) you find \nanother comparative table.\nI've chosen DialogFlow because:\n- Incorporates Google's machine learning expertise and products such as Google Cloud Speech-to-Text.\n- Is a Google service that runs on the Google Cloud Platform, letting you scale to hundreds of millions of users.\n- Is really beginner-friendly, intuitive, and has complete and clear documentation.\n  \n## Prerequisites \nThis guide will use [Python](https://www.python.org/) and his [Flask](http://flask.pocoo.org/) lightweight library to let you build a complete and deployable chatbot application. So, if you don't know Python, make yourself a gift and [learn it!](https://automatetheboringstuff.com/)\n\n\n# Index\n- [Learning DialogFlow](#Learning-DialogFlow)\n  - [The GUI approach](#The-GUI-approach) \n  - [A deeper approach](#A-deeper-approach)\n  - [Our first agent](#Our-first-agent)\n  - [Experimenting the API](#Experimenting-the-API)\n- [Hands-on Project](#Hands-on-Project)\n  - [Up and running with Flask and webhooks](#Up-and-running-with-Flask-and-webhooks)\n  - [Our agent, but with API calls](#Our-agent,-but-with-API-calls)\n  - [Handling webhooks with Flask](#Handling-webhooks-with-Flask)\n  - [Deploying our chatbot](#Deploying-our-chatbot)\n  - [Chatbot tips and best practices](#Chatbot-tips-and-best-practices)\n  - [Project Ideas](#Project-Ideas)\n\n## Learning DialogFlow\nThe thing I love about DialogFlow is that's beginner friendly. In fact, the approach  we'll follow to learn how to deploy real chat-bots is the following:\n- A first gentle approach through the Graphical User Interface to understand the concepts (intents, entities, context...)\n- A more \"coding\" approach, using the Python Client for [RESTful](https://it.wikipedia.org/wiki/Representational_State_Transfer) API call to reproduce the same Agent but with code (and not clicks in the GUI).\n- When we're able to build agents with Python API calls, we'll use them to create and End-to-End chatbot project that you'll deploy on several channels (Slack, Facebook, Telegram...)\nLet's start!\n\n### The GUI approach \nThe first thing I suggest you do is going through the [official introduction](https://dialogflow.com/docs) and step-by-step tutorial. It will bring you from zero to be able to create an Agent (the single chatbot application) with the GUI.\n[Here](https://console.dialogflow.com/api-client/#/login) you can start to build your agent and follow the steps of the tutorial. \nYou won't have a problem during this phase, you don't have to code anything, just follow the tutorial up to \"Fulfillment\".\n\n### Our first agent\nIf you've followed the guide with attention, you're now able to create a simple chatbot from the GUI.\nSo let's get our hands dirty and create our first agent! \n\n- Create a new Agent and develop it from the GUI, until he's able to reproduce this \"I'm lost\" Intent with FollowUpIntents:\n\nBot: Hi! I'm Virgilio! How can I help you?\\\nHuman: Tell me which is the best _Data Science_ project in _Italy_.\\\nB: Without a doubt, the best project about _Data Science_ in _Italy_ is _Virgilio_! Do you want to reach it?\\\nH: Yes.\\\nB: Here's the link, you're welcome :) \\\nB: [ ...drops the link ]\n\nThat's it, for now. Try to reproduce the conversation, you can try your agent from the top-right bar in the GUI.\nNotice that you have three entities here. Which ones?\nRemember that you can use both system entities (like an hour, date, languages, places...), and custom entities!\nWhen you're done, let's go for the next step!\n\n### Experimenting the API\nNow that you're really comfortable with the DialogFlow concepts, we can dive deep down the rabbit hole and et up the environment for developing a chatbot with Python. This will bring us al the power of the code to build and handle a lot of chatbots (and many more things).\nAssuming that you have Python3 installed, install the [Python SDK](https://dialogflow-python-client-v2.readthedocs.io/en/latest/index.html) going in the folder where you want to put your configuration files, launch a shell and digit:\n\n```\npip install dialogflow\n```\n\nIf it doesn't work, maybe is because you have an old installation of Python 2. In that case, digit:\n\n```\npip3 install dialogflow\n```\n\nNow go [here](https://github.com/googleapis/dialogflow-python-client-v2/tree/master/samples) and be happy. A lot of work is already done in these examples, and with them, you can already do a lot of things. I create the folder \"examples\" where I put those python files.\nNow follow the \"Before you begin\" instructions [here](https://dialogflow-python-client-v2.readthedocs.io/en/latest/).\nCreate a new agent in the project and add an intent from the GUI.\nConnect to that agent initializing the dialogflow client from your python script and read the Intents already existent in the Agent.\nIt will be like:\n\n```\nfrom examples import intent_management\nos.environ[\"GOOGLE_APPLICATION_CREDENTIALS\"] = <your path>/<your credentials file>.json\"\nprojectID = <your project id>\n\nclient = dialogflow.IntentsClient()\nparent = client.project_agent_path(projectID)\nmanagement.list_intents(parent)\n```\n\nIt should return you a JSON with all the information requested (in this case, your existing intents).\nJSON is the new de-facto standard for information representation, so [get comfortable](https://www.w3schools.com/whatis/whatis_json.asp) with it!\n\nSo, you have these files with a wrapper for the low-level functions (in this case, the low-level function in the intent_management.py is called at line 40 inside the list_intent() function).\n\nThese files are really useful to get started, but in the end, you want to have the most possible expressiveness and flexibility. So you want to master the lower level functions.\n\n### A deeper approach\n\nTry now to re-produce the Intent we have created with the lower level functions of the dialogflow module. You have here all the pieces of information you need, the [documentation](https://cloud.google.com/dialogflow-enterprise/docs/reference/rest/v2-overview) is really well done! In general, each time you want to communicate with the API you need to build a JSON (your request) and you'll receive a JSON (the response). \n\n### Up and running with Flask and webhooks\n\nDialogflow's APIs allows you to take action on your own systems based on conversational input, embed your conversational interface into your app or website, and dynamically change your agent's behavior. Dialogflow APIs center around three primary use cases:\n\n- Fulfillment: take action on your own systems based on conversational input. You can do things like querying a database or API to provide info to your users with any integration (Actions on Google, Slack, etc.)\n- Detect Intent API: Embed your conversational interface built with Dialogflow into your app, website or device. Call this API with a user's query to get back how your DIalogflow agent's response\n- Agent API: Dynamically change your agent's behavior by editing your agent's intents, entities, and contexts. Do anything you can through Dialogflow console programmatically with Dialogflow's agent APIs.\n\nHere you can see a clear schema.\n\n![Figure 1-1](https://raw.githubusercontent.com/dialogflow/resources/master/images/overview.png \"1\") \n\nBasically, you want to have a .py file that builds the agent (with API calls), then your agent is ready to take in queries form the user and send them (once recognized the user query) to a backend application (your webhook). In our case, the app in the backend (the webhook) is built with Flask.\n\n**Fulfillment** is code that's deployed as a webhook that lets your Dialogflow agent call business logic on an intent-by-intent basis. During a conversation, fulfillment allows you to use the information extracted by Dialogflow's natural language processing to generate dynamic responses or trigger actions on your back-end.\n\nMost Dialogflow agents make use of fulfillment to do things like: generate dynamic responses based on information looked up from a database, place orders based on products a customer has asked for, implement the rules and winning conditions for a game.\n\n### Our agent, but with API calls\nIt's time to get our hands dirty again!\nThis time we're adding the backend application acting under the hood, and not the static answers anymore.\n[Here](https://www.pragnakalp.com/dialogflow-fulfillment-webhook-tutorial/) you have a consistent and complete tutorial on how to run the Flask application on your machine (using Ngrok to expose he webhook on your machine, to the Web). \nNow that you have the entire stack working, you can start creating any type of application!\n\n### Deploying our chatbot\nThe smartest way to deploy your agent is through common communication channels like Facebook Messenger or Telegram.\n[Here](https://hub.packtpub.com/creating-and-deploying-a-chatbot-using-dialogflow-tutorial/) you find a very comprehensive tutorial on how to deploy your chatbot application to the real worlds. It's easy, isn't it?\n\n### Chatbot tips and best practices\nI've collected here for you some best articles and StackOverflow questions containing best practices.\n\n- [1](https://dzone.com/articles/best-practices-for-lively-chatbots), [2](https://miningbusinessdata.com/automatically-generate-dialogflow-faq-chatbot-csv-file/), [3](https://www.comm100.com/blog/chatbot-best-worst-practices.html), [4](https://chatbotsmagazine.com/11-more-best-ux-practices-for-building-chatbots-67362d1104d9), [5](https://thebrainfiles.wearebrain.com/chatbot-best-practice-learnings-and-insights-from-companies-like-abn-amro-booking-com-6e4c329c60a5), [6](https://www.marutitech.com/8-best-practices-bot-development/), [7](https://stackoverflow.com/questions/52426295/dialogflow-intent-lifespan-best-practice-and-performance)\n\n[Here](https://medium.com/the-mission/how-to-effectively-run-a-chatbot-development-project-a445d2d1170f) and [here](https://botpress.io/blog/successful-chatbot-projects-avoid-these-mistakes/) you find two guides on how to plan a chat for your business.\n\n### Project Ideas\n\nI've packed here for you a list of links with a lot of project ideas. Have fun!\n\n- [1](https://chatbotsmagazine.com/80-chatbot-ideas-for-enterprise-bots-4bb73281f593), [2](https://www.messengerpeople.com/best-of-8-chatbot-projects-you-will-love-to-discover/), [3](https://www.quora.com/What-are-some-cool-ideas-where-chat-bots-can-be-put-to-use), [4](https://www.wordstream.com/blog/ws/2017/10/04/chatbots), [5](https://www.ideas2it.com/blogs/50-chatbot-use-cases/)\n\n\n----\nWritten by _clone95_\n"
  },
  {
    "path": "Topics/MLSystems.md",
    "content": "## Machine Learning Systems\n\nThe following paragraphs aim to introduce in more detail how an ML system can present itself and what are the main challenges today related to the development of applications in the real world.\n\n## Types of ML systems\n\nThere are three main categories of ML systems:\n\n- Modalities of supervision (supervised, unsupervised, reinforcement learning)\n\n- Learning modes (online learning, batch learning)\n\n- Type of inference (instance-based, model-based)\n\nThese criteria are not mutually exclusive and can be combined according to the needs of the scenario: a self-driving machine could take advantage of an ML system of supervised learning, which learns through batch learning and which \"thinks\" thanks to a statistical model that allows it to make short-term predictions (\"the machine in front is braking, I will soon have to activate the brakes\").\n\n#### Supervision:\n\nThe most common learning mode is **supervised learning**. It consists of training the system through data containing the desired solution: these solutions are called labels.\n\nAn example of a \"labeled\" data could be the image of a car (the actual data) with the assigned car model (the label).\nOnce an ML system has been trained on the data and their labels, the system can input a new image and output its (supposed) label! The metrics to measure the system's \"skill\" in assigning the right label are various and will be examined in more detail in different guides.\n\nThe two most common tasks that can be tackled with supervised learning are classification and regression. A **classification** problem consists of assigning a discrete label to new input. It can be a numerical value or a category (e.g. given a picture to say if it represents a dog or a cat), but in any case, it is contained in a well-defined set of options.\n\n![Figure 1-1](./classification.png)\n\nA problem of **regression** instead consists in assigning a continuous value to the new data, for example the temperature given a moment of the year (obviously the temperature is an assigned value is a finite for practical reasons, for example, 29.34°, but the idea of regression is that the output is included in a continuous interval and not a finite set).\n\n![Figure 1-1](./regression.png)\n\nThe example we'll use to explain the difference between model-based model and instance-based model is a typical example of a regression problem (in this case linear because the straight function approximates well my distribution of points).\n\nBut what if it invents the model is programmed not to return a number, but a class? For example, it could classify the price as \"high\", \"medium\", \"low\", if in input we had associated this label to every instance of the dataset. The problem of predicting in output a label (and not a continuous value) is called classification.\n\nThe classic example is a model that is trained on a dataset of thousands of images of dogs and cats and learns to classify the new photos that are offered in one of these two categories. Classification models can learn to distinguish any number of classes, as long as they have a fairly ambitious and representative dataset!  \n\nUsually, the classification models foresee a continuous value as the probability of a given example belonging to each output class. Probabilities can be interpreted as the model's confidence that a given example belongs to each class. A predicted probability can be converted into a class value by selecting the label of the class with the highest probability.\n\nOften, however, it happens that the data collected in the real world are without labels (we will see later how this problem has impacted on the work presented in this document).\nIn this case, however, ML techniques can be applied that do not need to know what the data on them is working on, and that try to figure \"alone\" significant labels. This is **unsupervised learning**.\n\nFor example, let's imagine that we have a supermarket sales dataset containing all the purchases made by customers, cart by cart. You can extract business advice by grouping the items often purchased together and choose to put them on nearby shelves or to discount one if you buy the others.\n\nUnsupervised learning is also used as a complement to supervised learning to explore data (even if already labeled) and find other types of grouping that had not been noticed (and thus increase the amount of knowledge we have on each individual instance of the dataset).\n\n**Reinforcement learning** is something totally different. The learning system in this context is called agent and learns to solve the problem by observing the world around it (through some kind of sensor), performing actions and evaluating them (good action / bad action) based on some kind of reward (reward).\nThe agent is designed so that it tries to improve itself, adjusting its parameters of action in action and aiming to obtain a greater and greater reward.\n\nReinforcement learning is used massively in robotics, where for example a robot learns to move in the surrounding environment by learning incrementally from its mistakes (the reward decreases by slamming against a wall, instead it increases while the robot moves without collisions, encouraging it to avoid objects).\n\n#### Learning modes:\n\nAnother important feature of ML systems is that they can learn either in a one-off (batch learning) mode or in a continuous incremental (online learning) mode.\n\nIn the case of batch learning (also called offline learning), the system is trained using all available data: it is usually a long and computationally expensive process, so it is performed only once. When you want to re-train the model you have to do it again on all the data, so it's best to do it only if I have a considerable amount of new data, which can actually improve the performance of the new model (which will be trained on new + old ones).\n\nFortunately, this method of training can be easily automated so you can decide to train the model, for example, every night or every week. However, if you need a faster system to react to changes (for example for the detection of commercial fraud or symptoms of cyber attack) the best solution is online learning.\nIn the case of online learning (also called live learning) the system is trained sequentially by taking small batches of data, called mini-batches, as input. Learning from new data is cheap (in computational terms) and fast, and the system learns from on-the-fly data as it is collected.\n\nOnline learning is optimal in cases where you need a reactive system response or you have little computational power. Note that the term \"online\" does not mean that the system must be connected to a geographical network, but simply to the sensors that provide the continuous flow of data.\n\n#### Type of inference:\n\nOne last way to categorize the ML systems is by how to be generalized.\nModel-based systems aim to create a representation of knowledge (a model), which is then used to generate outputs. Instance-based systems do not generalize from an unseen input, but compare it with all previous data (saved in memory) and find its \"ideal arrangement\" among them, i.e. they try to place the data at the correct point. An example can be very useful to understand this difference.\n\n**Scenario:**\n\ngiven a series of coordinates (datum: X, Y) that constitutes our \"knowledge\" try to, given the X of a new point, understand which Y is the most appropriate.\nA strategy could be to compare the value of X of the point with that of the known points, take the nearest known point in terms of distance, and assign its Y to the new point.\n\n![Figure 1-1](./instance.png)\n\nHowever, this approach is very simplistic and is based on the strong assumption that the position of a new point is determined univocally by its closest neighbor.\n\nThe system learns its knowledge \"by heart\" and applies it blindly to new cases, applying some measure of similarity (in this case, the distance relative to the dimension X) concerning those stored.\n\nThe other approach that can be used to generalize new cases starting from the old ones, could be to create a \"representation\" or \"idea\" of how the data I have been made (the grey dots in figure 4) and use this \"idea\" (the model) to produce the Y of the new points.\nA model is, therefore, a set of parameters that, when properly adjusted, can provide a good estimate of Y, given the X of a new point. \n\nIn our case, we imagine that our model is the straight line that best approximates the series of gray points. Our parameters are the slope and the intercept of the line, and the training process of the model consists in understanding what are the numerical values of these two parameters.\n\n![Figure 1-1](./model.png)\n\nA Machine Learning model, here in its simplest version (two parameters), sometimes consists of tens of thousands or even millions of parameters. To train them, and therefore find the \"good values\" of the parameters, a lot of computing power is needed, and the optimization of the process of training the models is a heartfelt and urgent topic of research.\n\n## Main challenges of Machine Learning\n\n### Insufficient amount of data\n\nThe key assumption of Machine Learning is that you have the data you need to train models and use them later to solve problems.\nIt may happen that in the real world the data you have is not enough to train a model to accurately recognize patterns that might be interesting for the purpose of the problem.\n\nEven for simple problems, thousands of examples are needed, and for complex problems such as image recognition or voice recognition, millions of examples may be needed.\n\nVarious organizations are moving to create open data platforms to share datasets and allow the development of otherwise unattainable applications. \nThe issue of labeling (labeling data for supervised learning) is crucial today. Services such as CloudFactory or AWS Mechanical Turk seek to address this need by connecting organizations in need of workforce to label data, and the workforce itself. Services of this type have certain limitations, such as the accuracy of the labeling and the time needed to perform it.\n\n### Low quality and unrepresentative data\n\nAnother very common problem with data on which to train models is their poor quality. Missing, poorly formatted, or even incorrect data can be fatal to a Machine Learning project. Ideally, high-quality data should be produced directly, but projects are often started on existing (and low quality) data.\n\nFor this reason, one of the most important (and time-consuming!) steps in developing an ML application is data pre-processing. Pre-processing the data consists in cleaning it up and preparing it for the Machine Learning model that we will have to train: we remove the individual damaged examples, we adjust the format of the strings and we manage the missing fields (missing values). The pre-processing phase is totally context-dependent and can take very different forms.\n\nIn this phase we usually try to increase the size of the dataset we are using: for example, if we have a dataset of images, we can think of adding a copy of each image to the dataset, but in a version rotated by 90°, or blurred by some kind of noise. This technique, called data augmentation, is particularly useful to increase the robustness of our application (because the model is trained to see also damaged/distorted images and recognize them anyway), but generally does not add \"new information\", which can only be achieved with additional data.\n\nOften you can also run into unrepresentative data: a model, to generalize effectively, must have seen a variety of cases (data) that covers most situations, and that represents reality in a realistic way. \n\nFor example, let's consider a dataset of temperatures collected in the various days of the year. The task is to predict the temperature given on the day of the year. If we only have the November temperatures, how does the model discover the April temperature pattern? Even worse, if that particular November was particularly hot and therefore not representative, we risk getting a model that makes misleading predictions! \n\nThink about the suggestive fact that a random model (for example the generation of a random number within the range [temp. MIN - temp. MAX]) can easily obtain better performance than a model trained on unrepresentative data!\n\n### Underfitting\n\nThe problem of underfitting occurs when the model we have chosen is too simple (a few parameters) to effectively represent a generalization of the dataset, and therefore fail to capture the patterns that occur in the data. \n\nFor example, if we wanted to use a linear model to classify images of dogs and cats, we would probably get unacceptable performances, because the linear model cannot capture the complexity of the data on which we train it.\n\nUsually, a solution to underfitting consists in trying to train more complex models (for example a neural network, which can have even millions of parameters), which can \"take into account\" all the variables that could have a weight in the choice of the output. For example, in a 64 x 64 pixels image, 4096 possible points can influence the result! A model with few parameters can hardly handle this complexity.\n\n### Overfitting\n\nThe concept of overfitting occurs in the opposite case to what has just been explained, i.e. when a model is \"too complex\" for the assigned task.\n\nFor example, to train a neural network for the example of the price of houses would be ineffective because the network would learn so well to represent the dataset, that the resulting model would be mere storage of data! A model that suffers from overfitting is not able to generalize well because it can not \"detach\" from the only representation of the world it knows, or the dataset on which it was trained.\n\nThe tradeoff between the complexity of the model (number of parameters that can be modified), the amount of data available and the difficulty of the task are one of the key concepts behind the choice of the model architecture.\nBelow is a figure that represents three different situations where a model must classify if a point, given in input its two-dimensional coordinates, is red or blue:\n\n- Underfitting, the model is too simple (for example, a linear model) and fails to grasp the complexity of the dataset\n- Fitting appropriate, the model grasps the general \"idea\" of how the data is distracted, which does not try to change too much to represent each point\n- Overfitting, the model modifies itself heavily to represent every point, but consequently \"memorizes\" the data of training, struggling, therefore, to generalize later.\n\n![Figure 1-1](./overfitting.png)\n\nHopefully now you should be more comfortable with high-level ideas of how ML systems are classified and you should have a clear idea of what the classification and regression tasks are.\n\nIf you like Virgilio's content and share our vision of open education accessible to all, share and register in the Google Form, you'll be updated every time a new guide comes out!\n\n\n------------------\n\nWritten by [_clone95_](https://github.com/clone95)\n"
  },
  {
    "path": "Topics/NLP/NLP.ipynb",
    "content": "{\n  \"nbformat\": 4,\n  \"nbformat_minor\": 0,\n  \"metadata\": {\n    \"colab\": {\n      \"name\": \"NLP.ipynb\",\n      \"provenance\": [],\n      \"collapsed_sections\": []\n    },\n    \"kernelspec\": {\n      \"name\": \"python3\",\n      \"display_name\": \"Python 3\"\n    },\n    \"widgets\": {\n      \"application/vnd.jupyter.widget-state+json\": {\n        \"26d196cb3b5f49d6a58b0b6a7faa0a2e\": {\n          \"model_module\": \"@jupyter-widgets/controls\",\n          \"model_name\": \"HBoxModel\",\n          \"state\": {\n            \"_view_name\": \"HBoxView\",\n            \"_dom_classes\": [],\n            \"_model_name\": \"HBoxModel\",\n            \"_view_module\": \"@jupyter-widgets/controls\",\n            \"_model_module_version\": \"1.5.0\",\n            \"_view_count\": null,\n            \"_view_module_version\": \"1.5.0\",\n            \"box_style\": \"\",\n            \"layout\": \"IPY_MODEL_5fdd366777c944299f8c7a240ab58f3d\",\n            \"_model_module\": \"@jupyter-widgets/controls\",\n            \"children\": [\n              \"IPY_MODEL_2b23898947884633a3b1665aa28e6e5f\",\n              \"IPY_MODEL_28513edb62ff4bd1b1c42c128031af13\"\n            ]\n          }\n        },\n        \"5fdd366777c944299f8c7a240ab58f3d\": {\n          \"model_module\": \"@jupyter-widgets/base\",\n          \"model_name\": \"LayoutModel\",\n          \"state\": {\n            \"_view_name\": \"LayoutView\",\n            \"grid_template_rows\": null,\n            \"right\": null,\n            \"justify_content\": null,\n            \"_view_module\": \"@jupyter-widgets/base\",\n            \"overflow\": null,\n            \"_model_module_version\": \"1.2.0\",\n            \"_view_count\": null,\n            \"flex_flow\": null,\n            \"width\": null,\n            \"min_width\": null,\n            \"border\": null,\n            \"align_items\": null,\n            \"bottom\": null,\n            \"_model_module\": \"@jupyter-widgets/base\",\n            \"top\": null,\n            \"grid_column\": null,\n            \"overflow_y\": null,\n            \"overflow_x\": null,\n            \"grid_auto_flow\": null,\n            \"grid_area\": null,\n            \"grid_template_columns\": null,\n            \"flex\": null,\n            \"_model_name\": \"LayoutModel\",\n            \"justify_items\": null,\n            \"grid_row\": null,\n            \"max_height\": null,\n            \"align_content\": null,\n            \"visibility\": null,\n            \"align_self\": null,\n            \"height\": null,\n            \"min_height\": null,\n            \"padding\": null,\n            \"grid_auto_rows\": null,\n            \"grid_gap\": null,\n            \"max_width\": null,\n            \"order\": null,\n            \"_view_module_version\": \"1.2.0\",\n            \"grid_template_areas\": null,\n            \"object_position\": null,\n            \"object_fit\": null,\n            \"grid_auto_columns\": null,\n            \"margin\": null,\n            \"display\": null,\n            \"left\": null\n          }\n        },\n        \"2b23898947884633a3b1665aa28e6e5f\": {\n          \"model_module\": \"@jupyter-widgets/controls\",\n          \"model_name\": \"FloatProgressModel\",\n          \"state\": {\n            \"_view_name\": \"ProgressView\",\n            \"style\": \"IPY_MODEL_09a408e10a6547288d4e612f41e9c22c\",\n            \"_dom_classes\": [],\n            \"description\": \"Downloading: 100%\",\n            \"_model_name\": \"FloatProgressModel\",\n            \"bar_style\": \"success\",\n            \"max\": 995526,\n            \"_view_module\": \"@jupyter-widgets/controls\",\n            \"_model_module_version\": \"1.5.0\",\n            \"value\": 995526,\n            \"_view_count\": null,\n            \"_view_module_version\": \"1.5.0\",\n            \"orientation\": \"horizontal\",\n            \"min\": 0,\n            \"description_tooltip\": null,\n            \"_model_module\": \"@jupyter-widgets/controls\",\n            \"layout\": \"IPY_MODEL_dabd1b28f0c14cb0ad6b05d0b7bf23c3\"\n          }\n        },\n        \"28513edb62ff4bd1b1c42c128031af13\": {\n          \"model_module\": \"@jupyter-widgets/controls\",\n          \"model_name\": \"HTMLModel\",\n          \"state\": {\n            \"_view_name\": \"HTMLView\",\n            \"style\": \"IPY_MODEL_f1f32bc6978347abb8371d1e2bd4d1fb\",\n            \"_dom_classes\": [],\n            \"description\": \"\",\n            \"_model_name\": \"HTMLModel\",\n            \"placeholder\": \"​\",\n            \"_view_module\": \"@jupyter-widgets/controls\",\n            \"_model_module_version\": \"1.5.0\",\n            \"value\": \" 996k/996k [00:01&lt;00:00, 796kB/s]\",\n            \"_view_count\": null,\n            \"_view_module_version\": \"1.5.0\",\n            \"description_tooltip\": null,\n            \"_model_module\": \"@jupyter-widgets/controls\",\n            \"layout\": \"IPY_MODEL_eeca8d2b0a6e45e7af4706afe125ea5a\"\n          }\n        },\n        \"09a408e10a6547288d4e612f41e9c22c\": {\n          \"model_module\": \"@jupyter-widgets/controls\",\n          \"model_name\": \"ProgressStyleModel\",\n          \"state\": {\n            \"_view_name\": \"StyleView\",\n            \"_model_name\": \"ProgressStyleModel\",\n            \"description_width\": \"initial\",\n            \"_view_module\": \"@jupyter-widgets/base\",\n            \"_model_module_version\": \"1.5.0\",\n            \"_view_count\": null,\n            \"_view_module_version\": \"1.2.0\",\n            \"bar_color\": null,\n            \"_model_module\": \"@jupyter-widgets/controls\"\n          }\n        },\n        \"dabd1b28f0c14cb0ad6b05d0b7bf23c3\": {\n          \"model_module\": \"@jupyter-widgets/base\",\n          \"model_name\": \"LayoutModel\",\n          \"state\": {\n            \"_view_name\": \"LayoutView\",\n            \"grid_template_rows\": null,\n            \"right\": null,\n            \"justify_content\": null,\n            \"_view_module\": \"@jupyter-widgets/base\",\n            \"overflow\": null,\n            \"_model_module_version\": \"1.2.0\",\n            \"_view_count\": null,\n            \"flex_flow\": null,\n            \"width\": null,\n            \"min_width\": null,\n            \"border\": null,\n            \"align_items\": null,\n            \"bottom\": null,\n            \"_model_module\": \"@jupyter-widgets/base\",\n            \"top\": null,\n            \"grid_column\": null,\n            \"overflow_y\": null,\n            \"overflow_x\": null,\n            \"grid_auto_flow\": null,\n            \"grid_area\": null,\n            \"grid_template_columns\": null,\n            \"flex\": null,\n            \"_model_name\": \"LayoutModel\",\n            \"justify_items\": null,\n            \"grid_row\": null,\n            \"max_height\": null,\n            \"align_content\": null,\n            \"visibility\": null,\n            \"align_self\": null,\n            \"height\": null,\n            \"min_height\": null,\n            \"padding\": null,\n            \"grid_auto_rows\": null,\n            \"grid_gap\": null,\n            \"max_width\": null,\n            \"order\": null,\n            \"_view_module_version\": \"1.2.0\",\n            \"grid_template_areas\": null,\n            \"object_position\": null,\n            \"object_fit\": null,\n            \"grid_auto_columns\": null,\n            \"margin\": null,\n            \"display\": null,\n            \"left\": null\n          }\n        },\n        \"f1f32bc6978347abb8371d1e2bd4d1fb\": {\n          \"model_module\": \"@jupyter-widgets/controls\",\n          \"model_name\": \"DescriptionStyleModel\",\n          \"state\": {\n            \"_view_name\": \"StyleView\",\n            \"_model_name\": \"DescriptionStyleModel\",\n            \"description_width\": \"\",\n            \"_view_module\": \"@jupyter-widgets/base\",\n            \"_model_module_version\": \"1.5.0\",\n            \"_view_count\": null,\n            \"_view_module_version\": \"1.2.0\",\n            \"_model_module\": \"@jupyter-widgets/controls\"\n          }\n        },\n        \"eeca8d2b0a6e45e7af4706afe125ea5a\": {\n          \"model_module\": \"@jupyter-widgets/base\",\n          \"model_name\": \"LayoutModel\",\n          \"state\": {\n            \"_view_name\": \"LayoutView\",\n            \"grid_template_rows\": null,\n            \"right\": null,\n            \"justify_content\": null,\n            \"_view_module\": \"@jupyter-widgets/base\",\n            \"overflow\": null,\n            \"_model_module_version\": \"1.2.0\",\n            \"_view_count\": null,\n            \"flex_flow\": null,\n            \"width\": null,\n            \"min_width\": null,\n            \"border\": null,\n            \"align_items\": null,\n            \"bottom\": null,\n            \"_model_module\": \"@jupyter-widgets/base\",\n            \"top\": null,\n            \"grid_column\": null,\n            \"overflow_y\": null,\n            \"overflow_x\": null,\n            \"grid_auto_flow\": null,\n            \"grid_area\": null,\n            \"grid_template_columns\": null,\n            \"flex\": null,\n            \"_model_name\": \"LayoutModel\",\n            \"justify_items\": null,\n            \"grid_row\": null,\n            \"max_height\": null,\n            \"align_content\": null,\n            \"visibility\": null,\n            \"align_self\": null,\n            \"height\": null,\n            \"min_height\": null,\n            \"padding\": null,\n            \"grid_auto_rows\": null,\n            \"grid_gap\": null,\n            \"max_width\": null,\n            \"order\": null,\n            \"_view_module_version\": \"1.2.0\",\n            \"grid_template_areas\": null,\n            \"object_position\": null,\n            \"object_fit\": null,\n            \"grid_auto_columns\": null,\n            \"margin\": null,\n            \"display\": null,\n            \"left\": null\n          }\n        },\n        \"a82d7eb6f6da4a2295774b3a2f54106d\": {\n          \"model_module\": \"@jupyter-widgets/controls\",\n          \"model_name\": \"HBoxModel\",\n          \"state\": {\n            \"_view_name\": \"HBoxView\",\n            \"_dom_classes\": [],\n            \"_model_name\": \"HBoxModel\",\n            \"_view_module\": \"@jupyter-widgets/controls\",\n            \"_model_module_version\": \"1.5.0\",\n            \"_view_count\": null,\n            \"_view_module_version\": \"1.5.0\",\n            \"box_style\": \"\",\n            \"layout\": \"IPY_MODEL_0a24dd5f66a742f39caa3eab73c672c3\",\n            \"_model_module\": \"@jupyter-widgets/controls\",\n            \"children\": [\n              \"IPY_MODEL_d366b5da53864a608c6c0ffe846c53db\",\n              \"IPY_MODEL_d108aa37d71947f8ad71d971dac279a9\"\n            ]\n          }\n        },\n        \"0a24dd5f66a742f39caa3eab73c672c3\": {\n          \"model_module\": \"@jupyter-widgets/base\",\n          \"model_name\": \"LayoutModel\",\n          \"state\": {\n            \"_view_name\": \"LayoutView\",\n            \"grid_template_rows\": null,\n            \"right\": null,\n            \"justify_content\": null,\n            \"_view_module\": \"@jupyter-widgets/base\",\n            \"overflow\": null,\n            \"_model_module_version\": \"1.2.0\",\n            \"_view_count\": null,\n            \"flex_flow\": null,\n            \"width\": null,\n            \"min_width\": null,\n            \"border\": null,\n            \"align_items\": null,\n            \"bottom\": null,\n            \"_model_module\": \"@jupyter-widgets/base\",\n            \"top\": null,\n            \"grid_column\": null,\n            \"overflow_y\": null,\n            \"overflow_x\": null,\n            \"grid_auto_flow\": null,\n            \"grid_area\": null,\n            \"grid_template_columns\": null,\n            \"flex\": null,\n            \"_model_name\": \"LayoutModel\",\n            \"justify_items\": null,\n            \"grid_row\": null,\n            \"max_height\": null,\n            \"align_content\": null,\n            \"visibility\": null,\n            \"align_self\": null,\n            \"height\": null,\n            \"min_height\": null,\n            \"padding\": null,\n            \"grid_auto_rows\": null,\n            \"grid_gap\": null,\n            \"max_width\": null,\n            \"order\": null,\n            \"_view_module_version\": \"1.2.0\",\n            \"grid_template_areas\": null,\n            \"object_position\": null,\n            \"object_fit\": null,\n            \"grid_auto_columns\": null,\n            \"margin\": null,\n            \"display\": null,\n            \"left\": null\n          }\n        },\n        \"d366b5da53864a608c6c0ffe846c53db\": {\n          \"model_module\": \"@jupyter-widgets/controls\",\n          \"model_name\": \"FloatProgressModel\",\n          \"state\": {\n            \"_view_name\": \"ProgressView\",\n            \"style\": \"IPY_MODEL_1c890a5539a94bfbac57d65043dc5f37\",\n            \"_dom_classes\": [],\n            \"description\": \"Downloading: 100%\",\n            \"_model_name\": \"FloatProgressModel\",\n            \"bar_style\": \"success\",\n            \"max\": 625,\n            \"_view_module\": \"@jupyter-widgets/controls\",\n            \"_model_module_version\": \"1.5.0\",\n            \"value\": 625,\n            \"_view_count\": null,\n            \"_view_module_version\": \"1.5.0\",\n            \"orientation\": \"horizontal\",\n            \"min\": 0,\n            \"description_tooltip\": null,\n            \"_model_module\": \"@jupyter-widgets/controls\",\n            \"layout\": \"IPY_MODEL_fd3d34b2f3124a098d0ee511050cbe72\"\n          }\n        },\n        \"d108aa37d71947f8ad71d971dac279a9\": {\n          \"model_module\": \"@jupyter-widgets/controls\",\n          \"model_name\": \"HTMLModel\",\n          \"state\": {\n            \"_view_name\": \"HTMLView\",\n            \"style\": \"IPY_MODEL_d005e65a5bef424aa9e1c02707a3c5f8\",\n            \"_dom_classes\": [],\n            \"description\": \"\",\n            \"_model_name\": \"HTMLModel\",\n            \"placeholder\": \"​\",\n            \"_view_module\": \"@jupyter-widgets/controls\",\n            \"_model_module_version\": \"1.5.0\",\n            \"value\": \" 625/625 [00:01&lt;00:00, 550B/s]\",\n            \"_view_count\": null,\n            \"_view_module_version\": \"1.5.0\",\n            \"description_tooltip\": null,\n            \"_model_module\": \"@jupyter-widgets/controls\",\n            \"layout\": \"IPY_MODEL_6a5d680bbe98498081004a1217cbeba7\"\n          }\n        },\n        \"1c890a5539a94bfbac57d65043dc5f37\": {\n          \"model_module\": \"@jupyter-widgets/controls\",\n          \"model_name\": \"ProgressStyleModel\",\n          \"state\": {\n            \"_view_name\": \"StyleView\",\n            \"_model_name\": \"ProgressStyleModel\",\n            \"description_width\": \"initial\",\n            \"_view_module\": \"@jupyter-widgets/base\",\n            \"_model_module_version\": \"1.5.0\",\n            \"_view_count\": null,\n            \"_view_module_version\": \"1.2.0\",\n            \"bar_color\": null,\n            \"_model_module\": \"@jupyter-widgets/controls\"\n          }\n        },\n        \"fd3d34b2f3124a098d0ee511050cbe72\": {\n          \"model_module\": \"@jupyter-widgets/base\",\n          \"model_name\": \"LayoutModel\",\n          \"state\": {\n            \"_view_name\": \"LayoutView\",\n            \"grid_template_rows\": null,\n            \"right\": null,\n            \"justify_content\": null,\n            \"_view_module\": \"@jupyter-widgets/base\",\n            \"overflow\": null,\n            \"_model_module_version\": \"1.2.0\",\n            \"_view_count\": null,\n            \"flex_flow\": null,\n            \"width\": null,\n            \"min_width\": null,\n            \"border\": null,\n            \"align_items\": null,\n            \"bottom\": null,\n            \"_model_module\": \"@jupyter-widgets/base\",\n            \"top\": null,\n            \"grid_column\": null,\n            \"overflow_y\": null,\n            \"overflow_x\": null,\n            \"grid_auto_flow\": null,\n            \"grid_area\": null,\n            \"grid_template_columns\": null,\n            \"flex\": null,\n            \"_model_name\": \"LayoutModel\",\n            \"justify_items\": null,\n            \"grid_row\": null,\n            \"max_height\": null,\n            \"align_content\": null,\n            \"visibility\": null,\n            \"align_self\": null,\n            \"height\": null,\n            \"min_height\": null,\n            \"padding\": null,\n            \"grid_auto_rows\": null,\n            \"grid_gap\": null,\n            \"max_width\": null,\n            \"order\": null,\n            \"_view_module_version\": \"1.2.0\",\n            \"grid_template_areas\": null,\n            \"object_position\": null,\n            \"object_fit\": null,\n            \"grid_auto_columns\": null,\n            \"margin\": null,\n            \"display\": null,\n            \"left\": null\n          }\n        },\n        \"d005e65a5bef424aa9e1c02707a3c5f8\": {\n          \"model_module\": \"@jupyter-widgets/controls\",\n          \"model_name\": \"DescriptionStyleModel\",\n          \"state\": {\n            \"_view_name\": \"StyleView\",\n            \"_model_name\": \"DescriptionStyleModel\",\n            \"description_width\": \"\",\n            \"_view_module\": \"@jupyter-widgets/base\",\n            \"_model_module_version\": \"1.5.0\",\n            \"_view_count\": null,\n            \"_view_module_version\": \"1.2.0\",\n            \"_model_module\": \"@jupyter-widgets/controls\"\n          }\n        },\n        \"6a5d680bbe98498081004a1217cbeba7\": {\n          \"model_module\": \"@jupyter-widgets/base\",\n          \"model_name\": \"LayoutModel\",\n          \"state\": {\n            \"_view_name\": \"LayoutView\",\n            \"grid_template_rows\": null,\n            \"right\": null,\n            \"justify_content\": null,\n            \"_view_module\": \"@jupyter-widgets/base\",\n            \"overflow\": null,\n            \"_model_module_version\": \"1.2.0\",\n            \"_view_count\": null,\n            \"flex_flow\": null,\n            \"width\": null,\n            \"min_width\": null,\n            \"border\": null,\n            \"align_items\": null,\n            \"bottom\": null,\n            \"_model_module\": \"@jupyter-widgets/base\",\n            \"top\": null,\n            \"grid_column\": null,\n            \"overflow_y\": null,\n            \"overflow_x\": null,\n            \"grid_auto_flow\": null,\n            \"grid_area\": null,\n            \"grid_template_columns\": null,\n            \"flex\": null,\n            \"_model_name\": \"LayoutModel\",\n            \"justify_items\": null,\n            \"grid_row\": null,\n            \"max_height\": null,\n            \"align_content\": null,\n            \"visibility\": null,\n            \"align_self\": null,\n            \"height\": null,\n            \"min_height\": null,\n            \"padding\": null,\n            \"grid_auto_rows\": null,\n            \"grid_gap\": null,\n            \"max_width\": null,\n            \"order\": null,\n            \"_view_module_version\": \"1.2.0\",\n            \"grid_template_areas\": null,\n            \"object_position\": null,\n            \"object_fit\": null,\n            \"grid_auto_columns\": null,\n            \"margin\": null,\n            \"display\": null,\n            \"left\": null\n          }\n        },\n        \"245d2aa69c55432a90c0913a67dc0dac\": {\n          \"model_module\": \"@jupyter-widgets/controls\",\n          \"model_name\": \"HBoxModel\",\n          \"state\": {\n            \"_view_name\": \"HBoxView\",\n            \"_dom_classes\": [],\n            \"_model_name\": \"HBoxModel\",\n            \"_view_module\": \"@jupyter-widgets/controls\",\n            \"_model_module_version\": \"1.5.0\",\n            \"_view_count\": null,\n            \"_view_module_version\": \"1.5.0\",\n            \"box_style\": \"\",\n            \"layout\": \"IPY_MODEL_bd8e18d533e1435db1f1908ca4798140\",\n            \"_model_module\": \"@jupyter-widgets/controls\",\n            \"children\": [\n              \"IPY_MODEL_133a80bb45ef4ad4bf94db7869ef1474\",\n              \"IPY_MODEL_84ef678210cf4863970374c073753e05\"\n            ]\n          }\n        },\n        \"bd8e18d533e1435db1f1908ca4798140\": {\n          \"model_module\": \"@jupyter-widgets/base\",\n          \"model_name\": \"LayoutModel\",\n          \"state\": {\n            \"_view_name\": \"LayoutView\",\n            \"grid_template_rows\": null,\n            \"right\": null,\n            \"justify_content\": null,\n            \"_view_module\": \"@jupyter-widgets/base\",\n            \"overflow\": null,\n            \"_model_module_version\": \"1.2.0\",\n            \"_view_count\": null,\n            \"flex_flow\": null,\n            \"width\": null,\n            \"min_width\": null,\n            \"border\": null,\n            \"align_items\": null,\n            \"bottom\": null,\n            \"_model_module\": \"@jupyter-widgets/base\",\n            \"top\": null,\n            \"grid_column\": null,\n            \"overflow_y\": null,\n            \"overflow_x\": null,\n            \"grid_auto_flow\": null,\n            \"grid_area\": null,\n            \"grid_template_columns\": null,\n            \"flex\": null,\n            \"_model_name\": \"LayoutModel\",\n            \"justify_items\": null,\n            \"grid_row\": null,\n            \"max_height\": null,\n            \"align_content\": null,\n            \"visibility\": null,\n            \"align_self\": null,\n            \"height\": null,\n            \"min_height\": null,\n            \"padding\": null,\n            \"grid_auto_rows\": null,\n            \"grid_gap\": null,\n            \"max_width\": null,\n            \"order\": null,\n            \"_view_module_version\": \"1.2.0\",\n            \"grid_template_areas\": null,\n            \"object_position\": null,\n            \"object_fit\": null,\n            \"grid_auto_columns\": null,\n            \"margin\": null,\n            \"display\": null,\n            \"left\": null\n          }\n        },\n        \"133a80bb45ef4ad4bf94db7869ef1474\": {\n          \"model_module\": \"@jupyter-widgets/controls\",\n          \"model_name\": \"FloatProgressModel\",\n          \"state\": {\n            \"_view_name\": \"ProgressView\",\n            \"style\": \"IPY_MODEL_e54b31e969ff450e842a0ff6a01e8559\",\n            \"_dom_classes\": [],\n            \"description\": \"Downloading: 100%\",\n            \"_model_name\": \"FloatProgressModel\",\n            \"bar_style\": \"success\",\n            \"max\": 714314041,\n            \"_view_module\": \"@jupyter-widgets/controls\",\n            \"_model_module_version\": \"1.5.0\",\n            \"value\": 714314041,\n            \"_view_count\": null,\n            \"_view_module_version\": \"1.5.0\",\n            \"orientation\": \"horizontal\",\n            \"min\": 0,\n            \"description_tooltip\": null,\n            \"_model_module\": \"@jupyter-widgets/controls\",\n            \"layout\": \"IPY_MODEL_d6dcbc869f564caeaf71d1297412601e\"\n          }\n        },\n        \"84ef678210cf4863970374c073753e05\": {\n          \"model_module\": \"@jupyter-widgets/controls\",\n          \"model_name\": \"HTMLModel\",\n          \"state\": {\n            \"_view_name\": \"HTMLView\",\n            \"style\": \"IPY_MODEL_21470668fa4b47579b10194b507ab3d9\",\n            \"_dom_classes\": [],\n            \"description\": \"\",\n            \"_model_name\": \"HTMLModel\",\n            \"placeholder\": \"​\",\n            \"_view_module\": \"@jupyter-widgets/controls\",\n            \"_model_module_version\": \"1.5.0\",\n            \"value\": \" 714M/714M [05:45&lt;00:00, 2.06MB/s]\",\n            \"_view_count\": null,\n            \"_view_module_version\": \"1.5.0\",\n            \"description_tooltip\": null,\n            \"_model_module\": \"@jupyter-widgets/controls\",\n            \"layout\": \"IPY_MODEL_3307884b360343e0899983db9aa76683\"\n          }\n        },\n        \"e54b31e969ff450e842a0ff6a01e8559\": {\n          \"model_module\": \"@jupyter-widgets/controls\",\n          \"model_name\": \"ProgressStyleModel\",\n          \"state\": {\n            \"_view_name\": \"StyleView\",\n            \"_model_name\": \"ProgressStyleModel\",\n            \"description_width\": \"initial\",\n            \"_view_module\": \"@jupyter-widgets/base\",\n            \"_model_module_version\": \"1.5.0\",\n            \"_view_count\": null,\n            \"_view_module_version\": \"1.2.0\",\n            \"bar_color\": null,\n            \"_model_module\": \"@jupyter-widgets/controls\"\n          }\n        },\n        \"d6dcbc869f564caeaf71d1297412601e\": {\n          \"model_module\": \"@jupyter-widgets/base\",\n          \"model_name\": \"LayoutModel\",\n          \"state\": {\n            \"_view_name\": \"LayoutView\",\n            \"grid_template_rows\": null,\n            \"right\": null,\n            \"justify_content\": null,\n            \"_view_module\": \"@jupyter-widgets/base\",\n            \"overflow\": null,\n            \"_model_module_version\": \"1.2.0\",\n            \"_view_count\": null,\n            \"flex_flow\": null,\n            \"width\": null,\n            \"min_width\": null,\n            \"border\": null,\n            \"align_items\": null,\n            \"bottom\": null,\n            \"_model_module\": \"@jupyter-widgets/base\",\n            \"top\": null,\n            \"grid_column\": null,\n            \"overflow_y\": null,\n            \"overflow_x\": null,\n            \"grid_auto_flow\": null,\n            \"grid_area\": null,\n            \"grid_template_columns\": null,\n            \"flex\": null,\n            \"_model_name\": \"LayoutModel\",\n            \"justify_items\": null,\n            \"grid_row\": null,\n            \"max_height\": null,\n            \"align_content\": null,\n            \"visibility\": null,\n            \"align_self\": null,\n            \"height\": null,\n            \"min_height\": null,\n            \"padding\": null,\n            \"grid_auto_rows\": null,\n            \"grid_gap\": null,\n            \"max_width\": null,\n            \"order\": null,\n            \"_view_module_version\": \"1.2.0\",\n            \"grid_template_areas\": null,\n            \"object_position\": null,\n            \"object_fit\": null,\n            \"grid_auto_columns\": null,\n            \"margin\": null,\n            \"display\": null,\n            \"left\": null\n          }\n        },\n        \"21470668fa4b47579b10194b507ab3d9\": {\n          \"model_module\": \"@jupyter-widgets/controls\",\n          \"model_name\": \"DescriptionStyleModel\",\n          \"state\": {\n            \"_view_name\": \"StyleView\",\n            \"_model_name\": \"DescriptionStyleModel\",\n            \"description_width\": \"\",\n            \"_view_module\": \"@jupyter-widgets/base\",\n            \"_model_module_version\": \"1.5.0\",\n            \"_view_count\": null,\n            \"_view_module_version\": \"1.2.0\",\n            \"_model_module\": \"@jupyter-widgets/controls\"\n          }\n        },\n        \"3307884b360343e0899983db9aa76683\": {\n          \"model_module\": \"@jupyter-widgets/base\",\n          \"model_name\": \"LayoutModel\",\n          \"state\": {\n            \"_view_name\": \"LayoutView\",\n            \"grid_template_rows\": null,\n            \"right\": null,\n            \"justify_content\": null,\n            \"_view_module\": \"@jupyter-widgets/base\",\n            \"overflow\": null,\n            \"_model_module_version\": \"1.2.0\",\n            \"_view_count\": null,\n            \"flex_flow\": null,\n            \"width\": null,\n            \"min_width\": null,\n            \"border\": null,\n            \"align_items\": null,\n            \"bottom\": null,\n            \"_model_module\": \"@jupyter-widgets/base\",\n            \"top\": null,\n            \"grid_column\": null,\n            \"overflow_y\": null,\n            \"overflow_x\": null,\n            \"grid_auto_flow\": null,\n            \"grid_area\": null,\n            \"grid_template_columns\": null,\n            \"flex\": null,\n            \"_model_name\": \"LayoutModel\",\n            \"justify_items\": null,\n            \"grid_row\": null,\n            \"max_height\": null,\n            \"align_content\": null,\n            \"visibility\": null,\n            \"align_self\": null,\n            \"height\": null,\n            \"min_height\": null,\n            \"padding\": null,\n            \"grid_auto_rows\": null,\n            \"grid_gap\": null,\n            \"max_width\": null,\n            \"order\": null,\n            \"_view_module_version\": \"1.2.0\",\n            \"grid_template_areas\": null,\n            \"object_position\": null,\n            \"object_fit\": null,\n            \"grid_auto_columns\": null,\n            \"margin\": null,\n            \"display\": null,\n            \"left\": null\n          }\n        }\n      }\n    }\n  },\n  \"cells\": [\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"1nNV8g_N0mxv\"\n      },\n      \"source\": [\n        \"# Introduction to Automatic Natural Language Processing (ANLP)\\n\",\n        \"\\n\",\n        \"**Patical Guide**\\n\",\n        \" \\n\",\n        \"![image.png](data:image/png;base64,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)\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"## Natural Language Processing: Definition and steps\\n\",\n        \"Automated Natural Language Processing (ANLP), also known as Natural Language Processing (NLP), is one of the most active research areas in data science today. It is a field at the intersection of Deep Learning and linguistics. Its goal is to extract semantic information from text content.\\n\",\n        \"\\n\",\n        \"Natural Language Processing (NLP) has been used in many real-world applications, such as:\\n\",\n        \"\\n\",\n        \"- Machine Translation;\\n\",\n        \"- Spelling Check;\\n\",\n        \"- Speech Recognition;\\n\",\n        \"- Text Classification;\\n\",\n        \"- Extract named entities from text;\\n\",\n        \"- ...\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"The NLP pipeline generally consists of three main steps:\\n\",\n        \"\\n\",\n        \"1. **Pre-processing:** a step to normalize the text and make it easier to use in the next stages of the algorithm;\\n\",\n        \"2. **Represent text as a vector:** this step can be performed using Bag of Words (BoWs) or Term Frequency-Inverse Document Frequency (Tf-IdF) techniques. The vector representation (i.e. word embedding) can also be learned by Deep Learning algorithms.\\n\",\n        \"**3. Classification:** a task of mapping out similar sentences.\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"This guide will cover the most common NLP tasks where specific tools are involved. All these tasks are mainly done with SpaCy, an open-source software library that provides pre-trained models for a variety of applications, including named entity recognition. [SpaCy](https://spacy.io/) is an NLP library that uses Python, which is the main alternative to  [NLTK (Natural Language Tool Kit)](https://www.nltk.org/), offering a lot of features and possibilities that make it very useful.\\n\",\n        \"\\n\",\n        \"More details on this topic can be found in the following projects and tutorials:\\n\",\n        \"- [Advanced-NLP-Projects-with-TensorFlow-2.0](https://github.com/PacktPublishing/Advanced-NLP-Projects-with-TensorFlow-2.0)\\n\",\n        \"- [20 NLP projects GitHub Repo](https://www.kaggle.com/getting-started/89390)\\n\",\n        \"- [NLP](https://github.com/ChunML/NLP)\\n\",\n        \"- [Text-Prediction-NLP](https://github.com/amanbhagat77/Text-Prediction-NLP)\\n\",\n        \"- [Natural Language Processing (NLP) with Python — Tutorial\\n\",\n        \"](https://medium.com/towards-artificial-intelligence/natural-language-processing-nlp-with-python-tutorial-for-beginners-1f54e610a1a0)\\n\",\n        \"- [Natural Language Processing\\n\",\n        \"](https://www.kaggle.com/learn/natural-language-processing)\\n\",\n        \"\\n\",\n        \"Here is a selection of the best practical books that will allow you to learn the different aspects of NLP:\\n\",\n        \"\\n\",\n        \"1. [Natural Language Processing with Python](http://www.nltk.org/book/)\\n\",\n        \"2. [Foundations of Statistical Natural Language Processing](https://nlp.stanford.edu/fsnlp/promo/)\\n\",\n        \"3. [Speech and Language Processing: An Introduction to Natural Language Processing, Computational Linguistics and Speech Recognition](https://www.amazon.it/Speech-Language-Processing-Introduction-Computational/dp/0131873210)\\n\",\n        \"4. [The Oxford Handbook of Computational Linguistics](http://course.duruofei.com/wp-content/uploads/2015/05/Clark_Computational-Linguistics-and-Natrual-Language-Processing.pdf)\\n\",\n        \"5. [Neural Network Methods in Natural Language Processing (Synthesis Lectures on Human Language Technologies)](https://www.amazon.com/dp/1627052984?tag=inspiredalgor-20)\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"You’re going to need some frameworks for NLP to continue that innovation, and here are some of the best ones around:\\n\",\n        \"\\n\",\n        \"- [SpaCy](https://spacy.io/)\\n\",\n        \"- [PyTorch](https://pytorch.org/)\\n\",\n        \"- [Facebook AI XLM/mBERT\\n\",\n        \"](https://github.com/facebookresearch/XLM)\\n\",\n        \"- [Baidu ERNIE\\n\",\n        \"](https://github.com/PaddlePaddle/ERNIE)\\n\",\n        \"- [TensorFlow](https://www.tensorflow.org/tutorials/images/transfer_learning)\\n\",\n        \"- [Stanford CoreNLP\\n\",\n        \"](https://stanfordnlp.github.io/CoreNLP/)\\n\",\n        \"- [Gensim](https://pypi.org/project/gensim/)\\n\",\n        \"- [Scikit-Learn\\n\",\n        \"](https://scikit-learn.org/stable/)\\n\",\n        \"- [Chainer](https://chainer.org/)\\n\",\n        \"---\\n\",\n        \"## Uses cases of NLP (SpaCy framework)\\n\",\n        \"\\n\",\n        \"After installing the [SpaCy library](https://spacy.io/) (using pip install spacy), you need to download the Italian models.\\n\",\n        \"\\n\",\n        \"pip install spacy or pip3 install -U spacy\\n\",\n        \"Then,\\n\",\n        \"\\n\",\n        \"python -m spacy download it_core_news_sm\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"colab\": {\n          \"base_uri\": \"https://localhost:8080/\"\n        },\n        \"id\": \"w3P3xKRIoEi2\",\n        \"outputId\": \"06b9aa75-5925-4a20-fdc6-7102ce6d5ce1\"\n      },\n      \"source\": [\n        \"pip install spacy\"\n      ],\n      \"execution_count\": null,\n      \"outputs\": [\n        {\n          \"output_type\": \"stream\",\n          \"text\": [\n            \"Requirement already satisfied: spacy in /usr/local/lib/python3.6/dist-packages (2.2.4)\\n\",\n            \"Requirement already satisfied: wasabi<1.1.0,>=0.4.0 in /usr/local/lib/python3.6/dist-packages (from spacy) (0.8.0)\\n\",\n            \"Requirement already satisfied: blis<0.5.0,>=0.4.0 in /usr/local/lib/python3.6/dist-packages (from spacy) (0.4.1)\\n\",\n            \"Requirement already satisfied: srsly<1.1.0,>=1.0.2 in /usr/local/lib/python3.6/dist-packages (from spacy) (1.0.2)\\n\",\n            \"Requirement already satisfied: numpy>=1.15.0 in /usr/local/lib/python3.6/dist-packages (from spacy) (1.18.5)\\n\",\n            \"Requirement already satisfied: tqdm<5.0.0,>=4.38.0 in /usr/local/lib/python3.6/dist-packages (from spacy) (4.41.1)\\n\",\n            \"Requirement already satisfied: murmurhash<1.1.0,>=0.28.0 in /usr/local/lib/python3.6/dist-packages (from spacy) (1.0.3)\\n\",\n            \"Requirement already satisfied: preshed<3.1.0,>=3.0.2 in /usr/local/lib/python3.6/dist-packages (from spacy) (3.0.2)\\n\",\n            \"Requirement already satisfied: requests<3.0.0,>=2.13.0 in /usr/local/lib/python3.6/dist-packages (from spacy) (2.23.0)\\n\",\n            \"Requirement already satisfied: cymem<2.1.0,>=2.0.2 in /usr/local/lib/python3.6/dist-packages (from spacy) (2.0.4)\\n\",\n            \"Requirement already satisfied: thinc==7.4.0 in /usr/local/lib/python3.6/dist-packages (from spacy) (7.4.0)\\n\",\n            \"Requirement already satisfied: setuptools in /usr/local/lib/python3.6/dist-packages (from spacy) (50.3.2)\\n\",\n            \"Requirement already satisfied: catalogue<1.1.0,>=0.0.7 in /usr/local/lib/python3.6/dist-packages (from spacy) (1.0.0)\\n\",\n            \"Requirement already satisfied: plac<1.2.0,>=0.9.6 in /usr/local/lib/python3.6/dist-packages (from spacy) (1.1.3)\\n\",\n            \"Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.6/dist-packages (from requests<3.0.0,>=2.13.0->spacy) (1.24.3)\\n\",\n            \"Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.6/dist-packages (from requests<3.0.0,>=2.13.0->spacy) (2.10)\\n\",\n            \"Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.6/dist-packages (from requests<3.0.0,>=2.13.0->spacy) (3.0.4)\\n\",\n            \"Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.6/dist-packages (from requests<3.0.0,>=2.13.0->spacy) (2020.6.20)\\n\",\n            \"Requirement already satisfied: importlib-metadata>=0.20; python_version < \\\"3.8\\\" in /usr/local/lib/python3.6/dist-packages (from catalogue<1.1.0,>=0.0.7->spacy) (2.0.0)\\n\",\n            \"Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.6/dist-packages (from importlib-metadata>=0.20; python_version < \\\"3.8\\\"->catalogue<1.1.0,>=0.0.7->spacy) (3.4.0)\\n\"\n          ],\n          \"name\": \"stdout\"\n        }\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"colab\": {\n          \"base_uri\": \"https://localhost:8080/\"\n        },\n        \"id\": \"sQ9GVeFm17wX\",\n        \"outputId\": \"eba1dda2-7f32-4502-c1ed-7641340b69a5\"\n      },\n      \"source\": [\n        \"!python -m spacy download it_core_news_sm\\n\"\n      ],\n      \"execution_count\": null,\n      \"outputs\": [\n        {\n          \"output_type\": \"stream\",\n          \"text\": [\n            \"Collecting it_core_news_sm==2.3.0\\n\",\n            \"\\u001b[?25l  Downloading https://github.com/explosion/spacy-models/releases/download/it_core_news_sm-2.3.0/it_core_news_sm-2.3.0.tar.gz (14.5MB)\\n\",\n            \"\\u001b[K     |████████████████████████████████| 14.5MB 663kB/s \\n\",\n            \"\\u001b[?25hRequirement already satisfied: spacy<2.4.0,>=2.3.0 in /usr/local/lib/python3.6/dist-packages (from it_core_news_sm==2.3.0) (2.3.2)\\n\",\n            \"Requirement already satisfied: murmurhash<1.1.0,>=0.28.0 in /usr/local/lib/python3.6/dist-packages (from spacy<2.4.0,>=2.3.0->it_core_news_sm==2.3.0) (1.0.3)\\n\",\n            \"Requirement already satisfied: requests<3.0.0,>=2.13.0 in /usr/local/lib/python3.6/dist-packages (from spacy<2.4.0,>=2.3.0->it_core_news_sm==2.3.0) (2.23.0)\\n\",\n            \"Requirement already satisfied: wasabi<1.1.0,>=0.4.0 in /usr/local/lib/python3.6/dist-packages (from spacy<2.4.0,>=2.3.0->it_core_news_sm==2.3.0) (0.8.0)\\n\",\n            \"Requirement already satisfied: thinc==7.4.1 in /usr/local/lib/python3.6/dist-packages (from spacy<2.4.0,>=2.3.0->it_core_news_sm==2.3.0) (7.4.1)\\n\",\n            \"Requirement already satisfied: preshed<3.1.0,>=3.0.2 in /usr/local/lib/python3.6/dist-packages (from spacy<2.4.0,>=2.3.0->it_core_news_sm==2.3.0) (3.0.2)\\n\",\n            \"Requirement already satisfied: tqdm<5.0.0,>=4.38.0 in /usr/local/lib/python3.6/dist-packages (from spacy<2.4.0,>=2.3.0->it_core_news_sm==2.3.0) (4.41.1)\\n\",\n            \"Requirement already satisfied: plac<1.2.0,>=0.9.6 in /usr/local/lib/python3.6/dist-packages (from spacy<2.4.0,>=2.3.0->it_core_news_sm==2.3.0) (1.1.3)\\n\",\n            \"Requirement already satisfied: setuptools in /usr/local/lib/python3.6/dist-packages (from spacy<2.4.0,>=2.3.0->it_core_news_sm==2.3.0) (50.3.2)\\n\",\n            \"Requirement already satisfied: catalogue<1.1.0,>=0.0.7 in /usr/local/lib/python3.6/dist-packages (from spacy<2.4.0,>=2.3.0->it_core_news_sm==2.3.0) (1.0.0)\\n\",\n            \"Requirement already satisfied: srsly<1.1.0,>=1.0.2 in /usr/local/lib/python3.6/dist-packages (from spacy<2.4.0,>=2.3.0->it_core_news_sm==2.3.0) (1.0.2)\\n\",\n            \"Requirement already satisfied: cymem<2.1.0,>=2.0.2 in /usr/local/lib/python3.6/dist-packages (from spacy<2.4.0,>=2.3.0->it_core_news_sm==2.3.0) (2.0.4)\\n\",\n            \"Requirement already satisfied: numpy>=1.15.0 in /usr/local/lib/python3.6/dist-packages (from spacy<2.4.0,>=2.3.0->it_core_news_sm==2.3.0) (1.18.5)\\n\",\n            \"Requirement already satisfied: blis<0.5.0,>=0.4.0 in /usr/local/lib/python3.6/dist-packages (from spacy<2.4.0,>=2.3.0->it_core_news_sm==2.3.0) (0.4.1)\\n\",\n            \"Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.6/dist-packages (from requests<3.0.0,>=2.13.0->spacy<2.4.0,>=2.3.0->it_core_news_sm==2.3.0) (1.24.3)\\n\",\n            \"Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.6/dist-packages (from requests<3.0.0,>=2.13.0->spacy<2.4.0,>=2.3.0->it_core_news_sm==2.3.0) (3.0.4)\\n\",\n            \"Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.6/dist-packages (from requests<3.0.0,>=2.13.0->spacy<2.4.0,>=2.3.0->it_core_news_sm==2.3.0) (2020.6.20)\\n\",\n            \"Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.6/dist-packages (from requests<3.0.0,>=2.13.0->spacy<2.4.0,>=2.3.0->it_core_news_sm==2.3.0) (2.10)\\n\",\n            \"Requirement already satisfied: importlib-metadata>=0.20; python_version < \\\"3.8\\\" in /usr/local/lib/python3.6/dist-packages (from catalogue<1.1.0,>=0.0.7->spacy<2.4.0,>=2.3.0->it_core_news_sm==2.3.0) (2.0.0)\\n\",\n            \"Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.6/dist-packages (from importlib-metadata>=0.20; python_version < \\\"3.8\\\"->catalogue<1.1.0,>=0.0.7->spacy<2.4.0,>=2.3.0->it_core_news_sm==2.3.0) (3.4.0)\\n\",\n            \"Building wheels for collected packages: it-core-news-sm\\n\",\n            \"  Building wheel for it-core-news-sm (setup.py) ... \\u001b[?25l\\u001b[?25hdone\\n\",\n            \"  Created wheel for it-core-news-sm: filename=it_core_news_sm-2.3.0-cp36-none-any.whl size=14502462 sha256=dcd0640dc051d73e61bf773e9d14ca9b977332974bbd70fd09f46efde56bef68\\n\",\n            \"  Stored in directory: /tmp/pip-ephem-wheel-cache-nqr5v0q9/wheels/4b/ba/ff/a127270808d2351d5ff858061d24c4fe7599f45d0920145900\\n\",\n            \"Successfully built it-core-news-sm\\n\",\n            \"Installing collected packages: it-core-news-sm\\n\",\n            \"  Found existing installation: it-core-news-sm 2.2.5\\n\",\n            \"    Uninstalling it-core-news-sm-2.2.5:\\n\",\n            \"      Successfully uninstalled it-core-news-sm-2.2.5\\n\",\n            \"Successfully installed it-core-news-sm-2.3.0\\n\",\n            \"\\u001b[38;5;2m✔ Download and installation successful\\u001b[0m\\n\",\n            \"You can now load the model via spacy.load('it_core_news_sm')\\n\"\n          ],\n          \"name\": \"stdout\"\n        }\n      ]\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"d6ep-kn728Hi\"\n      },\n      \"source\": [\n        \"These models consist of convolution networks that were already trained on two large-scale datasets (i.e. Corpus), WikiNER and Sequoia, which represent large amounts of data in Italy (usually several tens of GB).\\n\",\n        \"\\n\",\n        \"In a Jupyter notebook you can, then, import *SpaCy* and load the Italy model.\\n\",\n        \"\\n\",\n        \"```\\n\",\n        \"import spacy\\n\",\n        \"nlp = spacy.load(\\\"it_core_news_sm\\\")\\n\",\n        \"```\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"bDSDwAow5GNh\"\n      },\n      \"source\": [\n        \"import spacy\\n\",\n        \"nlp = spacy.load('it_core_news_sm')\"\n      ],\n      \"execution_count\": null,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"ErbZYe8x7mpb\"\n      },\n      \"source\": [\n        \"We will also create example sentences for all NLP tasks (which we will describe in more details in the following sections).\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"```\\n\",\n        \" test = \\\"Benvenuti in Italia\\\"\\n\",\n        \"```\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"IL5nM8oJ8apo\"\n      },\n      \"source\": [\n        \"test = 'Benvenuti in Italia\\\"'\"\n      ],\n      \"execution_count\": null,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"x3OgTgXG8sJW\"\n      },\n      \"source\": [\n        \"Then we will carry out all the operations of the complete NLP process as follows:\\n\",\n        \"\\n\",\n        \"### 1. Tokenization\\n\",\n        \"\\n\",\n        \"Tokenization attempts to convert text into a series of distinct tokens. The idea is that each token represents a word vector, and identifying words seems like a relatively simple task. But what do we do with an example like \\\"I'm cold\\\" in Italy? In the tokenization model, we need to split \\\"I\\\" as the first word.\\n\",\n        \"\\n\",\n        \"SpaCy offers a tokenization function using the *nlp* method. This method is the entry point for all SpaCy functions. It is used to display text in a form that can be interpreted by the library.\\n\",\n        \"\\n\",\n        \"```\\n\",\n        \"def return_tokens(stc):\\n\",\n        \"    # Tokenize the sentence\\n\",\n        \"    doc = nlp(stc)\\n\",\n        \"    # Return the text of each token\\n\",\n        \"    return [x.text for x in doc]\\n\",\n        \"```\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"lF3Sk9aPAGUj\"\n      },\n      \"source\": [\n        \"def return_tokens(stc):\\n\",\n        \"    # Tokenize the sentence\\n\",\n        \"    doc = nlp(stc)\\n\",\n        \"    # Return the text of each token\\n\",\n        \"    return [x.text for x in doc]\"\n      ],\n      \"execution_count\": null,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"P8_ARqvAAMEM\"\n      },\n      \"source\": [\n        \"Thus, by applying the tokenization scheme to our sentence, we obtain :\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"```\\n\",\n        \"return_tokens(test)\\n\",\n        \"```\\n\",\n        \"\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"colab\": {\n          \"base_uri\": \"https://localhost:8080/\"\n        },\n        \"id\": \"EeKnNOu4AVlh\",\n        \"outputId\": \"2c392c41-1495-43d5-bcfd-ae2448c461aa\"\n      },\n      \"source\": [\n        \"return_tokens(test)\\n\"\n      ],\n      \"execution_count\": null,\n      \"outputs\": [\n        {\n          \"output_type\": \"execute_result\",\n          \"data\": {\n            \"text/plain\": [\n              \"['Benvenuti', 'in', 'Italia', '\\\"']\"\n            ]\n          },\n          \"metadata\": {\n            \"tags\": []\n          },\n          \"execution_count\": 25\n        }\n      ]\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"PqSosHXlD70G\"\n      },\n      \"source\": [\n        \"### 2. Remove most frequent words (stop words)\\n\",\n        \"\\n\",\n        \"In Italian, words called \\\"*stop words*\\\" are very frequent. These words often do not provide information in the following tasks. For example, when using the *Tf-IdF* method for classification, it is desirable to limit the number of words in the training dataset.\\n\",\n        \"\\n\",\n        \"*Stop words* are defined as a list of words. These lists are usually available in a library called NLTK (Natural Language Tool Kit), which also supports various languages. This is how you access the list for Italian:\\n\",\n        \"\\n\",\n        \"```\\n\",\n        \"import nltk\\n\",\n        \"nltk.download('stopwords')\\n\",\n        \"```\\n\",\n        \"Then,\\n\",\n        \"\\n\",\n        \"```\\n\",\n        \"from nltk.corpus import stopwords\\n\",\n        \"stopWords = set(stopwords.words('italian'))\\n\",\n        \"```\\n\",\n        \"\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"colab\": {\n          \"base_uri\": \"https://localhost:8080/\"\n        },\n        \"id\": \"UmpzRlePF-9k\",\n        \"outputId\": \"f27cd49e-08b8-4227-ff26-c49fe2e47354\"\n      },\n      \"source\": [\n        \"import nltk\\n\",\n        \"nltk.download('stopwords')\"\n      ],\n      \"execution_count\": null,\n      \"outputs\": [\n        {\n          \"output_type\": \"stream\",\n          \"text\": [\n            \"[nltk_data] Downloading package stopwords to /root/nltk_data...\\n\",\n            \"[nltk_data]   Package stopwords is already up-to-date!\\n\"\n          ],\n          \"name\": \"stdout\"\n        },\n        {\n          \"output_type\": \"execute_result\",\n          \"data\": {\n            \"text/plain\": [\n              \"True\"\n            ]\n          },\n          \"metadata\": {\n            \"tags\": []\n          },\n          \"execution_count\": 32\n        }\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"a1ZRK1juFvh-\"\n      },\n      \"source\": [\n        \"from nltk.corpus import stopwords\\n\",\n        \"stopWords = set(stopwords.words('italian'))\"\n      ],\n      \"execution_count\": null,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"Wyug49OZGvrO\"\n      },\n      \"source\": [\n        \"\"\n      ],\n      \"execution_count\": null,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"colab\": {\n          \"base_uri\": \"https://localhost:8080/\"\n        },\n        \"id\": \"SGqCIzfCGWeu\",\n        \"outputId\": \"7ab6d95e-966f-43e8-c47e-0fede0e7abc0\"\n      },\n      \"source\": [\n        \"print(stopWords)\"\n      ],\n      \"execution_count\": null,\n      \"outputs\": [\n        {\n          \"output_type\": \"stream\",\n          \"text\": [\n            \"{'aveva', 'faremmo', 'vi', 'mio', 'cui', 'fecero', 'anche', 'la', 'vostra', 'o', 'avrà', 'avrei', 'ai', 'avrebbero', 'sulla', 'nostra', 'facendo', 'una', 'alle', 'alla', 'avrebbe', 'stavamo', 'steste', 'avreste', 'loro', 'staresti', 'stareste', 'avremo', 'facevi', 'ed', 'tue', 'le', 'quelle', 'sei', 'siete', 'fece', 'siano', 'saranno', 'che', 'stavate', 'era', 'a', 'eri', 'eravamo', 'dagl', 'feci', 'sarai', 'faccia', 'con', 'facesse', 'quella', 'questo', 'più', 'fui', 'fossero', 'facevano', 'l', 'dagli', 'starebbero', 'faccio', 'facciate', 'facevo', 'hai', 'questa', 'facessero', 'avesti', 'stavano', 'fareste', 'sarete', 'fu', 'chi', 'farebbe', 'sui', 'da', 'sua', 'del', 'fanno', 'col', 'avesse', 'staremmo', 'sarà', 'farebbero', 'miei', 'nell', 'e', 'nello', 'fossimo', 'contro', 'voi', 'facessi', 'fai', 'dei', 'lui', 'staremo', 'è', 'io', 'stavi', 'stessero', 'della', 'ma', 'sarebbe', 'stemmo', 'faceste', 'allo', 'stessi', 'nostre', 'facevamo', 'facevate', 'starò', 'sarò', 'dell', 'dove', 'avete', 'sugli', 'sull', 'avrete', 'saremo', 'abbia', 'faceva', 'farei', 'stiano', 'negl', 'fosti', 'come', 'avresti', 'starai', 'lei', 'facesti', 'saresti', 'sarebbero', 'dalla', 'avrò', 'avemmo', 'dai', 'in', 'erano', 'stettero', 'avendo', 'il', 'fossi', 'degl', 'quanta', 'vostro', 'avute', 'stiamo', 'quelli', 'ero', 'stiate', 'quanti', 'avuti', 'tutto', 'uno', 'su', 'sarei', 'nella', 'aveste', 'abbiamo', 'abbiano', 'starete', 'stava', 'tra', 'nostri', 'avuto', 'se', 'di', 'sul', 'ha', 'avevi', 'farò', 'coi', 'avessero', 'stessimo', 'tuo', 'stetti', 'avranno', 'sta', 'noi', 'tu', 'suoi', 'dello', 'vostre', 'i', 'avessimo', 'essendo', 'faresti', 'ebbero', 'farete', 'sulle', 'gli', 'avessi', 'staranno', 'stando', 'stesse', 'saremmo', 'foste', 'facemmo', 'ti', 'tuoi', 'stesti', 'tua', 'sia', 'fosse', 'sareste', 'quello', 'mia', 'all', 'fummo', 'un', 'sue', 'degli', 'mie', 'negli', 'ebbe', 'starà', 'dall', 'avevate', 'suo', 'perché', 'facciano', 'dov', 'stanno', 'avevano', 'si', 'starei', 'nel', 'stia', 'sono', 'furono', 'farai', 'nei', 'per', 'stai', 'sugl', 'farà', 'ho', 'avevamo', 'ne', 'agli', 'avrai', 'stavo', 'sullo', 'mi', 'questi', 'agl', 'quanto', 'eravate', 'quante', 'faranno', 'delle', 'quale', 'siate', 'starebbe', 'hanno', 'avuta', 'sto', 'ci', 'queste', 'non', 'dallo', 'tutti', 'c', 'abbiate', 'faremo', 'stette', 'nelle', 'li', 'facessimo', 'avremmo', 'al', 'nostro', 'facciamo', 'avevo', 'siamo', 'dal', 'vostri', 'lo', 'ad', 'dalle', 'ebbi'}\\n\"\n          ],\n          \"name\": \"stdout\"\n        }\n      ]\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"qwmuHndXGbOw\"\n      },\n      \"source\": [\n        \"To filter the content of a sentence, delete all words that appear in the list.\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"```\\n\",\n        \"clean_words = []\\n\",\n        \"for token in return_tokens(test):\\n\",\n        \"    if token not in stopWords:\\n\",\n        \"        clean_words.append(token)\\n\",\n        \"\\n\",\n        \"clean_words\\n\",\n        \"```\\n\",\n        \"\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"colab\": {\n          \"base_uri\": \"https://localhost:8080/\"\n        },\n        \"id\": \"ymQnUdApGweH\",\n        \"outputId\": \"dcc09dd9-f063-4b2c-f556-6b9c63f117a6\"\n      },\n      \"source\": [\n        \"clean_words = []\\n\",\n        \"for token in return_tokens(test):\\n\",\n        \"    if token not in stopWords:\\n\",\n        \"        clean_words.append(token)\\n\",\n        \"\\n\",\n        \"clean_words\"\n      ],\n      \"execution_count\": null,\n      \"outputs\": [\n        {\n          \"output_type\": \"execute_result\",\n          \"data\": {\n            \"text/plain\": [\n              \"['Benvenuti', 'Italia', '\\\"']\"\n            ]\n          },\n          \"metadata\": {\n            \"tags\": []\n          },\n          \"execution_count\": 38\n        }\n      ]\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"OZj7VhVRG6Ra\"\n      },\n      \"source\": [\n        \"### 3. Sentence tokenization \\n\",\n        \"\\n\",\n        \"Sentence tokenization can also be used to identify different sentences in a piece of text. A priori, this step may seem simple, as it is sufficient to cut each sentence into words when a dot appears.\\n\",\n        \"Therefore, to achieve good tokenization, you need to understand its full context.\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"```\\n\",\n        \"def return_token_stc(stc):\\n\",\n        \"    # Tokenize the sentence\\n\",\n        \"    doc = nlp(stc)\\n\",\n        \"    # Retourner le texte de chaque phrase\\n\",\n        \"    return [x.text for x in doc.sents]\\n\",\n        \"```\\n\",\n        \"\\n\",\n        \"Let's apply the tokenization scheme to the following sentence:\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"> Buongiorno. Parla inglese? Parli inglese?\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"8pIWp9QbP3rM\"\n      },\n      \"source\": [\n        \"def return_token_stc(stc):\\n\",\n        \"    # Tokenize the sentence\\n\",\n        \"    doc = nlp(stc)\\n\",\n        \"    # Retourner le texte de chaque phrase\\n\",\n        \"    return [x.text for x in doc.sents]\"\n      ],\n      \"execution_count\": null,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"colab\": {\n          \"base_uri\": \"https://localhost:8080/\"\n        },\n        \"id\": \"_bYePCY0Prso\",\n        \"outputId\": \"8e0d2058-09fc-4855-96e2-01e404d429eb\"\n      },\n      \"source\": [\n        \"return_token_stc(\\\"Buongiorno. Parla inglese? Parli inglese?\\\")\"\n      ],\n      \"execution_count\": null,\n      \"outputs\": [\n        {\n          \"output_type\": \"execute_result\",\n          \"data\": {\n            \"text/plain\": [\n              \"['Buongiorno.', 'Parla inglese?', 'Parli inglese?']\"\n            ]\n          },\n          \"metadata\": {\n            \"tags\": []\n          },\n          \"execution_count\": 41\n        }\n      ]\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"r4QttTwYQDNe\"\n      },\n      \"source\": [\n        \"The tokenization of sentences then returns :\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"```\\n\",\n        \"['Buongiorno.', 'Parla inglese?', 'Parli inglese?']\\n\",\n        \"```\\n\",\n        \"\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"jGYr4ZwqQH7R\"\n      },\n      \"source\": [\n        \"### 4. Stemming\\n\",\n        \"\\n\",\n        \"Stemming consists of reducing a word to its root form. The purpose of stemming is to group the many variations of a word into a single word. For example, once stemming is applied to \\\"Dogs\\\" or \\\"Dog\\\", the result is the same word. This reduces the size of the vocabulary in the word bag model or Tf-IdF approach.\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"The most famous stemmer was the *Snowball Stemmer*. It is available in Italian.\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"```\\n\",\n        \"from nltk.stem.snowball import SnowballStemmer\\n\",\n        \"stemmer = SnowballStemmer(language='italian')\\n\",\n        \"\\n\",\n        \"def return_stem(stc):\\n\",\n        \"    doc = nlp(stc)\\n\",\n        \"    return [stemmer.stem(x.text) for x in doc]\\n\",\n        \"```\\n\",\n        \"\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"Qg8AX6jKR7e9\"\n      },\n      \"source\": [\n        \"from nltk.stem.snowball import SnowballStemmer\\n\",\n        \"stemmer = SnowballStemmer(language='italian')\\n\",\n        \"\\n\",\n        \"def return_stem(stc):\\n\",\n        \"    doc = nlp(stc)\\n\",\n        \"    return [stemmer.stem(x.text) for x in doc]\"\n      ],\n      \"execution_count\": null,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"52_ckpn_SCD3\"\n      },\n      \"source\": [\n        \"If we apply this stemmer to our example sentence :\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"> Buongiorno. Parla inglese? Parli inglese?\\n\",\n        \"\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"colab\": {\n          \"base_uri\": \"https://localhost:8080/\"\n        },\n        \"id\": \"jbFIVgarSI-e\",\n        \"outputId\": \"70ccd79c-0cba-49bb-be2a-428dc1235fb1\"\n      },\n      \"source\": [\n        \"return_stem(test)\\n\"\n      ],\n      \"execution_count\": null,\n      \"outputs\": [\n        {\n          \"output_type\": \"execute_result\",\n          \"data\": {\n            \"text/plain\": [\n              \"['benven', 'in', 'ital', '\\\"']\"\n            ]\n          },\n          \"metadata\": {\n            \"tags\": []\n          },\n          \"execution_count\": 43\n        }\n      ]\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"SENXHatpSQGR\"\n      },\n      \"source\": [\n        \"### 5. Named Entity Recognition (NER)\\n\",\n        \"\\n\",\n        \"In automatic linguistic processing, Named Entity Recognition (NER) tries to detect entities such as people, companies and places in text. This can be done very easily in SpaCy.\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"```\\n\",\n        \"def return_NER(stc):\\n\",\n        \"    # Tokenize the sentence\\n\",\n        \"    doc = nlp(stc)\\n\",\n        \"    # Return the text and label for each entity\\n\",\n        \"    return [(x.text, x.label_) for x in doc.ents] [texte du lien](https://)\\n\",\n        \"```\\n\",\n        \"\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"9g05WuFeTNxy\"\n      },\n      \"source\": [\n        \"def return_NER(stc):\\n\",\n        \"    # Tokenize the sentence\\n\",\n        \"    doc = nlp(stc)\\n\",\n        \"    # Return the text and label for each entity\\n\",\n        \"    return [(x.text, x.label_) for x in doc.ents]\"\n      ],\n      \"execution_count\": null,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"uzmCJcHwTUX-\"\n      },\n      \"source\": [\n        \"Then the function can be applied to an example sentence:\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"> Buongiorno. Parla inglese? Parli inglese?\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"```\\n\",\n        \"return_NER(test)\\n\",\n        \"```\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"colab\": {\n          \"base_uri\": \"https://localhost:8080/\"\n        },\n        \"id\": \"mBSkb6lJTj8f\",\n        \"outputId\": \"ed9ee7ff-f185-497d-b527-933c359da543\"\n      },\n      \"source\": [\n        \"return_NER(test)\"\n      ],\n      \"execution_count\": null,\n      \"outputs\": [\n        {\n          \"output_type\": \"execute_result\",\n          \"data\": {\n            \"text/plain\": [\n              \"[('Benvenuti', 'PER'), ('Italia', 'LOC')]\"\n            ]\n          },\n          \"metadata\": {\n            \"tags\": []\n          },\n          \"execution_count\": 45\n        }\n      ]\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"0edudq0xT2l6\"\n      },\n      \"source\": [\n        \"The entities that have been recognised are as follows:\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"```\\n\",\n        \"[('Benvenuti', 'PER'), ('Italia', 'LOC')]\\n\",\n        \"```\\n\",\n        \"Here, Benvenuti is recognised as a person, and Italia as a place.\\n\",\n        \"\\n\",\n        \"SpaCy features a \\\"Visualizer,\\\" which is a graphical tool that displays the results of recognizing and tagging named entities, for example.\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"```\\n\",\n        \"from spacy import displacy\\n\",\n        \"\\n\",\n        \"doc = nlp(test)\\n\",\n        \"displacy.render(doc, style=\\\"ent\\\", jupyter=True)\\n\",\n        \"```\\n\",\n        \"\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"colab\": {\n          \"base_uri\": \"https://localhost:8080/\",\n          \"height\": 52\n        },\n        \"id\": \"vlR7o7McU0GA\",\n        \"outputId\": \"f05abca6-6fbd-4c96-e54b-d6eb1992c50f\"\n      },\n      \"source\": [\n        \"from spacy import displacy\\n\",\n        \"\\n\",\n        \"doc = nlp(test)\\n\",\n        \"displacy.render(doc, style=\\\"ent\\\", jupyter=True)\"\n      ],\n      \"execution_count\": null,\n      \"outputs\": [\n        {\n          \"output_type\": \"display_data\",\n          \"data\": {\n            \"text/html\": [\n              \"<span class=\\\"tex2jax_ignore\\\"><div class=\\\"entities\\\" style=\\\"line-height: 2.5; direction: ltr\\\">\\n\",\n              \"<mark class=\\\"entity\\\" style=\\\"background: #ddd; padding: 0.45em 0.6em; margin: 0 0.25em; line-height: 1; border-radius: 0.35em;\\\">\\n\",\n              \"    Benvenuti\\n\",\n              \"    <span style=\\\"font-size: 0.8em; font-weight: bold; line-height: 1; border-radius: 0.35em; text-transform: uppercase; vertical-align: middle; margin-left: 0.5rem\\\">PER</span>\\n\",\n              \"</mark>\\n\",\n              \" in \\n\",\n              \"<mark class=\\\"entity\\\" style=\\\"background: #ff9561; padding: 0.45em 0.6em; margin: 0 0.25em; line-height: 1; border-radius: 0.35em;\\\">\\n\",\n              \"    Italia\\n\",\n              \"    <span style=\\\"font-size: 0.8em; font-weight: bold; line-height: 1; border-radius: 0.35em; text-transform: uppercase; vertical-align: middle; margin-left: 0.5rem\\\">LOC</span>\\n\",\n              \"</mark>\\n\",\n              \"&quot;</div></span>\"\n            ],\n            \"text/plain\": [\n              \"<IPython.core.display.HTML object>\"\n            ]\n          },\n          \"metadata\": {\n            \"tags\": []\n          }\n        }\n      ]\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"PeId4AKvU2gU\"\n      },\n      \"source\": [\n        \"You can also specify options in DisplaCy to display only certain colored places.\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"```\\n\",\n        \"doc = nlp(test)\\n\",\n        \"color = {\\\"LOC\\\": \\\"linear-gradient(90deg, #aa9cfc, #fc9ce7)\\\"}\\n\",\n        \"option = {\\\"ents\\\": [\\\"LOC\\\"], \\\"colors\\\": colors}\\n\",\n        \"\\n\",\n        \"displacy.render(doc, style=\\\"ent\\\", jupyter=True, options=options)\\n\",\n        \"```\\n\",\n        \"\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"colab\": {\n          \"base_uri\": \"https://localhost:8080/\",\n          \"height\": 52\n        },\n        \"id\": \"7YMZ0YksVg-H\",\n        \"outputId\": \"711481f4-43d6-4b92-b369-62757be2ceb0\"\n      },\n      \"source\": [\n        \"doc = nlp(test)\\n\",\n        \"color = {\\\"LOC\\\": \\\"linear-gradient(90deg, #aa9cfc, #fc9ce7)\\\"}\\n\",\n        \"option = {\\\"ents\\\": [\\\"LOC\\\"], \\\"colors\\\": color}\\n\",\n        \"\\n\",\n        \"displacy.render(doc, style=\\\"ent\\\", jupyter=True, options=option)\"\n      ],\n      \"execution_count\": null,\n      \"outputs\": [\n        {\n          \"output_type\": \"display_data\",\n          \"data\": {\n            \"text/html\": [\n              \"<span class=\\\"tex2jax_ignore\\\"><div class=\\\"entities\\\" style=\\\"line-height: 2.5; direction: ltr\\\">Benvenuti in \\n\",\n              \"<mark class=\\\"entity\\\" style=\\\"background: linear-gradient(90deg, #aa9cfc, #fc9ce7); padding: 0.45em 0.6em; margin: 0 0.25em; line-height: 1; border-radius: 0.35em;\\\">\\n\",\n              \"    Italia\\n\",\n              \"    <span style=\\\"font-size: 0.8em; font-weight: bold; line-height: 1; border-radius: 0.35em; text-transform: uppercase; vertical-align: middle; margin-left: 0.5rem\\\">LOC</span>\\n\",\n              \"</mark>\\n\",\n              \"&quot;</div></span>\"\n            ],\n            \"text/plain\": [\n              \"<IPython.core.display.HTML object>\"\n            ]\n          },\n          \"metadata\": {\n            \"tags\": []\n          }\n        }\n      ]\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"oy6VaIQ2VtiM\"\n      },\n      \"source\": [\n        \"### 6. Morpho-syntactic labeling (Part-of-Speech (POS) Tagging)\\n\",\n        \"\\n\",\n        \"Morpho-syntactic labeling attempts to assign a label to each word in a sentence, referring to the grammatical structure of the word (proper nouns, adjectives, determiners, ...). \\n\",\n        \"\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"```\\n\",\n        \"def return_POS(stc):\\n\",\n        \"    # Tokenize the sentence\\n\",\n        \"    doc = nlp(stc)\\n\",\n        \"    # Flip the labels of each token\\n\",\n        \"    return [(x, x.pos_) for x in doc]\\n\",\n        \"```\\n\",\n        \"\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"TaT3jRz5Wsff\"\n      },\n      \"source\": [\n        \"def return_POS(stc):\\n\",\n        \"    # Tokenize the sentence\\n\",\n        \"    doc = nlp(stc)\\n\",\n        \"    # Flip the labels of each token\\n\",\n        \"    return [(x, x.pos_) for x in doc]\"\n      ],\n      \"execution_count\": null,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"DPCjOBfaWy7A\"\n      },\n      \"source\": [\n        \"The labels identified are as follows:\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"colab\": {\n          \"base_uri\": \"https://localhost:8080/\"\n        },\n        \"id\": \"RdQM9yI-W0AW\",\n        \"outputId\": \"87862f78-6956-4f76-b92f-04fb82a87cd5\"\n      },\n      \"source\": [\n        \"return_POS(test)\"\n      ],\n      \"execution_count\": null,\n      \"outputs\": [\n        {\n          \"output_type\": \"execute_result\",\n          \"data\": {\n            \"text/plain\": [\n              \"[(Benvenuti, 'ADJ'), (in, 'ADP'), (Italia, 'PROPN'), (\\\", 'PUNCT')]\"\n            ]\n          },\n          \"metadata\": {\n            \"tags\": []\n          },\n          \"execution_count\": 51\n        }\n      ]\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"aQyIJ6ogW55N\"\n      },\n      \"source\": [\n        \"SpaCy also has a visualization option that allows us to simply visualize the identified labels and the dependencies between them.\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"```\\n\",\n        \"doc = nlp(test)\\n\",\n        \"displacy.serve(doc, style=\\\"dep\\\")\\n\",\n        \"```\\n\",\n        \"\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"colab\": {\n          \"base_uri\": \"https://localhost:8080/\"\n        },\n        \"id\": \"Yn9jmPt4XTHE\",\n        \"outputId\": \"68697584-3513-4e04-d7bb-9a49403a4d8b\"\n      },\n      \"source\": [\n        \"doc = nlp(test)\\n\",\n        \"displacy.serve(doc, style=\\\"dep\\\")\"\n      ],\n      \"execution_count\": null,\n      \"outputs\": [\n        {\n          \"output_type\": \"stream\",\n          \"text\": [\n            \"\\n\",\n            \"Using the 'dep' visualizer\\n\",\n            \"Serving on http://0.0.0.0:5000 ...\\n\",\n            \"\\n\",\n            \"Shutting down server on port 5000.\\n\"\n          ],\n          \"name\": \"stdout\"\n        }\n      ]\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"52Xs4iJ0Xd1C\"\n      },\n      \"source\": [\n        \"### 7. Word Embedding\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"With SpaCy, one can easily get the vector corresponding to each word after it has gone through the pre-trained Italian language model.\\n\",\n        \"\\n\",\n        \"Using this, each word is represented as a vector of size 100.\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"```\\n\",\n        \"import numpy as np\\n\",\n        \"\\n\",\n        \"def return_word_embedding(stc):\\n\",\n        \"    # Tokenize the sentence\\n\",\n        \"    doc = nlp(stc)\\n\",\n        \"    # Return the vector related to each token\\n\",\n        \"    return [(x.vector) for x in doc]\\n\",\n        \"```\\n\",\n        \"\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"gDuobBKlYRXW\"\n      },\n      \"source\": [\n        \"import numpy as np\\n\",\n        \"\\n\",\n        \"def return_word_embedding(stc):\\n\",\n        \"    # Tokenize the sentence\\n\",\n        \"    doc = nlp(stc)\\n\",\n        \"    # Return the vector related to each token\\n\",\n        \"    return [(x.vector) for x in doc]\"\n      ],\n      \"execution_count\": null,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"y_hPyEbCYXXy\"\n      },\n      \"source\": [\n        \"Thus, when applied to the test sentence, we obtain :\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"```\\n\",\n        \"return_word_embedding(test)\\n\",\n        \"\\n\",\n        \"```\\n\",\n        \"\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"colab\": {\n          \"base_uri\": \"https://localhost:8080/\"\n        },\n        \"id\": \"lM3TSkBwYbgK\",\n        \"outputId\": \"2c45c89c-b0f0-4abb-ae42-6dbd67786abe\"\n      },\n      \"source\": [\n        \"return_word_embedding(test)\\n\"\n      ],\n      \"execution_count\": null,\n      \"outputs\": [\n        {\n          \"output_type\": \"execute_result\",\n          \"data\": {\n            \"text/plain\": [\n              \"[array([ 0.64814776, -2.7229857 ,  6.5494404 , -2.4836855 ,  1.7654153 ,\\n\",\n              \"        -3.843188  ,  0.9902353 , -2.0325494 ,  0.29755   ,  6.666398  ,\\n\",\n              \"        -7.3569155 , -0.16253102,  3.6927814 , -2.107585  ,  1.445279  ,\\n\",\n              \"        -0.586237  ,  0.33728063,  0.8780733 ,  2.0690937 , -2.1414099 ,\\n\",\n              \"        -6.143453  ,  6.187742  ,  6.0364575 , -2.950478  , -0.47098207,\\n\",\n              \"         2.597607  , -3.7254043 , -2.0546484 , -6.0184646 , -0.77493924,\\n\",\n              \"        -0.6374421 , -4.6174088 ,  1.3157655 , -1.7921138 ,  2.9418454 ,\\n\",\n              \"        -4.7565813 , -2.9254837 , -1.4710029 , -0.82321227,  3.5791297 ,\\n\",\n              \"        -2.5026226 ,  3.8386724 ,  0.9719863 ,  2.8859067 , -3.6139584 ,\\n\",\n              \"        -0.26587704, -3.8075154 , -0.46050066,  4.2685246 , -1.9638886 ,\\n\",\n              \"        -0.7444145 , -2.4440632 ,  7.700466  ,  1.6028799 , -3.9397273 ,\\n\",\n              \"         6.759221  ,  0.4796586 , -7.776807  ,  3.3714013 , -2.3454192 ,\\n\",\n              \"        -1.8552076 ,  0.8471037 ,  0.7225499 , -0.2936607 , -1.1747853 ,\\n\",\n              \"         2.0676494 , -1.8238194 ,  7.915089  ,  3.3647861 ,  0.38391465,\\n\",\n              \"        -1.0815492 , -2.1922174 ,  5.2405953 ,  7.0541058 , -4.1191845 ,\\n\",\n              \"         2.196834  ,  3.4494452 , -1.2508552 , -6.767992  ,  4.846349  ,\\n\",\n              \"         5.9070477 ,  4.050424  , -1.7196853 , -2.5843587 , -3.9828048 ,\\n\",\n              \"         0.8260745 , -7.054641  , -3.237343  , -6.600278  ,  4.896142  ,\\n\",\n              \"        -5.6876516 , -0.5470526 , -1.2551632 , -0.18514226,  7.45426   ,\\n\",\n              \"         8.564779  ], dtype=float32),\\n\",\n              \" array([ 5.5536776 ,  6.761028  , -3.9634469 , -3.6291418 ,  9.460039  ,\\n\",\n              \"        -1.8788574 ,  0.3318963 , -4.31836   , -1.8510718 , -0.36685932,\\n\",\n              \"        -4.825889  , -3.1853998 , -2.6084173 , -1.9921567 , -2.8515313 ,\\n\",\n              \"        -4.7127852 ,  7.5866323 ,  2.0168154 , -3.917469  ,  1.6460614 ,\\n\",\n              \"        -3.8034856 , -2.474057  ,  2.91982   ,  4.87639   ,  0.3615229 ,\\n\",\n              \"         0.9850571 ,  2.0223246 , -3.3789463 ,  3.4622915 , -3.2028966 ,\\n\",\n              \"         8.045905  , -3.5628595 ,  6.535179  , -6.1927395 , -3.6734157 ,\\n\",\n              \"        -1.7211746 ,  2.4964538 ,  7.0332937 , -3.0031893 ,  1.9841752 ,\\n\",\n              \"        -5.069038  ,  0.02218467,  2.0520186 ,  0.20779341, -3.3268137 ,\\n\",\n              \"        -2.1915424 , -1.6849377 ,  2.4344754 , -5.9545336 , -3.802396  ,\\n\",\n              \"         0.39122778,  0.14099944, -0.16145909,  3.5414891 ,  3.7600636 ,\\n\",\n              \"        -2.0568137 ,  0.93867433, -0.8319331 , -0.31067252, 11.243862  ,\\n\",\n              \"        -5.9742365 , -3.917518  ,  0.14407057,  4.848308  ,  2.738812  ,\\n\",\n              \"        -0.09123784, -1.2695149 , -0.9889672 ,  3.604159  ,  5.046466  ,\\n\",\n              \"        -5.2604117 , -0.9009398 , -1.3456848 ,  3.8133454 ,  0.06859644,\\n\",\n              \"        -1.8274157 ,  1.340401  , -2.4418898 , -3.0779061 , -0.5500953 ,\\n\",\n              \"         5.9169617 ,  0.8065852 , -1.3218422 ,  0.64478445, -1.5826247 ,\\n\",\n              \"         5.93043   ,  0.76374054,  0.6613941 , -4.085607  , -2.8559482 ,\\n\",\n              \"        -4.52592   , -0.70520115,  5.266099  , -5.504953  ,  7.7028728 ,\\n\",\n              \"        -0.57531923], dtype=float32),\\n\",\n              \" array([ 3.8224735 ,  3.0110073 ,  6.1189504 , -3.717359  , -0.33736354,\\n\",\n              \"        -2.806441  ,  0.40349078,  0.16874075, -1.8096097 ,  2.0605483 ,\\n\",\n              \"        -5.154369  , -2.7888975 ,  5.533177  , -3.0145235 ,  1.8829769 ,\\n\",\n              \"        -4.426545  , -2.7556872 , -2.7123065 , -3.1551566 ,  4.8813286 ,\\n\",\n              \"         3.6447673 ,  2.8605592 ,  3.9712605 , -1.8549004 , -1.477942  ,\\n\",\n              \"         4.1143255 , -3.9199233 , -5.428829  , -0.5603015 , -1.8912859 ,\\n\",\n              \"         1.4616573 ,  0.8887551 , -1.5011196 , -6.798414  , -2.4657397 ,\\n\",\n              \"        -0.6486513 ,  2.977067  , -3.1153846 ,  1.6665999 ,  4.1538744 ,\\n\",\n              \"        -8.192668  , -1.3172901 , -3.633186  ,  3.704798  ,  1.488112  ,\\n\",\n              \"        -3.9379275 ,  0.68856096,  0.16956972, -3.4187317 ,  0.6658472 ,\\n\",\n              \"        -3.7971053 , -2.617197  ,  3.7859805 ,  1.550618  , -5.2748537 ,\\n\",\n              \"         7.0200157 , -0.57997704, -1.2164825 ,  1.8577094 ,  5.8073354 ,\\n\",\n              \"        -5.5908833 ,  0.48585248, -4.313365  ,  4.6458545 ,  5.571142  ,\\n\",\n              \"         4.65184   ,  1.4774485 ,  2.823586  ,  0.03758204, 11.222853  ,\\n\",\n              \"         0.697659  ,  5.340312  ,  0.755969  ,  4.2136784 ,  2.2848988 ,\\n\",\n              \"        -4.3324156 ,  1.8211684 , -1.3507077 , -3.0705724 , -5.488992  ,\\n\",\n              \"         2.9189363 , -1.026705  , -8.271565  , -8.608662  , -0.22258306,\\n\",\n              \"         3.4994302 , -3.5686488 ,  1.1340535 , -2.6569395 ,  6.4076385 ,\\n\",\n              \"         3.4723766 ,  4.848408  , -8.857959  ,  0.8246847 ,  3.477193  ,\\n\",\n              \"         5.4458637 ], dtype=float32),\\n\",\n              \" array([-1.8527484 , -1.418632  ,  0.9033061 ,  5.5039434 , -1.9741267 ,\\n\",\n              \"        -5.4572663 , -3.5572178 , -1.6158776 , -3.1755083 , -3.623562  ,\\n\",\n              \"         3.278206  , -5.537116  ,  1.5899239 ,  2.1030622 ,  0.87907207,\\n\",\n              \"        -3.5730817 ,  1.2520565 ,  4.1027217 , -3.627115  ,  1.8690002 ,\\n\",\n              \"        -2.705151  ,  1.4059038 ,  4.6613054 , -3.7419097 , -6.2418666 ,\\n\",\n              \"         5.925636  , -4.749658  ,  3.0237982 , -0.4309528 ,  7.654743  ,\\n\",\n              \"        -0.5164126 ,  0.3962298 ,  4.5724015 , -1.101677  , -1.9877379 ,\\n\",\n              \"        -2.6303694 , -2.2866888 ,  2.99688   ,  0.32639164,  8.023294  ,\\n\",\n              \"        -5.3657265 ,  2.815246  , -1.3743926 , -4.3306055 , -0.9178431 ,\\n\",\n              \"         0.7043288 , -2.8160505 , -5.0367093 , -3.4468775 ,  3.4186394 ,\\n\",\n              \"         0.68878406,  0.03843868,  3.2610428 ,  3.1169903 , -2.161751  ,\\n\",\n              \"         4.9779034 , -3.0417404 , -4.954278  ,  1.6504333 ,  5.755651  ,\\n\",\n              \"        -3.9942439 ,  3.0548048 , -5.7533126 ,  3.535389  ,  4.0507383 ,\\n\",\n              \"         7.542342  , -2.2777374 ,  0.71262854, -1.3076197 , -0.80113655,\\n\",\n              \"        -2.0708215 ,  7.558702  , -0.9217652 , -5.2692103 ,  5.8882113 ,\\n\",\n              \"         7.197591  ,  0.2541089 , -1.7645313 ,  3.7002435 , -0.05108547,\\n\",\n              \"        -4.5984945 , -1.4142433 , -4.967071  ,  2.2421694 , -0.15722692,\\n\",\n              \"         6.535714  , -5.074168  ,  3.960575  ,  1.7492257 ,  2.0120845 ,\\n\",\n              \"         1.5060658 , -3.0634708 ,  2.3792863 , -0.36523283, -4.533475  ,\\n\",\n              \"        -1.2702508 ], dtype=float32)]\"\n            ]\n          },\n          \"metadata\": {\n            \"tags\": []\n          },\n          \"execution_count\": 56\n        }\n      ]\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"0fWzYLbDYqF-\"\n      },\n      \"source\": [\n        \"Such information is valuable when you try to determine how to distinguish the similarity between two words or sentences.\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"MS0neXsxZAGv\"\n      },\n      \"source\": [\n        \"### 8. Sentence Similarity\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"To judge the degree of similarity between two sentences, we will use a very simple method:\\n\",\n        \"\\n\",\n        \"- Determine the average embedding of a given text by embedding all words in the sentence.\\n\",\n        \"- Calculate the distance between two sentences by simple Euclidean distance.\\n\",\n        \"\\n\",\n        \"With SpaC\\n\",\n        \"\\n\",\n        \"```\\n\",\n        \"# Ce texte est au format code\\n\",\n        \"```\\n\",\n        \"\\n\",\n        \"y, it is so easy!\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"```\\n\",\n        \"def return_mean_embedding(stc):\\n\",\n        \"    # Tokenize the sentence\\n\",\n        \"    doc = nlp(stc)\\n\",\n        \"    # Returning the average of the vectors for each sentence\\n\",\n        \"    return np.mean([(x.vector) for x in doc], axis=0)\\n\",\n        \"```\\n\",\n        \"\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"5-N0LqU9auGu\"\n      },\n      \"source\": [\n        \"def return_mean_embedding(stc):\\n\",\n        \"    # Tokenize the sentence\\n\",\n        \"    doc = nlp(stc)\\n\",\n        \"    # Returning the average of the vectors for each sentence\\n\",\n        \"    return np.mean([(x.vector) for x in doc], axis=0)\"\n      ],\n      \"execution_count\": null,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"iqqBKqNjbA1w\"\n      },\n      \"source\": [\n        \"You can then test your function with several sentences:\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"```\\n\",\n        \"test_2 = \\\"Purtroppo so soltanto un po' di italiano\\\"\\n\",\n        \"test_3 = \\\"Non fa niente\\\"\\n\",\n        \"```\\n\",\n        \"\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"vMRKEjpebVgo\"\n      },\n      \"source\": [\n        \"test_2 = \\\"Purtroppo so soltanto un po' di italiano\\\"\\n\",\n        \"test_3 = \\\"Non fa niente\\\"\"\n      ],\n      \"execution_count\": null,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"COurU0hGbi56\"\n      },\n      \"source\": [\n        \"The Euclidean distance is simply computed with Numpy as :\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"```\\n\",\n        \"np.linalg.norm(return_mean_embedding(test)-return_mean_embedding(test_2))\\n\",\n        \"np.linalg.norm(return_mean_embedding(test)-return_mean_embedding(test_3))\\n\",\n        \"```\\n\",\n        \"\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"colab\": {\n          \"base_uri\": \"https://localhost:8080/\"\n        },\n        \"id\": \"eINt5OHlbqLy\",\n        \"outputId\": \"b1970a5d-c157-4516-f6f1-d1534dcdd9dc\"\n      },\n      \"source\": [\n        \"np.linalg.norm(return_mean_embedding(test)-return_mean_embedding(test_2))\\n\",\n        \"np.linalg.norm(return_mean_embedding(test)-return_mean_embedding(test_3))\"\n      ],\n      \"execution_count\": null,\n      \"outputs\": [\n        {\n          \"output_type\": \"execute_result\",\n          \"data\": {\n            \"text/plain\": [\n              \"32.674484\"\n            ]\n          },\n          \"metadata\": {\n            \"tags\": []\n          },\n          \"execution_count\": 60\n        }\n      ]\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"JzV5qILncNjd\"\n      },\n      \"source\": [\n        \"This approach can also be used to classify whether a sentence belongs to one class or another.\"\n      ]\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"gYmlt-JAccD2\"\n      },\n      \"source\": [\n        \"### 9. Transformers\\n\",\n        \"\\n\",\n        \"If you've been following NLP news in recent months, you've probably heard about *Transformers*, a cutting-edge model for learning vector representations from input text that is somehow beyond human capabilities. These models can be pre-trained and are provided by *Hugging Face*, a young company specializing in NLP.\\n\",\n        \"\\n\",\n        \"Hugging Face's latest Italian-specific model is trained with XLM, an architecture that is competitive with BERT and many other models.\\n\",\n        \"BERT can also be found on Wikipedia, a multilingual version, which is trained in over 104 languages under the name: `bert-base-multilingual-cased`.\\n\",\n        \"\\n\",\n        \"Transformers are particularly well suited for these purposes:\\n\",\n        \"\\n\",\n        \"- Text generation\\n\",\n        \"- Learn a vector representation.\\n\",\n        \"- Determine if a sentence is the continuation of another sentence.\\n\",\n        \"\\n\",\n        \"\\n\",\n        \" Here is an example of using a transformer to predict whether one set is the continuation of another set. You can use this function for example if you want to split a thread of discussions into several different parts.\\n\",\n        \"\\n\",\n        \"It is assumed here that PyTorch and Transformers are installed:\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"```\\n\",\n        \"pip install transformers\\n\",\n        \"```\\n\",\n        \"\\n\",\n        \"\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"colab\": {\n          \"base_uri\": \"https://localhost:8080/\"\n        },\n        \"id\": \"h_qIaaGYfKFh\",\n        \"outputId\": \"7d94733f-5e80-4be5-c349-b76e6850d778\"\n      },\n      \"source\": [\n        \"pip install transformers\"\n      ],\n      \"execution_count\": null,\n      \"outputs\": [\n        {\n          \"output_type\": \"stream\",\n          \"text\": [\n            \"Collecting transformers\\n\",\n            \"\\u001b[?25l  Downloading https://files.pythonhosted.org/packages/3a/83/e74092e7f24a08d751aa59b37a9fc572b2e4af3918cb66f7766c3affb1b4/transformers-3.5.1-py3-none-any.whl (1.3MB)\\n\",\n            \"\\r\\u001b[K     |▎                               | 10kB 15.1MB/s eta 0:00:01\\r\\u001b[K     |▌                               | 20kB 19.5MB/s eta 0:00:01\\r\\u001b[K     |▊                               | 30kB 11.0MB/s eta 0:00:01\\r\\u001b[K     |█                               | 40kB 9.2MB/s eta 0:00:01\\r\\u001b[K     |█▎                              | 51kB 4.4MB/s eta 0:00:01\\r\\u001b[K     |█▌                              | 61kB 5.0MB/s eta 0:00:01\\r\\u001b[K     |█▊                              | 71kB 5.1MB/s eta 0:00:01\\r\\u001b[K     |██                              | 81kB 5.4MB/s eta 0:00:01\\r\\u001b[K     |██▎                             | 92kB 5.8MB/s eta 0:00:01\\r\\u001b[K     |██▌                             | 102kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |██▊                             | 112kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |███                             | 122kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |███▎                            | 133kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |███▌                            | 143kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |███▉                            | 153kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |████                            | 163kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |████▎                           | 174kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |████▌                           | 184kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |████▉                           | 194kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |█████                           | 204kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |█████▎                          | 215kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |█████▌                          | 225kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |█████▉                          | 235kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |██████                          | 245kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |██████▎                         | 256kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |██████▌                         | 266kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |██████▉                         | 276kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |███████                         | 286kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |███████▎                        | 296kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |███████▋                        | 307kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |███████▉                        | 317kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |████████                        | 327kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |████████▎                       | 337kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |████████▋                       | 348kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |████████▉                       | 358kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |█████████                       | 368kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |█████████▎                      | 378kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |█████████▋                      | 389kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |█████████▉                      | 399kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |██████████                      | 409kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |██████████▎                     | 419kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |██████████▋                     | 430kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |██████████▉                     | 440kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |███████████                     | 450kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |███████████▍                    | 460kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |███████████▋                    | 471kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |███████████▉                    | 481kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |████████████                    | 491kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |████████████▍                   | 501kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |████████████▋                   | 512kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |████████████▉                   | 522kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |█████████████                   | 532kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |█████████████▍                  | 542kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |█████████████▋                  | 552kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |█████████████▉                  | 563kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |██████████████                  | 573kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |██████████████▍                 | 583kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |██████████████▋                 | 593kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |██████████████▉                 | 604kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |███████████████▏                | 614kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |███████████████▍                | 624kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |███████████████▋                | 634kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |███████████████▉                | 645kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |████████████████▏               | 655kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |████████████████▍               | 665kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |████████████████▋               | 675kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |████████████████▉               | 686kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |█████████████████▏              | 696kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |█████████████████▍              | 706kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |█████████████████▋              | 716kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |██████████████████              | 727kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |██████████████████▏             | 737kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |██████████████████▍             | 747kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |██████████████████▋             | 757kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |███████████████████             | 768kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |███████████████████▏            | 778kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |███████████████████▍            | 788kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |███████████████████▋            | 798kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |████████████████████            | 808kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |████████████████████▏           | 819kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |████████████████████▍           | 829kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |████████████████████▋           | 839kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |█████████████████████           | 849kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |█████████████████████▏          | 860kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |█████████████████████▍          | 870kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |█████████████████████▊          | 880kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |██████████████████████          | 890kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |██████████████████████▏         | 901kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |██████████████████████▍         | 911kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |██████████████████████▊         | 921kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |███████████████████████         | 931kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |███████████████████████▏        | 942kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |███████████████████████▍        | 952kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |███████████████████████▊        | 962kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |████████████████████████        | 972kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |████████████████████████▏       | 983kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |████████████████████████▍       | 993kB 6.1MB/s eta 0:00:01\\r\\u001b[K     |████████████████████████▊       | 1.0MB 6.1MB/s eta 0:00:01\\r\\u001b[K     |█████████████████████████       | 1.0MB 6.1MB/s eta 0:00:01\\r\\u001b[K     |█████████████████████████▏      | 1.0MB 6.1MB/s eta 0:00:01\\r\\u001b[K     |█████████████████████████▌      | 1.0MB 6.1MB/s eta 0:00:01\\r\\u001b[K     |█████████████████████████▊      | 1.0MB 6.1MB/s eta 0:00:01\\r\\u001b[K     |██████████████████████████      | 1.1MB 6.1MB/s eta 0:00:01\\r\\u001b[K     |██████████████████████████▏     | 1.1MB 6.1MB/s eta 0:00:01\\r\\u001b[K     |██████████████████████████▌     | 1.1MB 6.1MB/s eta 0:00:01\\r\\u001b[K     |██████████████████████████▊     | 1.1MB 6.1MB/s eta 0:00:01\\r\\u001b[K     |███████████████████████████     | 1.1MB 6.1MB/s eta 0:00:01\\r\\u001b[K     |███████████████████████████▏    | 1.1MB 6.1MB/s eta 0:00:01\\r\\u001b[K     |███████████████████████████▌    | 1.1MB 6.1MB/s eta 0:00:01\\r\\u001b[K     |███████████████████████████▊    | 1.1MB 6.1MB/s eta 0:00:01\\r\\u001b[K     |████████████████████████████    | 1.1MB 6.1MB/s eta 0:00:01\\r\\u001b[K     |████████████████████████████▏   | 1.1MB 6.1MB/s eta 0:00:01\\r\\u001b[K     |████████████████████████████▌   | 1.2MB 6.1MB/s eta 0:00:01\\r\\u001b[K     |████████████████████████████▊   | 1.2MB 6.1MB/s eta 0:00:01\\r\\u001b[K     |█████████████████████████████   | 1.2MB 6.1MB/s eta 0:00:01\\r\\u001b[K     |█████████████████████████████▎  | 1.2MB 6.1MB/s eta 0:00:01\\r\\u001b[K     |█████████████████████████████▌  | 1.2MB 6.1MB/s eta 0:00:01\\r\\u001b[K     |█████████████████████████████▊  | 1.2MB 6.1MB/s eta 0:00:01\\r\\u001b[K     |██████████████████████████████  | 1.2MB 6.1MB/s eta 0:00:01\\r\\u001b[K     |██████████████████████████████▎ | 1.2MB 6.1MB/s eta 0:00:01\\r\\u001b[K     |██████████████████████████████▌ | 1.2MB 6.1MB/s eta 0:00:01\\r\\u001b[K     |██████████████████████████████▊ | 1.2MB 6.1MB/s eta 0:00:01\\r\\u001b[K     |███████████████████████████████ | 1.3MB 6.1MB/s eta 0:00:01\\r\\u001b[K     |███████████████████████████████▎| 1.3MB 6.1MB/s eta 0:00:01\\r\\u001b[K     |███████████████████████████████▌| 1.3MB 6.1MB/s eta 0:00:01\\r\\u001b[K     |███████████████████████████████▊| 1.3MB 6.1MB/s eta 0:00:01\\r\\u001b[K     |████████████████████████████████| 1.3MB 6.1MB/s eta 0:00:01\\r\\u001b[K     |████████████████████████████████| 1.3MB 6.1MB/s \\n\",\n            \"\\u001b[?25hRequirement already satisfied: packaging in /usr/local/lib/python3.6/dist-packages (from transformers) (20.4)\\n\",\n            \"Requirement already satisfied: regex!=2019.12.17 in /usr/local/lib/python3.6/dist-packages (from transformers) (2019.12.20)\\n\",\n            \"Collecting tokenizers==0.9.3\\n\",\n            \"\\u001b[?25l  Downloading https://files.pythonhosted.org/packages/4c/34/b39eb9994bc3c999270b69c9eea40ecc6f0e97991dba28282b9fd32d44ee/tokenizers-0.9.3-cp36-cp36m-manylinux1_x86_64.whl (2.9MB)\\n\",\n            \"\\u001b[K     |████████████████████████████████| 2.9MB 31.5MB/s \\n\",\n            \"\\u001b[?25hRequirement already satisfied: filelock in /usr/local/lib/python3.6/dist-packages (from transformers) (3.0.12)\\n\",\n            \"Requirement already satisfied: dataclasses; python_version < \\\"3.7\\\" in /usr/local/lib/python3.6/dist-packages (from transformers) (0.7)\\n\",\n            \"Requirement already satisfied: tqdm>=4.27 in /usr/local/lib/python3.6/dist-packages (from transformers) (4.41.1)\\n\",\n            \"Requirement already satisfied: protobuf in /usr/local/lib/python3.6/dist-packages (from transformers) (3.12.4)\\n\",\n            \"Collecting sentencepiece==0.1.91\\n\",\n            \"\\u001b[?25l  Downloading https://files.pythonhosted.org/packages/d4/a4/d0a884c4300004a78cca907a6ff9a5e9fe4f090f5d95ab341c53d28cbc58/sentencepiece-0.1.91-cp36-cp36m-manylinux1_x86_64.whl (1.1MB)\\n\",\n            \"\\u001b[K     |████████████████████████████████| 1.1MB 41.7MB/s \\n\",\n            \"\\u001b[?25hCollecting sacremoses\\n\",\n            \"\\u001b[?25l  Downloading https://files.pythonhosted.org/packages/7d/34/09d19aff26edcc8eb2a01bed8e98f13a1537005d31e95233fd48216eed10/sacremoses-0.0.43.tar.gz (883kB)\\n\",\n            \"\\u001b[K     |████████████████████████████████| 890kB 35.2MB/s \\n\",\n            \"\\u001b[?25hRequirement already satisfied: requests in /usr/local/lib/python3.6/dist-packages (from transformers) (2.23.0)\\n\",\n            \"Requirement already satisfied: numpy in /usr/local/lib/python3.6/dist-packages (from transformers) (1.18.5)\\n\",\n            \"Requirement already satisfied: pyparsing>=2.0.2 in /usr/local/lib/python3.6/dist-packages (from packaging->transformers) (2.4.7)\\n\",\n            \"Requirement already satisfied: six in /usr/local/lib/python3.6/dist-packages (from packaging->transformers) (1.15.0)\\n\",\n            \"Requirement already satisfied: setuptools in /usr/local/lib/python3.6/dist-packages (from protobuf->transformers) (50.3.2)\\n\",\n            \"Requirement already satisfied: click in /usr/local/lib/python3.6/dist-packages (from sacremoses->transformers) (7.1.2)\\n\",\n            \"Requirement already satisfied: joblib in /usr/local/lib/python3.6/dist-packages (from sacremoses->transformers) (0.17.0)\\n\",\n            \"Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.6/dist-packages (from requests->transformers) (2020.6.20)\\n\",\n            \"Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.6/dist-packages (from requests->transformers) (3.0.4)\\n\",\n            \"Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.6/dist-packages (from requests->transformers) (2.10)\\n\",\n            \"Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.6/dist-packages (from requests->transformers) (1.24.3)\\n\",\n            \"Building wheels for collected packages: sacremoses\\n\",\n            \"  Building wheel for sacremoses (setup.py) ... \\u001b[?25l\\u001b[?25hdone\\n\",\n            \"  Created wheel for sacremoses: filename=sacremoses-0.0.43-cp36-none-any.whl size=893257 sha256=4224e7d3ccb0145781ae5cfee3c366b12d19c233f4d48851884227b47925d881\\n\",\n            \"  Stored in directory: /root/.cache/pip/wheels/29/3c/fd/7ce5c3f0666dab31a50123635e6fb5e19ceb42ce38d4e58f45\\n\",\n            \"Successfully built sacremoses\\n\",\n            \"Installing collected packages: tokenizers, sentencepiece, sacremoses, transformers\\n\",\n            \"Successfully installed sacremoses-0.0.43 sentencepiece-0.1.91 tokenizers-0.9.3 transformers-3.5.1\\n\"\n          ],\n          \"name\": \"stdout\"\n        }\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"7C5QanGLffeq\"\n      },\n      \"source\": [\n        \"import torch\\n\",\n        \"from transformers import *\"\n      ],\n      \"execution_count\": null,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"j_CCAGLQfkt2\"\n      },\n      \"source\": [\n        \"Then a tokenizer and a model must be loaded.\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"```\\n\",\n        \"# Tokenizer, Model\\n\",\n        \"tokenizer = BertTokenizer.from_pretrained('bert-base-multilingual-cased')\\n\",\n        \"model = BertForNextSentencePrediction.from_pretrained('bert-base-multilingual-cased')\\n\",\n        \"model.eval()\\n\",\n        \"```\\n\",\n        \"\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"colab\": {\n          \"base_uri\": \"https://localhost:8080/\",\n          \"height\": 1000,\n          \"referenced_widgets\": [\n            \"26d196cb3b5f49d6a58b0b6a7faa0a2e\",\n            \"5fdd366777c944299f8c7a240ab58f3d\",\n            \"2b23898947884633a3b1665aa28e6e5f\",\n            \"28513edb62ff4bd1b1c42c128031af13\",\n            \"09a408e10a6547288d4e612f41e9c22c\",\n            \"dabd1b28f0c14cb0ad6b05d0b7bf23c3\",\n            \"f1f32bc6978347abb8371d1e2bd4d1fb\",\n            \"eeca8d2b0a6e45e7af4706afe125ea5a\",\n            \"a82d7eb6f6da4a2295774b3a2f54106d\",\n            \"0a24dd5f66a742f39caa3eab73c672c3\",\n            \"d366b5da53864a608c6c0ffe846c53db\",\n            \"d108aa37d71947f8ad71d971dac279a9\",\n            \"1c890a5539a94bfbac57d65043dc5f37\",\n            \"fd3d34b2f3124a098d0ee511050cbe72\",\n            \"d005e65a5bef424aa9e1c02707a3c5f8\",\n            \"6a5d680bbe98498081004a1217cbeba7\",\n            \"245d2aa69c55432a90c0913a67dc0dac\",\n            \"bd8e18d533e1435db1f1908ca4798140\",\n            \"133a80bb45ef4ad4bf94db7869ef1474\",\n            \"84ef678210cf4863970374c073753e05\",\n            \"e54b31e969ff450e842a0ff6a01e8559\",\n            \"d6dcbc869f564caeaf71d1297412601e\",\n            \"21470668fa4b47579b10194b507ab3d9\",\n            \"3307884b360343e0899983db9aa76683\"\n          ]\n        },\n        \"id\": \"RuUIGwz4ftnd\",\n        \"outputId\": \"ce979d94-dc51-4e37-c905-8111e18f9d6f\"\n      },\n      \"source\": [\n        \"# Tokenizer, Model\\n\",\n        \"tokenizer = BertTokenizer.from_pretrained('bert-base-multilingual-cased')\\n\",\n        \"model = BertForNextSentencePrediction.from_pretrained('bert-base-multilingual-cased')\\n\",\n        \"model.eval()\"\n      ],\n      \"execution_count\": null,\n      \"outputs\": [\n        {\n          \"output_type\": \"display_data\",\n          \"data\": {\n            \"application/vnd.jupyter.widget-view+json\": {\n              \"model_id\": \"26d196cb3b5f49d6a58b0b6a7faa0a2e\",\n              \"version_minor\": 0,\n              \"version_major\": 2\n            },\n            \"text/plain\": [\n              \"HBox(children=(FloatProgress(value=0.0, description='Downloading', max=995526.0, style=ProgressStyle(descripti…\"\n            ]\n          },\n          \"metadata\": {\n            \"tags\": []\n          }\n        },\n        {\n          \"output_type\": \"stream\",\n          \"text\": [\n            \"\\n\"\n          ],\n          \"name\": \"stdout\"\n        },\n        {\n          \"output_type\": \"display_data\",\n          \"data\": {\n            \"application/vnd.jupyter.widget-view+json\": {\n              \"model_id\": \"a82d7eb6f6da4a2295774b3a2f54106d\",\n              \"version_minor\": 0,\n              \"version_major\": 2\n            },\n            \"text/plain\": [\n              \"HBox(children=(FloatProgress(value=0.0, description='Downloading', max=625.0, style=ProgressStyle(description_…\"\n            ]\n          },\n          \"metadata\": {\n            \"tags\": []\n          }\n        },\n        {\n          \"output_type\": \"stream\",\n          \"text\": [\n            \"\\n\"\n          ],\n          \"name\": \"stdout\"\n        },\n        {\n          \"output_type\": \"display_data\",\n          \"data\": {\n            \"application/vnd.jupyter.widget-view+json\": {\n              \"model_id\": \"245d2aa69c55432a90c0913a67dc0dac\",\n              \"version_minor\": 0,\n              \"version_major\": 2\n            },\n            \"text/plain\": [\n              \"HBox(children=(FloatProgress(value=0.0, description='Downloading', max=714314041.0, style=ProgressStyle(descri…\"\n            ]\n          },\n          \"metadata\": {\n            \"tags\": []\n          }\n        },\n        {\n          \"output_type\": \"stream\",\n          \"text\": [\n            \"\\n\"\n          ],\n          \"name\": \"stdout\"\n        },\n        {\n          \"output_type\": \"stream\",\n          \"text\": [\n            \"Some weights of the model checkpoint at bert-base-multilingual-cased were not used when initializing BertForNextSentencePrediction: ['cls.predictions.bias', 'cls.predictions.transform.dense.weight', 'cls.predictions.transform.dense.bias', 'cls.predictions.decoder.weight', 'cls.predictions.transform.LayerNorm.weight', 'cls.predictions.transform.LayerNorm.bias']\\n\",\n            \"- This IS expected if you are initializing BertForNextSentencePrediction from the checkpoint of a model trained on another task or with another architecture (e.g. initializing a BertForSequenceClassification model from a BertForPreTraining model).\\n\",\n            \"- This IS NOT expected if you are initializing BertForNextSentencePrediction from the checkpoint of a model that you expect to be exactly identical (initializing a BertForSequenceClassification model from a BertForSequenceClassification model).\\n\"\n          ],\n          \"name\": \"stderr\"\n        },\n        {\n          \"output_type\": \"execute_result\",\n          \"data\": {\n            \"text/plain\": [\n              \"BertForNextSentencePrediction(\\n\",\n              \"  (bert): BertModel(\\n\",\n              \"    (embeddings): BertEmbeddings(\\n\",\n              \"      (word_embeddings): Embedding(119547, 768, padding_idx=0)\\n\",\n              \"      (position_embeddings): Embedding(512, 768)\\n\",\n              \"      (token_type_embeddings): Embedding(2, 768)\\n\",\n              \"      (LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)\\n\",\n              \"      (dropout): Dropout(p=0.1, inplace=False)\\n\",\n              \"    )\\n\",\n              \"    (encoder): BertEncoder(\\n\",\n              \"      (layer): ModuleList(\\n\",\n              \"        (0): BertLayer(\\n\",\n              \"          (attention): BertAttention(\\n\",\n              \"            (self): BertSelfAttention(\\n\",\n              \"              (query): Linear(in_features=768, out_features=768, bias=True)\\n\",\n              \"              (key): Linear(in_features=768, out_features=768, bias=True)\\n\",\n              \"              (value): Linear(in_features=768, out_features=768, bias=True)\\n\",\n              \"              (dropout): Dropout(p=0.1, inplace=False)\\n\",\n              \"            )\\n\",\n              \"            (output): BertSelfOutput(\\n\",\n              \"              (dense): Linear(in_features=768, out_features=768, bias=True)\\n\",\n              \"              (LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)\\n\",\n              \"              (dropout): Dropout(p=0.1, inplace=False)\\n\",\n              \"            )\\n\",\n              \"          )\\n\",\n              \"          (intermediate): BertIntermediate(\\n\",\n              \"            (dense): Linear(in_features=768, out_features=3072, bias=True)\\n\",\n              \"          )\\n\",\n              \"          (output): BertOutput(\\n\",\n              \"            (dense): Linear(in_features=3072, out_features=768, bias=True)\\n\",\n              \"            (LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)\\n\",\n              \"            (dropout): Dropout(p=0.1, inplace=False)\\n\",\n              \"          )\\n\",\n              \"        )\\n\",\n              \"        (1): BertLayer(\\n\",\n              \"          (attention): BertAttention(\\n\",\n              \"            (self): BertSelfAttention(\\n\",\n              \"              (query): Linear(in_features=768, out_features=768, bias=True)\\n\",\n              \"              (key): Linear(in_features=768, out_features=768, bias=True)\\n\",\n              \"              (value): Linear(in_features=768, out_features=768, bias=True)\\n\",\n              \"              (dropout): Dropout(p=0.1, inplace=False)\\n\",\n              \"            )\\n\",\n              \"            (output): BertSelfOutput(\\n\",\n              \"              (dense): Linear(in_features=768, out_features=768, bias=True)\\n\",\n              \"              (LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)\\n\",\n              \"              (dropout): Dropout(p=0.1, inplace=False)\\n\",\n              \"            )\\n\",\n              \"          )\\n\",\n              \"          (intermediate): BertIntermediate(\\n\",\n              \"            (dense): Linear(in_features=768, out_features=3072, bias=True)\\n\",\n              \"          )\\n\",\n              \"          (output): BertOutput(\\n\",\n              \"            (dense): Linear(in_features=3072, out_features=768, bias=True)\\n\",\n              \"            (LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)\\n\",\n              \"            (dropout): Dropout(p=0.1, inplace=False)\\n\",\n              \"          )\\n\",\n              \"        )\\n\",\n              \"        (2): BertLayer(\\n\",\n              \"          (attention): BertAttention(\\n\",\n              \"            (self): BertSelfAttention(\\n\",\n              \"              (query): Linear(in_features=768, out_features=768, bias=True)\\n\",\n              \"              (key): Linear(in_features=768, out_features=768, bias=True)\\n\",\n              \"              (value): Linear(in_features=768, out_features=768, bias=True)\\n\",\n              \"              (dropout): Dropout(p=0.1, inplace=False)\\n\",\n              \"            )\\n\",\n              \"            (output): BertSelfOutput(\\n\",\n              \"              (dense): Linear(in_features=768, out_features=768, bias=True)\\n\",\n              \"              (LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)\\n\",\n              \"              (dropout): Dropout(p=0.1, inplace=False)\\n\",\n              \"            )\\n\",\n              \"          )\\n\",\n              \"          (intermediate): BertIntermediate(\\n\",\n              \"            (dense): Linear(in_features=768, out_features=3072, bias=True)\\n\",\n              \"          )\\n\",\n              \"          (output): BertOutput(\\n\",\n              \"            (dense): Linear(in_features=3072, out_features=768, bias=True)\\n\",\n              \"            (LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)\\n\",\n              \"            (dropout): Dropout(p=0.1, inplace=False)\\n\",\n              \"          )\\n\",\n              \"        )\\n\",\n              \"        (3): BertLayer(\\n\",\n              \"          (attention): BertAttention(\\n\",\n              \"            (self): BertSelfAttention(\\n\",\n              \"              (query): Linear(in_features=768, out_features=768, bias=True)\\n\",\n              \"              (key): Linear(in_features=768, out_features=768, bias=True)\\n\",\n              \"              (value): Linear(in_features=768, out_features=768, bias=True)\\n\",\n              \"              (dropout): Dropout(p=0.1, inplace=False)\\n\",\n              \"            )\\n\",\n              \"            (output): BertSelfOutput(\\n\",\n              \"              (dense): Linear(in_features=768, out_features=768, bias=True)\\n\",\n              \"              (LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)\\n\",\n              \"              (dropout): Dropout(p=0.1, inplace=False)\\n\",\n              \"            )\\n\",\n              \"          )\\n\",\n              \"          (intermediate): BertIntermediate(\\n\",\n              \"            (dense): Linear(in_features=768, out_features=3072, bias=True)\\n\",\n              \"          )\\n\",\n              \"          (output): BertOutput(\\n\",\n              \"            (dense): Linear(in_features=3072, out_features=768, bias=True)\\n\",\n              \"            (LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)\\n\",\n              \"            (dropout): Dropout(p=0.1, inplace=False)\\n\",\n              \"          )\\n\",\n              \"        )\\n\",\n              \"        (4): BertLayer(\\n\",\n              \"          (attention): BertAttention(\\n\",\n              \"            (self): BertSelfAttention(\\n\",\n              \"              (query): Linear(in_features=768, out_features=768, bias=True)\\n\",\n              \"              (key): Linear(in_features=768, out_features=768, bias=True)\\n\",\n              \"              (value): Linear(in_features=768, out_features=768, bias=True)\\n\",\n              \"              (dropout): Dropout(p=0.1, inplace=False)\\n\",\n              \"            )\\n\",\n              \"            (output): BertSelfOutput(\\n\",\n              \"              (dense): Linear(in_features=768, out_features=768, bias=True)\\n\",\n              \"              (LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)\\n\",\n              \"              (dropout): Dropout(p=0.1, inplace=False)\\n\",\n              \"            )\\n\",\n              \"          )\\n\",\n              \"          (intermediate): BertIntermediate(\\n\",\n              \"            (dense): Linear(in_features=768, out_features=3072, bias=True)\\n\",\n              \"          )\\n\",\n              \"          (output): BertOutput(\\n\",\n              \"            (dense): Linear(in_features=3072, out_features=768, bias=True)\\n\",\n              \"            (LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)\\n\",\n              \"            (dropout): Dropout(p=0.1, inplace=False)\\n\",\n              \"          )\\n\",\n              \"        )\\n\",\n              \"        (5): BertLayer(\\n\",\n              \"          (attention): BertAttention(\\n\",\n              \"            (self): BertSelfAttention(\\n\",\n              \"              (query): Linear(in_features=768, out_features=768, bias=True)\\n\",\n              \"              (key): Linear(in_features=768, out_features=768, bias=True)\\n\",\n              \"              (value): Linear(in_features=768, out_features=768, bias=True)\\n\",\n              \"              (dropout): Dropout(p=0.1, inplace=False)\\n\",\n              \"            )\\n\",\n              \"            (output): BertSelfOutput(\\n\",\n              \"              (dense): Linear(in_features=768, out_features=768, bias=True)\\n\",\n              \"              (LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)\\n\",\n              \"              (dropout): Dropout(p=0.1, inplace=False)\\n\",\n              \"            )\\n\",\n              \"          )\\n\",\n              \"          (intermediate): BertIntermediate(\\n\",\n              \"            (dense): Linear(in_features=768, out_features=3072, bias=True)\\n\",\n              \"          )\\n\",\n              \"          (output): BertOutput(\\n\",\n              \"            (dense): Linear(in_features=3072, out_features=768, bias=True)\\n\",\n              \"            (LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)\\n\",\n              \"            (dropout): Dropout(p=0.1, inplace=False)\\n\",\n              \"          )\\n\",\n              \"        )\\n\",\n              \"        (6): BertLayer(\\n\",\n              \"          (attention): BertAttention(\\n\",\n              \"            (self): BertSelfAttention(\\n\",\n              \"              (query): Linear(in_features=768, out_features=768, bias=True)\\n\",\n              \"              (key): Linear(in_features=768, out_features=768, bias=True)\\n\",\n              \"              (value): Linear(in_features=768, out_features=768, bias=True)\\n\",\n              \"              (dropout): Dropout(p=0.1, inplace=False)\\n\",\n              \"            )\\n\",\n              \"            (output): BertSelfOutput(\\n\",\n              \"              (dense): Linear(in_features=768, out_features=768, bias=True)\\n\",\n              \"              (LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)\\n\",\n              \"              (dropout): Dropout(p=0.1, inplace=False)\\n\",\n              \"            )\\n\",\n              \"          )\\n\",\n              \"          (intermediate): BertIntermediate(\\n\",\n              \"            (dense): Linear(in_features=768, out_features=3072, bias=True)\\n\",\n              \"          )\\n\",\n              \"          (output): BertOutput(\\n\",\n              \"            (dense): Linear(in_features=3072, out_features=768, bias=True)\\n\",\n              \"            (LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)\\n\",\n              \"            (dropout): Dropout(p=0.1, inplace=False)\\n\",\n              \"          )\\n\",\n              \"        )\\n\",\n              \"        (7): BertLayer(\\n\",\n              \"          (attention): BertAttention(\\n\",\n              \"            (self): BertSelfAttention(\\n\",\n              \"              (query): Linear(in_features=768, out_features=768, bias=True)\\n\",\n              \"              (key): Linear(in_features=768, out_features=768, bias=True)\\n\",\n              \"              (value): Linear(in_features=768, out_features=768, bias=True)\\n\",\n              \"              (dropout): Dropout(p=0.1, inplace=False)\\n\",\n              \"            )\\n\",\n              \"            (output): BertSelfOutput(\\n\",\n              \"              (dense): Linear(in_features=768, out_features=768, bias=True)\\n\",\n              \"              (LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)\\n\",\n              \"              (dropout): Dropout(p=0.1, inplace=False)\\n\",\n              \"            )\\n\",\n              \"          )\\n\",\n              \"          (intermediate): BertIntermediate(\\n\",\n              \"            (dense): Linear(in_features=768, out_features=3072, bias=True)\\n\",\n              \"          )\\n\",\n              \"          (output): BertOutput(\\n\",\n              \"            (dense): Linear(in_features=3072, out_features=768, bias=True)\\n\",\n              \"            (LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)\\n\",\n              \"            (dropout): Dropout(p=0.1, inplace=False)\\n\",\n              \"          )\\n\",\n              \"        )\\n\",\n              \"        (8): BertLayer(\\n\",\n              \"          (attention): BertAttention(\\n\",\n              \"            (self): BertSelfAttention(\\n\",\n              \"              (query): Linear(in_features=768, out_features=768, bias=True)\\n\",\n              \"              (key): Linear(in_features=768, out_features=768, bias=True)\\n\",\n              \"              (value): Linear(in_features=768, out_features=768, bias=True)\\n\",\n              \"              (dropout): Dropout(p=0.1, inplace=False)\\n\",\n              \"            )\\n\",\n              \"            (output): BertSelfOutput(\\n\",\n              \"              (dense): Linear(in_features=768, out_features=768, bias=True)\\n\",\n              \"              (LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)\\n\",\n              \"              (dropout): Dropout(p=0.1, inplace=False)\\n\",\n              \"            )\\n\",\n              \"          )\\n\",\n              \"          (intermediate): BertIntermediate(\\n\",\n              \"            (dense): Linear(in_features=768, out_features=3072, bias=True)\\n\",\n              \"          )\\n\",\n              \"          (output): BertOutput(\\n\",\n              \"            (dense): Linear(in_features=3072, out_features=768, bias=True)\\n\",\n              \"            (LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)\\n\",\n              \"            (dropout): Dropout(p=0.1, inplace=False)\\n\",\n              \"          )\\n\",\n              \"        )\\n\",\n              \"        (9): BertLayer(\\n\",\n              \"          (attention): BertAttention(\\n\",\n              \"            (self): BertSelfAttention(\\n\",\n              \"              (query): Linear(in_features=768, out_features=768, bias=True)\\n\",\n              \"              (key): Linear(in_features=768, out_features=768, bias=True)\\n\",\n              \"              (value): Linear(in_features=768, out_features=768, bias=True)\\n\",\n              \"              (dropout): Dropout(p=0.1, inplace=False)\\n\",\n              \"            )\\n\",\n              \"            (output): BertSelfOutput(\\n\",\n              \"              (dense): Linear(in_features=768, out_features=768, bias=True)\\n\",\n              \"              (LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)\\n\",\n              \"              (dropout): Dropout(p=0.1, inplace=False)\\n\",\n              \"            )\\n\",\n              \"          )\\n\",\n              \"          (intermediate): BertIntermediate(\\n\",\n              \"            (dense): Linear(in_features=768, out_features=3072, bias=True)\\n\",\n              \"          )\\n\",\n              \"          (output): BertOutput(\\n\",\n              \"            (dense): Linear(in_features=3072, out_features=768, bias=True)\\n\",\n              \"            (LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)\\n\",\n              \"            (dropout): Dropout(p=0.1, inplace=False)\\n\",\n              \"          )\\n\",\n              \"        )\\n\",\n              \"        (10): BertLayer(\\n\",\n              \"          (attention): BertAttention(\\n\",\n              \"            (self): BertSelfAttention(\\n\",\n              \"              (query): Linear(in_features=768, out_features=768, bias=True)\\n\",\n              \"              (key): Linear(in_features=768, out_features=768, bias=True)\\n\",\n              \"              (value): Linear(in_features=768, out_features=768, bias=True)\\n\",\n              \"              (dropout): Dropout(p=0.1, inplace=False)\\n\",\n              \"            )\\n\",\n              \"            (output): BertSelfOutput(\\n\",\n              \"              (dense): Linear(in_features=768, out_features=768, bias=True)\\n\",\n              \"              (LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)\\n\",\n              \"              (dropout): Dropout(p=0.1, inplace=False)\\n\",\n              \"            )\\n\",\n              \"          )\\n\",\n              \"          (intermediate): BertIntermediate(\\n\",\n              \"            (dense): Linear(in_features=768, out_features=3072, bias=True)\\n\",\n              \"          )\\n\",\n              \"          (output): BertOutput(\\n\",\n              \"            (dense): Linear(in_features=3072, out_features=768, bias=True)\\n\",\n              \"            (LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)\\n\",\n              \"            (dropout): Dropout(p=0.1, inplace=False)\\n\",\n              \"          )\\n\",\n              \"        )\\n\",\n              \"        (11): BertLayer(\\n\",\n              \"          (attention): BertAttention(\\n\",\n              \"            (self): BertSelfAttention(\\n\",\n              \"              (query): Linear(in_features=768, out_features=768, bias=True)\\n\",\n              \"              (key): Linear(in_features=768, out_features=768, bias=True)\\n\",\n              \"              (value): Linear(in_features=768, out_features=768, bias=True)\\n\",\n              \"              (dropout): Dropout(p=0.1, inplace=False)\\n\",\n              \"            )\\n\",\n              \"            (output): BertSelfOutput(\\n\",\n              \"              (dense): Linear(in_features=768, out_features=768, bias=True)\\n\",\n              \"              (LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)\\n\",\n              \"              (dropout): Dropout(p=0.1, inplace=False)\\n\",\n              \"            )\\n\",\n              \"          )\\n\",\n              \"          (intermediate): BertIntermediate(\\n\",\n              \"            (dense): Linear(in_features=768, out_features=3072, bias=True)\\n\",\n              \"          )\\n\",\n              \"          (output): BertOutput(\\n\",\n              \"            (dense): Linear(in_features=3072, out_features=768, bias=True)\\n\",\n              \"            (LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)\\n\",\n              \"            (dropout): Dropout(p=0.1, inplace=False)\\n\",\n              \"          )\\n\",\n              \"        )\\n\",\n              \"      )\\n\",\n              \"    )\\n\",\n              \"    (pooler): BertPooler(\\n\",\n              \"      (dense): Linear(in_features=768, out_features=768, bias=True)\\n\",\n              \"      (activation): Tanh()\\n\",\n              \"    )\\n\",\n              \"  )\\n\",\n              \"  (cls): BertOnlyNSPHead(\\n\",\n              \"    (seq_relationship): Linear(in_features=768, out_features=2, bias=True)\\n\",\n              \"  )\\n\",\n              \")\"\n            ]\n          },\n          \"metadata\": {\n            \"tags\": []\n          },\n          \"execution_count\": 63\n        }\n      ]\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"QrH8Gs8hf3aV\"\n      },\n      \"source\": [\n        \"The line `model.eval()` is used to switch the model to evaluation mode. Subsequently, a sequence of text converted into tokens, and sentence boundaries are passed to the model:\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"```\\n\",\n        \"text = \\\"Come sta andando? Sto bene, grazie.\\\"\\n\",\n        \"# Tokenized text\\n\",\n        \"tokenized_text = tokenizer.tokenize(text)\\n\",\n        \"# Convert text into indexes\\n\",\n        \"indexed_tokens = tokenizer.convert_tokens_to_ids(tokenized_text)\\n\",\n        \"segments_ids = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1]\\n\",\n        \"```\\n\",\n        \"\\n\",\n        \"\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"LI7TXCPNgprj\"\n      },\n      \"source\": [\n        \"text = \\\"Come sta andando? Sto bene, grazie.\\\"\\n\",\n        \"# Tokenized text\\n\",\n        \"tokenized_text = tokenizer.tokenize(text)\\n\",\n        \"# Convert text into indexes\\n\",\n        \"indexed_tokens = tokenizer.convert_tokens_to_ids(tokenized_text)\\n\",\n        \"segments_ids = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1]\"\n      ],\n      \"execution_count\": null,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"3eRogk6ggv9k\"\n      },\n      \"source\": [\n        \"The whole is converted into tensors that can be interpreted by the model:\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"```\\n\",\n        \"# Transform into tensors\\n\",\n        \"tokens_tensor = torch.tensor([indexed_tokens])\\n\",\n        \"segments_tensors = torch.tensor([segments_ids])\\n\",\n        \"```\\n\",\n        \"\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"vZRvGZW9g43w\"\n      },\n      \"source\": [\n        \"# Transform into tensors\\n\",\n        \"tokens_tensor = torch.tensor([indexed_tokens])\\n\",\n        \"segments_tensors = torch.tensor([segments_ids])\"\n      ],\n      \"execution_count\": null,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"Fh9nrn2Ag_O3\"\n      },\n      \"source\": [\n        \"Finally, it is predicted whether the second sentence is a continuation of the first:\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"```\\n\",\n        \"predictions = model(tokens_tensor, segments_tensors)\\n\",\n        \"\\n\",\n        \"```\\n\",\n        \"\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"1LnSm8achDiC\"\n      },\n      \"source\": [\n        \"predictions = model(tokens_tensor, segments_tensors)\\n\"\n      ],\n      \"execution_count\": null,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"9cZB15Abh3V2\"\n      },\n      \"source\": [\n        \"If the element at position 0 is larger than that at position 1, the sentence is considered as a continuation of the first one. Otherwise a new discussion starts.\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"```\\n\",\n        \"if np.argmax(predictions) == 0:\\n\",\n        \"    print(\\\"Continued\\\")\\n\",\n        \"else:\\n\",\n        \"    print(\\\"No continuation\\\")\\n\",\n        \"```\\n\",\n        \"\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"colab\": {\n          \"base_uri\": \"https://localhost:8080/\"\n        },\n        \"id\": \"N5xAapBTiDgj\",\n        \"outputId\": \"e0e959e3-5737-4bb9-bea1-e0598e113ef3\"\n      },\n      \"source\": [\n        \"if np.argmax(predictions) == 0:\\n\",\n        \"    print(\\\"Continued\\\")\\n\",\n        \"else:\\n\",\n        \"    print(\\\"No continuation\\\")\"\n      ],\n      \"execution_count\": null,\n      \"outputs\": [\n        {\n          \"output_type\": \"stream\",\n          \"text\": [\n            \"Continued\\n\"\n          ],\n          \"name\": \"stdout\"\n        }\n      ]\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"XwoBtBjViG1s\"\n      },\n      \"source\": [\n        \"# Conclusion\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"This guide covers many applications of Automatic Natural Language Processing in Italian. Many of the resources are only available in English, but there are some interesting tools in Italian, whether your NLP problem is text classification with Tf-IdF, or you are using deep learning or transformer-based methods.\"\n      ]\n    }\n  ]\n}"
  },
  {
    "path": "Topics/do_you_need_ml.md",
    "content": "\n# Do you really need Machine Learning?\n\n# What you will learn \nThe purpose of this guide is to warn you that there is not always a need for machine learning solutions. Don't mistake everything for a nail, just because you know how to use a hammer!\n\n## Prerequisites\nit would be appropriate to have read before:\n- [Demystification about AI and ML](Demystification.md)\n- [What do you need for ML](prerequisites.md)\n\n## Time to complete\n15 minutes.\n\n# Index\n - [Distinguish Hype from Opportunities](#Distinguish-Hype-from-Opportunities)\n   - [Kill the Hype](#Kill-the-Hype)\n   - [Evaluate Opportunities](#Opportunities)\n   - [The Charming Salesman](#The-Charming-Salesman)\n - [No ML without data](#No-ML-without-data)\n - [No value without a cultural change](#No-value-without-a-cultural-change)\n - [Conclusions](#conclusions)\n\nLet's dive right in!\n \n### Distinguish Hype from Opportunities\nAlthough AI and Machine Learning offer immense business and product opportunities, they are not always the recipe for all evils. Indeed, be wary of those who tell you that with these tools you can solve any kind of problem. In this guide we try to break down the various factors that may suggest the non-feasibility of a Machine Learning project.\n\n#### Kill the Hype\n\n[Hype](https://it.wikipedia.org/wiki/Hype) is a clamor around a person or a fact, an insistent and powerful voice that projects it to the top of the headlines and in positive opinions. Often (not always) however, it's a straw fire, a passing fashion that falls as the facts belie expectations.\n\nThere's too much hype around ML and in particular [Deep Learning](https://medium.com/@hypergiant/is-neural-network-hype-killing-machine-learning-120041406f1).  \n\nDeep learning creates learning models by acquiring notions that are passed on to it by algorithms and that it organizes in a pyramidal way, managing to learn more complex concepts starting from the simplest ones.\n\nBut deep learning requires three elements to function, as we have seen in previous guides:\n\n- date\n- know-how\n- computational power\n\nBe wary of anyone who proposes a Deep Learning project that lacks one of these three elements, and ask specific questions about each of them. \nYou can refer to [this previous guide](do_you_need_ml.md) for guidelines on how to compare responses and understand the feasibility of projects.\nOf course, to fully evaluate the feasibility of a project you need experience and knowledge of the domain, but you can rest assured that if one of the three elements is missing, it is likely that what is being proposed is pure distillate of hype.\n\nSo we understand how justified hype is, in the sense that Deep Learning opens up incredible possibilities and without previous examples, but it is also a double-edged weapon, which can damage the very economy of technology because it does not meet the (too high) expectations.\n\n#### Evaluate Opportunities\nThe previous premise does not take away the fact that if you have data, know-how and computational power, it is _probable_ that Deep Learning can offer you incredible possibilities. \n\nHow can you find out if the data you have hides hidden pearls? in general you can think that, having the right amount of data (for example, rows of a database), you can use Machine Learning methods to predict the value (continuous) or the class (discrete) associated with a row. In other words, you can try to predict the value of a column!\n\nImagine the following (simplified) situation: \n\nWe have an e-commerce database, which contains for each line the record of purchase of a product. \nSome columns are: \"name\", \"color\", \"price\", \"price range\".\nThe column \"price range\" contains a label that identifies if an item has a low price or high, and is provided by the company that produces the product (we have not assigned it).\n \nEvery now and then, however, the company that supplies the products is careless and forgets to assign a price range to the object. \n \nHow can we solve this problem?\n\nThe problem consists in a binary classification task that takes as input the price of the object (some features, such as color, do not affect the price in this case) and returns in output the label of the price range (\"high\" or \"low\").\n\n- We can try to apply a Deep Learning technique\n- We can try to apply a more general Machine Learning technique\n- We can use a heuristics program that's been created specifically for that.\n\nLet's analyze the various possibilities:\n\nFirst of all, it must be said that the simplest solution would perhaps be to change supplier :-)\nApart from this joke not funny, let's start from the case of application of Deep Learning, then a \"prmitive\" Machine Learning linear model, and then the heuristic.\n\nYou could think of developing a neural network that takes in input all the features and returns in output the value of the price range. But it would probably be an overkill! In fact, as we know, the data must be cleaned, prepared to be inserted into the network, the network must be trained and adjusted until it reaches satisfactory evaluation metrics! In addition, if tomorrow the requirements of the forecast change (for example because you add a new label) all this process would be to be done again, and a new network would be to be trained.\n\nDeep learning is an extremely powerful tool, and for this reason you should avoid using it for tasks that are too simple (overengineering is never good).\n\nThis problem can be solved much more simply with a simple Machine Learning generic linear model that maps the input to the output without the need to introduce \"non-linearity\" (main advantage of neural networks). A linear classifier can easily solve the problem, and would probably get even better performance (for reasons that are beyond the scope of this guide, such as lower variance).\n\nIndeed, this problem is so simple that the use of heuristic rules such as \"if... then...\" could solve it. In fact we could notice that simply all the objects are a certain N value are classified as \"cheap\" and those above that N as \"very expensive\". This simple heuristics, expressed with two lines of code in any programming language, solves the problem in the same way. \n\nThis reasoning exercise does not want to \"put Deep Learning and Machine Learning in a bad light\" at all, on the contrary! \n\nBut it must be used to understand that they are not always the simplest solution, and sometimes they can be a useless effort (especially in the absence of data, they are worth little).\n\n[This](https://medium.com/datadriveninvestor/when-not-to-use-neural-networks-89fb50622429) article has good considerations about this.\n\nSo always ask yourself the following question: is my problem quite complex and I have enough data to make useful machine learning techniques or even deep learning?\n\n#### The Charming Salesman\nInformation technology like any other industry is first and foremost a business.\n\nThe techniques and tools of ML and DL are no exception, and their primary task is to solve business problems. That's why they suffer from the same problems as traditional software in the agreement phase between the software developer and the user, and maybe even worse (the hype plays bad tricks)!\n\nHave you ever had someone tell you how they developed a powerful, complicated, aesthetically pleasing application, and all at a low price? Well, would you believe them? If someone told you they could take you to the moon for 1000 euros, would you believe them?\n\nLikewise, be on your guard against those who promise you advanced recommendation engines like NetFlix, or conversational agents that replace psychologists!\n\nIn particular, I can't stress more on this, make sure that the data exist, are easily available, are transformable to represent the problem you want to solve! \n\nMost problems in the ML world occur due to [unfulfilled expectations](https://www.nature.com/articles/d41586-018-07504-9).\n\nOther reasons for the failure of ML projects can be found [here](https://www.kdnuggets.com/2018/07/why-machine-learning-project-fail.html), reading is strongly recommended.\n\nAgain, these tips don't want to keep you away from the ML, on the contrary! Virgil exists for the very opposite reason.\n\nBut what Virgil proposes to do is also to honestly communicate what you can do and what you can't, and give you all the tools to be able to move around this world in a conscious way! \n\nThat's what a good guide does!\n\n### No ML without data\nSuppose you're within an organization, or you have a problem of your own that you want to solve, and you understand what opportunities the ML offers. We've seen that the key elements you need are data, computing power and know-how.\n\nIf you cannot get the data you need for technical, confidentiality, or relational reasons, forget about the ML. In fact, without the data you can do nothing, just as you can't grow a plant without a seed.\n\nSo generally the success of an ML project must be sponsored \"from above\", by those who have access to the data, by those who can retrieve it and make it available.  \n\nTo be clear, you don't need unthinkable amounts of data (even if numbers help), [but the less data you have, the more difficult it is to generate value](https://medium.com/swlh/can-your-business-use-machine-learning-without-data-340c59bf9fb0) through ML projects.\n\nIf your boss asks you for a predictive model but doesn't give you the data or access permissions to it, he probably hasn't understood anything about how Machine Learning works, and it's better to try explaining it to him, maybe taking him for a walk here in Paradise :-)\n\n### No value without a cultural change\n\nAt the end of the day, what interests those who put the money in, is the value generated by a project.\n\nIt is therefore clear that without a change of (cultural) approach to the issue of data, it is impossible to create value through Machine Learning projects, and thus meet the needs of those who want the problem to be solved.\n\nIf a chat-bot is developed within a company, and it is not used, it is useless. \n\nIf recommendation systems are put in place, but then there is no care for the production and care of high quality data, it is useless.\n\nThe cultural change is the main \"soft\" requirement of the success of a Machine Learning project, and often also the most underestimated. \n\nIn a future guide, the issue of \"becoming a data-driven company\" will be addressed.\n\n### Conclusions\n\nThe purpose of this guide is to provide awareness about the real business possibilities of Machine Learning.\n\nWe have seen the risks and possible pitfalls of machine learning projects based on hype and not on solid foundations such as large amounts of data and realistic assessment of the difficulty of solving a problem.\n\nWe have also seen how without a radical change of mentality and approach, even the most successful ML project is useless: imagine owning a Ferrari but not knowing how to drive!\n\n\n----\n\nWritten by [_clone95_](https://github.com/clone95)\n\n"
  },
  {
    "path": "Topics/ds_process.md",
    "content": "# The Data Science Process Lifecycle\n\n# What you will learn \nIn this guide you will understand the big picture of the Data Science project lifecycle, why and how to perform each step, \nfrom collecting the data to putting predictive models in production. You can then use this guide as a \"checklist\" of to-do \nsteps to perform during your projects. \n\n## Prerequisites\nThere are no prerequisites for this guide.\n\n## Time to complete\n20 minutes.\n\n# Index\n- [Motivation](#Motivation)\n- [Frame the problem](#Frame-the-problem)\n- [Collect and prepare the data](#Collect-and-prepare-the-data)\n- [Select and train an ML model](#Select-and-train-an-ML-model)\n- [Evaluate and fine tuning](#Evaluate-and-fine-tuning)\n- [Launch and mantain the system](#Launch-and-mantain-the-system)\n- [Conclusions](#Conclusions)\n\nLet's dive right in!\n \n### Motivation\nYou can find hundreds of online articles describing the process of developing a Data Science project. \nIn this article Virgilio does not aim to give you the details of each phase, which will be dealt with in more technical guides,\nbut rather aims to give you an overview of the various steps, as well as a sort of checklist to keep in mind when starting a project.\n\nAs you may have noticed, **the structure of Purgatory reflects the entire Data Science process lifecycle**, with each _section_ corresponding to a macro phase, and each _guide_ within it corresponding to a sub-stage of the process. This content organization is designed to provide clarity to the structure of Purgatorio, clarity to the Data Science process, and to provide an useful checklist to consult whenever you start a new project.\n\nThis design is inspired by the checklist in the magnificent book \n[Hands-on Machine Learning with Scikit-Learn, Keras, and TensorFlow](https://www.amazon.it/Hands-Machine-Learning-Scikit-learn-Tensorflow/dp/1492032646), which I would urge you to buy. \n\nIt's worth its weight in bits! \n\nLet's recap what we mean by life cycle of the data science process (from here on, for brevity, we will only call it \"process\").\n\nA Data Science project is any project that aims to extract knowledge from data \n(for example, predict the optimal interest rate for a loan, or how many customers will enter the store tomorrow), \nand in doing so, use Machine Learning techniques.\n\nThese techniques can be of two types: \n- Traditional Machine Learning techniques (statistical models like SVM, decision trees, or clustering)\n- Deep Learning Techniques (neural networks)\n\nFor now don't worry about the difference between the two types, just know for now that the former have been around for decades, \nwhile the latter are the subject of active experimental research and have only started to be used in the last 6-7 years.\n\nYou are now ready for a short tour of the Data Science process, where I'll give you an overview of what your trip to Purgatorio will be like.\n\n### Frame the problem\n\nEach Data Science project starts from a phase called Problem Statement or Problem Shaping, i.e. the process of identifying the problem to be solved and the commercial advantages to be obtained. \n\nHow do you do it? We must be ready to ask the right questions. \n\nUsually the first questions you ask yourself are: \n- What is the scope of the project? \n- What is the desired result? \n- What data do we have available? \n- Do we have evidence that they contain relevant information?\n\nDuring this phase, close contact between you (the technician) and the domain expert is vital. \nIf you are developing a project for a company, presumably it will be the source of domain knowledge: learn as much as you can!\n\nIf you are developing a project for yourself, look for domain experts to ask questions! \n\nStudying and practicing you will develop a \"data mindset\", which will help you a lot in this phase. An entire guide is dedicated to this issue.\n\nWhen you have framed the type of problem you want to solve, it is time to choose objective metrics to evaluate the result of the project: depending on the type of problem addressed, we will see how different metrics provide indications on the performance of the Machine Learning models that we will develop.\n\nLast but not least, it is necessary to make sure that the assumptions we make are correct, the data we have collected are not corrupted or biased, and how the system will be integrated with existing systems and then used.\n\n### Collect and prepare the data\n\nThe indispensable raw material for Data Science projects is data (you never would have said so!).\nCollecting, organizing and then cleaning them is often the most _onerous phase_ of the whole process. \nYou need to understand what the data sources are, how they collected them, how the data from various sources relate to each other. \nOnce the data has been obtained, it is necessary to organize it effectively, and to keep original versions of it so that you always have at your disposal the \"ground truth\" of our project.\n\nIn fact, a large part of the work of cleaning and preparing the data consists of steps (called pre-processing) that transform them: from raw data just collected, to clean data and ready to be analyzed by a model in the next macro-phase. \n\nMaintaining the various versions of the data, to which the pre-processing steps have been applied, is vital to achieve _reproducible results_ and _maintainable systems_.\n\nThe information represented by the data is called \"features\" (in the simple case of tabular data, each attribute is a feature).\n\nOnce the raw data has been cleaned, the feature engineering phase often takes place in which existing data is combined to \"suggest\" to the models the relationships between them.\n\nFor example, if my data contains the date of a purchase in a store, I can add the feature \"day of the week\", indicating with a value from 1 to 7 on which day we are. This could reveal very interesting relationships!\n\nOften the feature engineering phase is vital for traditional models, while we will see that for Deep Learning models it is less important, as they have among their advantages to automatically extract relevant features from the data.\n\nFinally we will see in this section how to automate these \"pipelines\" of collection, cleaning and preprocessing.\n\n### Select and train an ML model\n\nOnce the data has been cleaned and prepared, it is time to choose an algorithm that must be \"trained\" on it, and whose output will be a predictive model.\n\nThis model can be a statistical model (even if all the models we will see apply statistical concepts) or a Deep Learning model. \n\nStatistical models have been used for decades to predict the future, such as sales in the next quarter, or the climate in a given region. \n\nIn general, these models:\n- They require statistical knowledge \n- Require feature engineering\n- They are \"simple\" in the sense that they are easy to interpret and debug\n\nDeep Learning models (software artifacts called neural networks) are techniques that have been exploding in recent years, providing excellent performance on problems previously impossible to solve, in general:\n- They require empirical and practical knowledge about training neural networks\n- Do not necessarily require feature engineering (but may benefit from it) \n- They are \"complex\" in the sense that they are difficult to interpret and debug.\n- They are the only solutions in case of equally \"complex\" problems, such as the vision or understanding of natural language.\n\nWe will see in detail various types of statistical models and Deep Learning, with a particular focus on the latter, which over the years are proving a revolution and promise to overturn entire industries, as well as drastically improve the processes that characterize them.\n\nOnce the model that best solves our problem has been selected, the training phase takes place, where the model is shown many examples (our data) and its parameters are adjusted in order to obtain satisfactory performance.\n\n### Evaluate and fine-tuning\n\nOnce we set up the training process and trained the model, we are ready to evaluate it and understand what actual performance it would have in the face of data that it has never seen. \n\nTherefore, before training, the data is divided between training data (those that the model will see) and test data that it has never seen (those on which it will be tested).\n\nThis phase is of vital importance to understand how the model will perform in the real world, and to understand if it will actually be useful.\n\nIn this section we will also understand how to choose the best parameters to train the models, so as to maximize their performance in the test phase.\n\nMoreover, we will see how to compose together several predictive models to form a more effective one, and you will learn to use one of the most useful techniques in the real application of Deep Learning: _Transfer Learning_.\n\nThis concept consists in applying the knowledge already learned from a problem to a new problem, reducing the amount of data needed and the computational costs for training.\n\nWe'll see how in practice you almost never train a model from scratch, but you take advantage of pre-trained models made available by large companies and researchers.\n\n### Launch and mantain the system\n\nOnce the model is sufficiently tested and its performing well it can be used to make predictions. \n\nIn this section you will learn how to build models that can scale to hundreds or thousands of users, leveraging the power of the Cloud and the flexibility of the API Rest concept. \n\nYou will learn how to distribute your models across multiple machines, and monitor them carefully through metrics and alarms.\n\nIn fact, one of the biggest costs of Data Science projects (but we could say software in general) is maintenance.\nHere are some questions you need to ask yourself when you put a model into production in the real world:\n\n- **Do users use it**?\n- Is the number of users using it controllable, or is there a slowdown?\n- How certain is the model of predictions it makes?\n- How do I make sure the new input data is appropriate?\n- How do I ensure that they are properly preprocessed (yes, automatic pipelines, I'm looking at you)?\n- Do the real world data reflect the training data?\n- How do real world data change over time?\n- How do I integrate the new knowledge I collect over time (i.e., the new data from the real world)?\n- How do I ensure that the performance of the model does not degrade over time?\n\nThese and other questions will be covered in this section.\n\n### Conclusions\n\nYou've just had a taste of everything we'll see in the next sections of Purgatorio, but remember there will be much more to learn! Alongside these guides you'll be given some to learn how to use libraries and frameworks used by organizations and governments, how to take advantage of the power and flexibility of Cloud vendors, how to read research papers, and much more!\n\nWarm up your fingers and brain and prepare a coffee, the journey is about to begin!  \n\n---\n\nWritten by [_clone95_](https://github.com/clone95)\n"
  },
  {
    "path": "Topics/frame-the-problem.md",
    "content": "# Frame the problem\n\n# What you will learn \nIn this guide, we try to figure out how to frame the kind of problem we want to solve and design it. \n\nIn particular, we will see what questions to ask ourselves when framing a problem on the basis of the data available to us, and then how to identify the objective.\n\nThis guide will provide you with many examples of \"key questions\", which makes sense to ask yourself every time you frame a new data problem. \n\nThese lists of questions are **not exhaustive**, and we welcome Pull Requests that add significantly valid ones.\n\n**Every time you start a new project Virgilio recommends that you write a document with the questions and answers explored in this guide, so you always have *clear objectives and characteristics* of the project, as well as being able to *share it easily* with others.**\n\n_Do not underestimate this phase at all_, it is perhaps the most important of any project that wants to achieve success!\n\n## Prerequisites\nThe previous Purgatorio's guides.\n\n## Time to complete\n10 minutes.\n\n# Index\n- [Recap of ML systems](#Recap-of-ML-systems)\n- [Understand the data](#Understand-the-data)\n- [Set objectives and scope](#Set-objectives-and-scope)\n- [Conclusions](#Conclusions)\n\nLet's dive right in!\n\n### Recap of ML systems\n\nThe process of Data Science, i.e. the extraction of knowledge and decisions from a set of data, is composed of several steps. Simplifying as much as possible, we try to frame the problem we want to solve, then we study the data available, then we create models (Machine Learning models) that are used to make predictions or estimates.\n \nThe definition of the problem is the first phase and also guides all the choices of design, implementation and integration that will come later during the project. \n\nIn particular, it is fundamental to classify the type of forecast you want to obtain once you have built the Machine Learning models: what _kind of prediction_ should the system make? \nShould it predict a number or a label?\nOr will it have to group new data with those most similar to it?\nOr should he predict the next content to be recommended to a user?\n\nAs we saw in the guide [Introduction to ML systems](MLSystems.md), there are various ways to classify a problem related to data and learning from them, and in particular, the most important classification to frame the problem is as follows: **is the problem a supervised or unsupervised learning task?**\n\nA supervised problem is a problem in which the data we want to learn from are \"labeled\": for example, images labeled according to their content, or the data of a loan applicant who knows how many times he managed to repay the debt or not. \n\nBy \"showing\" a Machine Learning algorithm so many examples, we hope that it will be able to generalize to new cases never seen before and predict the right label (not necessarily a specific class, it could even be a number).\n\nAn unsupervised problem is without these labels, and our \"learning from data\" is usually about finding similarities between the various elements of the dataset and grouping them (clustering and other unsupervised learning techniques).\n\nThe type of problem we will focus on in the Purgatory guides is the \"supervised\" type, which are the most common problems and those faced by neural networks (very powerful and flexible Machine Learning algorithms).\n\nWe will see in the section \"Train and select an ML model\" also some methods to deal with unsupervised problems.\n\nAfter this summary, let's see what questions we ask ourselves (and which we ask the experts of the domain) to frame a data problem.\n\nThe first thing to do when dealing with a new problem is to understand what kind of data I have available. Remember, without data you're not going anywhere!\n\n### Understand the data\n\nThe first thing to do, whether you are carrying out a project of corporate scope or for yourself, is to understand what kind of data you have available: the process then requires you to start from the data to formulate a problem, not the other way around! \n\nAs widely explained in Paradise, data is the only thing really necessary for the success of the project.\n\nWhen we look at the data we should ask ourselves the following questions:\n\n- **What are we supposed to do this with this data?**\n\n  This may sound like a stupid question, but we shouldn't assume that our aim is to cover the whole process of Data Science, from data collection to the creation of predictive models of Machine Learning. \n  Maybe what we have to do is just a sub-stage of the ones that make up the complete process. For example, we may just have to clean up the data and format it well, or analyze it and report back to other considerations about it. \n  Or we might just have to do some statistics on them to observe six phenomena, so avoid the part of creating the model. Nobody wants to waste time doing things that are not necessary!\n\n- **What form do the data take?**\n\n  The data we have at our disposal can be of a completely different type:\n\n  - **tabular data:** \n  As the name indicates, data extracted from database tables (not necessarily relational). They are data organized in rows, have attributes and generally a way to identify them uniquely. The rows are divided into fields, which in turn can contain various types of data (numeric, textual, links to images). This type of data is also called \"structured\".\n  For example, I could have a database that collects user names, their ages, and associated tweets, in which case I would have tabular data that includes both text data (names and tweets) and numerical data (age). \n  \n  - **text:** \n  For example, application logs, tweets, textbooks. We can consider textual data all that is made up of characters. Text data can then be inserted in the context of tabular data, as a separate field.\n  \n  - **categorical:**\n  Categorical data is a subset of textual data: it does not contain information about the language, as a tweet could do, and often it is not even a sentence. For example, they could be \"Red\" or \"Expired\" and are considered _labels_ rather than text data.\n  \n  - **numerical:**\n  Numerical data is any type of data [calculated from a computer](https://www.pythonforbeginners.com/code/numeric-types-python): Integers, floats, doubles, etc.\nThey can be continuous (e.g. temperature in degrees) or discrete (evaluation of a product). In the first case, the accuracy of the data measurement determines the type of numerical data used (usually float). \n\n  - **audio:**\n  Audio files can be of [various formats](https://www.makeuseof.com/tag/audio-file-format-right-needs/), which greatly influence the resolution (and therefore the amount of information they contain). They can be phone recorded conversations, for example, customer care, or environmental sounds, or even animal sounds. \n  \n  - **images:**\n  Images can be presented in [various formats](https://www.google.com/search?q=images+format&oq=images+format&aqs=chrome..69i57j0l5.1643j1j7&sourceid=chrome&ie=UTF-8), which affect the maximum resolution and number of colors of the image (RGB or B&W). Images have the characteristic of being very rich in information, so often there is the problem of storage, and reading/writing them on disk can be a costly operation. \nImage data often has the advantage that with some scraping trick (downloading data from the Internet) you can enlarge the datasets and thus improve the performance of Machine Learning models.\n\n  - **videos:**\n  Videos can be classified into two types: streaming (in real-time) and recorded (saved on disk). \nVideos are a fairly complex format to handle and extremely heavy from a storage point of view, so it is recommended not to start from this type of data if you are a beginner. \n  \n  - **time series:**\n  Time-series is a collection of data about events in time.\n  This kind of data consists of historical series, such as the series of surveys of a sensor, or the history of the interactions of a social user. This type of data is useful to predict future behavior based on previous observations, such as predict whether a machine is about to break or if a user will buy a certain product.\nTime series have the concept of granularity, which is the amount of time between measurements:\nfor example, we can have daily or annual data, or even a record every microsecond.\n\n\n- **Do we know the data is raw or unclean?**\n\nBy raw we mean the data as we come into possession of it. These can be clean and well-structured, or dirty and to be cleaned. \nIn general, real-world data is hardly ever clean and tidy. There may be a lack of values, they may be unstructured, they may be superficially collected! They may be of low quality (e.g. an audio file with noise) or have useless information. So generally you always have to think about the raw form in which we have the data, and what cleaning steps will be needed to make it usable by Machine Learning models. This phase (called data cleaning or data preprocessing) is vital during the Data Science process, and is often spent like this [80 percent of a Data Scientist's time](https://www.reddit.com/r/datascience/comments/bupmyf/data_scientists_spend_up_to_80_of_time_on_data/). In the Purgatorio section \"Work with data\" there will be an entire guide dedicated to data cleaning.\n\n- **Are the data labeled or not?**\n\nFrom this StackOverflow [thread](https://stackoverflow.com/questions/19170603/what-is-the-difference-between-labeled-and-unlabeled-data):\n\nTypically, unlabeled data consists of samples of natural or human-created artifacts that you can obtain relatively easily from the world. Some examples of unlabeled data might include photos, audio recordings, videos, news articles, tweets, x-rays (if you were working on a medical application), etc. There is no \"explanation\" for each piece of unlabeled data -- it just contains the data, and nothing else.\n\nLabeled data typically takes a set of unlabeled data and augments each piece of that unlabeled data with some sort of meaningful \"tag,\" \"label,\" or \"class\" that is somehow informative or desirable to know. For example, labels for the above types of unlabeled data might be whether this photo contains a horse or a cow, which words were uttered in this audio recording, what type of action is being performed in this video, what the topic of this news article is, what the overall sentiment of this tweet is, whether the dot in this x-ray is a tumor, etc.\n\nMaking Machine Learning models that learn from labeled data means formulating a \"supervised\" problem, while with unlabeled data the problem is called an \"unsupervised\" problem. \n\n- **If they aren't labeled, is it possible to label them?**\n\nThe most powerful results of ML applications (vision, language understanding) require huge amounts of labeled data, and that the labeling issue is known as the biggest bottleneck of modern ML applications. How long does it take to manually classify 100,000 documents, even if you just have to choose between \"Type A\" and \"Type B\"?\nLabeling is a tiring and often tedious job, and it takes a lot of time to be done well.\n\nServices like AWS [Amazon Mechanical Turk](https://www.mturk.com/) or the Google [AI Platform Data Labeling Service](https://cloud.google.com/data-labeling/docs/) (like many other tech vendors) provide distributed groups of workers with instructions on how to label a dataset. \n\nThere are also free tools ([Annotorius](https://annotorious.github.io/), [LabelMe](http://labelme.csail.mit.edu/Release3.0/), [LabelBox](https://labelbox.com/)) that allow you to label yourself or work with a team. It's time to call your little brother and promise him 1 cookie for every 10 tagged examples.\n\nOften labeling a dataset is a complex and expensive issue, and its qualitative success is crucial to the success of the project. \n\nIn this [article](https://www.kdnuggets.com/2017/06/acquiring-quality-labeled-training-data.html)\n you can find 7 additional ideas to lower the cost of your labeling efforts.\n\n- **How reliable are the labels?**\n\nTo obtain high-performance Machine Learning systems it is clear that large amounts of data are needed. However, it is equally important that the data is correct, especially in supervised learning applications. Even if you have a lot of examples in your dataset, I could do very little to get acceptable performance from the ML models trained on them.\n\nThe intrinsic noise of the dataset is impossible to eliminate and will affect both the training phase of the model, both in the phase of predictions of new examples. Entrusting labeling to working groups distributed through the services of large tech vendors requires two conditions in general. \n\nThe first is that the work of labeling is simple: it is rather simple to distinguish between categories of clearly visible animals or the colors of a dress or simple sounds (if clear labeling instructions are provided), it is very difficult to distinguish for example various different species of birds, or the words of a specific language (for someone who doesn't know the language).\n\nSome labeling tasks are simply not obtainable through \"crowd-labeling\", such as diagnosing medical images or classifying complex documents, which require a deep knowledge of the domain, and a lot of practical experience. \n\n- **Is it possible to put the data altogether?**\n\nOften the data sources from which the data comes are heterogeneous and fragmented: a company often divides its data into \"silos\", making a silo for each business process. Or in general, we may have to merge several datasets and figure out how to do it. \nDoes this lead to the question: do the data have the same format? Do they refer to the same period or to different times? Have they been collected in the same way? \n\n- **Is this sensitive data?**\n\nOften the public datasets that are used for ML applications do not contain sensitive data (such as identity, medical records, crimes), but sometimes when we work with real-world data they carry with them sensitive information, and we have to worry about managing it. Unless you need to develop an ML application to customize your user experience (and therefore personal data is critical), you can generally delete it without too much trouble.\n\nFor example, you can \"make anonymous\" a dataset of medical records (or X-ray images) by deleting the names and details of patients.\n\nIf I want to train a bone fracture classifier, I don't need to know who the skeleton in question belongs to! (Or rather, it could be useful and additional information, but it is not essential).\n\n- **Can we achieve our goal with this data after cleaning and processing it?**\n\nThis question is very general and difficult to answer, especially for a novice! But we must try to imagine: after having cleaned and prepared the data, will their final form be \"learned\" by an algorithm? To learn how to answer this question, the only solution is to gain experience.\n\nSo it means that it will happen many times that maybe we work on the data and clean it, and then we realize that there are no satisfactory methods to learn from them and get acceptable results.\n\nBut don't despair! Every time you make this kind of \"mistake\" (inability to assess a-priori the feasibility of an ML application) you learn a lot, and soon you'll be able to assess in advance if your efforts will be well rewarded, before spending whole nights labeling examples! \n\n- **_How much_ data is there (number of examples, storage weight)?**\n\nThe more data you have, the better. How many times have we already repeated it? \nKnowing how much data you have available is crucial, and understanding how much data you need (about) to make an ML algorithm learn satisfactorily is even more important. Often the examples have to be in the tens of thousands range to get enough satisfying results, but the state of the art can usually only be achieved with hundreds of thousands of examples.\n\nThis number, however, is very empirical, strongly depends on the complexity of the task, and can be reduced through the use of Transfer Learning (which uses pre-trained models and \"adjusts\" them slightly). \n\n- **Can we augment the dataset?**\n\nThere are many ways to get more data than you have. We will see in the next technical guides both of data collection (scraping, search engines) and techniques of \"data augmentation\" that allow increasing the size of the dataset. For example, suppose we have a dataset of 10,000 images of fruit. We could add the images themselves but slightly transformed, with small rotations, cuts, or fields of contrast and brightness. \n\nAdding completely new data generally helps the algorithm to generalize better with data it has never seen, while doing \"data augmentation\" generally increases the robustness of the system (it tends to be less wrong because of distortions or low quality of the example it is examining).\n\nIf we answer these questions, we should have a clear picture of what data we have available.\n\nWe can now proceed to the definition of the problem.\n\n### Set objectives and scope\n\nLike any other software project, a data science project needs having a clear goal to reach.\n\nFormulating this objective is crucial for various reasons:\n- the success of the project\n- the measurability of the success of the project\n- setting a clear target does not create too high an expectation\n\nI suggest that you use the SMART methodology for projects, which consists of formulating them in a way:\n\n- **S**pecific\n- **M**easurable\n- **A**ttainable\n- **R**elevant\n- **T**ime-framed\n\nIn particular, defining the scope of the project is fundamental. The scope is the size of the project, the number of components of which it is composed.\n\nProjects often fail because you don't have a clear scope and you continue to add more components until you have lost sight of the initial goal.\n\nFor example: \n- \"I want to build a user interface that understands the natural language and interacts with the user\" is too generic. \n- \"I want to build a user interface that can take orders from the pizzeria and organize them according to the arrival time\" is a much more defined scope.\n\nAnother example:\n- \"This system must help us classify all the new data that arrives\".\nis too generic.\n- \"This system must classify the images that users send us according to the color of the object photographed\" is specific.\n\nTrying to formulate the problem in a \"SMART\" way helps you not to lose sight of the objective, not to set yourself unattainable objectives, to reach them in time and above all to realize if you are working well or badly (measurability). We will see in the next guide \"Choose the metrics\" how this aspect is fundamental.\n\nHighly recommended reading the [original paper](https://community.mis.temple.edu/mis0855002fall2015/files/2015/10/S.M.A.R.T-Way-Management-Review.pdf) of the SMART projects.\n\n[This mini-course from **Google**](https://developers.google.com/machine-learning/problem-framing/) will help you frame your problem. Do it.\n\n[This](https://www.youtube.com/watch?v=Jn8c3oe_GWU) is a very good example of framing an NLP (Natural Language Processing) project. Take a look at the entire Kaggle youtube channel, there's a lot of learning material!\n\n---\n\n# Conclusions\n\nIn general it is extremely useful to produce a document summarising all the answers to the questions, so as to provide a clear view of the project as a whole, what are the final objectives and the most important characteristics for the system. \n\nThis list is not exhaustive, and as you get a question in your head you feel free to pull a request to this file. \n\nA Virgilio member will take over your request and enrich this guide with your contribution.\n\n**In the next guide [usage and integration](usage-and-integration.md) we will see other key questions we have to think about, like the usage of the system, its integration, and more!**\n\n--------------------------------------------------\n\n_Written by [clone95](https://github.com/clone95)_ \n"
  },
  {
    "path": "Topics/jupyter-notebook.md",
    "content": "# Jupyter Notebook\n\n# What you will learn \nIn this guide you'll learn how to use the Jupyter Notebook and the integrated JupyterLab IDE. Jupyter is a free and open-source web application (in the form of a Python module) that allows you to create and share documents that contain code, equations, text and images incorporated.\n\nIt's widely used in the Data Science process, in order to explore data, clean them, and experiment problem solutions.\n\n## Prerequisites\n- [Python Fundamentals](python-fundamentals.md)\n\n## Time to complete\n5 minutes.\n\n\n# Index\n - [Why Jupyter Notebooks](#Why-Jupyter-Notebooks)\n - [Learn to use it](#Learn-to-use-it)\n - [Considerations](#Considerations)\n - [Tips and Tricks](#Tips-and-Tricks)\n - [Notebooks Examples](#Notebooks-Examples)\n - [Conclusions](#Conclusions)\n\n\nLet's dive right in!\n \n### Why Jupyter Notebooks\n\n[Jupyter notebooks](https://jupyter.org/) are a way of embedding ready-to-execute Python, Julia and R code with markdown documentation, images, and other such things, all in one file, as well as a program for presenting and running them. \n\nThey're nice if you want to demonstrate a short script to another person, particularly in a data science context, because of some built-in plotting niceties and the fact that you can run cells of code individually. \n\nThey are [widely used in Data Science](https://www.nature.com/articles/d41586-018-07196-1), because as we know the Data Science Process is an experimental and incremental process.\n\nThere are several reasons to choose Jupyter Notebook for the first phases of the Data Science process (e.g. data exploration, data cleaning):\n\n- it's easy to write more than one line of the code before running. You do not need an editor on the side, crafting functions and then copying to the shell\n\n- results presentation is richer than console. It supports graphs, images, tables. Effectively anything that can be represented by html, css and js\n\n- if you make a mistake, you can trivially rerun that \"cell\" (chunk of code, nothing else) once you fix the mistake\n\n- you can install it on some more powerful machine and interact with it in your browser, so works for you if you're not super friendly with terminal stuff\n\n- you can export run results as html page. a run of a notebook is effectively a static thing. notebook consists of code + results of running the code.\n\n_Curiosity:_ Project Jupyter's name is a reference to the three core programming languages supported by Jupyter, which are Julia, Python and R, and also a homage to Galileo's notebooks recording the discovery of the moons of Jupiter.\n\n### Learn to use it\n\nNow that you understand why it is important to use Jupyter Notebooks, let's see how to actually learn how to use them.\n\nThe guide for beginners that Virgilio recommends is as follows:\n\n- [**Jupyter Notebook for Beginners Tutorial**](https://www.dataquest.io/blog/jupyter-notebook-tutorial/)\n\nYou will:\n\n- Cover the basics of installing Jupyter and creating your first notebook\n- Delve deeper and learn all the important terminology\n- Explore how easily notebooks can be shared and published online. Indeed, the tutorial _is a Jupyter Notebook!_ Everything here was written in the Jupyter Notebook environment, though you are viewing it in a read-only form.\n\nOnce you're done with this tutorial, you _have the option_ to dive deeper and follow this one:\n\n- [**Jupyter Notebook for Advanced Users Tutorial**](https://www.dataquest.io/blog/advanced-jupyter-notebooks-tutorial/)\n\nThis advanced (optional) tutorial will involve:\n\n- Warming up with the basics of shell commands and some handy magics, including a look at debugging, timing, and executing multiple languages.\n- Exploring topics like logging, macros, running external code, and Jupyter extensions.\n- Seeing how to enhance charts with [Seaborn](https://seaborn.pydata.org/), beautify notebooks with themes and CSS, and customise notebook output.\n- Finishing off with a deep look at topics like scripted execution, automated reporting pipelines, and working with databases.\n\nAfter these two tutorials you should be ready to use Jupyter Notebook in a pretty advanced way, leveraging all its useful capabilities.\n\nYou can conclude your learning of Jupyter with this simple read:\n\n[**Ten simple rules for writing and sharing computational analyses in Jupyter Notebooks**](https://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1007007)\n\nYou can also find an [Example Repository](https://github.com/jupyter-guide/ten-rules-jupyter) with a coherent and clean Jupyter Notebooks examples. \n\nSee also: [Awesome Jupyter](https://github.com/markusschanta/awesome-jupyter) for a very detailed list of Jupyter projects, libraries and resources.\n\n#### JupyterLab\n\nWhen you use a Jupyter Notebook you just have the skeleton of an IDE, as it is designed for prototyping and analysis. \n\nBut what if you want a full IDE, fully integrated with Jupyter?\n\n_[JupyterLab](https://jupyterlab.readthedocs.io/en/stable/getting_started/overview.html) is the natural answer!_\n\nJupyterLab enables you to work with documents and activities such as Jupyter notebooks, text editors, terminals, and custom components in a flexible, integrated, and extensible manner.\n\nYou can arrange multiple documents and activities side by side in the work area using tabs and splitters. Documents and activities integrate with each other, enabling new workflows for interactive computing.\n\nHere you have a [**deep tutorial about JupyterLab**](https://towardsdatascience.com/jupyter-lab-evolution-of-the-jupyter-notebook-5297cacde6b)!\n\nIf you like [VSCode](https://code.visualstudio.com/), you can [use Jupyter Notebooks inside it!](https://www.google.com/search?q=vscode+and+jupyter&oq=vscode+and+jupyter+&aqs=chrome..69i57j0l7.2617j0j7&sourceid=chrome&ie=UTF-8)\n\n#### Colaboratory\n\nRemember that the Jupyter Notebook is nothing more than an application that runs on our machine, and therefore has its own computational capabilities.\n\nAn alternative possibility is to use [**Google Colaboratory**](https://colab.research.google.com/notebooks/welcome.ipynb).\n\nColaboratory is a free Jupyter notebook environment that requires no setup and runs entirely in the cloud. \n\nWith Colaboratory you can write and execute code, save and share your analyses, and access powerful computing resources, all for free from your browser. \n\n### Considerations\n\nAs we said from the beginning, Jupyter Notebooks are great for exploring data, doing analysis and building small prototypes, so you can quickly try many different approaches to the same problem.\n\nBut beware! \n\nYou can't think that the final working system you built (presumably a Machine Learning model that makes predictions) is based entirely on a Jupyter Notebook!\n\n_In fact, putting models into production in the real world with Notebooks is a totally wrong practice_.\n\nThere are even more extreme opinions, i.e. those who do not recommend their use at all, like Joel Grus in [**I don't like notebooks.**](https://www.youtube.com/watch?v=7jiPeIFXb6U)\n\nSee also: [Pitfalls of Jupyter Notebooks](https://scicomp.aalto.fi/scicomp/jupyter-pitfalls.html), it can save you a lot of headache!\n\nWe at Virgilio think that _they are not the extreme evil_ as Grus suggests, but they certainly do not encourage the principles of software engineering or code cleaning in general.\n\nThat's why **it's crucial to know when to stop using the Notebook and start refactorizing the code into modular Python scripts**, which can then be conveniently used for purposes beyond exploration and experimentation.\n\nCheck the [nbconvert](https://nbconvert.readthedocs.io/en/latest/) module, and see also: [How do I convert a IPython Notebook into a Python file via command line?](https://stackoverflow.com/questions/17077494/how-do-i-convert-a-ipython-notebook-into-a-python-file-via-commandline)\n\nCheck the [nbdime](https://github.com/jupyter/nbdime), it provides tools for diffing and merging of Jupyter Notebooks.\n\n### Tips and Tricks\n\nLike any other new tool you learn, there are often little tricks or conveniences hidden in the documentation that can really make life easier if you use the tool in question every day!\n\nThe Jupyter Notebooks are no less, so here's to you a very detailed article on the tips and tricks of Jupyter!\n\nSee [**Jupyter Notebook Tips, Tricks, and Shortcuts**](https://www.dataquest.io/blog/jupyter-notebook-tips-tricks-shortcuts/)\n\n### Notebooks Examples\n\nSpread across the Web you can probably find hundreds of thousands of Jupyter Notebooks, but how do you navigate them all in an organized way?\n\nLuckily someone did this job before Virgil, and created this incredible resource:\n\n[**A gallery of interesting Jupyter Notebooks**](https://github.com/jupyter/jupyter/wiki/A-gallery-of-interesting-Jupyter-Notebooks)\n\nTake your time and explore this rich repository, you will surely find something that interests you! \n\n### Conclusions\n\nYou should now be fully aware of the various options you have to use the Jupyter Notebooks, both in their \"basic\" version, both within the JupyterLab IDE, and by exploiting the free power of Google thanks to the Colaboratory!\n\n----\nWritten by [_clone95_](https://github.com/clone95)\n"
  },
  {
    "path": "Topics/math-fundamentals.md",
    "content": "# Math Fundamentals\n\n# What you will learn \nIn this guide, you'll learn what is the fundamental mathematical knowledge you need to have in order\nto build insightful Data Science projects and build machine learning systems upon them.\n\nYou'll also learn that not so much is needed to start to apply yourself to real-world data problems!\n\n## Prerequisites\nThe previous Paradiso high-level guides.\n\n## Time to complete\n10 minutes.\n\n# Index\n- [Motivation](#Motivation)\n- [Courses](#Courses)\n  - [Calculus](#Calculus)\n  - [Linear Algebra and Matrix Algebra](#Linear-Algebra)\n  - [Optimization](#Optimization)\n- [Ask Questions](#Ask-Questions)\n- [Conclusions](#Conclusions)\n\nLet's dive right in!\n \n### Motivation\n\nBefore anything else, watch [this](https://www.youtube.com/watch?v=VIbjHIGMjQM\n) and then [this](https://www.youtube.com/watch?v=8CX-Q0gtSp8) awesome Ted Talks :-)\n\n**The entire field of Data Science is based on mathematics and statistics.**\n\nThis phrase shouldn't frighten you, although you may find out, that you probably have much of the knowledge you need to start experimenting!\n\n**In fact:** \n\nIf you've done a second-degree school (you know matrices and derivatives, for example), you probably just need to refresh your memory on the things you already know and go deeper into some things you may not have seen at school. \n\nIn general, if you have a scientific degree (engineering, computer science, physics, etc.), it will probably be just a review, because in this guide _you will learn how to learn_ the fundamental theory behind Calculus, Linear Algebra, and Matrix Algebra courses are suggested within this guide.\n\nWhatever your starting level, however, it is still recommended to go through all the resources organized here, _to make sure you do not have \"gaps in your knowledge\"._\n\nRemember to read and try to implement some ideas of the [**Virgilio's Learning Strategy - Learning to Learn**](teaching.md)\n\n## Courses\n### Calculus\n\nThe first macro-topic you need to be confident with is [Calculus](https://en.wikipedia.org/wiki/Calculus).\n\nIt would be impossible to list how many Machine Learning system properties are based on its rules, like many of the scientific fields!\n\nThe process of training an ML model it's nothing more than Calculus rules applied to statistical models! \n\n**Lucky you!** \nYou can find great free courses offered by the professors of the [MIT](http://www.mit.edu/)(Massachusetts Institute of Technology), through the index page [MIT OpenCourseWare](https://ocw.mit.edu/index.htm).\n\nThe course we suggest in particular is the following:\n\n[**Single Variable Calculus**](https://ocw.mit.edu/courses/mathematics/18-01sc-single-variable-calculus-fall-2010/)\n\nThere are both the video lessons and the notes of the course.\n\nOnce you've taken the full course, watch this awesome playlist from [3Blue1Brown](https://www.youtube.com/channel/UCYO_jab_esuFRV4b17AJtAw):\n\n[**The Essence of Calculus**](https://www.youtube.com/watch?v=WUvTyaaNkzM&list=PLZHQObOWTQDMsr9K-rj53DwVRMYO3t5Yr)\n\nThanks to these two resources, you should be able to understand most of the mathematical reasons that underpin today's Machine Learning systems and build them to develop powerful Data Science projects\n\nIf you want to dive deeper, here you can find a [Multivariable Calculus](https://en.wikipedia.org/wiki/Multivariable_calculus) course with notes and videos, again from MIT:\n\n[**Multivariable Calculus**](https://ocw.mit.edu/courses/mathematics/18-02sc-multivariable-calculus-fall-2010/)\n\nOnce you will feel ready to go deeper inside the mathematics for Machine Learning (definitely not take this at the first pass), here you find your Bible:\n\n[**Mathematics for Machine Learning**](https://mml-book.github.io/)\n\n#### Check your knowledge\n\nTest your knowledge with [**these**](http://webmath2.unito.it/paginepersonali/cordero/English/derivatives.pdf) exercises.\n\nAnyway you can find a ton of them online, and remember, that the more you practise, the better you will get!\n\n### Linear Algebra and Matrix Algebra\n\nThe second macro-topic on which Machine Learning systems are based is [linear algebra](https://en.wikipedia.org/wiki/Linear_algebra).\n\nYou probably already tasted these topics in high school, but certainly not with the right degree of depth.\n\nSo, how do you excellently learn linear algebra?\n\nVirgilio was born to spread knowledge and content, and there are many ways to do it: through text, audio, video... \n\nBut the absolute best way (in terms of effectiveness and speed of understanding) is the visual way!\n\nOur brain uses most of its computing power to process visual data, because when we evolved in the African Savannah the most important thing to do was to be able to see a predator and escape!\n\nIt is therefore not surprising that the visual interaction of concepts installs them deep into our minds, almost experientially, rather than conceptually!\n\nImagine, for example, thinking about the formula of the diagonal of a square... reading it is a very abstract thing, but if we imagine in a _visual_ way the graphical reason that leads to the formula, it will make much more sense!\n\nNow, fortunately, there are incredibly skilled and intelligent people in the world, and some of them have created this:\n\n[**Immersive math - Linear Algebra**](http://immersivemath.com/ila/index.html)\n\nOnce you click on the link and start exploring this interactive book, you won't believe your eyes for the clarity and effectiveness with which the concepts are explained. \n\nThis book currently contains so much information and so well done that it deserves a front-row seat in Virgilio!\n\nTake your time, explore the book, fall in love with those interactive explanations!\n\nGoing through this would be sufficient to get all the remaining knowledge you need from a mathematical perspective, to understand most of the papers and code out there!\n\nNote:\nChapter 6 is about Matrix Algebra, and it's indeed very good (like the rest of the book), but we are **very proud** of [**_Virgilio's official Matrix Algebra guide_**](https://github.com/virgili0/Virgilio/blob/master/NewToDataScience/MatrixAlgebra.ipynb), and we suggest you use both resources! \n\nMoreover, Virgilio's guide to Matrix Algebra is an _interactive Jupyter Notebook_, with exercises included!\n\nWe suggest to go through this latter resource once (or if) you are already practicing with the [Python](https://www.python.org/) programming language. \n\n#### Check your knowledge\n\nTest your knowledge with [**these**](https://web.pdx.edu/~erdman/LINALG/Linalg_pdf.pdf) exercises.\n\nAnyway you can find a ton of them online, and remember, _that the more you practise, the better you will get_!\n\n### Optimization\n\nCalculus, Linear Algebra, and Matrix Algebra are the 3 fundamental pillars you need to be confident with in order to understand most of the mathematical implications of Machine Learning systems.\n\nThis is important in Data Science because developing Machine Learning predictive models play a big role during a Data Science project, and these models are often the most useful outcome!\n\nThe **optimization course** is a bit more advanced, so maybe you could not tackle _during the first pass of this guide_, but later be sure to take the following lectures, from the professor [Geoff Gordon](https://www.youtube.com/channel/UC4XBoaEXuvob0mQraQJ7wNw):\n\n[**Introduction to Convex Optimization**](https://www.youtube.com/playlist?list=PL7y-1rk2cCsDOv91McLOnV4kExFfTB7dU)\n\nMoreover, if you want to dive deeper (very deep), you can hold this close to your bed:\n\n[The Convex Optimization Book](https://web.stanford.edu/~boyd/cvxbook/bv_cvxbook.pdf) (advanced book)\n\n### Ask Questions\nA rule of thumb to learn fast and effectively is to ask questions and read other's questions and answers.\n\nJoin communities of people interested in the topic (e.g. Reddit): here you can find discussions, search by keywords (e.g. \"matrix multiplication\"), and ask questions, with experts who will answer and help you.\n\nSome _tips_ regarding questions:\n\n- Try to form specific, well-written questions, to minimize the time used by the respondent.\n- Do not ask a question whose answer is found with a quick search on google.\n- If the questions are too general or show laziness they'll likely remain unanswered...\n\nSome subreddits you can subscribe to are:\n\n- [r/LearnMath](https://www.reddit.com/r/learnmath/)\n- [r/Math](https://www.reddit.com/r/math/)\n- [r/Calculus](https://www.reddit.com/r/calculus/)\n- [r/Optimization](https://www.reddit.com/r/optimization/)\n\nTwo other good places to post (well structured) questions are:\n\n- [HackerNews](http://hn.premii.com/)\n- [Quora](https://www.quora.com/)\n- [Math Stack Exchange](https://maths.stackexchange.com)\n\n### Conclusions\n\nIf you follow the study plan of the guide, take the time to fully understand the proposed courses, and do exercises, you will be equipped with an excellent basic knowledge of mathematics that is needed to do projects of Data Science, and in particular, build predictive models of Machine Learning.\n\nThis is because _to implement_ a lot of Machine Learning applications we can often abstract ourselves from low-level details, such as the operations between matrices or the internal functioning of optimization algorithms, even if it is vital to know the principles that govern their functioning.\n\nThe next guide is about the basic statistics you need to fully understand the process of Data Science, and build effective and useful statistical models.\n\n----\nWritten by [_clone95_](https://github.com/clone95)\n"
  },
  {
    "path": "Topics/prerequisites.md",
    "content": "# **What** do you need to do Machine Learning?\n\n\n# What you will learn \nIn this guide you will learn which elements do you need to get started with Machine Learning.\n\nThe elements listed in this guide are of 3 types: \n\n - **know-how**\n - **data**\n - **computational resources**\n\nThese elements enable you to practice machine learning first-hand (small scale) or start machine learning projects to innovate an organization (big scale).\n\n\n## Prerequisites\nRead [Demystification of AI, ML and DS](Demystification.md) before this guide.\n\n## Time to complete\nApproximately 45 minutes. Less than a Netflix episode!\n\n# Index\n- [The three elements](#The-three-elements)\n  - [Data](#Data)\n  - [Know-how](#Know-how)\n  - [Computational Power](#Computational-Power)\n- [Cloudy days](#Cloudy-days)\n- [If you still have to buy a machine](#If-you-still-have-to-buy-a-machine)\n- [Conclusions](#Conclusions)\n\n### The three elements\nVirtually every area of science and economics has access to a **quantity of data** unimaginable even a decade ago.\n\nIn addition to this, today there is **abundant and inexpensive computing capacity** available through cloud service providers. \n\nIt is also important that international **research is excited about machine learning** topics, and therefore proceeds expeditiously in the development of increasingly effective techniques.\n\nParallel to this, the engineering world creates the ML toolbox by adjusting itself accordingly: **wonderful frameworks and high-level interfaces to apply ML techniques quickly**, going towards more user-friendly \"enablers\".\n\nKeras, a high-level framework that allows you to train a deep neural network in 15 lines of code, is a a perfect example of this phenomenon.\nIn the same way cloud providers offer you the possibility to host on their machines your ML models, with powerful logic that allows you to build a complete AI/ML start-up from your laptop. \n\nThe topics listed above have the following natural consequence:\n\nToday, more than ever (and an enormity compared to 5 years ago) it is _easy and affordable_ for everyone to start practicing ML in everyday problems, and it is an _obligation_ in the shoes of a company that wants to remain competitive in a market that runs at crazy speed. \n\nLet's see which elements do you need to get started.\n\n### Data\nData comes from the Latin Datus, which means fact, _happened_. \nBuilding ML programs means exploiting something that has already **happened in the past** (the data) to discover recurring patterns that suggest **how to act in the future**.\n\nBuilding traditional programs is a tiring task. It requires that every single piece is built and then these are composed. It's not too different from building a house. Bricks are the modules that make it up and the house is the program in its entirety.\n\nWhen it comes to Machine Learning applications, however, the matter is different. \nAn ML program is something that we don't write ourselves, but rather something that we understand by observing and processing data. \n\nA good analogy can be the following:\n\nWhile building traditional software looks more similar to building a brick house, Machine Learning is _similar to food cultivation_. Cultivation leverages the earth to do most of the work. The farmer \"guides\" the land, supervises it and then picks up the fruits. Likewise, thanks to Machine Learning, the programmer tries to make the data do the bulk of the work. Growers combine seeds with land to grow plants while engineers combine data with algorithms to grow programs.\n\nIt is therefore trivial to understand that if the data is to do the bulk of the work, the quality (and quantity) of the latter is strictly necessary for a model to make accurate predictions, or in general to extract knowledge effectively from them.\n\nToday there is a large amount of data available to start practicing machine learning and discover its potential.\nLet's see how we can get the existing ones and how they can be useful in solving our problems.\n\n#### Free available data\nBe happy! A lot of data is free and easy to download!\nLet's see the main options:\n\n- [Kaggle](https://www.kaggle.com/) is the go-to platform for data in general: it's a Machine Learning challenges website, and hosts an enormous quantity of datasets and analysis done by people on them. Subscribe now.\n- [UCI Datasets](https://archive.ics.uci.edu/ml/index.php) is a free and immediate platform for finding thousands of datasets and their metadata. \n- [U.S. Government open data](https://www.data.gov/)\n- [UK Governement open data](https://data.gov.uk/)\n- [EU open data](http://data.europa.eu/euodp/en/data/)\n- [A very long list from Forbes](https://www.forbes.com/sites/bernardmarr/2016/02/12/big-data-35-brilliant-and-free-data-sources-for-2016/)\n\n#### Collect your own data\nData collection is a huge and critical topic, which technical details go outside the scope of this guide. \nWe'll see in a dedicated Purgatorio's guide how to collect huge quantities of data through scraping and other sources.\nTo first taste the awesome free tools that we can use, take a look the ones from [Digital Methods](https://tools.digitalmethods.net)!\nTake also a look to the [Snorkel](https://hazyresearch.github.io/snorkel/blog/snorkel_programming_training_data.html) project from Stanford, seems very promising.\n\n#### Look under the bed\nMore and more organizations are realizing that they are sitting in a gold mine. Years and years of historical data, from machines, conversation logs, transactions or sensor measurements are only waiting for you! They _probably_ hide a tremendous value to be unlocked, so why not to take a look at that relational database!\n\nThe bottom line is: If you have a lot of data coming from a business process, probably they are worth their bytes in gold (uh, this analogy doesn't seem to fit well).\n\n### Ask \"why?\"\nIf we are aware of the [five-whys](https://en.wikipedia.org/wiki/5_Whys), it's one of the key techniques behind critical thinking. With so much data and with the end-results being data-dependent, it's so important to get the data part right. So let's _know-our-data_ before performing any actions or tasks or transformations on it. Let us know everything we need to know about the source and nature of the data we will be learning about, processing, transforming, analysing and training. There is a whole section dedicated about this aspect and perspective about data on this [AI/ML/DL GitHub resource](https://github.com/neomatrix369/awesome-ai-ml-dl/blob/master/README-details.md#data). Do scavenge through the material, the notebooks, presentations and videos under this section. Unfortunately, we focus much less on critical thinking, which is a highly-potent ingredient needed when working with mathematics and sciences. Another good example would be looking at this online course [\"Calling Bullshit\"](http://CallingBullshit.org).\n\n### Know-how\nDoing data science is not simple. It will **never be**, if you want to fully understand the mathematical processes behind the elegant models offered by high-level interfaces such as Keras. Learn to hate those who say \"learn data science in 6 weeks\". \nIn one sense it's _totally false_, in the other it's _disrespectful_ to those who study these issues for years, learning new things every day. This does not mean that we should be discouraged, on the contrary! **Virgilio is here to help you in this fascinating process**. \n\n- If you are a student or a technician in general who wants to experience these innovative themes at first hand, follow the path that has been prepared for you starting from Purgatorio, and with the right time and determination you will get incredible results. \n\n- If you are just interested in knowing what know-how is needed (for example in order to form a team that can develop large data science projects in your company) here are some tips for you.\n\nLet's see what stages the process of developing a DS project consists of:\n\n![Figure 1-1](https://raw.github.com/clone95/Data-Science-Study-Paths-March-2019/master/Topics/lifecycle.png \"1\") \n\nLet's have a look.\n\nOnce the requirements of the application that you want to develop to solve the problem have been collected, the data science cycle usually consists of experimenting with solutions in an iterative way by collecting data and shaping the problem. \n\nData collection consists of putting together data sources, building pipelines to pre-process them, and having a place to put them on hold for analysis. Modeling the problem consists of feature engineering (i.e. combining existing data in a meaningful way), training models and evaluating their performance.\n\nOnce a satisfactory model has been obtained, it must be put into production so that it can solve the user's requirement.\n\nOnce in production, the model needs to be monitored, and soon it may have to be modified as requirements change.\nAs you can easily guess, the data science process involves different figures for its success, even if the web services provided by large technology companies allow anyone to start developing ML solutions without worrying about the integration or management of the underlying systems. \n\nThese figures have blurred boundaries in terms of skills and knowledge, and in general the ideal would be for each individual to _be able to move with agility between the different tasks of the data science process_. If this is possible for small scale projects, it is true that the needs of a company often require the coordinated effort of several people to be successful. \n\nNames like \"data scientist\" or \"data engineer\" are described differently depending on the source. Here at Virgilio we believe that the classification made by [KDNuggets](https://www.kdnuggets.com/) is the most comprehensive and clear.\n\nIn this awesome [blog post](https://www.kdnuggets.com/2019/03/building-effective-data-science-teams.html) you can find in detail the differences between these figures. \n\nIf you're just thinking about learning everything you need by your own, you're in the right place! Starting from Purgatorio our purpose is to educate a \"liquid\" figure who can move around among the different tasks and parts of the data science process. \n\nSooner or later you'll have to choose something to specialize in, maybe data visualization or model architecture, but before then the path we propose here at Virgilio is mixed between these \"predefined\" figures and contains all the interdisciplinary topics that a member of a data science team should at least be aware of.\n\nNow that you know what know-how you need for your ML projects, let's take a look at the requirements in terms of computational resources.  \n\n### Computational Power\nThe third and final element that you have is computational power.\nThe calculations that most of the time you find yourself doing when experimenting with Machine Learning are multiplications between matrices. \nThen, in the subset of ML techniques called Deep Learning, neural networks are particularly hungry for these calculations. \nIn the past decades such calculations were made directly using the CPU of computers, but they proved insufficient to train the most complex networks.\nFortunately, we are helped by GPUs (graphical processor units), whose job is exactly to do matrix calculations! In fact, in the world of gaming and video computing in general, these kinds of calculations are what happens daily behind the scenes of video games and 3D graphics in general.\nIn particular, the main factor that indicates the usefulness of GPUs in Machine Learning calculations is the amount of video memory (expressed in GigaBytes) that the card has.\nDamn it! We have to buy an extreme gaming PC with 4 GPUs!\nI'm kidding, please don't do that.\nThanks to the internet connection and cloud providers, nowadays it is much more convenient to use machines prepared and maintained by companies like Amazon or Google, instead of investing money in physical hardware.\nIn the next chapters I will argue why you should not buy an expensive phisical machine, and if you stil have todo that for some reason, I'll give you some tips in order to show you the tradeoffs in terms of price and amount of computational power. \n\n## Cloudy Days\n[**Outsourcing is the main driver of the human society progress**](https://necsi.edu/complexity-rising-from-human-beings-to-human-civilization-a-complexity-profile). Imagine one of the first farmers in 20,000 B.C. \nHe is used to carrying out the entire production process on his own: he tames and cultivates the wheat, picks it up and crushes it into small parts. He then uses it to create various products, such as flour, ready-made doughs, or a primitive form of bread.\n\nNowadays, however, an individual or an organization can only deal with one of the previous sub-processes, and specialize highly in that. For example, by choosing to specialize in the production of bread, they could learn how to produce many forms of bread, look for new ones, improve the flavor and optimize all these processes, forming a specific and specialized know-how with respect to the production of bread. \n\nThis process, the progressive specialization of human activities, is the basis of the technical progress of our species. It is clearly based on outsourcing! If all the sub-processes preceding the production of bread were to disappear, the baker would be destined to close down. How does it grow wheat? How does it prevent insects from ruining it? How does it pay for, manage and maintain the presses that crush it and make it flour?\n\nIn the same way, companies today outsource as much as possible all processes that are not essential to the company's know-how: in doing so, everyone can do \"what they do best\".\n\nThe same trend is being seen today in the use of software. It is more common than ever to use services provided through the network to solve sub-problems that companies do not want to worry about, such as the management of physical machines that host their applications, or they want to have their data from anywhere in the world in a safe and reliable way! \n\nIt is therefore not surprising that cloud computing is becoming a very important part of the software market, thanks to the flexibility and reduced costs that this entails. \n\nThe [**race towards the monopoly**](https://cloudwars.co/worlds-top-5-cloud-vendors-cloud-wars/) of the cloud market is fierce, particularly between Amazon (with AWS) and Microsoft (Azure). \n\nHow does this come in handy for Machine Learning?\n\nWith a few clicks you can deploy files and files of high-performance machines, managed in a transparent way, and especially with on-demand capabilities. \nThis fact drastically reduces the costs and complexity of developing complex software and solutions, all from a dedicated web interface or client.\nIt also allows you to serve solutions quickly, flexibly and without the classic problems of large-scale computing that today's distributed systems require. Being able to scale from one device to millions simply by turning on hundreds of self-managed and paid-for machines, is an outstanding business and research enabler. \n\nRecently, all large tech companies have started to provide (and invest heavily) in providing services related to AI and ML issues. Emerging (and required) figures such as the data engineer or data scientist are able to achieve incredible levels of productivity and business through end-to-end platforms that cover the entire development cycle of AI and ML solutions. \nSome examples are [AWS Sagemaker](https://aws.amazon.com/it/sagemaker/) or [Azure Machine Learning Studio](https://azure.microsoft.com/it-it/services/machine-learning-studio/).\n\nTo start experimenting in a simple way there are even solutions such as [Google Colab](https://colab.research.google.com/), a free Google tool that allows you to use Jupyter notebooks on your machines, without having to worry about installing packages or managing memory. It's also totally free!\n\nWe have created [**a fantastic list**](https://github.com/virgili0/Virgilio/tree/master/Topics/Deep%20learning%20in%20cloud) that compares all cloud solutions in terms of cost and performance.\n\nDon't believe who tells you that you need to buy a high-performance machine to make ML. He probably lives in 2010! \n\n## If you still have to buy a machine\nSuppose you still have to buy a calculator for other needs, let's see which are some good options:\n\n- [**This video**](https://www.youtube.com/watch?v=dtFZrFKMiPI) from Siraj Raval explains you pretty well which components are important and why.\n- [These Quora answers](https://www.quora.com/What-laptop-computer-should-I-purchase-for-deep-learning-How-much-will-it-cost) are straightforward (you can notice that they suggest to leverage the cloud first) .\n- [This](https://towardsdatascience.com/build-a-deep-learning-rig-for-800-4434e21a424f) Medium article shows you how to build an 800 dollars rig for Machine Learning.\n\nAs we have seen the important component for ML calculations is the GPU, in particular the amount of video memory that owns.\nWARNING: You definitely want to have a GPU compatible with [Cuda](https://blogs.nvidia.com/blog/2012/09/10/what-is-cuda-2/), the parallelization platform of Nvidia, the largest GPU manufacturer.\n\nThis article](https://blog.slavv.com/picking-a-gpu-for-deep-learning-3d4795c273b9) explains how to choose a GPU that supports Cuda.\n\n## Conclusions \n\nWe have seen how the three elements (data, know-how and computing power) are strictly necessary to develop ML solutions for everyday problems. \nIf you are a student or just a curious cat you will have an easy time thanks to Google Colab and the free power it offers. If you're part of a team in a company thinking about starting to experiment with ML at scale, consider the ever richer and better ML services offered by the big technology vendors.\n\n\n----\nWritten by [_clone95_](https://github.com/clone95)\n"
  },
  {
    "path": "Topics/python-fundamentals.md",
    "content": "# Python Fundamentals\n\n# What you will learn \n\nIn this guide you'll learn the basics concepts computer science and programming, and will take you _from zero coding knowledge_ to a solid Python skill and a complete awareness of the most important concepts in programming. \n\n## Prerequisites\nNone.\n\n## Time to complete\n10 minutes.\n\n# Index\n- [Why Python](#Why-Python)\n- [Computer Science Fundamentals](#Computer-Science-Fundamentals)\n- [Learn Python](#Learn-Python)\n- [Develop Small Projects](#Develop-Small-Projects)\n- [Learn Git and GitHub](#Learn-Git-and-GitHub)\n- [Ask Questions](#Ask-Questions)\n- [Conclusions](#Conclusions)\n\n\n\nLet's dive right in!\n \n### Why Python\n\nAccording to Sun Tzu:\n> If you don't know Python, learn it yesterday!\n\nThere are hundreds of programming languages, mature as C and C++, or recent as Ruby, C# or Lua, or even corporate giants like Java. \n\nChoosing a programming language to learn is difficult. \n\nThere is no language that can solve all the possible problems out there (it's not a one-shirt-fits-all solution), _but Python is a good choice in many cases_ and is also well positioned for those who learn to program. \n\nPython [was born](https://en.wikipedia.org/wiki/Python_(programming_language)) thinking \"I want a programming language that is as close as possible to plain English\". So, most of the time, when you don't know the name of something, just try to think about the plain literal English name of that thing, and probably the Python name will be that one!  \n\nPython is used by hundreds of thousands of programmers around the \nworld and their numbers are growing all the time.\n\nThere are many reasons for this success.\n\n- Python is intuitive, you think of a way to solve a problem and you can express it that way and it works most of the time.\n\n- Python works everywhere, whether Windows, Linux/UNIX, Mac or other, from supercomputers to mobile phones. \n\n- It allows you to develop small applications and fast prototypes but is structured for creating large programs.\n\n- It is equipped with an easy to use graphical user interface, libraries for web programming. Best of all, it's free.\n\n- There is a large and ever-growing community of Python developers starting from academia, research all the way to business and everyday hobbyists taking up Python.\n\n- You can create and prototype things very quickly due to the ease of the language and availability of free libraries, packages and frameworks.\n\n\nWhy do you need to learn Python? \n\nPython is simple to understand, is simple to read, is powerful and flexible, can help you in everyday tasks \n(even if you're not a programmer!) and automatize a lot of boring stuff.\n\nMoreover, is the core Data Science tool, and most of the frameworks we'll need in the next guides\nare written in Python or have rich Python wrappers.\n\n**Note:** \n\nIn many Internet guides, you will find the programming language [**R**](https://www.r-project.org/) recommended for Data Science.\n\nR is a purely statistical programming language (not general purpose/scripting like Python).\n\nNow, the opinion shared by Virgilio's collaborators is as follows:\n\n**IF**:\n\n- you are a beginner in programming\n- You're a beginner in data science.\n\n**THEN**:\n\n_It makes no sense to learn two programming languages at the same time._\n\n_It's a waste of time and energy, and it just creates confusion._ \n\nNot to mention that while Python is the undisputed king of scientific computing in general, and **it is not acceptable that a Data Scientist does not know it**, R is not as widespread or widely used and it does not have the same support that Python has and also due to the large cache of useful libraries.\n\nWhat does this mean? that R is useless? Certainly not! \n\nIndeed, it is recognized that its data visualization and statistical capabilities are useful and powerful... But really, if you're starting your path in Data Science today, start with Python, you can learn R later!\n\n### Computer Science Fundamentals\n\nVirgilio targets mainly those who have programming basics but have never touched the field of Data Science.\n\nHowever, if you have never programmed in your life, don't worry! \n\nPython is easy to learn (but the way to master it is long, like all things), and this MIT course introduces you to the main concepts of programming:\n\n[**Introduction to Computer Science and Programming**](https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-00sc-introduction-to-computer-science-and-programming-spring-2011/index.htm)\n\nIf you want a wider curriculum (even like a first-level university) you can have a look here:\n\n[Free self-taught Path - Computer Science](https://github.com/ossu/computer-science)\n\nThat said, at Virgilio, we don't think you need to know _the whole spectrum of the computer science concepts_ to start getting your hands dirty in Data Science.\n\nBut it's true that the more you know, the better! \n\nOn the other hand, we remember that Data Science is nothing more than mathematics and statistics, **applied through programming!** \n\nSo, it's worth spending time becoming very comfortable with Python.\n\n### Learn Python \n\nBut _how can you learn_ Python?\n\nVirgilio [hates to re-invent wheels](https://en.wikipedia.org/wiki/Reinventing_the_wheel) and for our purposes, [**THIS**](https://automatetheboringstuff.com/) free book is the perfect track to follow. \n\nYou can [buy](https://nostarch.com/automatestuff) it too.\n\nThis free book is meant for total beginners. \n\nThe first chapter of the book will explain to you how to install Python (the interpreter of the code you will write) and the Python IDLE (a development environment that will simplify your coding life).\n\nAfter reading a chapter, **do the exercises**, trying to look for alternative solutions.\n\nOnce you finish a chapter, go to the [W3School](https://www.w3schools.com/python/python_exercises.asp) website and try to solve as many exercises you can, depending on the topic you just learned in the book (for example, after [Chapter 4 - Lists in Python](https://automatetheboringstuff.com/chapter4/), you want to tackle the [Exercises on Lists on W3School](https://www.w3schools.com/python/python_lists.asp)).\n\nFor additional Python resources, check [this link](https://github.com/neomatrix369/awesome-ai-ml-dl/blob/master/Programming-in-Python.md#basics--learning)!\n\n#### Coding Challenges\n\nWe suggest you get into [CodeAcademy](https://www.codecademy.com/), tackling coding challenges daily will improve your coding and problem-solving skills in general!\n\n[Here](https://geekflare.com/coding-challenges-to-sharpen-thinking/) you find a detailed list of similar coding challenges (pick your favorite!).\n\n#### IDE\n\nEven though the official Python IDLE is great for starting out with Python, we suggest you approach one of the following IDEs, which come with many more functionalities (and are better supported):\n\n- [Pycharm](https://blog.ipswitch.com/getting-started-with-pycharm)\n- [VSCode](https://code.visualstudio.com/docs/python/python-tutorial)\n\nVirgilio tip: the former is born around Python, and maybe has more advanced functionalities, but VSCode is faster and simpler to use.\n\nTry both, and read [here](https://www.reddit.com/r/Python/comments/8u0hl6/vs_code_vs_pycharm_community/) a very detailed Reddit discussion about which to choose.\n\n#### Navigate the Official Docs\n\nIn order to become proficient with Python (like every programming language or technology), you must become comfortable with the [**official Python documentation**](https://docs.python.org/3.7/).\n\nWorking through the documentation as a beginner is a really good practice, even if a lot of things will be unclear. In fact, be able to explore the documentation of something is the key to learn it autonomously.\n\n[Here](http://blog.techtalentsouth.com/8-tips-to-reading-documentation-a-newbies-guide) you have some tips to read documentations effectively.\n\n#### Stack Overflow\n\nYou _should_ fall in love with [**StackOverflow**](https://stackoverflow.com/), a question-answer website about programming in general.\nRead [How can I use Stack Overflow effectively as a beginner?](https://www.quora.com/How-can-I-use-Stack-Overflow-effectively-as-a-beginner) and be ready to become grateful to awesome people around the world who answer questions daily on the website.\n\n#### Hold your Cheatsheet\n\nHere you can find a very good Python Cheatsheet, hold it with you!\n\n[**Python Cheatsheet**](https://github.com/ehmatthes/pcc/releases/download/v1.0.0/beginners_python_cheat_sheet_pcc_all.pdf)\n\n### Develop Small Projects\n\nFirst of all: [**Read this post from r/LearnProgramming**](https://www.reddit.com/r/learnprogramming/comments/5zc24o/the_best_way_to_learn_how_to_code/), and let it sink into your mind\n\n**The biggest lesson in the world of programming is the following: the best way to learn is getting your hands dirty!**\n\nOf course, to start with it makes sense to follow tutorials and guides (better still a structured book), but you need to experiment, make mistakes, and re-iterate this process to **to be really able to improve** your coding skills.\n\nOnce you are done with the book [Automate the Boring Stuff](https://automatetheboringstuff.com/), start a small project and develop it by yourself! \n\nThe best case is that you find a topic or a task in which you have an interest, and tackle it! \n\nIf you lack imagination don't worry, here you have a list of 1000+ project ideas you can develop in Python :)\n\n- [1000+ Beginner Programming Projects](https://www.reddit.com/r/learnprogramming/comments/2a9ygh/1000_beginner_programming_projects_xpost/)\n\nHaving a project keeps you motivated, don't underestimate it!\n\n### Learn Git and GitHub\n\nGit is a versioning system that allows you to always have every change in your code under control, be able to go back, and be sure that your code will never be lost!\n\nGit is defined as **Distributed Version Control System**: What does it mean?\n\nFrom [this article](https://www.freecodecamp.org/news/what-is-git-and-how-to-use-it-c341b049ae61/):\n\n- Control System: This basically means that Git is a content tracker. So Git can be used to store content — it is mostly used to store code due to the other features it provides.\n\n- Version Control System: The code which is stored in Git keeps changing as more code is added. Also, many developers can add code in parallel. So Version Control System helps in handling this by maintaining a history of what changes have happened. Also, Git provides features like branches and merges, which I will be covering later.\n\n- Distributed Version Control System: Git has a remote repository that is stored in a server and a local repository that is stored on your local machine. This means that the code is not just stored in a central server, but the full copy of the code is present in all the developers’ computers. Git is a Distributed Version Control System since the code is present in every developer’s computer.\n\n_Any existing software project that is not under version control is considered a dead project, and the responsible developers are considered crazy._\n\nData Science projects (which make heavy use of software) are no different, indeed! \n\nThey also have the _additional problem of data versioning_, which is the raw material on which you work most. \n\n[**Here**](https://rogerdudler.github.io/git-guide/index.html) you can find a simple guide to Git.\n\n**Learn it, it's freaking worth (and necessary).**\n\nDocumenting well your work with Git is crucial: read [How to Write a Git Commit Message](https://chris.beams.io/posts/git-commit/).\n\n**Must read:**\n[**Ten Simple Rules for Taking Advantage of Git and GitHub**](http://dx.plos.org/10.1371/journal.pcbi.1004947)\n\n### Ask Questions\nA rule of thumb to learn fast and effectively is to ask questions and read other's questions and answers.\n\nJoin communities of people interested in the topic (e.g. Reddit): here you can find discussions, search by keywords (e.g. \"matrix multiplication\"), and ask questions, with experts who will answer and help you.\n\nSome _tips_ regarding questions:\n\n- Try to form specific, well-written questions, to minimize the time used by the respondent.\n- Do not ask a question whose answer is found with a quick search on google.\n- If the questions are too general or show laziness they'll likely remain unanswered...\n\nSome subreddits you can subscribe to are:\n\n- [r/Python](https://www.reddit.com/r/python/)\n- [r/LearnPython](https://www.reddit.com/r/learnpython/)\n- [r/LearnProgramming](https://www.reddit.com/r/learnprogramming/)\n- [r/Programming](https://www.reddit.com/r/programming/)\n- [r/Computer Science](https://www.reddit.com/r/compsci/)\n\nOther good places to post and read (well structured) questions are:\n\n- [HackerNews](http://hn.premii.com/)\n- [Quora](https://www.quora.com/)\n- [Math Stack Exchange](https://maths.stackexchange.com)\n\n### Conclusions\n\nThe path to becoming a good programmer is long and requires commitment and dedication, but it will give you satisfaction (and value) like very few other things in life!\n\nProgramming is creativity, problem-solving, art! \n\nIf you follow the advice of this guide you won't have any problem to become proficient with Python, and moreover, you will have learned the main concepts of programming:\n\nThis means that to learn another language, the biggest obstacle will be to learn the syntax, but the concepts will remain more or less the same!\n\nIn the next guide we will see how to use the Jupyter Notebooks, a Python application designed specifically for Data Science and experimental programming!\n\n----\nWritten by [_clone95_](https://github.com/clone95)\n"
  },
  {
    "path": "Topics/starting-a-data-project.md",
    "content": "# Starting a Data Project\n\n# What you will learn \nIn this guide, you'll learn to prepare yourself to start the project. \n\nThis will consist of learning how to look for sources that can help you solve the problem, building the project structure, building good documentation, securing your code and our data and others!\n\nWe'll make heavy use of a collection of awesome best practices from the [PLOS | Public Library of Science](https://www.plos.org/). \n\nDo you know the joy when you find a _giant diamond cluster in Minecraft_? \n\nIf yes, you need to know that you've just hit a big one:\ntake your time to explore the [**Ten Rules Collection**](https://collections.plos.org/ten-simple-rules).\n\n\n## Prerequisites\nAll the previous Purgatorio guides.\n\n## Time to complete\n10 minutes.\n\n# Index\n- [Collect Information](#Hunting-for-Information)\n- [Building a Knowledge Tree](#Building-a-Knowledge-Tree)\n- [Choosing a Project Structure](#Choosing-a-Project-Structure)\n- [Reproducibility](#Reproducibility)\n- [Versioning](#Versioning)\n- [Documentation](#Documentation)\n- [Prepare to Fail](#Prepare-to-Fail)\n\nLet's dive right in!\n \n \n### Hunting for Information\nA vital phase when starting a project is to search for information that can help you. These can be of any kind:\n- Tutorials\n- Documentation\n- Existing projects\n- Research Papers\n- ...\n\nThis guide will not teach you how to use [Google](https://www.google.com/), because you will already know if you are reading these lines :-). \n\nBy the way, probably not everyone knows about [**these Google tricks**](https://smallbiztrends.com/2019/03/google-tricks.html)...\n\nBut there are a few tips that can come in handy when you start \"amassing\" knowledge that will then come in handy.\n\n#### Understand what you're looking for\nThe first thing to do when dealing with a new problem is to make sure you're looking for the right things. Are you sure the problem is called that for example? Image segmentation is different from image classification! [This Google guide](https://developers.google.com/machine-learning/problem-framing/cases) can help you be sure of the name of your problem.\n\nThis may seem trivial, but many useful resources are not found because the correct keywords are not typed into the search engine.\n\nConsider the use of the [5 Whys technique](https://en.wikipedia.org/wiki/Five_whys) to better understand the problem you're trying to solve.\n\n#### Don't re-invent the wheel\nAre you sure that someone hasn't already solved your problem? In that case, if you needed it to solve a real problem you'd already have the dish ready, while if you're doing it to learn you have a base from which to start! Also, observing the code of others is very effective for learning.\nIn the latter case, it is still advisable to try to re-implement the solution.\n\nTo look if someone has solved the same problem the first place to look is [Github](https://github.com/), the platform where every developer puts Open Source code. \nAnother interesting place can be [Kaggle](https://www.kaggle.com/), the site of the Data Science challenges, where thousands of practitioners and experts challenge each other on real problems, and whose works are available in the form of Notebooks.\n\nLet's suppose for example that I want to solve a problem related to time series: I can type on Kaggle \"analysis of time series\" and I will probably find dozens of Notebooks that show how to solve a similar problem, and from which you can observe the approach. What a great source of inspiration!\n\nAlso check out [TensorFlow Hub](https://www.tensorflow.org/hub), [ModelZoo](https://modelzoo.co/) and [Papers with Code](https://paperswithcode.com/). These three platforms are full of pre-trained models that can come in handy, or even solve your problem already! :) \n\n#### Find communities\nJoin communities of people interested in the topic (e.g. [Reddit](www.reddit.com)): here you can find discussions, search by keywords (e.g. \"time series analysis\"), and ask questions, with experts who will answer and help you. \n\nTry to form specific, well-written questions, to minimize the time used by the respondent. For example, the question \"how do I analyze a time series?\" is too general, and a short Google search is all it takes to get the answer. \n\nInstead, a question like \"to analyze a time series and train a model that predicts 2 steps forward in the future, is it better to approach X or approach Y?\".\n\nIf the questions are too general or show laziness they'll likely remain unanswered...\n\nSome subreddits you can subscribe to are:\n\n- [r/MachineLearning](https://www.reddit.com/r/MachineLearning/)\n- [r/LearnMachineLearning](https://www.reddit.com/r/learnmachinelearning/)\n- [r/DeepLearning](https://www.reddit.com/r/deeplearning/)\n- [r/DataScience](https://www.reddit.com/r/datascience/)\n- [r/LearnDataScience](https://www.reddit.com/r/learndatascience/)\n\nTwo other good places to post (well structured) questions are:\n- [HackerNews](https://news.ycombinator.com/)\n- [Quora](https://www.quora.com/)\n\n#### Building a Knowledge Tree\n\nGiven the speed of scientific research in the world of data, every day a new approach to your problem could be discovered that proposes a much better solution than the previous one. The only way to get up to date is to read research papers! \nReading papers is difficult though, they are often full of mathematical, and statistical concepts, with complex theories. The important thing, however, is to be able to understand the concepts, and maybe try to apply them to your problem. \n\nAlso often remember that Paper With Code collects the code to implement any paper! Often already after a couple of days from the release, there is code available in various frameworks, ready to be tried on your problem. \n\nHowever, when you are confronted for the first time with a new problem _you do not know which paper to start with_, also because usually, the papers refer to all previous papers that have tried to solve the same problem, and assume that the reader has some kind of knowledge about the problem.\n\nSo what to do?\n\nUse the **Papers Tree strategy**:\n\n- Find the last survey paper about the sub-field of Data Science you're trying to solve \n- Read carefully this paper, and understand which are the foundations and try to figure out which are the most important papers the sub-field is based on. Usually, the history of the field is covered, citing the most important papers, and this gives you an overview of which were the important steps of the research, up to the state of the art in the approach to the problem.\n\nFollowing the example above, this paper -> [A Survey of the Recent Architectures of Deep Convolutional Neural Networks](https://arxiv.org/abs/1901.06032) contains a detailed map of the most important papers on convolutional networks (neural networks that work well with images and videos) and their evolutions, up to the most advanced architectures. \n\nNow you just have to look for the most important (or interesting) papers mentioned, organized is a time-aware tree!\n\nA good practice is to use [Zotero](https://www.zotero.org/), a document manager that allows you to keep track of all your research.\n\nYou can then repeat this process in a more specific way, for example by looking for a survey paper on convolutional networks applied to the diagnosis of medical images. \n\nOnce you collected the mosst important papers for your research, document your exploration!\n\nTools like MindMup[https://www.mindmup.com/] can help you in this task. \n\nConsider the [Rhizomaps](http://spdrdng.com/posts/rhizomapping-rhizomaps-rhizomatic-learning-mindmapping-speed-reading-tip-17-take-notes-with-mindmaps-and-rhizomaps) approach too, it really helps in dumping our thoughts on paper.\n\n\n#### Warning\nBefore reading any paper [**read this!**](https://web.stanford.edu/class/ee384m/Handouts/HowtoReadPaper.pdf)\n\nIt's a paper that explains how to read a paper. Yes, we at Virgilio like recursion.\n\n### Choosing a Project Structure\nChoosing a project structure is vital to managing the complexities that result from the evolution of the project. Without a clear structure, you'll find yourself with randomly scattered files, dataset versions with similar names, so much so that it hurts your head! \n\nWell organized code tends to be self-documenting in that the organization itself provides context for your code without much overhead. People will thank you for this because they can:\n\n- Collaborate more easily with you on this analysis\n- Learn from your analysis about the process and the domain\n- Feel confident in the conclusions at which the project arrives\n\n\nBut the first person to thank the ordered project structure is you! When we look at the code we wrote months ago, we often don't remember anything! \n\n> \"Mmmm... I don't remember if the good file was analysis.py, analysis_final.py, analysis_1.py\" :-)\n\nFor these reasons, good people have developed a fantastic project, [**Cookiecutter**](https://drivendata.github.io/cookiecutter-data-science/), which wants to standardize the structure of projects by providing a sensible and flexible template. \n\nTo create the project skeleton just install the package:\n```\npip install cookiecutter\n```\n\nand then use:\n\n```\ncookiecutter https://github.com/drivendata/cookiecutter-data-science\n```\n\nYou can customize the template according to your needs, just clone the repo, modify it and then use:\n\n```\ncookiecutter https://github.com/...... your repo .....\n```\n\nCookiecutter projects have the following structure:\n\n\n![Figure 1-1](cookiecutter.png \"1\") \n\n[Here](https://drivendata.github.io/cookiecutter-data-science/) you can find how to use it and the motivations behind the structure choices, and [here](https://cookiecutter.readthedocs.io/en/latest/readme.html) you can find the docs.\n\nTake a look at some example project structures, in particular go and check [these cookiecutter project templates](https://github.com/neomatrix369/awesome-ai-ml-dl/blob/master/Programming-in-Python.md#cookie-cutter-python-project-templates).\n\n\n#### Metadata and file names\nAnother important issue with regard to the overall order of the project and the management of its complexity is the management of the data and metadata associated with them. \n\n[**This awesome cheatsheet**](https://www.axiomdatascience.com/best-practices/DataManagementCheatSheet.html) contains everything you need to know about **data management and file names best practices**: keep it under your pillow!\n\n\n### Reproducibility\n\nWhy are we talking about [**reproducibility**](https://en.wikipedia.org/wiki/Reproducibility)? \n\nThe field name in the Data **Science** indicates that the work process is scientific (Data Science, even with software as a component, is not pure software, which is reproducible by definition).\n\nFrom [this article](https://towardsdatascience.com/data-sciences-reproducibility-crisis-b87792d88513):\n> Reproducible experiments are the foundation of every scientific field and, indeed, even the scientific method itself.\n\n Karl Popper said it best in [The Logic of Scientific Discovery](http://strangebeautiful.com/other-texts/popper-logic-scientific-discovery.pdf): “non-reproducible single occurrences are of no significance to science.” \n\nIf you’re the only person in the world who can achieve a particular result, others may find it difficult to trust you, especially if they have spent time and effort attempting to reproduce your work. \n\nIt is reckless and irresponsible to build a product or theory on a singular unconfirmed anecdote, and if you present anecdote as a reliable phenomenon, it can consume time and resources that would otherwise be spent on actual productive work.\n\nReproducibility has a number of indirect advantages, in addition to being sure to present good results (analysis or model predictions):\n\n- It saves time in various ways, for example by saving the intermediate steps of data processing and cleaning, so that you don't have to redo all the steps\n- Allows you to automate various parts of the project workflow\n- Allows others to reproduce results\n- Allows others to understand each phase without confusion\n- Reproducible design is easier to document\n- Allows you to take over the project after months or years, and be sure to get the most out of it\n\nHere you can find articles and papers that explain to you how to ensure a high reproducibility across all the phases of the project:\n\n- [Reproducibility in Science](https://ropensci.github.io/reproducibility-guide/)\n- [Replicability is not Reproducibility: Nor is it Good Science](http://cogprints.org/7691/7/ICMLws09.pdf)\n- [Best Practices for Reproducible, Collaborative Data Science (Video)](https://www.youtube.com/watch?v=vP9Iup8xhKA)\n\nOnce you've walked through the above resources, you'll be equipped with best practices to ensure that your code will be highly reproducible, and again, people will be grateful to you! \n\n**Especially, the future yourself will be happy in finding reproducible and automated results, months lateror years !!!**\n\n**Must read:**\n- [**Ten Simple Rules for Reproducible Computational Research**](http://dx.plos.org/10.1371/journal.pcbi.1003285)\n- [**Ten Simple Rules for Reproducible Research in Jupyter Notebooks**](https://arxiv.org/ftp/arxiv/papers/1810/1810.08055.pdf)\n\n### Versioning\n\nIn order to make reproducible projects, and also for peace in the heart of every programmer, learn to use [**Git**](https://git-scm.com/)!\n\nGit is a versioning system that allows you to always have under control every change in your code, be able to go back, and be sure that your code will never be lost!\n\nGit is defined as **Distributed Version Control System**: What does it mean?\n\nFrom [this article](https://www.freecodecamp.org/news/what-is-git-and-how-to-use-it-c341b049ae61/):\n\n- Control System: This basically means that Git is a content tracker. So Git can be used to store content — it is mostly used to store code due to the other features it provides.\n\n- Version Control System: The code which is stored in Git keeps changing as more code is added. Also, many developers can add code in parallel. So Version Control System helps in handling this by maintaining a history of what changes have happened. Also, Git provides features like branches and merges, which I will be covering later.\n\n- Distributed Version Control System: Git has a remote repository that is stored in a server and a local repository that is stored in the computer of each developer. This means that the code is not just stored in a central server, but the full copy of the code is present in all the developers’ computers. Git is a Distributed Version Control System since the code is present in every developer’s computer. I will explain the concept of remote and local repositories later in this article.\n\n_Any existing software project that is not under version control is considered a dead project, and the responsible developers are considered crazy._\n\nData Science projects (which make heavy use of software) are no different, indeed! \n\nThey also have the _additional problem of data versioning_, which is the raw material on which you work most. \n\nAlways having the versions of the data, from raw (just collected) to clean, keeping every intermediate processing phase, is perhaps the most important [best practice](https://medium.com/thelaunchpad/retracing-your-steps-in-machine-learning-ml-versioning-74d19a66bd08) when doing a Data Science project.\n\n[**Here**](https://rogerdudler.github.io/git-guide/index.html) you can find a simple guide to Git. Learn it, it's freaking worth (and necessary).\n\nDocumenting your work with Git is crucial: read [How to Write a Git Commit Message](https://chris.beams.io/posts/git-commit/).\n\n**Must read:**\n[**Ten Simple Rules for Taking Advantage of Git and GitHub**](http://dx.plos.org/10.1371/journal.pcbi.1004947)\n\n### Documentation\n\nLike any project, documenting the work done is fundamental to the success of the project. \n\nWe don't need to list the benefits that good documentation brings to a project, so we immediately understand what are the best practices to keep in mind when we produce documentation for our projects.\n\nIf you still want to learn more, read [this article](https://towardsdatascience.com/why-you-should-document-your-work-as-a-data-scientist-a265af8a373?gi=bc5bae43230e) and [this other](https://hackernoon.com/why-you-should-document-your-self-documenting-code-1105a8a6852e).\n\n[**This guide**](https://managing-qualitative-data.org/modules/2/a/) explains in detail how to document data collection and its organization.\n\nRead also [Ten simple rules for documenting scientific software](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6301674/).\n\nYou can choose among different ways to document your project, but Virgilio recommends you to use [Sphinx](http://www.sphinx-doc.org/en/master/), the official Python automated docs library. \n\nRemember that documenting your code and project steps it's **NEVER wasted time**.\n\n**Must read:**\n[**Ten simple rules for documenting scientific software**](http://dx.plos.org/10.1371/journal.pcbi.1006561)\n\n\n### Conclusions\n\nAfter reading this guide and the resources it contains, you should be equipped with all the necessary best practices when starting a new Data Science project. \n\nIn the next sections of Purgatorio you will begin to put these practices into practice, and you will see how grateful you are to yourself! \n\n\n----\nWritten by [_clone95_](https://github.com/clone95)\n"
  },
  {
    "path": "Topics/statistics-fundamentals.md",
    "content": "# Statistics Fundamentals\n\n# What you will learn \n\nIn this guide, you'll learn what is the fundamental statistical knowledge you need to have in order\nto build insightful Data Science projects and build machine learning systems upon them.\n\nYou'll also learn that not so much is needed to start to apply yourself to real-world data problems!\n\n## Prerequisites\nThe previous Paradiso guides, plus the [Math Fundamentals](math-fundamentals.md) guide.\n\n## Time to complete\n10 minutes.\n\n# Index\n- [Motivation](#Motivation)\n- [Courses](#Courses)\n  - [Descriptive Statistics](#Descriptive-statistics)\n  - [Probability Theory](#Probability-Theory)\n  - [Bayesian Statistics](#Bayesian-Statistics)\n- [Ask Questions](#Ask-Questions)\n- [Conclusions](#Conclusions)\n\nLet's dive right in!\n \n### Motivation\nThe field of statistics is the **science of learning from data**.\n\nStatistics is a crucial process behind how we make discoveries in science, make decisions based on data, and make predictions. \n\nStatistical knowledge helps you use the proper methods to collect the data, employ the correct analyses, and effectively present the results. \n\nEvery fancy term you read related to the field of Data Science, or the even more misunderstood Artificial Intelligence, _is nothing more than statistical models trained with some mathematical algorithms_.\n\nThat's why **learning the basics of statistics is fundamental** in order to tackle real-world Data Science problems and build powerful predictive models upon them.\n\nThe two fundamental subjects to know in order to develop successful Data Science projects are **descriptive statistics** and **theory of probability**.\n\nWe'll explore an additional one, Bayesian Statistics, which is pretty powerful but not mandatory for a first pass of the statistics topics.\n\nPlay with [this interactive website](https://seeing-theory.brown.edu/) to taste the flavor of the topics that this guide will suggest to you.\n\nIt's awesome.\n\n### Descriptive Statistics\n\n[Descriptive statistics](https://www.investopedia.com/terms/d/descriptive_statistics.asp) aim to analyze and summarise the data collected in an experiment. \n\nThe set of methods and techniques used in descriptive statistics makes it possible to express the information contained in a set of data by means of graphs and particular numerical indicators.\n\nMoreover, with the techniques of investigation of descriptive statistics, it is possible to verify the adaptation of the experimental data to an assigned theoretical model, as well as to carry out comparative analyses between datasets.\n\nDescriptive statistics are widely used in economics, demography, medicine, and in all-natural sciences.\n\nFirst of all watch these videos, they are truly inspirational:\n\n- [Why You Should Love Statistics](https://www.ted.com/talks/alan_smith_why_we_re_so_bad_at_statistics)\n- [The Best Stats You've Ever Seen](https://www.ted.com/talks/hans_rosling_shows_the_best_stats_you_ve_ever_seen)\n\n---\n\nTo understand the concepts of descriptive statistics, the book Virgilio recommends is the following:\n\n[**Statistics in Plain English**](http://www.pindex.com/uploads/post_docs/statistics%20in%20plain%20english%20(3rd,%202010)(PINDEX-DOC-6952).pdf) - [Timothy C. Urdan](https://www.amazon.com/Timothy-C.-Urdan/e/B001JP8H9Q%3Fref=dbs_a_mng_rwt_scns_share)\n\nThis book is fantastic because it focuses more on **the reason behind the concepts** concepts rather than on formulas or calculations, which are easily found elsewhere. \n\n**The book is mandatory for a full understanding of descriptive statistics** (it is certainly not the only book of statistics out there, but it is the best in terms of clarity of explanation and completeness of the basic concepts.).\n\nOnce finished, you can choose whether to go deeper with a more technical manual, like the following _free book_:\n\n[**Elements of Statistics**](https://www.open.edu/openlearncreate/mod/oucontent/view.php?id=18263&printable=1)\n\nThis book deals in more depth with the various topics, but to start doing small experiments in Data Science is not necessary to address it immediately. \n\n**Keep it as a reference!**\n\n#### Check your knowledge\n\nTest your knowledge with some of [these exercises](https://www0.gsb.columbia.edu/faculty/pglasserman/B6014/exercises.pdf).\n\nAnyway, you can find a ton of them online, and remember, that the more you practice, the better you will get!\n\n\n\n### Probability Theory\n\nProbability theory governs every daily event, from microscopic to macroscopic, even if we hardly realize it!\n\nBut you may have thought about the odds of winning, for example, the game of dice, or when you estimate the probability of having successfully passed an exam!\n\nProbability theory is so interconnected with statistical and mathematical concepts that it _is difficult to explain why it is fundamental_: simply consider it as the basic building blocks of more advanced statistical concepts based on it.\n\nNot to mention that knowledge of probability theory can be very useful in everyday life since it can suggest to us how to behave on certain occasions, to make the best choices, or involving the least risk of failure.\n\nFortunately, you can have the (perhaps) best course on probability theory available to date, offered as usual by [MIT](http://www.mit.edu/). \n\nIt's good to have a first-class education from home for free, huh? \n\nWhat an incredible time to be alive!\n\nTake the course at:\n\n[**Introduction to Probability - Video Lectures**](https://www.youtube.com/watch?v=1uW3qMFA9Ho&list=PLUl4u3cNGP60hI9ATjSFgLZpbNJ7myAg6)\n\nIn addition, keep this _free complete book_ as a reference:\n\n[**Introduction to Probability - Book**](https://www.dartmouth.edu/~chance/teaching_aids/books_articles/probability_book/amsbook.mac.pdf)\n\n#### Check your knowledge\n\nTest your knowledge with some of [these exercises](https://www.math.kth.se/matstat/gru/sf1901/TCOMK/exercises.pdf).\n\nAnyway, you can find a ton of them online, and remember, that the more you practice, the better you will get!\n\n### Bayesian Statistics\n\nThis last topic is not fundamental for a first pass study, but it's highly recommended since some of Machine Learning algorithms are based on it or leverage some concepts from Bayesian Theory.\n\nThe Bayesian approach is often distinguished from the \"classical\" approach, which you have studied in the [Descriptive Statistics](#Descriptive-Statistics) section, and which is called \"frequentist\" when compared to the \"Bayesian\" approach.\n\nRead [the difference between the \"frequentist\" and \"Bayesian\" approach](https://stats.stackexchange.com/questions/22/bayesian-and-frequentist-reasoning-in-plain-english)!\n\nThe Bayesian approach to statistics is based upon the famous [Bayes Theorem](https://en.wikipedia.org/wiki/Bayes%27_theorem), which describes the probability of an event, based on prior knowledge of conditions that might be related to the event.\n\nFor example, if cancer is related to age, then, using Bayes’ theorem, a person’s age can be used to more precisely or accurately assess the probability that they have cancer, in contrast to the assessment of the probability of cancer made without knowledge of the person's age.\n\nFirst, get comfortable with the Bayesian approach with [this simple introduction](https://lavanya.ai/2019/05/16/bayes-theorem/).\n\nThen you can take this course to dive deep into the Bayesian approach to statistics, along with many more concepts, taking the following course:\n\n[**Statistical Rethinking - Video Lectures**](https://www.youtube.com/playlist?list=PLDcUM9US4XdM9_N6XUUFrhghGJ4K25bFc)\n\nYou find the complete book from the same author at:\n\n[**Statistical Rethinking - Book**](https://www.amazon.com/Statistical-Rethinking-Bayesian-Examples-Chapman/dp/1482253445)\n\n### Ask Questions\nA rule of thumb rule to learn fast and effectively is to ask questions and read other's questions and answers.\n\nJoin communities of people interested in the topic (e.g. Reddit): here you can find discussions, search by keywords (e.g. \"standard deviation\"), and ask questions, with experts who will answer and help you.\n\nSome _tips_ regarding questions:\n\n- Try to form specific, well-written questions, to minimize the time used by the respondent.\n- Do not ask a question whose answer is found with a quick search on google.\n- If the questions are too general or show laziness they'll likely remain unanswered...\n\nSome subreddits you can subscribe to are:\n\n- [r/Statistics](https://www.reddit.com/r/statistics/)\n- [r/AskStatistics](https://www.reddit.com/r/AskStatistics/)\n- [r/ProbabilityTheory](https://www.reddit.com/r/probabilitytheory/)\n- [r/Bayes](https://www.reddit.com/r/Bayes/)\n\nTwo other good places to post (well structured) questions are:\n\n- [Math - StackExchange](https://math.stackexchange.com/)\n- [HackerNews](http://hn.premii.com/)\n- [Quora](https://www.quora.com/)\n\n\n### Conclusions\n\nThat's all! \n\nWith the above-suggested courses, you should be equipped with most of the statistics knowledge you need to start working on simple Data Science projects. \n\nA very book we suggest you tu read is [\"How To Lie With Statistics\"](https://en.wikipedia.org/wiki/How_to_Lie_with_Statistics).\n\nThe book is a brief, breezy illustrated volume outlining errors when it comes to the interpretation of statistics, and how these errors may create incorrect conclusions. Very suggested!\n\nThe next guide will focus on learning the **Python programming language**, the real tool that will allow you to put into practice the knowledge you've gained with your hard study.\n\n----\nWritten by [_clone95_](https://github.com/clone95)\n"
  },
  {
    "path": "Topics/teaching.md",
    "content": "\n# Virgilio's Learning Strategy - Learning to Learn\n\n# What you will learn \nThis guide serves various purposes: \n\n- To understand broadly how the learning of the human brain works (before teaching machines, we will have to learn ourselves, right?).\n- Presenting _how_ Virgilio sees teaching and learning.\n- Give useful tips to make the most of the help Virgilio can give you in starting to explore this fantastic world and develop solid skills in the world of data through practical projects.\n\n\nThe guide is built using these relevant materials as well as the personal experiences of the author, who has spent a good amount of time documenting and testing techniques and approaches, both on himself and as a teacher.\n\n## Prerequisites\nIt is recommended to read all the Paradise guides prior to this one.\n\n## Time to complete\n30 minutes.\n\n# Index\n- [The Art of War](#The-Art-of-War)\n- [The Art of Learning](#The-Art-of-Learning)\n- [Mastering Internet](#Mastering-Google)\n- [Time Management](#Time-Management)\n- [Conclusions](#Conclusions)\n\n### The Art of War\n\nThis guide is aimed at anyone who wants to enter the world of innovative fields such as those covered by Virgilio, but it can serve as a general approach to learning any subject, skill or job.\n\nFor this guide, we will use various enlightening books (famous and not), from which we will draw various lessons about how human beings learn, create, reason and memorize.\n\nFor each resource, summaries or \"key points\" will be provided, but I will never stress enough the importance of reading the books that will be mentioned.\n\nThe first book we consider is [The Art of War](https://www.amazon.it/Art-War-Sun-tzu/dp/1936276011). \n\n[Here](https://sites.ualberta.ca/~enoch/Readings/The_Art_Of_War.pdf) you have a more consensual version, but I recommend buying the book with the attached analyses.\n\n[Here](http://blog.tutorming.com/expats/life-lessons-from-the-art-of-war) the main key points.\n\nThe book is condensed of the wisdom of various generals and heads of state of the ancient Chinese empire and is used in many training courses, especially in management and decision making.\n\nI firmly believe that its principles can apply to any human activity, particularly the planning of one's own self-improvement and learning. \n\nToday you don't learn a job that you will do all your life, but you will have to reinvent yourself and learn new skills continuously. [**Who stops is lost!**](https://www.mckinsey.com/featured-insights/future-of-work/ai-automation-and-the-future-of-work-ten-things-to-solve-for)\n\nThe two main points of instruction that I would like to emphasize are:\n- Know your enemy\n>“If you know the enemy and know yourself, you need not fear the result of a hundred battles. If you know yourself but not the enemy, for every victory gained you will also suffer a defeat. If you know neither the enemy nor yourself, you will succumb in every battle.”\n\nThis means that whenever you are faced with a problem, be it an enemy soldier, an engineering problem, or a human relationship, the best tactic is to know your enemy as much as possible. \n\nContinuing the analogy, knowing the enemy means knowing the number of his forces, how his army is composed, which are the most important departments.\n\nIn our case, it means knowing how much work awaits us, what is the perimeter of the things we want to learn, and what are the techniques most used in practice. \n\nIf you try to do everything, you do nothing! Which brings us to the next point:\n\n- Face one enemy at a time\n\nHow many tutorials have you seen of the type \"learn Data Science\" in 3 weeks, full of many topics and concepts, techniques and frameworks? This approach is totally unsuccessful (as well as disrespectful for those who take years and years of study), the reason is trivial. \n\nWhat we at Virgilio prefer to do is to outline a path that enables you to **take one step at a time**, learn one concept and apply it, preferring _a solid skill_ (developed in the right time) rather than knowing a thousand acronyms or exotic techniques.\n\nThis principle is another way of formulating the classic [**Divide et Impera**](https://en.wikipedia.org/wiki/Divide_and_rule_and_rule), a principle of software engineering whose purpose is to try to manage the growing complexity of programs, as well as generally advise to disassemble a problem into smaller pieces and address them separately. \n\nIn a later section, we will see how the principles of software engineering, dealing with complexity and logic, can be applied profitably to everyday life, rational thinking, and in general to the planning of our lives (professional and non-professional).\n\nWe'll help you to develop you \"The Art of Learning\".\n\n### The Art of Learning\n\nThe human brain is currently the most complex device we know of, far more complex and powerful than any result of today's engineering. In addition to this, it is also extremely efficient in terms of the resources required for operation, gives us the feeling of being \"living\" and protects us from the outside world in an ingenious way. What an incredible thing!\n\nTo exploit it to its full potential, however, is very difficult, firstly because [we know very little](https://www.reddit.com/r/MachineLearning/comments/9symfk/d_reverseengineering_a_massive_neural_network/) about its operation, and secondly because we are not taught to do so!\n\nThe good news is that countless scientists for decades have been looking for clues on how to learn best, and effective techniques have been developed that work more or less for everyone.\n\n[Here](https://examinedexistence.com/top-10-learning-techniques-ranking-from-best-to-worst/) is an overview of these techniques.\n\nThe bottom line is that each brain is different, according to [the experiences it has lived and how it has formed](https://learn.genetics.utah.edu/content/epigenetics/brain/).\n\nSo, understanding which learning strategies work best **for you** is something to discover, more like a trip, than something you can learn from a book or a course.\n\nThese extremely useful for not having to reinvent the wheel, and understand what options work, but then you have to experiment and fail to understand what is the most suitable technique in your case.\n\nBefore you even start learning, you have to learn \"how to learn\"! \n\nVirgil's suggestion is: spend time testing different learning strategies, each for at least a few topics, and evaluate the results! \n\nIf you don't want to and want to focus on the subjects you want to learn right away, we offer you a technique that suits more or less all situations and all brains.\n\nActually, it's nothing particularly innovative, but to be cool we'll call our _learning framework_ \"The Magic Circle\".\n\nThe Magic Circle is an **iterative** process that consists of 3 simple steps:\n\n- Theoretical understanding\n- Practical application\n- Check \n\n![Figure 1-1](./magic_circle.png) \n\nThe trick is simple. \n\n**By addressing one topic at a time**, you first aim for a theoretical understanding, then you put it into practice, and finally you evaluate yourself. If you feel confident you can proceed, otherwise you will iterate another round of the circle. \n\nSome advice: \n- The first time you address the topic X, first of all, make sure you have **framed** X. In Sun Tzu this means knowing how your enemy's army is made up. You don't need to know in detail which men make up its ranks, but you need to have an overview of how many forces it has and how they are divided. In our case, it means knowing **why** I'm learning this, **what prerequisites** it has and **where it fits** in with the neighboring topics. \nEvery Virgilio guide provides this kind of information, but it is important to spend time looking for it and understanding alternative points of view. \n\n- Each different iteration of the Magic Circle tries to change the resources you use to support learning. Virgilio's guides often provide more resources for the same topic, just to get more visions of the same concept.\n\n- The point just mentioned is fundamental. Knowledge is multifaceted, and there are many different ways of seeing or understanding almost everything. An incredible trick to fully know a topic or concept is to see it under as many different points of view as possible, see alternative interpretations or alternative methods of visualization. \nIt is very important to confront also those who claim that a certain concept is useless, harmful or outdated! For example, if I'm learning what a neural network is, it's also very useful to look for information like \"when not to use a neural network\".\n\n- For each topic, Google searches for visualizations of concepts, GIFs, videos, in short, any form of explanation that goes beyond words and code examples.\n\n- To make sure that you understand, in the Check phase, the most effective technique is generally to try to explain the concept. If you can, perhaps getting feedback from someone, you probably learned it. The teaching process works for a simple reason: to explain X, your brain must take X as an input, process it, make it its own, and then output it easily. The only way for this process to be successful is for your brain to be comfortable with X.\n\n- Don't persist too much on a subject, it's natural that after a while you lose interest and motivation (especially if they are difficult or advanced concepts). Relax with some simple new concepts, and maybe come back to this in a few days or weeks. The connections of our brain, in fact, take time to form and strengthen, do not stress it too much! :)\n\n**These are some of the best practices that are dictated partly by common sense, partly by what international research says and partly by the personal experiences of the author of this guide.**\n\nLet's now see how to use the tools you have at your disposal (in addition to your partner Virgil), to enhance your learning and make it unlimited.\n\n### Mastering Internet\n\nEvery time I think about the fact that I have Google in my pocket, I think it's an incredible historical moment to live: we have the most powerful tool man has ever created and for free!\n\nFor a couple of decades now, the Internet has allowed people, wherever they are, to learn any concept or work, to create value for themselves and for others, and countless other possibilities!\n\nDespite this, it is clear that its use is often superficial by most people, sometimes even zero! \n\nEvery time you see a Facebook post like \"how do I start studying machine learning?\" or more generally \"how do I do this?\" it means that there is a [big problem](https://www.businessinsider.com/millennials-dont-know-how-to-use-google-2015-5?IR=T).\n\nThis section of the guide aims to introduce you to the most advanced features of Google, giving you tips on how to best explore the knowledge tree it contains. \n\nIt also contains some tips on how to use Reddit.\n\n#### Google\n\nGoogle can almost always answer your questions, whatever they are. Don't be ashamed to ask for articulated things, don't judge yourself! :-) \n\nIn particular, Google search works by keywords, so often to search for something it is effective to try to describe it inaccurately using meaningful keywords, and often Google does the rest! \n\nThe more keywords you add, the more information Google has to find what you need, but it also narrows the search field, use it wisely! \n\n[Here](https://blog.hubspot.com/marketing/google-advanced-search-tips) you find a guide on how to make your Google searches more effective, but like everything, try it and get it wrong, only then will you learn to know Google intimately and guess which keywords give you the results you need.\n\n#### Reddit\n\nAnother thing that amazes me every day is how few people know how to use [Reddit](https://www.reddit.com/) effectively.  \n\nReddit is a content platform where more or less all the information in the world goes through, long before newspapers, TV and social media!\n\nReddit is divided into folders, like a file system, and each folder contains a topic where users can post articles, questions, discussions. \n\nPersonally, I found it perhaps the biggest source of information because it is specialized and generally the user is an expert, within the various folders. For example, following [r/MachineLearning](https://www.reddit.com/r/MachineLearning/) or [r/LearningMachineLearning](https://www.reddit.com/r/learnmachinelearning/), makes me learn dozens of new things every day, and I see new papers, tools or projects in preview, often being able to speak directly with the author!\n\nDo you have a question, about any concept or topic? Look for a dedicated subreddit, sign up, and post a well-formulated question. You will see that in a couple of days several users have answered in detail!\n\nWhat an incredible tool is used as a \"crowd mentorship\"!\n\n### Time Management\n\nLearning is difficult, tiring, and requires commitment without always seeing the end of the path. \n\nOften one of the main obstacles in learning is poor time management. Not everyone has the opportunity to spend the whole day studying, and often when you want to learn a new skill you have to try to fit it between many professional and social commitments. \n\nThe best advice for this is the good old \"Divide et Impera\" once again. By dedicating even just one hour a day, or a couple of days a week to learning, with the time you can learn any skill. \n\nThe two enemies of your time are motivation and constancy.\n\nFor motivation, I recommend using the concept of [visualization](https://www.mindtosucceed.com/Self-Motivation-Techniques.html).\n\nI also think that motivation is something very personal, which can go from the ambitions of pure knowledge to establishing oneself in a field, to helping others through one's own knowledge. \n\nIn order to get to know each other better and to understand what your real goals are, I recommend the application of the mental techniques suggested in [\"Focus\"](https://www.amazon.it/Focusing-Interrogare-corpo-cambiare-psiche/dp/883401359X/ref=sr_1_1=sr_1_1?adgrpid=58054156452&gclid=Cj0KCQjwyLDpBRCxARIsAEENsrKKCP5IZoBA6V5TOmr2X8Hivx-JvdX6ygZIt9YPjBt8EIOaJPVq6ZoaAqGnEALw_wcB&hvadid=255222382232&hvdev=c&hvlocphy=20550&hvnetw=g&hvpos=1t1&hvqmt=e&hvrand=1997028069562624827&hvtargid=kwd-301509732701&hydadcr=4935_1800296&keywords=focusing&qid=1563195460&s=gateway&sr=8-1).\n\nAs for constancy, its greatest enemy is [procrastination](https://www.youtube.com/watch?v=arj7oStGLkU&t=36s=arj7oStGLkU&t=36s).\n\nTo solve this second issue, I suggest you use this conceptual framework that personally helped me a lot. \n\nThe framework is the one proposed by the book [\"Getting things done\"](https://it.wikipedia.org/wiki/Detto,_fatto,_fatto!) and the study [\"Implementation Intentions\"](https://pdfs.semanticscholar.org/4c21/6c0ceeef2e2745d113c77a417133c2084dd9.pdf). \n\nThese two readings are **strongly** recommended. I can say that by themselves they can revolutionize the way you approach the realization of your goals (not only learning but also professional and life).\n\n### Conclusions\n\nAfter reading the books and articles in this guide, you should be able to gradually improve and become extremely effective and quick to learn. \nBut remember that the road is always uphill (if you want it to be so and it is ambitious), and there will always be something new to learn ... better for us curious, right? :-)\n\n---------------------------------------------------\n\nWritten by [_clone95_](https://github.com/clone95)\n"
  },
  {
    "path": "Topics/usage-and-integration.md",
    "content": "# Usage and Integration\n\n# What you will learn \n\nIn this guide we see which are the key questions to ask when framing a problem of Data Science, regarding the use of the final system and its integration with existing systems.\n\nThese lists of questions are **not exhaustive**, and we welcome Pull Requests that add significantly valid ones.\n\n**Every time you start a new project Virgilio recommends that you write a document with the questions and answers explored in this guide, so you always have *clear objectives and characteristics* of the project, as well as being able to *share it easily* with others.**\n\n_Do not underestimate this phase at all_, it is perhaps the most important of any project that wants to achieve success!\n\n## Prerequisites\nThe previous Purgatorio's guides.\n\n## Time to complete\n10 minutes.\n\n# Index\n- [Usage](#Usage)\n- [Integration](#Integration)\n- [Conclusions](#Conclusions)\n\nOnce you have decided **what** the project will consist of, what the limits of the system will be and what data it will be based on, it is time to think about *how it will be implemented and integrated* into existing systems. \n\nIn fact, it is extremely rare for a Machine Learning system to stand alone, much more likely it is designed to act together with other systems (not necessarily \"intelligent\", but also more classic as a management system or a mobile application). \n\nIt is vital to understand two things:\n- How the system will be used\n- How the system will be integrated \n\nLet's start with \"how the system will be used\".\n\n### Usage\n\n\nThe questions we have to ask ourselves are:\n\n- **Which characteristics should be preferred?**\n\nAs in any software project, or in general engineering projects, in Data Science projects tradeoffs are extremely common. Depending on the type of requirement that our project has, we should ask ourselves what are its essential characteristics: should the system always remain online? or is it used once in a while? should the system be quick to calculate, or should it be very precise? \n\nIn other words, we need to make sure that the most important features of the system drive its design and time management on the project. For example, an intelligent surveillance camera is important that it detects and recognizes each subject in its frame, so we will give more importance to its accuracy than to its speed of calculation. \n\nOn the contrary, for an autonomous trading system that has to make decisions in the order of milliseconds, to buy or sell goods, it is vital that the predictions of the Machine Learning model are very fast, perhaps at the expense of the accuracy of the forecast.\n\n- **How important is the use of the system by the user (vital, accessory, temporary, perpetual)?**\n\nThis is a question that is often underestimated by those who develop a system: it is taken for granted that the things we do with our hands are always indispensable. But this is not always the case, especially in a world where requirements change rapidly and prediction models deteriorate quickly.\n\nWe should always ask ourselves: is the use of the system vital for the user? For example, if it is the system that decides whether to inject medicines into a patient, of course, it is. In this case, we must spend more energy to make the system robust and constantly monitored, in order to avoid disasters. On the contrary, if my favorite application does not succeed in suggesting the best combination of food and drink, it is certainly a minor problem. \n\nAnother aspect to consider is: will the system be used for a predetermined period of time, or will it be used in a perpetual way? In the first case perhaps it would be better to focus on the development of a well-made application from the beginning, while in the second case you can choose a more incremental approach. \nIn practice, precisely because of the marked experimentation of Data Science, the incremental approach is often recommended.\n\n- **How much will the system be used?**\n\nWhat kind of use does the system have from the point of view of frequency of use? Is it used only once? Or a few times a day? Or thousands of times a second? \n\nBased on the answers we understand what performance our system must have: if it is used one-off, it can also be quite slow in computing, and maybe you can focus on making an extremely precise ML model.\n\nOn the contrary, if you need thousands of predictions per second (or millions), you have to take them into account during the design, and try to create light and fast ML models in data inference.\n\n- **How do I evaluate user feedback (written reports, numerical evaluations, usage statistics)?**\n\nDuring the serving and monitoring phase of the model, in the final part of the project, it is vital to monitor its performance and to ensure that it does not degrade (and more importantly, to ensure that the model is used).\n\nThere are several ways to do this: you can draw up usage statistics, or you can make numerical assessments of the system's performance, or you can ask for written feedback from users, so that you can improve your interaction with the application.\n\nIn any case, these feedbacks are very useful to understand the direction to take to improve the ML models that make predictions, and to ensure that they continue to work on a regular basis.\n\nThese kind of questions help us to define the how the system is used in a real world scenario, which is fundamental in the design choices that will be made during all phases of research and development.\n\n### Integration\n\nNow let's ask ourselves \"how the system will be integrated\".\n\nThese questions are not explored in depth, because the role of the Data Scientist is not to integrate systems, or to make them secure, or to monitor the proper functioning of the hardware side.\n\nHowever, it is useful to have at least one awareness of the challenges that these issues pose during the production of a Machine Learning system. \n\nThe questions to be asked here are the classic ones of systems integration, plus some others:\n\n- **Which systems will integrate with the existing system?**\n- **How is the system served (desktop application, mobile application, API Rest, remote calls)?**\n- **If offered as a service (as is common practice in microservices architectures), where is it hosted (local machine, Cloud provider)?**\n- **If offered as a service, how do I control the usage of the system  (access tokens, usage limits, permissions at various levels)?**\n- **How should the system scale (load balancing, data partitioning, distribution of ML models, parameters)?**\n- **Are there any particular constraints (platform migration, budget constraints, security, privacy considerations and regulation)?**\n- **How much automation can be introduced and at what stages (research, development, deployment)?**\n\nThese are the kind of questions to be answered in order to have a complete picture of the future use and integration of the system. \nIn this guide we have listed the key questions to ask each time you start a new Data Science project. \n\n### Conclusions\n\nIn general it is extremely useful to produce a document summarising all the answers to the questions, so as to provide a clear view of the project as a whole, what are the final objectives and the most important characteristics for the system. \n\nThis list is not exhaustive, and as you get a question in your head you feel free to pull a request to this file. \n\nA Virgilio member will take over your request and enrich this guide with your contribution.\n\nIn the next guide we will see other key questions (more oriented to understand how we want to build the machine learning model that makes predictions) to be asked during the framing phase of the problem, which will help us to develop the project successfully. \n\n--------------------------------------------------\n\nWritten by [_clone95_](https://github.com/clone95)\n"
  },
  {
    "path": "Topics/use-cases.md",
    "content": "\n# Machine Learning Use Cases\n\n# What you will learn \nThe purpose of this guide is to give a high-level overview of the various\ncases of application of ML techniques (and in particular Deep Learning) in the various industries and fields.\n\n## Prerequisites\nIt is recommended to read the guides of Paradiso preceding this one, but it is not necessary.\n\n## Time to complete\n20 minutes.\n\n# Index\n - [The big picture](#The-big-picture)\n - [From research to industry](#From-research-to-industry)\n - [Use cases examples](#Use-cases-examples)\n - [Sinergy with other technological trends](#Sinergy-with-other-technological-trends)\n - [Conclusions](#Conclusions)\n\nLet's dive right in!\n \n### The big picture\nMachine Learning systems and in particular Deep Learning, have made huge evolutionary steps and have improved a lot in the last five years, especially for the large amount of data available but especially for the availability of high-performance infrastructure (CPU and GPU in particular).\n\nIn the field of Artificial Intelligence research, automatic learning has been very successful in recent years, allowing computers to overcome or approach the corresponding human performance in areas ranging from facial recognition to speech and language recognition. Deep learning, on the other hand, allows computers to take a step forward, in particular to solve a series of complex problems.\n\nMost of the [Google services](https://blog.aimultiple.com/ai-is-already-at-the-heart-of-google/) running on your deviced are powered by some Machine Learnig system!\n\nLet's have a look at 3 simple cases:\n\n**First case**: speech-to-text processing of a phone call.\n\nIn this case, what I want to do is to translate an audio call into text. In the past, this was attempted using preset programs, but only the use of IA has allowed for optimal results.\n\nThe service is normally offered by the big players (Google, Microsoft, Amazon etc.) who have trained the model with millions of sentences; they make it available through API, that is through a service. In this case, the company interfaces by providing the audio file and the service responds in real time with a text.\n\nIn this case, the company buys the service it uses.\n\nOnce you have obtained the text on it you can perform several operations: a semantic or lexical analysis, a translation possibly followed by a speech-to-text in order to hear the phone call in another language; these are evolutions that for now we do not go into.\n\n**Second case**: recognition of an object in a photo or video.\n\nIt is only an evolution of the previous service; this time we provide the purchased service with an image, or a video, receiving in response an on/off when an object is recognized or a classification of the object itself; it depends on the compatibility between the trained model and the request that is made.\n\n**Third case**: optimization of inbound calls of a call center\n\nIn the previous cases the trained model belonged to the external supplier; this does not prohibit, however, that the model is instead built internally. More resources would be needed, both in terms of conversations/images available and in terms of specific knowledge.\n\nIn this third case, instead, we hypothesize the internal construction of an artificial intelligence model; the case is much more interesting because it allows the company to maintain the data and the entire process of building the AI internally.\n\nWe must assume that the company in question has at its disposal the history of all the calls received, divided into the individual steps made by the operator; with them we must be able to build a chain of events that have led to a final solution. Technically, these are Markov chains, from the late 19th century mathematician who first studied and codified them.\n\nHaving a large number of these chains at our disposal, we train a model according to IA algorithms; it is necessary to have specific competence at this point to understand which is the most suitable algorithm and the calibration of the parameters necessary to obtain the best result. It is often at this point that the best intentions collapse; it is not enough to feed the data to any model, it is necessary to identify and calibrate the right model.\n\nOnce the model has been trained, it is made available to the call centre; once the call has been received and the first step has been taken, we will probably already have the next step available; after the second step, the probability of 'guessing' the next step will be even higher, and so on, optimising the process.\n\nThis example can be applied to all cases where there is a sequence of events:\n- Actions of a user on the site to predict whether he will buy a product or not\n- Analysis of random movements to predict the next event\n- Fault/defect analysis to recognize the probability of failure from the current operation\n- Analysis of behaviour to predict criminal phenomena (Minority report?)\n\nFrom these examples it can be understood that the AI is a way to process data; there is no limit in the hypothesis of its use, if not in the ability of those who manage the data.\n\n### From research to industry\n\nThe range of possible Machine Learning applications in real businesses **is almost infinite**, starting from the themes of optimization of existing processes up to new revolutionize business models and customer interaction.\n\nHowever, even though papers are published day after day in this field, which discover incredible methods of applying these techniques, they are not always \"ready to use\", and even if it is easy to find the [code](https://paperswithcode.com/) of the paper, it is often not easy to implement them in real solutions, for lack of know-how, or even just awareness of the business.\n\nIt is difficult to keep up with both the state of the art of research and the actual use cases applied by others in the industry.\n\nSo, a very important issue is the close collaboration between research and industry, which becomes more and more important as research accelerates.\n\n[Here's](https://www.slideshare.net/StateofAIReport/state-of-ai-report-2019-151804430) a very good report about the state-of-the-art (SOTA) of Machine Learning and Deep Learning applications an research (up-to-date 2019).\n\nLet's see explore now the use cases more in-depth. \n\n### Use cases examples\n\nAs we argued, it is essential to have a framework of things you can do nowadays with certain tools, and understand if it is convenient in terms of ROI for a company (you manager, I talk to you)\n\nWe here at Virgilio are pleased to tell you that we are in close collaboration with [Firm.ai](https://github.com/firmai), a spectacular OpenSource project that tries to solve the problem of providing an overview of all possible use cases, divided by industry.\n\n[**In this project**](https://github.com/firmai/industry-machine-learning), you can find a wide variety of applied use cases, with code! What an incredible resource!\n\nI recommend, leave a star to the Firm.ai project and follow it, it's a work in progress that will be continuously updated.\n\nDon't you find what you're looking for in the previous link? Try [here](https://appliedai.com/). You can enter the business you are looking for, and also see which companies provide services that might be useful to you!\n\nAs you can see, the space of possibilities is really wide. However, thinking about the possible application of Machine Learning, it would be foolish not to take into account the synergies that they have with other technological trends that are rapidly emerging, and that will certainly revolutionize the industry as we know it. \n\n**Any kind of industry!** \n\n### Sinergy with other technological trends\n\n- There are strong synergies between AI and IoT. Combine AI with an IoT network (e.g.,\nsensors installed in the soil owned by an agricultural enterprise, or wearable worn\nfrom patients, able to collect and send data to the treating physician) means in many cases\ncases multiply the potential of AI exponentially. The size and complexity\nof the information generated by this new network of objects is such that only one\nadvanced AI system will be able to manage it efficiently. This advanced system will be able to\ntake various configurations, both centralized (as in the case of supercomputers\naccessible via the cloud) or distributed (so-called on-device AI, supported by the modern\nedge computing technologies).\n\n- AI and 5G connectivity form a disruptive combination. The 5G, that is the network of fifth\ngeneration, will officially arrive from 2020 and will allow to connect the\nmillions of devices worldwide at high speed and with low latency, opening up\nthe doors to the creation of new application scenarios, hitherto not feasible, on\na single global nervous system in different industrial sectors. 5G networks will be able to\nbe managed through different techniques of machine learning, which translate into\nself-diagnosis, self-configuration, self-optimisation, self-repair, self-protection2\n. AI and 5G put the network at the service of the user thanks to the edge\ncomputing and its intrinsic characteristics of hyper-distributed and hyper-connected computational model.\n\n- With the spread of distributed ledger technologies (of which the blockchain is a case of the\nspecific) and in particular of smart contracts, the role of Artificial Intelligence\nwill become even more relevant. The decentralised nature of these technologies and the\npossibility of validating the data collected by them allows to improve\nThe accuracy of AI systems, as well as to distribute the computing power over multiple nodes,\npotentially reducing the costs and therefore the accessibility of the technology. \n\n- The enabling factor of the AI par excellence is Cloud Computing: it is a\ntechnology that allows you to take advantage, via remote service, of hardware resources and\nsoftware services - such as mass storage for data storage or power of\nAccessory calculation - the use of which is offered as a service by a provider. Solutions\nAI can be maintained on local data centers - even individual servers: this phenomenon is opening the door to hybrid scenarios that allow the use of this\ntechnology even under poor connectivity conditions or other restrictions.\n\nBeing able to combine the understanding of different but interconnected trends is essential to have an overview of the next (already started) industrial revolution. \n\n### Conclusions\n\nIn this guide we have seen what are the possible cases of use of Machine Learning nowadays, and we have proposed various sources of information through which we will remain updated on new applications. \n\nWe would also like to remind you that if you are aware of any use cases not included in these lists, the authors will be more than happy to receive a suggestion and add it.\n\nHave an happy exploration!\n\n----\nWritten by [_clone95_](https://github.com/clone95)\n"
  },
  {
    "path": "content/.vuepress/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2018-present, Yuxi (Evan) You, Virgilio contributors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "content/.vuepress/config.js",
    "content": "module.exports = {\n    title: 'Virgilio',\n    base: \"/Virgilio/\",\n    description: 'Data Science E-Learning',\n  plugins: {\n    'sitemap': {\n      hostname: 'https://virgili0.github.io/Virgilio/'\n    },\n  },\n    themeConfig: {\n        navbar: true,\n        nav: [\n            { text: 'Contribute', link: 'https://github.com/virgili0/Virgilio' }\n        ],\n        sidebar: [\n            ['/', 'What is Virgilio?'],\n            {\n                title: 'Paradiso', // required\n                //path: '/foo/',      // optional, link of the title, which should be an absolute path and must exist\n                collapsable: false, // optional, defaults to true\n                sidebarDepth: 1, // optional, defaults to 1\n                children: [\n                    '/paradiso/demystification-ai-ml-dl',\n                    '/paradiso/what-do-i-need-for-ml',\n                    '/paradiso/do-you-really-need-ml',\n                    '/paradiso/use-cases',\n                    '/paradiso/virgilio-teaching-strategy',\n                    '/paradiso/introduction-to-ml'\n                ]\n            },\n            {\n                title: 'Purgatorio', // required\n                //path: '/foo/',      // optional, link of the title, which should be an absolute path and must exist\n                collapsable: false, // optional, defaults to true\n                sidebarDepth: 1, // optional, defaults to 1\n                children: [{\n                        title: 'Fundamentals', // required\n                        //path: '/foo/',      // optional, link of the title, which should be an absolute path and must exist\n                        collapsable: false, // optional, defaults to true\n                        sidebarDepth: 1, // optional, defaults to 1\n                        children: [\n                            ['/purgatorio/fundamentals/math-fundamentals', 'Mathematics'],\n                            ['/purgatorio/fundamentals/statistics-fundamentals', 'Statistics'],\n                            ['/purgatorio/fundamentals/python-fundamentals', 'Python'],\n                            '/purgatorio/fundamentals/jupyter-notebook',\n                            '/purgatorio/fundamentals/the-data-science-process'\n                        ]\n                    },\n                    {\n                        title: 'Define The Scope and Ask Questions', // required\n                        //path: '/foo/',      // optional, link of the title, which should be an absolute path and must exist\n                        collapsable: false, // optional, defaults to true\n                        sidebarDepth: 1, // optional, defaults to 1\n                        children: [\n                            '/purgatorio/define-the-scope-and-ask-questions/frame-the-problem',\n                            '/purgatorio/define-the-scope-and-ask-questions/usage-and-integration',\n                            '/purgatorio/define-the-scope-and-ask-questions/starting-a-data-project',\n                            '/purgatorio/define-the-scope-and-ask-questions/workspace-setup-and-cloud-computing'\n                        ]\n                    },\n                    {\n                        title: 'Collect and Prepare Data', // required\n                        //path: '/foo/',      // optional, link of the title, which should be an absolute path and must exist\n                        collapsable: false, // optional, defaults to true\n                        sidebarDepth: 1, // optional, defaults to 1\n                        children: [\n                            '/purgatorio/collect-and-prepare-data/data-collection',\n                            '/purgatorio/collect-and-prepare-data/data-preparation',\n                            '/purgatorio/collect-and-prepare-data/data-visualization',\n                        ]\n                    },\n                    {\n                        title: 'Select and Train Machine Learning Models', // required\n                        //path: '/foo/',      // optional, link of the title, which should be an absolute path and must exist\n                        collapsable: false, // optional, defaults to true\n                        sidebarDepth: 1, // optional, defaults to 1\n                        children: [\n                            '/purgatorio/select-and-train-machine-learning-models/machine-learning-theory',\n                            '/purgatorio/select-and-train-machine-learning-models/deep-learning-theory',\n                            '/purgatorio/select-and-train-machine-learning-models/evaluation-and-finetuning',\n                            '/purgatorio/select-and-train-machine-learning-models/tools-and-libraries'\n                        ]\n                    },\n                    {\n                        title: 'Launch and Mantain the System ', // required\n                        //path: '/foo/',      // optional, link of the title, which should be an absolute path and must exist\n                        collapsable: false, // optional, defaults to true\n                        sidebarDepth: 1, // optional, defaults to 1\n                        children: [\n                            '/purgatorio/launch-and-mantain-the-system/serving-trained-models',\n                            '/purgatorio/launch-and-mantain-the-system/monitoring-usage-and-behavior',\n                            '/purgatorio/launch-and-mantain-the-system/automation-and-reproducibility'\n                        ]\n                    },\n                    {\n                        title: 'Now Go Build ', // required\n                        //path: '/foo/',      // optional, link of the title, which should be an absolute path and must exist\n                        collapsable: false, // optional, defaults to true\n                        sidebarDepth: 1, // optional, defaults to 1\n                        children: [\n                            '/purgatorio/now-go-build/a-messy-real-world',\n                            '/purgatorio/now-go-build/transfer-learning',\n                            '/purgatorio/now-go-build/best-practices'\n\n                        ]\n                    },\n                    /*\n                    Define The Scope and Ask Questions \n                    Collect and Prepare Data \n                    Select and Train Machine Learning Models \n          \n                    */\n                ]\n            },\n            {\n             title: 'Inferno', // required\n                //path: '/foo/',      // optional, link of the title, which should be an absolute path and must exist\n                collapsable: false, // optional, defaults to true\n                sidebarDepth: 1, // optional, defaults to 1\n                children: [{\n                    title: 'Welcome to Inferno', // required\n                    //path: '/foo/',      // optional, link of the title, which should be an absolute path and must exist\n                    collapsable: false, // optional, defaults to true\n                    sidebarDepth: 1, // optional, defaults to 1\n                    children: [\n                        ['inferno/welcome-to-inferno/welcome-to-inferno','Welcome to Inferno'],\n                    ]\n            },{\n                    title: 'Time Series', // required\n                    //path: '/foo/',      // optional, link of the title, which should be an absolute path and must exist\n                    collapsable: false, // optional, defaults to true\n                    sidebarDepth: 1, // optional, defaults to 1\n                    children: [\n                        ['inferno/time-series/introduction-to-time-series','Introduction to Time Series'],\n                    ]\n            },\n            {\n                        title: 'Computer Vision', // required\n                        //path: '/foo/',      // optional, link of the title, which should be an absolute path and must exist\n                        collapsable: false, // optional, defaults to true\n                        sidebarDepth: 1, // optional, defaults to 1\n                        children: [\n                            'inferno/computer-vision/introduction-to-computer-vision',\n                            'inferno/computer-vision/object-instance-segmentation',\n                            'inferno/computer-vision/object-tracking',\n                            ['inferno/computer-vision/Object_detection_based_on_Deep_Learning','Object detection based on Deep Learning'],\n                        ]\n                },\n                \n                {\n                        title: 'Soft Skills', // required\n                        //path: '/foo/',      // optional, link of the title, which should be an absolute path and must exist\n                        collapsable: false, // optional, defaults to true\n                        sidebarDepth: 1, // optional, defaults to 1\n                        children: [\n                            'inferno/soft-skills/impactful-presentations'\n                        ]\n                },\n                \n                {\n                        title: 'Tools', // required\n                        //path: '/foo/',      // optional, link of the title, which should be an absolute path and must exist\n                        collapsable: false, // optional, defaults to true\n                        sidebarDepth: 1, // optional, defaults to 1\n                        children: [\n                            'inferno/tools/geo-gebra',\n                            'inferno/tools/latex',\n                            'inferno/tools/regex',\n                            'inferno/tools/wolfram-alpha',\n                        ]\n                },\n                {\n                        title: 'Research', // required\n                        //path: '/foo/',      // optional, link of the title, which should be an absolute path and must exist\n                        collapsable: false, // optional, defaults to true\n                        sidebarDepth: 1, // optional, defaults to 1\n                        children: [\n                            'inferno/research/zotero',\n                            'inferno/research/sota-papers',\n                        ]\n                }]\n            },\n            /*\n            {\n              title: 'Inferno', // required\n              //path: '/foo/',      // optional, link of the title, which should be an absolute path and must exist\n              collapsable: false, // optional, defaults to true\n              sidebarDepth: 1, // optional, defaults to 1\n              children: [\n                '/paradiso/demystification-ai-ml-dl',\n                '/paradiso/what-do-i-need-for-ml',\n                '/paradiso/do-you-really-need-ml',\n                '/paradiso/use-cases',\n                '/paradiso/virgilio-teaching-strategy',\n                '/paradiso/introduction-to-ml'\n              ]\n            },\n            */\n        ]\n    }\n}"
  },
  {
    "path": "content/.vuepress/public/googlece1290fc3980cafc.html",
    "content": "google-site-verification: googlece1290fc3980cafc.html"
  },
  {
    "path": "content/.vuepress/public/vollkorn/SIL Open Font License.txt",
    "content": "This Font Software is licensed under the SIL Open Font License, Version 1.1.\nThis license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL\n\n-----------------------------------------------------------\nSIL OPEN FONT LICENSE Version 1.1 - 26 February 2007\n-----------------------------------------------------------\n\nPREAMBLE\nThe goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others.\n\nThe OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives.\n\nDEFINITIONS\n\"Font Software\" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation.\n\n\"Reserved Font Name\" refers to any names specified as such after the copyright statement(s).\n\n\"Original Version\" refers to the collection of Font Software components as distributed by the Copyright Holder(s).\n\n\"Modified Version\" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment.\n\n\"Author\" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software.\n\nPERMISSION & CONDITIONS\nPermission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions:\n\n1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself.\n\n2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user.\n\n3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users.\n\n4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission.\n\n5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software.\n\nTERMINATION\nThis license becomes null and void if any of the above conditions are not met.\n\nDISCLAIMER\nTHE FONT SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE."
  },
  {
    "path": "content/.vuepress/theme/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2018-present, Yuxi (Evan) You\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "content/.vuepress/theme/components/AlgoliaSearchBox.vue",
    "content": "<template>\n  <form\n    id=\"search-form\"\n    class=\"algolia-search-wrapper search-box\"\n    role=\"search\"\n  >\n    <input\n      id=\"algolia-search-input\"\n      class=\"search-query\"\n      :placeholder=\"placeholder\"\n    >\n  </form>\n</template>\n\n<script>\nexport default {\n  name: 'AlgoliaSearchBox',\n\n  props: ['options'],\n\n  data () {\n    return {\n      placeholder: undefined\n    }\n  },\n\n  watch: {\n    $lang (newValue) {\n      this.update(this.options, newValue)\n    },\n\n    options (newValue) {\n      this.update(newValue, this.$lang)\n    }\n  },\n\n  mounted () {\n    this.initialize(this.options, this.$lang)\n    this.placeholder = this.$site.themeConfig.searchPlaceholder || ''\n  },\n\n  methods: {\n    initialize (userOptions, lang) {\n      Promise.all([\n        import(/* webpackChunkName: \"docsearch\" */ 'docsearch.js/dist/cdn/docsearch.min.js'),\n        import(/* webpackChunkName: \"docsearch\" */ 'docsearch.js/dist/cdn/docsearch.min.css')\n      ]).then(([docsearch]) => {\n        docsearch = docsearch.default\n        const { algoliaOptions = {}} = userOptions\n        docsearch(Object.assign(\n          {},\n          userOptions,\n          {\n            inputSelector: '#algolia-search-input',\n            // #697 Make docsearch work well at i18n mode.\n            algoliaOptions: Object.assign({\n              'facetFilters': [`lang:${lang}`].concat(algoliaOptions.facetFilters || [])\n            }, algoliaOptions),\n            handleSelected: (input, event, suggestion) => {\n              const { pathname, hash } = new URL(suggestion.url)\n              const routepath = pathname.replace(this.$site.base, '/')\n              this.$router.push(`${routepath}${hash}`)\n            }\n          }\n        ))\n      })\n    },\n\n    update (options, lang) {\n      this.$el.innerHTML = '<input id=\"algolia-search-input\" class=\"search-query\">'\n      this.initialize(options, lang)\n    }\n  }\n}\n</script>\n\n<style lang=\"stylus\">\n.algolia-search-wrapper\n  & > span\n    vertical-align middle\n  .algolia-autocomplete\n    line-height normal\n    .ds-dropdown-menu\n      background-color #fff\n      border 1px solid #999\n      border-radius 4px\n      font-size 16px\n      margin 6px 0 0\n      padding 4px\n      text-align left\n      &:before\n        border-color #999\n      [class*=ds-dataset-]\n        border none\n        padding 0\n      .ds-suggestions\n        margin-top 0\n      .ds-suggestion\n        border-bottom 1px solid $borderColor\n    .algolia-docsearch-suggestion--highlight\n      color #2c815b\n    .algolia-docsearch-suggestion\n      border-color $borderColor\n      padding 0\n      .algolia-docsearch-suggestion--category-header\n        padding 5px 10px\n        margin-top 0\n        background $accentColor\n        color #fff\n        font-weight 600\n        .algolia-docsearch-suggestion--highlight\n          background rgba(255, 255, 255, 0.6)\n      .algolia-docsearch-suggestion--wrapper\n        padding 0\n      .algolia-docsearch-suggestion--title\n        font-weight 600\n        margin-bottom 0\n        color $textColor\n      .algolia-docsearch-suggestion--subcategory-column\n        vertical-align top\n        padding 5px 7px 5px 5px\n        border-color $borderColor\n        background #f1f3f5\n        &:after\n          display none\n      .algolia-docsearch-suggestion--subcategory-column-text\n        color #555\n    .algolia-docsearch-footer\n      border-color $borderColor\n    .ds-cursor .algolia-docsearch-suggestion--content\n      background-color #e7edf3 !important\n      color $textColor\n\n@media (min-width: $MQMobile)\n  .algolia-search-wrapper\n    .algolia-autocomplete\n      .algolia-docsearch-suggestion\n        .algolia-docsearch-suggestion--subcategory-column\n          float none\n          width 150px\n          min-width 150px\n          display table-cell\n        .algolia-docsearch-suggestion--content\n          float none\n          display table-cell\n          width 100%\n          vertical-align top\n        .ds-dropdown-menu\n          min-width 515px !important\n\n@media (max-width: $MQMobile)\n  .algolia-search-wrapper\n    .ds-dropdown-menu\n      min-width calc(100vw - 4rem) !important\n      max-width calc(100vw - 4rem) !important\n    .algolia-docsearch-suggestion--wrapper\n      padding 5px 7px 5px 5px !important\n    .algolia-docsearch-suggestion--subcategory-column\n      padding 0 !important\n      background white !important\n    .algolia-docsearch-suggestion--subcategory-column-text:after\n      content \" > \"\n      font-size 10px\n      line-height 14.4px\n      display inline-block\n      width 5px\n      margin -3px 3px 0\n      vertical-align middle\n\n</style>\n"
  },
  {
    "path": "content/.vuepress/theme/components/DropdownLink.vue",
    "content": "<template>\n  <div\n    class=\"dropdown-wrapper\"\n    :class=\"{ open }\"\n  >\n    <button\n      class=\"dropdown-title\"\n      type=\"button\"\n      :aria-label=\"dropdownAriaLabel\"\n      @click=\"setOpen(!open)\"\n    >\n      <span class=\"title\">{{ item.text }}</span>\n      <span\n        class=\"arrow\"\n        :class=\"open ? 'down' : 'right'\"\n      />\n    </button>\n\n    <DropdownTransition>\n      <ul\n        v-show=\"open\"\n        class=\"nav-dropdown\"\n      >\n        <li\n          v-for=\"(subItem, index) in item.items\"\n          :key=\"subItem.link || index\"\n          class=\"dropdown-item\"\n        >\n          <h4 v-if=\"subItem.type === 'links'\">\n            {{ subItem.text }}\n          </h4>\n\n          <ul\n            v-if=\"subItem.type === 'links'\"\n            class=\"dropdown-subitem-wrapper\"\n          >\n            <li\n              v-for=\"childSubItem in subItem.items\"\n              :key=\"childSubItem.link\"\n              class=\"dropdown-subitem\"\n            >\n              <NavLink\n                :item=\"childSubItem\"\n                @focusout=\"\n                  isLastItemOfArray(childSubItem, subItem.items) &&\n                    isLastItemOfArray(subItem, item.items) &&\n                    setOpen(false)\n                \"\n              />\n            </li>\n          </ul>\n\n          <NavLink\n            v-else\n            :item=\"subItem\"\n            @focusout=\"isLastItemOfArray(subItem, item.items) && setOpen(false)\"\n          />\n        </li>\n      </ul>\n    </DropdownTransition>\n  </div>\n</template>\n\n<script>\nimport NavLink from '@theme/components/NavLink.vue'\nimport DropdownTransition from '@theme/components/DropdownTransition.vue'\nimport last from 'lodash/last'\n\nexport default {\n  name: 'DropdownLink',\n\n  components: {\n    NavLink,\n    DropdownTransition\n  },\n\n  props: {\n    item: {\n      required: true\n    }\n  },\n\n  data () {\n    return {\n      open: false\n    }\n  },\n\n  computed: {\n    dropdownAriaLabel () {\n      return this.item.ariaLabel || this.item.text\n    }\n  },\n\n  watch: {\n    $route () {\n      this.open = false\n    }\n  },\n\n  methods: {\n    setOpen (value) {\n      this.open = value\n    },\n\n    isLastItemOfArray (item, array) {\n      return last(array) === item\n    }\n  }\n}\n</script>\n\n<style lang=\"stylus\">\n.dropdown-wrapper\n  cursor pointer\n  .dropdown-title\n    display block\n    font-size 0.9rem\n    font-family inherit\n    cursor inherit\n    padding inherit\n    line-height 1.4rem\n    background transparent\n    border none\n    font-weight 500\n    color $textColor\n    pointer-events none\n    &:hover\n      border-color transparent\n    .arrow\n      vertical-align middle\n      margin-top -1px\n      margin-left 0.4rem\n  .nav-dropdown\n    .dropdown-item\n      color inherit\n      line-height 1.7rem\n      h4\n        margin 0.45rem 0 0\n        border-top 1px solid #eee\n        padding 0.45rem 1.5rem 0 1.25rem\n      .dropdown-subitem-wrapper\n        padding 0\n        list-style none\n        .dropdown-subitem\n          font-size 0.9em\n      a\n        display block\n        line-height 1.7rem\n        position relative\n        border-bottom none\n        font-weight 400\n        margin-bottom 0\n        padding 0 1.5rem 0 1.25rem\n        &:hover\n          color $accentColor\n        &.router-link-active\n          color $accentColor\n          &::after\n            content \"\"\n            width 0\n            height 0\n            border-left 5px solid $accentColor\n            border-top 3px solid transparent\n            border-bottom 3px solid transparent\n            position absolute\n            top calc(50% - 2px)\n            left 9px\n      &:first-child h4\n        margin-top 0\n        padding-top 0\n        border-top 0\n\n@media (max-width: $MQMobile)\n  .dropdown-wrapper\n    &.open .dropdown-title\n      margin-bottom 0.5rem\n    .dropdown-title\n      font-weight 600\n      font-size inherit\n      &:hover\n        color $accentColor\n    .nav-dropdown\n      transition height .1s ease-out\n      overflow hidden\n      .dropdown-item\n        h4\n          border-top 0\n          margin-top 0\n          padding-top 0\n        h4, & > a\n          font-size 15px\n          line-height 2rem\n        .dropdown-subitem\n          font-size 14px\n          padding-left 1rem\n\n@media (min-width: $MQMobile)\n  .dropdown-wrapper\n    height 1.8rem\n    &:hover .nav-dropdown,\n    &.open .nav-dropdown\n      // override the inline style.\n      display block !important\n    &.open:blur\n      display none\n    .dropdown-title .arrow\n      // make the arrow always down at desktop\n      border-left 4px solid transparent\n      border-right 4px solid transparent\n      border-top 6px solid $arrowBgColor\n      border-bottom 0\n    .nav-dropdown\n      display none\n      // Avoid height shaked by clicking\n      height auto !important\n      box-sizing border-box;\n      max-height calc(100vh - 2.7rem)\n      overflow-y auto\n      position absolute\n      top 100%\n      right 0\n      background-color #fff\n      padding 0.6rem 0\n      border 1px solid #ddd\n      border-bottom-color #ccc\n      text-align left\n      border-radius 0.25rem\n      white-space nowrap\n      margin 0\n</style>\n"
  },
  {
    "path": "content/.vuepress/theme/components/DropdownTransition.vue",
    "content": "<template>\n  <transition\n    name=\"dropdown\"\n    @enter=\"setHeight\"\n    @after-enter=\"unsetHeight\"\n    @before-leave=\"setHeight\"\n  >\n    <slot />\n  </transition>\n</template>\n\n<script>\nexport default {\n  name: 'DropdownTransition',\n\n  methods: {\n    setHeight (items) {\n      // explicitly set height so that it can be transitioned\n      items.style.height = items.scrollHeight + 'px'\n    },\n\n    unsetHeight (items) {\n      items.style.height = ''\n    }\n  }\n}\n</script>\n\n<style lang=\"stylus\">\n.dropdown-enter, .dropdown-leave-to\n  height 0 !important\n\n</style>\n"
  },
  {
    "path": "content/.vuepress/theme/components/Home.vue",
    "content": "<template>\n  <main\n    class=\"home\"\n    aria-labelledby=\"main-title\"\n  >\n    <header class=\"hero\">\n      <img\n        v-if=\"data.heroImage\"\n        :src=\"$withBase(data.heroImage)\"\n        :alt=\"data.heroAlt || 'hero'\"\n      >\n\n      <h1\n        v-if=\"data.heroText !== null\"\n        id=\"main-title\"\n      >\n        {{ data.heroText || $title || 'Hello' }}\n      </h1>\n\n      <p\n        v-if=\"data.tagline !== null\"\n        class=\"description\"\n      >\n        {{ data.tagline || $description || 'Welcome to your VuePress site' }}\n      </p>\n\n      <p\n        v-if=\"data.actionText && data.actionLink\"\n        class=\"action\"\n      >\n        <NavLink\n          class=\"action-button\"\n          :item=\"actionLink\"\n        />\n      </p>\n    </header>\n\n    <div\n      v-if=\"data.features && data.features.length\"\n      class=\"features\"\n    >\n      <div\n        v-for=\"(feature, index) in data.features\"\n        :key=\"index\"\n        class=\"feature\"\n      >\n        <h2>{{ feature.title }}</h2>\n        <p>{{ feature.details }}</p>\n      </div>\n    </div>\n\n    <Content class=\"theme-default-content custom\" />\n\n    <div\n      v-if=\"data.footer\"\n      class=\"footer\"\n    >\n      {{ data.footer }}\n    </div>\n  </main>\n</template>\n\n<script>\nimport NavLink from '@theme/components/NavLink.vue'\n\nexport default {\n  name: 'Home',\n\n  components: { NavLink },\n\n  computed: {\n    data () {\n      return this.$page.frontmatter\n    },\n\n    actionLink () {\n      return {\n        link: this.data.actionLink,\n        text: this.data.actionText\n      }\n    }\n  }\n}\n</script>\n\n<style lang=\"stylus\">\n.home\n  padding $navbarHeight 2rem 0\n  max-width $homePageWidth\n  margin 0px auto\n  display block\n  .hero\n    text-align center\n    img\n      max-width: 100%\n      max-height 280px\n      display block\n      margin 3rem auto 1.5rem\n    h1\n      font-size 3rem\n    h1, .description, .action\n      margin 1.8rem auto\n    .description\n      max-width 35rem\n      font-size 1.6rem\n      line-height 1.3\n      color lighten($textColor, 40%)\n    .action-button\n      display inline-block\n      font-size 1.2rem\n      color #fff\n      background-color $accentColor\n      padding 0.8rem 1.6rem\n      border-radius 4px\n      transition background-color .1s ease\n      box-sizing border-box\n      border-bottom 1px solid darken($accentColor, 10%)\n      &:hover\n        background-color lighten($accentColor, 10%)\n  .features\n    border-top 1px solid $borderColor\n    padding 1.2rem 0\n    margin-top 2.5rem\n    display flex\n    flex-wrap wrap\n    align-items flex-start\n    align-content stretch\n    justify-content space-between\n  .feature\n    flex-grow 1\n    flex-basis 30%\n    max-width 30%\n    h2\n      font-size 1.4rem\n      font-weight 500\n      border-bottom none\n      padding-bottom 0\n      color lighten($textColor, 10%)\n    p\n      color lighten($textColor, 25%)\n  .footer\n    padding 2.5rem\n    border-top 1px solid $borderColor\n    text-align center\n    color lighten($textColor, 25%)\n\n@media (max-width: $MQMobile)\n  .home\n    .features\n      flex-direction column\n    .feature\n      max-width 100%\n      padding 0 2.5rem\n\n@media (max-width: $MQMobileNarrow)\n  .home\n    padding-left 1.5rem\n    padding-right 1.5rem\n    .hero\n      img\n        max-height 210px\n        margin 2rem auto 1.2rem\n      h1\n        font-size 2rem\n      h1, .description, .action\n        margin 1.2rem auto\n      .description\n        font-size 1.2rem\n      .action-button\n        font-size 1rem\n        padding 0.6rem 1.2rem\n    .feature\n      h2\n        font-size 1.25rem\n</style>\n"
  },
  {
    "path": "content/.vuepress/theme/components/NavLink.vue",
    "content": "<template>\n  <RouterLink\n    v-if=\"isInternal\"\n    class=\"nav-link\"\n    :to=\"link\"\n    :exact=\"exact\"\n    @focusout.native=\"focusoutAction\"\n  >\n    {{ item.text }}\n  </RouterLink>\n  <a\n    v-else\n    :href=\"link\"\n    class=\"nav-link external\"\n    :target=\"target\"\n    :rel=\"rel\"\n    @focusout=\"focusoutAction\"\n  >\n    {{ item.text }}\n    <OutboundLink v-if=\"isBlankTarget\" />\n  </a>\n</template>\n\n<script>\nimport { isExternal, isMailto, isTel, ensureExt } from '../util'\n\nexport default {\n  name: 'NavLink',\n\n  props: {\n    item: {\n      required: true\n    }\n  },\n\n  computed: {\n    link () {\n      return ensureExt(this.item.link)\n    },\n\n    exact () {\n      if (this.$site.locales) {\n        return Object.keys(this.$site.locales).some(rootLink => rootLink === this.link)\n      }\n      return this.link === '/'\n    },\n\n    isNonHttpURI () {\n      return isMailto(this.link) || isTel(this.link)\n    },\n\n    isBlankTarget () {\n      return this.target === '_blank'\n    },\n\n    isInternal () {\n      return !isExternal(this.link) && !this.isBlankTarget\n    },\n\n    target () {\n      if (this.isNonHttpURI) {\n        return null\n      }\n      if (this.item.target) {\n        return this.item.target\n      }\n      return isExternal(this.link) ? '_blank' : ''\n    },\n\n    rel () {\n      if (this.isNonHttpURI) {\n        return null\n      }\n      if (this.item.rel) {\n        return this.item.rel\n      }\n      return this.isBlankTarget ? 'noopener noreferrer' : ''\n    }\n  },\n\n  methods: {\n    focusoutAction () {\n      this.$emit('focusout')\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "content/.vuepress/theme/components/NavLinks.vue",
    "content": "<template>\n  <nav\n    v-if=\"userLinks.length || repoLink\"\n    class=\"nav-links\"\n  >\n    <!-- user links -->\n    <div\n      v-for=\"item in userLinks\"\n      :key=\"item.link\"\n      class=\"nav-item\"\n    >\n      <DropdownLink\n        v-if=\"item.type === 'links'\"\n        :item=\"item\"\n      />\n      <NavLink\n        v-else\n        :item=\"item\"\n      />\n    </div>\n\n    <!-- repo link -->\n    <a\n      v-if=\"repoLink\"\n      :href=\"repoLink\"\n      class=\"repo-link\"\n      target=\"_blank\"\n      rel=\"noopener noreferrer\"\n    >\n      {{ repoLabel }}\n      <OutboundLink />\n    </a>\n  </nav>\n</template>\n\n<script>\nimport DropdownLink from '@theme/components/DropdownLink.vue'\nimport { resolveNavLinkItem } from '../util'\nimport NavLink from '@theme/components/NavLink.vue'\n\nexport default {\n  name: 'NavLinks',\n\n  components: {\n    NavLink,\n    DropdownLink\n  },\n\n  computed: {\n    userNav () {\n      return this.$themeLocaleConfig.nav || this.$site.themeConfig.nav || []\n    },\n\n    nav () {\n      const { locales } = this.$site\n      if (locales && Object.keys(locales).length > 1) {\n        const currentLink = this.$page.path\n        const routes = this.$router.options.routes\n        const themeLocales = this.$site.themeConfig.locales || {}\n        const languageDropdown = {\n          text: this.$themeLocaleConfig.selectText || 'Languages',\n          ariaLabel: this.$themeLocaleConfig.ariaLabel || 'Select language',\n          items: Object.keys(locales).map(path => {\n            const locale = locales[path]\n            const text = themeLocales[path] && themeLocales[path].label || locale.lang\n            let link\n            // Stay on the current page\n            if (locale.lang === this.$lang) {\n              link = currentLink\n            } else {\n              // Try to stay on the same page\n              link = currentLink.replace(this.$localeConfig.path, path)\n              // fallback to homepage\n              if (!routes.some(route => route.path === link)) {\n                link = path\n              }\n            }\n            return { text, link }\n          })\n        }\n        return [...this.userNav, languageDropdown]\n      }\n      return this.userNav\n    },\n\n    userLinks () {\n      return (this.nav || []).map(link => {\n        return Object.assign(resolveNavLinkItem(link), {\n          items: (link.items || []).map(resolveNavLinkItem)\n        })\n      })\n    },\n\n    repoLink () {\n      const { repo } = this.$site.themeConfig\n      if (repo) {\n        return /^https?:/.test(repo)\n          ? repo\n          : `https://github.com/${repo}`\n      }\n      return null\n    },\n\n    repoLabel () {\n      if (!this.repoLink) return\n      if (this.$site.themeConfig.repoLabel) {\n        return this.$site.themeConfig.repoLabel\n      }\n\n      const repoHost = this.repoLink.match(/^https?:\\/\\/[^/]+/)[0]\n      const platforms = ['GitHub', 'GitLab', 'Bitbucket']\n      for (let i = 0; i < platforms.length; i++) {\n        const platform = platforms[i]\n        if (new RegExp(platform, 'i').test(repoHost)) {\n          return platform\n        }\n      }\n\n      return 'Source'\n    }\n  }\n}\n</script>\n\n<style lang=\"stylus\">\n.nav-links\n  display inline-block\n  a\n    line-height 1.4rem\n    color inherit\n    &:hover, &.router-link-active\n      color $accentColor\n  .nav-item\n    position relative\n    display inline-block\n    margin-left 1.5rem\n    line-height 2rem\n    &:first-child\n      margin-left 0\n  .repo-link\n    margin-left 1.5rem\n\n@media (max-width: $MQMobile)\n  .nav-links\n    .nav-item, .repo-link\n      margin-left 0\n\n@media (min-width: $MQMobile)\n  .nav-links a\n    &:hover, &.router-link-active\n      color $textColor\n  .nav-item > a:not(.external)\n    &:hover, &.router-link-active\n      margin-bottom -2px\n      border-bottom 2px solid lighten($accentColor, 8%)\n</style>\n"
  },
  {
    "path": "content/.vuepress/theme/components/Navbar.vue",
    "content": "<template>\n  <header class=\"navbar\">\n    <SidebarButton @toggle-sidebar=\"$emit('toggle-sidebar')\" />\n\n    <RouterLink\n      :to=\"$localePath\"\n      class=\"home-link\"\n    >\n      <img\n        v-if=\"$site.themeConfig.logo\"\n        class=\"logo\"\n        :src=\"$withBase($site.themeConfig.logo)\"\n        :alt=\"$siteTitle\"\n      >\n      <span\n        v-if=\"$siteTitle\"\n        ref=\"siteName\"\n        class=\"site-name\"\n        :class=\"{ 'can-hide': $site.themeConfig.logo }\"\n      >{{ $siteTitle }} <span class=\"site-name2\"> Data Science </span> </span>\n    </RouterLink>\n\n    <div\n      class=\"links\"\n      :style=\"linksWrapMaxWidth ? {\n        'max-width': linksWrapMaxWidth + 'px'\n      } : {}\"\n    >\n      <AlgoliaSearchBox\n        v-if=\"isAlgoliaSearch\"\n        :options=\"algolia\"\n      />\n      <SearchBox v-else-if=\"$site.themeConfig.search !== false && $page.frontmatter.search !== false\" />\n      <NavLinks class=\"can-hide\" />\n    </div>\n  </header>\n</template>\n\n<script>\nimport AlgoliaSearchBox from '@AlgoliaSearchBox'\nimport SearchBox from '@SearchBox'\nimport SidebarButton from '@theme/components/SidebarButton.vue'\nimport NavLinks from '@theme/components/NavLinks.vue'\n\nexport default {\n  name: 'Navbar',\n\n  components: {\n    SidebarButton,\n    NavLinks,\n    SearchBox,\n    AlgoliaSearchBox\n  },\n\n  data () {\n    return {\n      linksWrapMaxWidth: null\n    }\n  },\n\n  computed: {\n    algolia () {\n      return this.$themeLocaleConfig.algolia || this.$site.themeConfig.algolia || {}\n    },\n\n    isAlgoliaSearch () {\n      return this.algolia && this.algolia.apiKey && this.algolia.indexName\n    }\n  },\n\n  mounted () {\n    const MOBILE_DESKTOP_BREAKPOINT = 719 // refer to config.styl\n    const NAVBAR_VERTICAL_PADDING = parseInt(css(this.$el, 'paddingLeft')) + parseInt(css(this.$el, 'paddingRight'))\n    const handleLinksWrapWidth = () => {\n      if (document.documentElement.clientWidth < MOBILE_DESKTOP_BREAKPOINT) {\n        this.linksWrapMaxWidth = null\n      } else {\n        this.linksWrapMaxWidth = this.$el.offsetWidth - NAVBAR_VERTICAL_PADDING\n          - (this.$refs.siteName && this.$refs.siteName.offsetWidth || 0)\n      }\n    }\n    handleLinksWrapWidth()\n    window.addEventListener('resize', handleLinksWrapWidth, false)\n  }\n}\n\nfunction css (el, property) {\n  // NOTE: Known bug, will return 'auto' if style value is 'auto'\n  const win = el.ownerDocument.defaultView\n  // null means not to return pseudo styles\n  return win.getComputedStyle(el, null)[property]\n}\n</script>\n\n<style lang=\"stylus\">\n$navbar-vertical-padding = 0.7rem\n$navbar-horizontal-padding = 1.5rem\n\n.navbar\n  padding $navbar-vertical-padding $navbar-horizontal-padding\n  line-height $navbarHeight - 1.4rem\n  a, span, img\n    display inline-block\n  .logo\n    height $navbarHeight - 1.4rem\n    min-width $navbarHeight - 1.4rem\n    margin-right 0.8rem\n    vertical-align top\n  .site-name\n    font-size 1.3rem\n    font-weight 600\n    color $textColor\n    position relative\n  .links\n    padding-left 1.5rem\n    box-sizing border-box\n    background-color white\n    white-space nowrap\n    font-size 0.9rem\n    position absolute\n    right $navbar-horizontal-padding\n    top $navbar-vertical-padding\n    display flex\n    .search-box\n      flex: 0 0 auto\n      vertical-align top\n\n@media (max-width: $MQMobile)\n  .navbar\n    padding-left 4rem\n    .can-hide\n      display none\n    .links\n      padding-left 1.5rem\n    .site-name\n      width calc(100vw - 9.4rem)\n      overflow hidden\n      white-space nowrap\n      text-overflow ellipsis\n</style>\n"
  },
  {
    "path": "content/.vuepress/theme/components/Page.vue",
    "content": "<template>\n  <main class=\"page\">\n    <slot name=\"top\" />\n\n    <Content class=\"theme-default-content\" />\n    <PageEdit />\n\n    <PageNav v-bind=\"{ sidebarItems }\" />\n\n    <slot name=\"bottom\" />\n  </main>\n</template>\n\n<script>\nimport PageEdit from '@theme/components/PageEdit.vue'\nimport PageNav from '@theme/components/PageNav.vue'\n\nexport default {\n  components: { PageEdit, PageNav },\n  props: ['sidebarItems']\n}\n</script>\n\n<style lang=\"stylus\">\n@require '../styles/wrapper.styl'\n\n.page\n  padding-bottom 2rem\n  display block\n\n</style>\n"
  },
  {
    "path": "content/.vuepress/theme/components/PageEdit.vue",
    "content": "<template>\n  <footer class=\"page-edit\">\n    <div\n      v-if=\"editLink\"\n      class=\"edit-link\"\n    >\n      <a\n        :href=\"editLink\"\n        target=\"_blank\"\n        rel=\"noopener noreferrer\"\n      >{{ editLinkText }}</a>\n      <OutboundLink />\n    </div>\n\n    <div\n      v-if=\"lastUpdated\"\n      class=\"last-updated\"\n    >\n      <span class=\"prefix\">{{ lastUpdatedText }}:</span>\n      <span class=\"time\">{{ lastUpdated }}</span>\n    </div>\n  </footer>\n</template>\n\n<script>\nimport isNil from 'lodash/isNil'\nimport { endingSlashRE, outboundRE } from '../util'\n\nexport default {\n  name: 'PageEdit',\n\n  computed: {\n    lastUpdated () {\n      return this.$page.lastUpdated\n    },\n\n    lastUpdatedText () {\n      if (typeof this.$themeLocaleConfig.lastUpdated === 'string') {\n        return this.$themeLocaleConfig.lastUpdated\n      }\n      if (typeof this.$site.themeConfig.lastUpdated === 'string') {\n        return this.$site.themeConfig.lastUpdated\n      }\n      return 'Last Updated'\n    },\n\n    editLink () {\n      const showEditLink = isNil(this.$page.frontmatter.editLink)\n        ? this.$site.themeConfig.editLinks\n        : this.$page.frontmatter.editLink\n\n      const {\n        repo,\n        docsDir = '',\n        docsBranch = 'master',\n        docsRepo = repo\n      } = this.$site.themeConfig\n\n      if (showEditLink && docsRepo && this.$page.relativePath) {\n        return this.createEditLink(\n          repo,\n          docsRepo,\n          docsDir,\n          docsBranch,\n          this.$page.relativePath\n        )\n      }\n      return null\n    },\n\n    editLinkText () {\n      return (\n        this.$themeLocaleConfig.editLinkText\n        || this.$site.themeConfig.editLinkText\n        || `Edit this page`\n      )\n    }\n  },\n\n  methods: {\n    createEditLink (repo, docsRepo, docsDir, docsBranch, path) {\n      const bitbucket = /bitbucket.org/\n      if (bitbucket.test(repo)) {\n        const base = outboundRE.test(docsRepo) ? docsRepo : repo\n        return (\n          base.replace(endingSlashRE, '')\n          + `/src`\n          + `/${docsBranch}/`\n          + (docsDir ? docsDir.replace(endingSlashRE, '') + '/' : '')\n          + path\n          + `?mode=edit&spa=0&at=${docsBranch}&fileviewer=file-view-default`\n        )\n      }\n\n      const base = outboundRE.test(docsRepo)\n        ? docsRepo\n        : `https://github.com/${docsRepo}`\n      return (\n        base.replace(endingSlashRE, '')\n        + `/edit`\n        + `/${docsBranch}/`\n        + (docsDir ? docsDir.replace(endingSlashRE, '') + '/' : '')\n        + path\n      )\n    }\n  }\n}\n</script>\n\n<style lang=\"stylus\">\n@require '../styles/wrapper.styl'\n\n.page-edit\n  @extend $wrapper\n  padding-top 1rem\n  padding-bottom 1rem\n  overflow auto\n\n  .edit-link\n    display inline-block\n    a\n      color lighten($textColor, 25%)\n      margin-right 0.25rem\n  .last-updated\n    float right\n    font-size 0.9em\n    .prefix\n      font-weight 500\n      color lighten($textColor, 25%)\n    .time\n      font-weight 400\n      color #aaa\n\n@media (max-width: $MQMobile)\n  .page-edit\n    .edit-link\n      margin-bottom 0.5rem\n    .last-updated\n      font-size 0.8em\n      float none\n      text-align left\n\n</style>\n"
  },
  {
    "path": "content/.vuepress/theme/components/PageNav.vue",
    "content": "<template>\n  <div\n    v-if=\"prev || next\"\n    class=\"page-nav\"\n  >\n    <p class=\"inner\">\n      <span\n        v-if=\"prev\"\n        class=\"prev\"\n      >\n        ←\n        <a\n          v-if=\"prev.type === 'external'\"\n          class=\"prev\"\n          :href=\"prev.path\"\n          target=\"_blank\"\n          rel=\"noopener noreferrer\"\n        >\n          {{ prev.title || prev.path }}\n\n          <OutboundLink />\n        </a>\n\n        <RouterLink\n          v-else\n          class=\"prev\"\n          :to=\"prev.path\"\n        >\n          {{ prev.title || prev.path }}\n        </RouterLink>\n      </span>\n\n      <span\n        v-if=\"next\"\n        class=\"next\"\n      >\n        <a\n          v-if=\"next.type === 'external'\"\n          :href=\"next.path\"\n          target=\"_blank\"\n          rel=\"noopener noreferrer\"\n        >\n          {{ next.title || next.path }}\n\n          <OutboundLink />\n        </a>\n\n        <RouterLink\n          v-else\n          :to=\"next.path\"\n        >\n          {{ next.title || next.path }}\n        </RouterLink>\n        →\n      </span>\n    </p>\n  </div>\n</template>\n\n<script>\nimport { resolvePage } from '../util'\nimport isString from 'lodash/isString'\nimport isNil from 'lodash/isNil'\n\nexport default {\n  name: 'PageNav',\n\n  props: ['sidebarItems'],\n\n  computed: {\n    prev () {\n      return resolvePageLink(LINK_TYPES.PREV, this)\n    },\n\n    next () {\n      return resolvePageLink(LINK_TYPES.NEXT, this)\n    }\n  }\n}\n\nfunction resolvePrev (page, items) {\n  return find(page, items, -1)\n}\n\nfunction resolveNext (page, items) {\n  return find(page, items, 1)\n}\n\nconst LINK_TYPES = {\n  NEXT: {\n    resolveLink: resolveNext,\n    getThemeLinkConfig: ({ nextLinks }) => nextLinks,\n    getPageLinkConfig: ({ frontmatter }) => frontmatter.next\n  },\n  PREV: {\n    resolveLink: resolvePrev,\n    getThemeLinkConfig: ({ prevLinks }) => prevLinks,\n    getPageLinkConfig: ({ frontmatter }) => frontmatter.prev\n  }\n}\n\nfunction resolvePageLink (\n  linkType,\n  { $themeConfig, $page, $route, $site, sidebarItems }\n) {\n  const { resolveLink, getThemeLinkConfig, getPageLinkConfig } = linkType\n\n  // Get link config from theme\n  const themeLinkConfig = getThemeLinkConfig($themeConfig)\n\n  // Get link config from current page\n  const pageLinkConfig = getPageLinkConfig($page)\n\n  // Page link config will overwrite global theme link config if defined\n  const link = isNil(pageLinkConfig) ? themeLinkConfig : pageLinkConfig\n\n  if (link === false) {\n    return\n  } else if (isString(link)) {\n    return resolvePage($site.pages, link, $route.path)\n  } else {\n    return resolveLink($page, sidebarItems)\n  }\n}\n\nfunction find (page, items, offset) {\n  const res = []\n  flatten(items, res)\n  for (let i = 0; i < res.length; i++) {\n    const cur = res[i]\n    if (cur.type === 'page' && cur.path === decodeURIComponent(page.path)) {\n      return res[i + offset]\n    }\n  }\n}\n\nfunction flatten (items, res) {\n  for (let i = 0, l = items.length; i < l; i++) {\n    if (items[i].type === 'group') {\n      flatten(items[i].children || [], res)\n    } else {\n      res.push(items[i])\n    }\n  }\n}\n</script>\n\n<style lang=\"stylus\">\n@require '../styles/wrapper.styl'\n\n.page-nav\n  @extend $wrapper\n  padding-top 1rem\n  padding-bottom 0\n  .inner\n    min-height 2rem\n    margin-top 0\n    border-top 1px solid $borderColor\n    padding-top 1rem\n    overflow auto // clear float\n  .next\n    float right\n</style>\n"
  },
  {
    "path": "content/.vuepress/theme/components/Sidebar.vue",
    "content": "<template>\n  <aside class=\"sidebar\">\n    <NavLinks />\n\n    <slot name=\"top\" />\n\n    <SidebarLinks\n      :depth=\"0\"\n      :items=\"items\"\n    />\n    <slot name=\"bottom\" />\n  </aside>\n</template>\n\n<script>\nimport SidebarLinks from '@theme/components/SidebarLinks.vue'\nimport NavLinks from '@theme/components/NavLinks.vue'\n\nexport default {\n  name: 'Sidebar',\n\n  components: { SidebarLinks, NavLinks },\n\n  props: ['items']\n}\n</script>\n\n<style lang=\"stylus\">\n.sidebar\n  ul\n    padding 0\n    margin 0\n    list-style-type none\n  a\n    display inline-block\n  .nav-links\n    display none\n    border-bottom 1px solid $borderColor\n    padding 0.5rem 0 0.75rem 0\n    a\n      font-weight 600\n    .nav-item, .repo-link\n      display block\n      line-height 1.25rem\n      font-size 1.1em\n      padding 0.5rem 0 0.5rem 1.5rem\n  & > .sidebar-links\n    padding 1.5rem 0\n    & > li > a.sidebar-link\n      font-size 1.1em\n      line-height 1.7\n      font-weight bold\n    & > li:not(:first-child)\n      margin-top .75rem\n\n@media (max-width: $MQMobile)\n  .sidebar\n    .nav-links\n      display block\n      .dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active::after\n        top calc(1rem - 2px)\n    & > .sidebar-links\n      padding 1rem 0\n</style>\n"
  },
  {
    "path": "content/.vuepress/theme/components/SidebarButton.vue",
    "content": "<template>\n  <div\n    class=\"sidebar-button\"\n    @click=\"$emit('toggle-sidebar')\"\n  >\n    <svg\n      class=\"icon\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      aria-hidden=\"true\"\n      role=\"img\"\n      viewBox=\"0 0 448 512\"\n    >\n      <path\n        fill=\"currentColor\"\n        d=\"M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z\"\n        class=\"\"\n      />\n    </svg>\n  </div>\n</template>\n\n<style lang=\"stylus\">\n.sidebar-button\n  cursor pointer\n  display none\n  width 1.25rem\n  height 1.25rem\n  position absolute\n  padding 0.6rem\n  top 0.6rem\n  left 1rem\n  .icon\n    display block\n    width 1.25rem\n    height 1.25rem\n\n@media (max-width: $MQMobile)\n  .sidebar-button\n    display block\n</style>\n"
  },
  {
    "path": "content/.vuepress/theme/components/SidebarGroup.vue",
    "content": "<template>\n  <section\n    class=\"sidebar-group\"\n    :class=\"[\n      {\n        collapsable,\n        'is-sub-group': depth !== 0\n      },\n      `depth-${depth}`\n    ]\"\n  >\n    <RouterLink\n      v-if=\"item.path\"\n      class=\"sidebar-heading clickable\"\n      :class=\"{\n        open,\n        'active': isActive($route, item.path)\n      }\"\n      :to=\"item.path\"\n      @click.native=\"$emit('toggle')\"\n    >\n      <span>{{ item.title }}</span>\n      <span\n        v-if=\"collapsable\"\n        class=\"arrow\"\n        :class=\"open ? 'down' : 'right'\"\n      />\n    </RouterLink>\n\n    <p\n      v-else\n      class=\"sidebar-heading\"\n      :class=\"{ open }\"\n      @click=\"$emit('toggle')\"\n    >\n      <span>{{ item.title }}</span>\n      <span\n        v-if=\"collapsable\"\n        class=\"arrow\"\n        :class=\"open ? 'down' : 'right'\"\n      />\n    </p>\n\n    <DropdownTransition>\n      <SidebarLinks\n        v-if=\"open || !collapsable\"\n        class=\"sidebar-group-items\"\n        :items=\"item.children\"\n        :sidebar-depth=\"item.sidebarDepth\"\n        :depth=\"depth + 1\"\n      />\n    </DropdownTransition>\n  </section>\n</template>\n\n<script>\nimport { isActive } from '../util'\nimport DropdownTransition from '@theme/components/DropdownTransition.vue'\n\nexport default {\n  name: 'SidebarGroup',\n\n  components: {\n    DropdownTransition\n  },\n\n  props: [\n    'item',\n    'open',\n    'collapsable',\n    'depth'\n  ],\n\n  // ref: https://vuejs.org/v2/guide/components-edge-cases.html#Circular-References-Between-Components\n  beforeCreate () {\n    this.$options.components.SidebarLinks = require('@theme/components/SidebarLinks.vue').default\n  },\n\n  methods: { isActive }\n}\n</script>\n\n<style lang=\"stylus\">\n.sidebar-group\n  .sidebar-group\n    padding-left 0.5em\n  &:not(.collapsable)\n    .sidebar-heading:not(.clickable)\n      cursor auto\n      color inherit\n  // refine styles of nested sidebar groups\n  &.is-sub-group\n    padding-left 0\n    & > .sidebar-heading\n      font-size 0.95em\n      line-height 1.4\n      font-weight normal\n      padding-left 2rem\n      &:not(.clickable)\n        opacity 0.5\n    & > .sidebar-group-items\n      padding-left 1rem\n      & > li > .sidebar-link\n        font-size: 0.95em;\n        border-left none\n  &.depth-2\n    & > .sidebar-heading\n      border-left none\n\n.sidebar-heading\n  color $textColor\n  transition color .15s ease\n  cursor pointer\n  font-size 1.1em\n  font-weight bold\n  // text-transform uppercase\n  padding 0.35rem 1.5rem 0.35rem 1.25rem\n  width 100%\n  box-sizing border-box\n  margin 0\n  border-left 0.25rem solid transparent\n  &.open, &:hover\n    color inherit\n  .arrow\n    position relative\n    top -0.12em\n    left 0.5em\n  &.clickable\n    &.active\n      font-weight 600\n      color $accentColor\n      border-left-color $accentColor\n    &:hover\n      color $accentColor\n\n.sidebar-group-items\n  transition height .1s ease-out\n  font-size 0.95em\n  overflow hidden\n</style>\n"
  },
  {
    "path": "content/.vuepress/theme/components/SidebarLink.vue",
    "content": "<script>\nimport { isActive, hashRE, groupHeaders } from '../util'\n\nexport default {\n  functional: true,\n\n  props: ['item', 'sidebarDepth'],\n\n  render (h,\n    {\n      parent: {\n        $page,\n        $site,\n        $route,\n        $themeConfig,\n        $themeLocaleConfig\n      },\n      props: {\n        item,\n        sidebarDepth\n      }\n    }) {\n    // use custom active class matching logic\n    // due to edge case of paths ending with / + hash\n    const selfActive = isActive($route, item.path)\n    // for sidebar: auto pages, a hash link should be active if one of its child\n    // matches\n    const active = item.type === 'auto'\n      ? selfActive || item.children.some(c => isActive($route, item.basePath + '#' + c.slug))\n      : selfActive\n    const link = item.type === 'external'\n      ? renderExternal(h, item.path, item.title || item.path)\n      : renderLink(h, item.path, item.title || item.path, active)\n\n    const maxDepth = [\n      $page.frontmatter.sidebarDepth,\n      sidebarDepth,\n      $themeLocaleConfig.sidebarDepth,\n      $themeConfig.sidebarDepth,\n      1\n    ].find(depth => depth !== undefined)\n\n    const displayAllHeaders = $themeLocaleConfig.displayAllHeaders\n      || $themeConfig.displayAllHeaders\n\n    if (item.type === 'auto') {\n      return [link, renderChildren(h, item.children, item.basePath, $route, maxDepth)]\n    } else if ((active || displayAllHeaders) && item.headers && !hashRE.test(item.path)) {\n      const children = groupHeaders(item.headers)\n      return [link, renderChildren(h, children, item.path, $route, maxDepth)]\n    } else {\n      return link\n    }\n  }\n}\n\nfunction renderLink (h, to, text, active, level) {\n  const component = {\n    props: {\n      to,\n      activeClass: '',\n      exactActiveClass: ''\n    },\n    class: {\n      active,\n      'sidebar-link': true\n    }\n  }\n\n  if (level > 2) {\n    component.style = {\n      'padding-left': level + 'rem'\n    }\n  }\n\n  return h('RouterLink', component, text)\n}\n\nfunction renderChildren (h, children, path, route, maxDepth, depth = 1) {\n  if (!children || depth > maxDepth) return null\n  return h('ul', { class: 'sidebar-sub-headers' }, children.map(c => {\n    const active = isActive(route, path + '#' + c.slug)\n    return h('li', { class: 'sidebar-sub-header' }, [\n      renderLink(h, path + '#' + c.slug, c.title, active, c.level - 1),\n      renderChildren(h, c.children, path, route, maxDepth, depth + 1)\n    ])\n  }))\n}\n\nfunction renderExternal (h, to, text) {\n  return h('a', {\n    attrs: {\n      href: to,\n      target: '_blank',\n      rel: 'noopener noreferrer'\n    },\n    class: {\n      'sidebar-link': true\n    }\n  }, [text, h('OutboundLink')])\n}\n</script>\n\n<style lang=\"stylus\">\n.sidebar .sidebar-sub-headers\n  padding-left 1rem\n  font-size 0.95em\n\na.sidebar-link\n  font-size 1em\n  font-weight 400\n  display inline-block\n  color $textColor\n  border-left 0.25rem solid transparent\n  padding 0.35rem 1rem 0.35rem 1.25rem\n  line-height 1.4\n  width: 100%\n  box-sizing: border-box\n  &:hover\n    color $accentColor\n  &.active\n    font-weight 600\n    color $accentColor\n    border-left-color $accentColor\n  .sidebar-group &\n    padding-left 2rem\n  .sidebar-sub-headers &\n    padding-top 0.25rem\n    padding-bottom 0.25rem\n    border-left none\n    &.active\n      font-weight 500\n</style>\n"
  },
  {
    "path": "content/.vuepress/theme/components/SidebarLinks.vue",
    "content": "<template>\n  <ul\n    v-if=\"items.length\"\n    class=\"sidebar-links\"\n  >\n    <li\n      v-for=\"(item, i) in items\"\n      :key=\"i\"\n    >\n      <SidebarGroup\n        v-if=\"item.type === 'group'\"\n        :item=\"item\"\n        :open=\"i === openGroupIndex\"\n        :collapsable=\"item.collapsable || item.collapsible\"\n        :depth=\"depth\"\n        @toggle=\"toggleGroup(i)\"\n      />\n      <SidebarLink\n        v-else\n        :sidebar-depth=\"sidebarDepth\"\n        :item=\"item\"\n      />\n    </li>\n  </ul>\n</template>\n\n<script>\nimport SidebarGroup from '@theme/components/SidebarGroup.vue'\nimport SidebarLink from '@theme/components/SidebarLink.vue'\nimport { isActive } from '../util'\n\nexport default {\n  name: 'SidebarLinks',\n\n  components: { SidebarGroup, SidebarLink },\n\n  props: [\n    'items',\n    'depth',  // depth of current sidebar links\n    'sidebarDepth' // depth of headers to be extracted\n  ],\n\n  data () {\n    return {\n      openGroupIndex: 0\n    }\n  },\n\n  watch: {\n    '$route' () {\n      this.refreshIndex()\n    }\n  },\n\n  created () {\n    this.refreshIndex()\n  },\n\n  methods: {\n    refreshIndex () {\n      const index = resolveOpenGroupIndex(\n        this.$route,\n        this.items\n      )\n      if (index > -1) {\n        this.openGroupIndex = index\n      }\n    },\n\n    toggleGroup (index) {\n      this.openGroupIndex = index === this.openGroupIndex ? -1 : index\n    },\n\n    isActive (page) {\n      return isActive(this.$route, page.regularPath)\n    }\n  }\n}\n\nfunction resolveOpenGroupIndex (route, items) {\n  for (let i = 0; i < items.length; i++) {\n    const item = items[i]\n    if (descendantIsActive(route, item)) {\n      return i\n    }\n  }\n  return -1\n}\n\nfunction descendantIsActive (route, item) {\n  if (item.type === 'group') {\n    return item.children.some(child => {\n      if (child.type === 'group') {\n        return descendantIsActive(route, child)\n      } else {\n        return child.type === 'page' && isActive(route, child.path)\n      }\n    })\n  }\n  return false\n}\n</script>\n"
  },
  {
    "path": "content/.vuepress/theme/global-components/Badge.vue",
    "content": "<script>\nexport default {\n  functional: true,\n  props: {\n    type: {\n      type: String,\n      default: 'tip'\n    },\n    text: String,\n    vertical: {\n      type: String,\n      default: 'top'\n    }\n  },\n  render (h, { props, slots }) {\n    return h('span', {\n      class: ['badge', props.type],\n      style: {\n        verticalAlign: props.vertical\n      }\n    }, props.text || slots().default)\n  }\n}\n</script>\n\n<style lang=\"stylus\" scoped>\n.badge\n  display inline-block\n  font-size 14px\n  height 18px\n  line-height 18px\n  border-radius 3px\n  padding 0 6px\n  color white\n  background-color #42b983\n  &.tip, &.green\n    background-color $badgeTipColor\n  &.error\n    background-color $badgeErrorColor\n  &.warning, &.warn, &.yellow\n    background-color $badgeWarningColor\n  & + &\n    margin-left 5px\n</style>\n"
  },
  {
    "path": "content/.vuepress/theme/index.js",
    "content": "const path = require('path')\n\n// Theme API.\nmodule.exports = (options, ctx) => {\n  const { themeConfig, siteConfig } = ctx\n\n  // resolve algolia\n  const isAlgoliaSearch = (\n    themeConfig.algolia\n    || Object\n        .keys(siteConfig.locales && themeConfig.locales || {})\n        .some(base => themeConfig.locales[base].algolia)\n  )\n\n  const enableSmoothScroll = themeConfig.smoothScroll === true\n\n  return {\n    alias () {\n      return {\n        '@AlgoliaSearchBox': isAlgoliaSearch\n          ? path.resolve(__dirname, 'components/AlgoliaSearchBox.vue')\n          : path.resolve(__dirname, 'noopModule.js')\n      }\n    },\n\n    plugins: [\n      ['@vuepress/active-header-links', options.activeHeaderLinks],\n      '@vuepress/search',\n      '@vuepress/plugin-nprogress',\n      ['container', {\n        type: 'tip',\n        defaultTitle: {\n          '/': 'TIP',\n          '/zh/': '提示'\n        }\n      }],\n      ['container', {\n        type: 'warning',\n        defaultTitle: {\n          '/': 'WARNING',\n          '/zh/': '注意'\n        }\n      }],\n      ['container', {\n        type: 'danger',\n        defaultTitle: {\n          '/': 'WARNING',\n          '/zh/': '警告'\n        }\n      }],\n      ['container', {\n        type: 'details',\n        before: info => `<details class=\"custom-block details\">${info ? `<summary>${info}</summary>` : ''}\\n`,\n        after: () => '</details>\\n'\n      }],\n      ['smooth-scroll', enableSmoothScroll]\n    ]\n  }\n}\n"
  },
  {
    "path": "content/.vuepress/theme/layouts/404.vue",
    "content": "<template>\n  <div class=\"theme-container\">\n    <div class=\"theme-default-content\">\n      <h1>404</h1>\n\n      <blockquote>{{ getMsg() }}</blockquote>\n\n      <RouterLink to=\"/\">\n        Take me home.\n      </RouterLink>\n    </div>\n  </div>\n</template>\n\n<script>\nconst msgs = [\n  `There's nothing here.`,\n  `How did we get here?`,\n  `That's a Four-Oh-Four.`,\n  `Looks like we've got some broken links.`\n]\n\nexport default {\n  methods: {\n    getMsg () {\n      return msgs[Math.floor(Math.random() * msgs.length)]\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "content/.vuepress/theme/layouts/Layout.vue",
    "content": "<template>\n  <div\n    class=\"theme-container\"\n    :class=\"pageClasses\"\n    @touchstart=\"onTouchStart\"\n    @touchend=\"onTouchEnd\"\n  >\n    <Navbar\n      v-if=\"shouldShowNavbar\"\n      @toggle-sidebar=\"toggleSidebar\"\n    />\n\n    <div\n      class=\"sidebar-mask\"\n      @click=\"toggleSidebar(false)\"\n    />\n\n    <Sidebar\n      :items=\"sidebarItems\"\n      @toggle-sidebar=\"toggleSidebar\"\n    >\n      <template #top>\n        <slot name=\"sidebar-top\" />\n      </template>\n      <template #bottom>\n        <slot name=\"sidebar-bottom\" />\n      </template>\n    </Sidebar>\n\n    <Home v-if=\"$page.frontmatter.home\" />\n\n    <Page\n      v-else\n      :sidebar-items=\"sidebarItems\"\n    >\n      <template #top>\n        <slot name=\"page-top\" />\n      </template>\n      <template #bottom>\n        <slot name=\"page-bottom\" />\n      </template>\n    </Page>\n  </div>\n</template>\n\n<script>\nimport Home from '@theme/components/Home.vue'\nimport Navbar from '@theme/components/Navbar.vue'\nimport Page from '@theme/components/Page.vue'\nimport Sidebar from '@theme/components/Sidebar.vue'\nimport { resolveSidebarItems } from '../util'\n\nexport default {\n  name: 'Layout',\n\n  components: {\n    Home,\n    Page,\n    Sidebar,\n    Navbar\n  },\n\n  data () {\n    return {\n      isSidebarOpen: false\n    }\n  },\n\n  computed: {\n    shouldShowNavbar () {\n      const { themeConfig } = this.$site\n      const { frontmatter } = this.$page\n      if (\n        frontmatter.navbar === false\n        || themeConfig.navbar === false) {\n        return false\n      }\n      return (\n        this.$title\n        || themeConfig.logo\n        || themeConfig.repo\n        || themeConfig.nav\n        || this.$themeLocaleConfig.nav\n      )\n    },\n\n    shouldShowSidebar () {\n      const { frontmatter } = this.$page\n      return (\n        !frontmatter.home\n        && frontmatter.sidebar !== false\n        && this.sidebarItems.length\n      )\n    },\n\n    sidebarItems () {\n      return resolveSidebarItems(\n        this.$page,\n        this.$page.regularPath,\n        this.$site,\n        this.$localePath\n      )\n    },\n\n    pageClasses () {\n      const userPageClass = this.$page.frontmatter.pageClass\n      return [\n        {\n          'no-navbar': !this.shouldShowNavbar,\n          'sidebar-open': this.isSidebarOpen,\n          'no-sidebar': !this.shouldShowSidebar\n        },\n        userPageClass\n      ]\n    }\n  },\n\n  mounted () {\n    this.$router.afterEach(() => {\n      this.isSidebarOpen = false\n    })\n  },\n\n  methods: {\n    toggleSidebar (to) {\n      this.isSidebarOpen = typeof to === 'boolean' ? to : !this.isSidebarOpen\n      this.$emit('toggle-sidebar', this.isSidebarOpen)\n    },\n\n    // side swipe\n    onTouchStart (e) {\n      this.touchStart = {\n        x: e.changedTouches[0].clientX,\n        y: e.changedTouches[0].clientY\n      }\n    },\n\n    onTouchEnd (e) {\n      const dx = e.changedTouches[0].clientX - this.touchStart.x\n      const dy = e.changedTouches[0].clientY - this.touchStart.y\n      if (Math.abs(dx) > Math.abs(dy) && Math.abs(dx) > 40) {\n        if (dx > 0 && this.touchStart.x <= 80) {\n          this.toggleSidebar(true)\n        } else {\n          this.toggleSidebar(false)\n        }\n      }\n    }\n  }\n}\n</script>\n"
  },
  {
    "path": "content/.vuepress/theme/noopModule.js",
    "content": "export default {}\n"
  },
  {
    "path": "content/.vuepress/theme/styles/arrow.styl",
    "content": "@require './config'\n\n.arrow\n  display inline-block\n  width 0\n  height 0\n  &.up\n    border-left 4px solid transparent\n    border-right 4px solid transparent\n    border-bottom 6px solid $arrowBgColor\n  &.down\n    border-left 4px solid transparent\n    border-right 4px solid transparent\n    border-top 6px solid $arrowBgColor\n  &.right\n    border-top 4px solid transparent\n    border-bottom 4px solid transparent\n    border-left 6px solid $arrowBgColor\n  &.left\n    border-top 4px solid transparent\n    border-bottom 4px solid transparent\n    border-right 6px solid $arrowBgColor\n"
  },
  {
    "path": "content/.vuepress/theme/styles/code.styl",
    "content": "{$contentClass}\n  code\n    color lighten($textColor, 20%)\n    padding 0.25rem 0.5rem\n    margin 0\n    font-size 0.85em\n    background-color rgba(27,31,35,0.05)\n    border-radius 3px\n    .token\n      &.deleted\n        color #EC5975\n      &.inserted\n        color $accentColor\n\n{$contentClass}\n  pre, pre[class*=\"language-\"]\n    line-height 1.4\n    padding 1.25rem 1.5rem\n    margin 0.85rem 0\n    background-color $codeBgColor\n    border-radius 6px\n    overflow auto\n    code\n      color #fff\n      padding 0\n      background-color transparent\n      border-radius 0\n\ndiv[class*=\"language-\"]\n  position relative\n  background-color $codeBgColor\n  border-radius 6px\n  .highlight-lines\n    user-select none\n    padding-top 1.3rem\n    position absolute\n    top 0\n    left 0\n    width 100%\n    line-height 1.4\n    .highlighted\n      background-color rgba(0, 0, 0, 66%)\n  pre, pre[class*=\"language-\"]\n    background transparent\n    position relative\n    z-index 1\n  &::before\n    position absolute\n    z-index 3\n    top 0.8em\n    right 1em\n    font-size 0.75rem\n    color rgba(255, 255, 255, 0.4)\n  &:not(.line-numbers-mode)\n    .line-numbers-wrapper\n      display none\n  &.line-numbers-mode\n    .highlight-lines .highlighted\n        position relative\n        &:before\n          content ' '\n          position absolute\n          z-index 3\n          left 0\n          top 0\n          display block\n          width $lineNumbersWrapperWidth\n          height 100%\n          background-color rgba(0, 0, 0, 66%)\n    pre\n      padding-left $lineNumbersWrapperWidth + 1 rem\n      vertical-align middle\n    .line-numbers-wrapper\n      position absolute\n      top 0\n      width $lineNumbersWrapperWidth\n      text-align center\n      color rgba(255, 255, 255, 0.3)\n      padding 1.25rem 0\n      line-height 1.4\n      br\n        user-select none\n      .line-number\n        position relative\n        z-index 4\n        user-select none\n        font-size 0.85em\n    &::after\n      content ''\n      position absolute\n      z-index 2\n      top 0\n      left 0\n      width $lineNumbersWrapperWidth\n      height 100%\n      border-radius 6px 0 0 6px\n      border-right 1px solid rgba(0, 0, 0, 66%)\n      background-color $codeBgColor\n\n\nfor lang in $codeLang\n  div{'[class~=\"language-' + lang + '\"]'}\n    &:before\n      content ('' + lang)\n\ndiv[class~=\"language-javascript\"]\n  &:before\n    content \"js\"\n\ndiv[class~=\"language-typescript\"]\n  &:before\n    content \"ts\"\n\ndiv[class~=\"language-markup\"]\n  &:before\n    content \"html\"\n\ndiv[class~=\"language-markdown\"]\n  &:before\n    content \"md\"\n\ndiv[class~=\"language-json\"]:before\n  content \"json\"\n\ndiv[class~=\"language-ruby\"]:before\n  content \"rb\"\n\ndiv[class~=\"language-python\"]:before\n  content \"py\"\n\ndiv[class~=\"language-bash\"]:before\n  content \"sh\"\n\ndiv[class~=\"language-php\"]:before\n  content \"php\"\n\n@import '~prismjs/themes/prism-tomorrow.css'\n"
  },
  {
    "path": "content/.vuepress/theme/styles/config.styl",
    "content": "$contentClass = '.theme-default-content'\n"
  },
  {
    "path": "content/.vuepress/theme/styles/custom-blocks.styl",
    "content": ".custom-block\n  .custom-block-title\n    font-weight 600\n    margin-bottom -0.4rem\n  &.tip, &.warning, &.danger\n    padding .1rem 1.5rem\n    border-left-width .5rem\n    border-left-style solid\n    margin 1rem 0\n  &.tip\n    background-color #f3f5f7\n    border-color #42b983\n  &.warning\n    background-color rgba(255,229,100,.3)\n    border-color darken(#ffe564, 35%)\n    color darken(#ffe564, 70%)\n    .custom-block-title\n      color darken(#ffe564, 50%)\n    a\n      color $textColor\n  &.danger\n    background-color #ffe6e6\n    border-color darken(red, 20%)\n    color darken(red, 70%)\n    .custom-block-title\n      color darken(red, 40%)\n    a\n      color $textColor\n  &.details\n    display block\n    position relative\n    border-radius 2px\n    margin 1.6em 0\n    padding 1.6em\n    background-color #eee\n    h4\n      margin-top 0\n    figure, p\n      &:last-child\n        margin-bottom 0\n        padding-bottom 0\n    summary\n      outline none\n      cursor pointer\n"
  },
  {
    "path": "content/.vuepress/theme/styles/index.styl",
    "content": "@require './config'\n@require './code'\n@require './custom-blocks'\n@require './arrow'\n@require './wrapper'\n@require './toc'\n\n@font-face\n  font-family Vollkorn\n  src url(/Virgilio/vollkorn/Vollkorn-Regular.ttf) format(\"truetype\")\n\n@font-face\n  font-family Vollkorn\n  src url(/Virgilio/vollkorn/Vollkorn-Bold.ttf) format(\"truetype\")\n  font-weight bold\n  \n@font-face\n  font-family Vollkorn\n  src url(/Virgilio/vollkorn/Vollkorn-Italic.ttf) format(\"truetype\")\n  font-style italic\n\n$accentColor = #0074D9\n$textColor = #111\n$borderColor = #eaecef\n$codeBgColor = #282c34\n\na.sidebar-link.active\n  color: $accentColor !important\n  border-left: 4px solid $accentColor !important\n\na:hover\n  color: $accentColor !important\n\n.site-name2\n  font-weight 400\n  font-size 1.5rem\n\n\n.site-name\n  font-weight 500\n  font-size 1.5rem !important\n  \n\nhtml, body\n  padding 0\n  margin 0\n  background-color #fff\n\nimg\n  display: block;\n  margin-left: auto;\n  margin-right: auto;\n\nbody\n  font-family \"Vollkorn\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen, Ubuntu, Cantarell, \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\", sans-serif\n  -webkit-font-smoothing antialiased\n  -moz-osx-font-smoothing grayscale\n  font-size 22px\n  color $textColor\n\n.page\n  padding-left $sidebarWidth\n\n.navbar\n  position fixed\n  z-index 20\n  top 0\n  left 0\n  right 0\n  height $navbarHeight\n  background-color #fff\n  box-sizing border-box\n  border-bottom 1px solid $borderColor\n\n.nav-link\n  font-size 1.2rem\n  \n.sidebar-mask\n  position fixed\n  z-index 9\n  top 0\n  left 0\n  width 100vw\n  height 100vh\n  display none\n\n.sidebar\n  font-size 20px\n  background-color #fff\n  width $sidebarWidth\n  position fixed\n  z-index 10\n  margin 0\n  top $navbarHeight\n  left 0\n  bottom 0\n  box-sizing border-box\n  border-right 1px solid $borderColor\n  overflow-y auto\n\n{$contentClass}:not(.custom)\n  @extend $wrapper\n  > *:first-child\n    margin-top $navbarHeight\n\n  a:hover\n    text-decoration underline\n\n  p.demo\n    padding 1rem 1.5rem\n    border 1px solid #ddd\n    border-radius 4px\n\n  img\n    max-width 100%\n\n{$contentClass}.custom\n  padding 0\n  margin 0\n\n  img\n    max-width 100%\n\na\n  font-weight 500\n  color $accentColor\n  text-decoration none\n\np a code\n  font-weight 400\n  color $accentColor\n\nkbd\n  background #eee\n  border solid 0.15rem #ddd\n  border-bottom solid 0.25rem #ddd\n  border-radius 0.15rem\n  padding 0 0.15em\n\nblockquote\n  font-size 22px\n  color #777;\n  border-left .2rem solid #dfe2e5\n  margin 1rem 0\n  padding .25rem 0 .25rem 1rem\n\n  & > p\n    margin 0\n\nul, ol\n  padding-left 1.2em\n\nstrong\n  font-weight 600\n\nh1, h2, h3, h4, h5, h6\n  font-weight 600\n  line-height 1.25\n\n  {$contentClass}:not(.custom) > &\n    margin-top (0.5rem - $navbarHeight)\n    padding-top ($navbarHeight + 1rem)\n    margin-bottom 0\n\n    &:first-child\n      margin-top -1.5rem\n      margin-bottom 1rem\n\n      + p, + pre, + .custom-block\n        margin-top 2rem\n\n  &:hover .header-anchor\n    opacity: 1\n\n.title\n  font-size 5rem\n  font-weight 500\n\n.subtitle\n  font-style italic\n  font-size 2rem\n  font-weight 300\n\n    \nh1\n  font-size 3rem\n  font-weight 500\n\nh2\n  font-size 1.65rem\n  padding-bottom .3rem\n  border-bottom 1px solid $borderColor\n\nh3\n  font-size 1.35rem\n\na.header-anchor\n  font-size 0.85em\n  float left\n  margin-left -0.87em\n  padding-right 0.23em\n  margin-top 0.125em\n  opacity 0\n\n  &:hover\n    text-decoration none\n\ncode, kbd, .line-number\n  font-family source-code-pro, Menlo, Monaco, Consolas, \"Courier New\", monospace\n\np, ul, ol\n  line-height 1.7\n\nhr\n  border 0\n  border-top 1px solid $borderColor\n\ntable\n  border-collapse collapse\n  margin 1rem 0\n  display: block\n  overflow-x: auto\n\ntr\n  border-top 1px solid #dfe2e5\n\n  &:nth-child(2n)\n    background-color #f6f8fa\n\nth, td\n  border 1px solid #dfe2e5\n  padding .6em 1em\n\n.theme-container\n  &.sidebar-open\n    .sidebar-mask\n      display: block\n\n  &.no-navbar\n    {$contentClass}:not(.custom) > h1, h2, h3, h4, h5, h6\n      margin-top 1.5rem\n      padding-top 0\n\n    .sidebar\n      top 0\n\n\n@media (min-width: ($MQMobile + 1px))\n  .theme-container.no-sidebar\n    .sidebar\n      display none\n\n    .page\n      padding-left 0\n\n@require 'mobile.styl'\n"
  },
  {
    "path": "content/.vuepress/theme/styles/mobile.styl",
    "content": "@require './config'\n\n$mobileSidebarWidth = $sidebarWidth * 0.82\n\n// narrow desktop / iPad\n@media (max-width: $MQNarrow)\n  .sidebar\n    font-size 15px\n    width $mobileSidebarWidth\n  .page\n    padding-left $mobileSidebarWidth\n\n// wide mobile\n@media (max-width: $MQMobile)\n  .sidebar\n    top 0\n    padding-top $navbarHeight\n    transform translateX(-100%)\n    transition transform .2s ease\n  .page\n    padding-left 0\n  .theme-container\n    &.sidebar-open\n      .sidebar\n        transform translateX(0)\n    &.no-navbar\n      .sidebar\n        padding-top: 0\n\n// narrow mobile\n@media (max-width: $MQMobileNarrow)\n  h1\n    font-size 1.9rem\n  {$contentClass}\n    div[class*=\"language-\"]\n      margin 0.85rem -1.5rem\n      border-radius 0\n"
  },
  {
    "path": "content/.vuepress/theme/styles/toc.styl",
    "content": ".table-of-contents\n  .badge\n    vertical-align middle\n"
  },
  {
    "path": "content/.vuepress/theme/styles/wrapper.styl",
    "content": "$wrapper\n  max-width $contentWidth\n  margin 0 auto\n  padding 2rem 2.5rem\n  @media (max-width: $MQNarrow)\n    padding 2rem\n  @media (max-width: $MQMobileNarrow)\n    padding 1.5rem\n\n"
  },
  {
    "path": "content/.vuepress/theme/util/index.js",
    "content": "export const hashRE = /#.*$/\nexport const extRE = /\\.(md|html)$/\nexport const endingSlashRE = /\\/$/\nexport const outboundRE = /^[a-z]+:/i\n\nexport function normalize (path) {\n  return decodeURI(path)\n    .replace(hashRE, '')\n    .replace(extRE, '')\n}\n\nexport function getHash (path) {\n  const match = path.match(hashRE)\n  if (match) {\n    return match[0]\n  }\n}\n\nexport function isExternal (path) {\n  return outboundRE.test(path)\n}\n\nexport function isMailto (path) {\n  return /^mailto:/.test(path)\n}\n\nexport function isTel (path) {\n  return /^tel:/.test(path)\n}\n\nexport function ensureExt (path) {\n  if (isExternal(path)) {\n    return path\n  }\n  const hashMatch = path.match(hashRE)\n  const hash = hashMatch ? hashMatch[0] : ''\n  const normalized = normalize(path)\n\n  if (endingSlashRE.test(normalized)) {\n    return path\n  }\n  return normalized + '.html' + hash\n}\n\nexport function isActive (route, path) {\n  const routeHash = decodeURIComponent(route.hash)\n  const linkHash = getHash(path)\n  if (linkHash && routeHash !== linkHash) {\n    return false\n  }\n  const routePath = normalize(route.path)\n  const pagePath = normalize(path)\n  return routePath === pagePath\n}\n\nexport function resolvePage (pages, rawPath, base) {\n  if (isExternal(rawPath)) {\n    return {\n      type: 'external',\n      path: rawPath\n    }\n  }\n  if (base) {\n    rawPath = resolvePath(rawPath, base)\n  }\n  const path = normalize(rawPath)\n  for (let i = 0; i < pages.length; i++) {\n    if (normalize(pages[i].regularPath) === path) {\n      return Object.assign({}, pages[i], {\n        type: 'page',\n        path: ensureExt(pages[i].path)\n      })\n    }\n  }\n  console.error(`[vuepress] No matching page found for sidebar item \"${rawPath}\"`)\n  return {}\n}\n\nfunction resolvePath (relative, base, append) {\n  const firstChar = relative.charAt(0)\n  if (firstChar === '/') {\n    return relative\n  }\n\n  if (firstChar === '?' || firstChar === '#') {\n    return base + relative\n  }\n\n  const stack = base.split('/')\n\n  // remove trailing segment if:\n  // - not appending\n  // - appending to trailing slash (last segment is empty)\n  if (!append || !stack[stack.length - 1]) {\n    stack.pop()\n  }\n\n  // resolve relative path\n  const segments = relative.replace(/^\\//, '').split('/')\n  for (let i = 0; i < segments.length; i++) {\n    const segment = segments[i]\n    if (segment === '..') {\n      stack.pop()\n    } else if (segment !== '.') {\n      stack.push(segment)\n    }\n  }\n\n  // ensure leading slash\n  if (stack[0] !== '') {\n    stack.unshift('')\n  }\n\n  return stack.join('/')\n}\n\n/**\n * @param { Page } page\n * @param { string } regularPath\n * @param { SiteData } site\n * @param { string } localePath\n * @returns { SidebarGroup }\n */\nexport function resolveSidebarItems (page, regularPath, site, localePath) {\n  const { pages, themeConfig } = site\n\n  const localeConfig = localePath && themeConfig.locales\n    ? themeConfig.locales[localePath] || themeConfig\n    : themeConfig\n\n  const pageSidebarConfig = page.frontmatter.sidebar || localeConfig.sidebar || themeConfig.sidebar\n  if (pageSidebarConfig === 'auto') {\n    return resolveHeaders(page)\n  }\n\n  const sidebarConfig = localeConfig.sidebar || themeConfig.sidebar\n  if (!sidebarConfig) {\n    return []\n  } else {\n    const { base, config } = resolveMatchingConfig(regularPath, sidebarConfig)\n    return config\n      ? config.map(item => resolveItem(item, pages, base))\n      : []\n  }\n}\n\n/**\n * @param { Page } page\n * @returns { SidebarGroup }\n */\nfunction resolveHeaders (page) {\n  const headers = groupHeaders(page.headers || [])\n  return [{\n    type: 'group',\n    collapsable: false,\n    title: page.title,\n    path: null,\n    children: headers.map(h => ({\n      type: 'auto',\n      title: h.title,\n      basePath: page.path,\n      path: page.path + '#' + h.slug,\n      children: h.children || []\n    }))\n  }]\n}\n\nexport function groupHeaders (headers) {\n  // group h3s under h2\n  headers = headers.map(h => Object.assign({}, h))\n  let lastH2\n  headers.forEach(h => {\n    if (h.level === 2) {\n      lastH2 = h\n    } else if (lastH2) {\n      (lastH2.children || (lastH2.children = [])).push(h)\n    }\n  })\n  return headers.filter(h => h.level === 2)\n}\n\nexport function resolveNavLinkItem (linkItem) {\n  return Object.assign(linkItem, {\n    type: linkItem.items && linkItem.items.length ? 'links' : 'link'\n  })\n}\n\n/**\n * @param { Route } route\n * @param { Array<string|string[]> | Array<SidebarGroup> | [link: string]: SidebarConfig } config\n * @returns { base: string, config: SidebarConfig }\n */\nexport function resolveMatchingConfig (regularPath, config) {\n  if (Array.isArray(config)) {\n    return {\n      base: '/',\n      config: config\n    }\n  }\n  for (const base in config) {\n    if (ensureEndingSlash(regularPath).indexOf(encodeURI(base)) === 0) {\n      return {\n        base,\n        config: config[base]\n      }\n    }\n  }\n  return {}\n}\n\nfunction ensureEndingSlash (path) {\n  return /(\\.html|\\/)$/.test(path)\n    ? path\n    : path + '/'\n}\n\nfunction resolveItem (item, pages, base, groupDepth = 1) {\n  if (typeof item === 'string') {\n    return resolvePage(pages, item, base)\n  } else if (Array.isArray(item)) {\n    return Object.assign(resolvePage(pages, item[0], base), {\n      title: item[1]\n    })\n  } else {\n    const children = item.children || []\n    if (children.length === 0 && item.path) {\n      return Object.assign(resolvePage(pages, item.path, base), {\n        title: item.title\n      })\n    }\n    return {\n      type: 'group',\n      path: item.path,\n      title: item.title,\n      sidebarDepth: item.sidebarDepth,\n      children: children.map(child => resolveItem(child, pages, base, groupDepth + 1)),\n      collapsable: item.collapsable !== false\n    }\n  }\n}\n"
  },
  {
    "path": "content/README.md",
    "content": "# <div class=\"title\">*Virgilio* <a style=\"display:inline\" href=\"https://github.com/Virgili0/Virgilio\"><img alt=\"GitHub stars\" style=\"display:inline\" src=\"https://img.shields.io/github/stars/Virgili0/Virgilio?style=social\" height=\"25px\"></a></div> \n <div class=\"subtitle\">Your new Mentor for Data Science E-Learning.</div>\n\n<!-- \n     Responsive Image Map \n     https://www.zaneray.com/responsive-image-map/\n\n\n<div style=\"position: relative;\">\n  <img src=\"paradiso_basic.png\">\n  <a href=\"paradiso/demystification-ai-ml-dl\" title=\"Demystification AI ML DL\" style=\"position: absolute; left: 16.95%; top: 53.59%; width: 5.55%; height: 3.13%; z-index: 2;\"></a>\n</div>\n\n<div style=\"position: relative;\">\n  <img src=\"inferno_basic.png\">\n  <a href=\"inferno/computer-vision/introduction-to-computer-vision\" title=\"Introduction to CV\" style=\"position: absolute; left: 27.58%; top: 46.41%; width: 7.73%; height: 6.72%; z-index: 2;\"></a>\n</div>\n\n\n-->\n<div style=\"text-align:center\"><img style=\"text-align:center\" width=\"480px\" src=\"https://upload.wikimedia.org/wikipedia/commons/c/ce/Virgil_.jpg\"/></div>\n\n<br>\n\nVirgilio is an **open-source initiative**, aiming to **mentor and guide** anyone in the world of **Data Science**.\n\n**The Vision of Virgilio** is to give *everyone* the chance to get involved in this field, **get self-started** as a practitioner, **gain new skills** and **learn to navigate** through the infinite web of available resources and find the ones useful for *you*.\n\nVirgilio comes in form of _Guides_ and it's organized in three levels to offer you a **clear learning path**: \n\n- <span style=\"font-weight: bold; color: #2565AE\">Paradiso</span>: High Level Guides - For Everyone\n- <span style=\"font-weight: bold; color: #009967\">Purgatorio</span>: Entry Level Technical Guides - For Beginners\n- <span style=\"font-weight: bold; color: #D22C2C\">Inferno</span>: Advanced Technical Guide - For Experienced Practitioners\n\n::: tip\nIf you want to contribute to the Virgilio, welcome! :-)\nYou will find information about contribution guidelines in the [Contribute](#contribute) section.\n:::\n\n::: tip\n[Find me](https://twitter.com/giac290595) on Twitter to have a chat!\n:::\n## Table of Contents\n\n- [*What* is Virgilio](#what-is-virgilio)\n- [Structure](#structure)\n- [About](#About)\n  * [License](#license)\n  * [Contribute](#contribute)\n\n\n# What is Virgilio?\n\nStudying and reading through the Internet means swimming in an **infinite jungle of chaotic information**, even more so in rapidly changing innovative fields. \n\n_Have you ever felt overwhelmed_ when trying to approach **Data Science** without a real “path” to follow? \n\nAre you tired of clicking “Run”, “Run”, “Run”.. on a Jupyter Notebook, with that false sense of confidence given by the comfort zone of the work of others?\n\nHave you ever got confused because of the several and contradicting names for the same algorithm or approach, from different websites and fragmented tutorials? \n\n**Virgilio addresses these critical issues for free, for everyone.**\n\n---\n\nHi, I'm [Virgilio](https://en.wikipedia.org/wiki/Virgil).\n\nLike I did with *[Dante](https://en.wikipedia.org/wiki/Dante_Alighieri)*, just some centuries ago, I'll be your mentor and reference point during your journey through this *selva oscura*, providing you complete and organic learning paths for several _data-related_ fields, tools, skills and more.\n\n**The vision of Virgilio** is to give everyone the possibility to **get into the world of Data Science and Machine Learning** and the business and creative possibilities that they offer, to get self-started as a practitioner, gain new cutting edge practical skills, or just learn to discriminate good information from poor information.\n\nVirgilio is doing this by providing only _high-quality_ and _coherent_ content, with clear step-by-step paths and a consistent naming system.\n\nImagine Virgilio as your E-Mentor, who will tell you what to do to **get the next step**, the next skill, or to apply them in practice to create value!\n\n**But what does it mean in practice?**\n\nIn other words, who is the **target** of the Virgilio project?\n\nDepending on your background and interests, you may be:\n\n- A *student* from a different field who wants to explore the intersections and the possibilities offered by Machine Learning and Statistical Methods.\n- A *curious individual* who came in touch with one of the buzzwords related to these fields and wants to discriminate between reliable and unreliable information.\n- An *experienced practitioner* who wants to have a reference point for the latest techniques, papers, and best practices.\n- A *manager* who wants to understand the possibilities of ML applied to their actual problems, like integration with production systems or new solutions from scratch.\n- A *businessman* who wants to understand if his data are suitable for an ML project, and what could be the real business value.\n- A *salesman* who needs to stay up-to-date with the latest technologies and Jargon.\n\nFor all of these scenarios, Virgilio gives you **the resources** and **the guidance** that you need!\n\n## Structure\n\n![Figure 1](map.PNG \"1\") \n\nAs you can imagine it’s not easy to intercept all these different needs, but Virgilio solves this problem with a hierarchical project structure that distinguishes the content based on different levels of *abstraction*.\n\nThe inspiration for this organization comes from Dante’s amazing masterpiece [*La Divina Commedia*](https://en.wikipedia.org/wiki/Divina_Commedia), written in over 20 years of work and published for the first time in 1323 AD.\n\nIn his journey, Dante travel across the three different levels of the catholic conception of the divine universe at that time, exploring the <span style=\"font-weight: bold; color: #D22C2C\">Inferno</span> (the prison of the damned), passing through the <span style=\"font-weight: bold; color: #009967\">Purgatorio</span> and reaching the <span style=\"font-weight: bold; color: #2565AE\">Paradiso</span> (you can call it Valhalla or Nirvana, as you prefer :) ).\n\nSo, who is Virgilio?\n\nDante's journey wouldn’t have been possible without **his guide Virgilio**, a roman famous poet (70 a.c.) who inspired generations of artists since the Roman hegemony in Europe.\n\nIn your journey, you will start from scratch and eventually reach the theoretical knowledge and solid expendable skill.\n\nThe parallelism is natural:\n\n- <span style=\"font-weight: bold; color: #2565AE\">Paradiso</span>: High Level Guides - For Everyone\n- <span style=\"font-weight: bold; color: #009967\">Purgatorio</span>: Entry Level Technical Guides - For Beginners\n- <span style=\"font-weight: bold; color: #D22C2C\">Inferno</span>: Advanced Technical Guide - For Experienced Practitioners\n\n_Going from Paradiso to Inferno increases the level of detail of the guides and decreases the level of abstraction of the topics involved_. \n\n---\nIn the <span style=\"font-weight: bold; color: #2565AE\">Paradiso</span> you won’t find a single line of code or a math formula, just plain English. \nHere’s the place for introductions, simple explanations, demystifications, and meta-guides (for example a guide about the best way to use Virgilio). \n\nIt’s the best place for the non-techies, beginners, and literally everyone who wants to get in touch with Data Science and Machine Learning without getting bored with technical details. \n\nDo you want to be able to **understand and talk about** these innovative fields?\n\nStart from the <span style=\"font-weight: bold; color: #2565AE\">Paradiso</span>!\n\n---\n\nIn the <span style=\"font-weight: bold; color: #009967\">Purgatorio</span> you can find technical guides for beginners (in the field or in general IT). \n\nFor example, you’ll find guides about Python, maths, statistical modeling, building production-ready Machine Learning systems, and more. \n\nThe whole <span style=\"font-weight: bold; color: #009967\">Purgatorio</span>'s structure is built on the end-to-end Data Science process, where each section corresponds to a macro-phase of the Data Science process: **It’s an obliged step before the Inferno.** \n\nDepending on your starting skill, you’ll probably spend here most of the time, learning to code, understand math concepts, and more! \n\n_If you’re a complete beginner_, follow the track we proposed, starting from the Fundamentals.\n\n---\n\nIn the <span style=\"font-weight: bold; color: #D22C2C\">Inferno</span> you won’t find gentle introductions or generic explanations, but a lot of different detailed guides, topics, hands-on tutorials and more!\n\nThink about <span style=\"font-weight: bold; color: #D22C2C\">Inferno</span> as the place where you will pick up the sub-field you prefer and dive into that. \n\nThe three \"deep-dive\" guides in the <span style=\"font-weight: bold; color: #D22C2C\">Inferno</span> are:\n\n- Time Series \n- Natural Language \n- Computer Vision\n\nThese learning paths are the **“final bosses”** of the Virgilio project: \nonce you’ll have completed them you will hopefully be skilled enough to land an internship or tackle real business problems!\n\nAbove these, in the <span style=\"font-weight: bold; color: #D22C2C\">Inferno</span> you’ll find a plenty of other useful zones:\n\n- Tools: here you find guides about useful tools for programming, or scientific computing in general. \n- Research: here you will learn how to find the right papers and digest them. In addition, you’ll discover which teams to follow for your interests.\n- ML for Business applications: here we provide additional resources to select a sector and see what are today’s available techniques for the problems of your interest.\n\n## About\n\nVirgilio is developed and maintained by [**these awesome people**](docs/contributors.md).\n[Find me](https://twitter.com/giac290595) on Twitter to have a chat!\n\n\n### Contribute\n\nThat's awesome! Check the [contribution guidelines](docs/contributing.md) and get involved in our project!\n\n### License\n\nContents are released under the Creative Commons BY-NC-SA 4.0 [license](https://github.com/virgili0/Virgilio/blob/dev/LICENSE). Code is released under the [MIT license](https://github.com/virgili0/Virgilio/blob/dev/.vuepress/LICENSE).\n"
  },
  {
    "path": "content/docs/contributing.md",
    "content": "# Index\n - [You have immense power](#Contribute)\n - [Easiest way to contribute](#Easiest-way-to-contribute)\n - [Contributing with new guides](#Contributing-with-new-guides)\n - [General Tips](#General-Tips)\n - [Guide Template](#Guide-Template)\n - [Creating a Pull Request](#Creating-a-Pull-Request)\n\n \n# Contribute\n\n> “There is immense power when a group of people with similar interests gets together to work toward the same goals.” \n\nThe mission of Virgilio is to share free and curated knowledge paths and high-quality content, and we think that everyone can put his hands in this wonderful and serious game!\n\nIf you know how to use a tool or a framework, or you faced some business problems and their complications, why not writing a guide about it?\n \n> Several studies and empirical proofs show that the fastest and most effective way to learn something, is to teach it.\n\nMoreover, thousands of people will read it and would be grateful to you! 👍 \nDon't worry about the correctness of your English or the depth of your knowledge, experienced people at Virgilio will help you make your guide of the highest quality.\nIf you want to contribute to the Virgilio project, test to @Clone95 on Telegram and check out our future guides roadmap: maybe you can find that we already need your help!\nFeel free to suggest new ideas, guides, or entire sections! \n\n\n## Easiest way to contribute\nThe easiest way to contribute would be by sharing this repository with everyone you know. Send it to everyone who might enjoy leaning something new!\n\n## Contributing with new guides\nIf you want to write a new guide, that would be great! You can contact us if you want to be sure that no one else is already writing about what you had in mind, or to find out if someone else would be interested in helping you write about a particular topic!\n\nIf you want to write a guide, please take some time to read a couple of them to get a feel for the style that the guides should follow. You can have a look at the WolframAlpha or GeoGebra guides.\n\nBefore writing, you also need to check the [Guide Template](#Guide-Template).\n\nDo your best to write clearly and without errors! Provide relevant links whenever you can and only free resources. You are welcome to leave your contact details in the end of the guide, but you are not forced to do so!\n\n# General Tips\nIn general, Virgilio has to be the place that you go to and ensures you that the next step you're taking and the approach you are following are the right ones. This means that the ideal guide:\n\n- Introduces you to the what, why and the context in plain English (following the template).\n- If practice oriented (_Purgatorio and Inferno_), exposes you to practical experience with exercises and hands-on projects. Kaggle is a good place to find them: choose a project and give it as a “final homework”, giving tips and different solutions (if possible).\n- Drives you step-by-step through progressive theory+practice+example for each step. Like a book basically, but concise, with pointers to the right resources and brief suggestions about how to approach them.\n- Don't re-invent the wheel. Probably someone has done a very good job explaining Back Propagation, why not to leverage this? Other authors will be more than happy to have credits and share their work!\nThe thing that matters is that you provide this resource inside a logical path, with reasons for that, introducing it, and \"linking\" with explanations to the rest of the guide. It can just be 3-4 lines, if they are sufficient. Of course, the more original content you develop, the more you can build an awesome learning place. \n- Gives you, for each step, some pointers to resources like \"best practices for ____\" or repos of examples.\n\n### **The bottom line** is the following: \n\nVirgilio wants to be the mentor who \"lines up\" a series of resources of which the Internet already possesses most. \n\nIt wants to be those _lines that connect the dots_ of knowledge.\nIt wants to be the place in which you go to, to look for references and useful links, organized in a _logical and progressive way_. \nIt wants to _decrease the cognitive load_ in the approach to complex and interconnected themes such as machine learning and data science in general.\n\n\nYou have a lot of examples of guides that have already been written.\nIf the guide you are writing is highly pratical, consider using a Jupyter Notebook.\n\n# Guide Template\n\n# Title of the guide about X\n\n# What you will learn \nTry to be specific.\n\n## Prerequisites\nIt would be great if you knew\n  1. this thing\n  2. this other thing\n  3. and this might be useful as well\n\nLink here all prerequisites.\n\n## Time to complete\nGive here an estimation of the time needed to walk through the contents and to tackle the practice part (if any).\n\n# Index\n - [Section A](#section-a)\n   - [Subsection A1](#subsection-a1)\n   - [Subsection A2](#subsection-a2)\n - [Section B](#section-b)\n - ...\n - [Practice](#Practice)\n - [Conclusions](#Conclusions)\n - [Further reading](#Further-reading)\n\nLet's dive right in!\n \n### Section A\nSection A is great because it is the first section of them all!\n\nAnd this would be another very interesting paragrah!\n \n#### Subsection A1\nIn particular, I just went deeper into subsection A1!\n\n#### Subsection A2\nAnd of course there is subsection A2...\n\n### Section B\nWhich is then followed by Section B.\n\n### Practice \nHere you can give exercises too, in order to access to the next step of the path, \n\nor a project from Kaggle. For the project, give some guidelines and try to give an example solution (you can easily find dozens of solution notebooks on Kaggle)\n\n### Conclusions\nWe concluded that _x_, _y_ and _z_.\n\n### Further reading\nYou should definitely check this if you liked **x**, or read this if you liked **y**.\n\n----\nWritten by _author_\n\n\n## Creating a Pull Request\nIf you are going to create a Pull Request, regardless of the reason, please take the time to give the PR a concise, relevant title (less than 50 characters) and write a descriptive, informative summary in the larger text field. This will let us review your PR faster, instead of having to first interpret what you did, and then decide if the changes are any good (which they probably are!).\n\nWe are very interested in having people help us! That is the point of a community! But we would rather not spend hours trying to decipher the changes you made.\n\n## Frontend\n\nTo contribute and develop on the frontend:\n\n- Install NodeJS and npm\n- Clone the repository and cd into it\n\n```\nnpm install\nnpx vuepress dev\n```\n\nSidebar is configured in `.vuepress/config.js`.\n\nYour local version of the website is live at `localhost:8080`. To deploy the build on the master branch: `npm run deploy`.\n"
  },
  {
    "path": "content/docs/contributors.md",
    "content": "# Contributors\n\nHere's the list of the awesome people making Virgilio possible.\n\nCore team:\n\n- **[clone95](https://github.com/clone95)**\n- **[avivace](https://github.com/avivace)**\n- **[entropizza](https://github.com/entropizza)**\n- **[neomatrix369](https://github.com/neomatrix369)**\n- **[khaledbay](https://github.com/khaledbay)**\n- **[RojerGS](https://github.com/RojerGS)**\n\nContributors:\n\n- [jiaxianhua](https://github.com/jiaxianhua)\n- [taotianli](https://github.com/taotianli)\n- [adnan7400](https://github.com/adnan7400)\n- [Lulzx](https://github.com/Lulzx)\n- [zszazi](https://github.com/zszazi)\n- [laravignotto](https://github.com/laravignotto)\n- [damianoazzolini](https://github.com/damianoazzolini)\n- [wuodland](https://github.com/wuodland)\n- [tdslinden](https://github.com/tdslinden)\n- [mindflayer](https://github.com/mindflayer)\n- [mikeshatch](https://github.com/mikeshatch)\n- [kjaisingh](https://github.com/kjaisingh)\n- [jiaoqiyuan](https://github.com/jiaoqiyuan)\n- [hechmik](https://github.com/hechmik)\n- [claude9493](https://github.com/claude9493)\n- [S-HuaBomb](https://github.com/S-HuaBomb)\n- [KARAKI93](https://github.com/KARAKI93)\n- [Ghost-717](https://github.com/Ghost-717)\n- [EthanITA](https://github.com/EthanITA)\n- [3nomis](https://github.com/3nomis)\n"
  },
  {
    "path": "content/docs/template.md",
    "content": "This file contains a generic template for a guide about some subject X.\n\nPlease remember to:\n - be consistent throughout the guide.\n - be as clear as possible.\n - write in your best English.\n - include examples whenever possible.\n - use internal links for easier navigation; an internal link to a section can be made by using the `#` sign, followed by the section name, with hyphens `-` instead of spaces (so section \"Who am I\" can be referenced with `#who-am-i`).\n - provide relevant links if you list some prerequisites.\n - provide a small challenge each step of the guide, it's too easy and not effective to just walk around among topics! \n------\n\n# Title of the guide about X\n\n## What is X\n**X** is what we will be talking about now!\n\n## Why does X matter \n**X** matters because unicorns are great!\n\n## Who am I?\n**X** I am definitely not a robot!\n\n## Prerequisites\nIt would be great if you knew\n  1. this thing\n  2. this other thing\n  3. and this might be useful as well\n\n# Index\n - [Section A](#section-a)\n   - [Subsection A1](#subsection-a1)\n   - [Subsection A2](#subsection-a2)\n - [Section B](#section-b)\n - ...\n \nLet's dive right in!\n \n### Section A\nSection A is great because it is the first section of them all!\n\nAnd this would be another very interesting paragrah!\n \n#### Subsection A1\nIn particular, I just went deeper into subsection A1!\n\n#### Subsection A2\nAnd of course there is subsection A2...\n\n### Section B\nWhich is then followed by Section B.\n\n### Conclusions\nWe concluded that _x_, _y_ and _z_.\n\n### Further reading\nYou should definitely check this if you liked **x**, or read this if you liked **y**.\n\n----\nWritten by _author_\n"
  },
  {
    "path": "content/inferno/computer-vision/Object_detection_based_on_Deep_Learning.ipynb",
    "content": "{\n  \"cells\": [\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"OaEGVW0XCzhL\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"# Object Detection based on Deep Learning\\n\",\n        \"\\n\",\n        \"![DL](https://i.ibb.co/GVbs5bV/fig.png)\\n\",\n        \"\\n\",\n        \"## What is object detection?\\n\",\n        \"In recent years, object detection in images has been greatly improved through numerous implementations of the Deep Learning paradigm. Creating trainable models helps to rapidly detect and classify discriminating features without having to develop a sophisticated algorithm. In fact, detecting objects and locating them in an image is an increasingly vital aspect of computer vision research. This discipline seeks out instances, their class labels and their positions in the visual data. This domain stands at the overlap of two other fields: image classification and object localization. Indeed, object detection is based on the following principle: for a specific image, we look for regions of the image that might contain an object and then, for each of these detected regions, we extract and classify it using an image classification model. Those regions of the initial image showing good classification results are maintained and the remainder is discarded. Thus, for a good object detection method, it is necessary to have a robust region detection algorithm as well as a good image classification model.\\n\",\n        \"\\n\",\n        \"The following projects and tutorials related to the video detection task are provided for further details:\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"*    [Object detection project for real-time (webcam) and offline (video processing) application.](https://github.com/lbeaucourt/Object-detection)\\n\",\n        \"\\n\",\n        \"*   [Object-detection: Single Shot MultiBox Detector(SSD) in TensorFlow.](https://github.com/hjptriplebee/SSD_tensorflow)\\n\",\n        \"\\n\",\n        \"* [Darknet](https://github.com/rlan/darknet)\\n\",\n        \"\\n\",\n        \"* [PyTorch implementation of RetinaNet with the goal to reproduce results in the \\\"focal loss for dense object detection\\\" paper.](https://github.com/cedrickchee/pytorch-RetinaNet)\\n\",\n        \"\\n\",\n        \"* [Robosapien object detector using Darkflow](https://github.com/ogbanugot/Robosapien-Object-Detector-using-Darkflow)\\n\",\n        \"\\n\",\n        \"* [Object Detection Application](https://github.com/siddartha19/Object-Detection-Application)\\n\",\n        \"* [Understanding Object Detection](https://towardsdatascience.com/understanding-object-detection-9ba089154df8)\\n\",\n        \"\\n\",\n        \"The following are some useful books that will help you learn the different aspects of object detection:\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"1.   [Advanced Applied Deep Learning](https://www.amazon.com/Advanced-Applied-Deep-Learning-Convolutional/dp/1484249755)\\n\",\n        \"2.   [Object Detection in Low-spatial-resolution Aerial Imagery Using Convolutional Neural Networks](https://www.amazon.com/Detection-Low-spatial-resolution-Imagery-Convolutional-Networks/dp/1688093427)\\n\",\n        \"3. [Hierarchical approach for object detection using shape descriptors](https://www.amazon.com/Hierarchical-approach-object-detection-descriptors/dp/3330353066)\\n\",\n        \"4. [Application of Deep Learning in Object Detection\\n\",\n        \"Application of Deep Learning in Object Detection using Tensorflow](https://aax-us-east.amazon-adsystem.com/x/c/Qja79-QaoJHEO-MVQ1oDZwsAAAFwtKQVSwEAAAFKAQDMYqQ/https://assoc-redirect.amazon.com/g/r/https://www.amazon.com/Application-Deep-Learning-Object-Detection/dp/613945705X?creativeASIN=613945705X&linkCode=w61&imprToken=bnWxJoN9ehtfoAkba-1ChA&slotNum=21&tag=uuid10-20)\\n\",\n        \"\\n\",\n        \"### Object localization v.s. object classification\\n\",\n        \"Object detection consists of identifying and locating one or several objects in the image. Depending on a given input, a detector will return information of two dimensions: the class labels and location of each instance. Locating an object in an image is complex and measuring the localization performance needs an adapted metric. Moreover, unlike classification, several targets can be located in the same image and the detector must be able to accurately locate them. For a single input, an object detector returns the detected objects in the image and their associated bounding boxes. Some strategies are available to address this challenge. The first one(see Figure 1), based on object recognition approaches, essentially consists of simply predicting the size of a bounding box and the class to which it belongs. The second approach (see Figure 2), probably the best known, is the proposed region approach where another model extracts a reduced number of candidate frames (i.e. proposals) that contain an object and the problem is then simplified into a recognition problem.\\n\",\n        \"\\n\",\n        \"**Figure 1:** Object detection based on a single-stage method ![Fig1](https://i.ibb.co/fCjNBpw/1.png)\\n\",\n        \"\\n\",\n        \"**Figure 2:** Object detection based on a two-stages method (region proposals) ![Fig2](https://i.ibb.co/1MkgbS4/2.png)\\n\",\n        \"\\n\",\n        \"### Contour-based object detection\\n\",\n        \"\\n\",\n        \"cIn this section, we will discuss different methods of contour detection and compare them with each other.\\n\",\n        \"\\n\",\n        \"**1. SOBEL detector**\\n\",\n        \"\\n\",\n        \"The Sobel detector is one of the methods we're looking at right now. Like most detectors, this one is based on calculating the gradients of the image at each point. Sobel's discrete method is based on multiplying the intensity matrix around the desired pixel by the following matrices, representing the \\\" mixture \\\" between filters derived according to x and y, and Gaussian filters that add importance to the nearest pixels.\\n\",\n        \"\\n\",\n        \"![Sobel](https://i.ibb.co/6cQx0b0/3.png)\\n\",\n        \"\\n\",\n        \"**2. LAPLACIAN detector**\\n\",\n        \"\\n\",\n        \"An alternative method that has been explored is the use of the Laplacian. The principle is quite similar and is based on the second derivative of the intensity. Discretely, the Laplacian matrix is implemented by the product of the intensity matrices of the pixel contour with the following matrices :\\n\",\n        \"\\n\",\n        \"[0 1 0]\\n\",\n        \"\\n\",\n        \"[1 -4 1]\\n\",\n        \"\\n\",\n        \"[0 1 0]\\n\",\n        \"\\n\",\n        \"![Lap](https://i.ibb.co/M7L0nbr/4.png)\\n\",\n        \"\\n\",\n        \"**3. CANNY detector**\\n\",\n        \"\\n\",\n        \"The Canny method uses a Gaussian filter and then derivation matrices along both axes to determine the magnitude and angle of the gradient. Finally, a hysteresis is applied to smooth out the most important edges.\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"![Canny](https://i.ibb.co/3C8xHxX/5.png)\\n\",\n        \"\\n\",\n        \"**4. PREWITT detector**\\n\",\n        \"\\n\",\n        \"This detector is pretty close to Sobel's. Concretely, it operates on the principle of gradient detection along the two major axes, in combination with an averaging filter.  \\n\",\n        \"\\n\",\n        \"\\n\",\n        \"![prewitt](https://i.ibb.co/XZLpZCk/6.png)\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"### Conventional methods for object detection: A use case \\n\",\n        \"\\n\",\n        \"The objective of this use case is to develop and program algorithms to detect faces in images. To do this, one approach using [Viola-Jones' algorithm](https://www.cs.cmu.edu/~efros/courses/LBMV07/Papers/viola-cvpr-01.pdf) will be tested.\\n\",\n        \"The Viola-Jones technique (Haar Cascade Face Detector) is a method of detecting objects in images proposed by Paul Viola and Michael Jones in 2001 and widely used for face detection. This method detects objects by learning a classifier.\\n\",\n        \"\\n\",\n        \"The implementation of this detector is as follows:\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"MQGRq7uGmv-F\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"class HaarCascadeFaceDetector(AbstractSkinDetector):\\n\",\n        \"    \\\"\\\"\\\"\\n\",\n        \"    Face detector with the Viola Jones method\\n\",\n        \"    \\\"\\\"\\\"\\n\",\n        \"    METHOD_NAME = \\\"viola_jones\\\"\\n\",\n        \"\\n\",\n        \"    def process(self):\\n\",\n        \"        # greyscale image for haar cascades\\n\",\n        \"        self.original = self.original.switch_color_space(\\\"GRAY\\\")\\n\",\n        \"        cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')\\n\",\n        \"\\n\",\n        \"        # face detections\\n\",\n        \"        faces = cascade.detectMultiScale(self.original.img, scaleFactor=1.1,\\n\",\n        \"                                         minNeighbors=5, minSize=(30, 30),\\n\",\n        \"                                         flags = cv2.cv.CV_HAAR_SCALE_IMAGE)\\n\",\n        \"\\n\",\n        \"        if DEBUG:\\n\",\n        \"            print(\\\"%s faces detected\\\" % len(faces))\\n\",\n        \"\\n\",\n        \"        # Bounding boxes are drawn around the faces on the resulting image.\\n\",\n        \"        for (x, y, w, h) in faces:\\n\",\n        \"            cv2.rectangle(self.result.img, (x, y), (x + w, y + h), (255, 0, 0), 2)\\n\",\n        \"        self.result.save()\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"def run_haar_cascade():\\n\",\n        \"    \\\"\\\"\\\"\\n\",\n        \"    Detects faces via haar cascades in all images.\\n\",\n        \"    \\\"\\\"\\\"\\n\",\n        \"    for img_name in chain(train_dataset(), test_dataset()):\\n\",\n        \"        _ = HaarCascadeFaceDetector(img_name)\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"def benchmark(Detector, extra_args, use_test_data=True):\\n\",\n        \"    \\\"\\\"\\\"\\n\",\n        \"    Run a benchmark of the detector passed in arg\\n\",\n        \"        \\\"\\\"\\\"\\n\",\n        \"    print(\\\"Benchmark started for %s(%s)\\\" % (Detector.__name__, extra_args))\\n\",\n        \"\\n\",\n        \"    true_positive_rates = []\\n\",\n        \"    false_positive_rates = []\\n\",\n        \"\\n\",\n        \"    for image_name in (test_dataset() if use_test_data else train_dataset()):\\n\",\n        \"        detector = Detector(\\n\",\n        \"            image_name, *extra_args) if extra_args else Detector(image_name)\\n\",\n        \"        true_positive_rate, false_positive_rate = detector.rates()\\n\",\n        \"        true_positive_rates.append(true_positive_rate)\\n\",\n        \"        false_positive_rates.append(false_positive_rate)\\n\",\n        \"\\n\",\n        \"    # tp: true positive / fp: false positive\\n\",\n        \"    # avg: average     / std: standard deviation\\n\",\n        \"    tp_avg = np.mean(true_positive_rates)\\n\",\n        \"    tp_std = np.std(true_positive_rates)\\n\",\n        \"    fp_avg = np.mean(false_positive_rates)\\n\",\n        \"    fp_std = np.std(false_positive_rates)\\n\",\n        \"\\n\",\n        \"    print(\\\"Benchmark finished for %s(%s)\\\" % (Detector.__name__, extra_args))\\n\",\n        \"\\n\",\n        \"    return tp_avg, tp_std, fp_avg, fp_std\\n\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"AXk0eyIno4Xm\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"The method is implemented with Opencv's haar cascade. We tested a few different parameters for this detector. Finally, we get an optimal result (see Figure) with a slight scaling of the image (10%), a minimum detection size of 30 pixels by 30 pixels and a minimum number of neighbors for the detection to be valid of 5.\\n\",\n        \"\\n\",\n        \"![res](https://i.ibb.co/R3PhwjP/8.png)\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"cqThgDJGmu6P\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"### **Deep CNN -based object detection**\\n\",\n        \"\\n\",\n        \"Convolutional neural networks (CNN) are particular deep neural network (DNN) structures since the basic operation has become a convolution rather than a matrix multiplication. These networks have been developed to take advantage of big data with a structure (spatial, temporal, ...) such as images, videos, etc. As shown in Figure 3, their functioning is straightforward and requires some convolution operations.  The output is obtained by convolving the input image by a fixed number of kernels. The output of a kernel is obtained by multiplying the current position of a sliding window (i.e. receptive field) applied to the image. Besides, pooling or subsampling layers are added to the basic operations. They allow to reduce the spatial size of the representation in this way, they allow controlling overfitting problems. \\n\",\n        \"\\n\",\n        \"**Figure 3:** A basic structure of CNN![CNN](https://miro.medium.com/max/1000/1*zNs_mYOAgHpt3WxbYa7fnw.png)\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"### **Use case 2:** CNN-based generic object detector\\n\",\n        \"\\n\",\n        \"**Deep Learning Framework:** [Pytorch](https://pytorch.org/) (An open source machine learning framework that accelerates the path from research prototyping to production deployment). Please follow the installation instructions on the framework's official [website](https://pytorch.org/).\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"**Architecture:** The CNN model consists of three convolutional layers and two fully connected layers. Each convolutional layer uses a kernel of size 5 with a stride of 1 and rectified linear units, ReLU, are used as the activation function. After each of the first two convolutional layers, a max-pooling layer of size 2 with a stride of 2 is used. The network was trained over 50 epochs using the stochastic gradient descent (SGD) optimizer. For the first 30 epochs, the learning rate is set to 0.0001 and then it is updated to 0.00001. \\n\",\n        \"\\n\",\n        \"The CNN implementation is as follows:\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"WiBuD8NtgZTW\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"import torch.nn as nn\\n\",\n        \"import torch.nn.functional as f\\n\",\n        \"class cnn_model(nn.Module):\\n\",\n        \"\\n\",\n        \"    def __init__(self):\\n\",\n        \"\\n\",\n        \"        super(cnn_model, self).__init__()\\n\",\n        \"\\n\",\n        \"        self.conv1 = nn.Conv2d(\\n\",\n        \"            in_channels=1,\\n\",\n        \"            out_channels=32,\\n\",\n        \"            kernel_size=5,\\n\",\n        \"            stride=1,\\n\",\n        \"            padding=0\\n\",\n        \"        )\\n\",\n        \"\\n\",\n        \"        self.conv2 = nn.Conv2d(\\n\",\n        \"            in_channels=32,\\n\",\n        \"            out_channels=64,\\n\",\n        \"            kernel_size=5,\\n\",\n        \"            stride=1,\\n\",\n        \"            padding=0\\n\",\n        \"        )\\n\",\n        \"\\n\",\n        \"        self.conv3 = nn.Conv2d(\\n\",\n        \"            in_channels=64,\\n\",\n        \"            out_channels=128,\\n\",\n        \"            kernel_size=5,\\n\",\n        \"            stride=1,\\n\",\n        \"            padding=0\\n\",\n        \"        )\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"        self.fc1 = nn.Linear(\\n\",\n        \"            in_features=18*18*128,\\n\",\n        \"            out_features=2046\\n\",\n        \"        )\\n\",\n        \"\\n\",\n        \"        self.fc2 = nn.Linear(\\n\",\n        \"            in_features=2046,\\n\",\n        \"            out_features=4\\n\",\n        \"        )\\n\",\n        \"\\n\",\n        \"    def forward(self, val):\\n\",\n        \"        val = f.relu(self.conv1(val))\\n\",\n        \"        val = f.max_pool2d(val, kernel_size=2, stride=2)\\n\",\n        \"        val = f.relu(self.conv2(val))\\n\",\n        \"        val = f.max_pool2d(val, kernel_size=2, stride=2)\\n\",\n        \"        val = f.relu(self.conv3(val))\\n\",\n        \"        val = val.view(-1, 18*18*128)\\n\",\n        \"        val = f.dropout(f.relu(self.fc1(val)), p=0.5, training=self.training)\\n\",\n        \"        val = self.fc2(val)\\n\",\n        \"\\n\",\n        \"        return val\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"vXGZsTKNhVku\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"Source code to learn the model:\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"vM_g3_yyhvvX\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"import torch\\n\",\n        \"import torch.nn as nn\\n\",\n        \"import torch.optim as optim\\n\",\n        \"from torch.utils.data import DataLoader\\n\",\n        \"import numpy as np\\n\",\n        \"import pandas as pd\\n\",\n        \"from functions import overlapScore\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"from cnn_model import *\\n\",\n        \"from training_dataset import *\\n\",\n        \"\\n\",\n        \"def train_model(net, dataloader, batchSize, lr, momentum):\\n\",\n        \"    criterion = nn.MSELoss()\\n\",\n        \"    optimization = optim.SGD(net.parameters(), lr=lr, momentum=momentum)\\n\",\n        \"    scheduler = optim.lr_scheduler.StepLR(optimization, step_size=30, gamma=0.1)\\n\",\n        \"\\n\",\n        \"    for epoch in range(50):\\n\",\n        \"\\n\",\n        \"        scheduler.step()\\n\",\n        \"\\n\",\n        \"        for i, data in enumerate(dataloader):\\n\",\n        \"            optimization.zero_grad()\\n\",\n        \"\\n\",\n        \"            inputs, labels = data\\n\",\n        \"\\n\",\n        \"            inputs, labels = inputs.view(batchSize,1, 100, 100), labels.view(batchSize, 4)\\n\",\n        \"\\n\",\n        \"            outputs = net(inputs)\\n\",\n        \"\\n\",\n        \"            loss = criterion(outputs, labels)\\n\",\n        \"            loss.backward()\\n\",\n        \"            optimization.step()\\n\",\n        \"\\n\",\n        \"            pbox = outputs.detach().numpy()\\n\",\n        \"            gbox = labels.detach().numpy()\\n\",\n        \"            score, _ = overlapScore(pbox, gbox)\\n\",\n        \"\\n\",\n        \"            print('[epoch %5d, step: %d, loss: %f, Average Score = %f' % (epoch+1, i+1, loss.item(), score/batchSize))\\n\",\n        \"\\n\",\n        \"    print('Finish Training')\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"if __name__ == '__main__':\\n\",\n        \"    # Hyper parameters\\n\",\n        \"    learning_rate = 0.0001\\n\",\n        \"    momentum = 0.9\\n\",\n        \"    batch = 100\\n\",\n        \"    no_of_workers = 2\\n\",\n        \"    shuffle = True\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"    trainingdataset = training_dataset()\\n\",\n        \"    dataLoader = DataLoader(\\n\",\n        \"        dataset=trainingdataset,\\n\",\n        \"        batch_size=batch,\\n\",\n        \"        shuffle=shuffle,\\n\",\n        \"        num_workers=no_of_workers\\n\",\n        \"    )\\n\",\n        \"\\n\",\n        \"    model = cnn_model()\\n\",\n        \"    model.train()\\n\",\n        \"\\n\",\n        \"    train_model(model, dataLoader, batch,learning_rate, momentum)\\n\",\n        \"    torch.save(model.state_dict(), './trained_CNN_model.pth')\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"02KjSj_7iFF6\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"Source code for handling the dataset (reading data samples):\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"UtzZlSuEictH\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"import numpy as np\\n\",\n        \"import pandas as pd\\n\",\n        \"import torch\\n\",\n        \"from torch.utils.data import Dataset, DataLoader\\n\",\n        \"\\n\",\n        \"class training_dataset(Dataset):\\n\",\n        \"    def __init__(self):\\n\",\n        \"      # Training set and corresponding ground truth images\\n\",\n        \"        trainX = np.asarray(pd.read_csv('./my_dataset/trainingData.csv', sep=',', header=None))\\n\",\n        \"        trainY = np.asarray(pd.read_csv('./my_dataset/ground-truth.csv', sep=',', header=None))\\n\",\n        \"        self.features_train = torch.Tensor(trainX)\\n\",\n        \"        self.groundTruth_train = torch.Tensor(trainY)\\n\",\n        \"\\n\",\n        \"        self.len = len(trainX)\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"    def __getitem__(self, item):\\n\",\n        \"        return self.features_train[item], self.groundTruth_train[item]\\n\",\n        \"\\n\",\n        \"    def __len__(self):\\n\",\n        \"        return self.len\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"rK5S_NLIjn9Y\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"The following pseudo-code entails a function to calculate the overlap rate taking into account the ground truth boxes and the predicted bounding boxes.\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"YWM0OdPHjpDl\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"import numpy as np\\n\",\n        \"\\n\",\n        \"def overlap(rect1, rect2):\\n\",\n        \"\\n\",\n        \"    avgScore = 0\\n\",\n        \"    scores = []\\n\",\n        \"\\n\",\n        \"    for i, _ in enumerate(rects1):\\n\",\n        \"\\n\",\n        \"        rect1 = rect1[i]\\n\",\n        \"        rect2 = rect2[i]\\n\",\n        \"\\n\",\n        \"        left = np.max((rect1[0], rect2[0]))\\n\",\n        \"        right = np.min((rect1[0]+rect1[2], rect2[0]+rect2[2]))\\n\",\n        \"\\n\",\n        \"        top = np.max((rect1[1], rect2[1]))\\n\",\n        \"        bottom = np.min((rect1[1]+rect1[3], rect2[1]+rect2[3]))\\n\",\n        \"\\n\",\n        \"        # area of intersection\\n\",\n        \"        i = np.max((0, right-left))*np.max((0,bottom-top))\\n\",\n        \"\\n\",\n        \"        # combined area of two rectangles\\n\",\n        \"        u = rect1[2]*rect1[3] + rect2[2]*rect2[3] - i\\n\",\n        \"\\n\",\n        \"        # return the overlap ratio\\n\",\n        \"        # value is always between 0 and 1\\n\",\n        \"        score = np.clip(i/u, 0, 1)\\n\",\n        \"        avgScore += score\\n\",\n        \"        scores.append(score)\\n\",\n        \"\\n\",\n        \"    return avgScore, scores\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"AyocdnccwjuL\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"### **Real-time object detection and segmentation with Tensorflow**\\n\",\n        \"The objective of this use case is to explain the real-time object detection and segmentation by an example. To do this, we will develop a real-time segmentation application with a simple webcam. We will use the [Tensorflow framework](https://www.tensorflow.org/), the Mask RCNN network learned with the COCO dataset; which allows us to detect up to 100 different types of objects.\\n\",\n        \"\\n\",\n        \" First of all, let's make a list of our tools and libraries to install.\\n\",\n        \" \\n\",\n        \"* Linux Ubuntu \\n\",\n        \"* Python\\n\",\n        \"* Tensorflow\\n\",\n        \"* Open CV\\n\",\n        \"\\n\",\n        \"In order to check if your computer is ready, open a python3 console in the terminal by typing python3. Do the following imports:\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"hsXW3Y8iyKGa\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"import cv2\\n\",\n        \"import numpy as np\\n\",\n        \"import tensorflow as tf\\n\",\n        \"from object_detection.utils import label_map_util\\n\",\n        \"from object_detection.utils import ops as utils_ops\\n\",\n        \"from object_detection.utils import visualization_utils as vis_util\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"ajRj5Dbfyecu\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"To make the model work, you need to load the network and its weights. You will find a list of all object detection models available with Tensorflow on this zoo model. For this tutorial, download mask_rcnn_resnet101_atrous_coco.\"\n      ]\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"ek6qk08Pyffo\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"We start with the last point: initialize the webcam. This allows two things: (1) to create the video stream and (2) to get the width and height of a frame of the stream in order to configure the output tensor of the mask.\\n\",\n        \" \"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"7w99Egz4yrvA\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"# Init the video stream (with the first plugged webcam)\\n\",\n        \"cap = cv2.VideoCapture(0)\\n\",\n        \"if cap.isOpened():\\n\",\n        \"  # get vcap property\\n\",\n        \"  global_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))\\n\",\n        \"  global_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"nY1oa5fMyvfL\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"The next step is to import the label_map file. It is done using methods delivered with Tensorflow's object_detection.\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"NV2FQ3uQy3WW\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"label_map = label_map_util.load_labelmap(\\\"PATH/TO/LABELS\\\")\\n\",\n        \"categories = label_map_util.convert_label_map_to_categories(\\n\",\n        \"  label_map, \\n\",\n        \"  max_num_classes=NUM_CLASSES,\\n\",\n        \"  use_display_name=True)\\n\",\n        \"category_index = label_map_util.create_category_index(categories)\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"RQ7xygEdy_Ap\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"We then proceed with the import of the model and the collection of the tensors.\\n\",\n        \" \"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"dfTxujJjzGK1\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"# Init TF Graph and get all needed tensors\\n\",\n        \"detection_graph = tf.Graph()\\n\",\n        \"with detection_graph.as_default():\\n\",\n        \"  # Init the graph\\n\",\n        \"  od_graph_def = tf.GraphDef()\\n\",\n        \"  with tf.gfile.GFile(\\\"/chemin/vers/*.pbb') as fid:\\n\",\n        \"    serialized_graph = fid.read()\\n\",\n        \"    od_graph_def.ParseFromString(serialized_graph)\\n\",\n        \"    tf.import_graph_def(od_graph_def, name='')\\n\",\n        \"\\n\",\n        \"  # Get all tensors\\n\",\n        \"  ops = tf.get_default_graph().get_operations()\\n\",\n        \"  all_tensor_names = {output.name for op in ops for output in op.outputs}\\n\",\n        \"  tensor_dict = {}\\n\",\n        \"  for key in ['num_detections', 'detection_boxes', 'detection_scores', 'detection_classes', 'detection_masks']:\\n\",\n        \"    tensor_name = key + ':0'\\n\",\n        \"      if tensor_name in all_tensor_names:\\n\",\n        \"        tensor_dict[key] = tf.get_default_graph().get_tensor_by_name(tensor_name)\\n\",\n        \"\\n\",\n        \"  # detection_masks tensor need ops\\n\",\n        \"  detection_boxes = tf.squeeze(tensor_dict['detection_boxes'], [0])\\n\",\n        \"  detection_masks = tf.squeeze(tensor_dict['detection_masks'], [0])\\n\",\n        \"  # Reframe is required to translate mask from box coordinates to image coordinates and fit the image size.\\n\",\n        \"  real_num_detection = tf.cast(tensor_dict['num_detections'][0], tf.int32)\\n\",\n        \"  detection_boxes = tf.slice(detection_boxes, [0, 0], [real_num_detection, -1])\\n\",\n        \"  detection_masks = tf.slice(detection_masks, [0, 0, 0], [real_num_detection, -1, -1])\\n\",\n        \"  detection_masks_reframed =  utils_ops.reframe_box_masks_to_image_masks(\\n\",\n        \"detection_masks, detection_boxes, global_height, global_width)\\n\",\n        \"  detection_masks_reframed = tf.cast(tf.greater(detection_masks_reframed, 0.5), tf.uint8)\\n\",\n        \"  # Follow the convention by adding back the batch dimension\\n\",\n        \"  tensor_dict['detection_masks'] = tf.expand_dims(detection_masks_reframed, 0)\\n\",\n        \"\\n\",\n        \"  image_tensor = tf.get_default_graph().get_tensor_by_name('image_tensor:0')\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"USBUtCurzMbv\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"Let's continue our program with the main method. In this method which is called after the initializations we just presented, we capture the last image of the webcam, we process it, we display the modified image and we start again. So the main method works like this:\\n\",\n        \"\\n\",\n        \" \"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"GGYtunLbzflm\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"if __name__ == '__main__':\\n\",\n        \"  # Do that here and save a lot of time\\n\",\n        \"  with detection_graph.as_default():\\n\",\n        \"    with tf.Session(graph=detection_graph) as sess:\\n\",\n        \"      while True:\\n\",\n        \"        # Get the last frame\\n\",\n        \"        frame = cap.read()[1]\\n\",\n        \"        # Process last img\\n\",\n        \"        new_frame = detect_objects(image_np, sess)\\n\",\n        \"        # Display the resulting frame\\n\",\n        \"        cv2.imshow('new_frame', new_frame)\\n\",\n        \"        if cv2.waitKey(1) & 0xFF == ord('q'):\\n\",\n        \"          break\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"wvcjTFG1ziiF\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"And so the core of the program is in the detect_objects() method which takes as arguments the image (in NumPy array format) and the Tensorflow session which will allow us to run our model.\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"6wVWXWvCztXn\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"def detect_objects(image_np, sess):\\n\",\n        \"  # Run inference\\n\",\n        \"  output_dict = sess.run(tensor_dict, feed_dict={image_tensor: np.expand_dims(image_np, 0)})\\n\",\n        \"\\n\",\n        \"  # all outputs are float32 numpy arrays, so convert types as appropriate\\n\",\n        \"  output_dict['num_detections'] = int(output_dict['num_detections'][0])\\n\",\n        \"  output_dict['detection_classes'] = output_dict['detection_classes'][0].astype(np.uint8)\\n\",\n        \"  output_dict['detection_boxes'] = output_dict['detection_boxes'][0]\\n\",\n        \"  output_dict['detection_scores'] = output_dict['detection_scores'][0]\\n\",\n        \"  output_dict['detection_masks'] = output_dict['detection_masks'][0]\\n\",\n        \"\\n\",\n        \"  # Display boxes and color pixels\\n\",\n        \"  vis_util.visualize_boxes_and_labels_on_image_array(\\n\",\n        \"    image_np,\\n\",\n        \"    output_dict['detection_boxes'],\\n\",\n        \"    output_dict['detection_classes'],\\n\",\n        \"    output_dict['detection_scores'],\\n\",\n        \"    category_index,\\n\",\n        \"    instance_masks=output_dict.get('detection_masks    use_normalized_coordinates=True)\\n\",\n        \"\\n\",\n        \"  return image_np\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    }\n  ],\n  \"metadata\": {\n    \"colab\": {\n      \"name\": \"Object detection based on  Deep Learning.ipynb\",\n      \"provenance\": [],\n      \"toc_visible\": true\n    },\n    \"kernelspec\": {\n      \"name\": \"python3\",\n      \"display_name\": \"Python 3\"\n    }\n  },\n  \"nbformat\": 4,\n  \"nbformat_minor\": 0\n}\n"
  },
  {
    "path": "content/inferno/computer-vision/introduction-to-computer-vision.ipynb",
    "content": "{\n  \"cells\": [\n    {\n      \"metadata\": {\n        \"id\": \"OmqAkANMsWql\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"# Introduction to Computer Vision using OpenCV and Python\\n\",\n        \"\\n\",\n        \"---\\n\",\n        \"\\n\",\n        \"![Introduction](https://i.ibb.co/L03Rvcq/introduction.jpg)\\n\",\n        \" \\n\",\n        \"In this guide, we will introduce a brief overview of Deep Learning. Then, we will discuss the purpose of Computer Vision in Python. After that, we' ll be taught the basics of dealing with data using OpenCV libraries by creating and displaying images. The fundamental tasks of Computer Vision such as object recognition and semantic segmentation will be explained. We will also cover the process of feature extraction, edge and face detection and object classification..\\n\",\n        \"\\n\",\n        \"## Prerequisites\\n\",\n        \"Before starting this guide, it is essential to be familiar with the basics of Python programming and Image Processing concepts.\\n\",\n        \"\\n\",\n        \"## Guide map\\n\",\n        \"We will provide a structured content according to the following map:\\n\",\n        \"\\n\",\n        \"1.\\tIntroduction;\\n\",\n        \"2. A brief introduction to Deep Learning;\\n\",\n        \"3.\\tComputer vision tasks;\\n\",\n        \"4.\\tComputer Vision Systems;\\n\",\n        \"5.\\tPython libraries for Computer Vision;\\n\",\n        \"6. OpenCV library on Windows and Ubuntu;\\n\",\n        \"7. Processing images with OpenCV;\\n\",\n        \"8. Use cases for Computer Vision;\\n\",\n        \"9. Conclusion.\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"## 1.\\tIntroduction: \\n\",\n        \"\\n\",\n        \"Computer Vision is a branch of Computer Science, which aims to build up intelligent systems that can understand the content in images as they are perceived by humans. The data may be presented in different modalities such as sequential (video) images from multiple sensors (cameras) or multidimensional data from a biomedical camera, and so on. It is the discipline that integrates the methods of acquiring, processing, analyzing and understanding large-scale images from the real world. It is also about depicting and reconstructing the world that we perceive in images, such as edge, lighting, color and pattern. The recognition of images, by decoding them into meaningful information from image-based data using models created by engineering, physics, statistics and learning theories. It is intended to simulate human vision, including the ability to learn, make decisions and react to actions based on visual information. Computer Vision is one aspect of Artificial Intelligence and Image Processing, which generally aims to simulate intelligent human capabilities. In computer Vision concept, object recognition is one of the fundamental tasks, which depends on how these objects are defined, whether in the form of images or video sequences, and human beings are able to recognize many entities, even if these objects, which are images, vary greatly in size and lighting.\\n\",\n        \"\\n\",\n        \"![Computer Vision](https://i.ibb.co/X5d74Ft/CVV.jpg)\\n\",\n        \"\\n\",\n        \"Some examples of Computer Vision applications:\\n\",\n        \"* Any application that can recognize objects or humans in an image;\\n\",\n        \"*  Automatic control applications (industrial robots, vehicles);\\n\",\n        \"*  Object construction models (industrial inspection, medical image analysis);\\n\",\n        \"*  Applications make it possible to track a moving object.\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"Useful books for learning various aspects of Computer Vision: [Multiple View Geometry in Computer Vision](http://www.robots.ox.ac.uk/~vgg/hzbook/),  [Computer Vision: Algorithms and Applications](http://szeliski.org/Book/)\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"VyNV5akJzJEP\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"## 2.\\tA brief introduction to Deep Learning\\n\",\n        \"\\n\",\n        \"### 2.1. What is Deep Learning?\\n\",\n        \"Deep Learning is an Machine Learning strategy that has greatly enhanced performance in many fields such as Computer Vision, Speech Recognition, Machine Tanslation, and so on.  The use of deep learning techniques, through raw data, allows many challenges to be solved in many economic sectors such as health, transport, finance, etc.\\n\",\n        \"\\n\",\n        \"The favourable conditions that allowed the rise of Deep Learning:\\n\",\n        \"\\n\",\n        \"*   Availability of very large spatio-temporal datasets (Big Data);\\n\",\n        \"*   Availability of high-performance computing (GPU);\\n\",\n        \"*   Flexibility of new training models (Deep Neural Networks).\\n\",\n        \"\\n\",\n        \"### 2.2. Deep Learning Frameworks\\n\",\n        \"\\n\",\n        \"In this section, we present the most popular frameworks for Deep Learning.\\n\",\n        \"\\n\",\n        \"| Framework | Features   | Supports languages |  Download     |\\n\",\n        \"|------|------|------|------|\\n\",\n        \"|   Tensorflow  |Highly flexible system architecture|  Python, C++ and R  | [here](https://www.tensorflow.org/)\\n\",\n        \"|   Caffe  |Speed, transposability and applicability in modelling Convolution Neural Networks (CNN)|  C, C++, Python, MATLAB  | [here](http://caffe.berkeleyvision.org/)\\n\",\n        \"|   CNTK  |Easy training and combination of popular model types across servers|  Python, C++ and the Command Line Interface  | [here](https://www.microsoft.com/en-us/cognitive-toolkit/)\\n\",\n        \"|   Torch/PyTorch  | The entire deep modeling process is far more simpler as well as transparent | Lua, Python    | [here](http://torch.ch/) or [here](http://pytorch.org/)\\n\",\n        \"|   Keras  | Provide a simplistic interface for the purpose of quick prototyping by constructing effective neural networks that can work with TensorFlow |Python    | [here](https://keras.io/) \"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"5PEB8FNsuEFX\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"## 3.\\tComputer vision tasks:\\n\",\n        \" \\n\",\n        \"In this section, we will successively examine some tasks of Computer Vision, in particular Image Recognition, Semantic Segmentation, Image Retrieval, Image Restoration, Object Recognition, Video Tracking, and so on.\\n\",\n        \"\\n\",\n        \"![CV tasks](https://i.ibb.co/NxVsrHf/cvt.jpg)\\n\",\n        \"\\n\",\n        \"### 3.1.\\t Image Recognition\\n\",\n        \"\\n\",\n        \"Traditionally, Computer Vision is about deciding whether or not the image contains an object. This task can be solved simply with little effort by human beings, but a certain activity is still not solved effectively and finely by computer in its general state. The only way to solve this issue is to find the best solutions to match certain features (edges, shapes, etc), and in some cases only, often with specific lighting conditions, a background and a certain position for the camera.\\n\",\n        \"\\n\",\n        \"#### Types of recognition:\\n\",\n        \"\\n\",\n        \"**A - Identification:**\\n\",\n        \"Predefined objects are often identified from different viewpoints of the camera in their different locations.\\n\",\n        \"\\n\",\n        \"**B - Selection:**\\n\",\n        \"Define a unique identifier in the shape. For example: identify a person's face or identify the specific type of a person or car.\\n\",\n        \"\\n\",\n        \"**C - Examination:**\\n\",\n        \"Image data is treated for a specific object. For example: check for the presence of diseased cells in medical form, check if a car is present on a highway.\\n\",\n        \"\\n\",\n        \"You will find here some projects and scripts based on Image Recognition task using a Deep Learning paradigm:\\n\",\n        \"\\n\",\n        \"- Fast MPN-COV: [here](https://github.com/jiangtaoxie/fast-MPN-COV);\\n\",\n        \"- Fine-Grained Representation Learning and Recognition by Exploiting Hierarchical Semantic Embedding: [here](https://github.com/HCPLab-SYSU/HSE); \\n\",\n        \"- Fine grained classification: [here](https://github.com/xcnkx/fine_grained_classification).\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"zrHJj09uvaWC\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"### 3.2.\\tImage Retrieval:\\n\",\n        \"Images stored in a visual dataset are retrieved based on the content as well as similar concepts of the database query where an image is inserted, and the output is a similar set of images. Content-based visual information retrieval is the implementation of the computer vision system in order to target images, i.e. the problem of retrieving images from large datasets. Image retrieval systems seek to find images similar to a query image among a dataset. The following figure represents the general process of retrieving images from content.\\n\",\n        \"\\n\",\n        \"![Image retrieval](https://i.ibb.co/VTLpZgD/SFS.jpg)\\n\",\n        \"\\n\",\n        \"You will find here some projects and scripts based on Image Retrieval tasks using a Deep Learning paradigm:\\n\",\n        \"\\n\",\n        \"- Deep Local Feature (DeLF): [here](https://github.com/nashory/DeLF-pytorch);\\n\",\n        \"- MILDNet: [here](https://github.com/gofynd/mildnet); \\n\",\n        \"- MultiGrain: [here](https://github.com/facebookresearch/multigrain).\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"Dq13xQrBwOvf\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"### 3.3.\\tImage Restoration:\\n\",\n        \"This is the process of restoring degraded images that cannot be recovered. Original images can be restored by prior-knowledge of damage or distortions that cause deterioration of images such as scratches, dust and stains. Restoration also includes images taken by sophisticated cameras that have been distorted due to the weather conditions in which they were taken, such as scanned images.\\n\",\n        \"\\n\",\n        \"You will find here some projects and scripts based on Image Restoration task using a Deep Learning paradigm:\\n\",\n        \"\\n\",\n        \"- Image Super Resolution using in Keras 2+: [here](https://github.com/titu1994/Image-Super-Resolution);\\n\",\n        \"- RED-net: [here](https://github.com/ved27/RED-net);\\n\",\n        \"- Noise2Noise: [here](https://github.com/NVlabs/noise2noise).\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"s6pzqNlKwaMf\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"### 3.4.\\tObject Recognition:\\n\",\n        \"It is a branch of Computer Vision dedicated to the detection of a particular object in an image or video. Humans can recognize many objects in images with little effort, although the image may differ slightly from different aspects, such as variations, or even when they are moved or rotated. Although humans can recognize objects when they are partially hidden, this task remains a challenge for computer vision systems. The  object recognition process is given by the following figure:\\n\",\n        \"\\n\",\n        \"![Object recognition](https://www.mathworks.com/content/mathworks/www/en/solutions/deep-learning/object-recognition/jcr:content/mainParsys/band_copy_1227855798_2052140687/mainParsys/columns_1606542234/2/image_copy_copy_copy.adapt.full.low.svg/1541451136966.svg)\\n\",\n        \"\\n\",\n        \"Unlike Machine Learning, the Deep Learning paradigm consists of an end-to-end feature representation learning from raw data without any prior data processing steps.\\n\",\n        \"\\n\",\n        \"You will find here some projects and scripts based on Object Recognition task using a Deep Learning paradigm:\\n\",\n        \"\\n\",\n        \"- TF-slim: [here](https://github.com/tensorflow/models/tree/master/research/slim);\\n\",\n        \"- DenseNet: [here](https://github.com/liuzhuang13/DenseNet);\\n\",\n        \"- DeepBeliefSDK: [here](https://github.com/jetpacapp/DeepBeliefSDK).\\n\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"3utQKUl1wotP\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"### 3.5. Semantic Segmentation\\n\",\n        \"Semantic segmentation is a Deep Learning algorithm that assigns a label or category for each pixel in an image. It makes it possible to recognize a set of pixels that are in distinct classes. For example, an autonomous vehicle must be able to recognize vehicles, pedestrians, traffic signs, sidewalks and other environmental components of the road network. Semantic segmentation is involved in a wide range of solutions such as computer-controlled driving, autonomous vehicles, diagnostic imaging, industrial controls, and so on. The splitting of images into two classes is a simple example of semantic segmentation. In fact, it has no restriction in terms of categories. The number of classes can be changed in order to classify image content. For example, the image could be segmented into 4 classes: person, sky, sea and background. The example in the following figure is based on ICCV 2015 paper [Conditional Random Fields as Recurrent Neural Networks](http://www.robots.ox.ac.uk/~szheng/papers/CRFasRNN.pdf), which utilizes deep learning techniques and probabilistic graphical models for semantic image segmentation. \\n\",\n        \"\\n\",\n        \"\\n\",\n        \"![Semantic Segmentation](https://i.ibb.co/gdWgGd4/ss.jpg)\\n\",\n        \"\\n\",\n        \"You will find here some projects and scripts based on Semantic Segmentation task using a Deep Learning paradigm:\\n\",\n        \"\\n\",\n        \"- PSPNet: [here](https://github.com/hszhao/PSPNet);\\n\",\n        \"- TorchSeg: [here](https://github.com/ycszen/TorchSeg);\\n\",\n        \"- Deeplab: [here](https://github.com/tensorflow/models/tree/master/research/deeplab).\\n\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"7G6p8zL4xIKC\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"### 3.6.\\tVideo Tracking\\n\",\n        \"It is the process of locating or tracking a moving object (or several moving objects) using static or mobile cameras, while having many uses, such as human-computer interaction, security, three-dimensional reality, medical images and video editing. Tracking can be time-consuming due to video content and the need to use complex algorithms to identify and track objects.\\n\",\n        \"Tracking aims to follow the desired object to be tracked in a sequence of successive images. Tracking is a difficult task when this object moves faster than the capture-rate of these successive images. It is even more difficult when this entity changes direction as it shifts. For this reason, tracking systems apply a motion model that explains how this object's image will change as it moves in different directions. The following figure illustrates the overall scheme of the object tracking process:\\n\",\n        \"\\n\",\n        \"![Object Tracking](https://i.ibb.co/hY5GhdB/track.jpg)\\n\",\n        \"\\n\",\n        \"You will find here some projects and scripts based on Video Tracking task using a Deep Learning paradigm:\\n\",\n        \"\\n\",\n        \"- GOT-10k Python Toolkit: [here](https://github.com/got-10k/toolkit);\\n\",\n        \"- SiamMask: [here](https://github.com/foolwood/SiamMask);\\n\",\n        \"- Deep SORT: [here](https://github.com/guanfuchen/deep_sort);\\n\",\n        \"- Object tracking (tutorial): [here](https://www.pyimagesearch.com/2018/07/30/opencv-object-tracking/).\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"9TF1Sp6PxcTf\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"## 4.\\tComputer Vision Systems\\n\",\n        \"Computer vision systems are very diverse and are divided into large and sophisticated systems that perform general and complete tasks as well as small systems that perform specific and simple ones. Most computer vision systems mainly include the following:\\n\",\n        \"\\n\",\n        \"### 4.1.\\tCollecting images\\n\",\n        \"\\n\",\n        \"The image is generated by using one or more image sensors. These include many digital camera sensors, distance sensors, radars, and ultrasonic cameras.  \\n\",\n        \"\\n\",\n        \"### 4.2.\\tPre-processing operations\\n\",\n        \"\\n\",\n        \"Before applying the computer vision algorithm in order to extract valuable information, it is necessary to perform prior data operations to ensure that the data are consistent with the algorithm's specific hypotheses. Some examples of these processes include:  \\n\",\n        \"\\n\",\n        \"1. Select the image resolution to confirm that its coordinate system is correct.\\n\",\n        \"2. Reduce the interference to ensure that the sensor does not provide inaccurate information.\\n\",\n        \"3. Increase the variance in order to ensure that the required information will be available.\\n\",\n        \"\\n\",\n        \"### 4.3.\\tFeatures extraction\\n\",\n        \"\\n\",\n        \"Visual data features are extracted at different levels of abstraction from data raw. These benchmarks are categorized into:\\n\",\n        \"1. Global features such as color and shape.\\n\",\n        \"2. Local features such as edges and points.\\n\",\n        \"More complex features related to colors and patterns can be obtained.\\n\",\n        \"\\n\",\n        \"### 4.4.\\tSegmentation\\n\",\n        \"All zones of the image can be recognized as important locations for subsequent operations. For example: select a set of key points, divide one or more images that contain the region of interest.\\n\",\n        \"3.5.\\tHigh-level processing operations\\n\",\n        \"At this stage, the input data consists of a small set of data, such as a set of points or a portion of the image that is suspected to contain the interest object. The other operations are:\\n\",\n        \"1. Ensure that the collected data are consistent with the hypotheses of the intended application.\\n\",\n        \"2. Evaluate the transaction values assigned to the request, such as steering or shape size.\\n\",\n        \"3. Classify the recognized objects into several classes\\n\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"cktRfUeFx_Xy\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"## 5.\\tPython libraries for Computer Vision\\n\",\n        \"The main toolkits for image processing in python are OpenCV, scikit-image and Pillow. The most general Python libraries (Numpy and Scipy) also provide some image processing tools. All these libraries can easily dialog with each other due to the common use of Numpy arrays to store images. A grayscale image is usually stored in a 2-dimensional integer or real value Numpy array with H rows and W columns (W=width,H=height). A color image is stored in a 3-dimensional Numpy array (H, W, 3).\\n\",\n        \"\\n\",\n        \"* OpenCV is a library that is written in C++, which is rich and widely used in computer vision.\\n\",\n        \"* [Pillow](http://pillow.readthedocs.org/en/latest/) is a PIL Fork (Python IMage Library). It is a library that is specific to Python, but is mainly written in C. It allows basic operations to be performed on images including read/write, transformations, histograms, filtering.\\n\",\n        \"* [Scikit-Imag](http://scikit-image.org/)e is a fairly recent and actively developed library. The advantage of this library is that it is written in Python and Cython (Python typed and compiled for acceleration) which makes it easy to read its code.\\n\",\n        \"*\\t[Scipy.ndimage](http://docs.scipy.org/doc/scipy/reference/ndimage.\\n\",\n        \"htm): Scipy's ndimage module provides a number of functions for shaping, interpolation, mathematical morphology and statistics.\\n\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"zIk09vPayrOn\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"## 6.\\t\\tOpenCV library on Windows and Ubuntu\\n\",\n        \"Gary Bradsky started OpenCV at Intel in 1999. Compatible with a variety of languages such as C++, Python, etc., OpenCV-Python is an API that allows OpenCV to simultaneously release the power of Python and C++ API. In the case of Python, it is a library of binaries intended to address computer vision challenges. This library is based on NumPy and its array structures. That means we can also integrate it easily into other libraries such as SciPy and Matplotlib.\\n\",\n        \"\\n\",\n        \"As we have explained previously, all operations on images are purely mathematical operations. But we can't say that programmers will do all these operations every time they use images, hence the development of OpenCV library, which includes functions that perform the most necessary operations in the images.\\n\",\n        \"\\n\",\n        \"### Windows:\\n\",\n        \"In order to download the Python program (x,y), click [here](https://python-xy.github.io/downloads.html, it’s possible to download each file individually).  First, download the following [file](https://drive.google.com/file/d/0B0kFf-FN5r9tS1EzSlppUGItNUU/view?usp=sharing) which contains the collection of the OpenCV library. Then, install the python program (x,y) as shown in the figures:\\n\",\n        \"![Windows](https://i.ibb.co/WgLMMHs/122.png)\\n\",\n        \"\\n\",\n        \"### Ubuntu:\\n\",\n        \"There are two ways to install OpenCV on Linux systems. The first one consists in installing pre-compiled files from repositories. For instance, in the case of the Ubuntu platform, it is sufficient to execute the following command:\\n\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"WYwqBYgvzzvg\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"sudo apt-get install libopencv-dev python-opencv\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"koAtONVGz2yX\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"The second method consists in compiling the source files immediately beforehand (this method allows you to obtain the latest version of the library).\\n\",\n        \"\\n\",\n        \"Open the terminal line and proceed as follows:\\n\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"rr05G_iDz6RP\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"sudo apt-get update \\n\",\n        \"sudo apt-get upgrade\\n\",\n        \"sudo apt-get install build-essential cmake git pkg-config\\n\",\n        \"sudo apt-get install libjpeg8-dev libtiff4-dev libjasper-dev libpng12-dev \\n\",\n        \"sudo apt-get install libatlas-base-dev gfortran\\n\",\n        \"# install Pip package \\n\",\n        \"wget https://bootstrap.pypa.io/get-pip.py \\n\",\n        \"sudo python get-pip.py\\n\",\n        \"sudo pip install virtualenv virtualenvwrapper \\n\",\n        \"sudo rm -rf ~/.cache/pip\\n\",\n        \"# virtualenv and virtualenvwrapper \\n\",\n        \"export WORKON_HOME=$HOME/.virtualenvs source /usr/local/bin/virtualenvwrapper.sh\\n\",\n        \"source ~/.bashrc\\n\",\n        \"mkvirtualenv cv\\n\",\n        \"# Install Python2.7 \\n\",\n        \"sudo apt-get install python2.7-dev\\n\",\n        \"# Install Numby libraries\\n\",\n        \"pip install numpy\\n\",\n        \"# Download OpenCV library\\n\",\n        \"\\n\",\n        \"cd ~ \\n\",\n        \"git clone https://github.com/Itseez/opencv.git \\n\",\n        \"cd opencv \\n\",\n        \"git checkout 3.0.0\\n\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"S__70Mvu0JYp\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"After that, try downloading the opencv_contrib package. It will be used to use some features such as SIFT, SURF, which were in the OpenCV 2.4.2 library, and then deleted in OpenCV 3.0.\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"cu2qCiI90KYK\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"cd ~ \\n\",\n        \"git clone https://github.com/Itseez/opencv_contrib.git \\n\",\n        \"cd opencv_contrib\\n\",\n        \"git checkout 3.0.0\\n\",\n        \"cd ~/opencv \\n\",\n        \"mkdir build \\n\",\n        \"cd build\\n\",\n        \"cmake -D CMAKE_BUILD_TYPE=RELEASE \\\\ -D CMAKE_INSTALL_PREFIX=/usr/local \\\\ -D INSTALL_C_EXAMPLES=ON \\\\ -D INSTALL_PYTHON_EXAMPLES=ON \\\\ -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \\\\ -D BUILD_EXAMPLES=ON ..\\n\",\n        \"make\\n\",\n        \"sudo make install\\n\",\n        \"sudo ldconfig\\n\",\n        \"cd ~/.virtualenvs/cv/lib/python2.7/site-packages/ \\n\",\n        \"ln -s /usr/local/lib/python2.7/site-packages/cv2.so cv2.so\\n\",\n        \"\\n\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"0SAAY5fQd0iI\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"## 7. Processing images with OpenCV\\n\",\n        \"\\n\",\n        \"Now we have successfully installed OpenCV, let's start by doing it.\\n\",\n        \"\\n\",\n        \"### 7.1. Reading images in Python\\n\",\n        \"\\n\",\n        \"To read an image, we have the ` imread ()` function. It should be mentioned that previously, we have moved to the directory that contains the image.\\n\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"Vu3cyESDeIn_\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"img = cv2.imread ('img.jpg')\\n\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"2Z9OfGtkeSzI\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"As an alternative, it is also possible to pass a value for a flag, which is the second argument\\n\",\n        \"\\n\",\n        \"cv2.IMREAD_COLOR: For loading a color image by overlooking existing transparency;\\n\",\n        \"cv2.IMREAD_GRAYSCALE: For loading a grayscale image;\\n\",\n        \"cv2.IMREAD_UNCHANGED: For loading an image that includes an alpha channel\\n\",\n        \"It is possible to use integers 1, 0 or -1:\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"zB8tW_3ceU7o\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"img = cv2. imread ('img.jpg', 0)\\n\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"oUBkmlUUeYCF\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"Note that sending an invalid image path does not result in any errors.\\n\",\n        \"\\n\",\n        \"### 7.2. Displaying images in Python\\n\",\n        \"\\n\",\n        \"The `cv2.imshow ()` function enables to display an image in a frame that can be adjusted to its size. The first argument is the name of the frame and the second one is the image.\\n\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"ClkgZCvhehgG\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"\\n\",\n        \"img = cv2. imread ('img.jpg')\\n\",\n        \"cv2.imshow('Images', img)\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"9jG40wsVejLm\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"Note that we have two frames at once as we have not attempted to title them in the same way. `cv2.destroyAllWindows ()` function is another function that destroys all the frames that we have already created. `cv2.destroyWindow ()` also destroys a specific frame.\\n\",\n        \"\\n\",\n        \"### 7.3. Creating images in Python\\n\",\n        \"\\n\",\n        \"To do this, there is the ` cv2.imwrite ()`function. The first argument is the file name and the second one is the image to be saved.\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"srTWfL38e6aO\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"cv2.imwrite('img_gray.png', img)\\n\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"kzEjMU7ke681\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"This will store the grayscale image named \\\"img_gray.png\\\" in the current location.\\n\",\n        \"\\n\",\n        \"### 7.4. Displaying images using Matplotlib\\n\",\n        \"\\n\",\n        \"By using [Matplotlib](https://matplotlib.org/index.html) library, we can display that image.\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"s7XZT_McfGJH\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"import matplotlib.pyplot as plt\\n\",\n        \"plt.imshow(img, cmap = \\\"gray\\\", interpolation = \\\"bilinear\\\")\\n\",\n        \"plt.xticks([]), pl.ticks ([])\\n\",\n        \"(([], ), ([], ))\\n\",\n        \"plt.display ()\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"EVqyYGe5fHwf\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"\\n\",\n        \"### 7.5. Core operations on images\\n\",\n        \"\\n\",\n        \"Let's now look at the basic operations applicable on the image.\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"ia5rzt_cfMJi\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"import cv2\\n\",\n        \"img = cv2.imread ('img.jpg')\\n\",\n        \"y, x = 100,50\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"FmrfgC9AfN9_\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"Reading of color values at positions y, x:\\n\",\n        \"\\n\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"arC6GdqpfP68\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"(b, g, r) = img[y,x]\\n\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"mwa-7_0ufRRF\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"Region of interest at (x, y) whose dimensions are 100x100:\\n\",\n        \"\\n\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"B1YJOQ9YfT7c\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"roi = img[y:y+100,x:x+100] \\n\",\n        \"cv2.imshow ('image', img)\\n\",\n        \"cv2.imshow('ROI', roi)\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"yHVyOsVefVyp\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"Pixelization of the new color :\\n\",\n        \"\\n\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"rxmt6fXnfXcO\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"\\n\",\n        \"roi[:,:]= (55,44,87) \\n\",\n        \"cv2.imshow('New image', img)\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"IOsx9s8Pf0ZE\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"## 8. Use cases for Computer Vision\\n\",\n        \"In this section, we will look at some tasks related to computer vision such as *edge detection, face detection, *feature detection and description, object classification performed by OpenCV and Python.\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"### 8.1.Edge detection \\n\",\n        \"In OpenCV we can choose only to display the edges of objects with the `Canny ()` function:\\n\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"sI-NcW48f56o\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"import numpy as np\\n\",\n        \"img = cv2.imread('img.jpg')\\n\",\n        \"cv2.imwrite ('edge_img.jpg', cv2.Canny (img, 512, 415))\\n\",\n        \"cv2.imshow ('edges', cv2.imread('edge_img.jpg'))\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"3MwM6bgwf7an\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"### 8.2. Face detection\\n\",\n        \"\\n\",\n        \"OpenCV will also enable to detect faces in images. Let's now use Haar's cascading classifier.\\n\",\n        \"\\n\",\n        \"Now, there is one last point that we would really like to address, and that is the face detection. The Haar classifier is used. It is a matter of locating the position of faces in an image in order to standardize the size of the face area.\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"TbvZE86RgGl3\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"import sys, os\\n\",\n        \"import cv2\\n\",\n        \"  \\n\",\n        \"def face_detection(image, image_out, show = False):\\n\",\n        \"    # Load the image in memory\\n\",\n        \"    img = cv2.imread(image)\\n\",\n        \"    # Load the face detection model\\n\",\n        \"    face_model = cv2.CascadeClassifier(\\\"haarcascade_frontalface_alt2.xml\\\")\\n\",\n        \"     \\n\",\n        \"     \\n\",\n        \"    # detection of the face(s)\\n\",\n        \"    faces = face_model.detectMultiScale(img)\\n\",\n        \"     \\n\",\n        \"    # we place a bounding boxe around the faces\\n\",\n        \"    print (\\\"number of faces\\\", len(faces), \\\"image size\\\", img.shape, \\\"image\\\", image)\\n\",\n        \"    for face in faces:\\n\",\n        \"        cv2.rectangle(img, (face[0], face[1]), (face[0] + face[2], face[0] + face[3]), (255, 0, 0), 3)\\n\",\n        \"         \\n\",\n        \"    # we store the final result\\n\",\n        \"    cv2.imwrite(image_out, img)\\n\",\n        \"     \\n\",\n        \"    # to see the image, press ESC to exit\\n\",\n        \"    if show :\\n\",\n        \"        cv2.imshow(\\\"face\\\",img)\\n\",\n        \"        if cv2.waitKey(5000) == 27: cv2.destroyWindow(\\\"face\\\")\\n\",\n        \"   \\n\",\n        \"if __name__ == \\\"__main__\\\":\\n\",\n        \"    # wall lamp \\n\",\n        \"    for file in os.listdir(\\\".\\\"\\\") :\\n\",\n        \"        if file.startswith(\\\"face\\\") : continues # already processed\\n\",\n        \"        if os.path.splitext(file)[-1].lower() in [\\\".jpg\\\",\\\".jpeg\\\",\\\".png\\\" ] :\\n\",\n        \"            face_detect (file, \\\"face_\\\" + file)\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"OZtycY15gLSv\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"As you can see, it drew a blue square (bounding boxe) around the face in the image.\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"wrce4QQ80YBa\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"### 8.3.\\tFeature Detection and Description\\n\",\n        \"In this section, we will present a brief description of the SIFT (Scale-Invariant Feature Transform) algorithm. \\n\",\n        \" The main idea of this approach is to transform an image into feature vectors (feature maps), which should ideally be invariant to geometric transformations (rotation and scaling). This involves the detection of interest points, which will make it possible to detect an object. The detection of these points leads to the implementation of feature vectors whose components are specific to the point under consideration.\\n\",\n        \" \\n\",\n        \"\\n\",\n        \"***SIFT in OpenCV and Python:***\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"rNTXBl4B0q6Z\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"import cv2\\n\",\n        \"import numpy as np\\n\",\n        \"\\n\",\n        \"img = cv2.imread('my_img.jpg')\\n\",\n        \"gray= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)\\n\",\n        \"\\n\",\n        \"sift = cv2.SIFT()\\n\",\n        \"kp = sift.detect(gray,None)\\n\",\n        \"\\n\",\n        \"img=cv2.drawKeypoints(gray,kp)\\n\",\n        \"\\n\",\n        \"cv2.imwrite('sift_img.jpg',img)\\n\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"TYWymgUI0tyQ\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"### 8.4.\\tObject Classification\\n\",\n        \"To correctly identify an object in an image, it may be interesting to simply detect its edges and shapes when extracting features.\\n\",\n        \"How will we proceed to recognize objects?\\n\",\n        \"These are the 3 steps that we will perform: (1) extracting features in the image, (2) estimating each feature and (3) classifying of edges.\\n\",\n        \"* Let's start by importing and loading an image.\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"\\n\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"P4nlnByg02do\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"import numpy as np \\n\",\n        \"import cv2 \\n\",\n        \"image = cv2.imread('my_image.bmp')\\n\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"i18X_cDl07Aq\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"* Step 1: Edge detection\\n\",\n        \"In order to improve edge detection, we will convert the color image to grayscale before performing a thresholding.\\n\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"W-KDt17J1FYg\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)\\n\",\n        \"ret,thresh = cv2.threshold(gray,250,255,cv2.THRESH_BINARY_INV)\\n\",\n        \"\\n\",\n        \"img,edges,h=cv2.findEdges(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)\\n\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"iIROM1FR1HvM\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"* Step 2: Edge estimation\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"OIYl__da1OmC\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"for cnt in edges:\\n\",\n        \"perimeter =cv2.arcLength(cnt,True)\\n\",\n        \"approx = cv2.approxPolyDP(cnt,0.01* perimeter,True)\\n\",\n        \"\\n\",\n        \"M = cv2.moments(cnt)\\n\",\n        \"cX = int(M[\\\"m10\\\"] / M[\\\"m00\\\"])\\n\",\n        \"cY = int(M[\\\"m01\\\"] / M[\\\"m00\\\"])\\n\",\n        \"cv2.drawEdges(image,[cnt],-1,(0,255,0),2)\\n\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"8snGzFoo1Sec\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"* Step 3 : Pattern classification\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"JxtYXTKq1WkN\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"All you need to do is to recall how many peaks there are in each shape.\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"RVRgjJe11ZLD\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"if len(approx)==3:\\n\",\n        \"shape = \\\"triangle\\\"\\n\",\n        \"elif len(approx)==4:\\n\",\n        \"(x, y, w, h) = cv2.boundingRect(approx)\\n\",\n        \"ratio = w / float(h)\\n\",\n        \"if ratio >= 0.95 and ratio <= 1.05:\\n\",\n        \"shape = \\\" square\\\"\\n\",\n        \"else:\\n\",\n        \"shape = \\\"rectangle\\\"\\n\",\n        \"elif len(approx)==5:\\n\",\n        \"shape = \\\" pentagon\\\"\\n\",\n        \"elif len(approx)==6:\\n\",\n        \"shape = \\\" hexagon \\\"\\n\",\n        \"else:\\n\",\n        \"shape= \\\"circle\\\"\\n\",\n        \"cv2.putText(image, shape, (cX, cY), cv2.FONT_HERSHEY_SIMPLEX,0.5, (255, 255, 255), 2)\\n\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"XwA6Ph0u1ct4\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"We just have to display the result to check out our work:\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"N54tEW351emc\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"cv2.imshow('Final_image',image)\\n\",\n        \"cv2.waitKey(0)\\n\",\n        \"cv2.destroyAllWindows()\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"J1DxqSPp4yF1\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"## 9. Conclusions\\n\",\n        \"\\n\",\n        \"In this guide, we discussed the topic of Computer Vision using OpenCV and Python. We presented some fundamental tasks of Computer Vision such as Object Recognition and Semantic Segmentation. We also examined some case studies about the process of edge and face detection, feature extraction and object classification.\"\n      ]\n    }\n  ],\n  \"metadata\": {\n    \"colab\": {\n      \"name\": \"Introduction to Computer Vision using OpenCV and Python.ipynb\",\n      \"version\": \"0.3.2\",\n      \"provenance\": [],\n      \"collapsed_sections\": []\n    },\n    \"kernelspec\": {\n      \"name\": \"python3\",\n      \"display_name\": \"Python 3\"\n    }\n  },\n  \"nbformat\": 4,\n  \"nbformat_minor\": 0\n}"
  },
  {
    "path": "content/inferno/computer-vision/object-instance-segmentation.ipynb",
    "content": "{\n  \"cells\": [\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"s7QFZ6ztHsSC\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"# Object Instance Segmentation using TensorFlow Framework and Cloud GPU Technology\\n\",\n        \"\\n\",\n        \"![](https://i.ibb.co/SPJWCgc/zzed.jpg)\\n\",\n        \"---\\n\",\n        \"In this guide, we will discuss a Computer Vision task: Instance Segmentation. Then, we will present the purpose of this  task  in TensorFlow Framework. Next, we will provide a brief overview of Mask R-CNN network (state-of-the-art model for Instance Segmentation). We also offer a demonstration on Mask R-CNN  model using a jupyter notebook environment: Google Colab \\n\",\n        \"\\n\",\n        \"## What is Instance Segmentation?\\n\",\n        \"\\n\",\n        \"On the one hand, the Semantic Segmentation (SS) task is one of the Computer Vision task which consists in assigning to each pixel a label among a set of semantic categories. \\n\",\n        \"\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"![](https://i.ibb.co/L6TLXFQ/22E2.jpg)\\n\",\n        \"\\n\",\n        \"Ultimately, it is intended to predict a segmentation mask that indicates the category of each pixel. These pixels are classified starting from high-quality feature representations. On the other hand, Instance Segmentation (IS) is based on Semantic Segmentation techniques. It permits to recognize each object instance per pixel for each detected object. These labels are maintained by instance.\\n\",\n        \"\\n\",\n        \"The common applications and use cases that take place using the Semantic / Instance Segmentation task are the following: \\n\",\n        \"- Autonomous navigation;\\n\",\n        \"- Facial Segmentation;\\n\",\n        \"- Categorizing clothing items;\\n\",\n        \"- Precision Agriculture.\\n\",\n        \"- Etc\\n\",\n        \" \\n\",\n        \"For more details, you can look at two use cases related to Semantic Segmentation challenge:\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"**Use case 1: **[Semantic Segmentation for Autonomous vehicles](https://blog.playment.io/semantic-segmentation-for-autonomous-vehicles/)\\n\",\n        \"\\n\",\n        \"**Use case 1: **[Semantic Segmentation for Facial recognition](https://blog.playment.io/improve-facial-recognition-using-semantic-segmentation-landmark-annotation/)\\n\",\n        \"\\n\",\n        \"Examples of Instance Segmentation projects and tutorials:\\n\",\n        \"\\n\",\n        \"- [Instance segmentation with OpenCV](https://www.pyimagesearch.com/2018/11/26/instance-segmentation-with-opencv/)\\n\",\n        \"\\n\",\n        \"- [ Instance Segmentation by Deep Coloring](https://github.com/kulikovv/DeepColoring)\\n\",\n        \"\\n\",\n        \"- [How to do Semantic Segmentation using Deep learning](https://medium.com/nanonets/how-to-do-image-segmentation-using-deep-learning-c673cc5862ef)\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"Useful books for learning various aspects of Instance Segmentation: \\n\",\n        \"1. Practical Convolutional Neural Networks: Implement advanced deep learning models using Python: [Here](https://www.amazon.com/Practical-Convolutional-Neural-Networks-Implement/dp/1788392302)\\n\",\n        \"2. Deep Learning for Computer Vision: [Here](https://)\\n\",\n        \"\\n\",\n        \"## TensorFlow Framework for Deep Learning\\n\",\n        \"\\n\",\n        \"[TensorFlow](https://www.tensorflow.org/) is an integral open source platform for Machine Learning. It has a scalable and exhaustive environment consisting of tools, libraries and community resources that provide researchers and developers the ability to easily develop and deploy applications based on ML technology. The main features of TensorFlow are illustrated in the Figure below:\\n\",\n        \"\\n\",\n        \"![](https://d2h0cx97tjks2p.cloudfront.net/blogs/wp-content/uploads/sites/2/2018/07/Tensorflow-Features.jpg)\"\n      ]\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"O3JYSxvKQ5H_\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"## Prerequisites\\n\",\n        \"Before starting this guide, it is essential to be familiar with the basics of Python programming, Computer Vision concepts, Deep Learning Libraries (TensorFlow + Keras Framework), and OpenCV library.\"\n      ]\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"ExHZadHFRc1A\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"## Guide map\\n\",\n        \"The content of this guide will be organized according to the following map:\\n\",\n        \"\\n\",\n        \"* What is Instance Segmentation?;\\n\",\n        \"* TensorFlow Framework for Deep Learning\\n\",\n        \"* An overview of Mask R-CNN model for Instance Segmentation;\\n\",\n        \"* Using Google Colab with GPU (enabled);\\n\",\n        \"* Mask R-CNN : Demonstration.\\n\",\n        \"* References.\\n\",\n        \" \"\n      ]\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"SMyycVuaRh6_\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"## An overview of Mask R-CNN model for Instance Segmentation\\n\",\n        \"\\n\",\n        \"Thanks to Mask R-CNN, we can automatically segment and construct pixel masks for each object in input image. We will apply Mask R-CNN  to  visual data such as images and videos.\\n\",\n        \"Mask R-CNN algorithm was presented by He et al[1]. In fact, It builds on previous object detection works, by R-CNN (2013)[2], Fast R-CNN (2015)[3] and Faster R-CNN (2015)[4] respectively. Mask R-CNN not only generates the bounding box for a detected object, but also generates a predictive mask.\\n\",\n        \"\\n\",\n        \"Mask R-CNN model is based on Faster R-CNN architecture with 2 major contributions:\\n\",\n        \"\\n\",\n        \"1. Replacement of the ROI Pooling module by a more precise module named *ROI Align*;\\n\",\n        \"2. Inserting an additional branch from the ROI Align module.\\n\",\n        \"\\n\",\n        \"This additional branch takes the output of the ROI Align and then sends it into two  convolution layers (CONV). The output of the convolution layers (CONV) is the predicted mask itself. \\n\",\n        \"In the following figure, we can see the block diagram  of Mask R-CNN:\\n\",\n        \"\\n\",\n        \"![Mask R-CNN](https://www.pyimagesearch.com/wp-content/uploads/2018/11/mask_rcnn_mask_resizing.jpg)\\n\",\n        \"\\n\",\n        \"## Using Google Colab with GPU (enabled)\\n\",\n        \"\\n\",\n        \"Google Colab has been developped to facilitate collaboration between Machine Learning professionals in a more transparent way.\\n\",\n        \"\\n\",\n        \"Sign in to your Google Gmail account in the top right corner, if you haven't already done so. It\\n\",\n        \"will ask you to open it with Colab at the top of the screen. Then you will make a copy so that you can edit it.\\n\",\n        \"\\n\",\n        \"![](https://i.ibb.co/pzH18dw/1.png)\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"It is now possible to click on \\\"*Runtime*\\\" menu button to select the Python version and use GPU/CPU device to speed up the calculation.\\n\",\n        \"\\n\",\n        \"![](https://i.ibb.co/T1JFqCf/2.png)\\n\",\n        \"\\n\",\n        \"Now, everything is ready for the environment.\"\n      ]\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"aRJJXhQmXFNY\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"### Verification  that TensorFlow is able to detect the GPU device:\\n\",\n        \"\\n\",\n        \"Just select \\\"GPU\\\" from the Notebook Settings Accelerator drop-down menu (via Edit menu or  cmd/ctrl-shift-P command).\\n\",\n        \"\\n\",\n        \"Execute this psedo-code to confirm that TensorFlow can detect the GPU:\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"Oh2w3SQBX4dA\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"import tensorflow as tf\\n\",\n        \"device_name = tf.test.gpu_device_name() \\n\",\n        \"if device_name != '/device:GPU:0':\\n\",\n        \"raise SystemError('GPU device is not detected') \\n\",\n        \"print('Detected GPU at: {}'.format(device_name))\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"qtNjNnbTYSWC\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"It's coming out:\\n\",\n        \"\\n\",\n        \"`Found GPU at: /device:GPU:0`\\n\",\n        \"\\n\",\n        \"If you are interested in the type of GPU being used. It's a Nvidia Tesla K80 with 24G of memory. Quite powerful.\\n\",\n        \"\\n\",\n        \"Run this code to find out for yourself.\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"b-_yVJ8HY9Ry\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"from tensorflow.python.client import device_lib \\n\",\n        \"device_lib.list_local_devices()\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"KPRodnl0ZFUP\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"It's coming out:\\n\",\n        \"\\n\",\n        \"`physical_device_desc: \\\"device: 0, name: Tesla K80, pci bus id: 0000:00:04.0, compute capability: 3.7\\\"]`\"\n      ]\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"oFfV3KU1ZKqH\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"## Mask R-CNN : Demonstration\\n\",\n        \"\\n\",\n        \"This section provides an implementation of Mask R-CNN on Keras+TensorFlow Framework. \\n\",\n        \"\\n\",\n        \"### 1. Installing dependencies and running the demo \\n\",\n        \"\\n\",\n        \"Mask R-CNN has some dependencies to install before you can run the demo. Colab allows you to install Python packages via the `pip` command, and general Linux packaging/libraries via the ` apt-get` command.\\n\",\n        \"\\n\",\n        \"In case you haven't heard yet. Your current instance of Google Colab runs on an Ubuntu virtual machine. You can execute almost all the Linux commands that you usually do on a Linux machine.\\n\",\n        \"Mask R-CNN depends on [`pycocotools`](https://pypi.org/project/pycocotools/) package, you can install it with the following commands:\\n\",\n        \"\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"6i5_N3Yjb2gI\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"!pip install Cython\\n\",\n        \"!git clone https://github.com/waleedka/coco\\n\",\n        \"!pip install -U setuptools\\n\",\n        \"!pip install -U wheel\\n\",\n        \"!make install -C coco/PythonAPI\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"7Stzjs90b3zr\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"It clones GitHub's repository. Install the compilation dependencies. Finally, compile and install the coco API library. All this happens in the cloud virtual machine quite quickly.\\n\",\n        \"\\n\",\n        \"You are now ready to clone the Mask R-CNN directory of GitHub and access into this directory.\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"6_zLtdwWcp9X\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"!git clone https://github.com/matterport/Mask_RCNNN\\n\",\n        \"# cd to the reference directory and possibility to download the pre-trained weight. \\n\",\n        \"import os\\n\",\n        \"os.chdir('./Mask_RCNN')\\n\",\n        \"!wget https://github.com/matterport/Mask_RCNNN/releases/download/v2.0/mask_rcnn_coco.h5\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"nI1lGdSxdC9f\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"Note that you change directories with the Python script instead of executing a `cd` shell command since you execute Python in the current notebook.\\n\",\n        \"\\n\",\n        \"Now you can run the demo of Mask R-CNN on Colab, as you would on a local machine.\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"Follow the below Python codes in order to familiarize yourself with the use of a pre-trained model for detecting and segmenting objects. All psedo-codes will be commented on.\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"hkyHh46gekfx\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"#import of the necessary packages\\n\",\n        \"import os \\n\",\n        \"import sys \\n\",\n        \"import random \\n\",\n        \"import math\\n\",\n        \"import numpy as np \\n\",\n        \"import skimage.io \\n\",\n        \"import matplotlib\\n\",\n        \"import matplotlib.pyplot as plt \\n\",\n        \"import coco\\n\",\n        \"import utils\\n\",\n        \"import visualize\\n\",\n        \"%matplotlib inline\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"1WofmwQ2etJ3\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"# Root directory of the project \\n\",\n        \"ROOT = os.getcwd()\\n\",\n        \"# Directory to save the trained model and logs files\\n\",\n        \"MODEL= os.path.join(ROOT, \\\"logs\\\")\\n\",\n        \"# Local path to trained weights file\\n\",\n        \"COCO_MODEL = os.path.join(ROOT, \\\"mask_rcnn_coco.h5\\\") \\n\",\n        \"# Download COCO trained weights\\n\",\n        \"if not os.path.exists(COCO_MODEL): utils.download_trained_weights(COCO_MODEL)\\n\",\n        \"# Image directory to be detected\\n\",\n        \"IMAGE = os.path.join(ROOT, \\\"images\\\")\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"pErwlnMNf5Wa\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"### 2. Model configurations\\n\",\n        \"\\n\",\n        \"We will use a model trained on the [MS-COCO dataset](http://cocodataset.org/) (It is a large-scale object detection, segmentation, and captioning dataset). The model configurations are in ` CocoConfig class` of coco.py file.\\n\",\n        \"\\n\",\n        \"Make slight changes to the configurations depending on the task. To do this, subclassify the CocoConfig class and replace its attributes that you need to modify.\\n\",\n        \"\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"0iJ4dYkSg5cI\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"class InferenceConfig(coco.CocoConfig):\\n\",\n        \"# Set the batch size to 1 as we will perform the inference on 1 image at a time. Batch size = GPU_NB * IMAGES_PER_GPU \\n\",\n        \"GPU_NB = 1\\n\",\n        \"IMAGES_PER_GPU = 1\\n\",\n        \"config = InferenceConfig() \\n\",\n        \"config.display()\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"_S0AXek0hqmK\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"### 3. Building models and importing trained weights\\n\",\n        \"\\n\",\n        \"In order to create models and load trained weights , please type the following psedo-codes:\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"82VyMN90iH0J\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"# Create model \\n\",\n        \"model = modellib.MaskRCNN(mode=\\\"inference\\\", model_dir=MODEL, config=config)\\n\",\n        \"\\n\",\n        \"# Load COCO trained weights\\n\",\n        \"model.load_weights(COCO_MODEL, by_name=True)\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"ZcjpyPT-iYlT\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"### 4. Data preparation: MS-COCO dataset\\n\",\n        \"\\n\",\n        \"The model classifies objects and returns class IDs, which are integer values that identify each class. Some datasets assign integer values to their classes and others do not. For example, in the MS-COCO dataset, the \\\"person\\\" class is 1. IDs are often sequential, but not always. The COCO dataset, for example, has classes associated with class IDs of classes 70 and 72, but not 71.\\n\",\n        \"\\n\",\n        \"To get the list of class names, you can load the dataset and then use the `class_names` property like this:\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"kGP3iqPhjBsY\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"# Loading MS-COCO dataset\\n\",\n        \"dataset = coco.CocoDataset() \\n\",\n        \"dataset.load_coco(COCO_DIR, \\\"train\\\")\\n\",\n        \"dataset.prepare()\\n\",\n        \"# Print class names\\n\",\n        \"print(dataset.class_names)\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"VGHQAwAKjRir\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"You have included the list of class names below. The name index of the class in the list represents its ID (first class is 0, second is 1, etc.)\\n\",\n        \"\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"2KqxRF7rjlxE\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"# COCO Class names by indexes\\n\",\n        \"class_names = ['BG','person','bicycle','car','motorcycle','airplane','bus','train','truck','boat','traffic light']\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"TWRH2AiBj-TA\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"### 5. Starting object detection process\\n\",\n        \"\\n\",\n        \"To perform object detection, just type the following psedo-codes:\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"Dryw6gJrkPkB\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"# Loading a random image from the dataset\\n\",\n        \"\\n\",\n        \"file_names = next(os.walk(IMAGE))[2]\\n\",\n        \"image = skimage.io.imread(os.path.join(IMAGE, random.choice(file_names)))\\n\",\n        \"# Running object detection\\n\",\n        \"results = model.detect([image], verbose=1)\\n\",\n        \"# Evaluating results \\n\",\n        \"r = results[0]\\n\",\n        \"visualize.display_instances(image, r['kings'], r['masks'], r['class_ids'],\\n\",\n        \"class_names, r['scores'])\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"ubLoZzuvlIKL\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"### 6. Customization of images to be segmented\\n\",\n        \"\\n\",\n        \"You can download an image from a third party website such as:\\n\",\n        \"\\n\",\n        \"- [Imgbbbb](https://imgbbb.com/)\\n\",\n        \"- [GitHub](https://github.com)\\n\",\n        \"\\n\",\n        \"You can download your image using `wget` command.\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"isUQbRBblt8K\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"# Loading a random image from the dataset\\n\",\n        \"file_names = next(os.walk(IMAGE_DIR))[2]\\n\",\n        \"image = skimage.io.imread(os.path.join(IMAGE,'my_image.jpg'))\\n\",\n        \"# Running object detection\\n\",\n        \"results = model.detect([image], verbose=1)\\n\",\n        \"# Evaluating results \\n\",\n        \"r = results[0]\\n\",\n        \"visualize.display_instances(image, r['kings'], r['masks'], r['class_ids'],\\n\",\n        \"class_names, r['scores'])\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"bTrSeup9mN8K\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"For example, the result of object detection and segmentation is shown below:\\n\",\n        \"\\n\",\n        \"![](https://cdn-images-1.medium.com/max/1200/1*8eIcVM-M506P4bA0Y7pbag.png)\"\n      ]\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"TvmswGRNmwIz\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"### 7. Video object segmentation\\n\",\n        \"\\n\",\n        \"There are 3  steps to processing a video file.\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"1. Transforming video frames into static images;\\n\",\n        \"2. Image processing;\\n\",\n        \"3. Converting processed images into output videos.\\n\",\n        \"\\n\",\n        \"In our previous demo, we asked the model to process only 1 image at a time, as configured in `IMAGES_PER_GPU` option.\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"LvhNTSXWoMSZ\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"class InferenceConfig(coco.CocoConfig):\\n\",\n        \"#  Set the batch size to 1 as we will perform the inference on 1 image at a time. Batch size = GPU_NB * IMAGES_PER_GPU \\n\",\n        \"IMAGES_PER_GPU = 1\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"nV7e6XeqoU9e\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"If we are going to process all the video at once, it will take a long time. We will therefore use the GPU to operate several frames simultaneously.\\n\",\n        \"The Mask R-CNN pipeline is quite computationally intensive and requires a lot of GPU memory. In Colab, The Tesla K80 GPU with 24G of memory can safely process 3 images at a time. If you go any further, the notebook may crash in the middle of video processing.\\n\",\n        \"Thus, in the psedo-code below, we set the ` batch_size` to 3 and use the `cv2 library` to take 3 images at a time before processing them with the model.\\n\",\n        \"\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"CxeiWbrVpIp6\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"capture = cv2.VideoCapture(os.path.join(VIDEO, 'demo.mp4')) \\n\",\n        \"while True:\\n\",\n        \"ret, frame = capture.read()\\n\",\n        \"# Save each frame of the video to a list\\n\",\n        \"frame_count += 1\\n\",\n        \"frames.append(frame)\\n\",\n        \"if len(frames) == batch_size:\\n\",\n        \"results = model.detect(frames, verbose=0)\\n\",\n        \"for i, item in enumerate(zip(frames, results)): frame = item[0]\\n\",\n        \"r = item[1]\\n\",\n        \"frame = display_instances(\\n\",\n        \"frame, r['kings'], r['masks'], r['class_ids'], class_names, r['scores']\\n\",\n        \")\\n\",\n        \"name = '{0}.jpg'.format(frame_count + i - batch_size) \\n\",\n        \"name = os.path.join(VIDEO_SAVE_DIR, name)\\n\",\n        \"cv2.imwrite(name, frame)\\n\",\n        \"# For starting the next batch \\n\",\n        \"frames = []\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"kLGk-3yMqFeb\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"After running this psedo-code, you should now have all the processed image files in `./videos/save folder.`\\n\",\n        \"The next step is easy, you have to generate the new video from these images. We will use `VideoWriter ()` function from OpenCV (cv2) to do this.\\n\",\n        \"\\n\",\n        \"But there are two things you want to be sure of:\\n\",\n        \"\\n\",\n        \"**1. Images must be indexed in the same way**\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"tZ9NiNaoqq9D\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"# Get all image file paths.\\n\",\n        \"images = list(glob.iglob(os.path.join(VIDEO_SAVE,' *.*'))\\n\",\n        \"# Sort the images by index.\\n\",\n        \"images = sorted(images, key=lambda x: float(os.path.split(x)[1][:-3]))\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"Zveb1kbWrAwK\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"**2. The frame rate corresponds to the original video. You can use the following psedo-code to check it or simply open the file property.**\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"mTz7DryBrQgz\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"video = cv2.VideoCapture(os.path.join(VIDEO_DIR, trailer1.mp4'));\\n\",\n        \"# Get OpenCV version\\n\",\n        \"(major_ver, minor_ver, subminor_ver) = (cv2. version).split('.'')\\n\",\n        \"if int(major_ver) < 3 :\\n\",\n        \"fps = video.get(cv2.cv.CV_CAP_PROP_FPS)\\n\",\n        \"print(\\\"Frames per second: {0}\\\".format(fps)) else :\\n\",\n        \"fps = video.get(cv2.CAP_PROP_FPS)\\n\",\n        \"print(\\\"Frames per second: {0}\\\".format(fps))\\n\",\n        \"video.release();\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"N4cFHtElrroi\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"Finally, you can use this psedo-code to generate video from the processed images.\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"YhHx3vlXr3PD\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"def generate_video(outvid, images=None, fps=30, size=None,is_color=True, format=\\\"FMP4\\\"):\\n\",\n        \"  \\n\",\n        \"  \\\"\\\"\\\"\\n\",\n        \"Create a video from a list of images.\\n\",\n        \"@param outvid output video\\n\",\n        \"@param images list of images to use in the video \\n\",\n        \"@param fps frame per second\\n\",\n        \"@param size size of each frame \\n\",\n        \"@param is_color color\\n\",\n        \"\\n\",\n        \"\\\"\\\"\\\"\\n\",\n        \"from cv2 import VideoWriter, VideoWriter_fourcc, imread, resize \\n\",\n        \"fourcc = VideoWriter_fourcc(*format)\\n\",\n        \"vid = None\\n\",\n        \"for image in images:\\n\",\n        \"if not os.path.path.exists(image):\\n\",\n        \"  raise FileNotFoundError(image)\\n\",\n        \"img = imread(image) \\n\",\n        \"if vid is None:\\n\",\n        \"  if size is None:\\n\",\n        \"size = img.shape[1], img.shape[0]\\n\",\n        \"vid = VideoWriter(outvid, fourcc, float(fps), size, is_color)\\n\",\n        \"  if size[0] != img.shape[1] and size[1] != img.shape[0]:\\n\",\n        \"img = resize(img, size) \\n\",\n        \"vid.write(img)\\n\",\n        \"vid.release() \\n\",\n        \"return vid\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"8YkUTlnnsxAs\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"import glob import os\\n\",\n        \"# Image directory to be detected\\n\",\n        \"ROOT = os.getcwd()\\n\",\n        \"VIDEO = os.path.join(ROOT, \\\"videos\\\")\\n\",\n        \"VIDEO_SAVE = os.path.join(VIDEO, \\\"save\\\")\\n\",\n        \"images = list(glob.iglob(os.path.join(VIDEO_SAVE, '*.*'))) \\n\",\n        \"# Sort the images by index\\n\",\n        \"images = sorted(images, key=lambda x: float(os.path.split(x)[1][:-3]))\\n\",\n        \"outvid = os.path.join(VIDEO, \\\"out_video.mp4\\\") \\n\",\n        \"generate_video(outvid, images, fps=30)\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"bpMhDs4Etea2\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"Once this step is completed, the segmented video should now be ready to be downloaded into your local machine.\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"dTSrXbg-thkT\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"from google.colab import files \\n\",\n        \"files.download('videos/out_video.mp4')\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"UWYja1LGvxt1\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"## List of References:\\n\",\n        \"[1] K. He, G. Gkioxari, P. Dollár, and R. Girshick, \\\"Mask R-CNN\\\", arXiv:1703.06870[cs], March 2017.\\n\",\n        \"\\n\",\n        \"[2] R. Girshick, J. Donahue, T. Darrell, et J. Malik, « Rich feature hierarchies for accurate object detection and semantic segmentation », arXiv:1311.2524 [cs], nov. 2013.\\n\",\n        \"\\n\",\n        \"[3] R. Girshick, \\\"Fast R-CNN\\\", arXiv:1504.08083[cs], Apr. 2015.\\n\",\n        \"\\n\",\n        \"[4] S. Ren, K. He, R. Girshick, et J. Sun, « Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks », arXiv:1506.01497 [cs], juin 2015.\\n\",\n        \"\\n\",\n        \"#### Other sources :\\n\",\n        \"TensorFlow, https://www.tensorflow.org/\\n\",\n        \"\\n\",\n        \"Keras, https://keras.io/\"\n      ]\n    }\n  ],\n  \"metadata\": {\n    \"colab\": {\n      \"name\": \"Object Instance Segmentation using TensorFlow Framework and Cloud GPU Technology.ipynb\",\n      \"version\": \"0.3.2\",\n      \"provenance\": [],\n      \"collapsed_sections\": []\n    },\n    \"kernelspec\": {\n      \"name\": \"python3\",\n      \"display_name\": \"Python 3\"\n    }\n  },\n  \"nbformat\": 4,\n  \"nbformat_minor\": 0\n}"
  },
  {
    "path": "content/inferno/computer-vision/object-tracking.ipynb",
    "content": "{\n  \"cells\": [\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"_3CcxHNErMI2\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"# **Object Tracking based on Deep Learning**\\n\",\n        \"![Fig1](https://i.ibb.co/0JXbPjm/Capture.png)\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"## What is Video tracking?\\n\",\n        \"\\n\",\n        \"Target tracking is the process of locating moving targets in a video camera for a very wide range of real-world applications. Real-time target tracking is an important task for many computer vision applications, such as surveillance, perception-based user interfaces, augmented reality, object-based video compression and autonomous driving.\\n\",\n        \"\\n\",\n        \"![Fig2](https://i.ibb.co/KymdPrW/2.png)\\n\",\n        \"\\n\",\n        \"Historically, there are many ways to track video targets: when you track all moving objects, the difference between the images becomes useful; for tracking the moving hand in the video, the average shift method based on skin color is the best solution; Model matching is a good technique for tracking an aspect of an object.\\n\",\n        \"\\n\",\n        \"Since the results of the [ImageNet 2012 challenge](http://www.image-net.org/challenges/LSVRC/2012/), Deep Learning (and in particular, Convolutional Neural Networks (CNNs)) has become the main method for solving this kind of problem. Object tracking studies have therefore naturally integrated recognition models, which has made it possible to create tracking algorithms.\\n\",\n        \"\\n\",\n        \"For more details, you can look at the following projects and tutorials related to the video track challenge:\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"*   [Zero to Hero: A Quick Guide to Object Tracking: MDNET, GOTURN, ROLO\\n\",\n        \"](https://cv-tricks.com/object-tracking/quick-guide-mdnet-goturn-rolo/)\\n\",\n        \"*   [TRACKING THINGS IN OBJECT DETECTION VIDEOS\\n\",\n        \"](https://www.move-lab.com/blog/tracking-things-in-object-detection-videos)\\n\",\n        \"\\n\",\n        \"*   [Multiple Object Tracking Algorithms\\n\",\n        \"](https://medium.com/@manivannan_data/multiple-object-tracking-algorithms-a01973272e52)\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"*   [ImageAI : Video Object Detection, Tracking and Analysis](https://github.com/OlafenwaMoses/ImageAI/blob/master/imageai/Detection/VIDEO.md)\\n\",\n        \"\\n\",\n        \"*   [Tensorflow Object Tracking Video](https://github.com/DrewNF/Tensorflow_Object_Tracking_Video)\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"Practical books that will allow you to learn the different aspects of video tracking:\\n\",\n        \"\\n\",\n        \"1.   [Video Tracking: Theory and Practice 1st Edition](https://www.amazon.com/Video-Tracking-Practice-Emilio-Maggio/dp/0470749644)\\n\",\n        \"2.   [Video object Tracking: Image Processing and Tracking Paperback – July 16, 2011](https://www.amazon.com/Video-object-Tracking-Image-Processing/dp/3844386238)\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"\\n\",\n        \" \\n\",\n        \"\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"EGnFpuSL0IqO\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"## Conventional methods for object detection and tracking\\n\",\n        \"\\n\",\n        \"**1. Basic object detection**\\n\",\n        \"\\n\",\n        \"To make a baseline movement detection, given the difference between the \\\"background\\\" and the other frames, this method is still quite good, but you must first define the background frame, if it is outside, changes in lighting can cause a false detection. Therefore, this method is very limited.\\n\",\n        \"OpenCV offers a class, called BackgroundSubtractor, which is useful for splitting the foreground from the background. There are three background separators in OpenCV3: *K-Nearest (KNN)*,* Gaussian Mixture (MOG2)*, and *Geometric Multigid (GMG)*. The BackgroundSubtractor class used for video analysis, i.e. the BackgroundSubtractor class *learns* the context of each image. The BackgroundSubtractor class is often used to compare different frames as well as to record previous frames, which can be used to improve the results of motion analysis.\\n\",\n        \"![Img3](https://www.researchgate.net/profile/Venkatesh_Saligrama/publication/224396654/figure/download/fig1/AS:393809457369095@1470902899537/Background-subtraction-results-for-synthetic-objects-moving-against-quasi-static.png)\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"**2. Background splitter by MOG2**\\n\",\n        \"\\n\",\n        \"One of the basic features of the BackgroundSubtractor class is that it can compute shadows. This is absolutely essential for accurate playback of video images: by detecting shadows, it is possible to exclude shadow areas from the detected image (in threshold mode) so that real attributes can be focused.\\n\",\n        \"![image.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAmEAAAGLCAYAAACPwkUyAAAgAElEQVR4Ae3dC5acOLYF0PLrGph7ZLZH1u6R5YtbXdclk0DwEUjAzrWyIgKEPltUcixw+ssff/zx8fr2RYAAAQIECBAgcKLA/53YlqYIECBAgAABAgT+FhDCnAoECBAgQIAAgQYCQlgDdE0SIECAAAECBIQw5wABAgQIECBAoIGAENYAXZMECBAgQIAAASHMOUCAAAECBAgQaCAghDVA1yQBAgQIECBAQAhzDhAgQIAAAQIEGggIYQ3QNUmAAAECBAgQEMKcAwQIECBAgACBBgJCWAN0TRIgQIAAAQIEhDDnAAECBAgQIECggYAQ1gBdkwQIECBAgMB1BT4+Pqp0/surljo1VemOSggQIECAAAECzxCwEvaMeTZKAgQIECBAoDMBIayzCdEdAgQIECBA4BkCQtgz5tkoCRAgQIAAgc4EhLDOJkR3CBAgQIAAgWcICGHPmGejJECAAAECBDoTEMI6mxDdIUCAAAECBJ4hIIQ9Y56NkgABAgQIEOhMQAjrbEJ0hwABAgQIEHiGgBD2jHk2SgIECBAgQKAzASGsswnRHQIECBAgQOAZAkLYM+bZKAkQIECAAIHOBISwziZEdwgQIECAAIFnCAhhz5hnoyRAgAABAgQ6ExDCOpsQ3SFAgAABAgSeISCEPWOejZIAAQIECBDoTEAI62xCdIcAAQIECBB4hoAQ9ox5NkoCBAgQIECgMwEhrLMJ0R0CBAgQIEDgGQJC2DPm2SgJECBAgACBzgSEsM4mRHcIECBAgACBZwgIYc+YZ6MkQIAAAQIEOhMQwjqbEN0hQIAAAQIEniEghD1jno2SAAECBAgQ6ExACOtsQnSHAAECBAgQeIaAEPaMeTZKAgQIECBAoDMBIayzCdEdAgQIECBA4BkCQtgz5tkoCRAgQIAAgc4EhLDOJkR3CBAgQIAAgWcICGHPmGejJECAAAECBDoTEMI6mxDdIUCAAAECBJ4hIIQ9Y56NkgABAgQIEOhMQAjrbEJ0hwABAgQIEHiGgBD2jHk2SgIECBAgQKAzASGsswnRHQIECBAgQOAZAkLYM+bZKAkQIECAAIHOBISwziZEdwgQIECAAIFnCAhhz5hnoyRAgAABAgQ6ExDCOpsQ3SFAgAABAgSeISCEPWOejZIAAQIECBDoTEAI62xCdIcAAQIECBB4hoAQ9ox5NkoCBAgQIECgMwEhrLMJ0R0CBAgQIEDgGQJC2DPm2SgJECBAgACBzgSEsM4mRHcIECBAgACBZwgIYc+YZ6MkQIAAAQIEOhMQwjqbEN0hQIAAAQIEniEghD1jno2SAAECBAgQ6ExACOtsQnSHAAECBAgQeIaAEPaMeTZKAgQIECBAoDMBIayzCdEdAgQIECBAYF7g4+NjvsBF9n559fMeI7kIuG4SIECAAAECBELASpjzgAABAgQIECDQQEAIa4CuSQIECBAgQICAEOYcIECAAAECBAg0EBDCGqBrkgABAgQIECAghDkHCBAgQIAAAQINBISwBuiaJECAAAECBAgIYc4BAgQIECBAgEADASGsAbomCRAgQIAAAQJCmHOAAAECBAgQINBAQAhrgK5JAgQIECBAgIAQ5hwgQIAAAQIECDQQEMIaoGuSAAECBAgQICCEOQcIECBAgAABAg0EhLAG6JokQIAAAQIECAhhzgECBAgQIECAQAMBIawBuiYJECBAgAABAkKYc4AAAQIECBAg0EBACGuArkkCBAgQIECAgBDmHCBAgAABAgQINBAQwhqga5IAAQIECBAgIIQ5BwgQIECAAAECDQSEsAbomiRAgAABAgQICGHOAQIECBAgQIBAAwEhrAG6JgkQIECAAAECQphzgAABAgQIECDQQEAIa4CuSQIECBAgQICAEOYcIECAAAECBAg0EBDCGqBrkgABAgQIECAghDkHCBAgQIAAAQINBISwBuiaJECAAAECBAgIYc4BAgQIECBAgEADASGsAbomCRAgQIAAAQJCmHOAAAECBAgQINBAQAhrgK5JAgQIECBAgIAQ5hwgQIAAAQIECDQQEMIaoGuSAAECBAgQICCEOQcIECBAgAABAg0EhLAG6JokQIAAAQIECAhhzgECBAgQIECAwMkC379//0MIOxldcwQIECBAgACBEPgTAwECBAgQIECAwDkCsQKWX0JYSnglQIAAAQIECBwkUIavaOLbt29uRx5krVoCBAgQIECAwF8CYwHsx48fbkc6PwgQIECAAAECRwl8fHx8qjoCWHx5MP8TjQ0ECBAgQIAAgf0CcwEsavdM2H5jNRAgQIAAAQIEfgkMbz/mjlwBi89RRghLGa8ECBAgQIAAgZ0CEa7iofv8KoNXbIv9+eV2ZEp4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)\\n\",\n        \"\\n\",\n        \"**3. Background splitter by KNN**\\n\",\n        \"\\n\",\n        \"The images can be viewed from left to right: detected moving targets, background segmentation, thresholding after background segmentation.\\n\",\n        \"![Fig5](https://www.ccoderun.ca/programming/doxygen/opencv/Background_Subtraction_Tutorial_Scheme.png)\\n\",\n        \"\\n\",\n        \"**4. Kalman object tracking**\\n\",\n        \"\\n\",\n        \"Kalman is a Hungarian mathematician, who developed a filter from his PhD thesis work and the 1960 [paper](https://asmedigitalcollection.asme.org/fluidsengineering/article/82/1/35/397706/A-New-Approach-to-Linear-Filtering-and-Prediction) entitled \\\"A New Approach to Linear Filtering and Prediction Problems\\\".\\n\",\n        \"\\n\",\n        \"Kalman filtering has been applied in many domains, particularly in the navigation guidance of aircraft and missiles.\\n\",\n        \"The Kalman filter works repeatedly on a noisy input data stream (such as a video input in computer vision) and produces a statistically optimal estimate of the state of the underlying system (such as the position in the video).\\n\",\n        \"\\n\",\n        \"The Kalman filter algorithm is divided into two phases:\\n\",\n        \"- Prediction phase: the Kalman filter uses the covariance computed from the current position to estimate the target's new position.\\n\",\n        \"- Update phase: the Kalman filter stores the target position and calculates the corrected covariance for the next iteration.\\n\",\n        \"\\n\",\n        \"![Fig5](https://i.stack.imgur.com/zS2OB.png)\"\n      ]\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"NVNytefY8qCm\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"## Deep Learning based methods for object detection and tracking\\n\",\n        \"\\n\",\n        \"In recent years, Deep Learning methods have been successfully applied in the field of object tracking and are gradually exceeding traditional performance methods. In this section, we will present current target tracking algorithms based on Deep Learning.\\n\",\n        \"\\n\",\n        \"**1. Trends in object tracking**\\n\",\n        \"\\n\",\n        \"Unlike the trend towards of Deep Learning in the visual domain, such as detection and recognition, the application of this paradigm in the object tracking domain is not seamless. The main problem is the lack of learning data: one of the complications of the deep model comes from the effective learning of a large number of labelled learning data, while target tracking only provides the context for selecting the first image as learning data. In this case, it is difficult to train a deep model from scratch at the beginning of the tracking. Currently, the target tracking algorithm based on Deep Learning takes several ideas to solve this problem, including the following and finally the recurrent neural network in the current tracking field to solve the target tracking problem. Where training data for target tracking is very limited, complementary non-supervised training data is used for pre-training to achieve a high-level feature epresentation of object, and in actual tracking, using the limited sample information from the current tracking target. The accuracy of the pre-training model confers a higher classification performance on the model for the current tracking goal, which significantly reduces the need to track target training samples and improves the performance of the tracking algorithm.\\n\",\n        \"\\n\",\n        \"**2. Overall multi-target tracking process**\\n\",\n        \"\\n\",\n        \"In order to track a target, first this target is detected. This step is called *target detection*, then the target in each image is mapped based on the detection result. Today, there are multi-target detectors, such as [SSD](https://arxiv.org/abs/1512.02325) and [YOLO](https://arxiv.org/abs/1506.02640), etc.\\n\",\n        \"\\n\",\n        \"**3. State-of-the-art methods for object tracking**\\n\",\n        \"##### 3.1.GOTURN\\n\",\n        \"\\n\",\n        \"A further great strength of deep learning is the end-to-end learning process. We believe that this opens up a promising future for tracking. Here is an example of the [*GOTURN* method](https://www.learnopencv.com/goturn-deep-learning-based-object-tracking/). GOTURN's current method has been included in OpenCV 3.2.0 development version.\\n\",\n        \"\\n\",\n        \"![Fig6](https://www.learnopencv.com/wp-content/uploads/2018/07/goturn-inputs-ouputs-1024x487.jpg)\\n\",\n        \"GOTURN involves a convolution network based on the input of a pair of images using the ALOV300+ video sequence set and the ImageNet sensing data set, and generates the position change from the previous frame in the detection area to obtain the target's position on the current frame.\\n\",\n        \"\\n\",\n        \"##### 3.2. Specific-target tracking\\n\",\n        \"\\n\",\n        \"In practice, a significant aspect of tracking is the tracking of specific objects, such as face tracking, gesture tracking and human tracking. Tracking a particular object is different from the approach described above and relies more on the training of a particular detector. Due to its obvious features, face tracking is mainly implemented through detection task, such as the state-of-the-art Viola-Jones detection model and the current face detection or face point detection model using Deep learning.\\n\",\n        \"\\n\",\n        \"##### 3.3. Compression tracking\\n\",\n        \"\\n\",\n        \"This approach involves using the compressed detection method to represent feature maps, by achieving dimensional reduction and obtaining small-size cues in order to capture large-size feature space (The block diagram is shown in Figure).\\n\",\n        \"![Fig7](https://img-blog.csdn.net/20170418162336895?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hmc2h1YWlzaQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)\\n\"\n      ]\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"xUewec8GXEn1\",\n        \"colab_type\": \"text\"\n      },\n      \"source\": [\n        \"## Use case: Motion Tracker\\n\",\n        \"Here, we will see how to track the motion of moving objects in the video using OpenCV 3.0 and basic techniques (MOG2). Motion tracking is used to track the motion of objects and then transmit the detected information to an application for further processing.\\n\",\n        \"\\n\",\n        \"![Fig7](https://i.ytimg.com/vi/XmI2kE2hUgE/maxresdefault.jpg)\\n\",\n        \"**Basic dependencies:**\\n\",\n        \"\\n\",\n        \"- OpenCV 3.0;\\n\",\n        \"- Numpy lib.\\n\",\n        \"\\n\",\n        \"The tracker implementation is as follows:\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"l8F889KYUHPQ\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"%%writefile points.py\\n\",\n        \"import numpy as np\\n\",\n        \"import numpy.linalg.linalg as la\\n\",\n        \"import matplotlib.pyplot as plt\\n\",\n        \"\\n\",\n        \"fst = lambda x: x[0]\\n\",\n        \"snd = lambda x: x[1]\\n\",\n        \"\\n\",\n        \"distance = lambda p1,p2: la.norm(p1 - p2)\\n\",\n        \"\\n\",\n        \"matchPaths = lambda r, a, paths: [neighborhoodPath(r,paths,ai) for ai in a]\\n\",\n        \"\\n\",\n        \"neighborhoodPath = lambda r, paths, pnt: [path for path in paths if distance(path[0],pnt) < r]\\n\",\n        \"\\n\",\n        \"def itemMatcher(choice, items):\\n\",\n        \"    items = list(sorted(items, key = lambda x: len(x[1])))\\n\",\n        \"    accumulator = []\\n\",\n        \"    for index in range(len(items)):\\n\",\n        \"        (a, bs) = items[index]\\n\",\n        \"        if bs == []:\\n\",\n        \"            accumulator.append((a, None))\\n\",\n        \"        else:\\n\",\n        \"            b = choice(a,bs)\\n\",\n        \"            accumulator.append((a, b))\\n\",\n        \"            for ind in range(len(items)):\\n\",\n        \"                (a2, bs2) = items[ind]\\n\",\n        \"                if any(np.array_equal(b,belement) for belement in bs):\\n\",\n        \"                    bs2 = [belement for belement in bs2 if not np.array_equal(belement, b)]\\n\",\n        \"                items[ind] = (a2, bs2)\\n\",\n        \"    return accumulator\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"def extendPaths(r, paths, scatter, filterWith, noisy = False, discard = True):\\n\",\n        \"    matches = matchPaths(r,scatter,paths)\\n\",\n        \"    zipped = zip(scatter, matches)\\n\",\n        \"    def choice(point, pathOptions): \\n\",\n        \"        return max(pathOptions,key=len)\\n\",\n        \"    def combine(tup):\\n\",\n        \"        (pnt, val) = tup\\n\",\n        \"        if val == None:\\n\",\n        \"            if not noisy:\\n\",\n        \"                return [pnt]\\n\",\n        \"            else:\\n\",\n        \"                return []\\n\",\n        \"        else:\\n\",\n        \"            return [pnt] + val\\n\",\n        \"    lst = itemMatcher(choice, zipped)\\n\",\n        \"    extended_paths = map(snd,lst)\\n\",\n        \"    if discard:\\n\",\n        \"       return filter(lambda x: x != [], map(combine,lst))\\n\",\n        \"    unextended_paths = [p for p in paths if not array_in(p,extended_paths)]  \\n\",\n        \"    unextended_paths = filter(filterWith, unextended_paths)\\n\",\n        \"    return ( unextended_paths, filter(lambda x: x!=[], map(combine, lst)) ) # First element is paths to be archived, second element is the extended paths\\n\",\n        \"   \\n\",\n        \"\\n\",\n        \"def array_in(arr, lst):\\n\",\n        \"    return any(np.array_equal(arr,elem) for elem in lst)\\n\",\n        \"\\n\",\n        \"import pickle\\n\",\n        \"def loaddata(filename):\\n\",\n        \"    return pickle.load(open(filename))\\n\",\n        \"\\n\",\n        \"def stringPaths(r, scatters):\\n\",\n        \"    paths = []\\n\",\n        \"    for sc in scatters:\\n\",\n        \"        paths = extendPaths(r, paths, sc)\\n\",\n        \"    return paths\\n\",\n        \"\\n\",\n        \"def plotit(paths):\\n\",\n        \"    p = [reduce(lambda x,y: np.append(x,y,axis=0),pa) for pa in paths]\\n\",\n        \"    p = map(lambda x: x.T, p)\\n\",\n        \"    plt.hold(True)\\n\",\n        \"    map(lambda x: plt.plot(x[0],x[1],'x'),p)\\n\",\n        \"\\n\",\n        \"def shortcut(r, filename):\\n\",\n        \"    plotit(stringPaths(r, loaddata(filename)))\\n\",\n        \"def rawpoints(filename):\\n\",\n        \"    scatters = loaddata(filename)\\n\",\n        \"    plotit(scatters)\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"cell_type\": \"code\",\n      \"metadata\": {\n        \"id\": \"b8Vhzbz1R6Or\",\n        \"colab_type\": \"code\",\n        \"colab\": {}\n      },\n      \"source\": [\n        \"from __future__ import division\\n\",\n        \"import numpy as np\\n\",\n        \"import cv2\\n\",\n        \"import scipy\\n\",\n        \"import pickle\\n\",\n        \"import points\\n\",\n        \"\\n\",\n        \"from sys import argv\\n\",\n        \"\\n\",\n        \"OBJ = True\\n\",\n        \"### THE SETTING PARAMETERS FOR VIDEO.MP4\\n\",\n        \"if OBJ:\\n\",\n        \"    KERN_SIZE = 8\\n\",\n        \"    RADIUS = 20\\n\",\n        \"    THRESHOLD_AT = 100\\n\",\n        \"    INPUT_SIZE_THRESHOLD = 75\\n\",\n        \"    MIN_PATH_SIZE = 10\\n\",\n        \"    MIN_PATH_STD = 3*RADIUS\\n\",\n        \"    WRITE_TO_FILE = True\\n\",\n        \"###END PARAMETERS\\n\",\n        \"else:\\n\",\n        \"    KERN_SIZE = 8\\n\",\n        \"    RADIUS = 5\\n\",\n        \"    THRESHOLD_AT = 127\\n\",\n        \"    INPUT_SIZE_THRESHOLD = 150\\n\",\n        \"    MIN_PATH_SIZE = 10\\n\",\n        \"    MINI_PATH_STD = 3*RADIUS\\n\",\n        \"    WRITE_TO_FILE = True\\n\",\n        \"\\n\",\n        \"video_output = \\\"output_tracking.avi\\\"\\n\",\n        \"\\n\",\n        \"def avgit(y):\\n\",\n        \"    return x.sum(axis=0)/np.shape(y)[0]\\n\",\n        \"def plotp(p,mat,color=0):\\n\",\n        \"    mat[p[0,1],p[0,0]] = color\\n\",\n        \"\\n\",\n        \"if len(argv) != 3:\\n\",\n        \"    cap = cv2.VideoCapture('vid1.mp4')\\n\",\n        \"else:\\n\",\n        \"    cap = cv2.VideoCapture(argv[1])\\n\",\n        \"    video_outputfile = argv[2]\\n\",\n        \"fourcc = cv2.VideoWriter_fourcc(*'XVID')\\n\",\n        \"ret, frame = cap.read()\\n\",\n        \"height, width, layers = frame.shape\\n\",\n        \"video_out = cv2.VideoWriter(video_outputfile, fourcc, 30, (width, height), True)\\n\",\n        \"print video_out.isOpened()\\n\",\n        \"\\n\",\n        \"fgbg = cv2.createBackgroundSubtractorMOG2()\\n\",\n        \"bwsub= cv2.createBackgroundSubtractorMOG2()\\n\",\n        \"\\n\",\n        \"kernlen = KERN_SIZE\\n\",\n        \"kern = np.ones((kernlen,kernlen))/(kernlen**2)\\n\",\n        \"ddepth = -1\\n\",\n        \"def blur(image):\\n\",\n        \"    return cv2.filter2D(image,ddepth,kern)\\n\",\n        \"def blr_thr(image, val=127):\\n\",\n        \"    return cv2.threshold(blur(image),val,255,cv2.THRESH_BINARY)[1]\\n\",\n        \"def normalize(image):\\n\",\n        \"    s = np.sum(image)\\n\",\n        \"    if s == 0:\\n\",\n        \"       return image\\n\",\n        \"    return height*width* image / s\\n\",\n        \"#collection = []\\n\",\n        \"paths = []\\n\",\n        \"archive = []\\n\",\n        \"\\n\",\n        \"r = RADIUS\\n\",\n        \"thresh_at = THRESHOLD_AT\\n\",\n        \"THIS_MUCH_IS_NOISE = INPUT_SIZE_THRESHOLD\\n\",\n        \"\\n\",\n        \"while(cap.isOpened()):\\n\",\n        \"    ret, frame = cap.read()\\n\",\n        \"    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)\\n\",\n        \"    fgmask = fgbg.apply(frame)\\n\",\n        \"    mask = blur(fgmask)\\n\",\n        \"    ret2, mask = cv2.threshold(mask, thresh_at, 255, cv2.THRESH_BINARY)\\n\",\n        \"    \\n\",\n        \"    res = cv2.findContours(mask, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)\\n\",\n        \"    cons = res[1]\\n\",\n        \"    scatter = map(avgit, cons)\\n\",\n        \"    filterWith = lambda x: len(x) > MIN_PATH_SIZE and np.std(x) > MINIMUM_PATH_STD\\n\",\n        \"    (toArchive, paths) = points.extendPaths(r, paths, scatter, filterWith, noisy=(len(scatter) > THIS_MUCH_IS_NOISE), discard=False)\\n\",\n        \"    archive += toArchive\\n\",\n        \"    img = (1 - mask)*gray\\n\",\n        \"    for path in archive:\\n\",\n        \"        #color = 255\\n\",\n        \"        cv2.polylines(img, np.int32([reduce(lambda x,y: np.append(x,y,axis=0), path)]), 0, (255,0,0))\\n\",\n        \"    for path in paths:\\n\",\n        \"        cv2.polylines(img, np.int32([reduce(lambda x,y: np.append(x,y,axis=0), path)]), 1, (0,0,255))\\n\",\n        \"    cv2.imshow('frame', img)\\n\",\n        \"    video_out.write(img)\\n\",\n        \"    if cv2.waitKey(1) & 0xFF == ord('q'):\\n\",\n        \"        break\\n\",\n        \"cap.release()\\n\",\n        \"video_out.release()\\n\",\n        \"cv2.destroyAllWindows()\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"if WRITE_TO_FILE:\\n\",\n        \"    pickle.dump(archive, open('my_path' + str(np.floor(1000*np.random.rand())) + '.pickle','w'))\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    }\n  ],\n  \"metadata\": {\n    \"colab\": {\n      \"name\": \"Object Tracking based on Deep Learning.ipynb\",\n      \"provenance\": [],\n      \"collapsed_sections\": [],\n      \"toc_visible\": true\n    },\n    \"kernelspec\": {\n      \"name\": \"python3\",\n      \"display_name\": \"Python 3\"\n    }\n  },\n  \"nbformat\": 4,\n  \"nbformat_minor\": 0\n}"
  },
  {
    "path": "content/inferno/research/sota-papers.md",
    "content": "# Research papers explained\n\n## Year-by-Year\n* [2020](#2020)\n* [2019](#2019)\n* [2018](#2018)\n* [2017](#2017)\n\n\n## 2020\nComing soon!\n\n## 2019\n* **June - [Energy and Policy Considerations for Deep Learning in NLP](https://arxiv.org/pdf/1906.02243.pdf)**\n\nTraining state-of-the-art models today requires a significant amount of computational resources, which in turn consumes significants amount of energy, which would emit a significant amount of carbon when generated. Newer models and methods, which rely on re-training to optimise architectures and hyper-parameters, significantly increase the cost of training. \n\nResearch finds that while a car consumes 126,000 pounds of CO2 in its lifetime, training a single, large NLP model with an optimal neural architecture search on a GPU requires about 626,000 pounds of CO2 - over 5 times that of a car. This is largely due to the energy required to power the model, which often takes weeks or even months. Though climate research suggests that humanity must cut carbon emissions by half over the next decade, this may become increasingly difficult should training neural networks become the norm.\n\nThe paper assigns a dollar cost to training a variety of state-of-the-art NLP models, which is calculated by finding the energy required to train each model, and then finding the associated electricity cost. The first finding is that TPUs are more cost-efficient than GPUs on mid-sized models. The next is that NLP models are extremely harmful to the environment - training a GPU on, say, a BERT model emits approximately the same amount of Carbon as a trans-American flight.  \n\nThe paper concludes by recommending that researchers consider energy emissions during their model creations, as well as encouraging a more equitable access to computational resources.\n\n* **May - [Adversarial features are not bugs, they are features](https://arxiv.org/pdf/1905.02175.pdf)**\n\nThis paper attacks one of the most prominent criticisms of neural networks - the fact that adversarial examples are flaws in the performance of such networks.\n\nAdversarial examples are imperceptibly altered natural inputs that induce incorrect predictions by image classifiers. The reason as to why such examples exist has been researched in great depth, though no theories have so far been able to truly capture the phenomena seen in practise.\n\nThe paper demonstrates that adversarial examples are the direct product of the identification by classifiers of non-robust features - features derived from patterns in the data that are highly predictive, yet brittle and incomprehensible to humans. An example would be an image of a panda - while a human would typically associate a panda with its short tail or its well-rounded ears, an image classifier may identify a non-robust feature which it believes to be highly predictive, say the shape of its thumb.\n\nThe paper postulates that classification models learn to rely on such non-robust features to make their predictions, which lead to adversarial examples that are able to exploit this dependence. This is because we usually train classifiers to solely maximize accuracy - thus, classifiers tend to use any available signal to do so, even those that look incomprehensible to humans. After all, the presence of a tail or ears is no more natural to a classifier than any other equally predictive pattern. \n\nThe hypothesis also provides a solution to the problem of adversarial transferability, or the idea that the adversarial examples that can be applied to one model can usually also be applied on another. This is because models tend to learn common features- if a non-robust feature is one that helps identify an image, it would be learnt by any model. \n\nLastly, the paper suggests that methods aiming to enhance the interpretability of a given model by attempting to reduce such non-robust features actually reduce the interpretability of a model. As such, producing human-meaningful explanations must be pursued independently from the training of highly-accurate models.<br/>\n\n* **May - [Few-Shot Adversarial Learning of Realistic Neural Talking Head Models](https://arxiv.org/pdf/1905.08233v1.pdf)**\n\nThis paper describes a few-shot (utilises a small handful of input images) and one-shot (utilises just one input image) technique to make humans in portrait images appear to be talking. It outperforms all other existing models in this manner, as it can make realistic videos of portraits such as that of Mona Lisa and Marilyn Monroe.\n\nThis paper employs an architecture that is composed of three distinct neural networks which work in tandem. The first is an ‘Embedder’, which takes coloured images and identifies that landmark items within such images, such as eyes and ears. It then compresses the information regarding the position of such items, and feeds this into the ‘Generator’ network. This network takes in information regarding the position of landmark items, and then generates an image that corresponds to such landmarks. The ‘Discriminator’, the final network, then compares the base input image to the generated image, and outputs a ‘Realism score’ which indicates how similar the synthesised image is to its base image. This score is used to improve the performance of both the Embedder and Generator.\n\nThe authors of the paper believe that the paper can help make VR and AR communication more realistic and compelling, as the avatars created can be of a far better overall quality. They also recognise, however, that such a technology can be used to create ‘deep fake’ videos, which are artificially generated videos of individuals doing or saying something that they didn’t actually do or say.<br/>\n\n* **April - [Vid2Game: Controllable Characters Extracted from Real-World Videos](https://arxiv.org/pdf/1904.08379.pdf)**\n\nPose estimation is a technique that takes a video featuring humans as input, and creates a mapping of the current position of the human which is bounded to their body. \n\nThis paper describes an algorithm which utilises pose estimation, but allows for the poses created to be controllable - for example, if the ‘right’ key is pressed on the keyboard after a human pose has been identified, that human simulation will move rightwards in a human-like manner.\n\nThis allows for implementation in video games - an input video of a human can be obtained, then it can be fed into the algorithm, after which it can be controlled by a human gamer in order to achieve a particular goal.\n\nIts Pose2Frame capabilities makes it able to blend poses of humans into varying backgrounds. Thus, not only can the pose of a human be implemented into a virtual world with a different surrounding, it can be made to move naturally in such an environment. <br/>\n\n* **April - [Speech synthesis from neural decoding of spoken sentences](https://www.nature.com/articles/s41586-019-1119-1#Abs1)**\n\nResearchers at UC Berkeley (UCB) and UC San Fransisco (UCSF) have created a system with the ability decipher brain signals and create speech from these. The system is intended to improve the ability of those with impaired voices to speak in an audible, human-like manner. It is the newest revelation in brain-machine interface technology, a rising field.\n\nDecoding speech from neural activity is a particularly difficult problem because the act of speaking requires very precise and rapid control of our vocal tract articulators. The system uses a Recurrent Neural Network (RNN) to translate cortical activity (i.e. brain signals) into representations of commands for the movement of these vocal articulators. These brain signals are detected via the placement of a stamp-sized pad, with hundreds of tiny electrodes, at the surface of a human brain. It then uses RNNs once again to transform these commands into speech acoustics. \n\nIn clinical tests, as much as 70 percent of what was spoken by the virtual system was intelligible. The RNN is able to perform relatively well because articulatory representations were found to be highly similar across speakers, enabling a component of the decoder to be transferrable.\n\nWith continued progress in this domain, scientists can hope that individuals with speech impairments will regain the ability to freely speak their minds and reconnect with the world around them.\n\n* **March - [Semantic Image Normalisation with SPACE](https://arxiv.org/pdf/1903.07291.pdf)**\n\nThis paper describes a network that is able to generate high resolution images from simple drawings. Using this network, you could draw in a blue rectangle and the outline of a tree using the network’s sketching application, and the network would generate an image with an ocean and a tree.\n\nThe paper also provides numerous templates for the base of your image - for example, you can choose to base your image on a city skyline, an ocean view or a hilly region. The paper refers to the manipulations added by a user as ‘semantics’, and the templates used to base the image on as ‘reference style images’. \n\nRather than having to hire individuals to label every type of object in thousands of images of scenery, the algorithm uses pre-existing labelling algorithms to label items in an image, allowing it to have as much training data as the number of images that it can source. \n\nThe paper ultimately relies on a technique known as spatially-adaptive denormalisation (SPACE), rather than regular normalisation layers, to help achieve its high-resolution outputs. Just like batch normalisation, the activations are normalised in a channel-wise manner, and then modulated with known scale and bias. However, in SPACE, the modulation parameters vary with respect to the location on the image. This allows it to better preserve semantic information against common normalisation layers, which often simply wash away semantic information.<br/>\n\n* **March - [The Lottery Ticket Hypothesis](https://arxiv.org/pdf/1803.03635.pdf)**\n\nPruning refers to selectively eliminating parts of a neural network by removing particular parameters in order to create a smaller network with fewer parameters which must be trained. Pruning techniques in the past have been largely unsuccessful - even papers by pioneers like Yann LeCun and Geoffery Hinton have been unable to come close to matching the performance of the entire network with a pruned network.\n\nThe lottery-ticket hypothesis, which was the winning paper of ICLR 2019, suggests that a randomly-initialized, dense neural network contains a subnetwork that is initialized such that - when trained in isolation - it can match the test accuracy of the original network after training for at most the same number of iterations. It relies on a standard pruning technique which automatically identifies such trainable subnetworks (known as the ‘winning tickets’) by eliminating parameters (and thus network connections) which contribute least to the overall output of the network. It takes the following steps:\n1. Randomly initialize a neural network.\n2. Train the network for j iterations, arriving at a certain distribution of parameters. \n3. Prune the p% of parameters with the lowest absolute value in this network.\n4. Reinitialise the remaining parameters to their values in the original, randomly-initialized network, leaving you with the ‘winning ticket’ network.\n\nOnce this pruned network has created, the paper shows that the performance of the smaller network is on par with that of the entire network. Aggressively pruned networks, where 95 to 99 percent of parameters are pruned, showed no dip in performance in comparison to the original network. However, moderately pruned networks, where 50 to 90 percent of parameters are pruned, were able to even exceed performance of their unpruned counterparts.\n\nThe pruning technique described above is one-shot, as the unpruned network is trained just once. The paper, however, indicates that a more effective variation of this is to utilise iterative pruning - this relies on pruning the network over n rounds, and at each round pruning p/n% of the parameters.\n\nThe hypothesis provided by the paper is intended to not only significantly reduce the number of parameters that a network must train, thus greatly reducing training time as well, but also allowing us to design better overall networks with less unnecessary noise. <br/>\n\n* **March - [Humans can decipher adversarial images](https://www.nature.com/articles/s41467-019-08931-6.pdf)**\n\nThough recent Convolutional Neural Network systems have surpassed human performance in image detection problems, a problem does remain - simply modifying a pixel or two in the image can cause the system to classify the image as something vastly different. For example, reconfiguring a pixel or two is all it takes for a computer to classify an apple as a car. This ability to ‘fool’ image recognition systems has been criticised as an indication that such systems are unable to interpret images in the same manner as a human would, though a recent paper suggests that this may not be the case.\n\nIn the paper, a pair of cognitive psychologists showed a group of over 1800 subjects images that had already tricked computers into classifying it under the wrong label. They asked people which of two options the computer predicted the object as being - one option being the computer's real conclusion and the other being a random answer. The subjects chose the same answer as computers 75% of the time, and a remarkable 98% of them tended to answer like the computers did.\n\nNext, the researchers gave subjects a choice between the system’s answer and its next-best guess for images it guessed incorrectly. Once again, the subjects again validated the computer's choices - 91 percent of those tested agreed with the system’s decision.\n\nThe study thus provides a degree of evidence that the apparent flaw with Convolutional Neural Network architectures may not be as bad as many think. It provides a new perspective, along with a new experimental paradigm that can be explored.<br/>\n\n* **February - [SC-FEGAN: Face-Editing GAN](https://arxiv.org/pdf/1902.06838.pdf)**\n\nThis AI is a able to generate realistic images from a set of controllable patterns. It builds on a couple of previous papers in the field - the first is the paper that generates an image from a sparse description (such as a written sentence, and the second is the paper which allows for facial features on images to be customised (such as merging two different faces).\n\nThis technique allows us to edit more specific factors - for example, put a smile on someone’s face or remove the sunglasses of an individual. Colour can also be changed - for example, the colour of one’s eye can be manipulated. It is extremely fast, and takes just 50 milliseconds to create these images with 512 x 512 images. \n\nIt has applications in the editing industry in filmmaking, but can also be used by novel consumers who are looking for simple edits to their photos. Though no web app is currently available, it does have its source code publicly-available.<br/>\n\n* **February - [Deep Planning Network (PlaNet)](https://www.nature.com/articles/s41467-019-08931-6.pdf)**\n\nGoogle’s PlaNet AI is intended to learn how to plan a sequence of steps that it must take in order to execute a physical goal - for execute, pole balance or walk like a human. The AI must learn in the same manner as a human would - by looking at the pixels of these images (which requires a visual understanding of the context).\n\nThe AI uses a sparse reward method, which means that it barely gets feedback with regards to its performance on these tasks. The key difference, however, between this and classical Reinforcement Learning methods is that this AI uses models for its learning. This means that it doesn’t learn every new task from scratch, but rather uses its rudimentary understanding that it has gained from previous activities (such as the nature of gravity), and applies this in future ones. Thus, it has a head-start when learning it a game, making it often 50 times more efficient than techniques that begin with learning from scratch.\n\nIt significantly outperforms other state-of-the-art AI systems in most tasks, such as a cheetah run or human walk. This agent doesn’t require separate training for each activity, as it intermixes its training. Also, it can use just 5 frames of reference for a particular activity in order to learn it, with equates to approximately a fifth of a second of footage. It can then learn how to continue with this activity over a longer period of time.<br/>\n\n* **February - [NeuroSAT](https://arxiv.org/pdf/1802.03685.pdf)**\n\nSatisfiability Problems (SATs) are a family of problems which prompt us to determine whether or not it is possible for a given formula to return true, when given any possible set of parameters. \n\nWe can take an example: F is true if A is true and not B is true. In this case, the logical outcome for F would equate to true if A were to be true and B were to be false - thus, this problem can be satisfied. The given example is very simple though - NeuroSAT can solve far more complex problems, even those including graphs (for more examples of such problems, see [this](https://en.wikipedia.org/wiki/Boolean_satisfiability_problem) link).\n\nWhen humans try to solve big and complex problems, there is not much of a better method than arbitrary guessing, which would take a nearly infinite amount of time for longer and more complex problems. NeuroSAT, however, solves these problems through the use of a Neural Network.\n\nFor its training data, the network uses a problem definition as its input, and the binary statement as to whether or not the problem is satisfiable as its output. It is trained using SAT problems that are very simple and thus have already been solved using traditional methods. The network can also provide a possible parameter set for satisfiable problems with a relatively high degree of accuracy (96%). On top of this, when requesting a solution to a SAT problem, the network typically returns the simplest solution possible, largely due to it being trained on a relatively simple set of problems. Thus, this allows for testing on these solutions to be conducted at a faster speed.<br/>\n\n* **January - [3D Pose Estimation](https://arxiv.org/pdf/1901.03798.pdf)**\n\nA pose estimator takes a video as an input, and outputs a figure that corresponds to the pose of the human individuals present in the video. \n\nCurrent difficulties with creating a reliable and real-time 3D pose estimator include the fact that there is little training data, alongside the fact that occlusions must be taken to account. For example, if a particular body part is blocked from view, a pose estimator must still be able to infer its position from the position of the rest of the body.\n\nThis model outperforms all present models as it creates both 2D and 3D representations of the poses. It uses an initial 2D pose estimation, and then utilises a neural network that converts this 2D estimation into a 3D form. It then uses a 3D-to-2D neural network network to convert the pose back into 2D form, which helps to refine the intermediate 3D pose prediction via a self-supervised correction mechanism that can detect the accuracy of the first 2D-to-3D neural network. \n\nThe networks allows for the pose estimation to be obtained in about 50 milliseconds, which is nearly 20 frames per second. This is close to real-time, and is suitable for many of the applications of pose estimation.<br/><br/>\n\n## 2018\n* **December - [GAN Dissection](https://arxiv.org/pdf/1811.10597.pdf)**\n\nThis paper proposes a framework to o visualise and understand GANs at the unit, object, and scene levels. It provides the ability to generate images of a scene, identify the GAN units or neurons that contribute to a particular object that is part of a scene, and then harness these to either activate or deactivate the presence of that particular object. This thus enables us to manipulate images without the need for tools like Photoshop.\n\nFor example, if we had an image of a church, we could indicate to this framework that we wished to remove the doors present in the image. The framework would thus remove the doors while maintaining the structure of the rest of the image in a suitable manner. We could then add the doors back, if desired. On top of this, we can select a particular region of an image where we wish to add something new - for example, I could add a tree to the right side of the image of a church. The framework understands that the trees have a root in the ground, and thus builds on from the ground up in the specified location. The framework is further able to recognise where additions are not suitable - for example, if we wished to draw a door in the sky, the framework would not accept this request.\n\nThe framework uses a segmentation network along with a dissection method to identify the individual units of the generator that match meaningful object classes, like trees. It then activates and deactivates the neurons corresponding to each object class when they are modified in the image - for example, inserting a tree activates the neurons in the GAN that corresponds to a tree. What allows this is a key finding in the paper - the same neurons control a specific object class in a variety of contexts, even if the final appearance of the object varies tremendously. The same neurons can switch on the concept of a \"door\" even if a big stone wall requires a big heavy door facing to the left, or a little hut requires a small curtain door facing to the right.<br/>\n\n* **December - [Style-Based Generator](https://arxiv.org/pdf/1812.04948.pdf)**\n\nThis research paper, authored by scientists at processor and graphics card company Nvidia, demonstrates the potential of an alternative generator architecture for generative adversarial networks that borrows from style transfer literature. It allows for specific customisation and control over features within a human face. It has the potential to be applied to other fields, and has thus far been tested successfully on cars and rooms. \n\nThe generator can combine different aspects of images. For example, if one wished to overlay the gender of one face with the face of another, the generator can do so. The aspects that can be transferred include gender, hair length, pose and the presence of glasses. \n\nThe parameters of the generator can also be controlled one by one without modifying the core content of an image. For example, the presence of a stubble can be modified.\n\nThe generator can also perform interpolation. This means that if we have two images A and B, the generator can create intermediate images that map one to another. It can even change the gender in the process. All intermediate images look real too.<br/>\n\n* **July - [Benchmarking Neural Network Robustness to Corruption & Perturbations](https://arxiv.org/pdf/1807.01697.pdf)**\n\nThis paper underlines a method to evaluate the performance of Image Classifiers in terms of their ability to withstand corruptions and perturbations. It creates two datasets - ImageNet-C (for corruptions) and ImageNet-P (for petrurbations) - which help test the robustness of Image Classifiers to such variations, which are common in real-life scenarios.\n\nIn the context of images, a corruption describes a modification to a base image through distorting its details. The paper utilises 15 different corruption functions on ImageNet mages, each of 5 levels of severity. These corruption functions describe methods including Gaussian Noise, the addition of snow and pixelation.\n\nA perturbation describes the distorting of images by varying its appearance through transformative methods. The paper utilises 8 different perturbation functions on ImageNet images, including zoom, tilt and translation.\n\nTesting the Classifier with images obtained from the ImageNet-C and ImageNet-P datasets, the paper creates a robustness score regarding a its robustness to both corruption and perturbation by averaging its accuracy over all functions of each type and over all levels of severity.<br/>\n\n* **July - [Phrank](https://www.nature.com/articles/s41436-018-0072-y)**\n\nThe algorithm produced automates the most labor-intensive part of genetic diagnosis, that of matching a patient’s genetic sequence and symptoms to a disease described in the scientific literature. Without computer help, this match-up process takes 20 to 40 hours per patient - the process involves the expert looking at a list of around 100 of the patient’s suspicious-looking mutations, making an educated guess about which one might cause disease, checking  scientific literature, and then moving on to the next one. The algorithm developed by Bejerano’s team cuts the time needed by 90 percent. \n\nThe algorithm’s name, Phrank, a mashup of “phenotype” and “rank,” gives a hint of how it works: it compares a patient’s symptoms and gene data to a medical-literature knowledge base, and then simply generates a ranked list of which rare genetic diseases are most likely to be responsible for the symptoms. Phrank, on average, ranked the true diagnosis 4th on the list of potential diagnoses it generated.<br/>\n\n* **June - [Do CIFAR-10 Classifiers Generalize to CIFAR-10?](https://arxiv.org/pdf/1806.00451.pdf)**\n\nThe ultimate goal of a Machine Learning model is to predict the output accurately on new, unseen instances. When training a Machine Learning model, it is thus crucial that the test data is not involved in the process of creating the model, as this would introduce bias towards the test set. Unfortunately, we typically have limited access to new data from the same distribution, which results in many researchers today using the test set in place of a validation set. This allows for hyperparameters, such as the learning rate, to be optimised in accordance to the distribution of the selected test set.\n\nThe research paper proposes a new test set with about 2000 instances which matches the distribution of the test set for the CIFAR-10 dataset, a well-known dataset that many modern image classifier models are tested on. It then evaluates the performance of 30 different modern image classification models. It finds that there is a significant drop from the accuracy in the original test set to the new test set - for instance, VGG and ResNet architectures drop from their well-established 93% accuracy to about 85%. However, the performance of classifiers relative to one another remains more or less constant - thus, the distribution in performance of classifiers can be considered to simply be horizontally shifted.\n\nThe results cast doubt on the robustness of current classifiers. The classification accuracy of widely used models drops significantly - for example, the accuracy loss of VGG and ResNet corresponds to multiple years of progress on the CIFAR-10 dataset. The distribution shift thus questions to what extent current models truly generalise.<br/>\n\n* **June - [RF-Pose](http://rfpose.csail.mit.edu/)**\n\nThe paper provides accurate human pose estimation through walls and occlusions. It leverages the fact that wireless signals in the WiFi frequencies traverse walls and reflect off the human body, and uses a deep neural network approach that parses such radio signals to estimate 2D poses. The pose estimation works well regardless of the lighting conditions, and can also detect multiple humans. \n\nIn the network, there is a teacher network that looks at the colour image of the wall, and predicts the pose that the human is in. There is also a student network that has the signal as an input, and it learns what the different distributions mean, and how they relate to different human positions and poses. The teacher network shows the student network the correct results, and the student learns how to produce them from radio signals instead of images.\n\nBesides being used for motion capture in interactive video games, as well as helping create special effects for movies, pose estimation can also be used to help detect issues with a patient’s posture, track the activity of animals, understanding sign language and pedestrian activity in self-driving cars.<br/>\n\n* **April - [ProGanSR](https://arxiv.org/pdf/1804.02900.pdf)**\n\nTo acheive super-resolution, which allows the conversion of low-resolution images to higher-resolution ones, this paper recommends improving the image resolutions through a progressive method. It takes several intermediate steps where the image produced is slightly better than the predecessor, a known as 'curriculum learning'. \n\nThe paper  uses a GAN rather than simply a CNN. Compared to state-of-the-art models, the images produced using the method proposed in this paper are comprehended with a slightly lower accuracy, however they are produced at 5 times the speed.<br/><br/>\n  \n## 2017\n* **September - [Deep Feature Consistent Deep Image Transformations (DFC-DIT)](https://arxiv.org/pdf/1707.09482.pdf)**\n\nSay you need to downscale an image of yours without reducing the accuracy of the main features, or if you wished to remove RGB colours from an image, or if you display an image of high dynamic range on a screen that doesn’t support the range. Though there are hundreds of existing structures that do these, this paper describes a method that does these exceptionally well in comparison to current methods. \n\nThe paper suggests a Deep Feature Consistent Deep Image Transformation (DFC-DIT) framework. It utilises a Convolutional Neural Network (CNN) that produces three outputs for an input image - a downscaled version, a decolorised version and a HDR tone mapped version. It also uses another pretrained and fixed deep CNN that employs the deep feature consistency principle - this ensures that all main features are preserved in the image.<br/>\n\n* **April - [Federatred Learning](https://ai.googleblog.com/2017/04/federated-learning-collaborative.html?utm_campaign=the_algorithm.unpaid.engagement&utm_source=hs_email&utm_medium=email&utm_content=70607703&_hsenc=p2ANqtz-9kYBnRclCyRm1_Fweb9tezCh4VeAFJVZTpjvf-fzz2akkq4AGCU5Uhhv-4ApNIZO7vb2ZpigcgT_lU3E_2sF1mtaZzqg&_hsmi=70607705)**\n\nA big problem being faced by organisations working with developing Machine Learning algorithms and systems today regards privacy - consumers are unwilling to allow their data to be viewed by others, as this data is considered sensitive to them. Google AI's new research on Federated Learning proposes a solution to this.\n\nThe Federated Learning technique relies on distributed training - it allows for models to be trained independently on a subset of the universal data, and then assembles these independent models into a single, master model. \n\nThere are a couple of use cases for this to better describe how it functions. Firstly, say medical patients are unwilling to have their health records be sent to other hospitals and organisations who they cannot trust. Federated Learning suggests that each hospital construct its own model using the limited patient data that it has, and then it assembles the models of each hospital into a single, unified model using Google's Federated Averaging algorithm. Secondly, say that we wish to train a predictive keyboard to be uniquely suited to our personal typing patterns on our smartphone. We can use a Federated model, which has been trained and compiled from the predictive patterns of many different users and their data, and then pass in our own personal keyboard typing data to update the model to be better suited to our personal typing habits.\n\nFederated Learning technqiues have seen many updates and improvements since, and will certainly remain relevant as AI enters a privacy-centered time in its development.<br/><br/>\n"
  },
  {
    "path": "content/inferno/research/zotero.md",
    "content": "---\ntitle: Zotero\nauthor: khaledbay\ndescription: Explain how to use the bibliographic reference management tool Zotero. It's used extensively in the field of research (writing studies, theses or articles), it makes possible to collect the results of its research, keep the details (text and references) and then create a bibliography. \n---\n\n# Index\n- [Installation](#Installation)\n    - [Windows](#Windows)\n    - [OS](#OS)\n    - [Linux](#Linux)\n- [Features](#Features)\n- [Add reference into your libraries](#Add-reference-into-your-libraries)\n- [Automatic Insertion](#Automatic-insertion)\n- [Manual Insertion](#Manual-insertion)\n- [Tips and Tricks](#Tips-and-tricks)\n\n## Installation\nZotero tool was originally an extension for the [Firefox](https://www.clubic.com/telecharger-fiche11003-mozilla-firefox.html) browser which has since been adapted for [Chrome](https://chrome.google.com/webstore/detail/zotero-connector/ekhagklcjbdpajgpjgmbionohlpdbjgc) and [Opera](https://addons.opera.com/en/extensions/details/zotero-connector/?display=en) as well as in a standalone version for [Windows](https://www.zotero.org/download/), [OS](https://www.zotero.org/download/) and [Linux](https://www.zotero.org/download/).\n#### Windows\nLaunch the setup program that you have downloaded.\n#### OS\nAfter opening the `.dmg` file that you have downloaded, drop Zotero in the Applications folder. You can then launch Zotero from Spotlight, Launchpad or the Applications folder, and add it to your Dock like any other program.\n#### Linux\nTo start Zotero, download the tarball, unzip it and open Zotero from the repository.\n\n_After installation, make sure you also install a Zotero connector suitable for your browser_.\n\n## Features\nThe strength of Zotero lies in its many options for classifying saved pages or sections, in which you can add keywords as well as a category (article, blog post, book chapter...). It is also possible to highlight sentences and add annotations as a note on pages. A dynamic search engine (the results are displayed as you type) is finally on board.\nThe tool is relatively easy to learn and use in relation to its capabilities, and has become a classic used in many universities, engineering schools and research centres.\n\n## Add references into your bibliography\nThere are many hundreds of sites and databases that are compatible with Zotero, and this number is steadily increasing.\nIn order to check if the website you are visiting is Zotero compatible, you just have to verify the presence of one of the Zotero icons in the browser's address bar.\nIn practical terms, there are several ways and options for adding bibliographic references:\n\n- [Automatic insertion](#automatic-insertion)\n- [Manual insertion](#manual-insertion)\n\n### Automatic insertion\nOnce a website is compatible, in order to add a reference in your bibliography, you just have to click on the icon in the address bar:\n- If you are on the page dedicated to the resource notice: Zotero will then import this notice into your bibliography;\n- If you are on a page that displays a list of resources (menu, search result, etc.), Zotero will then suggest that you select, from all the resources listed on the page, the one(s) you want to import into your bibliography \n\n### Manual insertion\nIt is possible that you may want to import references into Zotero that are not available on compatible sites. In order to do this, you will have to fill in the various fields yourself and create a record manually.\nAfterwards, you must create an empty record and fill in the fields, then select the type of document among those proposed. Finally, all you have to do is fill in the fields.\n\n## Tips and Tricks\nA few tips and tricks as well as some small options not developed in this guide.\n\n- If you want to know to which collection(s) a reference belongs, select it in the middle column and press `Crtl` (PC) or `Alt` (Mac). Collections containing this reference are then highlighted in yellow;\n- If you perform the handling described above by holding down the `Shift` button, you will generate a citation instead of a bibliography;\n- You can generate a chronology of your collections or library via the tool menu (gear icon) `Create a chronology`;\n- You can generate a report of one or more references by right-clicking and then `Generate a report`. It is an html page that you can then save, print, convert to pdf and so on.\n\n\n\n\n"
  },
  {
    "path": "content/inferno/soft-skills/impactful-presentations.md",
    "content": "---\ntitle: Impactful Presentations\nauthor: clone95\ndescription: A detailed guide about \"how to impress your audience\".\n---\n\n\n# Index \n\n- [Why do you need to impress your audience](#Why-do-you-need-to-impress-your-audience)\n- [How to build the content](#How-to-build-the-content)\n   - [Know your audience](#Know-your-audience)\n   - [Develop high quality content](#Develop-high-quality-content)\n   - [Build a structure](#Build-a-structure)\n   - [Less is more](#Less-is-more)\n   - [Leverage data power wisely](#Leverage-data-power-wisely)\n- [How to present the content](#How-to-present-the-content)\n   - [Connect with your audience](#Connect-with-your-audience) \n   - [Don’t read](#Don’t-read)\n   - [Be intriguing](#Be-intriguing)\n   - [Use humor](#Use-humor)\n   - [The Pragmatic Storyteller](#The-Pragmatic-Storyteller)\n- [Conclusions](#Conclusions)\n\n::: warning\nThe purpose of this guide is not so much to give you a _written-in-stone_ indication about how you should present your ideas, rather than a bunch of useful tips and guidelines to enhance your communication skills. \n\n_However_, several resources are listed that should be more than sufficient to develop advanced and robust practices for presenting your ideas. \n:::\n\n## Why do you need to impress your audience\n\n#### **Data Science Yesterday**\n\nDuring Virgilio's days, in ancient Rome, data scientists were called [Haruspexes](https://en.wikipedia.org/wiki/Haruspex). \n\nThe State-Of-Art technique they used to represent data and make decisions based on it was to spread the entrails of a bird on a sacred table and try to interpret them. \n\n> \"Such a small stomach? Aha! I'm going to tell the general now that it's time to attack the enemy decisively!\"\n\nBut they always had that problem that they couldn't exceed an average success of 50 percent! :D\n\n#### **Data Science Today**\n\nToday, fortunately, we have more effective tools and the core field \"Data Science\" is looking at the factual evidence of the past to try to make better decisions in the present that affect the future. \n\nIn the age of [data-driven decisions](https://online.hbs.edu/blog/post/data-driven-decision-making), it is increasingly important to have a clear representation of them and how they advise us to act in practice. \n\nLet us give a _few examples_:\n\n- E-Commerce may want to understand which products are best sold, to what kind of target, in what volumes. \n   It may want to understand which products are often bought together so you can \n   get the famous \"hey, the other users who bought X also bought Y!\"(_Cross-marketing_ or _Cross-referencing_).\n\n- A newspaper might be interested in how age groups are divided and in what numbers, among its readers, \n   and might also want to see at what time of day its articles are consulted and from what type of device (mobile, desktop, real paper?).\n\n-  A bank wants to understand what are the maximum margins that can be put on policies and loans, to find the best compromise between competitiveness and gain. \n \nYou will find that this reasoning applies to anything, _if you have enough data!_\n\n::: warning \nExtracting knowledge from the data, however, is useless if **the audience** \nto which we must communicate (managers, customers, colleagues, departments) \ndo not perceive the urgency of looking at the data to make decisions!\n:::\n\nWith this guide, Virgilio will introduce you to the key principles for effectively presenting your data and the conclusions\nthat can be drawn from them. \n\n**For this guide, Virgilio will consider that you're presenting with the tech support of simple slides.**\n\n## How to build the content\n\n## Know your audience\nAre you talking to managers or developers? Are you educating your sellers, or are you the same seller who has to convince a customer?\nIn any case, the first rule is [**Know your audience**](https://www.asme.org/career-education/articles/public-speaking/public-speaking-know-your-audience).\n\nIf you know your audience, their tastes, their interests, you can build your presentation in the best and most targeted way. [Here](https://www.ethos3.com/2009/10/5-ways-to-get-to-know-your-audience/) you find 5 more ways to do it.  \n\n## Develop high-quality content\nThe content is the **very core** of your presentation. \n\nWhile all the other ideas below will help you make your content more effective, a great presentation starts and ends with great content.\n\nSo don't shorten your audience by shortening the effort you spend developing your content.\n \nYou will need to invest many hours of research, writing, and asking for feedbacks if you want to create a presentation that your audience will love.\n\nYou want to refine your material as more as you can, but don't over-prepare everything, otherwise, you'll seem too much rigid and artificial: we'll see that one of the key points in this guide will be \"be authentic\".\n\n## Build a structure\n\n**Virgilio strongly advises you to build an organic structure that you then follow in your presentation.**\n\n[Here](https://virtualspeech.com/blog/how-to-structure-your-presentation) you find a good overview of \"how to build a structure\".\n\n[Here](https://visme.co/blog/presentation-structure/) you find 7 common structures.\n\n**A simple and well-known structure is the 3-act one.**\n\nAlthough not all presentations fit easily into the 3-act structure, it is generally a good general method to follow (with the necessary adjustments according to the situation).\n\n**1** - The **First Step** is the introduction, the setting of the presentation. This is the moment when you capture the audience's attention, giving them the expectation of what will come out of it and a reason to keep listening.\n\n**2** - The **Intermediate Step** is the moment when you support their interest. You are usually detailing a problem and offering a solution while you educate and inform along the way. It is here where you truly build your case and sell the benefits. This is where you want to provide compelling examples, data, statistics, etc. to support your points.\n\n**3** - The **Final Step** is where you solve the problem, summarize it, and reminds the audience of the highlights of your presentation. Then leave the audience with a call to action and a list of practical points. What is supposed to be taken away from your presentation by the audience? This should be clearly defined in the closing Step. Also, a final story or illustration and questions from the audience are a great way to end the presentation and help people remember the sense of your discourse.\n\n## Less is more\nPacking slides with information do not necessarily make them more effective. In fact, you often get the opposite effect by producing confusing slides that take away, rather than adding value to a  presentation.\n\nWell-designed slides help the speaker to emphasize his or her point of view and the audience to understand the key steps of a presentation.\n\nFollow the principle of [\"Less is More\"](https://www.presentation-guru.com/when-it-comes-to-presentations-less-is-more/).\n\n[The Hemingway Editor](http://www.hemingwayapp.com/) will help a lot you writing in a good style, preferring conciseness and fluency.\n\n## Leverage data power wisely\nAccording to SpiderMan's uncle:\n> From great power comes great responsibility.\n\nThe data can be of help or your enemies during a presentation, depending on how you use them and especially you show them graphically. Don't put too much data in your presentation (remember, Less is More)!\n\nTake this [awesome read](https://moz.com/blog/data-visualization-principles-lessons-from-tufte), then find [here](http://mkweb.bcgsc.ca/talks/datavisualization/datavisualization.pdf) some great examples.\n\n## How to present the content\n\n## Connect with your audience\nFirst, you need to [create a link](https://www.forbes.com/sites/lisaroepe/2017/03/14/6-ways-to-connect-with-your-audience-during-a-presentation/#73e158396516) between you and your audience. \n\nIn this way, they'll follow you because they trust that you're useful to them and you genuinely want them to learn something. \n\nThis process is called [\"building trust\"](https://www.trainingjournal.com/articles/opinion/how-build-trust-audience-when-making-presentation).\n\n## Don’t read\nReally, don't do it. \n\nReading slides will bore your audience and you'll seem less confident.\n\n[Here's](https://www.techwell.com/2013/10/give-better-presentation-don-t-read-your-slides) why.\n\n[Here's](https://academia.stackexchange.com/questions/76370/why-do-most-people-think-its-a-bad-idea-to-read-from-slides) a mine full of other reasons.\n\n## Be intriguing\nThe best way to attract people is to grab their attention. \n\nDoing this it's not so easy, but with some psychological tricks, you can bewitch and convince them. [Here](https://www.inc.com/sims-wyeth/how-to-capture-and-hold-audience-attention.html) you have a really good explanation of what I'm saying.\n\n## Use humor\nIf you're here, it's mostly because I've been intrigued and caught your attention.\n\n A big part of this game has been played by humor.\n[Here](https://www.writersdigest.com/online-editor/how-to-mix-humor-into-your-writing) you can learn how to embed humor in your writings, and [here](https://www.fastcompany.com/3068891/how-to-incorporate-humor-into-presentations-in-the-most-un-cringeworthy-way) you can learn how to do it in your speeches.\n\n## The Pragmatic Storyteller\nA sunny morning, in the 44 B.C.\n> \"Good morning, noble court legislators. \n\n>Today I want to tell you a personal story. At the age of 7, my father took me to the Colosseum in Rome for the first time to see the gladiators fight.  Like all children, I was very excited about that day, I saw all the older boys playing the game of gladiators with fake swords and talk about the furious fights between men, lions, and elephants!\nTens of thousands of people were there for the same reason, seeing two prisoners fighting in blood until one of them wins.\nI was feeling different sensations in the air: the excitement in the audience, who wants to vent their repressed violence, the fear in the eyes of the fighters, who know that everyone will fight with the utmost commitment because it is at stake his life.\nThe clash begins, the crowd screams and enjoys seeing this show that I can only consider terrifying. In the end, the strongest physically wins and kills mercilessly the other.\nDear noble legislators, today I'm 50 years old and I'm here to ask you: is this the symbol we want for the Roman civilization? How do we differ from the barbarians beyond the Alps?\nHow can we consider ourselves a refined people rich in culture, if we fall into easy vices like that of gratuitous violence? For these reasons, appealing to your intelligence, _I suggest you abolish the violent games in the Colosseum, for the sake of the image of our civilization._\n\nThis was **the personal Virgilio's story** that was talking, not a cold presentation and there are not so many numbers!\n\n**This approach to presenting ideas called storytelling.**\n\nYou can notice several things:\n- Coherent flow \n   - Setting\n   - Story \n   - Emotions and sensations (you need to reproduce them in your audience)\n   - Motivations for the conclusion\n   - Conclusion\n- Use of the first person\n- Rhetorical questions\n- Naturalness\n- Confidence with the public grows with the story, while showing spontaneity and humility help you to connect with it\n- In the end, a wrap-up of reasons and the practical suggestion to solve the problem\n\nRead here to learn to do [StoryTelling](https://blog.hubspot.com/marketing/storytelling) in a coherent fashion.\n\n**The more authentic, visceral, and suggestive you are, the more your audience will trust you and remember the concepts.**\n\nSome resources to become a better Storyteller:\n\n- [Here](https://www.youtube.com/watch?v=Nj-hdQMa3uA) a brief Ted Talk about this.\n- [Here](https://www.articulatemarketing.com/blog/22-rules-of-storytelling-from-pixar) you find a great list of storytelling best practices from Pixar.\n- [Here](https://visme.co/blog/visual-storytelling-rules/) you find the rules of thumb of visual storytelling.\n\n\n## Conclusions\n\nNow you should be able to build and communicate effective presentations, and remember to use this guide as a reference in the future!"
  },
  {
    "path": "content/inferno/time-series/introduction-to-time-series.md",
    "content": "---\ntitle: Introduction to Time Series\nauthor: clone95\ndescription: This guide aims to show you the Data Science applications you can build for dealing with time series data.\n---\n\n# Index\n\n- [Time Is Money](#Time-Is-Money)\n- [Introduction To Time Series](#Introduction-To-Time-Series)\n- [Time Series Problems Overview](#Time-Series-Problems-Overview)\n    - [Time Series Analysis](#Time-Series-Analysis)\n    - [Time Series Forecasting](#Time-Series-Forecasting)\n    - [Time Series Classification](#Time-Series-Classification)\n    - [Time Series Forecasting as a Classification Problem](#Time-Series-Forecasting-as-a-Classification-Problem)\n    - [The Matrix Profile](#The-Matrix-Profile)\n    - [Automatic Time Series Feature Extraction](#Automatic-Time-Series-Feature-Extraction)\n    - [Additional Resources](#Additional-Resources)\n- [Conclusions](#Conclusions)\n\n\n**Disclaimer!**\n\nThis guide is not intended to be exhaustive of everything you can do with time series data, but to offer you a good overview of the possible approaches you can take or things you should check when dealing with them. \n\nHaving that said, let's begin!\n\n## Time Is Money\n\nWhether it is the sale of products, the estimated production of an agricultural field, or the forecast of any activity of a company, time series are an indispensable type of data, which has been used for thousands of years to inform the activities to be done **today**, based on what will happen **tomorrow**. \n\nA good estimate of the future data, for a company, can bring a great saving of time (and money)! \n\nIf you ask any manager will tell you that _time is even more important than money_, because you can convert time into money, _but the opposite is not possible!_ \n\nLearning to work with time series is a very valuable skill in the real world, and applicable to many situations and problems. \n\nIt is also considered one of the most \"difficult\" types of data to manage since _it has additional complexities_ compared to more traditional data such as tabular data or text.\n\nWe will see these additional complexities in the section [Time Series Additional Challenges](#Time-Series-Addtional-Challenges).\n\nNow that you know why it's important to know how to work with time series, it's time to start seeing them in practice! \n\n## Introduction To Time Series\n#### Know the Time Series Data Structure\n\nThe first resources Virgilio recommends to get you started are the following:\n\n- [Tutorial: Time Series Analysis with Pandas](https://www.dataquest.io/blog/tutorial-time-series-analysis-with-pandas/)\n- [Working with Time Series](https://jakevdp.github.io/PythonDataScienceHandbook/03.11-working-with-time-series.html)\n\nThese are an exhaustive introduction to the type of \"time\" data, how it is manipulated with Pandas (indexing, transformation, visualization).\n\nAfter you've gone through them, you should understand how to write **\"idiomatic Pandas\"** for time series, and you can find a tutorial (section 7 of [Modern Pandas](https://tomaugspurger.github.io/modern-1-intro)) here: \n\n- [Modern Pandas](https://tomaugspurger.github.io/modern-7-timeseries)\n\nCommon time-series data manipulation steps:\n\n- [Train-Test Split](https://medium.com/keita-starts-data-science/time-series-split-with-scikit-learn-74f5be38489e)\n- [Resampling](https://machinelearningmastery.com/resample-interpolate-time-series-data-python/#:~:text=Resampling%20involves%20changing%20the%20frequency,as%20from%20days%20to%20months.)\n- [Shift](https://towardsdatascience.com/time-series-analysis-resampling-shifting-and-rolling-f5664ddef77e)\n- [Lag](https://math.stackexchange.com/questions/2548314/what-is-lag-in-a-time-series)\n- [Autocorrelation](https://machinelearningmastery.com/gentle-introduction-autocorrelation-partial-autocorrelation/#:~:text=Because%20the%20correlation%20of%20the,Function%2C%20or%20the%20acronym%20ACF.)\n\nAfter learning these resources, you will have a better understanding of what \"time-series\" mean and what time-series data is about!\n\n## Time Series Problems Overview\n\nIn the next sections, we see what are the main problems that can be solved with time series data.\n\n::: warning\nBe aware that this is not an exhaustive list, and you should consider it only _a guideline!_ \n:::\n\nOnce you have identified a problem that you are interested in solving, you need to find papers that talk about the state of the art of that problem and go deeper!\n\nIt is always true that **there is no silver bullet that solves every problem**, remember the [No Free Lunch Theorem](https://en.wikipedia.org/wiki/No_free_lunch_theorem).\n\nLearning to manipulate time-series data with Pandas is mandatory, and the Pandas DataFrame structure is the natural landing place for this type of data. However, due to the \"sequential\" nature of the data type, the DataFrame has some structural limitations, because it is designed for more classic tabular data. \n\nTo overcome these limitations, the [Alan Turing Institute](https://www.turing.ac.uk/) has developed a special version of Scikit-Learn, [Sktime](https://github.com/alan-turing-institute/sktime), using a specific .ts format to load time series data into Pandas DataFrames. \n\nFrom the docs: \n> sktime is a Python machine learning toolbox for time series with a unified interface for multiple learning tasks. \n>sktime provides dedicated time series algorithms and scikit-learn compatible tools for building, tuning, and evaluating composite models. \n>\n>We currently support:\n>- Forecasting\n>- Time series classification\n>- Time series regression\n>\n>For deep learning methods, see our companion package: [sktime-dl](https://github.com/sktime/sktime-dl).\n\nTo get started with SKtime get through the following resourse:\n\n- [SKTime - How to get started](https://www.sktime.org/en/latest/how_to_get_started.html)\n- [Loading data in SKTime](https://www.sktime.org/en/latest/examples/loading_data.html)\n- [SKTime - Examples](https://github.com/alan-turing-institute/sktime/tree/master/examples)\n\nAlso, be aware of [TSLearn](https://github.com/tslearn-team/tslearn), a very good machine learning toolkit for time series analysis in Python.\n\nThese are the basic tools you need to know to work with time series in Python, let's now have a look at _what type of problem_ you can solve with time series data.\n\n## Time Series Analysis\n\nImagine you are working as a Data Scientist, and you are asked to do _\"something useful\"_ not better specified. Your first intuition must be, as with any type of data, to understand the dataset and the type of information it brings with it.\n\nThis process, often called *\"analysis\"*, is fundamental before any other, for example before trying to make predictions about future values.\n\nThe path Virgilio suggests is the following: \n\nFirst of all, take this free and extremely complete course that introduces you to time series analysis:\n\n- [**Introduction to Time Series Analysis**](https://www.itl.nist.gov/div898/handbook/pmc/section4/pmc4.htm)\n- [https://www.youtube.com/playlist?list=PL3N9eeOlCrP5cK0QRQxeJd6GrQvhAtpBK](https://www.youtube.com/playlist?list=PL3N9eeOlCrP5cK0QRQxeJd6GrQvhAtpBK)\n\nOnce you're done with this, you can expand your knowledge with the following (extremely detailed) resources. \n\n- [Eberly College of Science - Applied Time Series Analysis](https://online.stat.psu.edu/stat510/)\n- [Statistical forecasting: Notes on regression and time series analysis](http://people.duke.edu/~rnau/411home.htm)\n- [Modern Time Series Analysis](https://www.youtube.com/watch?v=v5ijNXvlC5A&t=9627s&ab_channel=Enthought)\n\nEventually, you can use this _very deep_ book as a reference:\n\n- [Time Series Analysis and Its Applications](https://www.stat.pitt.edu/stoffer/tsa4/tsa4.pdf)\n\n::: tip\nBe sure to check the [The Matrix Profile](#The-Matrix-Profile) section, you won't be disappointed! \n\nThis **extremely useful** method gives you invaluable insights about patterns in your times series data!\n:::\n\nVirgilio is _pretty sure_ that these 3 resources and the book can give you a **very detailed** preparation on the topic, so be sure to take the time that's needed to digest them very well! \n\nSome educational videos can be found:\n\n- [Aileen Nielsen - Time Series Analysis - PyCon 2017](https://www.youtube.com/watch?v=zmfe2RaX-14&feature=youtu.be&ab_channel=PyCon2017)\n- [Time Series Analysis - Georgia Tech](https://www.youtube.com/watch?v=31ng0uLqfhc&list=PL_onPhFCkVQghJC-KQkUNvkAGbriARyfX)\n- [Time Series Talk](https://www.youtube.com/watch?v=DeORzP0go5I&list=PLvcbYUQ5t0UHOLnBzl46_Q6QKtFgfMGc3&ab_channel=ritvikmath)\n\nSome other links that can help you are the following:\n\n- [Time series analysis - Python](https://www.kaggle.com/kashnitsky/topic-9-part-1-time-series-analysis-in-python)\n- [Time Series Analysis in Python - Getting Started](https://www.kaggle.com/getting-started/54280)\n- [Learning Time Series Analysis](https://www.reddit.com/r/datascience/comments/9k9xct/learning_time_series_analysis/)\n\n\n## Time Series Forecasting\n\nThe most classic of the problems related to time series is that of predicting the future values of the series.\n\nWhether it is the price of a stock, the number of products sold, or the electricity needs of a part of the city, the topic of forecasting is fundamental in any aspect of human society. \n\nAn interesting read:\n\n- [Evolution of Forecasting from the Stone Age to Artificial Intelligence](https://medium.com/sciforce/evolution-of-forecasting-from-the-stone-age-to-artificial-intelligence-198e2b1457f5)\n::: tip\nKnowing how to predict a time series, with enough historical data behind it, **is an invaluable skill** in the modern data market, and every kind of company can benefit from it!\n:::\n\nAs usual, Virgilio has collected for you the best free resources available, let's see!\n\nThe first and most important resource in time series forecasting is the following textbook:\n\n- [**Forecasting: Principles And Practice**](https://otexts.com/fpp2/)\n\nThe textbook uses R examples throughout the lessons, but it's not mandatory to learn R to use it! \n\nThe advice Virgilio gives you is to try to follow the lessons **translating** the R code to Python code, obviously helping you with Google and all the resources at your disposal!\n\nIn this way, you'll learn a lot about how to use Python for time series forecasting, and you'll have a lot of **reusable code** for your future projects!\n\nSome other useful resources are:\n\n- [Applying Statistical Modeling & Machine Learning to Perform Time-Series Forecasting](https://www.youtube.com/watch?v=JntA9XaTebs&t=6s&ab_channel=PyData)\n- [A Worked Example of Using Neural Networks for Time Series Prediction](https://www.youtube.com/watch?v=hAlGqT3Xpus&ab_channel=PyData)\n- [Reliably forecasting time-series in real-time ](https://www.youtube.com/watch?v=0zpg9ODE6Ww&ab_channel=PyData)\n- [Time Series Forecasting using Statistical and Machine Learning Models](https://www.youtube.com/watch?v=_vQ0W_qXMxk&ab_channel=PyData)\n\n::: tip\nIt's important to understand that no-one-method will always outperform others, and that time series forecasting is a hot research topic, and you should always try to be aware of new techniques or approaches! \n\nBe sure to read some survey papers, once a while, like [**this one**](https://arxiv.org/abs/2004.13408)!\n:::\n\nCheck also the [**Prophet**](https://facebook.github.io/prophet/) project, from Facebook AI Labs!\n\nProphet is a procedure for forecasting time series data based on an additive model where non-linear trends are fit with yearly, weekly, and daily seasonality, plus holiday effects. \n\nIt works best with time series that have strong seasonal effects and several seasons of historical data. \n\nProphet is robust to missing data and shifts in the trend, and typically handles outliers well.\n\n::: tip\nCheck also [NeuralProphet](https://github.com/ourownstory/neural_prophet), Neural Network based Time-Series model, inspired by Facebook Prophet and AR-Net, built on PyTorch.\n:::\n\n## Time Series Forecasting as a Classification Problem\n\nA very useful approach to keep in mind when working with time series forecasting is to _treat the problem of forecasting as a classification problem._\n\nIf treated in this way, the problem can be \"simplified\" and so be faced with a simpler problem to solve.\n\nFor example, **preventing the exact price** of Apple shares tomorrow could be a very difficult challenge, but fortunately, it is a problem that can be _\"simplified\"_!\n\nAn effective way to simplify this problem is to divide the space of tomorrow's possible prices (in terms of % variation) into bins! \n\nFor example with 20 bins, the classes would be: [-100%, -90%], [-90%,-80%]....the other bins...[+80%, +90%], [+90%,+100%].\n\n**This type of multiclass classification can be simplified \"at-will\"**, even going so far as to classify whether tomorrow the price will be higher or lower than today (binary classification, _higher_ or _lower_).\n\nIf you think about it, if you struggle to get a decent model for the simplest (binary) classification, you don't have much hope to predict the _exact value_ of the shares the next day!\n\nThis brings us to the next section of the guide, where you will learn how to deal with time series classification problems.\n\nTo read more about this approach:\n\n- [Forecasting vs Classification](https://stats.stackexchange.com/questions/178413/forecasting-vs-classification)\n- [Forecasting to Classification: Predicting the direction of stock market price](https://www.researchgate.net/publication/309492895_Forecasting_to_Classification_Predicting_the_direction_of_stock_market_price_using_Xtreme_Gradient_Boosting)\n\n## Time Series Classification\n\nThe problem of time series classification is of _primary importance_ in the world of data mining, and over the last two decades, countless methods have been proposed to solve it. \n\nKnowing how to predict the best choices in the near future is even vital in a variety of industrial scenarios or even _critical_ scenarios such as aircraft safety systems!\n\nSome examples of time series classification problems are:\n\n- Predict whether a machine might break or not\n- predict whether a customer will leave a service or not\n- classify the type of disease of a patient by the time series of his heartbeat\n- classify an animal according to the sound it makes\n- predict anomalies and trend changes in quantities measured by the sensors \n- and many more...\n\nIn this section of the guide, you can find a logical collection of all the resources that can be useful to take advantage of **the power of modern time series classification methods**.\n\nFirst of all, the site you must ** refer to** to find all the latest _datasets, techniques, papers, and code_ that you can use to solve your time series classification problems:\n\n> This website is an ongoing project to develop a comprehensive repository for research into time series classification. \n\n- [**Time Series Classification Website**](http://www.timeseriesclassification.com/)\n\nFor a complete comparison of all available useful methods and their tradeoffs, read:\n\n- [The Great Time Series Classification Bakeoff: An Experimental Evaluation](https://www.researchgate.net/profile/Anthony_Bagnall/publication/301856632_The_Great_Time_Series_Classification_Bake_Off_An_Experimental_Evaluation_of_Recently_Proposed_Algorithms_Extended_Version/links/579b580e08ae80bf6ea33d12.pdf)\n- [Deep learning for time series classification: a review](https://arxiv.org/pdf/1809.04356.pdf)\n\nA very hot (and very recent) method that has been proposed and you should be aware of:\n\n- [ROCKET: Exceptionally fast and accurate time series classification using random convolutional kernels](https://arxiv.org/abs/1910.13051)\n\nAnother extremely effective method that is always worth trying is that of the [matrix profile](#The-Matrix-Profile) (next section).\n\n::: tip\nSome methods are more precise, others are faster, others require less data, others can find complex relationships in the data (neural networks). \n**A fundamental point** is that _rarely_ it is worth choosing complex methods (such as a complicated recurrent neural network) over more \"simple\" ones, such as BOSS or DTW.\n:::\n\nEquipped with the methods considered here, it's almost guaranteed that you will find the perfect fit for the requirements of your problems.\n\n## The Matrix Profile\n\nFrom the [The UCR Matrix Profile Page](https://www.cs.ucr.edu/~eamonn/MatrixProfile.html) website:\n\nThe Matrix Profile (and the algorithms to compute it: STAMP, STAMPI, STOMP, SCRIMP, SCRIMP++, SWAMP, and GPU-STOMP), has the potential to **revolutionize time series data mining** because of its **generality, versatility, simplicity, and scalability**.  In particular, it has implications for:\n\n- time series motif discovery\n- time series joins\n- shapelet discovery (classification)\n- density estimation\n- semantic segmentation\n- visualization\n- rule discovery\n- clustering \n\nTo learn how to use the Matrix Profile for your times series classification problems go through these _invaluable_ resources:\n\n- [Time Series Data Mining Using the Matrix Profile: A Complete Tutorial](https://www.cs.ucr.edu/~eamonn/Matrix_Profile_Tutorial_Part1.pdf)\n- [100 Time Series Data Mining Questions and Answers](https://www.cs.ucr.edu/~eamonn/100_Time_Series_Data_Mining_Questions__with_Answers.pdf)\n- [The Matrix Profile - How Does It Work?](https://www.cs.ucr.edu/~eamonn/Matrix_Profile_Tutorial_Part2.pdf)\n\nThe recommended Python package that Virgilio suggests you to work with the Matrix Profile is [**Stumpy**](https://seanlaw.github.io/2019/05/13/stumpy/) (docs [here](https://stumpy.readthedocs.io/en/latest/Tutorial_STUMPY_Basics.html)), which implements the latest and most efficient methods to calculate the Matrix Profile for your time series. \n\n> The Author of the package ([Sean Law](@seanmylaw)) contributed to this guide too, reviewing it on GitHub and helping Virgilio collecting all the resources. You can find a lot of detailed tutorials about using Stumpy for the matrix profile on his [Medium Page](https://medium.com/@seanmylaw/stumpy-fdb9f8f1f261) or get in touch with him at his [LinkedIn Page](https://www.linkedin.com/in/seanlawphd/). In addition, he's very active in answering questions and giving tips about Tumpy in the [\"Issues\" section](https://github.com/TDAmeritrade/stumpy/issues?q=) of the GitHub project!\n\nOne of the (very many) advantages of the Matrix Profile is that you can calculate it _to feed it_ to a more traditional method of supervised classification. \n\nIn this sense, the Matrix Profile is also a method of automatic features extraction!\n\nOther useful links are:\n\n- [Modern Time Series Analysis With STUMPY](https://www.youtube.com/watch?v=xLbPP5xNIJs&ab_channel=StitchFixMultithreaded)\n- [Stumpy Tutorials on Binder](https://mybinder.org/v2/gh/TDAmeritrade/stumpy/master?filepath=notebooks)\n- [Stumpy: unleashing the power of the matrix profile for time series analysis](https://notamonadtutorial.com/stumpy-unleashing-the-power-of-the-matrix-profile-for-time-series-analysis-7c46af040adb)\n\n## Automatic Time Series Feature Extraction\n\nThe extraction and engineering of features from data is _fundamental_ in the Data Science process, and time series are no different.\n\nOn the contrary, historically they offer additional challenges and require some knowledge of [_signal theory_](https://zone.ni.com/reference/en-XX/help/372656C-01/lvasptconcepts/tsa_intro/) in order to be fully understood and exploited!\n\nLuckily there are **extremely intelligent methods** to help you in this and extract the most important features automatically!\n\nSay thanks to the creators of [**Tsfresh**](https://github.com/blue-yonder/tsfresh):\n\n>**TSFRESH automatically extracts 100s of features from time series**. Those features describe basic characteristics of the time series such as the number of peaks, the average or maximal value, or more complex features such as the time-reversal symmetry statistic.\n\n>The set of features can then be used to construct **machine learning models on the time series** to be used for example in regression or classification tasks.\n>To avoid extracting irrelevant features, the TSFRESH package has a built-in filtering procedure. This filtering procedure **evaluates the explaining power and importance of each feature** for the regression or classification tasks at hand.\n\nImportant links:\n\n- [Docs](https://tsfresh.readthedocs.io/en/latest/)\n- [Gitter Community for Q&A](https://gitter.im/tsfresh/Lobby?utm_source=share-link&utm_medium=link&utm_campaign=share-link)\n\n\n## Additional Resources\n\nCheck out these additional resources:\n\n- [Time Series Topic - awesome-ai-ml-dl](https://github.com/neomatrix369/awesome-ai-ml-dl/blob/master/time-series_anomaly-detection/time-series.md#gaussian-process)\n- [Understanding LSTM Networks](http://colah.github.io/posts/2015-08-Understanding-LSTMs/)\n- [Visualizing memorization in RNNs](https://distill.pub/2019/memorization-in-rnns/)\n- [Attention and Augmented Recurrent Neural Networks](https://distill.pub/2016/augmented-rnns/)\n\n\n## Conclusions\n\nThis guide is long and detailed, and you can use it as a clear path in becoming **very proficient** when working with time series, or as a **reference** for important resource links to keep in mind. \n\nTo become comfortable with the time series type of data will take commitment and dedication, in particular, it is highly recommended _to experiment with the methods_ proposed on datasets that you can find online, as well as _compose your dataset_ and work with it. \n\nRemember that only by facing _small real projects_ will you fix your theoretical knowledge acquired with the resources Virgilio provides you!\n\n"
  },
  {
    "path": "content/inferno/tools/geo-gebra.md",
    "content": "---\ntitle: Geo Gebra\nauthor: khaledbay\ndescription: The purpose of this guide is to show you the powerful mathematics applications of Geo Gebra and how to use it to educate to geometry, algebra, spreadsheet, grapher, statistics and infinitesimal calculation.\n---\n\n# Index\n\n- [GeoGebra](#GeoGebra)\n- [Installation](#Installation)\n- [Features](#Features)\n- [Mathematical representations of GeoGebra](#Mathematical-representations-of-GeoGebra)\n- [GeoGebra applications](#GeoGebra-applications)\n- [Scientific Calculator](#scientific-calculator)\n- [Graphing Calculator](#graphing-calculator)\n\n# GeoGebra\n[GeoGebra](https://www.geogebra.org) (GG) is a powerful dynamic mathematics application for all levels of education that combines geometry, algebra, spreadsheet, grapher, statistics and infinitesimal calculation into a single easy-to-use software. The GeoGebra community is growing exponentially with millions of users based in many countries. GeoGebra has become the leading provider of software for advanced mathematics, science support, technology, engineering and mathematics and innovations in teaching and learning around the world.\n\n## Installation\nGeoGebra applications can be used offline for [iOS](https://itunes.apple.com/us/app/geogebra-graphing-calculator/id1146717204), [Android](https://play.google.com/store/apps/details?id=org.geogebra.android), [Windows](https://www.geogebra.org/download), Mac, Chromebook and Linux.\n\nWe also advise you that all installers are subject to the non-commercial license. If you intend to install GeoGebra on several devices, you may be interested in GeoGebra Mass Installation.\n\n\n## Features\n- Geometry, Algebra and Spreadsheet are connected and fully dynamic\n- Ease of use of the interface with many powerful features\n- Innovative tool for creating interactive learning resources in the form of web pages\n- Open source software freely usable by non-commercial users\n\nIn the simplest way, you can make constructions containing points, vectors, segments, lines and conics as well as functions, which can then be modified dynamically with the mouse.\n\n## Mathematical representations of GeoGebra\nGeoGebra includes three different representations of mathematical objects: _a graphical representation, an algebraic representation and a spreadsheet representation_.\nThese allow each of the three different representations of mathematical objects to be displayed: graphical (e. g. points, function curves), algebraic (e. g. point coordinates, equations), and in spreadsheet cells. \n\n## GeoGebra applications\nWe will demonstrate how easy it is to use GeoGebra applications by presenting:\n\n- [Scientific Calculator](#scientific-calculator)\n- [Graphing Calculator](#graphing-calculator)\n\nAll GeoGebra applications are fully compatible because they are based on the same powerful GeoGebra math engine. Your GeoGebra folders will run in all applications and on all your devices.\n\n### Scientific Calculator\nThe GeoGebra scientific calculator is available online via this [site](https://www.geogebra.org/calculator).\nGeoGebra is a scientific calculator that includes:\n- Calculations using fractions\n- Trigonometric functions: `sin`, `cos`, `tan`\n- Statistical functions\n- Exponential functions and logarithms\n- Mode examen pour les tests\n\nThe GeoGebra scientific calculator consists of a header bar, an input bar and a scientific calculation keyboard. The scientific calculator consists of three different keyboards. The keyboards can be switched by selecting the one you want to use.\n-  _`123` keyboard_: provide keys for numbers and basic mathematical operations and symbols. Keys for numbers and basic arithmetic, trigonometric and logarithmic operators are available.\n- _`f(x)` keyboard_: provide statistical and other mathematical functions.  The keys are used to select other mathematical and statistical functions.\n- _`ABC` keyboard_: contains letter keys. It includes alphabetical keys \n\n### Graphing Calculator\nThe GeoGebra Graphing calculator is available online via this [site](https://www.geogebra.org/graphing). This graphing calculator gives you the possibility to draw functions and to explore equations.\n \nIn or to create a new curve, please type your expression in the input field. The software then traces the representative curve of your expression as you type.\nFor example, you can draw a simple line by typing this expression `y = 2x + 3`. In order to make the graph more dynamic, you can use parameters instead of constants (as an example, `y = ax + b`).\nAdd cursors in the parameters by clicking on the relevant buttons or define them yourself by entering `a=2` and `b=3`. If you assign constant values to parameters such as `a` and `b`, you will automatically be able to adjust these values using cursors. \n\nGraphing Calculator features include: \n- Representing functions, polar and parametric curves\n- Solving equations with a powerful mathematical engine\n- Experimenting transformations with cursors\n- Calculating derivatives and integrals\n- Making statistics and regressions with fitting lines\n\n\n\n"
  },
  {
    "path": "content/inferno/tools/latex.md",
    "content": "---\ntitle: LaTex\nauthor: damianoazzolini\ndescription: The purpose of this guide is to show you the endless capabilities of the the LaTex Engine and how to it to create wonderful papers and presentations.\n---\n\n# Index\n\n- [LaTeX](#LaTeX)\n- [Why LaTeX](#Why-LaTeX)\n- [Installation](#Installation)\n- [Writing a Document](#Writing-a-Document)\n- [Tools to increase productivity](#Tools-to-increase-productivity)\n- [Useful Packages](#Useful-Packages)\n- [Displaying Math](#Displaying-Math)\n- [Code Blocks](#Code-Blocks)\n- [Logic](#Logic)\n- [Automata](#Automata)\n- [This is why you need to learn Machine Learning](#This-is-why-you-need-to-learn-machine-learning)\n\n\n# LaTeX\nLaTeX is a markup language (or, as said in the [official website](https://www.latex-project.org/about/), \"a document preparation system for high-quality typesetting\") used to create wonderful papers and presentations. Almost all papers you will read during your career are written using LaTeX. So, let's see how it works!\n\n## Why LaTeX\nFor years now LaTeX has been the go-to tool whenever someone needs to create a document that will contain mathematical formulas. LaTeX is used a lot to write scientific papers and it is also used by bloggers and scientific content creators in the internet. You can even use LaTeX syntax on facebook messenger! (which only renders if you are on your computer)\n\n## Installation\nThere are several LaTeX distributios, you can see a complete list [here](http://www.tug.org/interest.html#free).\n\nUnder Unix systems, you can install [TeXLive](http://www.tug.org/texlive/). In particular, under Ubuntu you can type in the terminal `sudo apt-get install texlive-full`. \nUnder Windows systems, you can install [MiKTeX](https://miktex.org/) or also [TexLive](http://www.tug.org/texlive/).\nUnder MacOs, [MacTex](http://www.tug.org/mactex/).\n\nAfter the installation, you need an editor to write your LaTeX document. You can use whatever editor you want (notepad, vim, nano, gedit and so on) but I recommend you to choose [Texmaker](http://www.xm1math.net/texmaker/) which is free and cross platform. It is also worth saying that Visual Studio Code with some dedicated extensions (such as [LaTeX Workshop](https://marketplace.visualstudio.com/items?itemName=James-Yu.latex-workshop)) is pretty good to use.\n\n## Writing a document\nThere are tons of on-line guides about LaTeX to get you started. Among them:\n- A comprehensive guide can be found [here](https://en.wikibooks.org/wiki/LaTeX).\n- Another cool guide [here](https://www.latex-tutorial.com/tutorials/).\n- [This one](http://www.docs.is.ed.ac.uk/skills/documents/3722/3722-2014.pdf) is perfect for beginners.\n- Also [here](http://web.mit.edu/rsi/www/pdfs/new-latex.pdf) another guide.\n\nIt's also possible to write your LaTeX document on-line and share it with your collaborators using [OverLeaf](https://www.overleaf.com/).\n\nThere are already lots of templates made. You can find some of them [here](https://www.latextemplates.com/).\n\nTo draw awesome graphs and charts, you can use the package [TikZ](https://en.wikipedia.org/wiki/PGF/TikZ).\n\nAlso a good site to keep in mind when facing a problem with LaTeX is [StackOverflow](https://tex.stackexchange.com/) with the LaTeX dedicated section.\n\n### Tools to increase productivity\nThe LaTeX syntax can seem daunting at first, with plenty of new commands for all the mathematical symbols you know and need to use.\n  - [This website](https://www.codecogs.com/latex/eqneditor.php) allows one to write a formula online, and it also has plenty of symbols in which you can just click, generating the code you need. You can also preview your formula, so that it is easier for you to make sure everything is being properly written.\n  - Whenever you need a symbol but you don't know the command, use [this site](http://detexify.kirelabs.org/classify.html). All you have to do is draw the symbol and then suggestions will appear on the right.\n  - Creating tables in LaTeX can be particularly annoying. I usually do it [here](https://www.tablesgenerator.com/) and then ask the site to generate the appropriate code.\n  - [MathJax](https://www.mathjax.org/) is one of the ways in which you can get LaTeX to render, say, in your blog! (example [here](http://mathspp.blogspot.com/2018/11/twitter-proof-roots-go-hand-in-hand.html), where the formulas are rendered with MathJax)\n  - [Mathpix Snipping Tool](https://mathpix.com/) helps you to convert images to LaTeX by just taking a screenshort of desired math formula. It can also recognize arrays and various math fonts.\n\n## Useful Packages\n\nNow that you know how to produce a (simple) LaTeX document, you may feel the need to write or draw particular content. To do so, you can use specific packages. All you need to do is to include them at the beginning of your document with the command `\\usepackage{name_of_the_package}`.\n\n### Displaying Math\n\nThe [`amsmath` package](https://ctan.org/pkg/amsmath) provides miscellaneous enhancements for improving the information structure and printed output of documents that contain mathematical formulas, as stated in [this useful guide](http://texdoc.net/texmf-dist/doc/latex/amsmath/amsldoc.pdf). \n\nExtra mathematical fonts and symbols can be used by including the [`amssymb` package](https://ctan.org/pkg/amsfonts). A recap can be found [here](http://milde.users.sourceforge.net/LUCR/Math/mathpackages/amssymb-symbols.pdf).\n\n### Code Blocks\n\nThe [`listings` package](https://ctan.org/pkg/listings) allows to insert programming code in your LaTeX document. You can highlight code, or specify your language of choice and let the package automatically colour special words, comments, etc for you. [Here](https://www.overleaf.com/learn/latex/Code_listing) a guide with examples.\n\nBased on the previous package, [`pythonhighlight`](https://ctan.org/pkg/pythonhighlight) is a simple Python highlighting style to be used with LaTeX. You can find the very simple instructions [here](https://github.com/olivierverdier/python-latex-highlighting).\n\nTo write pseudocode, you can use [algorithms](https://ctan.org/pkg/algorithms), which consists in two packages: `al­go­rithm` and `al­go­rith­mic`. [Here](https://math-linux.com/latex-26/faq/latex-faq/article/how-to-write-algorithm-and-pseudocode-in-latex-usepackage-algorithm-usepackage-algorithmic) you can find examples and useful commands.\n\n### Logic\n\nFor natural deductions there's the [`bussproofs` package](https://ctan.org/pkg/bussproofs). You can find the user guide with examples [here](https://www.math.ucsd.edu/~sbuss/ResearchWeb/bussproofs/BussGuide2_Smith2012.pdf).\n\nIf you find tedious manually writing truth tables, [here](http://www.siafoo.net/snippet/249) you'll find an incredibly useful Pyhton script. It automatically generates the LaTeX code of a compiled truth table given one or more propositional logic formulas. (Note: remember that in Python you can write *p* &rarr; *q* as `not p or q` as they are logically equivalent).\n\n### Automata\n\nTo draw finite state machines with LaTeX you can use the `tikz-automata` package, [here](https://www3.nd.edu/~kogge/courses/cse30151-fa17/Public/other/tikz_tutorial.pdf) a quick tutorial. You can also automatically generate the code using [this website](https://notendur.hi.is/aee11/automataLatexGen/).\n\n### This is why you need to learn Machine Learning \nOh damn, take a look at [this](https://mathpix.com/).\n\n------------\nCreated by Damiano Azzolini. Contacts: [mail](mailto:damiazz94@gmail.com) [github](https://github.com/damianoazzolini)\n\nExpanded upon by the editor of the [Mathspp Blog](https://mathspp.blogspot.com), [RojerGS](https://github.com/RojerGS), and by Lara Vignotto ([mail](mailto:lara.vignotto@gmail.com), [github](https://github.com/laravignotto))\n"
  },
  {
    "path": "content/inferno/tools/regex.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Regex introduction\\n\",\n    \"\\n\",\n    \"## What is a regex?\\n\",\n    \"[**Regex**](https://en.wikipedia.org/wiki/Regular_expression) stands for _regular expression_, and regular expressions are a way of writing patterns that match strings. Usually these patterns can be used to search strings for specific things, or to search and then replace certain things, etc. Regular expressions are great for string manipulation!\\n\",\n    \"\\n\",\n    \"## Why do regular expressions matter?\\n\",\n    \"From the first paragraph in this guide you might have guessed it, but regular expressions can be very useful **whenever you have to deal with strings**. From the basic renaming of a set of similarly named variables in your source code to [data preprocessing](https://github.com/clone95/Virgilio/blob/master/Specializations/HardSkills/DataPreprocessing.md). Regular expressions usually offer a concise way of expressing whatever type of things you want to find. For example, if you wanted to parse a form and look for the year that someone might have been born in, you could use something like `(19)|(20)[0-9][0-9]`. This is an example of a regular expression!\\n\",\n    \"\\n\",\n    \"## Prerequisites\\n\",\n    \"This guide does not assume any prior knowledge. Examples will be coded in Python, but mastery of the programming language is neither assumed nor needed. You are welcome to read the guide in your browser or to download it and to run the examples/toying around with them.\\n\",\n    \"\\n\",\n    \"# Index\\n\",\n    \" - [Basic regex](#Basic-regex)\\n\",\n    \"   - [Using Python re](#Using-Python-re)\\n\",\n    \"   - [$\\\\pi$ lookup](#$\\\\pi$-lookup)\\n\",\n    \" - [Matching options](#Matching-options)\\n\",\n    \"   - [Virgilio or Virgil?](#Virgilio-or-Virgil?)\\n\",\n    \" - [Matching repetitions](#Matching-repetitions)\\n\",\n    \"   - [Greed](#Greed)\\n\",\n    \"   - [Removing excessive spaces](#Removing-excessive-spaces)\\n\",\n    \" - [Character classes](#Character-classes)\\n\",\n    \"   - [Phone numbers v1](#Phone-numbers-v1)\\n\",\n    \" - [More `re` functions](#More-re-functions)\\n\",\n    \"   - [`search` with `match`](#search-with-match)\\n\",\n    \"   - [Count matches with `findall`](#Count-matches-with-findall)\\n\",\n    \" - [Special characters](#Special-characters)\\n\",\n    \"   - [Phone numbers v2](#Phone-numbers-v2)\\n\",\n    \" - [Groups](#Groups)\\n\",\n    \"   - [Phone numbers v3](#Phone-numbers-v3)\\n\",\n    \" - [Toy project about regex](#Toy-project-about-regex)\\n\",\n    \" - [Further reading](#Further-reading)\\n\",\n    \" - [Suggested solutions](#Suggested-solutions)\\n\",\n    \" \\n\",\n    \"Let's dive right in!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Just a quick word:** I tried to include some small exercises whenever I show you something new, so that you can try and test your knowledge. Examples of solutions are provided in the [end of the notebook](#Suggested-solutions).\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Basic regex\\n\",\n    \"\\n\",\n    \"A regex is just a string written in a certain format, that can then be used by specific tools/libraries/programs to perform pattern matching on strings. Throughout this guide we will use `this formatting` to refer to regular expressions!\\n\",\n    \"\\n\",\n    \"The simplest regular expressions that one can create are just composed of regular characters. If you wanted to find all the occurrences of the word _\\\"Virgilio\\\"_ in a text, you could write the regex `Virgilio`. In this regular expression, no character is doing anything special or different. In fact, this regular expression is just a normal word. That is ok, regular expressions are strings, after all!\\n\",\n    \"\\n\",\n    \"If you were given the text _\\\"Project Virgilio is great\\\"_, you could use your `Virgilio` regex to find the occurrence of the word _\\\"Virgilio\\\"_. However, if the text was _\\\"Project virgilio is great\\\"_, then your regex wouldn't work, because regular expressions are **case-sensitive** by default and thus should match everything exactly. We say that `Virgilio` matches the sequence of characters \\\"Virgilio\\\" literally.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Using Python re\\n\",\n    \"\\n\",\n    \"To check if our regular expressions are working well and to give you the opportunity to directly experiment with them, we will be using Python's `re` module to work with regular expressions. To use the `re` module we first import it, then define a regular expression and then use the `search()` function over a string! Pretty simple:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"'Virgilio' is in 'Project Virgilio is great'\\n\",\n      \"'Virgilio' is not in 'Project virgilio is great'\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"import re\\n\",\n    \"\\n\",\n    \"regex = \\\"Virgilio\\\"\\n\",\n    \"str1 = \\\"Project Virgilio is great\\\"\\n\",\n    \"str2 = \\\"Project virgilio is great\\\"\\n\",\n    \"\\n\",\n    \"if re.search(regex, str1):\\n\",\n    \"    print(\\\"'{}' is in '{}'\\\".format(regex, str1))\\n\",\n    \"else:\\n\",\n    \"    print(\\\"'{}' is not in '{}'\\\".format(regex, str1))\\n\",\n    \"    \\n\",\n    \"if re.search(regex, str2):\\n\",\n    \"    print(\\\"'{}' is in '{}'\\\".format(regex, str2))\\n\",\n    \"else:\\n\",\n    \"    print(\\\"'{}' is not in '{}'\\\".format(regex, str2))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The `re.search(regex, string)` function takes a regex as first argument and then searches for any matches over the string that was given as the second argument. However, the return value of the function is **not** a boolean, but a *match object*:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"<re.Match object; span=(8, 16), match='Virgilio'>\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(re.search(regex, str1))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Match objects have relevant information about the match(es) encountered: the start and end positions, the string that was matched, and even some other things for more complex regular expressions.\\n\",\n    \"\\n\",\n    \"We can see that in this case the match is exactly the same as the regular expression, so it may look like the `match` information inside the match object is irrelevant... but it becomes relevant as soon as we introduce options or repetitions into our regex.\\n\",\n    \"\\n\",\n    \"If no matches are found, then the `.search()` function returns `None`:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"None\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(re.search(regex, str2))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Whenever the match is not `None`, we can save the returned match object and use it to extract all the needed information!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"The match started at pos 8 and ended at pos 16\\n\",\n      \"Or with tuple notation, the match is at (8, 16)\\n\",\n      \"And btw, the actual string matched was 'Virgilio'\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"m = re.search(regex, str1)\\n\",\n    \"if m is not None:\\n\",\n    \"    print(\\\"The match started at pos {} and ended at pos {}\\\".format(m.start(), m.end()))\\n\",\n    \"    print(\\\"Or with tuple notation, the match is at {}\\\".format(m.span()))\\n\",\n    \"    print(\\\"And btw, the actual string matched was '{}'\\\".format(m.group()))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now you should try to get some more matches and some fails with your own literal regular expressions. I provide three examples of my own:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"The match is at (20, 25)\\n\",\n      \"\\n\",\n      \"Woops, did I just got the alphabet wrong..?\\n\",\n      \"\\n\",\n      \"I just matched 'a' inside 'aaaaa aaaaaa a aaa'\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"m1 = re.search(\\\"regex\\\", \\\"This guide is about regexes\\\")\\n\",\n    \"if m1 is not None:\\n\",\n    \"    print(\\\"The match is at {}\\\\n\\\".format(m1.span()))\\n\",\n    \"\\n\",\n    \"m2 = re.search(\\\"abc\\\", \\\"The alphabet goes 'abdefghij...'\\\")\\n\",\n    \"if m2 is None:\\n\",\n    \"    print(\\\"Woops, did I just got the alphabet wrong..?\\\\n\\\")\\n\",\n    \"    \\n\",\n    \"s = \\\"aaaaa aaaaaa a aaa\\\"\\n\",\n    \"m3 = re.search(\\\"a\\\", s)\\n\",\n    \"if m3 is not None:\\n\",\n    \"    print(\\\"I just matched '{}' inside '{}'\\\".format(m3.group(), s))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### $\\\\pi$ lookup\\n\",\n    \"\\n\",\n    \"$$\\\\pi = 3.1415\\\\cdots$$\\n\",\n    \"\\n\",\n    \"right? Well, what comes after the dots? An infinite sequence of digits, right? Could it be that your date of birth appears in the first million digits of $\\\\pi$? Well, we could use a regex to find that out! Change the `regex` variable below to look for your date of birth or for any number you want, in the first million digits of $\\\\pi$!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"pifile = \\\"regex-bin/pi.txt\\\"\\n\",\n    \"regex = \\\"\\\"  # define your regex to look your favourite number up\\n\",\n    \"\\n\",\n    \"with open(pifile, \\\"r\\\") as f:\\n\",\n    \"    pistr = f.read()  # pistr is a string that contains 1M digits of pi\\n\",\n    \"    \\n\",\n    \"## search for your number here\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"To search for numbers in the first 100 million digits of $\\\\pi$ (or 200 million, I didn't really get it) you can check [this](https://www.angio.net/pi/piquery) website.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Matching options\\n\",\n    \"\\n\",\n    \"We just saw a very simple regular expression that was trying to find the word _\\\"Virgilio\\\"_ in text, but we also saw that we had zero flexibility and we couldn't even handle the fact that someone may have forgotten to capitalize the name properly, spelling it like _\\\"virgilio\\\"_ instead.\\n\",\n    \"\\n\",\n    \"To prevent problems like this, regular expressions can be written in a way to handle different possibilities. For our case, we want the first letter to be either _\\\"V\\\"_ or _\\\"v\\\"_, and that should be followed by _\\\"irgilio\\\"_.\\n\",\n    \"\\n\",\n    \"In order to handle different possibilities, we use the character `|`. For instance, `V|v` matches the letter vee, regardless of its capitalization:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"small v found\\n\",\n      \"big V found\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"v = \\\"v\\\"\\n\",\n    \"V = \\\"V\\\"\\n\",\n    \"regex = \\\"v|V\\\"\\n\",\n    \"if re.search(regex, v):\\n\",\n    \"    print(\\\"small v found\\\")\\n\",\n    \"if re.search(regex, V):\\n\",\n    \"    print(\\\"big V found\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now we can concatenate the regex for the first letter and the `irgilio` regex (for the rest of the name) to get a regex that matches the name of Virgilio, regardless of the capitalization of its first letter:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"virgilio found!\\n\",\n      \"Virgilio found!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"virgilio = \\\"virgilio\\\"\\n\",\n    \"Virgilio = \\\"Virgilio\\\"\\n\",\n    \"regex = \\\"(V|v)irgilio\\\"\\n\",\n    \"if re.search(regex, virgilio):\\n\",\n    \"    print(\\\"virgilio found!\\\")\\n\",\n    \"if re.search(regex, Virgilio):\\n\",\n    \"    print(\\\"Virgilio found!\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Notice that we write the regex with parenthesis: `(V|v)irgilio`\\n\",\n    \"\\n\",\n    \"If we only wrote `V|virgilio`, then the regular expression would match either \\\"V\\\" or \\\"virgilio\\\", instead of \\\"Virgilio\\\" or \\\"virgilio\\\":\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"<re.Match object; span=(29, 30), match='V'>\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"V|virgilio\\\"\\n\",\n    \"print(re.search(regex, \\\"This sentence only has a big V\\\"))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"So we really need to parenthesize the `(V|v)` there. If we do, it will work as expected!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"<re.Match object; span=(27, 35), match='virgilio'>\\n\",\n      \"None\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"(V|v)irgilio\\\"\\n\",\n    \"print(re.search(regex, \\\"The name of the project is virgilio, but with a big V!\\\"))\\n\",\n    \"print(re.search(regex, \\\"This sentence only has a big V\\\"))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Maybe you didn't even notice, but there is something else going on! Notice that we used the characteres `|`, `(` and `)`, and those are not present in the word _\\\"virgilio\\\"_, but nonetheless our regex `(V|v)irgilio` matched it... that is because these three characters have special meanings in the regex world, and hence are **not** interpreted literally, contrary to what happens to any letter in `irgilio`.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Virgilio or Virgil?\\n\",\n    \"\\n\",\n    \"Here is a couple of paragraphs from Wikipedia's [article on Virgil](https://en.wikipedia.org/wiki/Virgil):\\n\",\n    \"\\n\",\n    \" > Publius Vergilius Maro (Classical Latin: [ˈpuː.blɪ.ʊs wɛrˈɡɪ.lɪ.ʊs ˈma.roː]; traditional dates October 15, 70 BC – September 21, 19 BC[1]), usually called Virgil or Vergil (/ˈvɜːrdʒɪl/) in English, was an ancient Roman poet of the Augustan period. He wrote three of the most famous poems in Latin literature: the Eclogues (or Bucolics), the Georgics, and the epic Aeneid. A number of minor poems, collected in the Appendix Vergiliana, are sometimes attributed to him.[2][3]\\n\",\n    \"\\n\",\n    \" > Virgil is traditionally ranked as one of Rome's greatest poets. His Aeneid has been considered the national epic of ancient Rome since the time of its composition. Modeled after Homer's Iliad and Odyssey, the Aeneid follows the Trojan refugee Aeneas as he struggles to fulfill his destiny and reach Italy, where his descendants Romulus and Remus were to found the city of Rome. Virgil's work has had wide and deep influence on Western literature, most notably Dante's Divine Comedy, in which Virgil appears as Dante's guide through Hell and Purgatory.\\n\",\n    \" \\n\",\n    \"\\\"Virgilio\\\" is the italian form of \\\"Virgil\\\", and I edited the above paragraphs to have the italian version instead of the english one. I want you to revert this!\\n\",\n    \"\\n\",\n    \"You might want to take a look at [`while` cycles in Python](https://realpython.com/python-while-loop/), [string indexing](https://www.digitalocean.com/community/tutorials/how-to-index-and-slice-strings-in-python-3) and [string concatenation](https://realpython.com/python-string-split-concatenate-join/). The point is that you find a match, you break the string into the part _before_ the match and the part _after_ the match, and you glue those two together with _Virgilio_ in between.\\n\",\n    \"\\n\",\n    \"Notice that [string replacement](https://www.tutorialspoint.com/python/string_replace.htm) would probably be faster and easier, but that would defeat the purpose of this exercise. After fixing everything, print the final results to be sure that you fixed every occurrence of the name.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"paragraphs = \\\\\\n\",\n    \"\\\"\\\"\\\"Publius Vergilius Maro (Classical Latin: [ˈpuː.blɪ.ʊs wɛrˈɡɪ.lɪ.ʊs ˈma.roː]; traditional dates October 15, 70 BC – September 21, 19 BC[1]), usually called virgilio or Vergil (/ˈvɜːrdʒɪl/) in English, was an ancient Roman poet of the Augustan period. He wrote three of the most famous poems in Latin literature: the Eclogues (or Bucolics), the Georgics, and the epic Aeneid. A number of minor poems, collected in the Appendix Vergiliana, are sometimes attributed to him.[2][3]\\n\",\n    \"\\n\",\n    \"Virgilio is traditionally ranked as one of Rome's greatest poets. His Aeneid has been considered the national epic of ancient Rome since the time of its composition. Modeled after Homer's Iliad and Odyssey, the Aeneid follows the Trojan refugee Aeneas as he struggles to fulfill his destiny and reach Italy, where his descendants Romulus and Remus were to found the city of Rome. virgilio's work has had wide and deep influence on Western literature, most notably Dante's Divine Comedy, in which virgilio appears as Dante's guide through Hell and Purgatory.\\\"\\\"\\\"\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Matching repetitions\\n\",\n    \"\\n\",\n    \"Sometimes we want to find patterns that have bits that will be repeated. For example, people make a _\\\"awww\\\"_ or _\\\"owww\\\"_ sound when they see something cute, like a baby. But the number of _\\\"w\\\"_ I used there was completely arbitrary! If the baby is really really cute, someone might write _\\\"awwwwwwwwwww\\\"_. So how can I write a regex that matches _\\\"aww\\\"_ and _\\\"oww\\\"_, but with an arbitrary number of characters _\\\"w\\\"_?\\n\",\n    \"\\n\",\n    \"I will illustrate several ways of capturing repetitions, by testing regular expressions against the following strings:\\n\",\n    \"\\n\",\n    \" - \\\"awww\\\" (3 letters \\\"w\\\")\\n\",\n    \" - \\\"awwww\\\" (4 letters \\\"w\\\")\\n\",\n    \" - \\\"awwwwwww\\\" (7 letters \\\"w\\\")\\n\",\n    \" - \\\"awwwwwwwwwwwwwwww\\\" (16 letters \\\"w\\\")\\n\",\n    \" - \\\"aw\\\" (1 letter \\\"w\\\")\\n\",\n    \" - \\\"a\\\" (0 letters \\\"w\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"cute_strings = [\\n\",\n    \"    \\\"awww\\\",\\n\",\n    \"    \\\"awwww\\\",\\n\",\n    \"    \\\"awwwwwww\\\",\\n\",\n    \"    \\\"awwwwwwwwwwwwwwww\\\",\\n\",\n    \"    \\\"aw\\\",\\n\",\n    \"    \\\"a\\\"\\n\",\n    \"]\\n\",\n    \"\\n\",\n    \"def match_cute_strings(regex):\\n\",\n    \"    \\\"\\\"\\\"Takes a regex, prints matches and non-matches\\\"\\\"\\\"\\n\",\n    \"    for s in cute_strings:\\n\",\n    \"        m = re.search(regex, s)\\n\",\n    \"        if m:\\n\",\n    \"            print(\\\"match: {}\\\".format(s))\\n\",\n    \"        else:\\n\",\n    \"            print(\\\"non match: {}\\\".format(s))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### At least once\\n\",\n    \"\\n\",\n    \"If I want to match all strings that containt **at least** one \\\"w\\\", we can use the character `+`. A `+` means that we want to find **one or more repetitions** of whatever was to the left of it. For example, the regex `a+` will match any string that has at least one \\\"a\\\".\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"match: awww\\n\",\n      \"match: awwww\\n\",\n      \"match: awwwwwww\\n\",\n      \"match: awwwwwwwwwwwwwwww\\n\",\n      \"match: aw\\n\",\n      \"non match: a\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"aw+\\\"\\n\",\n    \"match_cute_strings(regex)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Any number of times\\n\",\n    \"\\n\",\n    \"If I want to match all strings that contain an arbitrary number of letters \\\"w\\\", I can use the character `*`. The character `*` means **match any number of repetitions** of whatever comes on the left of it, _even 0 repetitions_! So the regex `a*` would match the empty string \\\"\\\", because the empty string \\\"\\\" has 0 repetitions of the letter \\\"a\\\".\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"match: awww\\n\",\n      \"match: awwww\\n\",\n      \"match: awwwwwww\\n\",\n      \"match: awwwwwwwwwwwwwwww\\n\",\n      \"match: aw\\n\",\n      \"match: a\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"aw*\\\"\\n\",\n    \"match_cute_strings(regex)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### A specific number of times\\n\",\n    \"\\n\",\n    \"If I want to match a string that contains a certain particle a specific number of times, I can use the `{n}` notation, where `n` is replaced by the number of repetitions I want. For example, `a{3}` matches the string \\\"aaa\\\" but not the string \\\"aa\\\".\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"match: awww\\n\",\n      \"match: awwww\\n\",\n      \"match: awwwwwww\\n\",\n      \"match: awwwwwwwwwwwwwwww\\n\",\n      \"non match: aw\\n\",\n      \"non match: a\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"aw{3}\\\"\\n\",\n    \"match_cute_strings(regex)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Wait a minute**, why did the pattern `aw{3}` match the longer expressions of cuteness, like \\\"awwww\\\" or \\\"awwwwwww\\\"? Because the regular expressions try to find _substrings_ that match the pattern. Our pattern is `awww` (if I write the `w{3}` explicitly) and the string **awww**w has that substring, just like the string **awww**wwww has it, or the longer version with 16 letters \\\"w\\\". If we wanted to exclude the strings \\\"awwww\\\", \\\"awwwwwww\\\" and \\\"awwwwwwwwwwwwwwww\\\" we would have to fix our regex. A better example that demonstrates how `{n}` works is by considering, instead of expressions of cuteness, expressions of amusement like \\\"wow\\\", \\\"woow\\\" and \\\"wooooooooooooow\\\". We define some expressions of amusement:\\n\",\n    \"\\n\",\n    \" - \\\"wow\\\"\\n\",\n    \" - \\\"woow\\\"\\n\",\n    \" - \\\"wooow\\\"\\n\",\n    \" - \\\"woooow\\\"\\n\",\n    \" - \\\"wooooooooow\\\"\\n\",\n    \" \\n\",\n    \"and now we test our `{3}` pattern.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"wow_strings = [\\n\",\n    \"    \\\"wow\\\",\\n\",\n    \"    \\\"woow\\\",\\n\",\n    \"    \\\"wooow\\\",\\n\",\n    \"    \\\"woooow\\\",\\n\",\n    \"    \\\"wooooooooow\\\"\\n\",\n    \"]\\n\",\n    \"\\n\",\n    \"def match_wow_strings(regex):\\n\",\n    \"    \\\"\\\"\\\"Takes a regex, prints matches and non-matches\\\"\\\"\\\"\\n\",\n    \"    for s in wow_strings:\\n\",\n    \"        m = re.search(regex, s)\\n\",\n    \"        if m:\\n\",\n    \"            print(\\\"match: {}\\\".format(s))\\n\",\n    \"        else:\\n\",\n    \"            print(\\\"non match: {}\\\".format(s))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"non match: wow\\n\",\n      \"non match: woow\\n\",\n      \"match: wooow\\n\",\n      \"non match: woooow\\n\",\n      \"non match: wooooooooow\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"wo{3}w\\\"\\n\",\n    \"match_wow_strings(regex)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Between $n$ and $m$ times\\n\",\n    \"\\n\",\n    \"Expressing amusement with only three \\\"o\\\" is ok, but people might also use two or four \\\"o\\\". How can we capture a variable number of letters, but within a range? Say I only want to capture versions of \\\"wow\\\" that have between 2 and 4 letters \\\"o\\\". I can do it with `{2,4}`.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"non match: wow\\n\",\n      \"match: woow\\n\",\n      \"match: wooow\\n\",\n      \"match: woooow\\n\",\n      \"non match: wooooooooow\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"wo{2,4}w\\\"\\n\",\n    \"match_wow_strings(regex)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Up to $n$ times or at least $m$ times\\n\",\n    \"\\n\",\n    \"Now we are just playing with the type of repetitions we might want, but of course we might say that we want **no more** than $n$ repetitions, which you would do with `{,n}`, or that we want **at least** $m$ repetitions, which you would do with `{m,}`.\\n\",\n    \"\\n\",\n    \"In fact, take a look at these regular expressions:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"match: wow\\n\",\n      \"match: woow\\n\",\n      \"match: wooow\\n\",\n      \"match: woooow\\n\",\n      \"non match: wooooooooow\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"wo{,4}w\\\" # should not match strings with more than 4 o's\\n\",\n    \"match_wow_strings(regex)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"non match: wow\\n\",\n      \"non match: woow\\n\",\n      \"match: wooow\\n\",\n      \"match: woooow\\n\",\n      \"match: wooooooooow\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"wo{3,}w\\\" # should not match strings with less than 3 o's\\n\",\n    \"match_wow_strings(regex)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### To be or not to be\\n\",\n    \"\\n\",\n    \"Last but not least, sometimes we care about something that might or might not be present. For example, above we dealed with the English and Italian versions of the name Virgilio. If we wanted to write a regular expression to capture both versions, we could write `((V|v)irgil)|((V|v)irgilio)`, or slightly more compact, `(V|v)((irgil)|(irgilio))`. But this does not look good at all, right? All we need to say is that the final \\\"io\\\" might or might not be present. We do this with the `?` character. So the regex `(V|v)irgil(io)?` matches the upper and lower case versions of \\\"Virgil\\\" and \\\"Virgilio\\\".\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"The name virgil was matched!\\n\",\n      \"The name Virgil was matched!\\n\",\n      \"The name virgilio was matched!\\n\",\n      \"The name Virgilio was matched!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"(V|v)irgil(io)?\\\"\\n\",\n    \"names = [\\\"virgil\\\", \\\"Virgil\\\", \\\"virgilio\\\", \\\"Virgilio\\\"]\\n\",\n    \"for name in names:\\n\",\n    \"    m = re.search(regex, name)\\n\",\n    \"    if m:\\n\",\n    \"        print(\\\"The name {} was matched!\\\".format(name))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Greed\\n\",\n    \"\\n\",\n    \"The `+`, `?`, `*` and `{,}` operators are all greedy. What does this mean? It means that they will try to match as much as possible. They have this default behaviour, as opposed to stopping to try and find more matches as soon as the regex is satisfied. To better illustrate what I mean by this, let us look again at the information contained in the `match` object we have been dealing with:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 26,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"<re.Match object; span=(0, 3), match='aaa'>\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"a+\\\"\\n\",\n    \"s = \\\"aaa\\\"\\n\",\n    \"m = re.search(regex, s)\\n\",\n    \"print(m)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Notice the part of the printed information that says `match='aaa'`. The function `m.group()` will let me know what was the actual string that was matched by the regular expression, and in this case it was \\\"aaa\\\". Why does it make sense to have access to this information? Well, the regex I wrote, `a+`, will match one or more letters \\\"a\\\" in a row. If I use the regex over a string and I get a match, how would I be able to know how many \\\"a\\\"s were matched, if I didn't have access to that type of information?\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 29,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"aaa\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(m.group())\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"So let us verify that, in fact, the operators I mentioned are all greedy. Again, because they all match as many characters as they can.\\n\",\n    \"\\n\",\n    \"Below, we see that given a string of thirty times the letter \\\"a\\\",\\n\",\n    \"\\n\",\n    \"  - the pattern `a?` matches 1 \\\"a\\\", which is as much as it could\\n\",\n    \"  - the pattern `a+` matches 30 \\\"a\\\"s, which is as much as it could\\n\",\n    \"  - the pattern `a*` also matches 30\\n\",\n    \"  - the pattern `a{5,10}` matches 10 \\\"a\\\"s, which was the limit imposed by us\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 31,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"a\\n\",\n      \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\n\",\n      \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\n\",\n      \"aaaaaaaaaa\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"s = \\\"a\\\"*30\\n\",\n    \"print(re.search(\\\"a?\\\", s).group())\\n\",\n    \"print(re.search(\\\"a+\\\", s).group())\\n\",\n    \"print(re.search(\\\"a*\\\", s).group())\\n\",\n    \"print(re.search(\\\"a{5,10}\\\", s).group())\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"If we don't want our operators to be greedy, we just put an extra `?` after them. So the following regular expressions are **not** greedy:\\n\",\n    \"\\n\",\n    \"  - the pattern `a??` will match **no** characters, much like `a*?`, because now their goal is to match as little as possible. But a match of length 0 is the shortest match possible!\\n\",\n    \"  - the pattern `a+?` will only match 1 \\\"a\\\"\\n\",\n    \"  - the pattern `a{5,10}?` will only match 5 \\\"a\\\"s\\n\",\n    \"  \\n\",\n    \"We can easily confirm what I just said by running the code below. Notice that now I print things differently, because otherwise we wouldn't be able to see the `a??` and `a*?` patterns matching nothing.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 34,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"''\\n\",\n      \"'a'\\n\",\n      \"''\\n\",\n      \"'aaaaa'\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"s = \\\"a\\\"*30\\n\",\n    \"print(\\\"'{}'\\\".format(re.search(\\\"a??\\\", s).group()))\\n\",\n    \"print(\\\"'{}'\\\".format(re.search(\\\"a+?\\\", s).group()))\\n\",\n    \"print(\\\"'{}'\\\".format(re.search(\\\"a*?\\\", s).group()))\\n\",\n    \"print(\\\"'{}'\\\".format(re.search(\\\"a{5,10}?\\\", s).group()))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Removing excessive spaces\\n\",\n    \"\\n\",\n    \"Now that we know about repetitions, I am going to tell you about the `sub` function and we are going to use that to parse a piece of text and remove all extra spaces that are present. Typing in `re.sub(regex, rep, string)` will use the given regex on the given string, and whenever it matches, it removes the match and puts the `rep` in there.\\n\",\n    \"\\n\",\n    \"For example, I can use that to replace all English/Italian occurrences of the name Virgilio with a standardized one:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 39,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Virgilio has many names, like Virgilio, Virgilio, Virgilio, Virgilio, or even Virgilio.\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"s = \\\"Virgilio has many names, like virgil, virgilio, Virgil, Vergil, or even vergil.\\\"\\n\",\n    \"regex = \\\"(V|v)(e|i)rgil(io)?\\\"\\n\",\n    \"\\n\",\n    \"print(\\n\",\n    \"    re.sub(regex, \\\"Virgilio\\\", s)\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"    Now   it  is your   turn.  I am     going  to give   you this    sentence as        input, and   your  job    is to      fix the     whitespace         in it. When you    are  done,    save the    result in a  string  named   `s`, and   check    if  `s.count(\\\"  \\\")` is   equal   to    0  or not.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"weird_text = \\\"Now   it  is your   turn.  I am     going  to give   you this    sentence as        input, and   your  job    is to      fix the     whitespace         in it. When you    are  done,    save the    result in a  string  named   `s`, and   check    if  `s.count(\\\"  \\\")` is   equal   to    0  or not.\\\"\\n\",\n    \"regex = \\\"\\\"  # put your regex here\\n\",\n    \"\\n\",\n    \"# substitute the extra whitespace here\\n\",\n    \"# save the result in 's'\\n\",\n    \"\\n\",\n    \"# this print should be 0\\n\",\n    \"print(s.count(\\\"  \\\"))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Character classes\\n\",\n    \"\\n\",\n    \"So far we have been using writing some simple regular expressions that have been matching some words, and some names, and things like that. Now we have a different plan. We will write a regular expression that will match on US phone numbers, which we will assume are of the form xxx-xxx-xxxx. The first three digits are the area code, but we will not care about whether the area code actually makes sense or not. How do we match this, then?\\n\",\n    \"\\n\",\n    \"In fact, how can I match the first digit? It can be any number from 0 to 9, so should I write `(0|1|2|3|4|5|6|7|8|9)` to match the first digit, and then repeat? Actually, we could do that, yes, to get this regex:\\n\",\n    \"\\n\",\n    \"`(0|1|2|3|4|5|6|7|8|9){3}-(0|1|2|3|4|5|6|7|8|9){3}-(0|1|2|3|4|5|6|7|8|9){4}`\\n\",\n    \"\\n\",\n    \"Does this work?\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 45,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"<re.Match object; span=(0, 12), match='202-555-0181'>\\n\",\n      \"None\\n\",\n      \"None\\n\",\n      \"<re.Match object; span=(0, 12), match='512-555-0191'>\\n\",\n      \"None\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"(0|1|2|3|4|5|6|7|8|9){3}-(0|1|2|3|4|5|6|7|8|9){3}-(0|1|2|3|4|5|6|7|8|9){4}\\\"\\n\",\n    \"numbers = [\\n\",\n    \"    \\\"202-555-0181\\\",\\n\",\n    \"    \\\"202555-0181\\\",\\n\",\n    \"    \\\"202 555 0181\\\",\\n\",\n    \"    \\\"512-555-0191\\\",\\n\",\n    \"    \\\"96-125-3546\\\",\\n\",\n    \"]\\n\",\n    \"for nr in numbers:\\n\",\n    \"    print(re.search(regex, nr))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"It looks like it works, but surely there must be a better way... and there is! Instead of writing out every digit like we did, we can actually write a range of values! In fact, the regex `[0-9]` matches all digits from 0 to 9. So we can actually shorten our regex to `[0-9]{3}-[0-9]{3}-[0-9]{4}`:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 46,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"<re.Match object; span=(0, 12), match='202-555-0181'>\\n\",\n      \"None\\n\",\n      \"None\\n\",\n      \"<re.Match object; span=(0, 12), match='512-555-0191'>\\n\",\n      \"None\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"[0-9]{3}-[0-9]{3}-[0-9]{4}\\\"\\n\",\n    \"numbers = [\\n\",\n    \"    \\\"202-555-0181\\\",\\n\",\n    \"    \\\"202555-0181\\\",\\n\",\n    \"    \\\"202 555 0181\\\",\\n\",\n    \"    \\\"512-555-0191\\\",\\n\",\n    \"    \\\"96-125-3546\\\",\\n\",\n    \"]\\n\",\n    \"for nr in numbers:\\n\",\n    \"    print(re.search(regex, nr))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The magic here is being done by the `[]`, which denotes a character class. The way `[]` works is, the regex will try to match any of the things that are inside, and it just so happens that `0-9` is a shorter way of listing all the digits. Of course you could also do `[0123456789]{3}-[0123456789]{3}-[0123456789]{4}` which is slightly shorter than our first attempt, but still pretty bad. Similar to `0-9`, we have `a-z` and `A-Z`, which go through all letters of the alphabet.\\n\",\n    \"\\n\",\n    \"You can also start and end in different places, for example `c-o` can be used to match words that only use letters between the \\\"c\\\" and the \\\"o\\\", like \\\"hello\\\":\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 47,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"<re.Match object; span=(0, 5), match='hello'>\\n\",\n      \"<re.Match object; span=(1, 4), match='ice'>\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"[c-o]+\\\"\\n\",\n    \"print(re.search(regex, \\\"hello\\\"))\\n\",\n    \"print(re.search(regex, \\\"rice\\\"))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"With these character classes we can actually rewrite our Virgilio regex into something slightly shorter, going from `(V|v)(e|i)rgil(io)?` to `[Vv][ie]rgil(io)?`.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 53,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Virgilio has many names, like Virgilio, Virgilio, Virgilio, Virgilio, or even Virgilio.\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"s = \\\"Virgilio has many names, like virgil, virgilio, Virgil, Vergil, or even vergil.\\\"\\n\",\n    \"regex = \\\"[Vv][ie]rgil(io)?\\\"\\n\",\n    \"\\n\",\n    \"print(\\n\",\n    \"    re.sub(regex, \\\"Virgilio\\\", s)\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Again we see that our regular expression matched the **ice** in r**ice**, because the \\\"r\\\" was not inside the legal range of letters, but **ice** was.\\n\",\n    \"\\n\",\n    \"The _character class_ is the square brackets `[]` and whatever goes inside it. Also, note that the special characters we have been using lose their meaning inside a character class! So `[()?+*{}]` will actually look to match any of those characters:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 54,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"<re.Match object; span=(25, 26), match='?'>\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"[()?+*{}]\\\"\\n\",\n    \"print(re.search(regex, \\\"Did I just ask a question?\\\"))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"A final note on character classes, if they start with `^` then we are actually saying \\\"use everything _except_ what is inside this\\\":\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 55,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"None\\n\",\n      \"<re.Match object; span=(0, 1), match='r'>\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"[^c-o]+\\\"\\n\",\n    \"print(re.search(regex, \\\"hello\\\"))\\n\",\n    \"print(re.search(regex, \\\"rice\\\"))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Phone numbers v1\\n\",\n    \"\\n\",\n    \"Now that you know how to use character classes to denote ranges, you need to write a regular expression that matches american phone numbers with the format xxx-xxx-xxxx. Not only that, but you must also cope with the fact that the numbers may or may not be preceeded by the country indicator, which you can assume that will look like \\\"+1\\\" or \\\"001\\\". The country indicator may be separated from the rest of the number with a space or with a dash.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"regex = \\\"\\\"  # write your regex here\\n\",\n    \"matches = [  # you should be able to match those\\n\",\n    \"    \\\"202-555-0181\\\",\\n\",\n    \"    \\\"001 202-555-0181\\\",\\n\",\n    \"    \\\"+1-512-555-0191\\\"\\n\",\n    \"]\\n\",\n    \"non_matches = [  # for now, none of these should be matched\\n\",\n    \"    \\\"202555-0181\\\",\\n\",\n    \"    \\\"96-125-3546\\\",\\n\",\n    \"    \\\"(+1)5125550191\\\"\\n\",\n    \"]\\n\",\n    \"for s in matches:\\n\",\n    \"    print(re.search(regex, s))\\n\",\n    \"for s in non_matches:\\n\",\n    \"    print(re.search(regex, s))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## More `re` functions\\n\",\n    \"\\n\",\n    \"So far we only looked at the `.search()` function of the `re` module, but now I am going to tell you about a couple more function that can be quite handy when you are dealing with pattern matching. By the time you are done with this small section, you will now the following functions: `match()`, `search()`, `findall()`, `sub()` and `split()`.\\n\",\n    \"\\n\",\n    \"If you are here mostly for the regular expressions, and you don't care much about using them with Python, you can just skim through this section... even though it is still a nice read.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### `search()` and `sub()`\\n\",\n    \"\\n\",\n    \"You already know these two functions, `re.search(regex, string)` will try to find your pattern given by `regex` in the given `string` and return the information of the match in a `match` object. The function `re.sub(regex, rep, string)` will take a regex and two strings; it will then look for the pattern you specified in `string` and replace the matches with the other string `rep` you gave it.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### `match()`\\n\",\n    \"\\n\",\n    \"The function `re.match(regex, string)` is similar to the function `re.search()`, except that `.match()` will only check if your pattern applies to the **beginning** of the string. That is, if your string does not **start** with the pattern you provided, the function returns `None`.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \".search() found abc in abcdef\\n\",\n      \".search() found abc in the alphabet starts with abc\\n\",\n      \".match() says that abcdef starts with abc\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"abc\\\"\\n\",\n    \"string1 = \\\"abcdef\\\"\\n\",\n    \"string2 = \\\"the alphabet starts with abc\\\"\\n\",\n    \"# the .search() function finds the patterns, regardless of position\\n\",\n    \"if re.search(regex, string1):\\n\",\n    \"    print(\\\".search() found {} in {}\\\".format(regex, string1))\\n\",\n    \"if re.search(regex, string2):\\n\",\n    \"    print(\\\".search() found {} in {}\\\".format(regex, string2))\\n\",\n    \"    \\n\",\n    \"# the .match() function only checks if the string STARTS with the pattern\\n\",\n    \"if re.match(regex, string1):\\n\",\n    \"    print(\\\".match() says that {} starts with {}\\\".format(string1, regex))\\n\",\n    \"if re.match(regex, string2):  # this one should NOT print\\n\",\n    \"    print(\\\".match() says that {} starts with {}\\\".format(string2, regex))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### `findall()`\\n\",\n    \"\\n\",\n    \"The `re.findall(regex, string)` is exactly like the `.search()` function, except that it will return **all** the matches it can find, instead of just the first one. Instead of returning a `match` object, it just returns the string that matched.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"<re.Match object; span=(0, 3), match='wow'>\\n\",\n      \"['wow', 'wow', 'wow']\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"wow\\\"\\n\",\n    \"string = \\\"wow wow wow!\\\"\\n\",\n    \"\\n\",\n    \"print(re.search(regex, string))\\n\",\n    \"\\n\",\n    \"print(re.findall(regex, string))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"<re.Match object; span=(0, 3), match='ab1'>\\n\",\n      \"['ab1', 'ab2', 'ab3']\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"ab[0-9]\\\"\\n\",\n    \"string = \\\"ab1 ab2 ab3\\\"\\n\",\n    \"\\n\",\n    \"print(re.search(regex, string))\\n\",\n    \"\\n\",\n    \"print(re.findall(regex, string))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"It is important to note that the `findall()` function only returns _non-overlaping_ matches. That is, one could argue that `wow` appears twice in \\\"wowow\\\", in the beginning: **wow**ow, and in the end: wo**wow**. Nonetheless, `findall()` only returns one match because the second match overlaps with the first:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"['wow']\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"wow\\\"\\n\",\n    \"string = \\\"wowow\\\"\\n\",\n    \"print(re.findall(regex, string))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"With this information it now makes a bit more sense to consider the greediness of the operators we showed before, like `?` and `+`. Imagine we are dealing with the regex `a+` and we have a string \\\"aaaaaaaaa\\\". If we use the greedy version of `+`, then we get a single match which is the whole string. If we use the non-greedy version of the operator `+`, perhaps because we want as many matches as possible, we will get a bunch of \\\"a\\\" matches!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"['aaaaaaaaa']\\n\",\n      \"['a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a']\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex_greedy = \\\"a+\\\"\\n\",\n    \"regex_nongreedy = \\\"a+?\\\"\\n\",\n    \"string = \\\"aaaaaaaaa\\\"\\n\",\n    \"\\n\",\n    \"print(re.findall(regex_greedy, string))\\n\",\n    \"\\n\",\n    \"print(re.findall(regex_nongreedy, string))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### `split()`\\n\",\n    \"\\n\",\n    \"The `re.split(regex, string)` splits the given string into bits wherever it is able to find the pattern you specified. Say we are interested in finding all the sequences of consecutive consonants in a sentence (I don't know why you would want that...). Then we can use the vowels and the space \\\" \\\" to break up the sentence:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"['Th', 's', 's', 'j', 'st', 'r', 'g', 'l', 'r', 's', 'nt', 'nc', '']\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"[aeiou ]+\\\" # this will eliminate all vowels/spaces that appear consecutively\\n\",\n    \"string = \\\"This is just a regular sentence\\\"\\n\",\n    \"\\n\",\n    \"print(re.split(regex, string))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### `search` with `match`\\n\",\n    \"\\n\",\n    \"Recall that the `match()` function only checks if your pattern is in the beginning of the string. What I want you to do is define your own `search` function that takes a regex and a string, and returns `True` if the pattern is inside the string, and `False` otherwise. Can you do it?\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def my_search(regex, string):\\n\",\n    \"    pass  # write your code here\\n\",\n    \"\\n\",\n    \"regex = \\\"[0-9]{2,4}\\\"\\n\",\n    \"\\n\",\n    \"# your function should be able to match in all these strings\\n\",\n    \"string1 = \\\"1984 was already some years ago.\\\"\\n\",\n    \"string2 = \\\"There is also a book whose title is '1984', but the story isn't set in the year of 1984.\\\"\\n\",\n    \"string3 = \\\"Sometimes people write '84 for short.\\\"\\n\",\n    \"\\n\",\n    \"# your function should also match with this regex and this string\\n\",\n    \"regex = \\\"a*\\\"\\n\",\n    \"string = \\\"\\\"\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Count matches with `findall`\\n\",\n    \"\\n\",\n    \"Now I want you to define the `count_matches` function, which takes a regex and a string, and returns the number of non-overlaping matches there exist in the given string. Can you do it?\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 25,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def count_matches(regex, string):\\n\",\n    \"    pass  # your code goes here\\n\",\n    \"\\n\",\n    \"regex = \\\"wow\\\"\\n\",\n    \"\\n\",\n    \"string1 = \\\"wow wow wow\\\" # this should be 3\\n\",\n    \"string2 = \\\"wowow\\\" # this should be 1\\n\",\n    \"string3 = \\\"wowowow\\\" # this should be 2\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Special characters\\n\",\n    \"\\n\",\n    \"It is time to ramp things up a bit! We have seen some characters that have special meanings, and now I am going to introduce a couple more of those! I will start by listing them, and then I'll explain them in more detail:\\n\",\n    \"\\n\",\n    \" - `.` is used to match **any** character, except for a newline\\n\",\n    \" - `^` is used to match at the beginning of the string\\n\",\n    \" - `$` is used to match at the end of the string\\n\",\n    \" - `\\\\d` is used to match any digit\\n\",\n    \" - `\\\\w` is used to match any alphanumeric character\\n\",\n    \" - `\\\\s` is used to match any type of whitespace\\n\",\n    \" - `\\\\` is used to remove the special meaning of the characters\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Dot `.`\\n\",\n    \"\\n\",\n    \"The `.` can be used in a regular expression to capture any character that might have been used there, as long as we are still in the same line. That is, the only place where `.` doesn't work is if we changed lines in the text. Imagine the pattern was `d.ck`. Then the pattern would match\\n\",\n    \"\\n\",\n    \"```\\n\",\n    \"\\\"duck\\\"```\\n\",\n    \"\\n\",\n    \"but it would not match\\n\",\n    \"\\n\",\n    \"```\\n\",\n    \"\\\"d\\n\",\n    \"ck\\\"```\\n\",\n    \"\\n\",\n    \"because we changed lines in the middle of the string.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Caret `^`\\n\",\n    \"\\n\",\n    \"If we use a `^` in the beginning of the regular expression, then we only care about matches in the beginning of the string. That is, `^wow` would only match if the string started with \\\"wow\\\":\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 30,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"<re.Match object; span=(0, 3), match='wow'>\\n\",\n      \"None\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"^wow\\\"\\n\",\n    \"\\n\",\n    \"print(re.search(regex, \\\"wow, this is awesome\\\"))\\n\",\n    \"print(re.search(regex, \\\"this is awesome, wow\\\"))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Recall that `^` inside the character class can also mean \\\"anything but whatever is in this class\\\", so the regular expression `[^d]uck` would match any string that has **uck** in it, as long as it is not the word \\\"duck\\\". If the caret `^` appears inside a character class `[]` but it is not the first character, than it has no special meaning and it just stands for the character itself. This means that the regex `[()^{}]` is looking to match any of the characters listed:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 29,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"<re.Match object; span=(0, 1), match='^'>\\n\",\n      \"<re.Match object; span=(0, 1), match='('>\\n\",\n      \"<re.Match object; span=(0, 1), match='}'>\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"[()^{}]\\\"\\n\",\n    \"print(re.search(regex, \\\"^\\\"))\\n\",\n    \"print(re.search(regex, \\\"(\\\"))\\n\",\n    \"print(re.search(regex, \\\"}\\\"))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Dollar sign `$`\\n\",\n    \"\\n\",\n    \"Contrary to the caret `^`, the dollar sign only matches at the end of the string!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 31,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"None\\n\",\n      \"<re.Match object; span=(17, 20), match='wow'>\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"wow$\\\"\\n\",\n    \"\\n\",\n    \"print(re.search(regex, \\\"wow, this is awesome\\\"))\\n\",\n    \"print(re.search(regex, \\\"this is awesome, wow\\\"))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Combining the `^` with the `$` means we are looking to match the whole string with our pattern. For example `^[a-zA-Z ]*$` checks if our string only contains letters and spaces and nothing else:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 32,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"<re.Match object; span=(0, 47), match='this is a sentence with only letters and spaces'>\\n\",\n      \"None\\n\",\n      \"None\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"^[a-zA-Z ]*$\\\"\\n\",\n    \"\\n\",\n    \"s1 = \\\"this is a sentence with only letters and spaces\\\"\\n\",\n    \"s2 = \\\"this sentence has 1 number\\\"\\n\",\n    \"s3 = \\\"this one has punctuation...\\\"\\n\",\n    \"\\n\",\n    \"print(re.search(regex, s1))\\n\",\n    \"print(re.search(regex, s2))\\n\",\n    \"print(re.search(regex, s3))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Character groups `\\\\d`, `\\\\w` and `\\\\s`\\n\",\n    \"\\n\",\n    \"Whenever you see a backslash followed by a letter, that probably means that something _special_ is going on. These three special \\\"characters\\\" are shorthand notation for some character classes `[]`. For example, the `\\\\d` is the same as `[0-9]`. The `\\\\w` represents any alphanumeric character (like letters, numbers and `_`), and `\\\\s` represents any whitespace character (like the space \\\" \\\", the tab, the newline, etc).\\n\",\n    \"\\n\",\n    \"All these three special characters I showed, can be capitalized. If they are, then they mean the exact opposite! So `\\\\D` means \\\"anything **except** a digit\\\", `\\\\W` means \\\"anything **except** an alphanumeric character\\\" and `\\\\S` means \\\"anything **except** whitespace characters.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 43,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"['these are some words']\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"\\\\D+\\\"\\n\",\n    \"s = \\\"these are some words\\\"\\n\",\n    \"print(re.findall(regex, s))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Adding up to that, these special characters can be used inside a character class, so for instance `[abc\\\\d]` would match any digit and the letters \\\"a\\\", \\\"b\\\" and \\\"c\\\". If the caret character `^` is used, then we are excluding whatever the special character refers to. As an example, if `[\\\\d]` would match any digit, then `[^\\\\d]` will match anything that is not a digit.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### The backslash `\\\\`\\n\",\n    \"\\n\",\n    \"We already saw the backslash being used before letters to give them some special meaning... Well, the backslash before a special character also strips it of its special meaning! So, if you wanted to match a backslash, you could use `\\\\\\\\`. If you want to match any of the other special characters we already saw, you could put a `\\\\` before them, like `\\\\+` to match a plus sign. The next regular expression can be used to match an addition expression like \\\"16 + 6\\\"\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 45,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"<re.Match object; span=(0, 6), match='16 + 6'>\\n\",\n      \"<re.Match object; span=(0, 6), match='4325+2'>\\n\",\n      \"<re.Match object; span=(0, 6), match='4+ 564'>\\n\",\n      \"None\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"[\\\\d]+ ?\\\\+ ?[\\\\d]+\\\"\\n\",\n    \"add1 = \\\"16 + 6\\\"\\n\",\n    \"add2 = \\\"4325+2\\\"\\n\",\n    \"add3 = \\\"4+ 564\\\"\\n\",\n    \"mult1 = \\\"56 * 2\\\"\\n\",\n    \"\\n\",\n    \"print(re.search(regex, add1))\\n\",\n    \"print(re.search(regex, add2))\\n\",\n    \"print(re.search(regex, add3))\\n\",\n    \"print(re.search(regex, mult1))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Phone numbers v2\\n\",\n    \"\\n\",\n    \"Now I invite you to take a look at [Phone numbers v1](#Phone-numbers-v1) and rewrite your regular expression to include some new special characters that you didn't know before!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"regex = \\\"\\\"  # write your regex here\\n\",\n    \"matches = [  # you should be able to match those\\n\",\n    \"    \\\"202-555-0181\\\",\\n\",\n    \"    \\\"001 202-555-0181\\\",\\n\",\n    \"    \\\"+1-512-555-0191\\\"\\n\",\n    \"]\\n\",\n    \"non_matches = [  # for now, none of these should be matched\\n\",\n    \"    \\\"202555-0181\\\",\\n\",\n    \"    \\\"96-125-3546\\\",\\n\",\n    \"    \\\"(+1)5125550191\\\"\\n\",\n    \"]\\n\",\n    \"for s in matches:\\n\",\n    \"    print(re.search(regex, s))\\n\",\n    \"for s in non_matches:\\n\",\n    \"    print(re.search(regex, s))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Groups\\n\",\n    \"\\n\",\n    \"So far, when we used a regex to match a string we could retrieve the whole information of the match by using the `.group()` function on the match object:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"my nam is\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"my name? is\\\"\\n\",\n    \"\\n\",\n    \"m = re.search(regex, \\\"my nam is Virgilio\\\")\\n\",\n    \"if m is not None:\\n\",\n    \"    print(m.group())\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Say we are dealing with phone numbers again, and we want to look for phone numbers in a big text. But after that, we also want to extract the country from where the number is from. How could we do it..? Well, we can use a regex to match the phone numbers, and then use a second regex to extract the country code, right? (Let us just assume that phone numbers are written with the digits all in a sequence, with no spaces or \\\"-\\\" separating them.)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"The country code is: +351\\n\",\n      \"The country code is: 001\\n\",\n      \"The country code is: +1\\n\",\n      \"The country code is: 0048\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex_number = \\\"((00|[+])\\\\d{1,3}[ -])\\\\d{8,12}\\\"\\n\",\n    \"regex_code = \\\"((00|[+])\\\\d{1,3})\\\"\\n\",\n    \"matches = [  # you should be able to match those\\n\",\n    \"    \\\"+351 2025550181\\\",\\n\",\n    \"    \\\"001 2025550181\\\",\\n\",\n    \"    \\\"+1-5125550191\\\",\\n\",\n    \"    \\\"0048 123456789\\\"\\n\",\n    \"]\\n\",\n    \"\\n\",\n    \"for s in matches:\\n\",\n    \"    m = re.search(regex_number, s)  # match the phone number\\n\",\n    \"    if m is not None:\\n\",\n    \"        phone_number = m.group()    # extract the phone number\\n\",\n    \"        code = re.search(regex_code, phone_number)  # match the country code\\n\",\n    \"        print(\\\"The country code is: {}\\\".format(code.group()))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"But not only is this repetitive, because I just copied the beginning of the `regex_number` into the `regex_code`, but it becomes very cumbersome if I am trying to retrieve several different parts of my match. Because of this, there is a functionality of regular expressions that is _grouping_. By grouping parts of the regular expression, you can do things like using the repetition operators on them and **retrieve their information** later on.\\n\",\n    \"\\n\",\n    \"To do grouping, one only needs to use the `()` parenthesis. For example, the regex `(ab)+` looks for matches of the form \\\"ab\\\", \\\"abab\\\", \\\"ababab\\\", etcetera.\\n\",\n    \"\\n\",\n    \"We also used the grouping [in the beginning](#Matching-options) to create a regex that matched \\\"Virgilio\\\" and \\\"virgilio\\\", by writing `(V|v)irgilio`.\\n\",\n    \"\\n\",\n    \"Now off to the part that really matters! We can use grouping to retrieve portions of the matches, and we do that with the `.group()` function! Any set of `()` defines a group, and then we can use the `.group(i)` function to retrieve group `i`. Just note that the 0th group is always the whole match, and then you start counting from the left!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"abc defghi\\n\",\n      \"abc defghi\\n\",\n      \"abc\\n\",\n      \"defghi\\n\",\n      \"fg\\n\",\n      \"('abc', 'defghi', 'fg')\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex_with_grouping = \\\"(abc) (de(fg)hi)\\\"\\n\",\n    \"m = re.search(regex_with_grouping, \\\"abc defghi jklm n opq\\\")\\n\",\n    \"print(m.group())\\n\",\n    \"print(m.group(0))\\n\",\n    \"print(m.group(1))\\n\",\n    \"print(m.group(2))\\n\",\n    \"print(m.group(3))\\n\",\n    \"print(m.groups())\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Notice that `match.group()` and `match.group(0)` are the same thing. Also note that the function `match.groups()` returns all the groups in a tuple!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Phone numbers v3\\n\",\n    \"\\n\",\n    \"Using what you learned so far, write a regex that matches phone numbers with different country codes. Assume the following:\\n\",\n    \"\\n\",\n    \"  - The country code starts with either `00` or `+`, followed by one to three digits\\n\",\n    \"  - The phone number has length between 8 and 12\\n\",\n    \"  - The phone number and country code are separated by a space \\\" \\\" or by a hyphen \\\"-\\\"\\n\",\n    \"  \\n\",\n    \"Have your code look for phone numbers in the string I will provide next, and have it print the different country codes it finds.\\n\",\n    \"\\n\",\n    \"You might want to read what the exact behaviour of `re.findall()` is when the regex has groups in it. You can do that by checking the [documentation of the `re` module](https://docs.python.org/3/library/re.html#re.findall).\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"paragraph = \\\"\\\"\\\"Hello, I am Virgilio and I am from Italy.\\n\",\n    \"If phones were a thing when I was alive, my number would've probably been 0039 3123456789.\\n\",\n    \"I would also love to get a house with 3 floors and something like +1 000 square meters.\\n\",\n    \"Now that we are at it, I can also tell you that the number 0039 3135313531 would have suited Leo da Vinci very well...\\n\",\n    \"And come to think of it, someone told me that Socrates had dibs on +30-2111112222\\\"\\\"\\\"\\n\",\n    \"# you should find 3 phone numbers\\n\",\n    \"# and you should not be fooled by the other numbers that show up in the text\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Toy project about regex\\n\",\n    \"\\n\",\n    \"For the toy project, that is far from trivial, you are left with mimicking what [I did here](http://mathspp.blogspot.com/2017/11/on-computing-all-patterns-matched-by.html). If you follow that link, you will find a piece of code that takes a regular expression and then prints all the strings that the given regex would match.\\n\",\n    \"\\n\",\n    \"I'll just give you a couple of examples on how this works:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import sys\\n\",\n    \"sys.path.append(\\\"./regex-bin\\\")\\n\",\n    \"import regexPrinter\\n\",\n    \"\\n\",\n    \"def get_iter(regex):\\n\",\n    \"    return regexPrinter.printRegex(regex).print()\\n\",\n    \"\\n\",\n    \"def printall(regex):\\n\",\n    \"    for poss_match in get_iter(regex):\\n\",\n    \"        print(poss_match)\\n\",\n    \"\\n\",\n    \"regex = \\\"V|virgilio\\\"\\n\",\n    \"printall(regex)\\n\",\n    \"print(\\\"-\\\"*30)\\n\",\n    \"regex = \\\"wo+w\\\"\\n\",\n    \"printall(regex)\\n\",\n    \"print(\\\"-\\\"*30)\\n\",\n    \"# notice that for some reason, dumb me used {n:m} instead of {n,m}\\n\",\n    \"# also note that I only implemented {n,m}, and not {n,} nor {,m} nor {n}\\n\",\n    \"# also note that this does not support nor \\\\d nor [0-9]\\n\",\n    \"regex = \\\"((00|[+])1[ -])?[0123456789]{3:3}\\\"\\n\",\n    \"printall(regex)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note that the code is protected against infinite patterns, which are signaled with `...`.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 47,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"this is infinite!\\n\",\n      \"this is infinite!!\\n\",\n      \"this is infinite!...!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"printall(\\\"this is infinite!+\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"If you are completely new to this sort of things, then this will look completely impossible... but it is not, because I am a normal person and I was able to do it! So if you really want you can also do it! In the link you have listed all the functionality I decided to include, which excluded `\\\\d`, for example.\\n\",\n    \"\\n\",\n    \"I was only able to do this in the way I did because I had gone through some (not all) of the blog posts in [this amazing series](https://ruslanspivak.com/lsbasi-part1/).\\n\",\n    \"\\n\",\n    \"Maybe you can implement a smaller subset of the features without too much trouble? The point of this is that you could only print the strings matched by a regex if you know how regular expressions work. Try starting with only implementing literal matching and the `|` and `?` operators. Can you now include grouping `()` so that `(ab)?` would work as expected? Can you add `[]`? What about `+` and `*`? Or maybe start with `{n,m}` and write `?`, `+` and `*` as `{0,1}`, `{1,}` and `{0,}` respectively.\\n\",\n    \"\\n\",\n    \"You can also postpone this project for a bit, and dig deeper into the world of regex. The next section contains some additional references and some websites with exercises to practice your new knowledge!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Further reading\\n\",\n    \"For regular expressions in Python, you can take a look at the [documentation](https://docs.python.org/3/library/re.html) of the `re` module, as well as this [regex HOWTO](https://docs.python.org/3/howto/regex.html).\\n\",\n    \"\\n\",\n    \"Some nice topics to follow up on this would include, but are not limited to:\\n\",\n    \"  - Non capturing groups (and named groups for Python)\\n\",\n    \"  - Lookaheads (positive, negative, ...)\\n\",\n    \"  - Regex compilation and flags (for Python)\\n\",\n    \"  - Recursive regular expressions\\n\",\n    \"\\n\",\n    \"[This](https://regexr.com/) interesting website (and [this one](https://regex101.com/) as well) provides an interface for you to type regular expressions and see what they match in a text. The tool also gives you an explanation of what your regular expression is doing.\\n\",\n    \"\\n\",\n    \"---\\n\",\n    \"\\n\",\n    \"I found some interesting websites with exercises on regular expressions. [This one](https://regexone.com/lesson/introduction_abcs) has more \\\"basic\\\" exercises, each one of them preceeded by an explanation of whatever you will need to complete the exercise. I suggest you to go through them. [Hackerrank](https://www.hackerrank.com/domains/regex) and [regexplay](http://play.inginf.units.it/#/) also have some interesting exercises, but those require you to login in some way.\\n\",\n    \"\\n\",\n    \"---\\n\",\n    \"\\n\",\n    \"If you enjoyed this guide and/or it was useful, consider leaving a star in the [Virgilio repository](https://github.com/clone95/Virgilio) and sharing it with your friends!\\n\",\n    \"\\n\",\n    \"This was brought to you by the editor of the [Mathspp Blog](https://mathspp.blogspot.com), [RojerGS](https://github.com/RojerGS).\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Suggested solutions\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### $\\\\pi$ lookup (solved)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Found the number '9876' at positions (4087, 4091)\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"pifile = \\\"regex-bin/pi.txt\\\"\\n\",\n    \"regex = \\\"9876\\\"  # define your regex to look your favourite number up\\n\",\n    \"\\n\",\n    \"with open(pifile, \\\"r\\\") as f:\\n\",\n    \"    pistr = f.read()  # pistr is a string that contains 1M digits of pi\\n\",\n    \"    \\n\",\n    \"## search for your number here\\n\",\n    \"m = re.search(regex, pistr)\\n\",\n    \"if m:\\n\",\n    \"    print(\\\"Found the number '{}' at positions {}\\\".format(regex, m.span()))\\n\",\n    \"else:\\n\",\n    \"    print(\\\"Sorry, the first million digits of pi can't help you with that...\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Virgilio or Virgil? (solved)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Publius Vergilius Maro (Classical Latin: [ˈpuː.blɪ.ʊs wɛrˈɡɪ.lɪ.ʊs ˈma.roː]; traditional dates October 15, 70 BC – September 21, 19 BC[1]), usually called Virgil or Vergil (/ˈvɜːrdʒɪl/) in English, was an ancient Roman poet of the Augustan period. He wrote three of the most famous poems in Latin literature: the Eclogues (or Bucolics), the Georgics, and the epic Aeneid. A number of minor poems, collected in the Appendix Vergiliana, are sometimes attributed to him.[2][3]\\n\",\n      \"\\n\",\n      \"Virgil is traditionally ranked as one of Rome's greatest poets. His Aeneid has been considered the national epic of ancient Rome since the time of its composition. Modeled after Homer's Iliad and Odyssey, the Aeneid follows the Trojan refugee Aeneas as he struggles to fulfill his destiny and reach Italy, where his descendants Romulus and Remus were to found the city of Rome. Virgil's work has had wide and deep influence on Western literature, most notably Dante's Divine Comedy, in which Virgil appears as Dante's guide through Hell and Purgatory.\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"paragraphs = \\\\\\n\",\n    \"\\\"\\\"\\\"Publius Vergilius Maro (Classical Latin: [ˈpuː.blɪ.ʊs wɛrˈɡɪ.lɪ.ʊs ˈma.roː]; traditional dates October 15, 70 BC – September 21, 19 BC[1]), usually called virgilio or Vergil (/ˈvɜːrdʒɪl/) in English, was an ancient Roman poet of the Augustan period. He wrote three of the most famous poems in Latin literature: the Eclogues (or Bucolics), the Georgics, and the epic Aeneid. A number of minor poems, collected in the Appendix Vergiliana, are sometimes attributed to him.[2][3]\\n\",\n    \"\\n\",\n    \"Virgilio is traditionally ranked as one of Rome's greatest poets. His Aeneid has been considered the national epic of ancient Rome since the time of its composition. Modeled after Homer's Iliad and Odyssey, the Aeneid follows the Trojan refugee Aeneas as he struggles to fulfill his destiny and reach Italy, where his descendants Romulus and Remus were to found the city of Rome. virgilio's work has had wide and deep influence on Western literature, most notably Dante's Divine Comedy, in which virgilio appears as Dante's guide through Hell and Purgatory.\\\"\\\"\\\"\\n\",\n    \"\\n\",\n    \"regex = \\\"(V|v)irgilio\\\"\\n\",\n    \"parsed_str = paragraphs\\n\",\n    \"m = re.search(regex, parsed_str)\\n\",\n    \"while m is not None:\\n\",\n    \"    parsed_str = parsed_str[:m.start()] + \\\"Virgil\\\" + parsed_str[m.end():]\\n\",\n    \"    m = re.search(regex, parsed_str)\\n\",\n    \"\\n\",\n    \"print(parsed_str)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Removing excessive spaces (solved)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"0\\n\",\n      \"Now it is your turn. I am going to give you this sentence as input, and your job is to fix the whitespace in it. When you are done, save the result in a string named `s`, and check if `s.count()` is equal to 0 or not.\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"weird_text = \\\"Now   it  is your   turn.  I am     going  to give   you this    sentence as        input, and   your  job    is to      fix the     whitespace         in it. When you    are  done,    save the    result in a  string  named   `s`, and   check    if  `s.count(\\\"  \\\")` is   equal   to    0  or not.\\\"\\n\",\n    \"regex = \\\" +\\\"  # put your regex here\\n\",\n    \"# there are several possible solutions, I chose this one\\n\",\n    \"\\n\",\n    \"# substitute the extra whitespace here\\n\",\n    \"s = re.sub(regex, \\\" \\\", weird_text)\\n\",\n    \"\\n\",\n    \"# this print should be 0\\n\",\n    \"print(s.count(\\\"  \\\"))\\n\",\n    \"print(s)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Phone numbers v1 (solved)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 48,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"<re.Match object; span=(0, 12), match='202-555-0181'>\\n\",\n      \"<re.Match object; span=(0, 16), match='001 202-555-0181'>\\n\",\n      \"<re.Match object; span=(0, 15), match='+1-512-555-0191'>\\n\",\n      \"None\\n\",\n      \"None\\n\",\n      \"None\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"((00|[+])1[ -])?[0-9]{3}-[0-9]{3}-[0-9]{4}\\\"  # write your regex here\\n\",\n    \"matches = [  # you should be able to match those\\n\",\n    \"    \\\"202-555-0181\\\",\\n\",\n    \"    \\\"001 202-555-0181\\\",\\n\",\n    \"    \\\"+1-512-555-0191\\\"\\n\",\n    \"]\\n\",\n    \"non_matches = [  # for now, none of these should be matched\\n\",\n    \"    \\\"202555-0181\\\",\\n\",\n    \"    \\\"96-125-3546\\\",\\n\",\n    \"    \\\"(+1)5125550191\\\"\\n\",\n    \"]\\n\",\n    \"for s in matches:\\n\",\n    \"    print(re.search(regex, s))\\n\",\n    \"for s in non_matches:\\n\",\n    \"    print(re.search(regex, s))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### `search` with `matched` (solved)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"True\\n\",\n      \"True\\n\",\n      \"True\\n\",\n      \"True\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"def my_search(regex, string):\\n\",\n    \"    found = False\\n\",\n    \"    while string:\\n\",\n    \"        m = re.match(regex, string)\\n\",\n    \"        if m:\\n\",\n    \"            return True\\n\",\n    \"        string = string[1:]\\n\",\n    \"    # check if the pattern matches the empty string\\n\",\n    \"    if re.match(regex, string):\\n\",\n    \"        return True\\n\",\n    \"    else:\\n\",\n    \"        return False\\n\",\n    \"\\n\",\n    \"regex = \\\"[0-9]{2,4}\\\"\\n\",\n    \"\\n\",\n    \"# your function should be able to match in all these strings\\n\",\n    \"string1 = \\\"1984 was already some years ago.\\\"\\n\",\n    \"print(my_search(regex, string1))\\n\",\n    \"string2 = \\\"There is also a book whose title is '1984', but the story isn't set in the year of 1984.\\\"\\n\",\n    \"print(my_search(regex, string2))\\n\",\n    \"string3 = \\\"Sometimes people write '84 for short.\\\"\\n\",\n    \"print(my_search(regex, string3))\\n\",\n    \"\\n\",\n    \"# your function should also match with this regex and this string\\n\",\n    \"regex = \\\"a*\\\"\\n\",\n    \"string = \\\"\\\"\\n\",\n    \"print(my_search(regex, string))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Count matches with `findall` (solved)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 24,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"3\\n\",\n      \"1\\n\",\n      \"2\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"def count_matches(regex, string):\\n\",\n    \"    return len(re.findall(regex, string))\\n\",\n    \"\\n\",\n    \"regex = \\\"wow\\\"\\n\",\n    \"\\n\",\n    \"string1 = \\\"wow wow wow\\\" # this should be 3\\n\",\n    \"print(count_matches(regex, string1))\\n\",\n    \"string2 = \\\"wowow\\\" # this should be 1\\n\",\n    \"print(count_matches(regex, string2))\\n\",\n    \"string3 = \\\"wowowow\\\" # this should be 2\\n\",\n    \"print(count_matches(regex, string3))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Phone numbers v2 (solved)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 49,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"<re.Match object; span=(0, 12), match='202-555-0181'>\\n\",\n      \"<re.Match object; span=(0, 16), match='001 202-555-0181'>\\n\",\n      \"<re.Match object; span=(0, 15), match='+1-512-555-0191'>\\n\",\n      \"None\\n\",\n      \"None\\n\",\n      \"None\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"regex = \\\"((00|[+])1[ -])?\\\\d{3}-\\\\d{3}-\\\\d{4}\\\"  # write your regex here\\n\",\n    \"matches = [  # you should be able to match those\\n\",\n    \"    \\\"202-555-0181\\\",\\n\",\n    \"    \\\"001 202-555-0181\\\",\\n\",\n    \"    \\\"+1-512-555-0191\\\"\\n\",\n    \"]\\n\",\n    \"non_matches = [  # for now, none of these should be matched\\n\",\n    \"    \\\"202555-0181\\\",\\n\",\n    \"    \\\"96-125-3546\\\",\\n\",\n    \"    \\\"(+1)5125550191\\\"\\n\",\n    \"]\\n\",\n    \"for s in matches:\\n\",\n    \"    print(re.search(regex, s))\\n\",\n    \"for s in non_matches:\\n\",\n    \"    print(re.search(regex, s))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Phone numbers v3 (solved)\\n\",\n    \"\\n\",\n    \"For this \\\"problem\\\", one thinks of using the `.findall()` function to look for all matches. When we do that, we don't get a list of the match objects, but instead a list with tuples, where each tuple has a specific group from our regex. This is the behaviour that is [documented for the `re.findall()` function](https://docs.python.org/3/library/re.html#re.findall).\\n\",\n    \"\\n\",\n    \"This is fine, because we really only cared about the number code, and we can print it easily. If we wanted the match objects, then the alternative would be to use the [`re.finditer()`](https://docs.python.org/3/library/re.html#re.finditer) function.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 26,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"('0039', '00')\\n\",\n      \"('0039', '00')\\n\",\n      \"('+30', '+')\\n\",\n      \"The number '0039 3123456789' has country code: 0039\\n\",\n      \"The number '0039 3135313531' has country code: 0039\\n\",\n      \"The number '+30-2111112222' has country code: +30\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"paragraph = \\\"\\\"\\\"Hello, I am Virgilio and I am from Italy.\\n\",\n    \"If phones were a thing when I was alive, my number would've probably been 0039 3123456789.\\n\",\n    \"I would also love to get a house with 3 floors and something like +1 000 square meters.\\n\",\n    \"Now that we are at it, I can also tell you that the number 0039 3135313531 would have suited Leo da Vinci very well...\\n\",\n    \"And come to think of it, someone told me that Socrates had dibs on +30-2111112222\\\"\\\"\\\"\\n\",\n    \"# you should find 3 phone numbers\\n\",\n    \"# and you should not be fooled by the other numbers that show up in the text\\n\",\n    \"\\n\",\n    \"regex = \\\"((00|[+])\\\\d{1,3})[ -]\\\\d{8,12}\\\"\\n\",\n    \"ns = re.findall(regex, paragraph)  # find numbers\\n\",\n    \"for n in ns:\\n\",\n    \"    # n is a tuple with the two groups our string has\\n\",\n    \"    print(n)\\n\",\n    \"    \\n\",\n    \"for n in re.finditer(regex, paragraph):\\n\",\n    \"    print(\\\"The number '{}' has country code: {}\\\".format(n.group(), n.group(1)))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": []\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.7.1\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "content/inferno/tools/wolfram-alpha.md",
    "content": "---\ntitle: Wolfram Alpha\nauthor: rogerjs\ndescription: The purpose of this guide is to show you the endless capabilities of the Wolfram Alpha engine and how to use it to perform complex calculations.\n---\n\n# Index\n  - [Wolfram Alpha](#wolfram-Alpha)\n  - [Accessing WolframAlpha](#accessing-WolframAlpha)\n  - [A first taste](#A-first-taste)\n  - [Basic calculations](#basic-calculations)\n  - [Plotting functions](#plotting-functions)\n  - [Solving equations](#solving-equations)\n  - [Solving inequalities](#solving-inequalities)\n  - [Matrix algebra](#matrix-algebra)\n  - [Computing series and summations](#computing-series-and-summations)\n  - [Finding derivatives](#finding-derivatives)\n  - [Computing integrals](#computing-integrals)\n  - [Finding limits](#finding-limits)\n  - [Miscellaneous](#miscellaneous)\n  \n\n# Wolfram Alpha\n[WolframAlpha](https://www.wolframalpha.com) (WA) is a computational knowledge engine, which is a very fancy way of saying that WolframAlpha is a platform that can answer your questions. WolframAlpha is most notable for its capabilities regarding mathematics and it can be a very powerful tool to help you with your computations.\n\n## Accessing WolframAlpha\nWolframAlpha's knowledge engine can be accessed online through [wolframalpha.com](https://www.wolframalpha.com) but if you have access to a license, perhaps through your university/research center/company, you might want to install [Wolfram Mathematica](https://www.wolfram.com/mathematica/), _\"a modern technical computing system spanning most areas of technical computing — including neural networks, machine learning, image processing, geometry, data science, visualizations, and others\"_.\n\n## A first taste\nWhenever you input something into WA, you get the link of your query, so that you can actually share what you asked and the answer given pretty easily. For example, following [this link](https://www.wolframalpha.com/input/?i=Who+is+the+US+president) you can see what WA told me when I asked him who the US president is. Through this guide, blue letters with a gray background give a link to a WA query. So if you click this -> [`What is the 345th decimal place of pi`](https://www.wolframalpha.com/input/?i=What+is+the+345th+decimal+place+of+pi) you will see what WA answered me when I asked for the 345th decimal place of pi (it's 5, by the way).\n\nAnother important thing to notice is that you don't have to follow a strict syntax when asking things to WA, even though the more you can facilitate WA's life, the better.\n\nAlso note that Mathematica - the language developed by the creators of WA -, uses `[]` for function calls, instead of `()`, and all function names are capitalized, so `Sqrt[n]` would give you the usual square root function, that in many languages would probably be used as `sqrt(n)`. This is relevant because WA supports a subset of Mathematica's functions.\n\nOne final **very important** hint is that if you have Mathematica, you can get step-by-step solutions to limits, integrals and derivatives (only to name a few) by starting a command with `==`.\n  \n### Basic calculations\nWolframAlpha can, of course, be used as a pretty advanced calculator. Typing in `2^100` will give you the well-known answer of `1267650600228229401496703205376`. Some useful operators to know include:\n  - The usual addition `+`, subtraction `-`, multiplication `*` and division `/`\n  - The power operator `^`, used as `x^y`, which can also be used as `Power[x, y]`\n  - To find the remainder of a division, either type in `x mod m` or use `Mod[x, y]`\n  - The square root is `Sqrt[x]`, and the `n`-th root of `x` is given by `Root[x, n]`, so the cubic root of 8 would be found by typing in [`Root[8, 3]`](https://www.wolframalpha.com/input/?i=Root%5B8,+3%5D)\n  - The factorial operator can be written as `n!` or as `Factorial[n]`\n  - The logarithm and the exponential function are respectively written as `Log[x]` and `Exp[x]`\n  - Trigonometric functions have the usual names, but capitalized; for example, `Tan[x]`, `Sin[x]`, `ArcCos[x]` are respectively the tangent, sine and arc-cosine functions\n\n### Plotting functions\nThere are several different types of plots you can ask WA to do, but perhaps the most basic one would be to plot a simple function from the reals to the reals, like [plotting x^2](https://www.wolframalpha.com/input/?i=plot+x%5E2), which can be done by typing in `plot x^2` or `plot Power[x, 2]`.\\\nWhen plotting functions, we don't always want the range that WA suggests, so [`plot x^2 from -5 to 1`](https://www.wolframalpha.com/input/?i=plot+x%5E2+from+-5+to+1) would change the range from the default to the interval from -5 to 1.\n\nFor simpler plots, writing in plain English what we want works just fine, but for more complex or intricated plots, we will be better of using the Mathematica syntax. So a regular plot like `plot x^2 from -5 to 1` becomes `Plot[x^2, {x, -5, 1}]`, where the function `Plot[]` is used to say we want a plot, the first argument `x^2` is the function we want to plot and the second argument `{x, -5, 1}` is a list (lists in Mathematica are denoted with `{}`) with the variable, the left limit and the right limit. So [`Plot[x^2, {x, -5, 1}]`](https://www.wolframalpha.com/input/?i=Plot%5Bx%5E2,+%7Bx,-5,1%7D%5D) produces the same plot as before.\n\nTo plot more than one function, we can give a list of functions as first argument, instead of just a function. For example, [`Plot[ {x^2, x^3, x^4}, {x, 1, 5} ]`](https://www.wolframalpha.com/input/?i=Plot%5B%7Bx%5E2,+x%5E3,+x%5E4%7D,+%7Bx,+1,+5%7D%5D) will plot three different polynomials, from 1 to 5.\n\nTo plot functions of two variables, we can use the function `Plot3D`, so if we type in [`Plot3D[x^2 + y^2 + x*y, {x, -2, 2}, {y, -2, 0}]`](https://www.wolframalpha.com/input/?i=Plot3D%5Bx%5E2+%2B+y%5E2+%2B+x*y,+%7Bx,+-2,+2%7D,+%7By,+-2,+0%7D%5D) we will be plotting the function `x^2 + y^2 + xy` when `x` varies between -2 and 2 and when `y` varies between -2 and 0.\n\n### Solving equations\nSolving equations can be done very easily. In fact, just typing in [`solve x^2 + x - 1 = 0 for x`](https://www.wolframalpha.com/input/?i=solve+x%5E2+%2B+x+-+1+%3D+0+for+x) gives you what you would expect. Using Mathematica notation, you would type [`Solve[x^2 + x - 1 == 0, x]`](https://www.wolframalpha.com/input/?i=Solve%5Bx%5E2+%2B+x+-+1+%3D%3D+0,+x%5D).\n\nA great thing of WA and of Mathematica as well is their ability to do symbolic calculations, which also means your equations can have parameters or other unknowns, and WA will try to give you the answer in terms of those parameters. For example, we can ask WA for the general formula to solve a polynomial equation of degree 4 with [`Solve[x^4 + b*x^3 + c*x^2 + d*x + e == 0, x]`](https://www.wolframalpha.com/input/?i=Solve%5Bx%5E4+%2B+b+x%5E3+%2B+c+x%5E2+%2B+d+x+%2B+e+%3D%3D+0,+x%5D) which returns the nasty formulas.\n\nThe equations you want to solve do not need to be polynomial ones! For example, [`Solve[Log[x] + Exp[x] == 1, x]`](https://www.wolframalpha.com/input/?i=Solve%5B+Log%5Bx%5D+%2B+Exp%5Bx%5D+%3D%3D+1,+x%5D) gives the value of the number `x` that solves the equation `Log[x] + Exp[x] == 1`.\n\nSystems of equations can also be solved. Just like you would give a list of functions to the `Plot[]`, now we give a list of equations to the `Solve[]`. For example, we want to solve the two equations `Log[x] + y == 1` and `Log[x] + Log[y] == 2`, which we do by typing in [`Solve[ {Log[x] + y == 1, Log[y] + Log[x] == 2}, {x,y} ]`](https://www.wolframalpha.com/input/?i=Solve%5B+%7BLog%5Bx%5D+%2B+y+%3D%3D+1,+Log%5By%5D+%2B+Log%5Bx%5D+%3D%3D+2%7D,+%7Bx,y%7D+%5D). Two **important** things to notice here! First, the result that WA gives includes a function `W` that most people won't know; WA helps people by writing slightly to the right what each component of the solution is, so WA actually says here that _\"W(z) is the product log function\"_, which we can then google for. Second, notice how the second argument of `Solve[]` was `{x,y}` and **not** `x`! We need to tell WA all the variables we have; if we only write `x`, then WA is trying to solve a different problem: [`Solve[ {Log[x] + y == 1, Log[y] + Log[x] == 2}, x ]`](https://www.wolframalpha.com/input/?i=Solve%5B+%7BLog%5Bx%5D+%2B+y+%3D%3D+1,+Log%5By%5D+%2B+Log%5Bx%5D+%3D%3D+2%7D,+x+%5D)\n\n### Solving inequalities\nTo solve inequalities you do it in a similar way to equations, but instead use the function `Reduce[]`. As an example, we solve the simultaneous system of inequalities `x y > 3` and `x + y < 0` by typing in [`Reduce[{x + y < 0, x y > 3}, {x,y}]`](https://www.wolframalpha.com/input/?i=Reduce%5B%7Bx+%2B+y+%3C+0,+x+y+%3E+3%7D,+%7Bx,y%7D%5D)\n\n### Matrix algebra\nMatrices are used a lot, and sometimes we just need some place to go to check a determinant, the eigenvalues or the eigenvectors of a matrix, or maybe even invert it. You may need that, and when you do, WA has got your back.\n\nIn WA, matrices are lists of lists. The outer lists collects all the rows, and the inner lists have the elements of each row, so the identity matrix of dimension 2 would be represented as [`{ {1, 0}, {0, 1} }`](https://www.wolframalpha.com/input/?i=%7B%7B1,+0%7D,+%7B0,+1%7D%7D) (by just inputing the matrix WA will automatically give you plenty of information about the matrix).\n\nTo find the determinant or the trace of a matrix, you would respectively use the functions `Det[]` and `Trace[]`, so for example [`Det[{ {a, b}, {c, d} }]`](https://www.wolframalpha.com/input/?i=Det%5B%7B%7Ba,+b%7D,+%7Bc,+d%7D%7D%5D) gives the determinant of a general 2 by 2 matrix, and [`Trace[{ {a, b}, {c, d} }]`](https://www.wolframalpha.com/input/?i=Trace%5B%7B%7Ba,+b%7D,+%7Bc,+d%7D%7D%5D) gives its trace.\n\nTo find the inverse, you use [`Inverse[{ {a, b}, {c, d} }]`](https://www.wolframalpha.com/input/?i=Inverse%5B%7B%7Ba,+b%7D,+%7Bc,+d%7D%7D%5D).\n\nTo ask for the eigenvalues (resp. the eigenvectors) you would type in [`Eigenvalues[{ {a, b}, {c, d} }]`](https://www.wolframalpha.com/input/?i=Eigenvalues%5B%7B%7Ba,+b%7D,+%7Bc,+d%7D%7D%5D) (resp. [`Eigenvectors[{ {a, b}, {c, d} }]`](https://www.wolframalpha.com/input/?i=Eigenvectors%5B%7B%7Ba,+b%7D,+%7Bc,+d%7D%7D%5D)), even though asking for one usually also gives the other.\n\nOf course that all of this can be done with bigger matrices, and matrices with actual numbers, not just parameters! For example, we can compute the eigenvalues of some 5 by 5 matrix, say [`Eigenvalues[{ {1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20},{21,22,23,24,25} }]`](https://www.wolframalpha.com/input/?i=Eigenvalues%5B%7B%7B1,2,3,4,5%7D,%7B6,7,8,9,10%7D,%7B11,12,13,14,15%7D,%7B16,17,18,19,20%7D,%7B21,22,23,24,25%7D%7D%5D) gives `0, 0, 0, -3.642, 68.64`.\n\nProbably more relevant for university courses, but WA also diagonalizes matrices/finds their Jordan canonical form. For that, use [`JordanDecomposition[{ {1, 2}, {0, 3} }]`](https://www.wolframalpha.com/input/?i=JordanDecomposition%5B%7B%7B1,+2%7D,+%7B0,+3%7D%7D%5D) which also gives the similarity matrix and the matrix in diagonal/Jordan canonical form.\n\n### Computing series and summations\nAnother thing that Wolfram  Alpha can do is compute summations and series; both with known values and with unknown values. For example, I never know by heart what is the formula to compute the sum of the first terms of a geometric series like `1 + x + x^2 + x^3 + ... + x^n`. WA can help me by just inputing [`sum x^i with i from 0 to n`](https://www.wolframalpha.com/input/?i=sum+x%5Ei+with+i+from+0+to+n), which gives the formula I always forget! But then again, we would be better off using Mathematica's syntax, which for sums/series is through the function `Sum[]`. The first argument is the expression you want to sum, the second argument is the range of the dummy variable! For example, [`Sum[x^i, {i, 0, n}]`](https://www.wolframalpha.com/input/?i=Sum%5Bx%5Ei,+%7Bi,+0,+n%7D%5D) gives the same result as before.\n\nWe can also sum, for example, the first 20 factorials with [`Sum[Factorial[n], {n, 1, 20}]`](https://www.wolframalpha.com/input/?i=Sum%5BFactorial%5Bn%5D,+%7Bn,+1,+20%7D%5D) (which gives `2561327494111820313` by the way).\n\nInfinite sums, which are called series, are computed by replacing the upper limit of the dummy variable with `infty`. So if we input [`Sum[1/n, {n, 1, infty}]`](https://www.wolframalpha.com/input/?i=Sum%5B1%2Fn,+%7Bn,+1,+infty%7D%5D) our dear WA lets us know that the [harmonic series diverges](http://mathspp.blogspot.com/2018/10/twitter-proof-sum-of-inverses-diverges.html).\n\nAnother interesting example is [`Sum[1/n^2, {n, 1, infty}]`](https://www.wolframalpha.com/input/?i=Sum%5B1%2Fn%5E2,+%7Bn,+1,+infty%7D%5D), which actually gives `pi^2/6`.\n\nFinite/infinite products work the same way, except that we use the function `Product[]`. For example, there is an interesting product formula that gives `pi/2`, and the first 100 terms of that product show that it is close: [`Product[(4i^2)/((2i-1)*(2i+1)), {i, 1, 100}]`](https://www.wolframalpha.com/input/?i=Product%5B(4i%5E2)%2F((2i-1)*(2i%2B1)),+%7Bi,+1,+100%7D%5D) is close to [`Pi/2`](https://www.wolframalpha.com/input/?i=pi%2F2) (more on this example in the limits section).\n\n### Finding derivatives\nDifferentiating a function is something that can get really nasty. Thankfully, WA does it for us with little effort! We can get some basic derivatives with [`differentiate cos(sin(x)) wrt x`](https://www.wolframalpha.com/input/?i=differentiate+cos(sin(x))+wrt+x). The equivalent Mathematica command would be [`D[Cos[Sin[x]], x]`](https://www.wolframalpha.com/input/?i=D%5BCos%5BSin%5Bx%5D%5D,+x%5D), where the `D` stands for differentiation, probably. Notice that the first argument is the function you want to differentiate, and the second argument is the variable with respect to which you want to differentiate.\n\nHigher-order derivatives can be done by specifying the variable and the order: [`D[x^5, {x, 5}]`](https://www.wolframalpha.com/input/?i=D%5Bx%5E5,+%7Bx,+5%7D%5D) gives the fifth derivative of the function `x^5`.\n\nFunctions of several variables can also be differentiated easily, as WA and Mathematica will treat as constants everything that is not the variable specified. For example, [`D[x^2 + y^2, x]`](https://www.wolframalpha.com/input/?i=D%5Bx%5E2+%2B+y%5E2,+x%5D) gives `2x`, obviously.\n\nTo find mixed partial derivatives, just put the function as the first argument, and then all the variables you want to differentiate with respect to, in order. For example, if you want to find the mixed partial derivative of `f` with respect to `a`, then `b`, then `c`, do [`D[f[a,b,c], a, b, c]`](https://www.wolframalpha.com/input/?i=D%5Bf%5Ba,b,c%5D,+a,+b,+c%5D). Notice how for this last one, WA returns the symbolic expression, as `f` was just some generic function. This means we can also get WA to tell us the rules of differentiation. For example, we can ask WA to differentiate the product `f(x)g(x)`: [`D[f[x] * g[x], x]`](https://www.wolframalpha.com/input/?i=D%5Bf%5Bx%5D+*+g%5Bx%5D,+x%5D) that gives the product rule `(fg)' = f'g + fg'`.\n\nTypical operations on (usually scalar) functions that include derivatives can be computed with WA as well. In the following list I assume we are working with some function `f(x, y, z)` of three variables. The number of variables can be easily changed!\n  - Gradient of `f` can be computed with [`gradient f[x,y,z]`](https://www.wolframalpha.com/input/?i=gradient+f%5Bx,y,z%5D) in WA and `D[f[x,y,z], { {x,y,z} }]` in Mathematica\n  - The divergence of the vector function `(f1(x,y,z), f2(x,y,z), f3(x,y,z))` can be found with [`divergence {f1[x,y,z], f2[x,y,z], f3[x,y,z]}`](https://www.wolframalpha.com/input/?i=divergence+%7Bf1%5Bx,y,z%5D,+f2%5Bx,y,z%5D,+f3%5Bx,y,z%5D%7D) in WA and `Div[{f1[x, y, z], f2[x, y, z], f3[x, y, z]}, {x, y, z}]` in Mathematica\n  - The curl is similar, expect that we replace `divergence` with `curl` for the WA computation and use the function `Curl[]` in Mathematica, instead of `Div`\n  - Laplacian of `f` can be computed with [`laplacian f[x,y,z]`](https://www.wolframalpha.com/input/?i=laplacian+f%5Bx,y,z%5D) in WA and `Laplacian[f[x, y, z], {x, y, z}]` in Mathematica\n\n### Computing integrals\nUnfortunately, computing integrals with WolframAlpha is very difficult... Not! It works just like anything else. You just type it in in WA and you get an answer: [`integrate exp(-x^2) with x from 0 to infinity`](https://www.wolframalpha.com/input/?i=integrate+exp(-x%5E2)+with+x+from+0+to+infinity). Mathematica's way of doing things would be [`Integrate[ Exp[-x^2], {x, 0, infty}]`](https://www.wolframalpha.com/input/?i=Integrate%5B+Exp%5B-x%5E2%5D,+%7Bx,+0,+infty%7D%5D).\n\nOf course the variable of integration can be any variable and the bounds can be changed as well, and they can include plus and minus infinity.\n\nTo find anti-derivatives, you just omit the bounds of the variable. For example, to find an anti-derivative of `cos(sin(x))tan(x)` we could type in [`Integrate[Cos[Sin[x]]Tan[x], x]`](https://www.wolframalpha.com/input/?i=Integrate%5BCos%5BSin%5Bx%5D%5DTan%5Bx%5D,+x%5D) and we get a very long answer. Sometimes WA can't find an anti-derivative, and it will let you know that.\n\nIf all we need is an (accurate) numerical value and we don't need WA to give us the exact answer (which it will try to give always and whenever possible) we can explicitly use the function `NIntegrate[]` instead of `Integrate`: [`NIntegrate[Cos[1/x + Pi/2]^5, {x,1,infty}]`](https://www.wolframalpha.com/input/?i=NIntegrate%5BCos%5B1%2Fx+%2B+Pi%2F2%5D%5E5,+%7Bx,1,infty%7D%5D).\n\nAs a final remark, note that if you use WA/Mathematica to check if you are doing your antiderivatives correctly, remember that sometimes a function has more than one antiderivative. If you were trying to find the antiderivative of a function `h` and arrived at some function `f` but then WA got to a different function `g`, it doesn't necessarily mean you got it wrong! Just try deriving your function `f` and see if that gives `h`, as it should!\n\n### Finding limits\nTo find a limit of an expression or function, just type it as you would expect it: [`limit of 1/x as x goes to -infty`](https://www.wolframalpha.com/input/?i=limit+of+1%2Fx+as+x+goes+to+-infty). The function one may want to use here is `Limit[]`. It works like almost all other function we've seen. The first argument is the expression and the second argument is the variable; the only thing to be careful here is the way in which we tell WA to where the variable is converging. The previous example would be written [`Limit[1/x, x -> -infty]`](https://www.wolframalpha.com/input/?i=Limit%5B1%2Fx,+x+-%3E+-infty%5D).\n\nIt is often useful to also define the direction from which the variable approaches the limiting value. For example we know that the limit of `1/x` when `x` goes to 0 changes as `x` approaches 0 from the left or from the right. So we can actually check that [`Limit[1/x, x -> 0^+]`](https://www.wolframalpha.com/input/?i=Limit%5B1%2Fx,+x+-%3E+0%5E%2B%5D) is different from [`Limit[1/x, x -> 0^-]`](https://www.wolframalpha.com/input/?i=Limit%5B1%2Fx,+x+-%3E+0%5E-%5D) where the exponent notation `0^+` and `0^-` is used to define the side from which we approach 0 here.\n\nAlso, in the [summations and series](#computing-series-and-summations) I mentioned that a certain product could be used to compute `pi/2`. The product I am talking about is [`Product[(4i^2)/((2i-1)*(2i+1)), {i, 1, infty}]`](https://www.wolframalpha.com/input/?i=Product%5B(4i%5E2)%2F((2i-1)*(2i%2B1)),+%7Bi,+1,+infty%7D%5D) and if you follow the link you will see that WA can't actually give you the exact value. Instead, it gave me the value of the product if I only go up to 5 terms and it gave me a **closed** formula for the product up to `n`: [`Product[(4i^2)/((2i-1)*(2i+1)), {i, 1, n}]`](https://www.wolframalpha.com/input/?i=Product%5B(4i%5E2)%2F((2i-1)*(2i%2B1)),+%7Bi,+1,+n%7D%5D). Now I will use the `Limit[]` function to prove that I am actually not lying! If I put that closed formula inside the `Limit` function and ask `n` to go to infinity like so: [`Limit[(Pi Gamma[1 + n]^2)/(2 Gamma[1/2 + n] Gamma[3/2 + n]), n -> infty]`](https://www.wolframalpha.com/input/?i=Limit%5B(Pi+Gamma%5B1+%2B+n%5D%5E2)%2F(2+Gamma%5B1%2F2+%2B+n%5D+Gamma%5B3%2F2+%2B+n%5D),+n+-%3E+infty%5D), we get the desired `pi/2`.\n\n### Miscellaneous\nTo find if a number is prime, you can use the function `PrimeQ[]`, for example type [`PrimeQ[4234523457]`](https://www.wolframalpha.com/input/?i=PrimeQ%5B4234523457%5D) to conclude that 4234523457 is not a prime number because `4234523457 = 3×53×97×463×593`.\n\nSimilarly, use the function `Prime[]` to find out the `n`-th prime. For example, type [`Prime[4234523457]`](https://www.wolframalpha.com/input/?i=Prime%5B4234523457%5D) to find out that the 4234523457th prime is `102951556637`.\n\n---\nBrought to you by the editor of the [Mathspp Blog](https://mathspp.blogspot.com/), [RojerGS](https://github.com/RojerGS).\n"
  },
  {
    "path": "content/inferno/virtual-assistants/dialogflow-chatbot.md",
    "content": "---\ntitle: Chatbot with DialogFlo\nauthor: clone95\ndescription: The purpose of this guide is to guide you through the creation of a fully interactive and useful chatbot, with endless possibilities for business automation and improving customer experience.  \n---\n\n# Index\n- [We have 99.94847 percent probability of death Luke](#We-have-99.94847-percent-probability-of-death-Luke)\n- [Why DialogFlow](#Why-DialogFlow)\n- [Learning DialogFlow](#Learning-DialogFlow)\n  - [The GUI approach](#The-GUI-approach) \n  - [A deeper approach](#A-deeper-approach)\n  - [Our first agent](#Our-first-agent)\n  - [Experimenting the API](#Experimenting-the-API)\n- [Hands-on Project](#Hands-on-Project)\n  - [Up and running with Flask and webhooks](#Up-and-running-with-Flask-and-webhooks)\n  - [Our agent, but with API calls](#Our-agent,-but-with-API-calls)\n  - [Handling webhooks with Flask](#Handling-webhooks-with-Flask)\n  - [Deploying our chatbot](#Deploying-our-chatbot)\n  - [Chatbot tips and best practices](#Chatbot-tips-and-best-practices)\n  - [Project Ideas](#Project-Ideas)\n\n## We have 99.94847 percent probability of death Luke\nIn simple terms, a [Chatbot](https://medium.com/swlh/what-is-a-chatbot-and-how-to-use-it-for-your-business-976ec2e0a99f) is a computer program that simulates human conversation (in the form of texts and audio) \nwhich we would perceive as being intelligent and useful. \nTheir most important application is personal or enterprise virtual assistants.\nChatbots can _dig through huge amounts of data_ to pick out\nthe best nugget for a customer, whether it is a troubleshooting solution or a recommendation for a\nnew product to try. Also, they offer an extremely _intuitive interface_ between your business and your customers.\nDepending on the situation, a chatbot can learn from what a user\nsays to personalize the interaction and build off previous interaction, giving \na [satisfying and futuristic customer experience](https://mobilemonkey.com/chatbots/chatbot-examples).\n\n## Why Dialogflow\n[DialogFlow](https://dialogflow.com/) is the beginner-friendly chatbot platform from Google, and albeit there are several platforms out \nthere ([here](https://chatbotsmagazine.com/choosing-the-best-chatbot-platform-101-a-beginners-guide-e841b41192c7) a cool guide on choosing the right \nplatforms), DialogFlow has the best tradeoffs in particular for a beginner. [Here](https://chatbotsjournal.com/25-chatbot-platforms-a-comparative-table-aeefc932eaff) you find \nanother comparative table.\nI've chosen DialogFlow because:\n- Incorporates Google's machine learning expertise and products such as Google Cloud Speech-to-Text.\n- Is a Google service that runs on the Google Cloud Platform, letting you scale to hundreds of millions of users.\n- Is really beginner-friendly, intuitive, and has complete and clear documentation.\n\n\n## Learning DialogFlow\nThe thing I love about DialogFlow is that's beginner friendly. In fact, the approach  we'll follow to learn how to deploy real chat-bots is the following:\n- A first gentle approach through the Graphical User Interface to understand the concepts (intents, entities, context...)\n- A more \"coding\" approach, using the Python Client for [RESTful](https://it.wikipedia.org/wiki/Representational_State_Transfer) API call to reproduce the same Agent but with code (and not clicks in the GUI).\n- When we're able to build agents with Python API calls, we'll use them to create and End-to-End chatbot project that you'll deploy on several channels (Slack, Facebook, Telegram...)\n\nThis guide will use [Python](https://www.python.org/) and his [Flask](http://flask.pocoo.org/) lightweight library to let you build a complete and deployable chatbot application. So, if you don't know Python, make yourself a gift and [learn it!](https://automatetheboringstuff.com/)\n\nLet's start!\n\n### The GUI approach \nThe first thing I suggest you do is going through the [official introduction](https://dialogflow.com/docs) and step-by-step tutorial. It will bring you from zero to be able to create an Agent (the single chatbot application) with the GUI.\n[Here](https://console.dialogflow.com/api-client/#/login) you can start to build your agent and follow the steps of the tutorial. \nYou won't have a problem during this phase, you don't have to code anything, just follow the tutorial up to \"Fulfillment\".\n\n### Our first agent\nIf you've followed the guide with attention, you're now able to create a simple chatbot from the GUI.\nSo let's get our hands dirty and create our first agent! \n\n- Create a new Agent and develop it from the GUI, until he's able to reproduce this \"I'm lost\" Intent with FollowUpIntents:\n\nBot: Hi! I'm Virgilio! How can I help you?\\\nHuman: Tell me which is the best _Data Science_ project in _Italy_.\\\nB: Without a doubt, the best project about _Data Science_ in _Italy_ is _Virgilio_! Do you want to reach it?\\\nH: Yes.\\\nB: Here's the link, you're welcome :) \\\nB: [ ...drops the link ]\n\nThat's it, for now. Try to reproduce the conversation, you can try your agent from the top-right bar in the GUI.\nNotice that you have three entities here. Which ones?\nRemember that you can use both system entities (like an hour, date, languages, places...), and custom entities!\nWhen you're done, let's go for the next step!\n\n### Experimenting the API\nNow that you're really comfortable with the DialogFlow concepts, we can dive deep down the rabbit hole and et up the environment for developing a chatbot with Python. This will bring us al the power of the code to build and handle a lot of chatbots (and many more things).\nAssuming that you have Python3 installed, install the [Python SDK](https://dialogflow-python-client-v2.readthedocs.io/en/latest/index.html) going in the folder where you want to put your configuration files, launch a shell and digit:\n\n```\npip install dialogflow\n```\n\nIf it doesn't work, maybe is because you have an old installation of Python 2. In that case, digit:\n\n```\npip3 install dialogflow\n```\n\nNow go [here](https://github.com/googleapis/dialogflow-python-client-v2/tree/master/samples) and be happy. A lot of work is already done in these examples, and with them, you can already do a lot of things. I create the folder \"examples\" where I put those python files.\nNow follow the \"Before you begin\" instructions [here](https://dialogflow-python-client-v2.readthedocs.io/en/latest/).\nCreate a new agent in the project and add an intent from the GUI.\nConnect to that agent initializing the dialogflow client from your python script and read the Intents already existent in the Agent.\nIt will be like:\n\n```\nfrom examples import intent_management\nos.environ[\"GOOGLE_APPLICATION_CREDENTIALS\"] = <your path>/<your credentials file>.json\"\nprojectID = <your project id>\n\nclient = dialogflow.IntentsClient()\nparent = client.project_agent_path(projectID)\nmanagement.list_intents(parent)\n```\n\nIt should return you a JSON with all the information requested (in this case, your existing intents).\nJSON is the new de-facto standard for information representation, so [get comfortable](https://www.w3schools.com/whatis/whatis_json.asp) with it!\n\nSo, you have these files with a wrapper for the low-level functions (in this case, the low-level function in the intent_management.py is called at line 40 inside the list_intent() function).\n\nThese files are really useful to get started, but in the end, you want to have the most possible expressiveness and flexibility. So you want to master the lower level functions.\n\n### A deeper approach\n\nTry now to re-produce the Intent we have created with the lower level functions of the dialogflow module. You have here all the pieces of information you need, the [documentation](https://cloud.google.com/dialogflow-enterprise/docs/reference/rest/v2-overview) is really well done! In general, each time you want to communicate with the API you need to build a JSON (your request) and you'll receive a JSON (the response). \n\n### Up and running with Flask and webhooks\n\nDialogflow's APIs allows you to take action on your own systems based on conversational input, embed your conversational interface into your app or website, and dynamically change your agent's behavior. Dialogflow APIs center around three primary use cases:\n\n- Fulfillment: take action on your own systems based on conversational input. You can do things like querying a database or API to provide info to your users with any integration (Actions on Google, Slack, etc.)\n- Detect Intent API: Embed your conversational interface built with Dialogflow into your app, website or device. Call this API with a user's query to get back how your DIalogflow agent's response\n- Agent API: Dynamically change your agent's behavior by editing your agent's intents, entities, and contexts. Do anything you can through Dialogflow console programmatically with Dialogflow's agent APIs.\n\nHere you can see a clear schema.\n\n![Figure 1-1](https://raw.githubusercontent.com/dialogflow/resources/master/images/overview.png \"1\") \n\nBasically, you want to have a .py file that builds the agent (with API calls), then your agent is ready to take in queries form the user and send them (once recognized the user query) to a backend application (your webhook). In our case, the app in the backend (the webhook) is built with Flask.\n\n**Fulfillment** is code that's deployed as a webhook that lets your Dialogflow agent call business logic on an intent-by-intent basis. During a conversation, fulfillment allows you to use the information extracted by Dialogflow's natural language processing to generate dynamic responses or trigger actions on your back-end.\n\nMost Dialogflow agents make use of fulfillment to do things like: generate dynamic responses based on information looked up from a database, place orders based on products a customer has asked for, implement the rules and winning conditions for a game.\n\n### Our agent, but with API calls\nIt's time to get our hands dirty again!\nThis time we're adding the backend application acting under the hood, and not the static answers anymore.\n[Here](https://www.pragnakalp.com/dialogflow-fulfillment-webhook-tutorial/) you have a consistent and complete tutorial on how to run the Flask application on your machine (using Ngrok to expose he webhook on your machine, to the Web). \nNow that you have the entire stack working, you can start creating any type of application!\n\n### Deploying our chatbot\nThe smartest way to deploy your agent is through common communication channels like Facebook Messenger or Telegram.\n[Here](https://hub.packtpub.com/creating-and-deploying-a-chatbot-using-dialogflow-tutorial/) you find a very comprehensive tutorial on how to deploy your chatbot application to the real worlds. It's easy, isn't it?\n\n### Chatbot tips and best practices\nI've collected here for you some best articles and StackOverflow questions containing best practices.\n\n- [1](https://dzone.com/articles/best-practices-for-lively-chatbots), [2](https://miningbusinessdata.com/automatically-generate-dialogflow-faq-chatbot-csv-file/), [3](https://www.comm100.com/blog/chatbot-best-worst-practices.html), [4](https://chatbotsmagazine.com/11-more-best-ux-practices-for-building-chatbots-67362d1104d9), [5](https://thebrainfiles.wearebrain.com/chatbot-best-practice-learnings-and-insights-from-companies-like-abn-amro-booking-com-6e4c329c60a5), [6](https://www.marutitech.com/8-best-practices-bot-development/), [7](https://stackoverflow.com/questions/52426295/dialogflow-intent-lifespan-best-practice-and-performance)\n\n[Here](https://medium.com/the-mission/how-to-effectively-run-a-chatbot-development-project-a445d2d1170f) and [here](https://botpress.io/blog/successful-chatbot-projects-avoid-these-mistakes/) you find two guides on how to plan a chat for your business.\n\n### Project Ideas\n\nI've packed here for you a list of links with a lot of project ideas. Have fun!\n\n- [1](https://chatbotsmagazine.com/80-chatbot-ideas-for-enterprise-bots-4bb73281f593), [2](https://www.messengerpeople.com/best-of-8-chatbot-projects-you-will-love-to-discover/), [3](https://www.quora.com/What-are-some-cool-ideas-where-chat-bots-can-be-put-to-use), [4](https://www.wordstream.com/blog/ws/2017/10/04/chatbots), [5](https://www.ideas2it.com/blogs/50-chatbot-use-cases/)\n\n\n----\nWritten by _clone95_\n"
  },
  {
    "path": "content/inferno/welcome-to-inferno/welcome-to-inferno.md",
    "content": "---\ntitle: Welcome To Inferno\nauthor: clone95\ndescription: This guide explains how the Inferno section of Virgilio is organized. \n---\n\n# Index\n\n- [Here You Are](#Here-You-Are)\n- [The Structure of Inferno](#The-Structure-of-Inferno)\n\n## Here you are \n\nAs you know, Virgil is divided into 3 sections:\n\n- <span style=\"font-weight: bold; color: #2565AE\">Paradiso</span>: High Level Guides - For Everyone\n- <span style=\"font-weight: bold; color: #009967\">Purgatorio</span>: Entry Level Technical Guides - For Beginners\n- <span style=\"font-weight: bold; color: #D22C2C\">Inferno</span>: Advanced Technical Guide - For Experienced Practitioners\n\n_Going from top to bottom increases the level of detail and decreases the level of abstraction_. \n\n::: warning\nThe Inferno is the part of Virgilio where you will find **advanced and detailed** guide about every topics that can be related to the Data Science, Machine Learning, or Deep Learning fields.\n\n**It's highly recommended to start from the _Paradiso_ or the _Purgatorio_ first, if you have no prior experience or education in the mentioned fields.**\n:::\n\n_It's possible_ that you've reached this section of Virgilio after days, weeks, or months since you arrived, depending on what your past experience was.\n\nVirgilio sincerely hopes to have been helpful in guiding you in your first steps into the world of Data Science :-) \n\nNow it's time to _dive deeper_ in some of the most important aspects of many real-world Data Science applications!\n\n\n## The Structure of Inferno\n\nThe Inferno is structured to serve **two needs**:\n\n**The first need** is to provide a clear picture of the main Data Science applications with respect to the various widely recognized subfields.\n\nThis fact is achieved by the division of the guides into 3 main areas (more to come...):\n\n- Computer Vision \n- Time Series \n- Natural Language Processing \n\n::: tip\nEach of the 3 areas has and \"Introductory guide\" to get you started in the related area!\n:::\n\n**The second need** is to serve as an \"extensible container\" for all future practical guides that are created by the Virgilio community and contributors. \n\nThis fact is achieved by some additional sections (which will grow with time):\n\n- Tools (tool or library-specific guides)\n- Soft Skills \n- Virtual Assistants\n- Research\n- ... and more will come!\n\n\n### Let's start\n\nNow that you know the structure of the Inferno, have a good time esploring all the guides that Virgilio has prepared for you!"
  },
  {
    "path": "content/package.json",
    "content": "{\n  \"name\": \"virgilio\",\n  \"version\": \"0.0.1\",\n  \"description\": \"Your new Mentor for Data Science E-Learning.\",\n  \"main\": \"index.js\",\n  \"directories\": {\n    \"doc\": \"docs\"\n  },\n  \"scripts\": {\n    \"build\": \"vuepress build\",\n    \"deploy\": \"vuepress build && npx gh-pages -d .vuepress/dist -b master\",\n    \"dev\": \"vuepress dev\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/virgili0/Virgilio.git\"\n  },\n  \"author\": \"Antonio Vivace, Giacomo Ciarlini\",\n  \"license\": \"GPL-3.0-or-later\",\n  \"bugs\": {\n    \"url\": \"https://github.com/virgili0/Virgilio/issues\"\n  },\n  \"homepage\": \"https://virgili0.github.io/Virgilio\",\n  \"devDependencies\": {\n    \"vuepress\": \"^1.4.1\"\n  },\n  \"dependencies\": {\n    \"vuepress-plugin-sitemap\": \"^2.3.1\"\n  }\n}\n"
  },
  {
    "path": "content/paradiso/demystification-ai-ml-dl.md",
    "content": "---\ntitle: Demystification of the key concepts of AI and ML\nauthor: clone95\ndescription: This guide wants to clarify ideas about terms such as Artificial Intelligence and Machine Learning and what their applications and potential are. You will also be introduced to the [Jargon](https://en.wikipedia.org/wiki/Jargon) of these incredible themes in continuous evolution. You will understand the hierarchy and contexts in which to read any news or the fact that it mentions AI or Machine Learning. You will learn to distinguish hype from reality.\n---\n\n# Index\n- [Index](#index)\n  - [What are AI, ML, and DL?]()\n  - [Differences from the algorithmic approach](#machine-learning-differences-from-the-algorithmic-approach)\n  - [Why to use Machine Learning techniques](#why-use-machine-learning-techniques)\n  - [Conclusions](#conclusions)\n  \n\n## What are Artificial Intelligence, Machine Learning, and Deep Learning?\n\nThe term Machine Learning is often confused with the term **Artificial Intelligence** (abbreviated to AI), which however refers to a set of techniques, methodologies, and algorithms that includes those of **Machine Learning** (abbreviated to ML). \n\nThe objective of the AI field is to create _intelligent_ agents, which can have a perception of the real world through sensors, make decisions thanks to their \"intelligence\", and finally implement them through actuators.\nIf you want to make an analogy with a human being, you can think of sensors as the sense organs (eyes, ears,...), the intelligence is that of our brain and the actuators can be the hands, feet, or more generally the muscles.\n\nHowever, [the biological analogy is limited](https://www.reddit.com/r/MachineLearning/comments/ayvxvc/d_are_the_connections_between_deep_learning_and/), since it is not necessary for the sensors of an agent to detect physical phenomena, such as temperature or time, but it could detect data, relations, or inputs of any other kind.\n\nMachine learning is generally considered as a subset of the AI field. Specifically, the term Machine Learning means the science of **programming a machine so that it can learn to perform a task from the data, rather than through programming.**\n\n**Deep Learning** is a further subset of the Machine Learning field, more precisely an ensemble of techniques and algorithms that exploit _neural networks_ for the solution of problems such as Computer Vision or Natural Language Understanding. \n\n::: tip Virgilio's Mission\nMore specifically, Virgilio will provide you with guides to become experienced in the Machine Learning field, with a strong focus on Deep Learning techniques.\n:::\n\n![Figure 1-1](./sets.png) \n\nHierarchical Relationship: Artificial Intelligence (AI), Machine Learning (ML), Deep Learning (DL)\n\nA more engineering definition of **Machine Learning** is that given by Tom Mitchell:\n\"A machine is learning from experience E with respect to task T and a metric of P, if its performance on T, measured with P, improves with experience E.\"\n\n#### A practical example: \n\nThis theoretical definition may be difficult to distinguish in practice, but it becomes more evident with an example, such as the autonomous driving system of a new generation car.\n\nAn autonomous car, in fact, can be considered as a whole an **Artificial Intelligence** system: it collects data from the real world (road, cars, road signs, speed) through sensors, possesses a set of \"rules\" of behavior that constitutes its intelligence (\"if you are about to collide with an object, brake preventively\") and a set of actuators implementing relative decisions (brakes, steering, ABS).\n\nIn this example, the AI system of the car has a sub-module of **Machine Learning** that allows it to improve over time, as the car \"sees\" different roads and situations, and increases its performance compared to some metric (safety, reaction time to braking, consumption).\n\nAdditional sub-modules can use **Deep Learning** techniques such as neural networks, trained to recognize the route of the road, the shapes of cars, distinguish them from those of trees and pedestrians, and so on.\n\n\n## Differences from the algorithmic approach\n\n![Figure 1-2](./machine_learning.jpg) \n\n[Img source](https://github.com/mahmoudparsian/data-algorithms-book/tree/master/src/main/java/org/dataalgorithms/machinelearning)\n\nIn computer science, the classic approach to the problem consists in designing a process (algorithm) that is then realized in a programming language (implementation), thus solving the problem **in a deterministic fashion**. \nIt is important to note that there is no need for input data examples to produce the output considered correct.\n\nThis determinism implies the possibility to understand which action is taken at each step and why. \n\nIt is important to note that there is no need for input data examples to produce the output considered correct.\n\nThe approach of Machine Learning, at an intuitive level, **consists instead in \"seeing\" a lot of input examples, each matched with the output considered correct, and programming the machine to detect the recurring patterns that occur in the data.** \n\nThese patterns will then be used by the machine as \"knowledge\", to try to return the correct output, if a new input is provided (never seen before). \n\nThe process of feeding with data is called **training** and its result is a model (a set of parameters properly \"adjusted\" so that they recognize the patterns that interest us for the given problem). \n\nOnce a model is obtained, it can be used to predict the correct output to inputs that it has never \"seen\". \n\n::: warning Generalization Capabilities\nFor a model, to be effective, it's crucial the ability to **generalize** to examples that it has never seen, otherwise it will work only after having being trained on all possible data!\n:::\n\nLet's see some practical examples of how Machine Learning is applied in the real world.\n\n**It is** an application of Machine Learning:\n\n- An \"intelligent\" spam email filter, which the more spam emails it processes, the more effective it becomes in recognizing and distinguishing them from useful emails.\n\n- A recognizer of hand-drawn figures or symbols, such as numbers, letters, or figures.\n\n- A system of customization of content suggested based on what you've already seen (Netflix that recommends the next movie to watch, Facebook that suggests groups that might interest you, Amazon that shows products often purchased together).\n\n- A sentiment analysis system capable of extracting important information from tweets or other data generated by humans about a particular event or character.\nFor example, you can do a sentimental analysis of the \"Donald Trump\" concept during elections, and understand how it is perceived by people who post tweets about it (negative, positive, neutral...).\n\n- A system of writing assistance that, as the text is composed, foresees the next words and suggests them. Examples of this system are extremely popular, such as the automatic completion of smartphones or the Facebook search bar.\n\n- A Computer Vision system that recognizes the model and brand of a car by \"seeing\" it with a sensor (typically a video camera).\n\nWe also see some counter-examples.\n\n**It is not** a Machine Learning application:\n\n- A search engine based on keywords: it does not improve with experience, and to make it more \"intelligent\" you have to program it explicitly. \n\n- A customer service interface that has pre-programmed responses to specific needs. For example, if I detect the word \"ORDER\" and an alphanumeric code in the customer's request message, then I show the status of the shipment identified by that code. \n\n- A sensor programmed to detect car number plates (e.g. the Safety Tutor system). Although it \"sees\" license plates and can, therefore, be confused with the concept of Computer Vision, it does not improve with experience, and its performance is determined solely by its programming at the design stage, where it is explicitly calibrated to detect a standard object (the license plate). \n\n- The famous mobile application Akinator, which tries to guess which historical or cinematic character the user is thinking about. Through a series of targeted questions (does he have hair? is he an alien? appears in Star Wars?) it explores a database of characters and by asking questions, by exclusion, it arrives at the answer. This, although it may seem like an \"intelligent\" program, is not really: it doesn't learn by improving with experience without being programmed to do so and follows a deterministic process easily explained by a human being.\n\n\n## Why to use Machine Learning techniques\n\nImagine having to create a spam email filter with traditional programming techniques:\n\n1.    First, we would try to understand what the typical spam email looks like. We might notice that some words or phrases (for example \"For Yourself\", \"Occasion\", \"Free only for today!\") tend to appear often in annoying spam emails.\nMaybe we could notice further patterns in other parts of the mail, for example in the string representing the sender's mailbox, or that several emails are received from the same mailboxes in a few days.\n\n1.    We would write an algorithm to detect these patterns that we have noticed, for example using regular expressions to detect sequences of \"suspicious\" words and the algorithm would report as spam an email that contains a number of these patterns. \n\n2.    We would test the program and repeat steps 1 and 2 until we get a satisfactory version that signals malicious emails fairly accurately.\n\nIt's easy to see the program would very soon become a vast set of complex \"hard-coded\" rules, chaotic and complicated to maintain, needed to be added manually as new approaches to fool it will be used.\n\nInstead, a spam filter consisting of a Machine Learning model would automatically learn which sentences, words, and patterns are valid indicators of spam danger and could be updated every time an email is recognized as a new type of spam. The program is much shorter, easy to maintain, and accurate in recognition.\n\nIn summary, **Machine Learning techniques are appropriate for**:\n\n- Fluid environments, where the problem constantly changes and in an unpredictable way (a mountain road never \"seen\" before, an email containing words never encountered, an unknown pattern in the peaks of users on a website).\n\n- Complex problems where the traditional approach would be impracticable or would lead to \"Frankenstein\" of code with high maintenance cost. The Machine Learning approach can significantly simplify the code and achieve better performance.\n\n- Get information about complex problems and discover patterns through large amounts of data.\n\n## Conclusions\n\nNow you should be more comfortable with high-level ideas of the concepts of AI and ML, and every time you see a term you'll know how to contextualize it. \n\nYou will also see how the terms are crippled and misused, and maybe you could recommend this guide to the next person to clarify his ideas!\n\nIn the next guide you will learn **what do you need** in order to start your Machine Learning journey!\n\n"
  },
  {
    "path": "content/paradiso/do-you-really-need-ml.md",
    "content": "---\ntitle: Do you really need Machine Learning?\nauthor: clone95\ndescription: Understand for which kind of problems it makes sense to use Machine Learning, and which ones can be solved more easily. The purpose of this guide is to warn you that there is not always a need for machine learning solutions. Don't mistake everything for a nail, just because you know how to use a hammer!\n---\n\n# Index\n\n- [Kill the Hype](#Kill-the-Hype)\n- [Evaluate Opportunities](#Opportunities)\n- [The Charming Salesman](#The-Charming-Salesman)\n- [No ML without data](#No-ML-without-data)\n- [No value without a cultural change](#No-value-without-a-cultural-change)\n- [Conclusions](#conclusions)\n\nLet's dive right in!\n \n## Kill the Hype\n\nAlthough AI and Machine Learning offers immense business and product opportunities, they are not always the recipe for all evils. Indeed, be wary of those who tell you that with these tools you can solve any kind of problem. In this guide, we try to break down the various factors that may suggest the non-feasibility of a Machine Learning project.\n\n[Hype](https://www.ryanhealy.com/what-is-hype/) is a clamor around a person or a fact, an insistent and powerful voice that projects it to the top of the headlines and in positive opinions. Often (not always) however, it's a straw fire, a passing fashion that falls as the facts belie expectations.\n\nThere's too much hype around ML and in particular [Deep Learning](https://medium.com/@hypergiant/is-neural-network-hype-killing-machine-learning-120041406f1).  \n\nDeep learning creates learning models by acquiring notions that are passed on to it by algorithms and that it organizes in a pyramidal way, managing to learn more complex concepts starting from the simplest ones.\n\nBut deep learning requires three elements to function, as we have seen in previous guides:\n\n- Data\n- Know-how\n- Computational power\n\nBe wary of anyone who proposes a Deep Learning project that lacks one of these three elements, and ask specific questions about each of them. \n\nYou can refer to the previous guide [What Do You Need for Machine Learning](./what-do-i-need-for-ml.md), for guidelines on how to compare responses and understand the feasibility of projects.\n\nOf course, to fully evaluate the feasibility of a project you need experience and knowledge of the domain, but you can rest assured that if one of the three elements is missing, it is likely that what is being proposed is a pure distillate of hype.\n\nSo we understand how justified hype is, in the sense that Deep Learning opens up incredible possibilities and without previous examples, but it is also a double-edged weapon, which can damage the very economy of technology because it does not meet the (too high) expectations.\n\n## Evaluate Opportunities\n\nThe previous premise does not take away the fact that if you have data, know-how, and computational power, it is _**likely**_ that Machine Learning and Deep Learning can offer you incredible possibilities. \n\nHow can you find out if the data you have hides hidden pearls? in general, you can think that having the right amount of data (for example, rows of a database), you can use Machine Learning methods to predict the value (continuous) or the class (discrete) associated with a row. \n\n**In other words, you can try to predict the value of a database column!**\n::: tip Example\nLet's imagine the following (simplified) situation.\n\nWe have an e-commerce database, which contains for each line the record of the purchase of a product. \nSome columns are: \"name\", \"color\", \"price\", \"price range\".\nThe column \"price range\" contains a label that identifies if an item has a low price or high, and is provided by the company that produces the product (we have not assigned it).\n \nSometimes, however, the company that supplies the products is careless and forgets to assign a price range to the object. \n:::\n\n**How can we solve this problem?**\n\nThe problem consists of a binary classification task that takes as input the price of the object (some features, such as color, do not affect the price in this case) and returns output the label of the price range (\"high\" or \"low\").\n\n\n- We can try to apply a Deep Learning technique\n- We can try to apply a more general Machine Learning technique\n- We can use a deterministic program (traditional programming approach) that's been created specifically for that.\n\nLet's analyze the various possibilities:\n\nFirst of all, it must be said that the simplest solution would perhaps be to change supplier :-)\n\nJokes aside, let's start from the case of application of Deep Learning, then a \"traditional\" Machine Learning linear model, and then the heuristic.\n\nYou _could think_ of developing a neural network that takes in input all the features and returns the value of the price range as output.\n\n**But it would probably be an overkill!**\n\nIn fact, as we know, the data must be **cleaned**, **prepared** to be inserted into the network, the network must be **trained** and **adjusted** until it reaches satisfactory evaluation metrics! \n\nIn addition, if tomorrow the requirements of the forecast change (for example because you add a new label) all this process would be to be done again, and a new network would be to be trained.\n\n::: tip Tip\nDeep learning is an extremely powerful tool, and for this reason, you should avoid using it for tasks that are too simple (overengineering is never good).\n:::\n\nThis problem can be solved much more simply with a simple Machine Learning generic linear model that maps the input to the output without the need to introduce \"non-linearity\" (the main advantage of neural networks).\n\nA _linear classifier_ (classical Machine Learning model) can easily solve the problem, and would probably get even better performance (for reasons that are beyond the scope of this guide, such as lower variance).\n\nIndeed, this problem is so simple that the use of heuristic rules such as \"if... then...\" could solve it. In fact, we could notice that simply all the objects are a certain N value are classified as \"cheap\" and those above that N as \"very expensive\". \n\nThis simple rule (or _heuristic_), expressed with two lines of code in any programming language, solves the problem in the same way. \n\n::: warning So, What?\nThis reasoning exercise does not want to \"put Deep Learning and Machine Learning in a bad light\" at all, on the contrary! \n\nBut it must be used to understand that they are not always the simplest solution, and sometimes they can be a useless effort (especially in the absence of data, they are worth little).\n:::\n\n[This](https://medium.com/datadriveninvestor/when-not-to-use-neural-networks-89fb50622429) article has good considerations about this.\n\nSo always ask yourself the following question: is my problem quite complex AND do I have enough data to make useful machine learning techniques or even deep learning?\n\n## The Charming Salesman\nInformation technology like any other industry is first and foremost a business.\n\nThe techniques and tools of ML and DL are no exception, and their primary task is to solve business problems. That's why they suffer from the same problems as traditional software in the agreement phase between the software developer and the user, and maybe even worse (the hype plays bad tricks)!\n\nHave you ever had someone tell you how they developed a **powerful** and **complicated** application, and all at a **low price**?\n\n**Well, would you believe them? If someone told you they could take you to the moon for 1000 euros, would you believe them?**\n\nLikewise, be on your guard against those who promise you advanced recommendation engines like Netflix, or conversational agents that replace psychologists!\n\nIn particular, we can't stress more on this, make sure that _the data exist_, are _easily available_, are _transformable to represent the problem you want to solve!_ \n\nMost problems in the ML world occur due to [**unfulfilled expectations**](https://www.nature.com/articles/d41586-018-07504-9).\n\nOther reasons for the failure of ML projects can be found [here](https://www.kdnuggets.com/2018/07/why-machine-learning-project-fail.html), reading is strongly recommended.\n\nAgain, these tips don't want to keep you away from the ML, on the contrary! \n\nBut what **Virgilio proposes is also to honestly communicate what you can do and what you can't**, and give you all the tools to be able to move around this world in a conscious way! \n\n## No ML without data\nSuppose you're within an organization, or you have a problem of your own that you want to solve, and you understand what opportunities the ML offers. We've seen that the key elements you need are data, computing power, and know-how.\n\nIf you cannot get the data you need for technical, confidentiality, or relational reasons, forget about the ML. In fact, without the data, you can do nothing, just as you can't grow a plant without a seed.\n\nSo generally the success of an ML project must be sponsored \"from the top\", by those who have access to the data, by those who can retrieve it and make it available.  \n\nTo be clear, you don't need unthinkable amounts of data (even if numbers help), [but the less data you have, the more difficult it is to generate value](https://medium.com/swlh/can-your-business-use-machine-learning-without-data-340c59bf9fb0) through ML projects.\n\nIf your boss asks you for a predictive model but doesn't give you the data or access permissions to it, he probably hasn't understood anything about how Machine Learning works, and it's better to try explaining it to him, maybe taking him for a walk here in Paradise :-)\n\n## No value without a cultural change\n\nAt the end of the day, what interests those who put the money in, is the value generated by a project.\n\nIt is therefore clear that without a change of **cultural approach to the issue of data**, it is impossible to create value through Machine Learning projects, and thus meet the needs of those who want the problem to be solved.\n\n- If a chatbot is developed within a company, and it is not used, **it's useless**. \n\n- If recommendation systems are put in place, but then there is no care for the production and care of high-quality data, **it's useless**.\n\n\nThe cultural change is the main \"soft\" requirement of the success of a Machine Learning project, and often also the most underestimated. \n\nRead also:\n- [Building a Data-Driven business](https://www.intel.it/content/www/it/it/big-data/building-a-data-driven-business.html)\n\n## Conclusions\n\nThe purpose of this guide is to provide awareness about the real business possibilities of Machine Learning.\n\nWe have seen the risks and possible pitfalls of machine learning projects based on hype and not on solid foundations such as large amounts of data and realistic assessment of the difficulty of solving a problem.\n\nWe have also seen how without a radical change of mentality and approach, even the most successful ML project is useless: **imagine owning a Ferrari but not knowing how to drive!**\n\nIn the next guide we will see what are **the most common Machine Learning / Deep Learning use cases!**\n\n\n\n\n\n"
  },
  {
    "path": "content/paradiso/introduction-to-ml.md",
    "content": "---\ntitle: Introduction to Machine Learning\nauthor: clone95\ndescription: This guide aims to introduce you to how an ML system can present itself and what are the main challenges today related to the development of applications in the real world.\n---\n\n\n# Index\n- [Index](#index)\n- [Types of ML systems](#types-of-ml-systems)\n- [Supervised Learning](#supervised-learning)\n- [Unsupervised Learning](#unsupervised-learning)\n- [Reinforcement learning](#reinforcement-learning)\n- [Learning modes](#learning-modes)\n- [Type of inference](#type-of-inference)\n- [Main challenges of Machine Learning](#main-challenges-of-machine-learning)\n   - [Insufficient amount of data](#insufficient-amount-of-data)\n   - [Low quality and unrepresentative data](#low-quality-and-unrepresentative-data)\n   - [Underfitting](#underfitting)\n   - [Overfitting](#overfitting)\n   - [Underfitting and overfitting tradeoff](#underfitting-and-overfitting-tradeoff)\n- [Conclusions](#conclusions)\n\n\n## Types of ML systems\n\nThere are three main categories of ML systems:\n\n- Modalities of supervision (supervised, unsupervised, reinforcement learning)\n\n- Learning modes (online learning, batch learning)\n\n- Type of inference (instance-based, model-based)\n\nThese criteria are not mutually exclusive and can be combined according to the needs of the scenario: a self-driving machine could take advantage of an ML system of supervised learning, which learns through batch learning and which \"thinks\" thanks to a statistical model that allows it to make short-term predictions (\"the machine in front is braking, I will soon have to activate the brakes\").\n\n## Supervised Learning\n\nThe most common learning mode is **supervised learning**. It consists of training the system through data containing the desired solution: these solutions are called \"labels\".\n\nAn example of a \"labeled\" data could be the image of a car (the actual data) with the assigned car model (the label).\nOnce an ML system has been trained on the data and their labels, the system can input a new image and output its (supposed) label! The metrics to measure the system's \"skill\" in assigning the right label are various and will be examined in more detail in different guides.\n\nThe two most common tasks that can be tackled with supervised learning are classification and regression. A **classification** problem consists of assigning a discrete label to new input. It can be a numerical value or a category (e.g. given a picture to say if it represents a dog or a cat), but in any case, it is contained in a well-defined set of options.\n\n![Figure 1-1](./classification.png)\n\nA problem of **regression** instead consists of assigning a continuous value to the new data, for example, the price of a house given a set of values (the number of rooms for example) so the output will be included in a continuous interval and not a finite set.\n\n![Figure 1-1](./regression.png)\n\nSupervised learning implies a significant labeled dataset should be provided to allow the model to learn from it effectually.\n\nThe classic example is a model that is trained on a dataset of thousands of images of dogs and cats and learns to classify the new photos that are offered in one of these two categories. \nClassification models can learn to distinguish any number of classes, as long as they have a representative dataset!  \n\nUsually, the classification models foresee a continuous value as the probability of an input example belonging to each output class. Probabilities can be interpreted as the model's confidence that a specific example belongs to each class. A predicted probability can be converted into a class value by selecting the label of the class with the highest probability.\n\n## Unsupervised Learning\n\nBut what if we don't have labeled data or our goal is to find something we don't know about it?\n\nThis is where **unsupervised learning** comes into play because the input is composed of \"raw\" data, without the use of labels.\n\nFor example, let's imagine that we have a supermarket sales dataset containing all the purchases made by customers, cart by cart. You can extract business advice by grouping the items often purchased together and choose to put them on nearby shelves or to discount one if you buy the others.\n\nUnsupervised learning is also used as a complement to supervised learning to explore data (even if already labeled) and find other types of grouping that had not been noticed (and thus increase the amount of knowledge we have on each instance of the dataset).\n\nAnother use of this type of learning is for **dimensionality reduction**, having the purpose of reducing the number of features to consider maintaining the \"value\" of the data, something handy when the dataset is vast and sparse.\n\n## Reinforcement learning\n\n**Reinforcement learning** is something totally different. The learning system in this context is called **agent** and learns to solve the problem by observing the world around it (through some kind of sensor), performing actions, and evaluating them (good action / bad action) based on some kind of reward (reward).\n\nThe agent is designed so that it tries to improve itself, adjusting its parameters of action in action and aiming to obtain a greater and greater reward.\n\nReinforcement learning is used massively in robotics, where for example a robot learns to move in the surrounding environment by learning incrementally from its mistakes (the reward decreases by slamming against a wall, instead it increases while the robot moves without collisions, encouraging it to avoid objects).\n\n#### Learning modes:\n\nAnother important feature of ML systems is that they can learn either in a one-off (batch learning) mode or in a continuous incremental (online learning) mode.\n\nIn the case of batch learning (also called offline learning), the system is trained using all available data: it is usually a long and computationally expensive process, so it is performed only occasionally. When you want to re-train the model you have to do it again on all the data, so it's best to do it only if I have a considerable amount of new data, which can actually improve the performance of the new model (which will be trained on new and old ones).\n\n\nFortunately, this method of training can be easily automated so you can decide to train the model, for example, every night or every week. \n\nHowever, if you need a faster system to react to changes (for example for the detection of commercial fraud or symptoms of cyber attack) the best solution is online learning.\nIn this case (also called live learning) the system is trained sequentially by taking small batches of data, called mini-batches, as input. Learning from new data is cheap (in computational terms) and fast as the system learns from on-the-fly data as it is collected.\n\nOnline learning is optimal in cases where you need a reactive system response or you have little computational power. Note that the term \"online\" does not mean that the system must be connected to a geographical network, but simply be fed with a continuous flow of data.\n\n#### Type of inference:\n\nOne last way to categorize the ML systems is by how to be generalized.\nModel-based systems aim to create a representation of knowledge (a model), which is then used to generate outputs. Instance-based systems do not generalize from an unseen input, but compare it with all previous data (saved in memory) and find its \"ideal arrangement\" among them, i.e. they try to place the data at the correct point. An example can be very useful to understand this difference.\n\n**Scenario:**\n\ngiven a series of coordinates (datum: X, Y) that constitutes our \"knowledge\" try to, given the X of a new point, understand which Y is the most appropriate.\nA strategy could be to compare the value of X of the point with that of the known points, take the nearest known point in terms of distance, and assign its Y to the new point.\n\n![Figure 1-1](./instance.png)\n\nHowever, this approach is very simplistic and is based on the strong assumption that the position of a new point is determined univocally by its closest neighbor.\n\nThe system learns its knowledge \"by heart\" and applies it blindly to new cases, applying some measure of similarity (in this case, the distance relative to the dimension X) concerning those stored.\n\nThe other approach that can be used to generalize new cases starting from the old ones, could be to create a \"representation\" or \"idea\" of how the data I have been made (the grey dots in figure) and use this \"idea\" (the model) to produce the Y of the new points.\nA model is, therefore, a set of parameters that, when properly adjusted, can provide a reasonable estimate of Y, given the X of a new point. \n\nIn our case, we imagine that our model is the straight line that best approximates the series of gray points. Our parameters are the slope and the intercept of the line, and the training process of the model consists in understanding what the numerical values of these two parameters are.\n\n![Figure 1-1](./model.png)\n\nA Machine Learning model, here in its simplest version (two parameters), sometimes consists of tens of thousands or even millions of parameters. To train them, and therefore find the \"good values\" of the parameters, a lot of computing power is needed and the optimization of the process of training the models is a heartfelt and urgent topic of research.\n\n## Main challenges of Machine Learning\n\n### Insufficient amount of data\n\nThe key assumption of Machine Learning is that you have the data you need to train models and use them later to solve problems.\nIt may happen that in the real world the data you have is not enough to train a model to accurately recognize patterns that might be interesting for the problem.\n\nEven for simple problems, thousands of examples are needed, and for complex problems such as image recognition or voice recognition, millions of examples may be needed.\n\nVarious organizations are moving to create open data platforms to share datasets and allow the development of otherwise unattainable applications. \n\nThe issue of labeling (labeling data for supervised learning) is crucial today. Services such as CloudFactory or AWS Mechanical Turk seek to address this need by connecting organizations in need of workforce to label data, and the workforce itself. Services of this type have certain limitations, such as the accuracy of the labeling and the time needed to perform it.\n\n### Low quality and unrepresentative data\n\nAnother very common problem with data on which to train models is their poor quality. Missing, poorly formatted, or even incorrect data can be fatal to a Machine Learning project. Ideally, high-quality data should be produced directly, but projects are often started on existing (and low quality) data.\n\nFor this reason, one of the most important (and time-consuming!) steps in developing an ML application is data pre-processing. \n\nPre-processing the data consists of cleaning it up and preparing it for the Machine Learning model that we will have to train: we remove the individual damaged examples, we adjust the format of the strings and we manage the missing fields (missing values). The pre-processing phase is context-dependent and can take very different forms.\n\nIn this phase we usually try to increase the size of the dataset we are using: for example, if we have a dataset of images, we can think of adding a copy of each image to the dataset, but in a version rotated by 90°, or blurred by some kind of noise. \n\nThis technique, called **data augmentation**, is particularly useful to increase the robustness of our application (because the model is trained to see also damaged/distorted images and recognize them anyway), but generally does not add \"new information\", which can only be achieved with additional data.\n\nOften you can also run into unrepresentative data: a model, to generalize effectively, must have seen a variety of cases (data) that covers most situations, and that represents reality in a realistic way. \n\nFor example, let's consider a dataset of temperatures collected in the various days of the year with the task to predict the temperature of a given day. If we only have the November temperatures, how does the model discover the April temperature pattern? Even worse, if that particular November was particularly hot and therefore not representative, we risk getting a model that makes misleading predictions! \n\nThink about the suggestive fact that a random model (for example the generation of a random number within the range [temp. MIN - temp. MAX]) can easily obtain better performance than a model trained on unrepresentative data!\n\n### Underfitting\n\nThe problem of underfitting occurs when the model we have chosen is too simple (a few parameters) to effectively represent a generalization of the dataset, and therefore fail to capture the patterns that occur in the data. \n\nFor example, if we wanted to use a linear model to classify images of dogs and cats, we would probably get unacceptable performances, because the linear model cannot capture the complexity of the data on which we train it.\n\nUsually, a solution to underfitting consists of trying to train more complex models (for example a neural network, which can have even millions of parameters), which can \"take into account\" all the variables that could have an impact on the choice of the output. For example, in a 64 x 64 pixels image, 4096 possible points can influence the result! A model with few parameters can hardly handle this complexity.\n\n\n### Overfitting\n\nThe concept of overfitting occurs in the opposite case to what has just been explained, i.e. when a model is \"too complex\" for the assigned task.\n\nFor example, to use a complex higher degree curve resulting from a trained model to predict the price of houses would be ineffective because the network would learn so well to represent the dataset that the resulting model would be mere storage of data! A model that suffers from overfitting is not able to generalize well because it can not \"detach\" from the only representation of the world it knows, or the dataset on which it was trained.\n\n### Underfitting and overfitting tradeoff\n\nThe tradeoff between the complexity of the model (number of parameters that can be modified), the amount of data available, and the difficulty of the task are some of the key concepts behind the choice of the model architecture.\nBelow is a figure that represents three different situations where a model must classify if a point, given in input its two-dimensional coordinates, is red or blue:\n\n![Figure 1-1](./overfitting.png)\n\n- Underfitting, the model is too simple (for example, a linear model) and fails to grasp the complexity of the dataset\n- Fitting appropriate, the model grasps the general \"idea\" of how the data is distracted, which does not try to change too much to represent each point\n- Overfitting, the model modifies itself heavily to represent every point, but consequently \"memorizes\" the data of training, struggling, therefore, to generalize later.\n\nAnother important aspect to consider is the \"price\" of errors in prediction: classify as spam a regular email is very different from wrongly detecting cancer in an image, so the model performance, deriving from this tradeoff, is a key factor.      \n\n## Conclusions\nHopefully, now you should be more comfortable with high-level ideas of how ML systems are classified and you should have a clear idea of what the classification and regression tasks are.\n\nNow you're ready to start your real Data Science Journey in the Purgatorio! \n\n"
  },
  {
    "path": "content/paradiso/use-cases.md",
    "content": "---\ntitle: Machine Learning use cases\nauthor: clone95\ndescription: The purpose of this guide is to give a high-level overview of the different cases of application of ML techniques (and in particular Deep Learning) in the various industries and fields.\n---\n\n\n# Index\n - [The big picture](#The-big-picture)\n - [From research to industry](#From-research-to-industry)\n - [Use cases examples](#Use-cases-examples)\n - [Sinergy with other technological trends](#Sinergy-with-other-technological-trends)\n - [Conclusions](#Conclusions)\n\nLet's dive right in!\n \n## The big picture\nMachine Learning systems, and in particular the Deep Learning ones, have made huge evolutionary steps and have improved a lot in the last five years, especially for a large amount of data available but especially for the availability of high-performance infrastructure (CPU and GPU in particular).\n\n\nIn the field of Artificial Intelligence research, automatic learning has been very successful in recent years, allowing computers to overcome or approach the corresponding human performance in areas ranging from facial recognition to speech and language recognition. Deep learning, on the other hand, allows computers to take a step forward, in particular, to solve a series of complex problems.\n\nMost of the [Google services](https://blog.aimultiple.com/ai-is-already-at-the-heart-of-google/) running on your device are powered by some Machine Learning system!\n\nLet's have a look at 3 simple cases:\n\n**First case**: speech-to-text processing of a phone call.\n\nIn this case, what I want to do is to translate an audio call into text. In the past, this was attempted using preset programs, but only the use of AI has allowed for optimal results.\n\nThe service is normally offered by the big players (Google, Microsoft, Amazon, etc.) who have trained the model with millions of sentences; they make it available through API, which is through service. In this case, the company interfaces by providing the audio file and the service responds in real-time with a text.\n\n\nIn this case, the company buys the service it uses.\n\nOnce you have obtained the text on it you can perform several operations: a semantic or lexical analysis, a translation possibly followed by a speech-to-text in order to hear the phone call in another language; these are evolutions that for now, we do not go into.\n\n**Second case**: recognition of an object in a photo or video.\n\nIt is only an evolution of the previous service; this time we provide the purchased service with an image, or a video, receiving in response an on/off when an object is recognized or classification of the object itself; it depends on the compatibility between the trained model and the request that is made.\n\n**Third case**: optimization of inbound calls of a call center\n\nIn the previous cases, the trained model belonged to the external supplier; this does not prohibit, however, that the model is instead built internally. More resources would be needed, both in terms of conversations/images available and in terms of specific knowledge.\n\nIn this third case, instead, we hypothesize the internal construction of a Machine Learning model; the case is much more interesting because it allows the company to maintain the data and the entire process of building the ML model internally.\n\nWe must assume that the company in question has at its disposal the history of all the calls received, divided into the individual steps made by the operator; with them, we must be able to build a chain of events that have led to a final solution.\n\n\nHaving a large number of these chains at our disposal, we **train a model** according to Machine Learning algorithms; it is necessary to have specific competence at this point to understand which is the most suitable algorithm and the calibration of the parameters necessary to obtain the best result. It is often at this point that the best intentions collapse; it is not enough to feed the data to any model, it is necessary to identify and calibrate the right model.\n\nOnce the model has been trained, it is made available to the call center; once the call has been received and the first step has been taken, we will probably already have the next step available; after the second step, the probability of 'guessing' the next step will be even higher, and so on, optimizing the process.\n\nThis example can be applied to all cases where **there is a sequence of events**:\n- Actions of a user on the site to predict whether he will buy a product or not\n- Analysis of random movements to predict the next event\n- Fault/defect analysis to recognize the probability of failure from the current operation\n- Analysis of behavior to predict criminal phenomena (Minority report?)\n\nFrom these examples it can be understood that **AI is a way to process data**; there is no limit in the hypothesis of its use, if not in the ability of those who manage the data.\n\n\n## From research to industry\n\nThe range of possible Machine Learning applications in real businesses **is almost infinite**, starting from the themes of optimization of existing processes up to new revolutionize business models and customer interaction.\n\nHowever, even though papers are published day after day in this field, which discover incredible methods of applying these techniques, they are not always \"ready to use\", and even if it is easy to find the [code](https://paperswithcode.com/) of the paper, it is often not easy to implement them in real solutions, for lack of know-how, or even just awareness of the business.\n\nIt is difficult to keep up with both the state of the art of research and the actual use cases applied by others in the industry.\n\nSo, a very important issue is the close collaboration between research and industry, which becomes more and more important as research accelerates.\n\n[Here's](https://www.slideshare.net/StateofAIReport/state-of-ai-report-2019-151804430) a very good report about the state-of-the-art (SOTA) of Machine Learning and Deep Learning applications research (up-to-date 2019).\n\nLet's see explore now the use cases more in-depth. \n\n## Use cases examples\n\nAs we argued, it is essential to have a framework of things you can do nowadays with certain tools, and understand if it is convenient in terms of ROI for a company (\"you manager, I talk to you\").\n\nWe here at Virgilio are pleased to tell you that we are in close collaboration with [Firm.ai](https://github.com/firmai), a spectacular OpenSource project that tries to solve the problem of providing an overview of all possible use cases, divided by industry.\n\n[**In this project**](https://github.com/firmai/industry-machine-learning), you can find a wide variety of applied use cases, with code! What an incredible resource!\n\nLeave a star to the Firm.ai project and follow it, it's a work in progress that will be continuously updated.\n\nDon't you find what you're looking for in the previous link? Try [here](https://appliedai.com/). You can enter the business you are looking for, and also see which companies provide services that might be useful to you!\n\nAs you can see, the space of possibilities is really wide. However, thinking about the possible application of Machine Learning, it would be foolish not to take into account the synergies that they have with other technological trends that are rapidly emerging, and that will certainly revolutionize the industry as we know it. \n\n**Any kind of industry!**\n\n::: tip Bonus Link\nCheck the [Deep Learning Index](https://deepindex.org/) for more than 800 examples of applied AI!\n:::\n\n\n## Sinergy with other technological trends\n\n- There are strong synergies between AI and the **Internet of Things** (IoT). Combine AI with an IoT network (e.g.,\nsensors installed in the soil owned by an agricultural enterprise, or wearable worn\nfrom patients, able to collect and send data to the treating physician) means in many cases\ncases multiply the potential of AI exponentially. The size and complexity\nof the information generated by this new network of objects is such that only one\nadvanced AI system will be able to manage it efficiently. This advanced system will be able to\ntake various configurations, both centralized (as in the case of supercomputers\naccessible via the cloud) or distributed (so-called on-device AI, supported by the modern\nedge computing technologies).\n\n- AI and **5G connectivity** form a disruptive combination. The 5G, that is the network of fifth-generation will officially arrive from 2020 and will allow connecting the\n\nmillions of devices worldwide at high speed and with low latency, opening up\nthe doors to the creation of new application scenarios, hitherto not feasible, on\na single global nervous system in different industrial sectors. 5G networks will be able to\nbe managed through different techniques of machine learning, which translate into\nself-diagnosis, self-configuration, self-optimization, self-repair, self-protection2\n. AI and 5G put the network at the service of the user thanks to the edge\ncomputing and its intrinsic characteristics of the hyper-distributed and hyper-connected computational model.\n\n- With the spread of **distributed ledger technologies** (of which the Blockchain is a case of the\nspecific) and in particular of smart contracts, the role of Artificial Intelligence\nwill become even more relevant. The decentralized nature of these technologies and the\npossibility of validating the data collected by them allows improving\nThe accuracy of AI systems, as well as to distribute the computing power over multiple nodes,\npotentially reducing the costs and therefore the accessibility of the technology. \n\n- The enabling factor of the AI par excellence is **Cloud Computing**: it is a\ntechnology that allows you to take advantage, via remote service, of hardware resources and\nsoftware services - such as mass storage for data storage or power of\nAccessory calculation - the use of which is offered as a service by a provider. Solutions\nAI can be maintained on local data centers - even individual servers: this phenomenon is opening the door to hybrid scenarios that allow the use of this\ntechnology even under poor connectivity conditions or other restrictions.\n\nBeing able to combine the understanding of different but interconnected trends is essential to have an overview of the next (already started) industrial revolution. \n\n## Conclusions\n\nIn this guide, we have seen what are the possible cases of use of Machine Learning nowadays, and we have proposed various sources of information through which we will remain updated on new applications. \n\nWe would also like to remind you that if you are aware of any use cases not included in these lists, the authors will be more than happy to receive a suggestion and add it.\n\nIn the next guide we'll start see how Virgilio sees teaching and learning, and he will help you develop solid skills during you Data Science journey!\n\n"
  },
  {
    "path": "content/paradiso/virgilio-teaching-strategy.md",
    "content": "---\ntitle: Virgilio's Teaching Strategy\nauthor: clone95\ndescription: Give learning advices, best practice in using online resources, and time management tips. The guide is built using these relevant materials as well as the personal experiences of the author, who has spent a good amount of time documenting and testing techniques and approaches, both on himself and as a teacher.\n---\n\n# Index\n- [Goals of this guide](#Goals-of-this-guide)\n- [The Art of War](#The-Art-of-War)\n- [The Art of Learning](#The-Art-of-Learning)\n- [Mastering Internet](#Mastering-Google)\n- [Time Management](#Time-Management)\n- [Conclusions](#Conclusions)\n\n## Goals of this guide\n\nThis guide serves various purposes: \n\n- To understand broadly how the learning of the human brain works (before teaching machines, we will have to learn ourselves, right?).\n- Presenting _how_ Virgilio sees teaching and learning.\n- Give useful tips to make the most of the help Virgilio can give you in starting to explore this fantastic world and develop solid skills in the world of data through practical projects.\n\n## The Art of War\n\nThis guide is aimed at anyone who wants to enter the world of innovative fields such as those covered by Virgilio but **it can serve as a general approach to learning any subject, skill, or job**.\n\nFor this guide, we will use various enlightening books (famous and not), from which we will draw various lessons about how human beings learn, create, reason, and memorize.\n\nFor each resource, summaries or \"key points\" will be provided, but Virgilio will never stress enough the importance of reading the books that will be mentioned.\n\nThe first book we consider is [The Art of War](https://www.amazon.it/Art-War-Sun-tzu/dp/1936276011). \n\n[Here](https://sites.ualberta.ca/~enoch/Readings/The_Art_Of_War.pdf) you have a more consensual version, but Virgilio recommends buying the book with the attached analyses.\n\n[Here](http://blog.tutorming.com/expats/life-lessons-from-the-art-of-war) the main key points.\n\nThe book is condensed of the wisdom of various generals and heads of state of the ancient Chinese empire and is used in many training courses, especially in management and decision making.\n\nVirgilio firmly believes that its principles can apply to any human activity, particularly the planning of one's own self-improvement and learning. \n\nToday you don't learn a job that you will do all your life, but you will have to reinvent yourself and learn new skills continuously. [**Who stops is lost!**](https://www.mckinsey.com/featured-insights/future-of-work/ai-automation-and-the-future-of-work-ten-things-to-solve-for)\n\nThe two main points of instruction that Virgilio loves to emphasize are:\n- Know your enemy\n>“If you know the enemy and know yourself, you need not fear the result of a hundred battles. If you know yourself but not the enemy, for every victory gained you will also suffer a defeat. If you know neither the enemy nor yourself, you will succumb in every battle.”\n\nThis means that whenever you are faced with a problem, be it an enemy soldier, an engineering problem, or a human relationship, the best tactic is to know your enemy as much as possible. \n\nContinuing the analogy, knowing the enemy means knowing the number of his forces, how his army is composed, which are the most important departments.\n\nIn our case, it means knowing how much work awaits us, what is the perimeter of the things we want to learn, and what are the techniques most used in practice. \n\nIf you try to do everything, you do nothing! Which brings us to the next point:\n\n- Face one enemy at a time\n\nHow many tutorials have you seen of the type \"learn Data Science\" in 3 weeks, full of many topics and concepts, techniques, and frameworks? This approach is totally unsuccessful (as well as disrespectful for those who take years and years of study), the reason is trivial. \n\nWhat we at Virgilio prefer to do is to outline a path that enables you to **take one step at a time**, learn one concept and apply it, preferring _a solid skill_ (developed in the right time) rather than knowing a thousand acronyms or exotic techniques.\n\nThis principle is another way of formulating the classic [**Divide et Impera**](https://en.wikipedia.org/wiki/Divide_and_rule), a principle of software engineering whose purpose is to try to manage the growing complexity of programs, as well as generally advise to disassemble a problem into smaller pieces and address them separately. \n\nIn a later section, we will see how the principles of software engineering, dealing with complexity and logic, can be applied profitably to everyday life, rational thinking, and in general to the planning of our lives (professional and non-professional).\n\nWe'll help you to develop you \"The Art of Learning\".\n\n## The Art of Learning\n\nThe human brain is currently the most complex device we know of, far more complex and powerful than any result of today's engineering. In addition to this, it is also extremely efficient in terms of the resources required for operation, gives us the feeling of being \"living\" and protects us from the outside world in an ingenious way. What an incredible thing!\n\nTo exploit it to its full potential, however, is very difficult, firstly because [we know very little](https://www.reddit.com/r/MachineLearning/comments/9symfk/d_reverseengineering_a_massive_neural_network/) about its operation, and secondly because we are not taught to do so!\n\nThe good news is that countless scientists for decades have been looking for clues on how to learn best, and effective techniques have been developed that work more or less for everyone.\n\n[Here](https://examinedexistence.com/top-10-learning-techniques-ranking-from-best-to-worst/) is an overview of these techniques.\n\nThe bottom line is that each brain is different, according to [the experiences it has lived and how it has formed](https://learn.genetics.utah.edu/content/epigenetics/brain/).\n\nSo, understanding which learning strategies work best **for you** is something to discover, more like a trip, than something you can learn from a book or a course.\n\nThese extremely useful for not having to reinvent the wheel, and understand what options work, but then you have to experiment and fail to understand what is the most suitable technique in your case.\n\nBefore you even start learning, you have to learn \"how to learn\"! \n\nVirgil's suggestion is: spend time testing different learning strategies, each for at least a few topics, and evaluate the results! \n\nIf you don't want to and want to focus on the subjects you want to learn right away, we offer you a technique that suits more or less all situations and all brains.\n\nActually, it's nothing particularly innovative, but to be cool we'll call our _learning framework_ \"The Magic Circle\".\n\nThe Magic Circle is an **iterative** process that consists of 3 simple steps:\n\n- Theoretical understanding\n- Practical application\n- Check \n\n<!--![Figure 1-1](./magic_circle.png) -->\n\nThe trick is simple. \n\n**By addressing one topic at a time**, you first aim for a theoretical understanding, then you put it into practice, and finally you evaluate yourself. If you feel confident you can proceed, otherwise you will iterate another round of the circle. \n\nSome advice: \n- The first time you address the topic X, first of all, make sure you have **framed** X. In Sun Tzu this means knowing how your enemy's army is made up. You don't need to know in detail which men make up its ranks, but you need to have an overview of how many forces it has and how they are divided. In our case, it means knowing **why** you are learning this, **what prerequisites** it has, and **where it fits** in with the neighboring topics. \nEvery Virgilio guide provides this kind of information, but it is important to spend time looking for it and understanding alternative points of view. \n\n- Each different iteration of the Magic Circle tries to change the resources you use to support learning. Virgilio's guides often provide more resources for the same topic, just to get more visions of the same concept.\n\n- The point just mentioned is fundamental. Knowledge is multifaceted, and there are many different ways of seeing or understanding almost everything. An incredible trick to fully know a topic or concept is to see it under as many different points of view as possible, see alternative interpretations or alternative methods of visualization. \nIt is very important to confront also those who claim that a certain concept is useless, harmful, or outdated! For example, if you are learning what a neural network is, it's also very useful to look for information like \"when not to use a neural network\".\n\n- For each topic, Google searches for visualizations of concepts, GIFs, videos, in short, any form of explanation that goes beyond words and code examples.\n\n- To make sure that you understand, in the Check phase, the most effective technique is generally to try to explain the concept. If you can, perhaps getting feedback from someone, you probably learned it. The teaching process works for a simple reason: to explain X, your brain must take X as an input, process it, make it its own, and then output it easily. The only way for this process to be successful is for your brain to be comfortable with X.\n\n- Don't persist too much on a subject, it's natural that after a while you lose interest and motivation (especially if they are difficult or advanced concepts). Relax with some simple new concepts, and maybe come back to this in a few days or weeks. The connections of our brain, in fact, take time to form and strengthen, do not stress it too much! :)\n\n**These are some of the best practices that are dictated partly by common sense, partly by what international research says and partly by the personal experiences of the author of this guide.**\n\nLet's now see how to use the tools you have at your disposal (in addition to your partner Virgil), to enhance your learning and make it unlimited.\n\n## Mastering Internet\n\nEvery time you think about the fact that you have Google in my pocket, you should think that it's an incredible historical moment to live: we have the most powerful tool man has ever created and for free!\n\nFor a couple of decades now, the Internet has allowed people, wherever they are, to learn any concept or work, to create value for themselves and for others, and countless other possibilities!\n\nDespite this, it is clear that its use is often superficial by most people, sometimes even zero! \n\nEvery time you see a Facebook post like \"how do I start studying machine learning?\" or more generally \"how do I do this?\" it means that there is a [big problem](https://www.businessinsider.com/millennials-dont-know-how-to-use-google-2015-5?IR=T).\n\nThis section of the guide aims to introduce you to the most advanced features of Google, giving you tips on how to best explore the knowledge tree it contains. \n\nIt also contains some tips on how to use Reddit.\n\n### Google\n\nGoogle can almost always answer your questions, whatever they are. Don't be ashamed to ask for articulated things, don't judge yourself! :-) \n\nIn particular, Google search works by keywords, so often to search for something it is effective to try to describe it inaccurately using meaningful keywords, and often Google does the rest! \n\nThe more keywords you add, the more information Google has to find what you need, but it also narrows the search field, uses it wisely! \n\n[Here](https://blog.hubspot.com/marketing/google-advanced-search-tips) you find a guide on how to make your Google searches more effective, but like everything, try it and get it wrong, only then will you learn to know Google intimately and guess which keywords give you the results you need.\n\n### Reddit\n\nAnother thing that amazes me every day is how few people know how to use [Reddit](https://www.reddit.com/) effectively.  \n\nReddit is a content platform where more or less all the information in the world goes through, long before newspapers, TV, and social media!\n\nReddit is divided into folders, like a file system, and each folder contains a topic where users can post articles, questions, discussions. \n\nReddit is perhaps the biggest source of information because it is specialized and generally the user is an expert, within the various folders. For example, following [r/MachineLearning](https://www.reddit.com/r/MachineLearning/) or [r/LearningMachineLearning](https://www.reddit.com/r/learnmachinelearning/), makes you able to learn dozens of new things every day, see new papers, tools or projects in preview, often being able to speak directly with the author!\n\nDo you have a question, about any concept or topic? Look for a dedicated subreddit, sign up, and post a well-formulated question. You will see that in a couple of days several users have answered in detail!\n\nWhat an incredible tool is used as a \"crowd mentorship\"!\n\n## Time Management\n\nLearning is difficult, tiring, and requires commitment without always seeing the end of the path. \n\nOften one of the main obstacles in learning is poor time management. Not everyone has the opportunity to spend the whole day studying, and often when you want to learn a new skill you have to try to fit it between many professional and social commitments. \n\nThe best advice for this is the good old \"Divide et Impera\" once again. By dedicating even just one hour a day, or a couple of days a week to learning, with the time you can learn any skill. \n\nThe two enemies of your time are motivation and constancy.\n\nTo fight motivation, Virgilio recommends using the concept of [visualization](https://www.mindtosucceed.com/Self-Motivation-Techniques.html).\n\nMotivation is something very personal, which can go from the ambitions of pure knowledge to establishing oneself in a field to helping others through one's own knowledge. \n\nIn order to get to know each other better and to understand what your real goals are, Virgilio recommends you the application of the mental techniques suggested in [\"Focus\"](https://www.amazon.it/Focusing-Interrogare-corpo-cambiare-psiche/dp/883401359X/ref=sr_1_1=sr_1_1?adgrpid=58054156452&gclid=Cj0KCQjwyLDpBRCxARIsAEENsrKKCP5IZoBA6V5TOmr2X8Hivx-JvdX6ygZIt9YPjBt8EIOaJPVq6ZoaAqGnEALw_wcB&hvadid=255222382232&hvdev=c&hvlocphy=20550&hvnetw=g&hvpos=1t1&hvqmt=e&hvrand=1997028069562624827&hvtargid=kwd-301509732701&hydadcr=4935_1800296&keywords=focusing&qid=1563195460&s=gateway&sr=8-1).\n\nAs for constancy, its greatest enemy is [procrastination](https://www.youtube.com/watch?v=arj7oStGLkU&t=36s=arj7oStGLkU&t=36s).\n\nTo solve this second issue, Virgilio suggests you to use a conceptual framework.\n\nA good framework is the one proposed by the book [\"Getting things done\"](https://en.wikipedia.org/wiki/Getting_Things_Done) and the study [\"Implementation Intentions\"](https://pdfs.semanticscholar.org/4c21/6c0ceeef2e2745d113c77a417133c2084dd9.pdf). \n\n::: tip\nThese two readings are **strongly** recommended. \n\n**Virgilio strongly affirms that by themselves they can revolutionize the way you approach the realization of your goals (not only learning but also professional and life).**\n:::\n\n## Conclusions\n\nAfter reading the books and articles in this guide, you should be able to gradually improve and become extremely effective and quick to learn. \nBut remember that the road is always uphill (if you want it to be so and it is ambitious), and there will always be something new to learn ... better for us curious, right? :-)\n\nIn the next guide you fill find a gentle introduction to the core Machine Learning concepts and it's main limitations.\n"
  },
  {
    "path": "content/paradiso/what-do-i-need-for-ml.md",
    "content": "---\ntitle: What do I need to do Machine Learning?\nauthor: clone95\ndescription: In this guide, you will learn which elements do you need to get started with Machine Learning. These elements enable you to practice machine learning first-hand (small scale) or start machine learning projects to innovate an organization (big scale).\n---\n\n# Index\n- [The three elements](#The-three-elements)\n  - [Data](#Data)\n  - [Know-how](#Know-how)\n  - [Computational Power](#Computational-Power)\n- [Cloudy days](#Cloudy-days)\n- [If you still have to buy a machine](#If-you-still-have-to-buy-a-machine)\n- [Conclusions](#Conclusions)\n\n## The three elements\nToday, every area of science and economy has access to a **quantity of data** unimaginable even a decade ago.\n\nIn addition to this, today there is **abundant and inexpensive computing capacity** available through cloud service providers. \n\nIt is also important that international **research is excited about machine learning** topics, and therefore proceeds expeditiously in the development of increasingly effective techniques.\n\nParallel to this, the engineering world creates the ML toolbox by adjusting itself accordingly: **wonderful frameworks and high-level interfaces to apply ML techniques quickly**, going towards more user-friendly \"enablers\".\n\nKeras, a high-level framework that allows you to train a deep neural network in 15 lines of code, is a perfect example of this phenomenon.\nIn the same way, cloud providers offer you the possibility to host on their machines your ML models, with powerful logic that allows you to build a complete AI/ML start-up from your laptop. \n\nThe topics listed above have the following natural consequence:\n\nToday, more than ever (and an enormity compared to 5 years ago) it is _easy and affordable_ for everyone to start practicing ML in everyday problems, and it is an _obligation_ in the shoes of a company that wants to remain competitive in a market that runs at a crazy speed. \n\nLet's see which elements do you need to get started.\n\n### Data\nData comes from the Latin Datus, which means fact, _happened_. \nBuilding ML programs means exploiting something that has already **happened in the past** (the data) to discover recurring patterns that suggest **how to act in the future**.\n\nBuilding traditional programs is a tiring task. It requires that every single piece is built and then these are composed. It's not too different from building a house. Bricks are the modules that make it up and the house is the program in its entirety.\n\nWhen it comes to Machine Learning applications, however, the matter is different. \nAn ML program is something that we don't write ourselves, but rather something that we understand by observing and processing data. \n\nA good analogy can be the following:\n\nWhile building traditional software looks more similar to building a brick house, Machine Learning is _similar to food cultivation_. Cultivation leverages the earth to do most of the work. The farmer \"guides\" the land, supervises it, and then picks up the fruits. Likewise, thanks to Machine Learning, the programmer tries to make the data do the bulk of the work. Growers combine seeds with land to grow plants while engineers combine data with algorithms to grow programs.\n\nIt is therefore trivial to understand that if the data is to do the bulk of the work, the quality (and quantity) of the latter is strictly necessary for a model to make accurate predictions, or in general to extract knowledge effectively from them.\n::: tip Mountains of Data\nToday there is a large amount of data available to start practicing machine learning and discover its potential.\nLet's see how we can get the existing ones and how they can be useful in solving our problems.\n:::\n#### Free available data\nBe happy! A lot of data is free and easy to download!\nLet's see the main options:\n\n- [Kaggle](https://www.kaggle.com/) is the go-to platform for data in general: it's a Machine Learning challenges website and hosts an enormous quantity of datasets and analysis done by people on them. Subscribe now.\n- [UCI Datasets](https://archive.ics.uci.edu/ml/index.php) is a free and immediate platform for finding thousands of datasets and their metadata. \n- [U.S. Government open data](https://www.data.gov/)\n- [UK Governement open data](https://data.gov.uk/)\n- [EU open data](http://data.europa.eu/euodp/en/data/)\n- [A very long list from Forbes](https://www.forbes.com/sites/bernardmarr/2016/02/12/big-data-35-brilliant-and-free-data-sources-for-2016/)\n\n\n#### Collect and label your own data\nData collection is a huge and critical topic, which technical details go outside the scope of this guide. \nWe'll see in a dedicated Purgatorio's guide on how to collect huge quantities of data through scraping and other sources.\nTo first taste the awesome free tools that we can use, take a look at the ones from [Digital Methods](https://tools.digitalmethods.net)!\n\n\n#### Look under the bed\nMore and more organizations are realizing that they are sitting in a gold mine. Years and years of historical data, from machines, conversation logs, transactions, or sensor measurements are only waiting for you! They _probably_ hide a tremendous value to be unlocked, so why not take a look at that relational database!\n\nThe bottom line is: If you have a lot of data coming from a business process, probably they are worth their bytes in gold (uh, this analogy doesn't seem to fit well).\n\n#### Ask \"why?\" about Data\nIf we are aware of the [five-whys](https://en.wikipedia.org/wiki/5_Whys), it's one of the key techniques behind critical thinking. With so much data and with the end-results being data-dependent, it's so important to get the data part right. \n\nSo let's _know-our-data_ before performing any actions or tasks or transformations on it. Let us know everything we need to know about the source and nature of the data we will be learning about, processing, transforming, analyzing, and training. There is a whole section dedicated to this aspect and perspective about data on this [AI/ML/DL GitHub resource](https://github.com/neomatrix369/awesome-ai-ml-dl/blob/master/README-details.md#data).\n\nDo scavenge through the material, the notebooks, presentations, and videos under this section. Unfortunately, we focus much less on critical thinking, which is a highly-potent ingredient needed when working with mathematics and sciences. Another good example would be looking at this online course [**\"Calling Bullshit\"**](http://CallingBullshit.org).\n\n\n### Know-how\nDoing data science is not simple. It will **never be** if you want to fully understand the mathematical processes behind the elegant models offered by high-level interfaces such as Keras. Learn to hate those who say \"learn data science in 6 weeks\". \nIn one sense it's _totally false_, in the other it's _disrespectful_ to those who study these issues for years, learning new things every day. This does not mean that we should be discouraged, on the contrary! **Virgilio is here to help you in this fascinating process**. \n\n- If you are a student or a technician in general who wants to experience these innovative themes first hand, follow the path that has been prepared for you starting from Purgatorio, and with the right time and determination, you will get incredible results. \n\n- If you are just interested in knowing what know-how is needed (for example in order to form a team that can develop large data science projects in your company) here are some tips for you.\n\nLet's see what stages the process of developing a DS project consists of:\n\n![Figure 1-1](./ds-cycle.png) \n\nLet's have a look.\n\nOnce you have a good **Business Understanding** of the application that you want to develop to solve the problem, the data science cycle usually consists of experimenting with solutions in an _iterative way_ by collecting data, shaping the problem and developing ML models. \n\n**Data collection** consists of putting together data sources, building pipelines to pre-process them, and having a place to put them on hold for analysis. \n\n**Data Preparation** consists of feature engineering (i.e. combining existing data in a meaningful way), training models, and evaluating their performance.\n\n**Exploratory Data Analysis** is the phase where you explore and visualize your data, in order to catch important relationships and features that can help you in choosing the way you will develop a model.\n\n**Modelling** is the phase where you use your data to train a Machine Learning (or Deep Learning) model that will be able to predict on never-seen data.\n\n**Model Evaluation** consists of evaluating the performance of your model in the real-life scenario of the problem you want to solve.\n\n**Model Deployment** is the phase where you make available your trained model to consumers. \n\nAfter the deployment, you have to monitor the performances of your model and soon it may have to be modified as requirements change.\n\nBecause of this, the Data Science process is not **One-Shot**, but it's [highly iterative and incremental](https://towardsdatascience.com/applying-agile-methodology-to-data-science-projects-db50ebbef115).\n\n\n#### The Data Science Team\n\nAfter the deployment,  and soon it may have to be modified as requirements change.\n\nAs you can easily guess, the Data Science process involves **different figures** for its success, even if the web services provided by large technology companies allow anyone to start developing ML solutions without worrying about the integration or management of the underlying systems. \n\nThese figures have blurred boundaries in terms of skills and knowledge, and in general, the ideal would be for each individual to _be able to move with agility between the different tasks of the data science process_. If this is possible for small scale projects, it is true that the needs of a company often require the coordinated effort of several people to be successful. \n\nNames like \"data scientist\" or \"data engineer\" are described differently depending on the source. Here at Virgilio, we believe that the classification made by [KDNuggets](https://www.kdnuggets.com/) is the most comprehensive and clear.\n\nIn this awesome [blog post](https://www.kdnuggets.com/2019/03/building-effective-data-science-teams.html) you can find in detail the differences between these figures. \n\nIf you're just thinking about learning everything you need on your own, you're in the right place! Starting from Purgatorio our purpose is to educate a \"liquid\" figure who can move around among the different tasks and parts of the data science process. \n\nSooner or later you'll have to choose something to specialize in, maybe data visualization or model architecture, but before then the path we propose here at Virgilio is mixed between these \"predefined\" figures and contains all the interdisciplinary topics that a member of a data science team should at least be aware of.\n\nNow that you know what know-how you need for your ML projects, let's take a look at the requirements in terms of computational resources.  \n\n### Computational Power\n\nThe third and final element that you have is **computational power**.\nThe calculations that most of the time you find yourself doing when experimenting with Machine Learning are multiplications between matrices. \n\nThen, in the subset of ML techniques called Deep Learning, neural networks are particularly hungry for these calculations. \n\nIn the past decades, such calculations were made directly using the CPU of computers, but they proved insufficient to train the most complex networks.\n\nFortunately, we are helped by GPUs (graphical processor units), whose job is exactly to do matrix calculations! In fact, in the world of gaming and video computing in general, these kinds of calculations are what happens daily behind the scenes of video games and 3D graphics in general.\n\nIn particular, the main factor that indicates the use of GPUs in Machine Learning calculations is the amount of video memory (expressed in GigaBytes) that the card has.\n\nDamn it! We have to buy an extreme gaming PC with 4 GPUs!\n\n**Kidding, please don't do that.**\n\nThanks to the internet connection and cloud providers, nowadays it is much more _convenient_ to use machines prepared and maintained by companies like Amazon or Google, instead of investing money in physical hardware.\n\n\n## Cloudy Days\n[**Outsourcing is the main driver of the human society progress**](https://necsi.edu/complexity-rising-from-human-beings-to-human-civilization-a-complexity-profile). Imagine one of the first farmers in 20,000 B.C. \nHe is used to carrying out the entire production process on his own: he tames and cultivates the wheat, picks it up, and crushes it into small parts. He then uses it to create various products, such as flour, ready-made doughs, or a primitive form of bread.\n\nNowadays, however, an individual or an organization can only deal with one of the previous sub-processes, and specialize highly in that. For example, by choosing to specialize in the production of bread, they could learn how to produce many forms of bread, look for new ones, improve the flavor and optimize all these processes, forming specific and specialized know-how with respect to the production of bread. \n\nThis process, the progressive specialization of human activities, is the basis of the technical progress of our species. It is clearly based on **outsourcing!** If all the sub-processes preceding the production of bread were to disappear, the baker would be destined to close down. How does it grow wheat? How does it prevent insects from ruining it? How does it pay for, manage, and maintain the presses that crush it and make it flour?\n\n**In the same way, companies today outsource as much as possible all processes that are not essential to the company's know-how: in doing so, everyone can do \"what they do best\".**\n\nThe same trend is being seen today in the use of the software. It is more common than ever to use services provided through the network to solve sub-problems that companies do not want to worry about, such as the management of physical machines that host their applications, or they want to have their data from anywhere in the world in a safe and reliable way! \n\nIt is therefore not surprising that [**Cloud Computing**](https://en.wikipedia.org/wiki/Cloud_computing) is becoming a very important part of the software market, thanks to the flexibility and reduced costs that this entails. \n\nThe [**race towards the monopoly**](https://cloudwars.co/worlds-top-5-cloud-vendors-cloud-wars/) of the cloud market is fierce, particularly between Amazon (with AWS) and Microsoft (Azure). \n\n**How does this come in handy for Machine Learning?**\n\nWith a few clicks, you can deploy files and files of high-performance machines, managed in a transparent way, and especially with on-demand capabilities. \nThis fact drastically reduces the costs and complexity of developing complex software and solutions, all from a dedicated web interface or client.\nIt also allows you to serve solutions quickly, flexibly, and without the classic problems of large-scale computing that today's distributed systems require. Being able to scale from one device to millions simply by turning on hundreds of self-managed and paid-for machines, is an outstanding business and research enabler. \n\nRecently, all large tech companies have started to provide (and invest heavily) in providing services related to AI and ML issues. Emerging (and required) figures such as the data engineer or data scientist are able to achieve incredible levels of productivity and business through end-to-end platforms that cover the entire development cycle of AI and ML solutions. \nSome examples are [AWS Sagemaker](https://aws.amazon.com/it/sagemaker/) or [Azure Machine Learning Studio](https://azure.microsoft.com/it-it/services/machine-learning-studio/).\n\nTo start experimenting in a simple way there are even solutions such as [Google Colab](https://colab.research.google.com/), a free Google tool that allows you to use Jupyter notebooks on your machines, without having to worry about installing packages or managing memory. It's also totally free!\n\nWe have created [**a fantastic list**](https://github.com/virgili0/Virgilio/tree/dev/Topics/Deep%20learning%20in%20cloud) that compares all cloud solutions in terms of cost and performance.\n\nDon't believe who tells you that you need to buy a high-performance machine to make ML. He probably lives in 2010! \n\n## If you still have to buy a machine\nSuppose you still have to buy a calculator for other needs, let's see which are some good options:\n\n- [These Quora answers](https://www.quora.com/What-laptop-computer-should-I-purchase-for-deep-learning-How-much-will-it-cost) are straightforward (you can notice that they suggest leveraging the cloud-first approach).\n- [This](https://towardsdatascience.com/build-a-deep-learning-rig-for-800-4434e21a424f) Medium article shows you how to build an 800 dollars rig for Machine Learning.\n\nAs we have seen the important component for ML calculations is the GPU, in particular the amount of video memory that owns.\nWARNING: You definitely want to have a GPU compatible with [Cuda](https://blogs.nvidia.com/blog/2012/09/10/what-is-cuda-2/), the parallelization platform of Nvidia, the largest GPU manufacturer.\n\n[This article](https://blog.slavv.com/picking-a-gpu-for-deep-learning-3d4795c273b9) explains how to choose a GPU that supports Cuda.\n\n## Conclusions \n\nWe have seen how the three elements (data, know-how, and computing power) are strictly necessary to develop ML solutions for everyday problems. \n\nIf you are a student or just a curious cat you will have an easy time thanks to Google Colab and the free power it offers. If you're part of a team in a company thinking about starting to experiment with ML at scale, consider the ever richer and better ML services offered by the big technology cloud vendors.\n\nIn the next guide, we'll ask ourselves: **do we really need Machine Learning?**\n\n\n"
  },
  {
    "path": "content/purgatorio/collect-and-prepare-data/data-collection-text-to-diagram-01.txt",
    "content": "# Object And Messages\n[ ... start ] -> Data Collection : research or business goal / question\nData Collection -> [... intermediary steps ...] : prepare data for model\n[... intermediary steps ...] --> Model creation : training\nModel creation --> [ finish ... ] : predictions from real-world data\n\n# Bottom Description\n[snapshot of the end-to-end process - Data Collection focussed]\n\n# Website: http://echoma.github.io/text_sequence_diagram/"
  },
  {
    "path": "content/purgatorio/collect-and-prepare-data/data-collection.md",
    "content": "---\ntitle: Data Collection\nauthor: neomatrix369\ndescription: The purpose of this guide is to talk about data collection and the different steps you need to do to prepare your dataset even before we can think of Machine Learning models and the works.\n---\n\n# What you will learn \nThe real world is full of data, there are many types of data and collecting them is an art and comes through experience and doing it in an iterative process.\n\nAlso, this is one of the preliminary steps when you are about to do _Machine Learning_ or _Deep Learning_ models. The cascading steps or processes depend on quite a bit on this task but at the same time, this is a task that can be iterated many times.\n\nAnd revisited depending on what we conclude or find in the subsequent steps and processes (you can look at the index to see what these steps are). \n\nWe will also introduce a flow diagram eventually to show you where in the flow this task/step sits.\n\nThe purpose of this guide is to show you the importance of these steps, but also how important data collection can be in the whole cycle.\n\n# Index\n- [How to use this guide?](#How-to-use-this-guide)\n- [The end-to-end process](#The-end-to-end-process)\n- [Research or business questions](#Research-or-business-questions)\n- [Start Small](#Start-small)\n- [Small steps](#Small-steps)\n- [The Toolkit and sources](#The-Toolkit-and-sources)\n- [Datasets](#Datasets)\n- [Data Generation](#Data-Generation)\n- [Vizualisation](#Vizualisation)\n- [Sanity Check](#Sanity-Check)\n  - [Ethics](#Ethics)\n  - [Interpretability / Explainability](#interpretability--explainability)\n- [Automate The Boring Stuff!](#Automate-the-boring-stuff)\n- [Resources](#Resources)\n- [Conclusions](#Conclusions)\n\n**Let's Start!**\n\n### How to use this guide?\n\nWe'll give you some general tips to learn effectively and develop a decent foundation, that you can rely on to address and solve _Data Science_ problems in the complexity of the real world (which is messy by definition).\n\nIn this guide, you'll find many different tips and the sub-topics answer these questions provided below:\n- why? (see [Research or business questions](#Research-or-business-questions))\n- how?\n- what?\n\nThe last two \"how?\" and \"what?\" overlap a bit and expand into these:\n- [Start Small](#Start-small)\n- [Small steps](#Small-steps)\n- [The Toolkit and sources](#The-Toolkit-and-sources)\n- [Datasets](#Datasets)\n- [Data Generation](#Data-Generation)\n- [Vizualisation](#Vizualisation)\n- [Sanity Check](#Sanity-Check)\n\nAnd to keep track of the \"big picture\", refer to [The end-to-end process](#The-end-to-end-process) section. Any other section(s) not mentioned are supporting sections to this guide.\n\nAs stated in **Virgilio's Teaching Strategy Guide**, read more about it [here](https://virgili0.github.io/Virgilio/paradiso/virgilio-teaching-strategy.html#goals-of-this-guide).\n\n[Back to the index](#index)\n\n### The end-to-end process\n\nHere's a snapshot of the _end-to-end flow_ (high-level perspective):\n\n![Screen Shot 2020-07-19 at 15 53 42](https://user-images.githubusercontent.com/1570917/87877786-2d660100-c9d8-11ea-9aa9-cb5eb076b6f2.png)\n\nDetails are omitted and focus is drawn to the current subject (_Data Collection_) we are talking about. But this is the \"big picture\" to also keep in mind when working through individual steps.\n\n[Back to the index](#index)\n\n### Research or business questions\n\nThe first thing before or during the _Data Collection_ process will be asking the right question(s). The [right business questions](https://www.datapine.com/blog/data-analysis-questions/) may be hard to come up with, but it has the [biggest impact](https://towardsdatascience.com/start-your-data-exploration-with-questions-2f1d42cff29e) on your performance of solving a particular problem. Remember, you want to [solve a problem](http://www.informit.com/articles/article.aspx?p=2271188&seqNum=2), not to create new ones!\n\nAnd the same goes for asking the right _research question_. If you intend to establish something based on a hunch or curiosity or other research then there has to be some good base to start with.\n\nYour data collection process or step is entirely dependent on the research or the business problem you are trying to solve.\n\nAt this point it's also important to understand that _the end-model_ you are on the quest to create, is a direct reflection of these two main factors:\n\n- Data (or datasets used)\n- Method (algorithm(s) used)\n\nAlthough the second factor that is, \"Method\" will come a bit later, the first factor is the primary or core component of the _end-model_. Methods can be swapped and occasionally the end-results may not differ by much but good data or the right data is the key to getting a good model, otherwise you immediately can see the effects of [GIGO (Garbage In, Garbage Out)](https://en.wikipedia.org/wiki/Garbage_in,_garbage_out).\n\nWhen coming up with a question or a problem statement, it's also necessary to know the definition of \"done\" and use examples if possible to establish what the end-results should/could be comparable to once we reach the endpoint of the process (each iteration or the last iteration).\n\n[Back to the index](#index)\n\n### Start Small\n\nIt's not efficient to try to handle _Gigabytes_ or _Petabytes_ of data each time you want to create a dataset as part of the _Data Collection_ process. Just use [small subsets](https://sdtimes.com/bi/data-gets-big-best-practices-data-preparation-scale/) of the data (but take care that the data is representative and you know the problems or nuances it contains). Once you are certain about your process and the end-to-end flow has matured and stabilised you can consider using bigger chunks of data for the new iterations.\n\n[Back to the index](#index)\n\n### Small steps\n\nJust like the previous section [Start Small](#Start-small), starting small and staying small or growing slowly (or incrementally) is the most optimum way to proceed with _Machine Learning_ or _Deep Learning_ problem solving - given there are so many variables and moving parts. It's best to minimise the moving targets and pin them or fix them to a minimum when working on any part of the _end-to-end_ flow.\n\nAnd so knowing clearly whether to increase the quantity of data to collect (or not collect at all) at the beginning (or end) of the end-to-end flow is a good way to go about. You will be able to determine this once you have gained enough intuition about the specific subject/domain and your end-to-end process to hand. Sometimes you may even decide to reduce the data to hand, if that makes sense based on the gathered observations and results.\n\n[Back to the index](#index)\n\n### The Toolkit and sources\n\nHere is a list of things you could be doing to gather fresh data or existing data (and repurpose it for your needs):\n\n- _Web Scraping_ tools and services\n- Look for pre-existing datasets\n  - **Kaggle** Datasets\n  - **Kaggle Kernels** using custom datasets\n  - Other competition sites\n  - Other public domain sites\n  - Private domain sources (respecting the licenses)\n- Existing data in excel sheets or other forms within teams/organisations\n- Collecting log files of program or application executions from live systems\n- Running surveys via automatic services: **Google Forms**, **SurveyMonkey**, etc..,\n- Convert non-digitalised data using modern technology\n- **Data generation** services and tools\n\nMany of the above can be done in a \"live\" manner or through a `cron` (scheduled) jobs and others through manual intervention. Which means you could have a \"live\" pipeline constantly collecting data and generating datasets for your _Machine Learning_ / _Deep Learning_ pipeline.\n\n[Back to the index](#index)\n\n### Datasets \n\nWhat is a _[dataset](https://en.wikipedia.org/wiki/Data_set)_? And how to create them? Also another important question is what should the dataset look like? This will quite depend upon on your [Research or business questions](#Research-or-business-questions) to hand.\n\nHaving a look at how others have created their datasets for the various domains or topics or research subjects, can also help in the process. See this [Datasets resource](https://github.com/neomatrix369/awesome-ai-ml-dl/blob/master/data/datasets.md) which is a mix of both _clean_ and _unclean_ (_raw_) datasets. This can also answer the more specific question, \"what file format should the dataset be saved in?\" [CSV](https://en.wikipedia.org/wiki/Comma-separated_values)? [JSON](https://en.wikipedia.org/wiki/JSON)? or any other know file formats.\n\nThey can throw light on types of data (features) to collect or not to collect, and in what form should they be in [data types](https://en.wikipedia.org/wiki/Data_type) when collected such that it's useful for the next steps in the process.\n\n[Back to the index](#index)\n\n### Data Generation\n\n_Data generation_ is also a good [MVP](https://en.wikipedia.org/wiki/Minimum_viable_product) step/process, and also could be incorporated as one of your steps during the first few iterations - if you discover or know from observation that the data to hand is not sufficient or correct or even not usable for the end-purpose (see [Research or business questions](#Research-or-business-questions)).\n\n_Data Generation_ can be useful when a domain or field has limited data from previous experiments, or the exercises have resulted in a small dataset. But the dataset may be somewhat representative of the problem that is being solved - in these cases, _Data Generation_ using existing data can help. This process is also called \"synthetic data generation\" if the data is generated from scratch, and \"data augmentation\" if it's generated based using the original data (parts of it or whole of it). See [Data Augmentation for Deep Learning](https://towardsdatascience.com/data-augmentation-for-deep-learning-4fe21d1a4eb9).\n\nThis of course has it's pros and cons - you soon get a lot of data but then is the data biased and in what way? Is it balanced or not, if not what to do - all these kinds of questions come to the surface.\n\nThis topic may need a section on its own but many resources and facilities are propping up these days that do exactly this, see this resource on [Data Generation](https://github.com/neomatrix369/awesome-ai-ml-dl/blob/master/data/data-generation.md#data-generation).\n\nAn important point to note, in the interest of privacy and ethics, the data is anonymised and/or balanced to reduce any injected bias via this process of data generation.\n\n[Back to the index](#index)\n\n### Visualization\n\n\"A picture speaks a thousand words\" or \"A picture is worth a thousand words\" or other variants - they all mean the same thing!\n\nThere is a misconception that [Data Visualization](https://virgili0.github.io/Virgilio/purgatorio/collect-and-prepare-data/data-visualization.html) takes place towards the end or during some other process in the _end-to-end_ process. But the fact is, whenever you have data, no matter what state it is in, we can visualise it (partially, if not fully) . And gain an insight into what it is representing and what state it is in. It is an art and not just science to be able to do this, the science part of drawing pictures from it is more or less solved, but evaluating these pictures and diagrams is another skill. And depending on how well one knows their domain may or may not be able to make sense from them -- which again goes back to the [Research or business questions](#Research-or-business-questions).\n\nBut try to visualise as much as possible at every opportunity available, to be able to understand the changing nature of the data to hand.\n\n[Back to the index](#index)\n\n### Sanity Check\n\nYou always want to be sure that your data are _exactly_ how you want them to be, and because of this is a good rule of thumb is to apply a \"sanity check\" at the end of the _Data collection_ process.\n\nAlthough sometimes we won't know \"what sanity checks to apply?\" till we have run through the rest of the steps in the process and then come back the next iteration(s) and fine-tune this step. So that a process can catch the important low-hanging fruits and that do not hinder the rest of the processes. Sometimes you might just have to proceed with the data and the steps that follow i.e. Data Preparation, Data Cleaning, Data Visualization, etc... as later on these steps will help reveal much about the collected data and decisions to take at any point in the process.\n\nAs we talk about [Data Visualization](https://virgili0.github.io/Virgilio/purgatorio/collect-and-prepare-data/data-visualization.html), the _Visualization_ step in the previous section itself is a good enough \"sanity check\" of your data - provided you have drawn those charts and have the skills to evaluate them. If not, hopefully, the rest of the steps will help you capture those insights (or other ones). And sometimes with experience and doing multiple iterations and observing various experiments, visualizations on older datasets (snapshots) start to make more sense.\n\nThen there is also ethics you do not want to miss out on and [the section to follow gives you insight into it](#ethics). And finally, also [interpretability/explainability](#interpretability--explainability) which overlaps with ethics in a good way.\n\n#### Ethics\n\nWith rising concerns over _privacy_ and _bias_, you want to be sure that the data collected does respect the ethics and standards in this field as much as possible.\n\nTo help with that as the awareness about things are improving, there are a lot of resources available, one such place to start would be [here](https://github.com/neomatrix369/awesome-ai-ml-dl/blob/master/README-details.md#ethics--altruistic-motives). One of the resources mentioned there is that of a python package called [Deon](https://pypi.org/project/deon/). Interestingly it has a _digital checklist_ you can consult and see if they apply to what you are about to do.\n\n#### Interpretability / Explainability\n\nAnother widely debated but essential topic is the ability for us to interpret or explain our models and what better place to start but during the _Data Collection_ process. Another [good resource](https://github.com/neomatrix369/awesome-ai-ml-dl/blob/master/data/model-analysis-interpretation-explainability.md#post-model-creation-analysis-ml-interpretationexplainability\n) to look into when although it's an ever-growing topic and subject to keep track of.\n\nOther useful links to look at are [TensorFlow: Responsible AI](https://www.tensorflow.org/resources/responsible-ai) and https://pair.withgoogle.com/chapter/explainability-trust/ (you can find some more useful ones under [People + AI GuideBook](https://pair.withgoogle.com/guidebook/)). Another important resource to check here is this [course/tutorial on causality](https://www.callingbullshit.org/).\n\nEnsure the features in the dataset which will end up becoming your _real-world model_ are _explainable_ and not a _[blackbox](https://en.wikipedia.org/wiki/Black_box)_ to the real-world. \n\n[Back to the index](#index)\n\n### Automate The Boring Stuff!\n\n_Data collection_ can be a tedious process but you could also [automate](https://www.youtube.com/watch?v=UZUoH7_mYx4) the most you can. Also, **automation is married with iteration**, so this is the way you need to plan your _data collection_ pipelines. It's not easy to recommend automation tips but here are some of the things you could consider doing (depending on your needs and the [Research or business questions](#Research-or-business-questions) you are trying to answer), see [The Toolkit and sources](#The-Toolkit-and-sources).\n\nBeware that not in every case you may be able to automate the process, it will all depend on the domain your problem statement is created from and how digitalised it is. But sometimes some data may need to be extracted manually or through human-intervention or through traditional methods. Sometimes it's easier to not digitalise or automate something till the need for it arises, a few manual steps at a rare or occasionally is acceptable if Data Collection isn't performed regularly. At the end of the day try to strike a balance between need, efficiency and accuracy - during the initial steps you may be able to discount these a bit but as you do more iterations discipline and precision are important, so efficiency is our friend then.\n\n[Back to the index](#index)\n\n### Resources\n\nThese two resources are quite extensive and have been rated by experienced professionals in the industry:\n\n- [👉 Effective Data Collection 👈](https://www.linkedin.com/posts/asif-bhat_data-collection-activity-6625312371869089793-4LrM)\n- [The Ultimate Guide to Effective Data Collection](https://www.linkedin.com/posts/iamsivab_the-ultimate-guide-to-effective-data-collection-activity-6656175779732381697-lv6X)\n- [People + AI GuideBook: Data Collection + Evaluation](https://pair.withgoogle.com/chapter/data-collection/)\n\nIt would be good to have a glance at them to see if you have not considered something. Such resources can also help validate the things we already know and how we are using them in the context of the problem to hand (and how others have been using them as well).\n\nAlso look at this talk on [\"Do we know our data, as good as we know our tools?\"](https://github.com/neomatrix369/awesome-ai-ml-dl/blob/master/presentations/data/02-devoxx-uk-2019/README.md), it starts off with an introduction to \"Data Collection\" and then into the next steps in the end-to-end process, also look for additional resources towards the end of the talk/slides and the _Appendix_ section of the slides.\n\nBut don't just stick to these build your acumen and also look for other resources everywhere else.\n\n[Back to the index](#index)\n\n### Conclusions\n\nSo now that you have an idea of what to do when you want to start solving a business problem using techniques like _Machine Learning_ and _Deep Learning_. You can also start thinking about how to do this in easily and keep building on top of it, otherwise, you may be forever busy collecting data but not proceed further from there. And not know the impact or use of the data collected. And thereby not gain the insight needed to answer your query or solve the problem statement.\n\nDo also keep in mind the _due-diligence_ to follow when data is collected and converted into datasets to be passed on to the next process in the _end-to-end_ pipeline.\n\nMay be another read of the guide, taking notes from the various sections and external resources, creating a mind-map of all of the above could help give you a better insight into this initial but important step into _Data Science_.\n\n[Back to the index](#index)"
  },
  {
    "path": "content/purgatorio/collect-and-prepare-data/data-preparation.md",
    "content": "---\ntitle: Data Preparation\nauthor: clone95, neomatrix369\ndescription: The purpose of this guide is to show you the different preprocessing steps you need to apply to your data before feeding them to Machine Learning models.\n---\n\n# What you will learn \nReal-world data is almost always messy or unstructured, and most of the time of the Data Scientist is spent in data preprocessing (or data cleaning or data preprocessing), before visualizing them or feeding them to Machine Learning models.\n\nThe purpose of this guide is to show you the importance of these steps, mostly about text data, but there will be guides on cleaning different kinds of data you may encounter.\n\n# Index\n- [Start Small](#Start-small)\n- [Business Questions](#Business-Questions)\n- [Data Preprocessing (Data wrangling / Data manipulation)](#data-preprocessing-data-wrangling--data-manipulation)\n- [Data Profiling](#Data-Profiling)\n- [Data Cleaning](#Data-Cleaning)\n  - [Get Rid of Extra Spaces](#Get-Rid-of-Extra-Spaces)\n  - [Select and Treat All Blank Cells](#Select-and-Treat-All-Blank-Cells)\n  - [Convert Values Type](#Convert-Values-Type)\n  - [Remove Duplicates](#Remove-Duplicates)\n  - [Spell Check](#Spell-Check)\n  - [Grammar Check](#Grammar-Check)\n  - [Reshape your data](#Reshape-your-data)\n  - [Converting to categorical data type](#Converting-to-categorical-data-type)\n  - [Dealing with Special Characters](#Dealing-with-Special-Characters)\n  - [Verification To Enrich Data](#Verification-To-Enrich-Data)\n  - [Data Discretization](#Data-Discretization)\n  - [Data Cleaning Tools](#Data-Cleaning-Tools)\n  - [Change Text to Lower/Upper Case](#Change-Text-to-Lower/Upper-Case)\n  - [Normalizing Dates](#Normalizing-Dates)\n  - [Feature Scaling](#Feature-Scaling)\n  - [Types of data](#types-of-data)\n  - [Data Cleaning Tools](#Data-Cleaning-Tools)\n- [Visualization](#Visualization)\n- [Merge Data Sets and Integration](#Merge-Data-Sets-and-Integration)\n- [Aggregating data (centralizing)](#Aggregating-data-centralizing)\n- [Bias and balance/imbalance](#Bias-and-balance-imbalance)\n- [Sanity Check](#Sanity-Check)\n- [Automate These Boring Stuffs!](#Automate-These-Boring-Stuffs!)\n- [Doing it in real-time](#Doing-it-in-real-time)\n- [Don't Joke With Data](#Don't-Joke-With-Data)\n- [Who To Leave Behind](#Who-To-Leave-Behind)\n- [The Toolkit](#The-Toolkit)\n- [Conclusion](#Conclusion)\n\n**Let's Start!**\n\n## Start Small\nIt's not a good idea to load GigaBytes of data each time you want to try a data preparation step. \n\nStart with [small subsets](https://sdtimes.com/bi/data-gets-big-best-practices-data-preparation-scale/) of the data instead (but take care that they are representative and you catch all the problems). \n\nRemember, if you want to experiment with text cleaning, you don't need to launch your script on 10M rows. Test your data on a small subset or sample of data to learn if it works well there before going full-scale.\n\n## Business Questions\nBefore trying to prepare the data, you want to be sure you have the right objective in mind.\n\nAsking the [right business questions](https://www.datapine.com/blog/data-analysis-questions/) is hard, but it has the [biggest impact](https://towardsdatascience.com/start-your-data-exploration-with-questions-2f1d42cff29e) on your performance of solving a particular problem.\n\n Remember, you want to [solve a problem](http://www.informit.com/articles/article.aspx?p=2271188&seqNum=2), not to create new ones! \n\n## Data Preprocessing (Data wrangling / Data manipulation)\n**Data preprocessing** (also known as Data Preparation, but \"Preprocessing\" sounds more like magic) is the **[iterative process](http://www.jsoftware.us/vol12/306-JSW15277.pdf) of gathering, combining, structuring, and (re)organizing data so it can be analyzed as part of data visualization, analytics, and machine learning processes.**\n\n[Real-world data](https://www.quanticate.com/blog/real-world-data-analysis-in-clinical-trials) is often incomplete, inconsistent, and/or lacking in certain behaviors or trends, and is likely to contain many errors. Data preprocessing is a proven method of resolving such issues.\n\nIt's the [core ability](https://blogs.sas.com/content/hiddeninsights/2017/11/30/analytical-data-preparation-important/) of any data scientist or data engineer, and you must _be able to manipulate, clean, and structure_ your data during the everyday work (besides expecting that this will make the most of your [daily-time](https://www.infoworld.com/article/3228245/the-80-20-data-science-dilemma.html)!).\n\nThere are a lot of different data types out there, and they deserve [different treatments](http://blog.appliedinformaticsinc.com/data-mining-challenges-in-data-cleaning/).\n\nAs usual, the structure Virgilio has planned to get you started consists of having a [general overview](https://searchbusinessanalytics.techtarget.com/definition/data-preparation), and then dive deep into each data processing situation you can encounter. \n\n[Here](https://towardsdatascience.com/data-pre-processing-techniques-you-should-know-8954662716d6) you have a gentle end-to-end panoramic view of the most common data preparation steps.\n\n## Data Profiling\nAccording to the [Wikipedia definition](https://en.wikipedia.org/wiki/Data_profiling): \"Data profiling is the process of examining the data available from an existing information source (e.g. a database or a file) and collecting statistics and informative data summaries.\" \\\nSo Wikipedia is subtly suggesting us to have a coffee with our data. :-)\n\nDuring this informal meeting, ask the data questions like:\n- which business problem are you meant to solve? (what is important, and what is not) \n- how have you been collected (with noise, missing values...)?\n- how many friends of yours are there and where can I find them? (data dimensions and retrieving from storages, related sources)\n\nEventually, you may find the data to be too quiet, maybe it's just shy! \\\nAnyway, you're going to [ask these questions to the business user](https://business-analysis-excellence.com/business-requirements-meeting/)!\n\nCheck these tools to quickly make a profile of your data and get a 3000-feet view of them.\n\n- [Dtale](https://github.com/man-group/dtale)\n- [Pandas Profiling](https://github.com/pandas-profiling/pandas-profiling)\n\n_Best practices and exercises:_ [1](https://www.iqint.org/idq2013/presentations/downloads/di_loreto_data_profiling_tutorial_monday_am.pdf)++, [2](https://community.alteryx.com/t5/Alteryx-Designer-Discussions/Data-profiling-tutorials-use-cases-and-exercise/td-p/145347)++\n\n> ++ - beware that this resource contains one or more premium or commercial (paid) product, if you are aware of an alternative solution to them please do share it with us\n\n## Data Cleaning\n[Data cleaning](https://en.wikipedia.org/wiki/Data_cleansing) is the general process of ensuring that the quality of your data would be enough to satisfy the requirements of the problem you want to solve.\n\nFor example, it can consist of replacing characters in strings, dropping incomplete rows, fill missing values, and so forth. In the next sections, we'll explore all the common data cleaning situations.\n\nWhile it's hard to state that some steps are strictly required and others aren't, it's clever to know and try as many approaches as possible.\n\nAlso, see [Data Cleaning on awesome-ai-ml-dl](https://github.com/neomatrix369/awesome-ai-ml-dl/blob/master/data/data-preparation.md#data-cleaning) section to learn more about this topic.\n\nWe will assume the data it's tabular, to see more about other types of data, check the related sections of the Inferno.\n\n### Get Rid of Extra Spaces\nOne of the first things you want to do is [remove extra spaces](https://stackoverflow.com/questions/43332057/pandas-strip-white-space). Take care! Some space can carry information, but it heavily depends on the situation. For example, in \"Complete Name\": \"Andrea Carli\" in nice to have space so we can later split this into \"Name\": \"Andrea\" and \"Surname\": \"Carli\". \n\nVirgilio wants you to notice that in general, apart from recommending and suggesting customization systems, unique identifiers like names or IDs are something you can generally drop. Often, they do not carry information. \n_Bonus tip_: learn how to use [Regex](https://www.analyticsvidhya.com/blog/2015/06/regular-expression-python/) for pattern matching, this is one of the powerful tools each data guy need to master.\n\n_Best practices and exercises:_ [1](https://www.quora.com/How-do-you-remove-all-whitespace-from-a-Python-string), [2](https://towardsdatascience.com/5-methods-to-remove-the-from-your-data-in-python-and-the-fastest-one-281489382455), [3](https://www.tutorialspoint.com/How-to-remove-all-leading-whitespace-in-string-in-Python)\n\n_RegeX exercises_: [1](https://www.w3resource.com/python-exercises/re/), [2](https://pycon2016.regex.training/exercises)\n\n_Bonus Resource_: A super useful [tool](http://regviz.org/) for visualizing RegeX expressions and their effect on the text.\n\n###  Select and Treat All Blank Cells\nOften real-world data is incomplete and is necessary to handle this situation. [These](https://code.likeagirl.io/how-to-use-python-to-remove-or-modify-empty-values-in-a-csv-dataset-34426c816347) are two ways of dealing with it. [Here](https://hackersandslackers.com/pandas-dataframe-drop/) you have a more in-depth tutorial.\n\n_Best practices and exercises:_ [1](https://www.kaggle.com/nirmal51194/data-cleaning-challenge-handling-missing-values), [2](https://stefvanbuuren.name/fimd/missing-data-pattern.html), [3](https://www.ethz.ch/content/dam/ethz/special-interest/math/statistics/sfs/Education/Advanced%20Studies%20in%20Applied%20Statistics/course-material-1719/Multivariate/w10-in-class-exercise-imputation-solution.pdf), [4](http://uc-r.github.io/missing_values)\n\n###  Convert Value Types\n[Different data types](https://pbpython.com/pandas_dtypes.html) carry different kinds of information, and you need to care about this.\n[Here](https://www.geeksforgeeks.org/python-pandas-series-astype-to-convert-data-type-of-series/) is a good tutorial on how to convert value types. Remember that Python has some shortcut for doing this (executing `str(3)` will give you back the \"3\" string) but Virgilio recommends you to learn how to do it with Pandas.\n\n###  Remove Duplicates\nYou don't want duplicate data, they may be noisy, redundant, and occupy more space! Learn [how to handle them simply](https://www.geeksforgeeks.org/python-pandas-dataframe-drop_duplicates/) with Pandas.\n\n###  Spell Check\nYou want to correct wrong words, for the sake of evenness. Check [here](https://www.tutorialspoint.com/python_text_processing/python_spelling_check.htm) for a good Python module to do it. Also, this is a good starting point to [implement it](https://stackoverflow.com/questions/46409475/spell-checker-in-pandas). \n\nThis is also useful when you are dealing with text data (columns of text data in a tabular dataset).\n\n_Best practices and exercises:_ [1](https://stackoverflow.com/questions/7315114/spell-check-program-in-python), [2](https://norvig.com/spell-correct.html), [3](https://github.com/garytse89/Python-Exercises/tree/master/autoCorrect)\n\n###  Grammar Check\nJust like Spell Check, a Grammar check of text data can be of great importance depending on the NLP task you are about to perform with them.\n\n###  Reshape your data\nMaybe you're going to feed your data into a neural network or show them in a colorful bars plot. Anyway, you need to transform your data and give them the right shape for your data pipeline. [Here](https://towardsdatascience.com/seven-clean-steps-to-reshape-your-data-with-pandas-or-how-i-use-python-where-excel-fails-62061f86ef9c) is a very good tutorial for this task. \n\n_Best practices and exercises:_ [1](https://pandas.pydata.org/pandas-docs/stable/user_guide/reshaping.html), [2](https://discuss.codecademy.com/t/faq-data-cleaning-with-pandas-reshaping-your-data/384794).\n\n###  Converting to categorical data type\nWhen dealing with numeric or string (alphanumeric) columns that represent categories or multi-class labels, it's best to convert them into the categorical type. \n\nThis does not just save memory, also makes the dataframe faster to operate on. And further makes the data analysis step easier to perform.\n\n Further to that categorical column types under the hood maintain a category code per value in the column, which can be used instead of their string equivalents - saving some preprocessing or column transformations. \n\nOne additional benefit of doing this would be to help spot inconsistent namings and replace them with consistent ones. Inconsistent labels can lead to incorrect analysis and visualizations. Although these can be spotted during the summarization of categorical data.\n\nRead all about it in the [Pandas docs](https://pandas.pydata.org/docs/) on [Categorical data type](https://pandas.pydata.org/pandas-docs/stable/user_guide/categorical.html).\n\n###  Dealing with Special Characters\nUTF-encoding is the standard to follow, but remember that not everyone follows the rules (otherwise, we'd not need [crime predictive analytics](http://scholarworks.sjsu.edu/cgi/viewcontent.cgi?article=1633&context=etd_projects).\n\n You can learn [here](https://stackoverflow.com/questions/45596529/replacing-special-characters-in-pandas-dataframe) how to deal with strange accents or special characters.\n\n_Best practices and exercises:_ [1](https://www.w3resource.com/python-exercises/python-basic-exercise-92.php), [2](https://stackoverflow.com/questions/22518703/escape-sequences-exercise-in-python?rq=1), [3](https://learnpythonthehardway.org/book/ex2.html)\n\n###  Verification to enrich data\nSometimes can be useful to engineer some data, for example: suppose you're dealing with [e-commerce data](https://www.edataindia.com/why-data-cleansing-is-important/), and you have the prices of each object sold. You may want to add a new column in your dataset, with a label carrying handy information like a Price_level [low, medium, high] based on upper and lower bounds you can decide.\n\nThis is simple in Pandas, check [here](https://stackoverflow.com/questions/19913659/pandas-conditional-creation-of-a-series-dataframe-column). Another example is to add a Gender column (M, F) to easily explore data and gain insights into a customers dataset.\n\n_Best practices and exercises:_ [1](https://web.archive.org/web/20200813205611/http://www.inweb.org.br/w3c/dataenrichment/), [2](https://solutionsreview.com/data-integration/best-practices-for-data-enrichment-after-etl/)\n\n###  Data Discretization\nMany Machine Learning and Data Analysis methods cannot handle continuous data, and dealing with them can be computationally prohibitive. [Here](https://www.youtube.com/watch?v=TF3_6lwITQg) you find a good video explaining why and how you need to discretize data.\n\n_Best practices and exercises:_ [1](https://www.researchgate.net/post/What_are_the_best_methods_for_discretization_of_continuous_features), [2](https://towardsdatascience.com/discretisation-using-decision-trees-21910483fa4b), [3](https://docs.microsoft.com/en-us/sql/analysis-services/data-mining/discretization-methods-data-mining)\n\n###  Feature Scaling\nFeature scaling is a method used to standardize the range of independent variables or features of data. In data processing, it is also known as data normalization and is generally performed during the data preprocessing step.\n\nAlso known as \"Normalizing data\" (bring the values of a numeric column between 0 and 1) or \"Standardizing data\".\nSee [Normalization vs Standardization](https://towardsdatascience.com/normalization-vs-standardization-cb8fe15082eb). \n\nNormalization is also called the min-max approach, see another [example](https://towardsdatascience.com/data-normalization-with-pandas-and-scikit-learn-7c1cc6ed6475).\n\n_Best practices and exercises:_ [1](https://www.kaggle.com/jfeng1023/data-cleaning-challenge-scale-and-normalize-data), [2](https://www.quora.com/When-should-you-perform-feature-scaling-and-mean-normalization-on-the-given-data-What-are-the-advantages-of-these-techniques), [3](https://www.quora.com/When-do-I-have-to-do-feature-scaling-in-machine-learning)\n\n### Types of data\n\n**Tabular data**\n\nAlso known as columnar or spreadsheet-like data where each column may be a different data type like string, numeric, date, etc. This includes most kinds of data commonly stored in a relational database or tab or .csv files.\n\nSuch data can then represent categorical, numeric/continuous, time-series data, or a mix of all of these in different proportions -- this is the next level of abstraction of such types of data.\n\n**Text data**\n\nJust as transformations or preprocessing can be performed on numeric, date, or categorical data, similarly text data can also be processed in such a fashion.\n\n Although text data would undergo regex and string transformation processes deemed necessary for the NLP tasks they would be used for thereafter.\n \n  The result of such processing could be one or more tabular datasets which could then further be processed like any other tabular dataset (see above section).\n\n**Image/Video/Audio/Signal data**\n\nUnlike Tabular or Text data, such data is made up of mostly continuous values. The original data would be in binary format in the form of directories of files. \n\nThese files would then be processed and transformed into rows and columns of continuous data with a minority number of categorical or other data types to represent such data, eventually, they may be represented in the tabular format for analysis, processing, and training purposes.\n\n And so these final datasets would go through the same preprocessing as any other tabular data would.\n\n**Note:** _Each of these data types above can be covered in more detail in further guides at the **Inferno** or **Paradiso** levels and outside the current scope to keep the brevity in the understanding of these concepts. To catch a glimpse of some of the specific preprocessing or transformation steps that we can do per type of data, see this [resource](https://www.linkedin.com/posts/shivan-kumar_datascience-machinelearning-deeplearning-activity-6732600618751442944-kNRY)._\n\n### Data Cleaning Tools\nYou're not going to hunt tigers without a rifle! You have a ton of tools out there that will help you during the data cleaning process, the one Virgilio wants to suggest to you is [this](https://www.analyticsindiamag.com/10-best-data-cleaning-tools-get-data/) open-source tool from Google. Check [here](https://www.quora.com/What-are-the-best-open-source-data-cleansing-tools-software-available) for more.  \n\n## Visualization\nVisualization of data before and after many of the above steps is vital, to ensure the balance, bias, and shape of the data is maintained. \n\nAnd the transformed or preprocessed data is representative of its original form. Even if we can't control the way such data is going to evolve, we can at least see the before and after-effects of a transformation/preprocessing step before proceeding with it. Or if we even do proceed with it, we know from the visuals what the outcome stands to be from it (more or less).\n\nThe specifics of what kinds of visualizations to use is to be made available in the Visualisation Guide.\n\n## Merge Data Sets and Integration\nNow that you hopefully have been successful in your data cleaning process, you can merge data from a different source to create big [de-normalized](https://www.researchgate.net/post/When_and_why_do_we_need_data_normalization_in_data_mining_algorithms) data tables, ready to be explored and consumed. [This](https://www.quora.com/Is-data-warehouse-normalized-or-denormalized-Why) is why.\n\n## Aggregating data (centralizing)\nAggregating data or centralizing data (or sometimes called normalizing data) - even though this topic overlaps with the [Data Collection](https://virgili0.github.io/Virgilio/purgatorio/collect-and-prepare-data/data-collection.html) topic covered in the respective guide. It's good to touch on the topic and be reminded of it briefly. \n\nAs covered in the [Business Questions](#Business-Questions) when we ask questions about the data, one of them is to find its source. But it also could give rise to other related data or sources of data that could be relevant to the current task and then be brought in. \n\nWhich throws light on the data aggregation process - how to bring the different sources of data and convert it into one form before performing any preprocessing or transformations on it. This process itself is sort of a preprocessing or transformations step on its own.\n\nOn the other hand, this question could throw light on the sources of data the current raw-data is made up of (and make us aware of the aggregation process it underwent) before taking its current form.\n\n_Best practices and exercises:_ [1](https://www.ssc.wisc.edu/sscc/pubs/sfr-combine.htm), [2](https://rpubs.com/wsundstrom/t_merge), [3](https://jakevdp.github.io/PythonDataScienceHandbook/03.07-merge-and-join.html), [4](https://searchbusinessanalytics.techtarget.com/feature/Using-data-merging-and-concatenation-techniques-to-integrate-data), [5](https://www.analyticsvidhya.com/blog/2016/06/9-challenges-data-merging-subsetting-r-python-beginner/)\n\n## Bias and balance/imbalance\nIt is but hard to first check and know the current bias of the data or how the data is balanced or how much imbalance exists in the raw data. To add to that, at each of the above transformation / preprocessing steps we may be introducing bias or dampening existing bias or a combination of the two, in the raw data while we process it or transform it.\n\n## Sanity Check\nYou always want to be sure that your data are _exactly_ how you want them to be, and because of this is a good rule of thumb to apply a sanity check after each complete iteration of the data preprocessing pipeline (i.e. each step we have seen until now).\n\nLook [here](https://www.trifacta.com/blog/4-key-steps-to-sanity-checking-your-data/) for a good overview. Depending on your case, the sanity check can vary a lot.\n\n_Best practices and exercises:_ [1](https://blog.socialcops.com/academy/resources/4-data-checks-clean-data/), [2](https://www.r-bloggers.com/data-sanity-checks-data-proofer-and-r-analogues/), [3](https://www.quora.com/What-is-the-example-of-Sanity-testing-and-smoke-testing)\n\n## Automate These Boring Stuffs!\nAs Virgilio told you at the very beginning, the data preprocessing process can take a long time and be very tedious. Because of this, you want to [automate](https://www.youtube.com/watch?v=UZUoH7_mYx4) the most you can. Also, **automation is married with iteration**, so this is the way you need to plan your data preprocessing pipelines.\n\n [Here](https://github.com/mdkearns/automated-data-preprocessing) you find a good command-line tool for doing that, but Virgilio is almost sure you'll need to build your own (remember, each problem is unique!), but this is a good starting point.\n\n## Doing it in real-time\nFully connected to the [previous section](#Automate-These-Boring-Stuffs!), automating redundant or repeated tasks makes the workflow repeatable, consistent, efficient, and reliable. And given these qualities, it's not far away from being given the task of handling real-world raw data directly from the source or the various sources (centralizing or aggregation of data).\n\n This takes away the whole manual step from the process and keeps things real and practical -- production-ready all the time. In this way, you can see all the flavors of data/input and the nuances and edge-cases to handle each time a step fails or gives false positives or false negatives.\n\n## Don't Joke With Data\nFirst, [**data is King**](https://www.edq.com/glossary/data-quality-importance/). In the [data-driven epoch](https://www.venturi-group.com/qa-with-helen-mannion/), having [data quality issues](https://www.ringlead.com/blog/7-common-data-quality-issues/) means to lose tremendous amounts of value for a company, in the present and the future. So, respect your King and care a lot about him. The most immediate way to do this is to plan and [work hard](https://web.archive.org/web/20190708202946/https://nektardata.com/high-quality-data/) to _produce_ good quality data.\n\n\nYour goal is to plan a collecting data infrastructure that fixes problems beforehand. This means to care a lot about planning well your database schemas (do I need [third-normal form](https://social.technet.microsoft.com/Forums/Lync/en-US/7bf4ca30-a1bc-415d-97e6-ce0ac3137b53/normalized-3nf-vs-denormalizedstar-schema-data-warehouse-?forum=sqldatawarehousing) or not?), how do you collect data from sensors (physical or conceptual) and so on. \n\nThese are problems if you're building a system up from the ground, but most of the time in you're gonna facing real-world problems that someone wants to solve with [_already available_](https://www.wired.com/insights/2013/05/more-data-more-problems-is-big-data-always-right/) data.  \n\n_Best practices and exercises:_ [1](https://blog.panoply.io/5-data-preparation-tools-1-automated-data-platform), [2](https://www.quora.com/How-do-I-make-an-automated-data-cleaning-in-Python-for-ML-Is-there-a-trick-for-that), [3](https://www.quora.com/Is-there-a-python-package-to-automate-data-preparation-in-machine-learning), [4](https://machinelearningmastery.com/prepare-data-machine-learning-python-scikit-learn/), [5](https://www.analyticsvidhya.com/blog/2018/10/rapidminer-data-preparation-machine-learning/)\n\n## Who To Leave Behind\nDuring the data profiling process, it's common to realize that often some of your data are [useless](https://ambisense.net/why-useless-data-is-worse-than-no-data/). Your data may have too much noise or they are partial, and most likely you don't all of them to answer your business problems.\n\n\n[To drop or not to drop, the Dilemma](https://www.theanalysisfactor.com/outliers-to-drop-or-not-to-drop/).\nEach time you're facing a data-related problem, try to understand what data you need and what you' don't - that is, for each piece of information, ask yourself (and ask the _business user_): \n- How this data is going to help me?\n- Is possible to use them, reducing noise or missing values?\n- Considering the benefits/costs of the preparation process versus the business value created, Is the effort worth it?\n\n## The Toolkit\nThe tools we're gonna use are Python3 and his [Pandas library](https://pandas.pydata.org/), the de-facto standard to manipulate datasets. \n\nThere are a whole lot of other tools that have come out which are either built on top of Pandas or Numpy or independently, see [Data Preparation on awesome-ai-ml-dl](https://github.com/neomatrix369/awesome-ai-ml-dl/blob/master/data/data-preparation.md) for more details.\n\nThe heavy lifting here is done by the [DataFrame class](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html), which comes with a bunch of useful functions for your daily data tasks.\n\n\nHopefully, you already know Python, if not start from there (do the steps Virgilio suggested to you in the ML guide requirements), and then take this [Beginner Pandas tutorial](https://web.archive.org/web/20200719131732/https://pandas.pydata.org/pandas-docs/stable/getting_started/10min.html). \n\nDon't worry if by now some ideas are not clear, but try to get the big picture of the common [Pandas operations](https://www.analyticsvidhya.com/blog/2016/01/12-pandas-techniques-python-data-manipulation/). \n\n_Best practices and exercises:_ [1](https://github.com/guipsamora/pandas_exercises), [2](https://www.w3resource.com/python-exercises/pandas/index.php), [3](https://www.machinelearningplus.com/python/101-pandas-exercises-python/), [4](https://www.kaggle.com/pistak/pandas-tutorial-with-interactive-exercises), [5](http://disi.unitn.it/~teso/courses/sciprog/python_pandas_exercises.html)\n\n## Conclusions\nNow you're ready to take your data and play with them in a variety of ways, and you have a nice panoramic overview of the entire process. You can refer to this page when you clean data, to check if you're not missing some steps. Remember that probably each situation requires a subset of these steps.\n"
  },
  {
    "path": "content/purgatorio/collect-and-prepare-data/data-visualization.md",
    "content": "---\ntitle: Data Visualization\nauthor: clone95\ndescription: The purpose of this guide is to show you the importance of data visualization and why it's so useful when working with data.\n---\n\n# What you will learn \nThe purpose of this guide is to show you the importance of data visualization and why it's so useful when working with data.\nWe'll show you best practices and reasons for using them, along with the \"storytelling\" approach to data science.\n\n# Index\n\n- [Data Visualization](#data-Visualization)\n- [Legolas, how do your elf eyes see?](#Legolas,-how-do-your-elf-eyes-see?)\n- [The Importance of Context](#The-importance-of-context)\n- [The Data / Ink Ratio](#The-Information-/-Ink-Ratio)\n- [Choose an Effective Visual](#Choose-an-Effective-Visual)\n- [Focus your Audience’s Attention](#Focus-your-Audience’s-Attention)\n- [Think like a Designer](#Think-like-a-Designer)\n- [Exploring Model Visuals](#Exploring-Model-Visuals)\n  - [Line Graph](#Line-Graph)\n  - [Annotated Line Graph](#Annotated-Line-Graph)\n  - [Stacked Bars](#Stacked-Bars)\n  - [Positive and Negative Stacked Bars](#Positive-and-Negative-Stacked-Bars)\n  - [Horizontal Stacked Bars](#Horizontal-Stacked-Bars)\n- [Data Visualization tools](#Data-Visualization-tools)\n  - [Microsoft Excel](#Microsoft-Excel)\n  - [MatplotLib](#MatplotLib)\n  - [Seaborn](#Seaborn)\n  - [Bokeh](#Bokeh)\n  - [Tableau](#Tableau)\n  - [Power Bi](#Power-Bi)\n- [Take Inspiration](#Take-Inspiration)\n- [Storytelling with Data](#Storytelling-with-Data)\n- [Common Visualization Mistakes](#Common-Visualization-Mistakes)\n- [Additional Resources](#Additional-Resources)\n- [Conclusions](#Conclusions)\n\n# Data Visualization \n\nIt was hard for the Homo Sapiens to survive in the African savannah: a human or animal could kill you at any time.\nThe human brain has evolved in this wild and unpredictable context, and evolution has \"coincidentally\" chosen to devote a great deal of computing power to capturing and understanding the world through **sight** ([more than 60 %](https://www.quora.com/How-much-of-the-brain-is-involved-with-vision-What-about-hearing-touch-etc)).\\\nSo, it' trivial that a clear and effective data visualization it's one of your best weapons in the Data Science world.\n\nThe track which inspired me for this guide is one of the must-buy book [**Storytelling with Data**](https://www.amazon.it/Storytelling-Data-Visualization-Business-Professionals/dp/1119002257/ref=sr_1_1?adgrpid=52005426669&gclid=CjwKCAjwndvlBRANEiwABrR32EhKMtGs8M5mBgl5lQJZCf9fglkx87ujqYVZk6gHsMDxKOd9yQa7uRoCin8QAvD_BwE&hvadid=255222968297&hvdev=c&hvlocphy=1008297&hvnetw=g&hvpos=1t3&hvqmt=e&hvrand=3841532584099296285&hvtargid=kwd-297573901809&keywords=storytelling+with+data&qid=1555538994&s=gateway&sr=8-1). By far is the best data visualization book I've ever read.\n\nYou can find [here](http://www.bdbanalytics.ir/media/1123/storytelling-with-data-cole-nussbaumer-knaflic.pdf) the free PDF. \n\nAnother piece of dense knowledge, with exceptional conciseness and \"father\" of every data visualization book: [**The Visual Display of Quantitative Information**](https://www.amazon.it/Visual-Display-Quantitative-Information/dp/0961392142).\n\nI assume you know [basic Python](https://github.com/clone95/Virgilio/blob/master/NewToDataScience/PythonBasic.md).\n\nEach content listed here **is not** tool-specific (apart from \"tools\", did you ever imagine that?).\n\n### Legolas, how do your elf eyes see?\nWhat do I intend with Data Visualization?\\\nLet's consider the [Tableau](https://www.tableau.com/learn/articles/data-visualization) definition:\n>Data visualization is a graphical representation of information. By using visual elements like charts, graphs, and maps, data visualization tools provide an accessible way to see and understand trends, outliers, and patterns in data.\nIn the world of Big Data, data visualization tools and technologies are essential to analyze massive amounts of information and make data-driven decisions.\"\n\nAnd according to [Wikipedia](https://en.wikipedia.org/wiki/Data_visualization):\n\n>Effective visualization helps users analyze and reason about data and evidence. It makes complex data more accessible, understandable and usable. Users may have particular analytical tasks, such as making comparisons or understanding causality, and the design principle of the graphic should follow the task.\n\nSo, the **goal** of Data Visualization is to _communicate data facts_ to drive wise business decisions. Often these decisions have to be taken by executives, councils or managers and maybe they don't know all the technical stuff behind data!\n\nAnother interesting concept you should be familiar with, is the Data-Driven company, a business model that more and more convincing organization to marry it.\n\n[Here](https://triggerbee.com/data-driven-marketing) you find a nice definition of Data-Driven company and [here](https://www.businessmodelsinc.com/big-data-business-models/) an interesting article about it.\n\nAs a data scientist, you are the interface among several business functions: product, research, techies and managers, and your main goal is to convince people into taking the right decisions, based on data.\n\nOften you intend to abstract the representation of the data from the underlying technical details and make them available for others. \nAs usual, the target you refer to is fundamental in the decision of what data to communicate, and how.\n\nThe natural consequence of this statement is that you need to consider the importance of context. \n\n### The Importance of Context\nAs in any other field of communication, knowing your audience is critical to understand what you need to communicate.\\\n[Here](https://www.watershedlrs.com/blog/data-storytelling-know-your-audience) you find an article with some tips to know your audience.\\\nBasically, the more you know about your audience interests, jobs, and individual situations, the more you can intercept their business needs and desires.\nThe more you can be specific about who your audience is, the more effective your position will be for successful communication.\\\nAvoid a general audience, such as \"external stakeholders\" or \"anyone in the product department\", trying to communicate to too many different individuals with different needs at once, you risk not communicating to any of them as effectively as you would if you narrowed your target audience.\\\nIf _you must_ remain general for some reason, try to simplify the most you can, and check [here](https://www.anl.gov/education/writing-a-general-audience-abstract) for some useful tips.\\\n[Here](https://www.techchange.org/2015/05/21/audience-matters-in-data-visualization/) you have some other reason why your data presentation should be driven by the target audience.\\\nOnce you've clear in mind your target, you can start developing the content you want to present.\n\n\n### The Data / Ink Ratio\nThe human brain has limited resources and overkilling it with numbers and notions can only lead to negative effects. People become bored easily, especially if your charts are hard to read or they offer _too much_ information. \nAs most of the concepts I taught you in the [Impactful presentation guide](https://github.com/clone95/Virgilio/blob/master/Specializations/SoftSkills/ImpactfulPresentations.md), Less Is More is one of the principles you need to follow strictly.\nThe Tufte's book stresses this out mercilessly calling it \"Information / Ink Ratio\".\n[Here](https://www.darkhorseanalytics.com/blog/data-looks-better-naked) you find an interesting journey of a chart, that brings it to un-readable to the state-of-art of minimalism.\\ The general lesson here is to get rid of everything is not needed to communicate the core of your data: extra lines, numbers, legends, names, points and so on. \n\nThe more noise you can avoid, the more your information will flow gently to your audience and the more they'll remember it.\n\n**Data/Ink Ratio = Amount of Ink used on Data / Amount of Ink used** \n\nSome additional resources to learn how to optimize the Data / Ink Ratio:\n- [1](https://thedoublethink.com/tuftes-principles-for-visualizing-quantitative-information/), [2](https://medium.com/@sudharsanasai/declutter-your-chart-with-data-ink-ratio-6f6908727842), [3](http://davidgiard.com/2011/05/12/DataVisualizationPart5DataInk.aspx), [4](https://www.blue-granite.com/blog/data-visualization-remove-chart-clutter-and-focus-on-the-insights), [5](https://www.idashboards.com/blog/2016/05/19/spring-cleaning-eliminate-the-data-clutter/), [6](http://www.storytellingwithdata.com/blog/2016/3/1/declutter-your-data-visualizations)\n\n\n### Choose an Effective Visual\nAs a warrior choose his weapon depending on the context, you have to wisely choose the chart to use to represent each number you want to communicate.\\\n[Here](https://chartio.com/learn/dashboards-and-charts/what-are-common-chart-types-and-how-to-use-them/) is a list of the most common shapes and ideas to present data.\\\nAs you can see, there are many different graphs and other types of visual displays of information, but a handful will work for the majority of your needs ([please don't use cake charts](https://www.businessinsider.com/pie-charts-are-the-worst-2013-6?IR=T)!).\\\n[Here](https://support.geckoboard.com/hc/en-us/articles/115002929972-How-to-choose-the-right-data-visualization) and [here](https://blog.hubspot.com/marketing/types-of-graphs-for-data-visualization) you have a detailed checklist easy to follow, in order to decide which type of chart suits best for your case.\n\n### Focus your Audience’s Attention\nWithin the brain, there are three types of memory that are important to understand as we design visual communications: [iconic](https://en.wikipedia.org/wiki/Iconic_memory) memory, [short‐term](https://en.wikipedia.org/wiki/Short-term_memory) memory, and [long‐term](https://en.wikipedia.org/wiki/Long-term_memory) memory. What we need to leverage well for our presentations is the iconic one. In fact, she's responsible for the most part of the first impression about what we see, and has by far the most important impact on our perception.\\\n[Here](https://brevitaz.com/data-visualisations/) you find a good explanation about how to understand how to leverage iconic memory.\\\n[Here](https://www.clarityinsights.com/blog/perception-communication) another good read about this topic.\n\n### Think like a Designer\nThe most important principle in design is that \"the design of _____ should be driven by its function\".\\\nImagine a [gladius](https://it.wikipedia.org/wiki/Gladius_hispaniensis), the bread-and-butter weapon of the Roman army: you can _easily understand_ what's his purpose, even if no one told you!\\\nRead [here](https://www.team-consulting.com/insights/design-drivers-what-drives-great-design/) a gentle introduction to design theory, really recommended!\\\n[Here](http://guides.lib.berkeley.edu/data-visualization/design) you find useful design guidelines, and [here](https://uxdesign.cc/designing-a-dashboard-how-to-make-sure-it-will-show-useful-data-23af7e233d21) how to design an effective dashboard. \n\n### Exploring Model visuals\n#### Line Graph\nDespite its simplicity is the most effective chart you can show (remember, less is more!). Probably the most part of the data you have can be presented through a line graph.\\\n[Here](https://www.smartdraw.com/line-graph/) you find how to use its power with awareness. \n\n#### Annotated Line Graph\nLike the previous one, but with annotations that can help readability.\\\n[Here](http://www.storytellingwithdata.com/blog/2018/1/22/88-annotated-line-graphs) you find only 88 examples of that :-)\n\n#### Stacked Bars\nProbably the most effective chart to compare quantities, they were used more than [270 years ago](https://gizmodo.com/these-250-year-old-charts-and-graphs-were-the-very-firs-1445388576)!\\\n[Here](https://www.smashingmagazine.com/2017/03/understanding-stacked-bar-charts/) you find complete guidelines to use them. \n[Here](https://peltiertech.com/excel-3d-charts-charts-with-no-value/) you can understand why is important to keep them as simple as possible, without 3D effects. Really interesting and in-depth read.\n\n#### Positive and Negative Stacked Bars\nWith negative values, you can easily show bad-vs-good performance or in-vs-out flows.\\\n[Here](https://peltiertech.com/diverging-stacked-bar-charts/) a detailed explanation about how and when to use them.\n\n#### Horizontal Stacked Bars\nYou don't need to be a fan of the Flat Earth \"theory\" to use Horizontal bar chart! They're similar to their vertical cousins, but orienting the chart horizontally means the category names along the left are easy to read in the horizontal text.\\\n[Here](https://apexcharts.com/javascript-chart-demos/bar-charts/) a guide about using them.\n[Here](https://depictdatastudio.com/when-to-use-horizontal-bar-charts-vs-vertical-column-charts/) an interesting article that explains when to choose horizontal or vertical bars. \n\n### Storytelling with Data\nWhen you see a great play, watch a captivating movie, or read a fantastic book, you’ve experienced the magic of the story. A good story grabs your attention and takes you on a journey, evoking an emotional response. In the middle of it, you find yourself not wanting to turn away or put it down. After finishing it—a day, a week, or even a month later—you could easily describe it to a friend.\n\nIf you reach this goal in your audience, you've arrived, and you have won the first prize! \n\n- **Find a subject you care about**. It is this genuine caring, and not your games with language, which will be the most compelling and seductive element in your style.\n- **Keep it simple**. Great masters wrote sentences which were almost childlike when their subjects were most profound. “To be or not to be?” asks Shakespeare’s Hamlet. The longest word is three letters.\n- **Choose who to leave behind**. If a sentence or a chart, no matter how excellent, does not illuminate your subject in some new and useful way, scratch it out.\n- **Don't fool people with data**. [These](https://venngage.com/blog/misleading-graphs/) are clear examples of what I'm saying.  \n- **Be clear**. If I broke punctuation, or I bend the meaning of the words (technical and not), I would simply won't be understood.\n- **Pity the readers**. Our audience requires us to be sympathetic and patient teachers, ever willing to simplify and clarify.\n- **Be suggestive**. Try to summon pictures, sounds, and feeling during your stories.\n- **Have a great End**. Leave your audience with a sentence that will be the remainder of your presentation, the most internal core of your topic. The things you want your audience this about when they remember your presentation. \n\nFor other tips and suggestions about storytelling, check my other [Impactful presentation guide](https://github.com/clone95/Virgilio/blob/master/Specializations/SoftSkills/ImpactfulPresentations.md).\n\nSorry, I'm a [DRY principle](https://it.wikipedia.org/wiki/Don%27t_repeat_yourself) hopeless fan.\n\n\n### Data Visualization tools\nI this section I introduce you to the most accessible and well-known tools, that will give you an expendable skill in Data Visualization. \n\n#### Microsoft Excel\nDo a favor to yourself, learn [**Excel now!**](https://www.youtube.com/watch?v=-ujVQzTtxSg&list=PLWPirh4EWFpEpO6NjjWLbKSCb-wx3hMql)\\\nExcel is the swiss-knife for a lot of basic data management, computation, and representation.\\\nDespite its scalability limits, it's still one of the tools that _support companies_ today.\\\nTake [this](https://www.youtube.com/watch?v=RwUSUjRGKVM) course about data visualization with Microsoft Excel.  \n[Here](https://www.keynotesupport.com/excel-basics/excel-charts-beginners.shtml) you have another good one.\\\n[Here](https://www.webucator.com/tutorial/intermediate-microsoft-excel/visualizing-your-data.cfm) you have some exercises to test your skill.\\\n[Here](https://policyviz.com/2017/07/25/my-top-10-data-visualization-excel-websites/) a list of cool websites about Excel visualizations.\n\n#### Matplotlib\n\n[Matplotlib](https://matplotlib.org/) is one of the most used libraries for graphical representation in Python and a lot of other libraries are built on the top of it.\nMy personal opinion about it is that it's not too easy to understand and implement, but today is still relevant to grasp the most out of the tutorials on the Internet. You also have a lot of examples in [StackOverflow](https://stackoverflow.com/).\\\nThe [official beginner's guide](https://matplotlib.org/users/beginner.html) is really complete and contains everything you need to get started and then proficient with the library.\\\n[Here](https://matplotlib.org/Matplotlib.pdf) you have the complete documentation.\\\n[Here](https://pythonspot.com/matplotlib/) another bunch of chart-specific tutorials.\\\n[Here](https://www.machinelearningplus.com/plots/top-50-matplotlib-visualizations-the-master-plots-python/) an ensemble of the 50 most useful visualizations with code.\\\n[Here](http://www.randalolson.com/2014/06/28/how-to-make-beautiful-data-visualizations-in-python-with-matplotlib/) you find advanced charts and the code to realize them.\n[Here](https://www.cheatography.com/gabriellerab/cheat-sheets/matplotlib-pyplot/) an handy cheat-sheet.\n\nChallenge yourself:\n- [1](http://www.ceda.ac.uk/static/media/uploads/ncas-reading-2015/matplotlib_exercises_solutions.pdf), [2](https://pynative.com/python-matplotlib-exercise/), [3](https://anaconda.org/gwinnen/matplotlib-exercises/notebook), [4](https://www.w3resource.com/graphics/matplotlib/)\n\nBest Practices\n- [1](https://www.scivision.dev/best-practices-for-matplotlib-plots/), [2](https://www.quora.com/What-are-some-best-practices-for-matplotlib-to-improve-the-quality-and-appearance-of-your-graphs-and-plots), [3](https://stackoverflow.com/questions/18059269/best-practices-to-write-function-embedding-matplotlib-plot-call), [4](https://matplotlib.org/tutorials/introductory/lifecycle.html)\n\n#### Seaborn\nAs your brain is fascinated by the beauty in humans, art, or cute puppies, it is by beautiful visualizations. A common library **built on top of Matplotlib** is [Seaborn](https://seaborn.pydata.org/). It's used to enhance Matplotlib charts, so you need to become comfortable with the \"mother library\" first.\\\nFollow [this](https://www.youtube.com/playlist?list=PL998lXKj66MpNd0_XkEXwzTGPxY2jYM2d) Youtube tutorial, it covers the most you need to get started with it.\\\nThen read [this](https://stepupanalytics.com/introduction-to-python-for-data-visualization-with-seaborn/) long and complete blog post.\\\n[Here](https://www.kaggle.com/kanncaa1/seaborn-tutorial-for-beginners) you find another long tutorial for beginners. \n\nChallenge yourself: [1](https://anaconda.org/gwinnen/seaborn-exercises/notebook), [2](http://unsupervisedlearning.co.uk/2017/11/08/seaborn-exercises-solutions/), [3](https://www.codecademy.com/courses/learn-seaborn/lessons/seaborn-distributions/exercises/box-plots-ii), [4](https://anaconda.org/gwinnen/seaborn-exercises/notebook)\n\nBest practices: [1](http://walkerke.github.io/geog30323/slides/data-visualization/), [2](https://mode.com/resources/analytics-dispatch/data-visualization-best-practices/), [3](https://www.datacamp.com/courses/improving-your-data-visualizations-in-python), \n\nAdditional examples: [1](https://python-graph-gallery.com/category/seaborn/), [2](https://jakevdp.github.io/PythonDataScienceHandbook/04.14-visualization-with-seaborn.html), [3](https://towardsdatascience.com/data-visualization-using-seaborn-fc24db95a850), [4](https://www.kaggle.com/mchirico/plotly-seaborn-examples)\n\n#### Bokeh\nFrom the [Bokeh](http://bokeh.pydata.org/en/latest/) documentation:\n\n>Bokeh is an interactive visualization library that targets modern web browsers for presentation. Its goal is to provide elegant, concise construction of versatile graphics, and to extend this capability with high-performance interactivity over very large or streaming datasets. Bokeh can help anyone who would like to quickly and easily create interactive plots, dashboards, and data applications.\n\nBokeh prides itself on being a library for interactive data visualization.\n\nUnlike popular counterparts in the Python visualization space, like Matplotlib and Seaborn, Bokeh renders its graphics using HTML and JavaScript. This makes it a great candidate for building interactive web-based dashboards and applications. \n\nBut what's the real difference among Bokeh, Matplotlib and Seaborn?\n\nAs a comment in this Reddit [thread](https://www.reddit.com/r/Python/comments/4tuwoz/how_do_you_decide_between_the_plotting_libraries/) says: \n\nEach library has its own distinct purpose:\n\nMatplotlib is for basic plotting -- bars, pies, lines, scatter plots, etc.\n\nSeaborn is for statistical visualization -- use it if you're creating heatmaps or somehow summarizing your data and still want to show the distribution of your data\n\nBokeh is for interactive visualization -- if your data is so complex (or you haven't yet found the \"message\" in your data), then use Bokeh to create interactive visualizations that will allow your viewers to explore the data themselves.\n\n[Here](https://mybinder.org/v2/gh/bokeh/bokeh-notebooks/master?filepath=tutorial%2F00%20-%20Introduction%20and%20Setup.ipynb) you have the official tutorial. It covers pretty everything you need to know, go through it. It contains exercises too.\\\n[Here](http://bokeh.pydata.org/en/latest/docs/user_guide.html) you have the official user guide.\n\nAnother list of useful additional tutorials: [1](https://towardsdatascience.com/data-visualization-with-bokeh-in-python-part-one-getting-started-a11655a467d4), [2](https://realpython.com/python-data-visualization-bokeh/), [3](https://towardsdatascience.com/data-visualization-with-bokeh-in-python-part-one-getting-started-a11655a467d4)\n\nAdditional examples: [1](https://www.journaldev.com/19527/bokeh-python-data-visualization), [2](https://programminghistorian.org/en/lessons/visualizing-with-bokeh), [3](https://www.analyticsvidhya.com/blog/2015/08/interactive-data-visualization-library-python-bokeh/), [4](https://www.geeksforgeeks.org/python-data-visualization-using-bokeh/), [5](https://github.com/bokeh/bokeh/tree/master/examples)\n\n#### Power BI\n[Power Bi](https://powerbi.microsoft.com/it-it/) is a super cool tool from Microsoft, used mostly in Business Intelligence to build relationships among data, cleaning and visualizing them in wonderful interactive dashboards. The thing that I love of Power BI is that's free for personal usage and very cheap for enterprise purposes. It's also super easy to use.\\\nCheck [this](https://www.youtube.com/watch?v=gqO0EiCn4cY) tutorial for beginners and then explore the official [Guided Learning](https://docs.microsoft.com/en-us/power-bi/guided-learning/), they have a lot of step-by-step tutorials and side projects to challenge yourself. \n\nGood additional resources to follow: [1](https://www.youtube.com/user/mspowerbi), [2](https://www.youtube.com/channel/UCFp1vaKzpfvoGai0vE5VJ0w), [3](https://www.youtube.com/channel/UC-h-wArcxJC8zBOD-UxfCOg), [4](https://www.youtube.com/channel/UCaTn-yDjPDvf-1CtJJHTNcQ), [5](https://www.youtube.com/user/ModernExcel)\n\nBest practices: [1](https://www.c-sharpcorner.com/article/power-bi-best-practices-part-3/), [2](https://docs.microsoft.com/it-it/power-bi/visuals/power-bi-visualization-best-practices), [3](https://community.powerbi.com/t5/Community-Blog/Best-Practices-For-Power-BI-Desktop-Development/ba-p/521710), [4](https://www.c-sharpcorner.com/article/power-bi-best-practices-part-3/), [5](https://powerpivotpro.com/2017/06/top-5-power-bi-visual-design-practices-transforming-good-great/)\n\n### Take Inspiration\nThe best way you can get self-confident with data visualization is to watch, watch, and watch data visualization.\nI put here plenty of resources where you can take inspiration and ideas from.\n\nWebsites: [1](https://www.idashboards.com/blog/2018/07/06/get-inspired-19-inspiring-data-viz-designs/), [2](https://medium.com/@Infogram/18-data-visualization-resources-for-education-and-inspiration-529c6f528983), [3](https://www.pinterest.it/stevenschillema/data-visualization-inspiration/?lp=true), [4](https://www.designyourway.net/blog/inspiration/data-visualization-designs-that-should-inspire-you-23-infographics/), [5](https://www.awwwards.com/websites/data-visualization/), [6](https://mode.com/resources/analytics-dispatch/data-visualization-examples/), [7](https://visme.co/blog/examples-data-visualizations/), [8](https://datavizproject.com/)\n\nBonus point!\nTry [Google Facets](https://pair-code.github.io/facets/), a super useful web-tool for fast visualizations. It's really EASY to use, and you can upload your dataset and get the first insights from it. It's also awesome for showing data to not-technical people.\n\n### Storytelling with Data\nI can't stress more on this point. When you prepare data visualizations, focus on a story to tell to your audience.\\\nThis approach has several [proven and positive](https://www.dataplusscience.com/files/Kosara_Computer_2013.pdf) effects.\\\n[**Definitely check this**](https://www.slideshare.net/kris77chan/edward-segel-interactivestorytelling), is the best resource I've ever found on this concept applied in data visualization.\\\n[Here](http://www.nickdiakopoulos.com/2013/04/12/storytelling-with-data-what-are-the-impacts-on-the-audience/) you find a good article that explains _why_.\\\n[Here](https://www.slideshare.net/kris77chan/edward-segel-interactivestorytelling)'s a great presentation about storytelling with data.\\\n[Here](https://www.forbes.com/sites/brentdykes/2016/03/31/data-storytelling-the-essential-data-science-skill-everyone-needs/#202002b852ad) another interesting read.\n\n### Common Visualization Mistakes\nFrom an old Chinese statement:\n> Look at the other's mistakes, and correct your ones.\n\nTo know what are the most frequent mistakes is fundamental to master a skill, so I list here for you a bunch of resources that will give you the awareness of the \"Don't\"s in data visualization:\n\n- [1](https://www.anychart.com/blog/2017/08/29/data-visualization-mistakes-avoid/), [2](https://undullify.com/data-visualization-102-common-mistakes-visualizing-data/), [3](https://www.rtinsights.com/what-are-the-5-most-common-data-visualization-mistakes/), [4](https://thenextweb.com/dd/2015/05/15/7-most-common-data-visualization-mistakes/), [5](https://www.reddit.com/r/datascience/comments/8wj1nr/play_your_charts_right_an_illustrated_collection/)\n\n### Additional Resources\nI really love data visualization and during the last years, I've collected a lot of cool websites and \"need-to-bookmark\" places. I've already given you a lot of them, here I list everything else is remaining.\n\n- [Data is Beautiful SubReddit](https://www.reddit.com/r/dataisbeautiful/)\n- [Analytics SubReddit](https://www.reddit.com/r/dataviz/)\n- [The Pudding](https://pudding.cool/)\n- [Flow Data](https://flowingdata.com/)\n- [Small Multiples](https://smallmultiples.com.au/projects/)\n- [Awesome Interactive Journalism](https://github.com/wbkd/awesome-interactive-journalism)\n- [EdwardTufte Twitter account](https://twitter.com/EdwardTufte)\n- [Fivethirtyeight](https://fivethirtyeight.com/)\n- [List of super cool websites](https://www.reddit.com/r/dataisbeautiful/comments/435g7b/i_love_live_data_visualizations_heres_every_one/)\n- [Every line of Hamilton](https://pudding.cool/2017/03/hamilton/)\n- [Storytelling with Data blog](http://www.storytellingwithdata.com/)\n\n### Conclusions\nIn this guide we've tried to list a map of the most useful resources about data visualization (after searching and compared a lot of them), trying to give you a reference point of the subject.\\\nYou know that the only way to become really comfortable with something is to face it in the first person. So the best tip I can give you is \"find your project\". \n\n- Choose an argument that interests you in some way. You can find a lot o free public dataset to experiment with. Check your country websites or enter [Kaggle](https://www.kaggle.com/) or  [UCI](https://archive.ics.uci.edu/ml/index.php) to find a lot of them. \n- Plot the data in every way you can experiment, applying the techniques you have seen.\n- Inspire yourself watching how people visualized similar datasets. Search in Kaggle for \"Visualization\" and you'll be stunned by the number of examples.\n\nIt's better to be proficient in one tool and barely know other ones, than being the jack of all trades but masters of none. So, I suggest you choose the tool that inspires you more and diving deep into that. In fact, the tools we've seen overlap with each other in many ways, but they are different in scale and approach.\n\n"
  },
  {
    "path": "content/purgatorio/define-the-scope-and-ask-questions/frame-the-problem.md",
    "content": "---\ntitle: Frame the Problem\nauthor: clone95\ndescription: Understand which kind of problem you want to solve and define the scope of the project. In particular, we will see what questions to ask ourselves when framing a problem on the basis of the data available to us, and then how to identify the objective.\n---\n\n# Index\n- [Recap of ML systems](#Recap-of-ML-systems)\n- [Understand the data](#Understand-the-data)\n- [Set objectives and scope](#Set-objectives-and-scope)\n- [Conclusions](#Conclusions)\n\nLet's dive right in!\n\n## Recap of ML systems\n\nThe process of Data Science, i.e. the extraction of knowledge and decisions from a set of data, is composed of several steps. Simplifying as much as possible, we try to frame the problem we want to solve, then we study the data available, then we create models (Machine Learning models) that are used to make predictions or estimates.\n \nThe definition of the problem is the first phase and also guides all the choices of design, implementation, and integration that will come later during the project. \n\nIn particular, it is fundamental to classify the type of forecast you want to obtain once you have built the Machine Learning models: what _kind of prediction_ should the system make? \nShould it predict a number or a label?\nOr will it have to group new data with those most similar to it?\nOr should he predict the next content to be recommended to a user?\n\nAs we saw in the guide [Introduction to ML systems](../../paradiso/introduction-to-ml.md), there are various ways to classify a problem related to data and learning from them, and in particular, the most important classification to frame the problem is as follows: **is the problem a supervised or unsupervised learning task?**\n\nA supervised problem is a problem in which the data we want to learn from are \"labeled\": for example, images labeled according to their content, or the data of a loan applicant who knows how many times he managed to repay the debt or not. \n\nBy \"showing\" a Machine Learning algorithm so many examples, we hope that it will be able to generalize to new cases never seen before and predict the right label (not necessarily a specific class, it could even be a number).\n\nAn unsupervised problem is without these labels, and our \"learning from data\" is usually about finding similarities between the various elements of the dataset and grouping them (clustering and other unsupervised learning techniques).\n\nThe type of problem we will focus on in the Purgatory guides is the \"supervised\" type, which are the most common problems and those faced by neural networks (very powerful and flexible Machine Learning algorithms).\n\nWe will see in the [Machine Learning Theory](../select-and-train-machine-learning-models/machine-learning-theory.md) guide also some methods to deal with unsupervised problems.\n\nAfter this summary, let's see what questions we ask ourselves (and which we ask the experts of the domain) to frame a data problem.\n\nThe first thing to do when dealing with a new problem is to understand what kind of data I have available. Remember, without data you're not going anywhere!\n\n## Understand the data\n\nThe first thing to do, whether you are carrying out a project of corporate scope or for yourself, is to understand what kind of data you have available: the process then requires you to start from the data to formulate a problem, not the other way around! \n\nAs widely explained in Paradise, good-quality data is the only thing really necessary for quality of the Machine Learning system you want to train.\n\nWhen we look at the data we should ask ourselves the following questions:\n\n- **What are we supposed to do this with this data?**\n\n  This may sound like a stupid question, but we shouldn't assume that our aim is to cover the whole process of Data Science, from data collection to the creation of predictive models of Machine Learning. \n  Maybe what we have to do is just a sub-stage of the ones that make up the complete process. For example, we may just have to clean up the data and format it well, or analyze it and report back to other considerations about it. \n  Or we might just have to do some statistics on them to observe six phenomena, so avoid the part of creating the model. Nobody wants to waste time doing things that are not necessary!\n\n- **What form do the data take?**\n\n  The data we have at our disposal can be of a completely different type:\n\n  - **tabular data:** \n  As the name indicates, data extracted from database tables (not necessarily relational). They are data organized in rows, have attributes, and generally a way to identify them uniquely. The rows are divided into fields, which in turn can contain various types of data (numeric, textual, links to images). This type of data is also called \"structured\".\n  For example, I could have a database that collects user names, their ages, and associated tweets, in which case I would have tabular data that includes both text data (names and tweets) and numerical data (age). \n  \n  - **text:** \n  For example, application logs, tweets, textbooks. We can consider textual data all that is made up of characters. Text data can then be inserted in the context of tabular data, as a separate field.\n  \n  - **categorical:**\n  Categorical data is a subset of textual data: it does not contain information about the language, as a tweet could do, and often it is not even a sentence. For example, they could be \"Red\" or \"Expired\" and are considered _labels_ rather than text data.\n  \n  - **numerical:**\n  Numerical data is any type of data [calculated from a computer](https://www.pythonforbeginners.com/code/numeric-types-python): Integers, floats, doubles, etc.\nThey can be continuous (e.g. temperature in degrees) or discrete (evaluation of a product). In the first case, the accuracy of the data measurement determines the type of numerical data used (usually float). \n\n  - **audio:**\n  Audio files can be of [various formats](https://www.makeuseof.com/tag/audio-file-format-right-needs/), which greatly influence the resolution (and therefore the amount of information they contain). They can be phone recorded conversations, for example, customer care, or environmental sounds, or even animal sounds. \n  \n  - **images:**\n  Images can be presented in [various formats](https://www.google.com/search?q=images+format&oq=images+format&aqs=chrome..69i57j0l5.1643j1j7&sourceid=chrome&ie=UTF-8), which affect the maximum resolution and number of colors of the image (RGB or B&W). Images have the characteristic of being very rich in information, so often there is the problem of storage, and reading/writing them on disk can be a costly operation. \nImage data often has the advantage that with some scraping trick (downloading data from the Internet) you can enlarge the datasets and thus improve the performance of Machine Learning models.\n\n  - **videos:**\n  Videos can be classified into two types: streaming (in real-time) and recorded (saved on disk). \nVideos are a fairly complex format to handle and extremely heavy from a storage point of view, so it is recommended not to start from this type of data if you are a beginner. \n  \n  - **time series:**\n  Time-series is a collection of data about events in time.\n  This kind of data consists of historical series, such as the series of surveys of a sensor, or the history of the interactions of a social user. This type of data is useful to predict future behavior based on previous observations, such as predict whether a machine is about to break or if a user will buy a certain product.\nTime series have the concept of granularity, which is the amount of time between measurements:\nfor example, we can have daily or annual data, or even a new example recorded every microsecond.\n\n\n- **Do we know the data is raw or unclean?**\n\nBy _raw_ we mean the data as we come into possession of it. These can be clean and well-structured, or dirty and to be cleaned. \n\nIn general, real-world data is hardly ever clean and tidy. \n\nThere may be a lack of values, they may be unstructured, they may be superficially collected! They may be of low quality (e.g. an audio file with noise) or have useless information. So generally you always have to think about the raw form in which we have the data, and what cleaning steps will be needed to make it usable by Machine Learning models. This phase (called data cleaning or data preprocessing) is vital during the Data Science process, and is often spent like this [80 percent of a Data Scientist's time](https://www.reddit.com/r/datascience/comments/bupmyf/data_scientists_spend_up_to_80_of_time_on_data/). In the Purgatorio section \"Work with data\" there is an entire guide dedicated to data cleaning.\n\n- **Are the data labeled or not?**\n\nFrom this StackOverflow [thread](https://stackoverflow.com/questions/19170603/what-is-the-difference-between-labeled-and-unlabeled-data):\n\nTypically, unlabeled data consists of samples of natural or human-created artifacts that you can obtain relatively easily from the world. Some examples of unlabeled data might include photos, audio recordings, videos, news articles, tweets, x-rays (if you were working on a medical application), etc. There is no \"explanation\" for each piece of unlabeled data -- it just contains the data, and nothing else.\n\nLabeled data typically takes a set of unlabeled data and augments each piece of that unlabeled data with some sort of meaningful \"tag,\" \"label,\" or \"class\" that is somehow informative or desirable to know. For example, labels for the above types of unlabeled data might be whether this photo contains a horse or a cow, which words were uttered in this audio recording, what type of action is being performed in this video, what the topic of this news article is, what the overall sentiment of this tweet is, whether the dot in this x-ray is a tumor, etc.\n\nMaking Machine Learning models that learn from labeled data means formulating a \"supervised\" problem, while with unlabeled data the problem is called an \"unsupervised\" problem. \n\n- **If they aren't labeled, is it possible to label them?**\n\nThe most powerful results of ML applications (vision, language understanding) require huge amounts of labeled data, and that the labeling issue is known as the biggest bottleneck of modern ML applications. How long does it take to manually classify 100,000 documents, even if you just have to choose between \"Type A\" and \"Type B\"?\nLabeling is a tiring and often tedious job, and it takes a lot of time to be done well.\n\nServices like AWS [Amazon Mechanical Turk](https://www.mturk.com/) or the Google [AI Platform Data Labeling Service](https://cloud.google.com/data-labeling/docs/) (like many other tech vendors) provide distributed groups of workers with instructions on how to label a dataset. \n\nThere are also free tools ([Annotorius](https://recogito.github.io/annotorious/), [LabelMe](http://labelme.csail.mit.edu/Release3.0/), [LabelBox](https://labelbox.com/)) that allow you to label yourself or work with a team. It's time to call your little brother and promise him 1 cookie for every 10 tagged examples.\n\nOften labeling a dataset is a complex and expensive issue, and its qualitative success is crucial to the success of the project. \n\nIn this [article](https://www.kdnuggets.com/2017/06/acquiring-quality-labeled-training-data.html)\n you can find 7 additional ideas to lower the cost of your labeling efforts.\n\n- **How reliable are the labels?**\n\nTo obtain high-performance Machine Learning systems it is clear that large amounts of data are needed. However, it is equally important that **the data is correct**, especially in supervised learning applications. Even if you have a lot of examples in your dataset, you could do very little to get acceptable performance from the ML models trained on them, if the data quality is low.\n\nThe intrinsic noise of the dataset _is impossible to eliminate_ and will affect both the training phase of the model and in the phase of predictions of new examples as well. \n\n_Entrusting labeling to working groups distributed through the services of large tech vendors requires that the labeling task must be simple._\n\nIt is rather simple to distinguish between categories of clearly visible animals or the colors of a dress or simple sounds (if clear labeling instructions are provided), it is very difficult to distinguish for example various different species of birds, or the words of a specific language (for someone who doesn't know the language).\n\nSome labeling tasks are simply not obtainable through \"crowd-labeling\", such as diagnosing medical images or classifying complex documents, which require a deep knowledge of the domain, and a lot of practical experience. \n\n- **Is it possible to put the data altogether?**\n\nOften the data sources from which the data comes are heterogeneous and fragmented: a company often divides its data into \"silos\", making a silo for each business process. Or in general, we may have to merge several datasets and figure out how to do it. \nDoes this lead to the question: do the data have the same format? Do they refer to the same period or to different times? Have they been collected in the same way? \n\n- **Is this sensitive data?**\n\nOften the public datasets that are used for ML applications do not contain sensitive data (such as identity, medical records, crimes), but sometimes when we work with real-world data they carry with them sensitive information, and we have to worry about managing it. Unless you need to develop an ML application to customize your user experience (and therefore personal data is critical), you can generally delete it without too much trouble.\n\nFor example, you can \"make anonymous\" a dataset of medical records (or X-ray images) by deleting the names and details of patients.\n\nIf I want to train a bone fracture classifier, I don't need to know who the skeleton in question belongs to! (Or rather, it could be useful and additional information, but it is not essential).\n\n- **Can we achieve our goal with this data after cleaning and processing it?**\n\nThis question is very general and difficult to answer, especially for a novice! But we must try to imagine: after having cleaned and prepared the data, will their final form be \"learned\" by an algorithm? To learn how to answer this question, the only solution is to gain experience.\n\nSo it means that it will happen many times that maybe we work on the data and clean it, and then we realize that there are no satisfactory methods to learn from them and get acceptable results.\n\nBut don't despair! Every time you make this kind of \"mistake\" (inability to assess a-priori the feasibility of an ML application) you learn a lot, and soon you'll be able to assess in advance if your efforts will be well rewarded, before spending whole nights labeling examples! \n\n- **_How much_ data is there (number of examples, storage requirements)?**\n\nThe more data you have, the better. How many times have we already repeated it? \nKnowing how much data you have available is crucial, and understanding how much data you need (about) to make an ML algorithm learn satisfactorily is even more important. Often the examples have to be in the tens of thousands range to get enough satisfying results, but the state of the art can usually only be achieved with hundreds of thousands of examples.\n\nThis number, however, is very empirical, strongly depends on the complexity of the task, and can be reduced through the use of Transfer Learning (which uses pre-trained models and \"adjusts\" them slightly). \n\n- **Can we augment the dataset?**\n\nThere are many ways to get more data than you have. We will see in the next technical guides both of data collection (scraping, search engines) and techniques of \"data augmentation\" that allow increasing the size of the dataset. For example, suppose we have a dataset of 10,000 images of fruit. We could add the images themselves but slightly transformed, with small rotations, cuts, or fields of contrast and brightness. \n\nAdding completely new data generally helps the algorithm to generalize better with data it has never seen, while doing \"data augmentation\" generally increases the robustness of the system (it tends to be less wrong because of distortions or low quality of the example it is examining).\n\nIf we answer these questions, we should have a clear picture of what data we have available.\n\nWe can now proceed to the definition of the problem.\n\n## Set objectives and scope\n\nLike any other software project, a data science project needs to have a clear goal to reach.\n\nFormulating this objective is crucial for various reasons:\n- the success of the project\n- the measurability of the success of the project\n- setting a clear target does not create too high an expectation\n\nI suggest that you use the SMART methodology for projects, which consists of formulating them in a way:\n\n- **S**pecific\n- **M**easurable\n- **A**ttainable\n- **R**elevant\n- **T**ime-framed\n\nIn particular, defining the scope of the project is fundamental. The scope is the size of the project, the number of components of which it is composed.\n\nProjects often fail because you don't have a clear scope and you continue to add more components until you have lost sight of the initial goal.\n\nFor example: \n- \"I want to build a user interface that understands the natural language and interacts with the user\" is too generic. \n- \"I want to build a user interface that can take orders from the pizzeria and organize them according to the arrival time\" is a much more defined scope.\n\nAnother example:\n- \"This system must help us classify all the new data that arrives\"\nis too generic.\n- \"This system must classify the images that users send us according to the color of the object photographed\" is specific.\n\nTrying to formulate the problem in a \"SMART\" way helps you not to lose sight of the objective, not to set yourself unattainable objectives, to reach them in time and above all to realize if you are working well or badly (measurability). We will see in the next guide \"Choose the metrics\" how this aspect is fundamental.\n\nHighly recommended reading the [original paper](https://community.mis.temple.edu/mis0855002fall2015/files/2015/10/S.M.A.R.T-Way-Management-Review.pdf) of the SMART projects.\n\n[This mini-course from **Google**](https://developers.google.com/machine-learning/problem-framing/) will help you frame your problem. Do it.\n\n[This](https://www.youtube.com/watch?v=Jn8c3oe_GWU) is a very good example of framing an NLP (Natural Language Processing) project. Take a look at the entire Kaggle youtube channel, there's a lot of learning material!\n\n---\n\n# Conclusions\n\nIn general, it is extremely useful to produce a document summarising all the answers to the questions, so as to provide a clear view of the project as a whole, what are the final objectives, and the most important characteristics for the system. \n\nThis list is not exhaustive, and as you get a question in your head you feel free to pull a request to this file. \n\nA Virgilio member will take over your request and enrich this guide with your contribution.\n\nIn the next guide [usage and integration](usage-and-integration.md) we will see other key questions we have to think about, like the usage of the system, its integration, and more!\n"
  },
  {
    "path": "content/purgatorio/define-the-scope-and-ask-questions/starting-a-data-project.md",
    "content": "---\ntitle: Starting a Data Project\nauthor: clone95\ndescription: Learn to look for sources that can help you solve the problem, build the project structure, build good documentation, and secure your code.\n---\n\n# Index\n- [Collect Information](#Hunting-for-Information)\n- [Building a Knowledge Tree](#Building-a-Knowledge-Tree)\n- [Choosing a Project Structure](#Choosing-a-Project-Structure)\n- [Reproducibility](#Reproducibility)\n- [Versioning](#Versioning)\n- [Documentation](#Documentation)\n\nLet's dive right in!\n \n \n## Collect Information\nA vital phase when starting a project is to search for information that can help you. These can be of any kind:\n- Tutorials\n- Documentation\n- Existing projects\n- Research Papers\n- ...\n\nThis guide will not teach you how to use [Google](https://www.google.com/), because you will already know if you are reading these lines :D \n\nBy the way, probably not everyone knows about [**these Google tricks**](https://smallbiztrends.com/2019/03/google-tricks.html)...\n\nBut there are a few tips that can come in handy when you start \"amassing\" knowledge that will then come in handy.\n\nIn this guide, we'll make heavy use of a collection of awesome best practices from the [PLOS | Public Library of Science](https://www.plos.org/). \n\nDo you know the joy when you find a _giant diamond cluster in Minecraft_? \n\nIf yes, you need to know that you've just hit a big one:\ntake your time to explore the [**Ten Rules Collection**](https://collections.plos.org/ten-simple-rules).\n\n### Understand what you're looking for\n\nThe first thing to do when dealing with a new problem is to make sure you're looking for the right things. Are you sure the problem is called that for example? Image segmentation is different from image classification! [This Google guide](https://developers.google.com/machine-learning/problem-framing/cases) can help you be sure of the name of your problem.\n\nThis may seem trivial, but many useful resources are not found because the correct keywords are not typed into the search engine.\n\nConsider the use of the [5 Whys technique](https://en.wikipedia.org/wiki/Five_whys) to better understand the problem you're trying to solve.\n\n### Don't re-invent the wheel\nAre you sure that someone hasn't already solved your problem? In that case, if you needed it to solve a real problem you'd already have the dish ready, while if you're doing it to learn you have a base from which to start! Also, observing the code of others is very effective for learning.\nIn the latter case, it is still advisable to try to re-implement the solution.\n\nTo look if someone has solved the same problem the first place to look is [Github](https://github.com/), the platform where every developer puts Open Source code. \nAnother interesting place can be [Kaggle](https://www.kaggle.com/), the site of the Data Science challenges, where thousands of practitioners and experts challenge each other on real problems, and whose works are available in the form of Notebooks.\n\nLet's suppose for example that I want to solve a problem related to time series: I can type on Kaggle \"analysis of time series\" and I will probably find dozens of Notebooks that show how to solve a similar problem, and from which you can observe the approach. What a great source of inspiration!\n\nAlso check out [TensorFlow Hub](https://www.tensorflow.org/hub), [ModelZoo](https://modelzoo.co/) and [Papers with Code](https://paperswithcode.com/). These three platforms are full of pre-trained models that can come in handy, or even solve your problem already! :) \n\n### Find communities\nJoin communities of people interested in the topic (e.g. [Reddit](https://www.reddit.com)): here you can find discussions, search by keywords (e.g. \"time series analysis\"), and ask questions, with experts who will answer and help you. \n\nTry to form specific, well-written questions, to minimize the time used by the respondent. For example, the question \"how do I analyze a time series?\" is too general, and a short Google search is all it takes to get the answer. \n\nInstead, a question like \"to analyze a time series and train a model that predicts 2 steps forward in the future, is it better to approach X or approach Y?\".\n\nIf the questions are too general or show laziness they'll likely remain unanswered...\n\nSome subreddits you can subscribe to are:\n\n- [r/MachineLearning](https://www.reddit.com/r/MachineLearning/)\n- [r/LearnMachineLearning](https://www.reddit.com/r/learnmachinelearning/)\n- [r/DeepLearning](https://www.reddit.com/r/deeplearning/)\n- [r/DataScience](https://www.reddit.com/r/datascience/)\n- [r/LearnDataScience](https://www.reddit.com/r/learndatascience/)\n\nTwo other good places to post (well structured) questions are:\n- [HackerNews](https://news.ycombinator.com/)\n- [Quora](https://www.quora.com/)\n\n## Building a Knowledge Tree\n\nGiven the speed of scientific research in the world of data, every day a new approach to your problem could be discovered that proposes a much better solution than the previous one. The only way to get up to date is to read research papers! \n\n_Reading papers is difficult though, they are often full of mathematical, and statistical concepts, with complex theories._ The important thing, however, is to be able to understand the concepts, and maybe try to apply them to your problem. \n\nAlso often remember that [Papers With Code](https://paperswithcode.com/) collects the code to implement (almost) any paper! \n\nOften already after a couple of days from the release, there is code available in various frameworks, ready to be tried on your problem. \n\nHowever, when you are confronted for the first time with a new problem _you do not know which paper to start with_, also because usually, the papers refer to all previous papers that have tried to solve the same problem, and assume that the reader has some kind of knowledge about the problem.\n\nSo what to do?\n\nUse the **Papers Tree strategy**:\n\n- Find the last survey paper about the sub-field of Data Science you're trying to solve \n- Read carefully this paper, and understand which are the foundations and try to figure out which are the most important papers the sub-field is based on. Usually, the history of the field is covered, citing the most important papers, and this gives you an overview of which were the important steps of the research, up to the state of the art in the approach to the problem.\n\nFollowing the example above, this paper -> [A Survey of the Recent Architectures of Deep Convolutional Neural Networks](https://arxiv.org/abs/1901.06032) contains a detailed map of the most important papers on **convolutional neural networks** (neural networks that work well with images and videos) and their evolutions, up to the most advanced architectures. \n\nNow you just have to look for the most important (or interesting) papers mentioned, organized in a time-aware tree!\n\nA good practice is to use [Zotero](https://www.zotero.org/), a document manager that allows you to keep track of all your research papers.\n\nYou can then repeat this process in a more specific way, for example by looking for a survey paper on convolutional networks applied to the diagnosis of medical images. \n\nOnce you collected the most important papers for your research, document your exploration!\n\nTools like [MindMup](https://www.mindmup.com/) can help you in this task. \n\nConsider the [Rhizomaps](http://spdrdng.com/posts/rhizomapping-rhizomaps-rhizomatic-learning-mindmapping-speed-reading-tip-17-take-notes-with-mindmaps-and-rhizomaps) approach too, it really helps in dumping our thoughts on paper.\n\n\n::: warning\nBefore reading any paper [**read this!**](https://web.stanford.edu/class/ee384m/Handouts/HowtoReadPaper.pdf)\n:::\n\nIt's a paper that explains how to read a paper. **Yes, Virgilio loves recursion.**\n\n## Choosing a Project Structure\nChoosing a project structure is vital to managing the complexities that result from the evolution of the project. Without a clear structure, you'll find yourself with randomly scattered files, dataset versions with similar names, so much so that it hurts your head! \n\n**Well organized code tends to be self-documenting in that the organization itself provides context for your code without much overhead.**\n\nPeople will thank you for this because they can:\n\n- Collaborate more easily with you on this analysis\n- Learn from your analysis about the process and the domain\n- Feel confident in the conclusions at which the project arrives\n\n::: tip\nBut the first person to thank the ordered project structure is **you**!\n\nWhen we look at the code we wrote months ago, we often don't remember anything! \n:::\n\n> \"Mmmm... I don't remember if the good file was analysis.py, analysis_final.py, analysis_1.py\" :D\n\nFor these reasons, good people have developed a fantastic project, [**Cookiecutter**](https://drivendata.github.io/cookiecutter-data-science/), which wants to standardize the structure of projects by providing a sensible and flexible template. \n\nTo create the project skeleton just install the package:\n```\npip install cookiecutter\n```\n\nand then use:\n\n```\ncookiecutter https://github.com/drivendata/cookiecutter-data-science\n```\n\nYou can customize the template according to your needs, just clone the repo, modify it, and then use:\n\n```\ncookiecutter https://github.com/...... your-repo .....\n```\n\nCookiecutter projects have the following structure:\n\n![Figure 1-1](./cookiecutter.png)\n\n[Here](https://drivendata.github.io/cookiecutter-data-science/) you can find how to use it and the motivations behind the structure choices, and [here](https://cookiecutter.readthedocs.io) you can find the docs.\n\n\n### Metadata and file names\nAnother important issue with regard to the overall order of the project and the management of its complexity is the management of the data and metadata associated with them. \n\n[**This awesome cheatsheet**](https://www.axiomdatascience.com/best-practices/DataManagementCheatSheet.html) contains everything you need to know about **data management and file names best practices**: keep it under your pillow!\n\n\n## Reproducibility\n\nWhy are we talking about [**reproducibility**](https://en.wikipedia.org/wiki/Reproducibility)? \n\nThe field name in the Data **Science** indicates that the work process is scientific (Data Science, even with software as a component, is not pure software, which is reproducible by definition).\n\nFrom [this article](https://towardsdatascience.com/data-sciences-reproducibility-crisis-b87792d88513):\n> Reproducible experiments are the foundation of every scientific field and, indeed, even the scientific method itself.\n\n Karl Popper said it best in [The Logic of Scientific Discovery](http://strangebeautiful.com/other-texts/popper-logic-scientific-discovery.pdf): “non-reproducible single occurrences are of no significance to science.” \n\nIf you’re the only person in the world who can achieve a particular result, others may find it difficult to trust you, especially if they have spent time and effort attempting to reproduce your work. \n\nIt is reckless and irresponsible to build a product or theory on a singular unconfirmed anecdote, and if you present anecdote as a reliable phenomenon, it can consume time and resources that would otherwise be spent on actual productive work.\n\nReproducibility has a number of indirect advantages, in addition to being sure to present good results (analysis or model predictions):\n\n- It saves time in various ways, for example by saving the intermediate steps of data processing and cleaning, so that you don't have to redo all the steps\n- Allows you to automate various parts of the project workflow\n- Allows others to reproduce results\n- Allows others to understand each phase without confusion\n- Reproducible design is easier to document\n- Allows you to take over the project after months or years, and be sure to get the most out of it\n\nHere you can find articles and papers that explain to you how to ensure a high reproducibility across all the phases of the project:\n\n- [Reproducibility in Science](https://ropensci.github.io/reproducibility-guide/)\n- [Replicability is not Reproducibility: Nor is it Good Science](http://cogprints.org/7691/7/ICMLws09.pdf)\n- [Best Practices for Reproducible, Collaborative Data Science (Video)](https://www.youtube.com/watch?v=vP9Iup8xhKA)\n\nOnce you've walked through the above resources, you'll be equipped with best practices to ensure that your code will be highly reproducible, and again, people will be grateful to you! \n\n**Especially, the future yourself will be happy in finding reproducible and automated results, months later or years !!!**\n\n**Must read:**\n- [**Ten Simple Rules for Reproducible Computational Research**](http://dx.plos.org/10.1371/journal.pcbi.1003285)\n- [**Ten Simple Rules for Reproducible Research in Jupyter Notebooks**](https://arxiv.org/ftp/arxiv/papers/1810/1810.08055.pdf)\n\n## Versioning\n\nIn order to make reproducible projects, and also for peace in the heart of every programmer, learn to use [**Git**](https://git-scm.com/)!\n\nGit is a versioning system that allows you to always have under control every change in your code, be able to go back, and be sure that your code will never be lost!\n\nGit is defined as **Distributed Version Control System**: What does it mean?\n\nFrom [this article](https://www.freecodecamp.org/news/what-is-git-and-how-to-use-it-c341b049ae61/):\n\n- Control System: This basically means that Git is a content tracker. So Git can be used to store content — it is mostly used to store code due to the other features it provides.\n\n- Version Control System: The code which is stored in Git keeps changing as more code is added. Also, many developers can add code in parallel. So Version Control System helps in handling this by maintaining a history of what changes have happened. Also, Git provides features like branches and merges, which I will be covering later.\n\n- Distributed Version Control System: Git has a remote repository that is stored in a server and a local repository that is stored in the computer of each developer. This means that the code is not just stored in a central server, but the full copy of the code is present in all the developers’ computers. Git is a Distributed Version Control System since the code is present in every developer’s computer. I will explain the concept of remote and local repositories later in this article.\n\n_Any existing software project that is not under version control is considered a dead project, and the responsible developers are considered crazy._\n\nData Science projects (which make heavy use of software) are no different, indeed! \n\nThey also have the _additional problem of data versioning_, which is the raw material on which you work most. \n\nAlways having the versions of the data, from raw (just collected) to clean, keeping every intermediate processing phase, is perhaps the most important [best practice](https://medium.com/thelaunchpad/retracing-your-steps-in-machine-learning-ml-versioning-74d19a66bd08) when doing a Data Science project.\n\n[**Here**](https://rogerdudler.github.io/git-guide/index.html) you can find a simple guide to Git. Learn it, it's freaking worth (and necessary).\n\nDocumenting your work with Git is crucial: read [How to Write a Git Commit Message](https://chris.beams.io/posts/git-commit/).\n\n**Must read:**\n[**Ten Simple Rules for Taking Advantage of Git and GitHub**](http://dx.plos.org/10.1371/journal.pcbi.1004947)\n\n## Documentation\n\nLike any project, documenting the work done is fundamental to the success of the project. \n\nWe don't need to list the benefits that good documentation brings to a project, so we immediately understand what are the best practices to keep in mind when we produce documentation for our projects.\n\nIf you still want to learn more, read [this article](https://towardsdatascience.com/why-you-should-document-your-work-as-a-data-scientist-a265af8a373?gi=bc5bae43230e) and [this other](https://hackernoon.com/why-you-should-document-your-self-documenting-code-1105a8a6852e).\n\n[**This guide**](https://managing-qualitative-data.org/modules/2/a/) explains in detail how to document data collection and its organization.\n\nRead also [Ten simple rules for documenting scientific software](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6301674/).\n\nYou can choose among different ways to document your project, but Virgilio recommends you to use [Sphinx](http://www.sphinx-doc.org/en/master/), the official Python automated docs library. \n\nRemember that documenting your code and project steps it's **NEVER wasted time**.\n\n**Must read:**\n[**Ten simple rules for documenting scientific software**](http://dx.plos.org/10.1371/journal.pcbi.1006561)\n\n\n## Conclusions\n\nAfter reading this guide and the resources it contains, you should be equipped with all the necessary best practices when starting a new Data Science project. \n\nIn the next sections of Purgatorio, you will begin to put these practices into practice, and you will see how grateful you are to yourself! \n\n\n"
  },
  {
    "path": "content/purgatorio/define-the-scope-and-ask-questions/usage-and-integration.md",
    "content": "---\ntitle: Usage and Integration\nauthor: clone95\ndescription: In this guide, we see which are the key questions to ask when framing a problem of Data Science, regarding the use of the final system and its integration with existing systems.\n---\n\n# Index\n- [Usage](#Usage)\n- [Integration](#Integration)\n- [Conclusions](#Conclusions)\n\nOnce you have decided **what** the project will consist of, what the limits of the system will be and what data it will be based on, it is time to think about *how it will be implemented and integrated* into existing systems. \n\nIn fact, **it is extremely rare for a Machine Learning system to stand alone**, much more likely it is designed to act together with other systems (not necessarily \"intelligent\", but also more classic as a management system or a mobile application). \n\nIt is vital to understand two things:\n- How the system will be used\n- How the system will be integrated \n\nLet's start with \"how the system will be used\".\n\n### Usage\n\n\nThe questions we have to ask ourselves are:\n\n- **Which characteristics should be preferred?**\n\nAs in any software project, or in general engineering projects, in Data Science projects tradeoffs are extremely common.\n\n Depending on the type of requirement that our project has, we should ask ourselves what are its essential characteristics: should the system always remain online? or is it used once in a while? should the system be quick to calculate, or should it be very precise? \n\nIn other words, we need to make sure that the most important features of the system drive its design and time management on the project. \n\n_For example_, an intelligent surveillance camera is important that it detects and recognizes each subject in its frame, so we will give more importance to its accuracy than to its speed of calculation. \n\n_On the contrary_, for an autonomous trading system that has to make decisions in the order of milliseconds, to buy or sell goods, it is vital that the predictions of the Machine Learning model are very fast, perhaps at the expense of the accuracy of the forecast.\n\n- **How important is the use of the system by the user (vital, accessory, temporary, perpetual)?**\n\nThis is a question that is often underestimated by those who develop a system: it is taken for granted that the things we do with our hands are always indispensable. \n\nBut this is not always the case, especially in a world where requirements change rapidly and **prediction models deteriorate quickly**!\n\nWe should always ask ourselves: is the use of the system vital for the user? For example, if it is the system that decides whether to inject medicines into a patient, of course, it is. In this case, we must spend more energy to make the system robust and constantly monitored, in order to avoid disasters.\n\nOn the contrary, if my favorite application does not succeed in suggesting the best combination of food and drink, it is certainly a minor problem. \n\nAnother aspect to consider is: will the system be used for a predetermined period of time, or will it be used in a perpetual way? In the first case perhaps it would be better to focus on the development of a well-made application from the beginning, while in the second case you can choose a more incremental approach. \nIn practice, precisely because of the marked experimentation of Data Science, the incremental approach is often recommended.\n\n- **How much will the system be used?**\n\nWhat kind of use does the system have from the point of view of the frequency of use? Is it used only once? Or a few times a day? Or thousands of times a second? \n\nBased on the answers we understand what performance our system must have: if it is used one-off, it can also be quite slow in computing, and maybe you can focus on making an extremely precise ML model.\n\nOn the contrary, if you need thousands of predictions per second (or millions), you have to take them into account during the design, and try to create light and fast ML models in data inference.\n\n- **How do I evaluate user feedback (written reports, numerical evaluations, usage statistics)?**\n\nDuring the serving and monitoring phase of the model, in the final part of the project, it is vital to monitor its performance and to ensure that it does not degrade (and more importantly, to ensure that the model is used).\n\nThere are several ways to do this: \n- you can draw up usage statistics\n- you can make numerical assessments of the system's performance\n- you can ask for written feedback from users so that you can improve your interaction with the application\n\nIn any case, these feedbacks are very useful to understand the direction to take to improve the ML models that make predictions and to ensure that they continue to work on a regular basis.\n\nThese kinds of questions help us to define how the system is used in a real-world scenario, which is fundamental in the design choices that will be made during all phases of research and development.\n\n### Integration\n\nNow let's ask ourselves \"**how the system will be integrated?**\".\n\nThese questions are not explored in-depth, because the role of the Data Scientist is not to integrate systems, or to make them secure, or to monitor the proper functioning of the hardware side.\n\nHowever, it is useful to have at least one awareness of the challenges that these issues pose during the production of a Machine Learning system. \n\nThe questions to be asked here are the classic ones of systems integration, plus some others:\n\n- Which systems will integrate with the existing system?\n- How is the system served (desktop application, mobile application, API Rest, remote calls)?\n- If offered as a service (as is common practice in microservices architectures), where is it hosted (local machine, Cloud provider)?\n- If offered as a service, how do I control the usage of the system  (access tokens, usage limits, permissions at various levels)?\n- How should the system scale (load balancing, data partitioning, distribution of ML models, parameters)?\n- Are there any particular constraints (platform migration, budget constraints, security, privacy considerations, and regulation)?\n- How much automation can be introduced and at what stages (research, development, deployment)?\n\nThese are the kind of questions to be answered in order to have a complete picture of the future use and integration of the system. \nIn this guide, we have listed the key questions to ask each time you start a new Data Science project. \n\n### Conclusions\n\nIn general, **it is extremely useful to produce a document summarising all the answers to the questions**, so as to provide a clear view of the project as a whole, what are the final objectives, and the most important characteristics for the system. \n\nThis list is not exhaustive, and as you get a question in your head you feel free to pull a request to this file. \n\nA Virgilio member will take over your request and enrich this guide with your contribution.\n\nIn the next guide, we will see other key questions (more oriented to understand how we want to build the machine learning model that makes predictions) to be asked during the framing phase of the problem, which will help us to develop the project successfully. \n\n"
  },
  {
    "path": "content/purgatorio/define-the-scope-and-ask-questions/workspace-setup-and-cloud-computing.md",
    "content": "---\ntitle: Workspace Setup and Cloud Computing \nauthor: zszazi | clone95\ndescription: Setup your workspace locally and use Cloud GPUs to train your model faster and cheaper!\n---\n\n# Index \n\n- [Workspace Setup](#Workspace-Setup)\n- [Local Setup](#Local-Setup)\n- [Anaconda](#Anaconda)\n- [Cloud Computing](#Cloud-Computing)\n- [Conclusions](#Conclusions)\n\n## Workspace Setup\n\nOnce you're done with the framing phase of the project, as explored in the previous guides of this section, you can start setting up your workspace in order to proceed to the next steps of the data science process, where you will explore the data, train Machine Learning models on them, and deploy those models in order to make useful predictions.\n\nThere are two ways to set up your workspace: either in your local machine or in the cloud.\n\nTo set up a local workspace is a must-have skill for a data science practitioner, so we recommend you to try to go through a [Local Setup](#Local-Setup) at least once (unless you have a very old/weak computer). \n\nProbably in the future, you'll need to train bigger models that require more memory, costly CPU operations on raw data, and GPU acceleration for the training phase. In the [Cloud Computing](#Cloud-Computing) section we give you an overview of the several options you can consider to overcome the limitations of your local machine. \n\n## Local Setup\n\nAfter you've installed [Python](https://www.ics.uci.edu/~pattis/common/handouts/pythoneclipsejava/python.html) on your machine, in the guide [Installing Packages with Pip](https://packaging.python.org/tutorials/installing-packages/) you understand how to use the default Package Installation manager (Pip) to download the modules that you will need. However, even if you feel that more control over the environment could be good, you should consider using Anaconda as a preferred package manager for Data Science. \n\n## Anaconda\n\nThe recommended way to set up your local workspace is through the use of [Anaconda](https://anaconda.org/anaconda/conda).\n\nConda is an open-source package management system and environment management system that runs on Windows, macOS, and Linux. Conda quickly installs, runs, and updates packages and their dependencies. Conda easily creates, saves, loads, and switches between environments on your local computer. It was created for Python programs, but it can package and distribute software for any language.\n\nUse the following tutorial to setup Anaconda on your local machine:\n\n[How to Set Up Your Data Science Environment with Anaconda](https://flatironschool.com/blog/how-to-set-up-your-professional-data-science-environment)\n\nAnaconda brings with it the most used Python modules when working with data, and you can install more by simply using the \" conda install \" command, or using pip.\n\n## Cloud Computing\n\nOne day you will find that in order to train that model on 50 GB of images it takes too long for your computer to compute, so you start wondering if you should use Cloud Computing to host your calculations somewhere else!\n\nEver had a thought like \"I should buy a more powerful pc\"? Forget about it and use **Cloud GPUs** to train your model faster and cheaper!\n\n* Also get to know where you can [**deploy**](https://github.com/zszazi/Deep-learning-in-cloud/blob/master/README.md#deploy-your-model-as-a-web-app) your model to serve millions of people.\n\n* Check out the **free credits** and [**Perks/offer**](https://github.com/zszazi/Deep-learning-in-cloud/blob/master/README.md#perks-and-offers) section to get some free GPU hours.\n\nLast updated : 20 April 2019\n\n |# | Cloud vendor   |      Website      |  Pricing | Free Trial / Free Credits | \n| ---|----------|---------| -------- | ----------|\n|1 | Google Colaboratory | https://colab.research.google.com | FREE | FREE FOREVER* | \n|2 | Kaggle Kernels |   https://www.kaggle.com |  FREE | FREE FOREVER* |\n|3| Tensorpad | https://www.tensorpad.com |  1080ti at $0.49/hour | 5 free GPU hours |\n|4| FloydHub | https://www.floydhub.com | https://www.floydhub.com/pricing | free 2 GPU powerups in 14 days [trial plan](https://docs.floydhub.com/faqs/plans/#what-is-in-the-trial-plan) |\n|5| Onepanel | https://www.onepanel.io | https://www.onepanel.io/pricing | - |\n|6| Nimblebox | https://nimblebox.ai | https://nimblebox.ai/plans | free $5 worth of cloud credits|\n|7| paperspace | https://www.paperspace.com | https://www.paperspace.com/pricing | $10 credits |\n|8| Overture |https://www.overture.ai | - | free credits on signup|\n|9| Dataiku | https://www.dataiku.com | - | [Free Plans](https://www.dataiku.com/dss/trynow/free-edition) |\n|10| Cloudalize | https://www.cloudalize.com | https://www.cloudalize.com/pricing/ | - |\n|11|Deepcognition| https://deepcognition.ai | https://deepcognition.ai/products | Desktop version [free](https://deepcognition.ai/products/desktop/) to use |\n|12| GPUeater | https://gpueater.com | https://gpueater.com/#pricing | - |\n|13| Vast.ai| https://vast.ai | https://vast.ai/console/create/ | -|\n|14| Clusterone | https://clusterone.com | https://clusterone.com/pricing | $25 Sign up credit |\n|15| Snark | https://snark.ai | https://scale.snark.ai/pricing | - |\n|16| Crestle |https://crestle.ai | https://crestle.ai/#pricing| 1 hour of free GPU usage on sign up [fast.ai](https://course.fast.ai/start_crestle.html#pricing) |\n|17| Vector Dash(gaming) | https://vectordash.com |-| free 7 day plan|\n|18| Spell | https://spell.run/developers| https://spell.run/pricing | $10 GPU credit on signup |\n|19|Rapid Switch|https://www.rapidswitch.com|[pricing](https://www.rapidswitch.com/dedicated-servers/low-price-guarantee/)|-|\n|20| Salamander|https://salamander.ai|https://salamander.ai|-|\n|21| Leadergpu | https://www.leadergpu.com | https://www.leadergpu.com | - |\n|22| vscaler | https://www.vscaler.com |[on request](https://www.vscaler.com/private-cloud-appliance/)| -|\n|23| AWS Sagemaker |https://aws.amazon.com/sagemaker/ |[pricing](https://aws.amazon.com/sagemaker/pricing/)| [Free plans](https://aws.amazon.com/free/) |\n|24| Exoscale |https://www.exoscale.com/gpu/|[pricing](https://www.exoscale.com/pricing/#/gpu/small) |-|\n|25|Cirrascale|http://www.cirrascale.com| [Work station](http://www.cirrascale.com/pricing_waas.php)|-|\n|26| Alibaba cloud |https://alibabacloud.com|[pay as you go](https://www.alibabacloud.com/product/gpu/pricing)| $300 [credits](https://www.alibabacloud.com/campaign/free-trial)\n|27|IBM Cloud|https://www.ibm.com/cloud/gpu|[pay as you go](https://www.alibabacloud.com/product/gpu/pricing)|$200 [credits](https://console.bluemix.net/registration/free)|\n|28|Google Cloud Platform|https://cloud.google.com/gpu/|https://cloud.google.com/pricing/|$300 [credits](https://cloud.google.com/free/)|\n|29| Valohai|https://valohai.com| https://valohai.com/pricing/ | free trial avaliable|\n|30| Nvidia cloud|https://www.nvidia.com/en-us/data-center/gpu-cloud-computing/|-|-|\n|31|One stop System|https://www.onestopsystems.com|-|-|\n|32| Azure|https://azure.microsoft.com/en-in/services/machine-learning-studio/|[pricing](https://azure.microsoft.com/en-in/pricing/)| $200 [credits](https://azure.microsoft.com/en-us/free/)\n|33| Omnisci | https://www.omnisci.com | https://www.omnisci.com/cloud | 14 day free trial|\n|34| Rendsolve | https://rendsolve.com | https://rendsolve.com/pricing | - |\n|35| Golem | https://golem.network | - |- |\n\n\n# Deploy your model as a Web app\nHave an idea and want to serve to world 🌎 , create a Webapp and deploy it as a flask , Django  etc\n\n |# | Vendor   |      Website      |  Pricing | Free Trial / Free Credits |\n| ---|----------|---------| -------- | ----------|\n| 1  | Render  | https://render.com  |  https://render.com/pricing |-|\n|  2 |  Heroku |  https://www.heroku.com |  https://www.heroku.com/pricing | [Free plan](https://www.heroku.com/free) (model<500MB)|\n|  3 | Digtal Ocean  | https://www.digitalocean.com  |  [pay as you go](https://www.digitalocean.com/pricing/) | free $100 credits with [github student pack](https://education.github.com/pack)|\n| 4 | Glitch | https://glitch.com |-|-|\n| 5 | Zeit | https://zeit.co | https://zeit.co/pricing | Free plan available|\n\n# Perks and offers\nIf you are a student or researcher you can get extra credts , contact the provider\n\n* Paperspace provides $10 of free Gradient° credit [fast.ai link](https://course.fast.ai/start_gradient.html#promotional-credit)\n* Do you have a GPU lying around rent your machine to Earn money using [Vast.ai](https://vast.ai/console/host/setup/)*\n* Test Drive Nvidia GPU [link](https://www.nvidia.com/en-us/data-center/tesla/gpu-test-drive/)\n* Google Cloud Research program - gives **$5000+ credits** [link](https://lp.google-mkto.com/gcp-research-credits-FAQ.html)\n* AWS Cloud Credits for Research -[link](https://aws.amazon.com/research-credits/)\n* Nvidia GPU Grant Program- [link](https://developer.nvidia.com/academic_gpu_seeding)\n* **If you are a Startup** then google has you covered wth Startup Program giving you credits from **$1000 to $100000** - [link](https://cloud.google.com/developers/startups/)\n* Google giving cluster of **1000 TPUs to researcher** In total, this cluster delivers a total of more than **180 petaflops of raw compute power!** [techcrunch link](https://techcrunch.com/2017/05/17/the-tensorflow-research-cloud-program-gives-the-latest-cloud-tpus-to-scientists/)  - [application link](https://www.tensorflow.org/tfrc/)\n* Google cloud Education Grant - [link](https://cloud.google.com/edu/)\n* Github Education pack - along with many offers has upto $110 credits for AWS - [link](https://education.github.com/pack)\n* Watch out on [fast.ai Forums](https://forums.fast.ai) to get coupon code for free credits\n* Valohai gives you an [researcher license](https://valohai.com/research-license/) for students and researchers\n* Want to use a **Super Computer** but don't have one, go for Golem - [Golem](https://golem.network) is a *decentralized marketplace for computing power*. It enables CPUs and GPUs to connect in a peer-to-peer network, enabling both application owners and individual users to rent resources from other users machines, so turbo charge your next model training.\n\n## * Notes\n* Google colab and Kaggle kernels have limited session time \n* Most of the gpu providers run on top of AWS , GCP etc so may have more or less same pricing as the latter\n* Information given above is best to my searching ability , you may recheck with the provider for pricing and other info\n* [license](https://github.com/zszazi/Deep-learning-in-cloud/blob/master/LICENSE)\n\n## Conclusions\nYou have been given a panoramic of options to set up your workspace, either on your local machine or in the cloud. Often, to start practicing and experimenting you don't need a powerful GPU machine, and you can try things locally. \n\nThen, when you need to experiment with the training of several Machine Learning models and pick the best one, you can choose a cloud provider like the ones listed here to massively scale! \n\n\n"
  },
  {
    "path": "content/purgatorio/fundamentals/jupyter-notebook.md",
    "content": "---\ntitle: Jupyter Notebook\nauthor: clone95\ndescription: Learn how to use the Jupyter Notebook, the most popular application for Data Science.\n---\n\n\n# Index\n - [Why Jupyter Notebooks](#Why-Jupyter-Notebooks)\n - [Learn to use Jupyter Notebooks](#Learn-to-use-Jupyter-Notebooks)\n - [Considerations](#Considerations)\n - [Tips and Tricks](#Tips-and-Tricks)\n - [Notebooks Examples](#Notebooks-Examples)\n - [Conclusions](#Conclusions)\n\n\nLet's dive right in!\n \n## Why Jupyter Notebooks\n\n[Jupyter notebooks](https://jupyter.org/) are a way of embedding ready-to-execute Python, Julia and R code with markdown documentation, images, and other such things, all in one file, as well as a program for presenting and running them. \n\nThey're nice if you want to demonstrate a short script to another person, particularly in a data science context, because of some built-in plotting niceties and the fact that you can run cells of code individually. \n\nThey are [widely used in Data Science](https://www.nature.com/articles/d41586-018-07196-1), because as we know the Data Science Process is an experimental and incremental process.\n\nThere are several reasons to choose Jupyter Notebook for the first phases of the Data Science process (e.g. data exploration, data cleaning):\n\n- it's easy to write more than one line of the code before running. You do not need an editor on the side, crafting functions and then copying to the shell\n\n- results presentation is richer than console. It supports graphs, images, tables. Effectively anything that can be represented by html, css and js\n\n- if you make a mistake, you can trivially rerun that \"cell\" (chunk of code, nothing else) once you fix the mistake\n\n- you can install it on some more powerful machine and interact with it in your browser, so works for you if you're not super friendly with terminal stuff\n\n\n::: tip Curiosity\nProject Jupyter's name is a reference to the three core programming languages supported by Jupyter, which are Julia, Python and R, and also a homage to Galileo's notebooks recording the discovery of the moons of Jupiter.\n:::\n\n## Learn to use Jupyter Notebooks\n\nNow that you understand why it is important to use Jupyter Notebooks, let's see how to actually learn how to use them.\n\nThe guide for beginners that Virgilio recommends is as follows:\n\n- [**Jupyter Notebook for Beginners Tutorial**](https://www.dataquest.io/blog/jupyter-notebook-tutorial/)\n\nYou will:\n\n- Cover the basics of installing Jupyter and creating your first notebook\n- Delve deeper and learn all the important terminology\n- Explore how easily notebooks can be shared and published online. Indeed, the tutorial _is a Jupyter Notebook!_ Everything here was written in the Jupyter Notebook environment, though you are viewing it in a read-only form\n\nOnce you're done with this tutorial, you _have the option_ to dive deeper and follow this one:\n\n- [**Jupyter Notebook for Advanced Users Tutorial**](https://www.dataquest.io/blog/advanced-jupyter-notebooks-tutorial/)\n\nThis advanced (optional) tutorial will involve:\n\n- Warming up with the basics of shell commands and some handy magics, including a look at debugging, timing, and executing multiple languages\n- Exploring topics like logging, macros, running external code, and Jupyter extensions\n- Seeing how to enhance charts with [Seaborn](https://seaborn.pydata.org/), beautify notebooks with themes and CSS, and customise notebook output\n- Finishing off with a deep look at topics like scripted execution, automated reporting pipelines, and working with databases\n\nAfter these two tutorials you should be ready to use Jupyter Notebook in a pretty advanced way, leveraging all its useful capabilities.\n\nYou can conclude your learning of Jupyter with this simple read:\n\n- [**Ten simple rules for writing and sharing computational analyses in Jupyter Notebooks**](https://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1007007)\n\nYou can also find an [Example Repository](https://github.com/jupyter-guide/ten-rules-jupyter) with a coherent and clean Jupyter Notebooks examples. \n\nSee also: [Awesome Jupyter](https://github.com/markusschanta/awesome-jupyter) for a very detailed list of Jupyter projects, libraries and resources.\n\n#### JupyterLab\n\nWhen you use a Jupyter Notebook you just have the skeleton of an IDE, as it is designed for prototyping and analysis. \n\nBut what if you want a full IDE, fully integrated with Jupyter?\n\n_[JupyterLab](https://jupyterlab.readthedocs.io/en/stable/getting_started/overview.html) is the natural answer!_\n\nJupyterLab enables you to work with documents and activities such as Jupyter notebooks, text editors, terminals, and custom components in a flexible, integrated, and extensible manner.\n\nYou can arrange multiple documents and activities side by side in the work area using tabs and splitters. Documents and activities integrate with each other, enabling new workflows for interactive computing.\n\nHere you have a [**deep tutorial about JupyterLab**](https://towardsdatascience.com/jupyter-lab-evolution-of-the-jupyter-notebook-5297cacde6b)!\n\nIf you like [VSCode](https://code.visualstudio.com/), you can [use Jupyter Notebooks inside it!](https://www.google.com/search?q=vscode+and+jupyter&oq=vscode+and+jupyter+&aqs=chrome..69i57j0l7.2617j0j7&sourceid=chrome&ie=UTF-8)\n\n#### Colaboratory\n\nRemember that the Jupyter Notebook is nothing more than an application that runs on our machine, and therefore has its own computational capabilities.\n\nAn alternative possibility is to use [**Google Colaboratory**](https://colab.research.google.com/notebooks/welcome.ipynb).\n\nColaboratory is a free Jupyter notebook environment that requires no setup and runs entirely in the cloud. \n\nWith Colaboratory you can write and execute code, save and share your analyses, and access powerful computing resources, all for free from your browser. \n\n## Considerations\n\nAs we said from the beginning, Jupyter Notebooks are great for exploring data, doing analysis and building small prototypes, so you can quickly try many different approaches to the same problem.\n\nBut beware! \n\n::: warning\nYou can't think that the final working system you built (presumably a Machine Learning model that makes predictions) is based entirely on a Jupyter Notebook!\n:::\n\n_In fact, putting models into production in the real world with Notebooks is a totally wrong practice_.\n\nThere are even more extreme opinions, i.e. those who do not recommend their use at all, like Joel Grus in [**I don't like notebooks.**](https://www.youtube.com/watch?v=7jiPeIFXb6U)\n\nSee also: [Pitfalls of Jupyter Notebooks](https://scicomp.aalto.fi/scicomp/jupyter-pitfalls.html), it can save you a lot of headache!\n\nWe at Virgilio think that _they are not the extreme evil_ as Grus suggests, but they certainly do not encourage the principles of software engineering or code cleaning in general.\n\nThat's why **it's crucial to know when to stop using the Notebook and start refactorizing the code into modular Python scripts**, which can then be conveniently used for purposes beyond exploration and experimentation.\n\nCheck the [nbconvert](https://nbconvert.readthedocs.io/en/latest/) module, and see also: [How do I convert a IPython Notebook into a Python file via command line?](https://stackoverflow.com/questions/17077494/how-do-i-convert-a-ipython-notebook-into-a-python-file-via-commandline)\n\nCheck the [nbdime](https://github.com/jupyter/nbdime), it provides tools for diffing and merging of Jupyter Notebooks.\n\n## Tips and Tricks\n\nLike any other new tool you learn, there are often little tricks or conveniences hidden in the documentation that can really make life easier if you use the tool in question every day!\n\nThe Jupyter Notebooks are no less, so here's to you a very detailed article on the tips and tricks of Jupyter!\n\nSee [**Jupyter Notebook Tips, Tricks, and Shortcuts**](https://www.dataquest.io/blog/jupyter-notebook-tips-tricks-shortcuts/)\n\n## Notebooks Examples\n\nSpread across the Web you can probably find hundreds of thousands of Jupyter Notebooks, but how do you navigate them all in an organized way?\n\nLuckily someone did this job before Virgilio, and created this incredible resource:\n\n[**A gallery of interesting Jupyter Notebooks**](https://github.com/jupyter/jupyter/wiki/A-gallery-of-interesting-Jupyter-Notebooks)\n\nTake your time and explore this rich repository, you will surely find something that interests you! \n\n## Conclusions\n\nYou should now be fully aware of the various options you have to use the Jupyter Notebooks, both in their \"basic\" version, both within the JupyterLab IDE, and by exploiting the free power of Google thanks to the Colaboratory!\n"
  },
  {
    "path": "content/purgatorio/fundamentals/math-fundamentals.md",
    "content": "---\ntitle: Math Fundamentals\nauthor: clone95\ndescription: In this guide, you'll learn what is the fundamental mathematical knowledge you need to have in order to build insightful Data Science projects and build machine learning systems upon them. You'll also learn that not so much is needed to start to apply yourself to real-world data problems!\n---\n\n# Index\n- [Motivation](#Motivation)\n- [Courses](#Courses)\n  - [Calculus](#Calculus)\n  - [Linear Algebra and Matrix Algebra](#Linear-Algebra)\n  - [Optimization](#Optimization)\n- [Ask Questions](#Ask-Questions)\n- [Conclusions](#Conclusions)\n\nLet's dive right in!\n \n## Motivation\n\nBefore anything else, watch [this](https://www.youtube.com/watch?v=VIbjHIGMjQM) and then [this](https://www.youtube.com/watch?v=8CX-Q0gtSp8) awesome Ted Talks :-)\n\n**The entire field of Data Science is based on mathematics and statistics.**\n\n::: warning\nThis phrase shouldn't frighten you, although you may find out, that you probably have much of the knowledge you need to start experimenting!\n:::\n\n**In fact:** \n\nIf you've done a second-degree school (you know matrices and derivatives, for example), you probably just need to refresh your memory on the things you already know and go deeper into some things you may not have seen at school. \n\nIn general, if you have a scientific degree (engineering, computer science, physics, etc.), it will probably be just a review, because in this guide _you will learn how to learn_ the fundamental theory behind Calculus, Linear Algebra, and Matrix Algebra courses are suggested within this guide.\n\nWhatever your starting level, however, it is still recommended to go through all the resources organized here, _to make sure you do not have \"gaps in your knowledge\"._\n\nRemember to read and try to implement some ideas of the [**Virgilio's Learning Strategy - Learning to Learn**](../../paradiso/virgilio-teaching-strategy.md)\n\n## Courses\n### Calculus\n\nThe first macro-topic you need to be confident with is [Calculus](https://en.wikipedia.org/wiki/Calculus).\n\nIt would be impossible to list how many Machine Learning system properties are based on its rules, like many of the scientific fields!\n\nThe process of training an ML model it's nothing more than Calculus rules applied to statistical models! \n\n**Lucky you!** \nYou can find great free courses offered by the professors of the [MIT](http://www.mit.edu/)(Massachusetts Institute of Technology), through the index page [MIT OpenCourseWare](https://ocw.mit.edu/index.htm).\n\nThe course we suggest in particular is the following:\n\n[**Single Variable Calculus**](https://ocw.mit.edu/courses/mathematics/18-01sc-single-variable-calculus-fall-2010/)\n\nThere are both the video lessons and the notes of the course.\n\nOnce you've taken the full course, watch this awesome playlist from [3Blue1Brown](https://www.youtube.com/channel/UCYO_jab_esuFRV4b17AJtAw):\n\n[**The Essence of Calculus**](https://www.youtube.com/watch?v=WUvTyaaNkzM&list=PLZHQObOWTQDMsr9K-rj53DwVRMYO3t5Yr)\n\nThanks to these two resources, you should be able to understand most of the mathematical reasons that underpin today's Machine Learning systems and build them to develop powerful Data Science projects\n\nIf you want to dive deeper, here you can find a [Multivariable Calculus](https://en.wikipedia.org/wiki/Multivariable_calculus) course with notes and videos, again from MIT:\n\n[**Multivariable Calculus**](https://ocw.mit.edu/courses/mathematics/18-02sc-multivariable-calculus-fall-2010/)\n\nOnce you will feel ready to go deeper inside the mathematics for Machine Learning (definitely not take this at the first pass), here you find your Bible:\n\n[**Mathematics for Machine Learning**](https://mml-book.github.io/)\n\n#### Check your knowledge\n\nTest your knowledge with these exercises: \n\n- [Exercises in Calculus](http://www.math.mcgill.ca/rags/JAC/dobson/dobson.html)\n- [Calculus: practice problems](https://tutorial.math.lamar.edu/Problems/CalcI/CalcI.aspx)\n\nAnyway, you can find a ton of them online, and remember, that the more you practice, the better you will get!\n\n## Linear Algebra and Matrix Algebra\n\nThe second macro-topic on which Machine Learning systems are based is [linear algebra](https://en.wikipedia.org/wiki/Linear_algebra).\n\nYou probably already tasted these topics in high school, but certainly not with the right degree of depth.\n\nSo, how do you excellently learn linear algebra?\n\nVirgilio was born to spread knowledge and content, and there are many ways to do it: through text, audio, video... \n\nBut the absolute best way (in terms of effectiveness and speed of understanding) is the visual way!\n\nOur brain uses most of its computing power to process visual data, because when we evolved in the African Savannah the most important thing to do was to be able to see a predator and escape!\n\nIt is therefore not surprising that the visual interaction of concepts installs them deep into our minds, almost experientially, rather than conceptually!\n\nImagine, for example, thinking about the formula of the diagonal of a square... reading it is a very abstract thing, but if we imagine in a _visual_ way the graphical reason that leads to the formula, it will make much more sense!\n\nNow, fortunately, there are incredibly skilled and intelligent people in the world, and some of them have created this:\n\n[**Immersive math - Linear Algebra**](http://immersivemath.com/ila/index.html)\n\n[**Interactive Linear Algebra**](https://textbooks.math.gatech.edu/ila/index.html)\n\nOnce you click on the link and start exploring these interactive books, you won't believe your eyes for the clarity and effectiveness with which the concepts are explained. \n\nThese books currently contain so much information and so well done that it deserves a front-row seat in Virgilio!\n\nTake your time, explore the books, fall in love with those interactive explanations!\n\nGoing through these would be sufficient to get all the remaining knowledge you need from a mathematical perspective, to understand most of the papers and code out there!\n\n#### Check your knowledge\n\nTest your knowledge with [**these**](https://web.pdx.edu/~erdman/LINALG/Linalg_pdf.pdf) exercises.\n\nAnyway, you can find a ton of them online, and remember, _that the more you practice, the better you will get_!\n\n## Optimization\n\nCalculus, Linear Algebra, and Matrix Algebra are the 3 fundamental pillars you need to be confident with in order to understand most of the mathematical implications of Machine Learning systems.\n\nThis is important in Data Science because developing Machine Learning predictive models play a big role during a Data Science project, and these models are often the most useful outcome!\n\nThe **optimization course** is a bit more advanced, so maybe you could not tackle _during the first pass of this guide_, but later be sure to take the following lectures, from the professor [Geoff Gordon](https://www.youtube.com/channel/UC4XBoaEXuvob0mQraQJ7wNw):\n\n[**Introduction to Convex Optimization**](https://www.youtube.com/playlist?list=PL7y-1rk2cCsDOv91McLOnV4kExFfTB7dU)\n\nMoreover, if you want to dive deeper (very deep), you can hold this close to your bed:\n\n[The Convex Optimization Book](https://web.stanford.edu/~boyd/cvxbook/bv_cvxbook.pdf) (advanced book)\n\n## Ask Questions\nA rule of thumb to learn fast and effectively is to ask questions and read other's questions and answers.\n\nJoin communities of people interested in the topic (e.g. Reddit): here you can find discussions, search by keywords (e.g. \"matrix multiplication\"), and ask questions, with experts who will answer and help you.\n\nSome _tips_ regarding questions:\n\n- Try to form specific, well-written questions, to minimize the time used by the respondent.\n- Do not ask a question whose answer is found with a quick search on google.\n- If the questions are too general or show laziness they'll likely remain unanswered...\n\nSome subreddits you can subscribe to are:\n\n- [r/LearnMath](https://www.reddit.com/r/learnmath/)\n- [r/Math](https://www.reddit.com/r/math/)\n- [r/Calculus](https://www.reddit.com/r/calculus/)\n- [r/Optimization](https://www.reddit.com/r/optimization/)\n\nTwo other good places to post (well structured) questions are:\n\n- [HackerNews](http://hn.premii.com/)\n- [Quora](https://www.quora.com/)\n- [Math Stack Exchange](https://maths.stackexchange.com)\n\n## Conclusions\n\nIf you follow the study plan of the guide, take the time to fully understand the proposed courses, and do exercises, you will be equipped with an **excellent basic knowledge of mathematics** that is needed to do projects of Data Science, and in particular, build predictive models of Machine Learning.\n\nThis is because _to implement_ a lot of Machine Learning applications we can often abstract ourselves from low-level details, such as the operations between matrices or the internal functioning of optimization algorithms, even if it is vital to know the principles that govern their functioning.\n\nThe next guide is about the basic statistics you need to fully understand the process of Data Science, and build effective and useful statistical models.\n\n"
  },
  {
    "path": "content/purgatorio/fundamentals/python-fundamentals.md",
    "content": "---\ntitle: Python Fundamentals\nauthor: clone95\ndescription: In this guide you'll learn the basics concepts computer science and programming, and will take you _from zero coding knowledge_ to a solid Python skill and a complete awareness of the most important concepts in programming. \n---\n\n# Index\n- [Why Python](#Why-Python)\n- [Computer Science Fundamentals](#Computer-Science-Fundamentals)\n- [Learn Python](#Learn-Python)\n- [Develop Small Projects](#Develop-Small-Projects)\n- [Learn Git and GitHub](#Learn-Git-and-GitHub)\n- [Ask Questions](#Ask-Questions)\n- [Conclusions](#Conclusions)\n\n\nLet's dive right in!\n \n## Why Python\n\nAccording to Sun Tzu:\n> If you don't know Python, learn it yesterday!\n\nThere are hundreds of programming languages, mature as C and C++, or recent as Ruby, C# or Lua, or even corporate giants like Java. \n\nChoosing a programming language to learn is difficult. \n\nThere is no language that can solve all the possible problems out there (it's not a one-shirt-fits-all solution), _but Python is a good choice in many cases_ and is also well positioned for those who learn to program. \n\nPython [was born](https://en.wikipedia.org/wiki/Python_(programming_language)) thinking \"I want a programming language that is as close as possible to plain English\". So, most of the time, when you don't know the name of something, just try to think about the plain literal English name of that thing, and probably the Python name will be that one!  \n\nPython is used by hundreds of thousands of programmers around the \nworld and their numbers are growing all the time.\n\nThere are many reasons for this success.\n\n- Python is intuitive, you think of a way to solve a problem and you can express it that way and it works most of the time.\n\n- Python works everywhere, whether Windows, Linux/UNIX, Mac or other, from supercomputers to mobile phones. \n\n- It allows you to develop small applications and fast prototypes but is structured for creating large programs.\n\n- It is equipped with an easy to use graphical user interface, libraries for web programming. Best of all, it's free.\n\n- There is a large and ever-growing community of Python developers starting from academia, research all the way to business and everyday hobbyists taking up Python.\n\n- You can create and prototype things very quickly due to the ease of the language and availability of free libraries, packages and frameworks.\n\n**Why do you need to learn Python for doing Data Science?** \n\n- Python is _necessary **and** sufficient_ for doing Data Science.\n\n- Python is simple to understand, is simple to read, is powerful and flexible, can help you in everyday tasks \n(even if you're not a programmer!) and automatize a lot of boring stuff.\n\n- Moreover, is the core Data Science tool, and most of the frameworks we'll need in the next guides\nare written in Python or have rich Python wrappers.\n\nNote on the **R programming language:** \n\nIn many Internet guides, you will find the programming language [**R**](https://www.r-project.org/) recommended for Data Science.\n\nR is a purely statistical programming language (not general purpose/scripting like Python).\n\nNow, the opinion shared by Virgilio's collaborators is as follows:\n\n**IF**:\n\n- you are a beginner in programming\n- You're a beginner in data science.\n\n**THEN**:\n\n_It makes no sense to learn two programming languages at the same time._\n\n_It's a waste of time and energy, and it just creates confusion._ \n\nNot to mention that while Python is the undisputed king of scientific computing in general, and **it is not acceptable that a Data Scientist does not know it**, R is not as widespread or widely used and it does not have the same support that Python has and also due to the large cache of useful libraries.\n\nWhat does this mean? that R is useless? Certainly not! \n\nIndeed, it is recognized that its data visualization and statistical capabilities are useful and powerful... But really, if you're starting your path in Data Science today, start with Python, you can learn R later!\n\n## Computer Science Fundamentals\n\nVirgilio targets mainly those who have programming basics but have never touched the field of Data Science.\n\nHowever, if you have never programmed in your life, don't worry! \n\nPython is easy to learn (but the way to master it is long, like all things), and this MIT course introduces you to the main concepts of programming:\n\n[**Introduction to Computer Science and Programming**](https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-00sc-introduction-to-computer-science-and-programming-spring-2011/index.htm)\n\nIf you want a wider curriculum (even like a first-level university) you can have a look here:\n\n[Free self-taught Path - Computer Science](https://github.com/ossu/computer-science)\n\nThat said, at Virgilio, we don't think you need to know _the whole spectrum of the computer science concepts_ to start getting your hands dirty in Data Science.\n\nBut it's true that the more you know, the better! \n\nOn the other hand, we remember that Data Science is nothing more than mathematics and statistics, **applied through programming!** \n\nSo, it's worth spending time becoming very comfortable with Python.\n\n## Learn Python \n\nBut _how can you learn_ Python?\n\nVirgilio [hates to re-invent wheels](https://en.wikipedia.org/wiki/Reinventing_the_wheel) and for our purposes, [**THIS**](https://automatetheboringstuff.com/) free book is the perfect track to follow. \n\nYou can [buy](https://nostarch.com/automatestuff) it too.\n\nThis free book is meant for total beginners. \n\nThe first chapter of the book will explain to you how to install Python (the interpreter of the code you will write) and the Python IDLE (a development environment that will simplify your coding life).\n\nAfter reading a chapter, **do the exercises**, trying to look for alternative solutions.\n\nOnce you finish a chapter, go to the [W3School](https://www.w3schools.com/python/python_exercises.asp) website and try to solve as many exercises you can, depending on the topic you just learned in the book (for example, after [Chapter 4 - Lists in Python](https://automatetheboringstuff.com/chapter4/), you want to tackle the [Exercises on Lists on W3School](https://www.w3schools.com/python/python_lists.asp)).\n\nFor additional Python resources, check [this link](https://github.com/neomatrix369/awesome-ai-ml-dl/blob/master/Programming-in-Python.md#basics--learning)!\n\n#### Coding Challenges\n\nWe suggest you get into [CodeAcademy](https://www.codecademy.com/), tackling coding challenges daily will improve your coding and problem-solving skills in general!\n\n[Here](https://geekflare.com/coding-challenges-to-sharpen-thinking/) you find a detailed list of similar coding challenges (pick your favorite!).\n\n#### IDE\n\nEven though the official Python IDLE is great for starting out with Python, we suggest you approach one of the following IDEs, which come with many more functionalities (and are better supported):\n\n- [Pycharm](https://blog.ipswitch.com/getting-started-with-pycharm)\n- [VSCode](https://code.visualstudio.com/docs/python/python-tutorial)\n\nVirgilio tip: the former is born around Python, and maybe has more advanced functionalities, but VSCode is faster and simpler to use.\n\nTry both, and read [here](https://www.reddit.com/r/Python/comments/8u0hl6/vs_code_vs_pycharm_community/) a very detailed Reddit discussion about which to choose.\n\n#### Navigate the Official Docs\n\nIn order to become proficient with Python (like every programming language or technology), you must become comfortable with the [**official Python documentation**](https://docs.python.org/3.7/).\n\nWorking through the documentation as a beginner is a really good practice, even if a lot of things will be unclear. In fact, be able to explore the documentation of something is the key to learn it autonomously.\n\n[Here](http://blog.techtalentsouth.com/8-tips-to-reading-documentation-a-newbies-guide) you have some tips to read documentations effectively.\n\n#### Stack Overflow\n\nYou _should_ fall in love with [**StackOverflow**](https://stackoverflow.com/), a question-answer website about programming in general.\nRead [How can I use Stack Overflow effectively as a beginner?](https://www.quora.com/How-can-I-use-Stack-Overflow-effectively-as-a-beginner) and be ready to become grateful to awesome people around the world who answer questions daily on the website.\n\n#### Hold your Cheatsheet\n\nHere you can find a very good Python Cheatsheet, hold it with you!\n\n[**Python Cheatsheet**](https://github.com/ehmatthes/pcc/releases/download/v1.0.0/beginners_python_cheat_sheet_pcc_all.pdf)\n\n## Develop Small Projects\n\nFirst of all, read this post from r/LearnProgramming:\n- [The Best Way To Learn How To Code](https://www.reddit.com/r/learnprogramming/comments/5zc24o/the_best_way_to_learn_how_to_code/)\n\n::: tip\n**The biggest lesson in the world of programming is the following: the best way to learn is getting your hands dirty!**\n:::\n\nOf course, to start with it makes sense to follow tutorials and guides (better still a structured book), but you need to experiment, make mistakes, and re-iterate this process to **to be really able to improve** your coding skills.\n\nOnce you are done with the book [Automate the Boring Stuff](https://automatetheboringstuff.com/), start a small project and develop it by yourself! \n\nThe best case is that you find a topic or a task in which you have an interest, and tackle it! \n\nIf you lack imagination don't worry, here you have a list of 1000+ project ideas you can develop in Python :)\n\n- [1000+ Beginner Programming Projects](https://www.reddit.com/r/learnprogramming/comments/2a9ygh/1000_beginner_programming_projects_xpost/)\n\nHaving a project keeps you motivated, don't underestimate it!\n\n## Learn Git and GitHub\n\nGit is a versioning system that allows you to always have every change in your code under control, be able to go back, and be sure that your code will never be lost!\n\nGit is defined as **Distributed Version Control System**: What does it mean?\n\nFrom [this article](https://www.freecodecamp.org/news/what-is-git-and-how-to-use-it-c341b049ae61/):\n\n- Control System: This basically means that Git is a content tracker. So Git can be used to store content — it is mostly used to store code due to the other features it provides.\n\n- Version Control System: The code which is stored in Git keeps changing as more code is added. Also, many developers can add code in parallel. So Version Control System helps in handling this by maintaining a history of what changes have happened. Also, Git provides features like branches and merges, which I will be covering later.\n\n- Distributed Version Control System: Git has a remote repository that is stored in a server and a local repository that is stored on your local machine. This means that the code is not just stored in a central server, but the full copy of the code is present in all the developers’ computers. Git is a Distributed Version Control System since the code is present in every developer’s computer.\n\n_Any existing software project that is not under version control is considered a dead project, and the responsible developers are considered crazy._\n\nData Science projects (which make heavy use of software) are no different, indeed! \n\nThey also have the _additional problem of data versioning_, which is the raw material on which you work most. \n\n[**Here**](https://rogerdudler.github.io/git-guide/index.html) you can find a simple guide to Git.\n\n**Learn it, it's freaking worth (and necessary).**\n\nDocumenting well your work with Git is crucial: read [How to Write a Git Commit Message](https://chris.beams.io/posts/git-commit/).\n\n**Must read:**\n[**Ten Simple Rules for Taking Advantage of Git and GitHub**](http://dx.plos.org/10.1371/journal.pcbi.1004947)\n\n## Ask Questions\nA rule of thumb to learn fast and effectively is to ask questions and read other's questions and answers.\n\nJoin communities of people interested in the topic (e.g. Reddit): here you can find discussions, search by keywords (e.g. \"matrix multiplication\"), and ask questions, with experts who will answer and help you.\n\nSome _tips_ regarding questions:\n\n- Try to form specific, well-written questions, to minimize the time used by the respondent.\n- Do not ask a question whose answer is found with a quick search on google.\n- If the questions are too general or show laziness they'll likely remain unanswered...\n\nSome subreddits you can subscribe to are:\n\n- [r/Python](https://www.reddit.com/r/python/)\n- [r/LearnPython](https://www.reddit.com/r/learnpython/)\n- [r/LearnProgramming](https://www.reddit.com/r/learnprogramming/)\n- [r/Programming](https://www.reddit.com/r/programming/)\n- [r/Computer Science](https://www.reddit.com/r/compsci/)\n\nOther good places to post and read (well structured) questions are:\n\n- [HackerNews](http://hn.premii.com/)\n- [Quora](https://www.quora.com/)\n- [Math Stack Exchange](https://maths.stackexchange.com)\n\n## Conclusions\n\nThe path to becoming a good programmer is long and requires commitment and dedication, but it will give you satisfaction (and value) like very few other things in life!\n\n_Programming is creativity, problem-solving, art!_ \n\nIf you follow the advice of this guide you won't have any problem to become proficient with Python, and moreover, you will have learned the main concepts of programming!\n\nThis means that **to learn another language, the biggest obstacle will be to learn the syntax**, but the concepts will remain more or less the same!\n\nIn the next guide we will see how to use the **Jupyter Notebooks**, a Python application designed specifically for Data Science and experimental programming!\n\n"
  },
  {
    "path": "content/purgatorio/fundamentals/statistics-fundamentals.md",
    "content": "---\ntitle: Statistics Fundamentals\nauthor: clone95\ndescription: Learn what is the fundamental statistical knowledge you need to have in order to build insightful Data Science projects and build machine learning systems upon them.\n---\n\n# Index\n- [Motivation](#Motivation)\n- [Courses](#Courses)\n  - [Descriptive Statistics](#Descriptive-statistics)\n  - [Probability Theory](#Probability-Theory)\n  - [Bayesian Statistics](#Bayesian-Statistics)\n- [Ask Questions](#Ask-Questions)\n- [Conclusions](#Conclusions)\n\nLet's dive right in!\n \n## Motivation\nThe field of statistics is the **science of learning from data**.\n\n- Statistics is a crucial process behind how we make discoveries in science, make decisions based on data, and make predictions. \n\n- Statistical knowledge helps you use the proper methods to collect the data, employ the correct analyses, and effectively present the results. \n\nEvery fancy term you read related to the field of Data Science, or the even more misunderstood Artificial Intelligence, _is nothing more than statistical models trained with some mathematical algorithms_.\n\nThat's why **learning the basics of statistics is fundamental** in order to tackle real-world Data Science problems and build powerful predictive models upon them.\n\nThe two fundamental subjects to know in order to develop successful Data Science projects are **descriptive statistics** and **theory of probability**.\n\nWe'll explore an additional one, Bayesian Statistics, which is pretty powerful but not mandatory for a first pass of the statistics topics.\n\nPlay with [this interactive website](https://seeing-theory.brown.edu/) to taste the flavor of the topics that this guide will suggest to you.\n\nIt's awesome.\n\n## Descriptive Statistics\n\n[Descriptive statistics](https://www.investopedia.com/terms/d/descriptive_statistics.asp) aim to analyze and summarize the data collected during an experiment. \n\nThe set of methods and techniques used in descriptive statistics makes it possible to express the information contained in a set of data by means of graphs and particular numerical indicators.\n\nMoreover, with the techniques of investigation of descriptive statistics, it is possible to verify the adaptation of the experimental data to an assigned theoretical model, as well as to carry out comparative analyses between datasets.\n\nDescriptive statistics are widely used in economics, demography, medicine, and in all-natural sciences.\n\nFirst of all watch these videos, they are truly inspirational:\n\n- [Why You Should Love Statistics](https://www.ted.com/talks/alan_smith_why_we_re_so_bad_at_statistics)\n- [The Best Stats You've Ever Seen](https://www.ted.com/talks/hans_rosling_shows_the_best_stats_you_ve_ever_seen)\n\n---\n\nTo understand the concepts of descriptive statistics, the book Virgilio recommends is the following:\n\n[**Statistics in Plain English**](http://www.pindex.com/uploads/post_docs/statistics%20in%20plain%20english%20(3rd,%202010)(PINDEX-DOC-6952).pdf) - [Timothy C. Urdan](https://www.amazon.com/Statistics-Course-Pack-Set-Op/dp/1138838349)\n\nThis book is fantastic because it focuses more on **the reason behind the concepts** concepts rather than on formulas or calculations, which are easily found elsewhere. \n\n**The book is mandatory for a full understanding of descriptive statistics** (it is certainly not the only book of statistics out there, but it is the best in terms of clarity of explanation and completeness of the basic concepts.).\n\nOnce finished, you can choose whether to go deeper with a more technical manual, like the following _free book_:\n\n[**Elements of Statistics**](https://www.open.edu/openlearncreate/mod/oucontent/view.php?id=18263&printable=1)\n\nThis book deals in more depth with the various topics, but to start doing small experiments in Data Science is not necessary to address it immediately. \n\n**Keep it as a reference!**\n\n#### Check your knowledge\n\nTest your knowledge with some of [these exercises](https://www0.gsb.columbia.edu/faculty/pglasserman/B6014/exercises.pdf).\n\nAnyway, you can find a ton of them online, and remember, that the more you practice, the better you will get!\n\n\n## Probability Theory\n\nProbability theory governs _every daily event_, from microscopic to macroscopic, even if we hardly realize it!\n\nBut you may have thought about the odds of winning, for example, the game of dice, or when you estimate the probability of having successfully passed an exam!\n\nProbability theory is so interconnected with statistical and mathematical concepts that it _is difficult to explain why it is fundamental_: simply consider it as the basic building blocks of more advanced statistical concepts based on it.\n\nNot to mention that knowledge of probability theory **can be very useful in everyday life** since it can suggest to us how to behave on certain occasions, to make the best choices, or involving the least risk of failure.\n\nFortunately, you can have the (perhaps) best course on probability theory available to date, offered as usual by [MIT](http://www.mit.edu/). \n\nIt's good to have a first-class education from home for free, huh? \n\nWhat an incredible time to be alive!\n\nTake the course at:\n\n[**Introduction to Probability - Video Lectures**](https://www.youtube.com/watch?v=1uW3qMFA9Ho&list=PLUl4u3cNGP60hI9ATjSFgLZpbNJ7myAg6)\n\nIn addition, keep this _free complete book_ as a reference:\n\n[**Introduction to Probability - Book**](https://www.dartmouth.edu/~chance/teaching_aids/books_articles/probability_book/amsbook.mac.pdf)\n\n#### Check your knowledge\n\nTest your knowledge with some of [these exercises](https://www.math.kth.se/matstat/gru/sf1901/TCOMK/exercises.pdf).\n\nAnyway, you can find a ton of them online, and remember, that the more you practice, the better you will get!\n\n## Bayesian Statistics\n\nThis last topic is not fundamental for a first pass study, but it's highly recommended since some of Machine Learning algorithms are based on it or leverage some concepts from Bayesian Theory.\n\nThe Bayesian approach is often distinguished from the \"classical\" approach, which you have studied in the [Descriptive Statistics](#Descriptive-Statistics) section, and which is called \"frequentist\" when compared to the \"Bayesian\" approach.\n\nRead:\n- [The difference between the \"Frequentist\" and \"Bayesian\" approach](https://stats.stackexchange.com/questions/22/bayesian-and-frequentist-reasoning-in-plain-english)\n\nThe Bayesian approach to statistics is based upon the famous [Bayes Theorem](https://en.wikipedia.org/wiki/Bayes%27_theorem), which describes the probability of an event, based on prior knowledge of conditions that might be related to the event.\n\nFor example, if cancer is related to age, then, using Bayes’ theorem, a person’s age can be used to more precisely or accurately assess the probability that they have cancer, in contrast to the assessment of the probability of cancer made without knowledge of the person's age.\n\nFirst, get comfortable with the Bayesian approach with:\n- [Bayes Theorem: A Primer](https://lavanya.ai/2019/05/16/bayes-theorem/)\n\nThen you can take this course to dive deep into the Bayesian approach to statistics, along with many more concepts, taking the following course:\n\n[**Statistical Rethinking - Video Lectures**](https://www.youtube.com/playlist?list=PLDcUM9US4XdM9_N6XUUFrhghGJ4K25bFc)\n\nYou find the complete book from the same author at:\n\n[**Statistical Rethinking - Book**](https://www.amazon.com/Statistical-Rethinking-Bayesian-Examples-Chapman/dp/1482253445)\n\n## Ask Questions\nA rule of thumb rule to learn fast and effectively is to ask questions and read other's questions and answers.\n\nJoin communities of people interested in the topic (e.g. Reddit): here you can find discussions, search by keywords (e.g. \"standard deviation\"), and ask questions, with experts who will answer and help you.\n\nSome _tips_ regarding questions:\n\n- Try to form specific, well-written questions, to minimize the time used by the respondent.\n- Do not ask a question whose answer is found with a quick search on google.\n- If the questions are too general or show laziness they'll likely remain unanswered...\n\nSome subreddits you can subscribe to are:\n\n- [r/Statistics](https://www.reddit.com/r/statistics/)\n- [r/AskStatistics](https://www.reddit.com/r/AskStatistics/)\n- [r/ProbabilityTheory](https://www.reddit.com/r/probabilitytheory/)\n- [r/Bayes](https://www.reddit.com/r/Bayes/)\n\nTwo other good places to post (well structured) questions are:\n\n- [Math - StackExchange](https://math.stackexchange.com/)\n- [HackerNews](http://hn.premii.com/)\n- [Quora](https://www.quora.com/)\n\n\n## Conclusions\n\nWith the above-suggested courses, you should be equipped with most of the statistics knowledge you need to start working on simple Data Science projects. \n\nA very good book we suggest you to read is [\"How To Lie With Statistics\"](https://en.wikipedia.org/wiki/How_to_Lie_with_Statistics).\n\nThe book is a brief, breezy illustrated volume outlining errors when it comes to the interpretation of statistics, and how these errors may create incorrect conclusions. Very suggested!\n\nThe next guide will focus on learning the **Python programming language**, the real tool that will allow you to put into practice the knowledge you've gained with your hard study.\n\n"
  },
  {
    "path": "content/purgatorio/fundamentals/the-data-science-process.md",
    "content": "---\ntitle: The Data Science Process\nauthor: clone95\ndescription: In this guide, you will understand the big picture of the Data Science project lifecycle, why and how to perform each step, from collecting the data to putting predictive models in production. You can then use this guide as a \"checklist\" of to-do steps to perform during your projects. \n---\n\n# Index\n- [Motivation](#Motivation)\n- [Frame the problem](#Frame-the-problem)\n- [Collect and prepare the data](#Collect-and-prepare-the-data)\n- [Select and train an ML model](#Select-and-train-an-ML-model)\n- [Evaluate and fine tune](#Evaluate-and-fine-tune)\n- [Launch and mantain the system](#Launch-and-mantain-the-system)\n- [Conclusions](#Conclusions)\n\nLet's dive right in!\n \n## Motivation\n\nYou can find hundreds of online articles describing the process of developing a Data Science project. \n\nIn this article, Virgilio does not aim to give you the details of each phase, which will be dealt with in more technical guides,\nbut rather aims to give you an overview of the various steps, as well as a sort of checklist to keep in mind when starting a project.\n\n::: tip\nAs you may have noticed, **the structure of Purgatory reflects the entire Data Science process lifecycle**, with each _section_ corresponding to a macro phase, and each _guide_ within it corresponding to a sub-stage of the process. This content organization is designed to provide clarity to the structure of Purgatorio, clarity to the Data Science process, and to provide a useful checklist to consult whenever you start a new project.\n:::\n\nThe design of Purgatorio is inspired by the checklist in the magnificent book \n[Hands-on Machine Learning with Scikit-Learn, Keras, and TensorFlow](https://www.amazon.it/Hands-Machine-Learning-Scikit-learn-Tensorflow/dp/1492032646), which I would urge you to buy. \n\n**It's worth its weight in bits!**\n\n--- \n\nLet's recap what we mean by \"the life cycle of the data science process\" (from here on, for brevity, we will only call it \"process\").\n\nA Data Science project is any project that aims to extract knowledge from data \n(for example, predict the optimal interest rate for a loan, or how many customers will enter the store tomorrow), \nand in doing so, use Machine Learning techniques.\n\nThese techniques can be of two types: \n- Traditional Machine Learning techniques (statistical models like SVM, decision trees, or clustering)\n- Deep Learning Techniques (neural networks)\n\nFor now don't worry about the difference between the two types, just know for now that the former has been around for decades, \nwhile the latter is the subject of active experimental research and have only started to be used in the last 6-7 years.\n\n**You are now ready for a short tour of the Data Science process, where I'll give you an overview of what your trip to Purgatorio will be like.**\n\n## Frame the problem\n\nEach Data Science project starts from a phase called Problem Statement or Problem Shaping, i.e. **the process of identifying the problem to be solved and the real-world advantages to be obtained.**\n\nHow do you do it? We must be ready to ask the right questions. \n\nUsually, the first questions you ask yourself are: \n- What is the scope of the project? \n- What is the desired result? \n- What data do we have available? \n- Do we have evidence that they contain relevant information?\n\nDuring this phase, close contact between you (the technician) and the domain expert is vital. \nIf you are developing a project for a company, presumably it will be the source of domain knowledge: learn as much as you can!\n\nIf you are developing a project for yourself, look for domain experts to ask questions! \n\nStudying and practicing you will develop a \"data mindset\", which will help you a lot in this phase. An entire guide is dedicated to this issue.\n\nWhen you have framed the type of problem you want to solve, it is time to choose objective metrics to evaluate the result of the project: depending on the type of problem addressed, we will see how different metrics provide indications on the performance of the Machine Learning models that we will develop.\n\nLast but not least, it is necessary to make sure that the assumptions we make are correct, the data we have collected is not corrupted or biased, and how the system will be integrated with existing systems and then used.\n\n## Collect and prepare the data\n\nThe indispensable raw material for Data Science projects is data (you never would have said so :D ).\n\n::: warning\nCollecting, organizing, and then cleaning them is often [the most _onerous phase_](https://fundersclub.com/blog/2017/06/29/hardest-part-ai-cleaning-your-data/) of the whole process.\n:::\n\nYou need to understand:\n- what data is sensitive and what is not\n- what the data sources are\n- how data have been collected\n- how the data from various sources relate to each other \n\nOnce the data has been obtained, it is necessary to organize it effectively and **to keep raw version** of it so that you always have at your disposal the \"ground truth\" of our project.\n\nIn fact, a large part of the work of cleaning and preparing the data consists of steps (called pre-processing) that transform them: from raw data just collected, to clean data and ready to be analyzed by a model in the next macro-phase. \n\nMaintaining the various versions of the data, to which the pre-processing steps have been applied, is vital to achieving _reproducible results_ and _maintainable systems_.\n\nThe information represented by the data is called \"features\" (in the simple case of tabular data, each attribute is a feature).\n\nOnce the raw data has been cleaned, the feature engineering phase often takes place in which existing data is combined to \"suggest\" to the models the relationships between them.\n\nFor example, if my data contains the date of purchase in a store, I can add the feature \"day of the week\", indicating with a value from 1 to 7 on which day we are. This could reveal very interesting relationships!\n\nOften _the feature engineering phase is vital for traditional models_, while we will see that for Deep Learning models it is less important, as they have among their advantages to automatically extract relevant features from the data.\n\nFinally, we will see in this section how to automate these \"pipelines\" of collection, cleaning, and preprocessing.\n\n## Select and train an ML model\n\nOnce the data has been cleaned and prepared, it is time to choose an algorithm that must be \"trained\" on it, and whose output will be a predictive model.\n\nThis model can be a statistical model (even if all the models we will see apply statistical concepts) or a Deep Learning model. \n\nStatistical models have been used for decades to predict the future, such as sales in the next quarter, or the climate in a given region. \n\nIn general, these models:\n- They require statistical knowledge \n- Require feature engineering\n- They are \"simple\" in the sense that they are easy to interpret and debug\n\nDeep Learning models (software programs called neural networks) are techniques that have been exploding in recent years, providing excellent performance on problems previously impossible to solve, in general:\n- They require empirical and practical knowledge about training neural networks\n- Do not necessarily require feature engineering (but may benefit from it) \n- They are \"complex\" in the sense that they are difficult to interpret and debug.\n- They are the only solutions in case of equally \"complex\" problems, such as the vision or understanding of natural language.\n\nWe will see in detail various types of statistical models and Deep Learning, with a particular focus on the latter, which over the years are proving a revolution and promise to overturn entire industries, as well as drastically improve the processes that characterize them.\n\nOnce the model that best solves our problem has been selected, the training phase takes place, where the model is shown many examples (our data), and its parameters are adjusted in order to obtain satisfactory performance.\n\n## Evaluate and fine-tune\n\nOnce we set up the training process and trained the model, we are ready to evaluate it and understand what actual performance it would have in the face of data that it has never seen. \n\nTherefore, before training, the data is divided between training data (those that the model will see) and test data that it has never seen (those on which it will be tested).\n\nThis phase is of vital importance to understand **how the model will perform in the real world**, and to understand _if it will actually be useful._\n\nIn this section, we will also understand how to choose the best parameters to train the models, so as to maximize their performance in the test phase.\n\nMoreover, we will see how to compose together several predictive models to form a more effective one, and you will learn to use one of the most useful techniques in the real application of Deep Learning: _Transfer Learning_.\n\nThis concept consists of applying the knowledge already learned from a problem to a new problem, reducing the amount of data needed, and the computational costs for training.\n\nWe'll see how in practice you almost never train a model from scratch, but you take advantage of pre-trained models made available by large companies and researchers.\n\n## Launch and mantain the system\n\nOnce the model is sufficiently tested and its performing well it can be used to make predictions. \n\nIn this section you will learn how to build models that can scale to hundreds or thousands of users, leveraging the power of the Cloud and the flexibility of the API Rest concept. \n\nYou will learn how to distribute your models across multiple machines, and monitor them carefully through metrics and alarms.\n\nIn fact, one of the biggest costs of Data Science projects (but we could say software in general) is maintenance.\nHere are some questions you need to ask yourself when you put a model into production in the real world:\n\n- **Do users use it**?\n- Is the number of users using it controllable, or is there a slowdown?\n- How certain is the model of predictions it makes?\n- How do I make sure the new input data is appropriate?\n- How do I ensure that they are properly preprocessed (yes, automatic pipelines, I'm looking at you)?\n- Do the real-world data reflect the training data?\n- How do real-world data change over time?\n- How do I integrate the new knowledge I collect over time (i.e., the new data from the real world)?\n- How do I ensure that the performance of the model does not degrade over time?\n\nThese and other questions will be covered in this section.\n\n## Conclusions\n\nYou've just had a taste of everything we'll see in the next sections of Purgatorio, but remember there will be much more to learn! \n\nAlongside these guides, you'll be given some to learn how to use libraries and frameworks used by organizations and governments, how to take advantage of the power and flexibility of Cloud vendors, how to read research papers, and much more!\n\nWarm-up your fingers and brain and prepare a coffee (or some thousands...), the journey is about to begin!  \n"
  },
  {
    "path": "content/purgatorio/launch-and-mantain-the-system/automation-and-reproducibility.md",
    "content": "---\ntitle: Automation and Reproducibility\nauthor: clone95\ndescription: This guide introduces you to best practices of the Data Science process automation and research reproducibility.\n---\n\n# Index \n\n- [Advantages of Automation and The Need for Reproducibility](#Advantages-of-Automation-and-The-Need-for-Reproducibility)\n- [Automation and Reproducibility for the Data Science Process](#Automation-and-Reproducibility-for-the-Data-Science-Process)\n- [AutoML](#AutoML)\n- [No Free Lunch and Black Boxes](#No-Free-Lunch-and-Black-Boxes)\n\n## Advantages of Automation and The Need for Reproducibility\n\nAll the previous guides within Purgatorio suggest various things:\n\n- there are _many steps_ to be taken to start from the raw data and get to high-performance models \n- you can make a lot of _mistakes_ and various kinds of mistakes.\n- many steps can be _tedious or boring_ to repeat manually (Data Cleaning, I'm watching you).\n\nSo, how can we simplify our work and become more productive, decrease the likelihood of making mistakes, and make our work repeatable? \n\nThe keyword is one: [Automation](https://en.wikipedia.org/wiki/Automation). \n\nAutomation is the best solution to all the problems mentioned above, and also saves us time! \n\nThis is true for almost every field (not only Data Science), in fact, if we look at the Wikipedia definition it says: \n\n **_Advantages of Automation_**:\n\n- Increased throughput or productivity.\n- Improved quality or increased predictability of quality.\n- Improved robustness (consistency), of processes or products.\n- Increased consistency of output.\n- Reduced direct human labor costs and expenses.\n- Replaces human operators in tasks that involve hard physical or monotonous work (e.g., using \n- Performs tasks that are beyond human capabilities of size, weight, speed, endurance, etc.\n- Reduces operation time and work handling time significantly.\n- Frees up workers to take on other roles.\n- It provides higher-level jobs in the development, deployment, maintenance, and running of the automated processes.\n\nThis article explains very well why Automation is crucial for the Data Science world:\n\n- [4 Ways Automation Is Altering Data Science](https://towardsdatascience.com/4-ways-automation-is-altering-data-science-36a0d2755e4f)\n\n### Disadvantages of Automation\n\nSome might argue that Automation has not only advantages but also disadvantages, such as job losses (it takes less human to do the same things).\n\nThis argument goes beyond the technical issue of how to improve the Data Science process, so it will not be covered in this guide. \n\nHowever, this topic has valid counter-arguments, if you want to know more read here:\n\n- [Automating jobs is how society makes progress](https://qz.com/work/1212722/automating-jobs-is-how-society-makes-progress/)\n- [Will data science become automated?](https://www.reddit.com/r/datascience/comments/9mqghe/will_data_science_become_automated/)\n- [Can Data Science be Automated?](https://www.reddit.com/r/datascience/comments/bmk6cm/can_data_science_be_automated/)\n- [Do you think data science will get more automated and those without a PhD won't be competitive in the future?](https://www.reddit.com/r/datascience/comments/7f2m7i/do_you_think_data_science_will_get_more_automated/)\n\nSo, we can state that Automation is crucial for the Data Science process to become useful, for a variety of reasons. But perhaps the most important reason, when it comes to automation in science, is the [**Reproducibility**](https://en.wikipedia.org/wiki/Reproducibility) issue. \n\n**Data Science, precisely, is a \"Science\", in the sense that it must be demonstrable and reproducible!**\n\n::: warning\nWithout **Reproducibility**, without the support of the _repeatability of experiments_, any result of Data Science is useless (or even harmful, because it can reinforce human bias).\n:::\n\n## Automation and Reproducibility for the Data Science Process\n\nThe automation of Data Science steps is advisable at all levels, from the creation of the dataset to the deployment of trained ML models. \n\nMost of the time, a configurable Python script is sufficient to automate most of the steps, which can for example be scheduled to be launched programmatically. \n\nThe following is a list of hints for some automation that can save you a lot of time (and therefore, money).\n\nYou can automate:\n\n- **Data collection** \n\n    Using scheduled scraping, database connections, or scheduled API, you can have always fresh data to train your models on. \n\n- **Data quality control**\n\n    Using scripts that create statistical reports, for example on data distribution, the number of classes present, frequency, or other statistical values such as the most frequent data, average value, standard deviation. \n\n    This way, it is possible to compare in a programmatic way that the distribution of new data reflects previous data, or how much it differs from them.\n\n    Check these awesome notebooks: \n\n    - [An Introduction To EDA and Hypothesis Testing](https://github.com/EricSchles/datascience_book/blob/master/Statistical%20Tests%20-%2001.ipynb)\n    - [Statistical tests, from scratch](https://github.com/EricSchles/datascience_book/blob/master/Statistical%20tests%2C%20from%20scratch.ipynb)\n\n- **Data backups**\n\n    You can automate data backups, using Cloud Storage solutions (for example, S3 buckets or Azure Storage).\n    \n    This way you are always sure that your data is safe and replicated, and you can access them from wherever you want.\n    \n    A good idea is to backup regularly a folder from your local machine, where the data is stored and used. \n\n- **Data transformation steps**\n\n    This one is crucial to obtain _Reproducibility_.\n    \n    In fact, only by automating the preprocessing steps can you be sure that the data always undergo the same transformations. \n    \n    The worst nightmare that can happen to you is having to deal with manual preprocessing steps, which tomorrow will have to be done again, and you will surely make a mistake (the order in which they are made and / or possible configurations). \n\n    This issue often arises when using Jupyter Notebooks to build preprocessing workflows, watch out! Rather consider solid alternatives such as the [SKLearn's Pipelines](https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.Pipeline.html).\n\n    Be sure to check these out (coming from [Ten Simple Rules collection](https://collections.plos.org/ten-simple-rules)):\n\n    - [**Ten Simple Rules for Reproducible Research**](https://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1003285)\n    - [**Ten simple rules for writing and sharing computational analyses in Jupyter Notebooks**](https://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1007007)\n\n    Interesting reads on Reproducibility:\n\n    - [Creating Reproducible Data Science Projects](https://towardsdatascience.com/creating-reproducible-data-science-projects-1fa446369386)\n    - [Reproducibility, Replicability, and Data Science](https://www.kdnuggets.com/2019/11/reproducibility-replicability-data-science.html)\n    - [Challenges in irreproducible research](https://www.nature.com/collections/prbfkwmwvz)\n\n- **Model training and serving**\n\n    You can create scripts to _automatically_ train ML models at any given time, perhaps using new data you have collected, cleaned, and pre-processed. \n\n    You can automatically check that the performance of the models reflects expectations, and train them again in case they degrade.\n    \n    See:\n    - [Why Machine Learning Models Degrade In Production](https://towardsdatascience.com/why-machine-learning-models-degrade-in-production-d0f2108e9214)\n    - [The Ultimate Guide to Model Retraining](https://mlinproduction.com/model-retraining/)\n\n    Once you've retrained the model, you can _automatically_ deploy it in production. Many Cloud Providers (AWS, Azure, GCP) offer you the possibility to do this in a very simple way.\n    \n#### The Automation Golden Rule\n\nAs you can see, there's a big room for improvement in your Data Science work if you use automation.\n\nThe [Rule of Three](https://en.wikipedia.org/wiki/Rule_of_three_(computer_programming)) in software development says: \n\n> It states that two instances of similar code don't require refactoring, but when a similar code is used three times, it should be extracted into a new procedure.\n\n_Likewise_, you can think of automation!\n\n**If you should take a step more than twice, it's probably worth taking a moment to automate it!**\n\n## AutoML\n\nUntil now we have seen how automation can fit into the various steps of the Data Science process, speed them up, and how it is vital to obtain reproducible results. \n\nBut there is another aspect of how automation can help us, and it is called [AutoML](https://en.wikipedia.org/wiki/Automated_machine_learning). \n\nAutomated machine learning (AutoML) is the process of automating the process of applying machine learning to real-world problems.\n\n**AutoML covers the complete pipeline from the raw dataset to the deployable machine learning model.**\n\nFrom Wikipedia:\n\n> In a typical Machine Learning application, practitioners have a set of input data points to train on. The raw data may not be in a form that all algorithms can be applied to it. To make the data amenable for machine learning, an expert may have to apply appropriate data pre-processing, feature engineering, feature extraction, and feature selection methods. After these steps, practitioners must then perform algorithm selection and hyperparameter optimization to maximize the predictive performance of their model. \n\n> All of these steps induce challenges, accumulating a significant hurdle to get started with machine learning.\n\n> **AutoML** dramatically simplifies these steps for non-experts. Automation is not perfect because AutoML tools still have hyperparameters, and setting them may require expertise.\n\nGoogle is a pioneer in AutoML, and engineers there wrote a log of blog posts about this approach. Take a read: \n\n- [Cloud AutoML: Making AI accessible to every business](https://www.blog.google/products/google-cloud/cloud-automl-making-ai-accessible-every-business/)\n- [Using Machine Learning to Explore Neural Network Architecture](https://ai.googleblog.com/2017/05/using-machine-learning-to-explore.html)\n- [AutoML for large scale image classification and object detection](https://ai.googleblog.com/2017/11/automl-for-large-scale-image.html)\n- [An End-to-End AutoML Solution for Tabular Data at KaggleDays](https://ai.googleblog.com/2019/05/an-end-to-end-automl-solution-for.html)\n- [Using Evolutionary AutoML to Discover Neural Network Architectures](https://ai.googleblog.com/2018/03/using-evolutionary-automl-to-discover.html)\n\nThen read here to have a detailed overview of the **pro/cons** of this approach:\n\n- [Automated Machine Learning - An Overview](https://medium.com/thinkgradient/automated-machine-learning-an-overview-5a3595d5c4b5)\n\nIf you want to dive deeper into the field, here you can find an awesome collection of AutoML papers organized by application type:\n\n- [Awesome AutoML Papers](https://github.com/hibayesian/awesome-automl-papers#expand-reduce)\n\n#### AutoML Tools\n\nAfter taking a look at the previous resources (take your time) it's time to figure out which AutoML tool is right for you. In fact, there are several platforms that provide them (Google Cloud Platform [is a pioneer with AutoML](https://cloud.google.com/automl?hl=it)), but they have different features and support different types of applications.  \n\nHere you find a very recent paper that surveys the AutoML field:\n\n- [**Towards Automated Machine Learning: Evaluation and Comparison of AutoML Approaches and Tools**](https://arxiv.org/abs/1908.05557)\n- [Awesome AutoML Tools](https://github.com/neomatrix369/awesome-ai-ml-dl/blob/master/things-to-know.md#automated-machine-learning-tools-or-partial-automl-tools)\n\nAfter you read this paper, you should be able to infer what tool or which platform is best suited to your case.\n\nHere's a more detailed State-of-the-Art survey, with practical examples and detailed explanations about how AutoML principles work:\n\n- [AutoML: A Survey of the State-of-the-Art](https://arxiv.org/pdf/1908.00709.pdf)\n\nHere you find another interesting comparison of the different platforms:\n\n- [AutoML Software Comparison](https://aimultiple.com/automl-software)\n\n--- \n\nIf you want to get started with the Google's AutoML platform, here you can find a good series of tutorials about it: \n\n- [AutoML Vision Beginner's guide](https://cloud.google.com/vision/automl/docs/beginners-guide)\n- [AutoML Tables Beginner's guide](https://cloud.google.com/automl-tables/docs/beginners-guide)\n- [AutoML Natural Language Beginner's guide](https://cloud.google.com/natural-language/automl/docs/beginners-guide)\n- [AutoML Translation beginner's guide](https://cloud.google.com/translate/automl/docs/beginners-guide)\n\nJust try it out!\n\n::: warning\nOften AutoML jobs consume a lot of computational resources (since it often requires a search in the model architectures space), so watch your back with the billing of the platform that you choose!\n:::\n\n## No Free Lunch and Black Boxes\n\nIt may seem too good to be true, right? There are actually some aspects to be careful about when choosing an AutoML approach. \n\n- Not all data types are suitable / supported by the currently available frameworks (autoML works best with tabular data). More complex data formats (like images, videos, audio...) aren't often considered in modern AutoML frameworks.\n- However, it is important to know the data well, to know what information (often called signals) it contains, and to know what information we want to derive from it. \n- There is no such thing (as usual) as a _silver bullet_, so don't expect spectacular results in a magical way, on every problem you approach with AutoML. \n- It's usually computationally intensive, this can rapidly inflate the billing costs of the platform you're working on.  \n\nAnother **issue** you must consider when applying AutoML techniques, is the **opacity** that you bring to the process.\n\nThe concept of \"[**Black Box**](https://towardsdatascience.com/the-black-box-metaphor-in-machine-learning-4e57a3a1d2b0)\", linked to more complex ML algorithms (such as neural networks) makes the resulting ML models \"opaque\" and therefore difficult to explain, **should be equally considered for all steps of the Data Science process to which some automatic decision applies**.\n\nFor example:\n\n- If some data preprocessing steps are decided from the machine, _why_ are they like that?\n- Is it possible that these choices will affect the models that will then be trained on the data? If yes, _how_?\n- If some features have been dropped and others have been chosen for the training, _why_? \n- If a certain model was chosen to be trained on data, _why_ that model? And if the data changed over time, would that model be able to _adapt_ to the new situation (after appropriate re-training)?\n\nAs you can see, as there are many pros in using AutoML, there are also various issues that can be problematic.\n\n::: tip\n**What does Virgilio think of AutoML?**\n\nBasically, it's a very good set of tools, which when used in a smart way can make Data Scientist's life a lot easier, guiding them in the exploration and transformation of data, in the choice of the most suitable ML models and so on. \n\nOn the other hand, it injects opacity into every step of the Data Science process to which it is applied, so watch your back!\n::: \n\n## Conclusions\n\nIn this guide, you have seen how automation can bring enormous benefits to the whole Data Science process, especially in terms of the credibility of results (Reproducibility) and time savings. \n\nYou've also seen what AutoML is and what its (great) potential is, but also the potential risks it brings with it in terms of opacity (Black Box concept). "
  },
  {
    "path": "content/purgatorio/launch-and-mantain-the-system/monitoring-usage-and-behavior.md",
    "content": "---\ntitle: Monitoring Usage and Behavior\nauthor: clone95\ndescription: This guide introduces you to the best practices of monitoring Machine Learning models in production, and ensuring that they behave as expected.\n---\n\n# Index \n\n- [Trusting is Good Not Trusting is Better](#Trusting-is-Good-Not-Trusting-is-Better)\n- [Monitoring the Behavior](#Monitoring-the-Behavior)\n- [Monitoring the Usage](#Monitoring-the-Usage)\n- [Conclusions](#Conclusions)\n\n\n## Trusting is Good Not Trusting is Better\n\nApplication monitoring is a _key_ part of running software in production. \n\nWithout it, the only way of finding an issue is through sheer luck or because a client has reported it. \n\nBoth of which are less than ideal, to say the least!\n\n**You wouldn't deploy an application without monitoring, so why do it for Machine Learning models?**\n\nSo let's Start!\n\nThe first resource you should go through is the following: \n\n- [How to Monitor Machine Learning Models](https://christophergs.com/machine%20learning/2020/03/14/how-to-monitor-machine-learning-models/)\n\nIt's a very detailed and comprehensive blog post and it addresses these topics:\n\n- What makes ML systems monitoring hard?\n- How can we monitor the usage and behavior of the model? \n- What are the key metrics to track and alert on?\n- What are the key principles for monitoring the ML system?\n\nOnce you are done with the previous blog post, you can refer to the related chapter of the book [Machine Learning Engineering](http://www.mlebook.com/wiki/doku.php) for a more detailed guide (strongly recommended buy, but you can read it for free online).\n\n- [Chapter 8 - Model Serving and Monitoring](https://www.dropbox.com/s/nj23m5myng9gram/Chapter8.pdf?dl=0)\n\nSee also:\n - [There are two very different ways to deploy ML models, here’s both](https://towardsdatascience.com/there-are-two-very-different-ways-to-deploy-ml-models-heres-both-ce2e97c7b9b1)\n\nWith these two resources, you should understand broadly the reasons and challenges of monitoring the Machine Learning models in production, and you should have reasonable strategies to tackle them. \n\nAs you know, the two main challenges regarding the model monitoring are:\n\n- How does the system behave?\n- How is the system used?\n\nLet's see some specific resources for these two challenges.\n\n## Monitoring the Behavior\n\nWhen monitoring the behavior of the ML model in production, you should consider many aspects:\n\n- **Setting a baseline:**\n    A good idea is to have a baseline model before we start monitoring or measuring. Of course, if we are starting monitoring for the first time then that is our baseline.\n    After establishing the baseline model, you can keep that static and make all comparisons and references with regards to this baseline, allowing you to ask the question: \"How has the system been behaving since [important milestone/change]?\"\n\n    See: \n    - [What does “baseline” mean in the context of machine learning?](https://datascience.stackexchange.com/questions/30912/what-does-baseline-mean-in-the-context-of-machine-learning)\n    - [How To Get Baseline Results And Why They Matter](https://machinelearningmastery.com/how-to-get-baseline-results-and-why-they-matter/)\n\n\n- **Data in:**\n    - Monitor whether the data you're processing looks like the data you trained on. ([data drift challenge](https://www.cmswire.com/digital-experience/data-drift-what-it-is-and-how-to-avoid-it/)) E.g., use simple (comparatively interpretable) distributional models to try to track whether data looks \"sufficiently\" similar.\n    \n    See:\n    - [Calculate Similarity — the most relevant Metrics in a Nutshell](https://towardsdatascience.com/calculate-similarity-the-most-relevant-metrics-in-a-nutshell-9a43564f533e)\n    - [How to measure similarity or dissimilarity between two data set?](https://www.researchgate.net/post/How_to_measure_similarity_or_dissimilarity_between_two_data_set)\n\n\n- **Addressing data drift over time:**\n    \n    - Is your data distribution non-stationary? I.e. are you expecting your model to degrade due to the data changing over time?\n\n    - If so you can do anomaly detection on the stream and track the fractions of anomalous data points over time.\n    - You can also find out if the distribution of the live-data or evaluation data matches that of the training set (or even the held-out test/evaluation set), for example with the [Kolmogorov-Smirnov](https://en.wikipedia.org/wiki/Kolmogorov%E2%80%93Smirnov_test) test.\n\n    See:\n    - [A Gentle Introduction to Concept Drift in Machine Learning](https://machinelearningmastery.com/gentle-introduction-concept-drift-machine-learning/)\n    - [Addressing feature drift in data streams using iterative subset selection](https://dl.acm.org/doi/10.1145/3325061.3325063)\n    - [Drifter_ML - A machine learning testing framework for sklearn and pandas](https://github.com/EricSchles/drifter_ml)\n\n- **Runtime Performance:**\n    When running the inference part of your models, you should consider the specific requirements of the application at hand. Some of them could require faster inference, others could serve better if the accuracy is high, so maybe you can average the predictions of several models (ensemble methods), sacrificing the speed of the computation. \n\n    Consider both runtime and model-specific performances:\n    - Platform performance\n        - Hardware specific\n        - Environment-specific (OS or software installation, or configuration, Cloud provider)\n    - Model-specific performance\n        - Input data specific\n        - Model algorithm-type specific (model built with Scikitlearn versus Pytorch v/s TF)\n    \n    See:\n\n    - [TensorFlow Performance Guide](https://www.tensorflow.org/tfx/serving/performance)\n    - [Is there are a way to speed up the inference time on CPU?](https://www.reddit.com/r/MachineLearning/comments/ezpl89/d_is_there_are_a_way_to_speed_up_the_inference/)\n    - [Ways to significantly increase inference speed for deployment?](https://www.reddit.com/r/MachineLearning/comments/fd9cz0/d_ways_to_significantly_increase_inference_speed/)\n\n- **Data out:**\n\n    - Distribution of predictions by the label. If you see this shifting a lot, another flag that inference data is shifting, which could be a point of concern.\n\n    - Distribution of predictions by confidence/probability. There is a pretty rich (& ongoing) field of research here, but, as a starter, I'd also expect the distribution of raw probabilities (logits) to look similar.\n\n    - As a corollary, looking at overall change in the confidence of outputs. E.g., a drop in confidence values is possibly a concerning sign. (Of course, vanilla NNs are also prone to be highly overconfident on new/OOD data, so you need to be cautious; if this is really critical, could look at different NN variants that generate better confidence assessments.)\n\n    - Consider whether training a model w/ out-of-domain detector (OOD) makes sense or not.\n\n    - It's also a sign that when we see such changes that our last test/evaluation dataset integrity is failing. You should update the test/evaluation datasets from production data and retrain the model, either fully or incrementally.\n\n    See: \n    - [How to determine the confidence of a neural network prediction?](https://stats.stackexchange.com/questions/247551/how-to-determine-the-confidence-of-a-neural-network-prediction)\n\n- **Human evaluation:**\n\n    - Not really going to be avoidable, but you can use a lot of the above to narrow down what people look at. Have people look at the examples which are most alarming, based on the checks you have in place. Over time, we can better calibrate what alerts are of concern.\n\n    - A related option is to use a calibrated model of confidence/estimated error rate to inform what people should look at. If you pick up the lowest 1% confidence and the internal estimated error rate is 5%, then if you explore that 1% and see > 5% error rate, that could be a concern. \n\n    See: \n    - [Comparing Automatic and Human Evaluation of Local Explanations for Text Classification](https://www.aclweb.org/anthology/N18-1097.pdf)\n\n\n## Monitoring the Usage\n\nIf monitoring the behavior of the model can be technically hard, you should also be sure that your users are leveraging the model in the correct way. \n\nWith \"users\" we can refer to _everything that consumes the output of the ML model_, it can be a system, a human, or an ensemble of systems and humans.\n\n::: tip \nIf you're serving your model through an API (recommended way), you can refer to the API monitoring best practices in general (not specific for Machine Learning).\n:::\n\nSee: \n\n- [What's the best way to monitor your REST API?](https://stackoverflow.com/questions/28760946/whats-the-best-way-to-monitor-your-rest-api)\n- [Measure Anything, Measure Everything](https://codeascraft.com/2011/02/15/measure-anything-measure-everything/)\n\nThe major issue you can encounter when dealing with people is that they choose to not use the ML model. \n\nThis can happen for a variety of reasons, maybe they don't have _confidence enough_ in the system, or they don't understand _how to_ use it.\n\nTake a look at this awesome guide from Google's engineers:\n\n> The People + AI Guidebook was written to help user experience (UX) professionals and product managers follow a human-centered approach to AI.\n\n- [People + AI Guidebook](https://pair.withgoogle.com/guidebook)\n\nThis detailed resources can get you started about the following topics: \n\n- User Needs + Defining Success\n- Data Collection + Evaluation\n- Mental Models\n- Explainability + Trust\n- Feedback + Control\n- Errors + Graceful Failure\n\n\n::: tip General Tips\n- None of the above techniques is a silver bullet\n- Use only those things that work for you and are applicable in your use-cases\n- Don't literary follow any of the ideas, try them out and see how they work for you\n:::\n\n## Conclusions\n\nAfter walking through the resources listed here, you should be comfortable with the challenges and caveats of monitoring your Machine Learning model in production. \n\nAs you've seen, there are both technical challenges (data drift, input data check, output data check) and _\"human-related\"_ challenges. In particular, Google's People + AI Guidebook will show you most of the human-related ones.\n\nIn the next section, **Now Go Build**, we'll give you a list of tips, best practices, and suggestions about _how to put in practice_ everything you've learned in the Purgatorio!\n"
  },
  {
    "path": "content/purgatorio/launch-and-mantain-the-system/serving-trained-models.md",
    "content": "---\ntitle: Serving Trained Models\nauthor: clone95\ndescription: In this guide, you will learn what are the most widely used technologies and techniques to deploy Machine Learning models on the web, to be consumed by customers or other systems. \n---\n\n# Index \n\n- [Some Important Questions](#Some-Important-Questions)\n- [Produce Good Documentation](#Produce-Good-Documentation)\n- [Model Deployment](#Model-Deployment)\n- [Conclusions](#Conclusions)\n\n\n## Some Important Questions\n\nOnce you have a beautiful and well-tested trained Machine Learning model and you want to make it available to the external world, you should reason about these questions and answer them.\n\nThe answers will heavily depend on your use case, and it's impossible to capture every situation in this guide, but hopefully, this checklist can help you considering al the possible situations you can encounter and reason about them _before_ realizing them when it is too late.\n\n- **How** is the system expected to work in general?\n    - Will the model be hosted on a machine and used locally, or will it serve his predictions over the Internet?  \n    - What is the input of the model?\n    - What is the output of the model?\n    - What constraints do you need to put over input and output (size, format, number of requests... )? \n\n- **Who (or what)** is going to use my model?\n    - Is the model going to be used by human users or another system?\n    - Is the model going to be used by you or someone else?\n    - If it's going to be used by other people, it's the usage well documented?\n    - Do they have the right permissions to use it?\n    - How are you gonna track their usage?\n    - Do you need a payment system? \n    - Can you be sure that the system won't be used maliciously?\n\n- What are the **requirements** needed to use the model as intended?\n    - What is the size of the model?\n    - Is it going to be held in memory or loaded up once a request comes? \n    - How many requests is the model going to receive, on average?\n    - What is the speed required for the inference of the model?\n    - How the size of the input/output affects the overall performance of the system (it's very easy to send documents over the Internet, while a high-quality video is more bandwidth-intensive?\n\n- Is the input example **meaningful** for the model?\n    - Is the input of the model coming from the same distribution of examples that the model has been trained over?\n    - If not, how can you exclude \"out-of-distribution\" inputs (classification before inference, outlier detection...)?\n    - How the performance of the model will impact the result (for each prediction, you have a confidence score, maybe you want to serve only predictions over a certain confidence threshold)? \n\n- What are the **costs** of serving my model?\n\n    - If the model is hosted locally or on your machine, the costs are often only the electricity you use to have a machine always turned on... but it's rare in 2020 to not leverage **Cloud providers** for serving models.\n    - If the model is hosted on some Cloud provider (which is often the case), what are the hosting costs?\n    - Often Cloud providers offer solutions where you pay for the number of requests that your model is receiving, what are these costs?\n    - Cloud providers bills different costs for different machine sizes (depending on n. of CPUs, GBs of RAM, the presence of a GPU...), are you choosing the right machine for your model?\n    - Cloud providers offer bills calculators that can estimate your costs, use them!\n    - If it's too costly to serve your model, can you make it more lightweight?\n\n\nOnce you have answered these questions, you should have a much clearer view of your serving requirements, and you can explore with much more consciousness the several serving possibilities, ranging from hosting the model on your machine (and serving it through REST APIs) to leveraging a CLoud provider like AWS, Azure or Google Cloud Platform.\n\n## Produce Good Documentation\n\nLike any other step of the Data Science Process, documenting the work done is fundamental to the success of the project. \n\nWe don't need to list the benefits that good documentation brings to a project, so we immediately understand what are the best practices to keep in mind when we produce documentation for our projects.\n\n#### Documenting in General\n\nRefer to the \"Documentation\" section of the [**Starting a Data Project** Guide](https://github.com/virgili0/Virgilio/edit/master/serving/purgatorio/define-the-scope-and-ask-questions/starting-a-data-project/starting-a-data-project.md) to have a nice introduction to good documentation practices and why documenting it's crucial for the success of any software project.   \n\n#### Documenting the Model Usage\n\nOne of the key questions you should have answered from [Some Important Questions](#Some-Important-Questions) is:\n\n- Who (or what) is going to use my model?\n\nIn case someone else is going to use the model, he could interact with it in two ways: directly with a user action or through another system.\nIn both cases **he needs** a clear reference about the usage and the expected behavior of the model. \n\nThe solution that Virgilio suggests is to use the [Model Cards](https://modelcards.withgoogle.com/about) technique from Google. \n\nYou can read here the detailed reasons behind Google's engineers in this regard!\n\n- [Model Cards for Model Reporting](https://arxiv.org/abs/1810.03993)\n\nSome examples: \n\n- [Face Detection Model](https://modelcards.withgoogle.com/face-detection)\n- [Object Detection Model](https://modelcards.withgoogle.com/object-detection)\n\nAs you can see, if you have never seen this model, the model card can definitely let you understand: \n\n- What the model does \n- What is the Input/Output\n- What are the expected performances\n- What are the limitations of the model\n\nThese are all important information for everyone who wants to use the model! \n\nBonus tip: \n\nIf you think you will be the only user of the model in the future, _don't underestimate the value_ that comes from good documentation, even for the author of the documentation!\n\n> In 6 months you will look at this code and ask \"Who the heck wrote this ***?\"\n\nHaving clear documentation will save you a lot of time and headaches.\n\n## Model Deployment\n\nOnce you have answered all the questions in the [Some Important Questions](#Some-Important-Questions) section, it's time to learn what are the best ways to deploy the model in the real world!\n\nVirgilio has set up for you some resources you can refer to, but most of the time [you will encounter real-world caveats](https://towardsdatascience.com/why-is-machine-learning-deployment-hard-443af67493cd) that will require you to choose the best tradeoff for the specific situation.\n\nHowever, luckily for us do exist best practices and common patterns to solve the majority of the most common problems when dealing with model deployment, and Virgilio collected for you the best free resources.\n\nStart with:\n\n- [Machine Learning Engineering Book - Chapter 7 - Model Deployment](https://www.dropbox.com/s/sslzy9vr4qwarlh/Chapter7.pdf?dl=0)\n\nThen take a look at the following videos, they're really informative:\n\n- [RESTful Machine Learning with Flask and TensorFlow Serving](https://www.youtube.com/watch?v=AVj3G2MbjOM)\n- [REST API with Python and Flask](https://www.youtube.com/watch?v=nfQdqp-0E50&list=PLL2hlSFBmWwzrhahyQscxASc3ZQFh95xl)\n\nHere you have a full detailed and practical course about how to create several examples of machine learning web applications:\n\n- [Machine Learning Web App](https://www.youtube.com/watch?v=tFjeUtFay_Q&list=PLJ39kWiJXSiyAFG2W3CUPWaLhvR5CQmTd)\n\nEventually, you can have a look at TensorFlow's official way to serve models, Tensorflow Serving.\n\nTensorFlow Serving is a flexible, high-performance serving system for machine learning models, designed for production environments. TensorFlow Serving makes it easy to deploy new algorithms and experiments while keeping the same server architecture and APIs.\n\n- [Tensorflow Serving Official Guide](https://www.tensorflow.org/tfx/guide/serving)\n- [Tensorflow Serving Official Examples](https://github.com/tensorflow/serving/tree/master/tensorflow_serving/example)\n- [More Tensorflow Serving Examples](https://github.com/yu-iskw/tensorflow-serving-example)\n\n\nThe Virgilio tip here is to not start with Tensorflow Serving because for learning purposes it can be an overkill, because of the number of options and configurations.\n\nTo build demonstrations or just try your model through the web, a small and simple Flask app can be enough.\n\n#### Cloud providers\n\nToday, most of the real-world Machine Learning problems require scale and flexibility (growing numbers of users, frequent re-training...). \n\nA good option to deploy ML models is to leverage the most important Cloud providers like [AWS](https://aws.amazon.com/it/), [Azure](https://azure.microsoft.com/it-it/) and [GCP](https://cloud.google.com/).\n\nThere's a ton of tutorial and informative videos on Youtube, both from the platform's official channels, and from independent creators, check out them!\n\nAll the three Cloud providers have a dedicated Machine Learning / Data Science suite of services, to it's often easy to rely on these for your deployment.\n\n- [Amazon SageMaker](https://aws.amazon.com/it/sagemaker/)\n- [Azure Machine Learning](https://azure.microsoft.com/it-it/services/machine-learning/)\n- [Google Cloud - AI Platform](https://cloud.google.com/ai-platform)\n\n**Just be very careful with the costs associated with the compute resources you ask the provider!**\n\n## Conclusions \n\nIn this guide you have seen most of the important questions you should ask yourself _before_ deciding to put a Machine Learning model in production, making it available for other users or systems. You also have a detailed list of all the resources that can get you from zero to full skill in practical model deployment.\n"
  },
  {
    "path": "content/purgatorio/now-go-build/a-messy-real-world.md",
    "content": "---\ntitle: A Messy Real World\nauthor: clone95\ndescription: This guide aims to show you the challenges and the messiness of real-world problems, and how to tackle them pragmatically. \n---\n\n# Index \n\n- [No Plan Survives Contact With the Enemy](#No-Plan-Survives-Contact-With-the-Enemy)\n- [Reality Check](#Reality-Check)\n- [I Want to Be Data Driven When I Grow Up](#I-Want-to-Be-Data-Driven-When-I-Grow-Up)\n- [The Problem of Siloed and Segregated Data](#The-Problem-of-Siloed-and-Segregated-Data)\n- [Managing Expectations](#Managing-Expectations)\n- [Conclusions](#Conclusions)\n\n**Disclaimer!**\n\nThis guide is intended to alert you to possible disappointing job offers, internships, real-world project collaborations.\n\nIt is in no way intended to be representative of the work environment or the people you will meet, but **Virgilio wants you to see what the worst-case scenario would look like.**\n\n## No Plan Survives Contact With the Enemy\n\n**Congratulations!**\n\nIf you are reading these words, you are probably back from _months and months_ (or years) of studying through the various resources of the Purgatorio, and have familiarized yourself with most of the concepts explored, and experienced some of them on datasets found around. \n\nYou may have built some small Data Science projects on GitHub to showcase, and you started applying for some Data Science internships or positions.  \n\nGaining confidence from the months (or years) of **study + practice** you've done, you accept the first internship you're offered. \n\n_Fast forwards a few weeks:_\n\nYou're very disappointed, the job is not what you expected, not at all! \n\nOn the first day of work, your boss gives you a \"dataset\" that a client gave him and asks you to get \"**an AI who understands how to make them useful**\" (what?!?).\n\nThe dataset has a lot of missing values, the column names are flimsy and nobody explained how to interpret them. Exploring those messy data you find that the column to predict has half the missing values, and the other columns have enough noise to make them unusable.\n\nSo this dataset, with your actual knowledge, is almost unusable!\n\nMoreover, **the salesmen were not aligned on the current possibilities of Artificial Intelligence** (as they call predictive models to sell them at higher price :D), and they promised the moon!\n\n---\n\nSad and desolate you take the negative comments of your boss, who thinks that you don't know how to do anything.\n\n\nWhat went wrong? Wasn't everything as rosy as you thought?\n\nEverything is fine, you just need some **reality check.** \n\n\n::: tip\nIf you've ever had a situation like this, well, it's probably better if you move away from such a boss). \n:::\n\n## Reality Check\n\nFor sure you've heard that [Data Scientist is The Sexiest Job of the 21st Century](https://hbr.org/2012/10/data-scientist-the-sexiest-job-of-the-21st-century), and a lot of articles and blogs describes the Data Scientist daily job as a walk in the park, without messiness and effort.\n\n**The inconvenient truth is completely different, and here are some reasons:**\n\n- Most of the Data Scientist's daily time [is related to ETL](https://www.quora.com/What-is-an-average-work-day-for-a-data-scientist) (Extract, Transform, and Load Data), not the funniest thing ever.\n- Real-world datasets are rarely complete, clean, well aggregated ([Machine learning isn't Kaggle competitions](http://jvns.ca/blog/2014/06/19/machine-learning-isnt-kaggle-competitions/)).\n- You don't have someone explaining how they were built or what to expect inside them (like a Kaggle \"data explanation\" section). \n- Often the datasets you are provided contain a lot of noise, and it is vital to know what to discard. \n- Someone thinks AI can solve all their problems and they are trying to throw AI at every problem or everything they come across.\n- Everyone is [expecting you to do fancy magic with data](https://www.reddit.com/r/datascience/comments/3m78k1/i_hire_data_scientists_this_is_the_stuff_this/), maybe they expect you to build a super-intelligent AI to fire employees and take over the world.\n\nOkay, maybe the last one's a joke... or not! \n\nSince there is a huge hype around the field of Data Science, **the expectations** of those who allocate the company budget to this topic are also very high!\n\nSee:\n\n- [Here’s why so many data scientists are leaving their jobs](https://towardsdatascience.com/why-so-many-data-scientists-are-leaving-their-jobs-a1f0329d7ea4)\n\n::: warning \nThat **doesn't mean** you have to be discouraged, it just means you have to have the right expectations! With the right expectations and premises, the work of Data Scientist is _challenging, satisfying and creates enormous value for those who use it!_\n:::\n\nThese common data-related problems are addressed in specific in the next sections.\n\n## I Want to Be Data Driven When I Grow Up\n\nCompanies, although rational and profit-driven structures are entities composed of humans, who are by their nature influential and emotional. This means that some of the factors that influence the decisions made in a company are irrational, dictated by emotions. \n\nOne decision a company can make is to push for innovation, and *that is good!*\n\nBut those who have to deal with innovation decisions may be at best ignorant about it, and at worst reluctant to change!\n\nSo what happens? \n\nThat often (human emotions) you get carried away by buzz-words, by themes around which there is Hype, without really understanding them or understanding if they can bring value. \nThis process often leads many organizations to want to call themselves [\"data-driven\"](https://www.cio.com/article/3449117/what-exactly-is-a-data-driven-organization.html), when they don't know what it means / what it could be used for!\n\nOften this kind of statement is also partly for advertising purposes... \n\n![Figure 1-1](./hype-1.jpg)\n\n\nAlso Relevant:\n\n![Figure 1-1](./hype-2.jpg) \n\n### **The bottom line:**\n\nBe careful when you talk to a \"data-driven\" company, do they know what they're talking about? Ask yourself, for example:\n\n- how does data impact the business?\n- is there a dedicated Data Science team?\n- are they aware of the real possibilities of predictive models that exploit data?\n- how much does being data-driven affect the company's marketing? \n\nRead these very good Reddit threads about building real data-driven businesses:\n\n- [How to create a ‘data-driven’ business?](https://www.reddit.com/r/datascience/comments/eecg2k/how_to_create_a_data_driven_business/)\n\n- [3 Challenges Companies Face in Becoming Data Driven](https://www.europeanbusinessreview.com/3-challenges-companies-face-in-becoming-data-driven/)\n\n- [The Top 5 Challenges of Creating a Data-Driven Culture (and How to Solve Them)](https://medium.com/@pelatum/the-top-5-challenges-of-creating-a-data-driven-culture-and-how-to-solve-them-9a2b9c1efa71)\n\nThere are various reasons why a company struggles to become data-driven, but perhaps one of the biggest problems is that of the \"silos\" inside a company.\n\n## The Problem of Siloed and Segregated Data\n\n[Elon Musk](https://it.wikipedia.org/wiki/Elon_Musk) is unquestionably one of the smartest and most creative company CEOs on the planet, he created highly disruptive companies like [SpaceX](https://www.spacex.com/) and [Tesla](https://www.tesla.com) from scratch and is one of the founding members of [OpenAI](https://openai.com/). \n\nIn one of the internal communication emails he says to all his employees at Tesla:\n\n> There are two schools of thought about how information should flow within companies. By far the most common way is a chain of command, which means that you always flow communication through your manager. The problem with this approach is that, while it serves to enhance the power of the manager, it fails to serve the company.\n\n> Instead of a problem getting solved quickly, where a person in one dept talks to a person in another dept and makes the right thing happen, people are forced to talk to their manager who talks to the manager in the other dept who talks to someone on his team. Then the info has to flow back the other way again. This is incredibly dumb.\n\n> Anyone at Tesla can and should email/talk to anyone else according to what they think is the fastest way to solve a problem for the benefit of the whole company. You can talk to your manager's manager without his permission, you can talk directly to a VP in another dept, you can talk to me, you can talk to anyone without anyone else's permission. Moreover, you should consider yourself obligated to do so until the right thing happens. The point here is not random chitchat, but rather ensuring that we execute ultra-fast and well. We obviously cannot compete with the big car companies in size, so we must do so with intelligence and agility.\n\n> One final point is that managers **should work hard to ensure that they are not creating silos within the company that create an \"us vs them\"**.\n\nAs you can see from Elon's words, the problem of siloed companies is a well-known issue, and to fight this problem have been thought best practices. Silos in a company bring with them only disadvantages, of which we are interested in those related to data:\n\n- data is collected, organized, and stored in a _non-homogeneous way_. \n- data can _overlap and create confusion._\n- you can't create truly objective and _comparable business metrics_.\n- to use data in an \"intelligent\" way and gain insights from it is very difficult because you have to _unify different data sources_ (one business unit stores everything in Excel files, another in an SQL Database, another in an online platform... and so on).\n\nTo learn more about how siloed data (that arise from a \"siloed\" company) take a read of the following links: \n\n- [What are Data Silos?](https://www.talend.com/resources/what-are-data-silos/)\n- [What is a Data Silo and Why is It Bad for Your Organization?](https://www.plixer.com/blog/data-silo-what-is-it-why-is-it-bad/) \n- [Siloed Data is Killing Your Business Analytics](https://www.cyfe.com/blog/siloed-data-is-a-destroyer/)\n\nHow to solve the siloed-data situation: \n\n- [Data Silos: What They Are and How to Get Rid of Them](https://blog.hubspot.com/service/data-silos)\n- [How To Breakdown Data Silos: Problems and Solutions](https://status.net/articles/data-silos-information-silos/)\n\n\n## Managing Expectations\n\nAnother issue you can encounter in real Data Science projects is the one related to the high expectations one has towards this field. All-day long we are inundated with articles that glorify artificial intelligence as the revolution of the century (if not the most important one ever) and how data is \"the new gold\". \n\nEven if it is true that AI and the use of data, in general, can bring enormous fruits to those who know how to exploit them realistically, they are not the panacea of all evil!\n\nBut the average Internet user (who might even be your future boss) doesn't necessarily know about it!\n\nThis phenomenon creates high expectations when you start Data Science projects, and it is vital to know how to manage expectations, otherwise, you risk disappointing (and a lot) those who have invested in it. \n\nHere you have some resources to learn more about this topic: \n\n- [Managing expectations of artificial intelligence - Nature](https://www.nature.com/articles/d41586-018-07504-9)\n- [Business and Data Science — Managing Expectations](https://towardsdatascience.com/business-and-data-science-managing-expectations-2e34de8e078e)\n\nHere you can find a complete guide in managing stakeHolders expectations, discussing:\n- Stakeholders management in a data science project is a must-have \n- Delivering an end-to-end data science project is about much more than just machine learning models\n- Which are the various stakeholders involved in a typical data science project\n\n- [A Data Science Leader’s Guide to Managing Stakeholders](https://www.analyticsvidhya.com/blog/2019/08/data-science-leader-guide-managing-stakeholders/)\n\n\n## Conclusions\n\nIn this guide we have seen how many real problems are created when you go from pure science to making it create value for someone!\n\nPromoting proper _data collection, use, archiving, and finally _managing the expectations_ of those who fund Data Science projects is **crucial** to create real value for an organization. \n"
  },
  {
    "path": "content/purgatorio/now-go-build/best-practices.md",
    "content": "---\ntitle: Best Practices\nauthor: clone95\ndescription: A detailed collection of the best practices of the Data Science process, and how you can get the most value out of software engineering principles. \n---\n\n\n# Index \n\n- [The Mutant Runner](#The-Mutant-Runner)\n- [Producing Good Data Science Software](#Producing-Good-Data-Science-Software)\n- [How to Discover and Adopt Data Science Best Practices](#How-to-Discover-and-Adopt-Data-Science-Best-Practices)\n- [Data Science Best Pratices](#Data-Science-Best-Pratices)\n    - [General Rules](#General-Rules)\n    - [Deliver Successful Projects](#Deliver-Successful-Projects)\n    - [Interesting Reads](#Interesting-Reads)\n- [Conclusions](#Conclusions)\n\nThe purpose of this guide is not so much to collect every existing best practice in Data Science (a very difficult task) but rather to give you the method by which to look for new best practices and put them into practice.  \n\nHowever, several resources are listed that should be more than sufficient to develop advanced and robust practices for your Data Science projects. \n\nInteresting read:\n\n- [Lessons from Optics, The Other Deep Learning](http://www.argmin.net/2018/01/25/optics/)\n\n## The Mutant Runner\n\nExploring the Purgatorio, you've encountered a lot of links and websites that list good practices for Data Science, but it happens that those lists can be either contradictory or incomplete.\n\nWhy is it so difficult to build _good and consistent_ practices for Data Science?\n\n- Knowledge is fragmented among the many researchers, professors, and practitioners\n- Data Science development best practices are often hidden in skillful teams at top companies and are hardly shared \n- Data Science problems are rarely similar, and never the same\n- Algorithms that improve the state of the art are published in conferences continuously\n- New methods to evaluate algorithms are proposed\n- Tools and libraries are developed and improved, new ones are created for every need\n\nSo, if developing and adopting good Data Science practices is not trivial, some ways allow us to get around the obstacle. \n\nRead:\n\n- [Is it time for Data Science / Engineering patterns?](https://dev.to/renatocf/is-it-time-for-data-science--engineering-patterns-1782)\n\n## Producing Good Data Science Software\n\nFirst, doing Data Science means applying programming to statistics and mathematics. \n\nThis can be done in various forms, such as data visualization, statistical analysis, or by building predictive models (and more...).  \n\nThe only certainty is that you are **almost always writing software!**\n\nNow, software design, coding, and maintenance offer challenges widely faced by software engineering over the last 40-50 years of history, and there are advanced best practices to address the biggest challenges offered by the complexity of modern software.\n\nTo learn software development best practices, check these links:\n\n- [**Software Engineering at Google - Best Practices from Google**](https://arxiv.org/ftp/arxiv/papers/1702/1702.01715.pdf)\n- [Best Coding Practices](https://en.wikipedia.org/wiki/Best_coding_practices)\n- [30 best practices for software development and testing](https://opensource.com/article/17/5/30-best-practices-software-development-and-testing)\n- [Coding Best Practices - UTexas](https://www.cs.utexas.edu/~mitra/csSummer2014/cs312/lectures/bestPractices.html)\n\nThese Reddit threads:\n\n- [**Best practices in software development workflow**](https://www.reddit.com/r/software/comments/24406h/best_practices_in_software_development_workflow/)\n- [What are \"good coding practices?\"](https://www.reddit.com/r/webdev/comments/8gkzat/what_are_good_coding_practices/)\n- [How do I get better at software engineering and software design?](https://www.reddit.com/r/compsci/comments/2mhwcx/how_do_i_get_better_at_software_engineering_and/)\n- [Senior programmers and developers, what are some best practices / advice every junior programmer should know?](https://www.reddit.com/r/learnprogramming/comments/8bt1j4/senior_programmers_and_developers_what_are_some/)\n\nAnd buy one of these books, they are definitely worth the price:\n\n- [The Pragmatic Programmer](https://www.amazon.com/Pragmatic-Programmer-Journeyman-Master/dp/020161622X/ref=sr_1_2?crid=28MD79HWTUZT1&dchild=1&keywords=the+pragmatic+programmer&qid=1597418514&s=books&sprefix=the+pr%2Cstripbooks-intl-ship%2C266&sr=1-2)\n- [The Clean Coder](https://www.amazon.com/dp/0137081073/ref=cm_sw_r_cp_api_i_6rJ6AbTS2DYWA)\n\nWith these resources, you should be well equipped to understand and tackle the challenges of modern software programs, but most importantly you can transfer these concepts to the Data Science problems (that are software problems too).\n\n## How to Discover and Adopt Data Science Best Practices\n\nIn addition to all the challenges of traditional software, Data Science offers **additional ones** to deal with, caused by the reasons listed in [The Mutant Runner](#The-Mutant-Runner) section. \n\nWhat Virgilio suggests to you to discover and apply the specific good practices of Data Science... is simply to seek them out! \n\nVirgilio was born as a place to collect all these kinds of resources and concepts, but it's obviously impossible to expect it to contain everything!\n\nSo, when dealing with a specific problem, Google for best practices about it, maybe adding the website source you want to look into:\n\n::: tip\nFor example, if you are dealing with an image classification project, you should search:\n\n- \"Image classification best practices\"\n- \"Image classification best practices Reddit\"\n- \"Image classification best practices StackExchange\"\n:::\n\nThis kind of approach, especially skimming Reddit threads for hidden gem-comments, can give you invaluable insights from experts!\n\nAnd if you can't find anything, about it, just post a question!\n\n\n## Data Science Best Practices\n\nThis is a **pretty good** but sure **not definitive** list of the best links Virgil has found, listing the best practices currently widespread in the field of Data Science.\n \nBe sure to check the points of the [Automation and Reproducibility](../launch-and-mantain-the-system/automation-and-reproducibility) Virgilio Guide!\n\n### General Rules\n\n- [Data scientists, the only useful code is production code](https://thuijskens.github.io/2018/11/13/useful-code-is-production-code/)\n- [Development Workflows for Data Scientists](https://resources.github.com/downloads/development-workflows-data-scientists.pdf)\n- [Deep Learning: Common Practices](https://www.youtube.com/watch?v=Hb6ISunEJcI&list=PLpOGQvPCDQzvgpD3S0vTy7bJe2pf_yJFj&index=22&ab_channel=AndreasMaier)\n- [Good Enough Practices for Scientific Computing](https://swcarpentry.github.io/good-enough-practices-in-scientific-computing/)\n- [Andrew NG - Deep Learning best practices book](https://www.deeplearning.ai/machine-learning-yearning/)\n- [Machine Learning Engineering by Andriy Burkov](http://www.mlebook.com/wiki/doku.php)\n- [Google: Rules of Machine Learning](ttps://developers.google.com/machine-learning/guides/rules-of-ml)\n\n### Deep Learning Best Practices\nThis is the most useful set of resources about Deep Learning in production you can find over the Internet, be **sure** to take it!\n\n- [Full Stack Deep Learning](https://course.fullstackdeeplearning.com/)\n\n### Deliver Successful Projects\n- [Structuring Machine Learning Projects](https://www.coursera.org/learn/machine-learning-projects)\n- [Cookiecutter Data Science Project Template](https://drivendata.github.io/cookiecutter-data-science/)\n- [Organizing machine learning projects: project management guidelines](https://www.jeremyjordan.me/ml-projects-guide/)\n- [A Guide to Production Level Deep Learning](https://github.com/alirezadir/Production-Level-Deep-Learning)\n- [A smooth approach to putting machine learning into production](https://maxhalford.github.io/blog/machine-learning-production/)\n\n### Interesting Reads\n- [Machine Learning: The High-Interest Credit Card of Technical Debt](https://storage.googleapis.com/pub-tools-public-publication-data/pdf/43146.pdf)\n- [The ML Test Score: A Rubric for ML Production Readiness and Technical Debt Reduction](https://static.googleusercontent.com/media/research.google.com/cs//pubs/archive/aad9f93b86b7addfea4c419b9100c6cdd26cacea.pdf)\n\n## Conclusions\n\nIn this guide, you've seen that _Data Science problems_ are at their core _Software problems_, and you've learned that **there's no such thing as a well-defined and stable set of best practices**, and that they always evolve over time. \n"
  },
  {
    "path": "content/purgatorio/now-go-build/transfer-learning.md",
    "content": "---\ntitle: Transfer Learning\nauthor: clone95\ndescription: A detailed guide about what is Transfer Learning, how to use it, and a lot of resources found on the web that shares pre-trained models.\n---\n\n# Index \n\n- [What is Transfer Learning](#Why-Do-You-Need-Transfe-Learning)\n- [Transfer Learning Magical Properties](#[TransferLearning-Inner-Workings)\n- [How Does Transfer Learning Work](#How-Does-Transfer-Learning-Work)\n- [Where to Find Pretrained Models](#Where-to-Find-Pretrained-Models)\n- [Conclusions](#Conclusions)\n\n##  What is Transfer Learning\n\n[Transfer Learning](https://en.wikipedia.org/wiki/Transfer_learning) is a research problem in Machine Learning that focuses on storing knowledge gained while solving one problem and applying it to a different but related problem. \n\nThis is done by using an existing model, _pre-trained_ on another dataset (usually bigger and with generic content, like [ImageNet](http://www.image-net.org/)), and then _fine-tuning_ the model on a smaller and similar dataset.\n\nFor example, you can fine-tune a pre-trained model from ImageNet on your much smaller dataset of images, in order to benefit the pre-training and obtain a series of almost-magical properties and results.\n\nTo get a comprehensive overview of Why, What and How is used Transfer Learning, plus possible applications, read this awesome article:\n\n- [Transfer Learning - Machine Learning's Next Frontier](https://ruder.io/transfer-learning/index.html)\n\n\n#### Transfer Learning Magical Properties\n\nThe theory of Transfer Learning suggests that when using a pre-trained model on a similar dataset:\n\n**You need less**:\n- Data: you need much smaller datasets to obtain the same (or better) model performances\n- Computational Power / Computational Time: empirical results have shown that pre-trained models reach top performances after much fewer epochs of training, than starting the training from scratch\n\n**You improve:**\n- Out-of-sample generalization: when predicting on test data you often obtain better accuracy, thus reducing overfitting (or whatever metric you're using)\n- Robustness: you make the model more \"robust\" to real-world low-quality data  \n\n\nSo, **the first thing to do** every time you frame a new problem, is to ask yourself:\n\n**Can I leverage Transfer Learning in solving this problem?**\n\nIf the answer is yes, be sure that the model you're using:\n\n- is robust and produces sounds results\n- it's results are reproducible \n- it's input it's compatible with your data\n- the source dataset (on which the model has been pre-trained) and the target dataset (your one) are similar enough\n\nSee:\n\n- [Finding Similarities in Datasets](https://medium.com/@janetnim401/finding-similarities-in-datasets-350072a78a18)\n- [How to measure similarity or dissimilarity between two data set?](https://www.researchgate.net/post/How_to_measure_similarity_or_dissimilarity_between_two_data_set)\n- [Three Similarity Measures between One-Dimensional Data Sets](https://www.emis.de/journals/RCE/V37/V37n1a06Gonzalez-AbrilEtAl.pdf)\n\n\n## How Does Transfer Learning Work\n\nThe practice of Transfer Learning allows reusing most of the parameters (weights) of a neural network previously trained on a problem similar to the one we have to solve, dwelling on the training only of the last layers that are usually those dedicated to the classification and/or regression of the features obtained with the previous layers.\n\nThis allows us to obtain two key results:\n\n- reuse of the behavior of a model already trained to effectively **extract features** from input data\n- limit processing to a significantly **smaller number of parameters**, thus speeding up the training time by a big margin (corresponding to the last layers)\n\nFor example, if we were to classify apple varieties from an image, we could start by using a neural network already trained to classify images of planes, cars, dogs, cats, eggs, etc... This is because of the greater variety of training dataset ensures a better ability to extract features of various kinds from images.\n\nOf the _pre-trained neural network_, we would keep only the initial layers, because they extract lower-level features (for examples lines and edges, which are common across every existing 2D image), and so we redefine only the last layers of classification.\n\nThe reused layers would be labeled as \"read-only\" or \"frozen\", in order to train only the parameters corresponding to the last layers, speeding up the training time, reducing the processing power required, and generally improving the accuracy.\n\nIn general, the set of layers that are reused by a pre-trained network is called a backbone or feature-extractor.\n\nThe practice of applying Transfer Learning theory to real-world models is called \"fine-tuning\".\n\nOften where using a pre-trained model it's a good practice to reuse all the layers except the last one, but you can experiment with removing last _N_ layers (usually not more than 3-4).\n\nTo learn more about Transfer Learning:\n\n- [A Comprehensive Survey on Transfer Learning](https://arxiv.org/abs/1911.02685?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%253A+arxiv%252FQSXk+%2528ExcitingAds%2521+cs+updates+on+arXiv.org%2529)\n- [How transferable are features in deep neural networks?](https://papers.nips.cc/paper/5347-how-transferable-are-features-in-deep-neural-networks.pdf)\n- [Using Pre-Training Can Improve Model Robustness and Uncertainty](https://arxiv.org/abs/1901.09960)\n- [What makes ImageNet good for transfer learning?](https://arxiv.org/abs/1608.08614)\n\n## Where to Find Pretrained Models\n\nHaving clear in mind how useful it is to be able to use pre-trained templates to solve your problem, let's now see where on the Internet you can find these templates, plus some guides and tutorials to do the _fine tune_ them.  \n\nSome general purposes places where you fill find pre-trained models are:\n\n- [Model Zoo](https://modelzoo.co/)\n- [TensorFlow Hub](https://www.tensorflow.org/hub)\n- [Papers with Code](https://paperswithcode.com/)\n- [Keras Pre-Trained Models](https://keras.rstudio.com/articles/applications.html)\n\nIt's very likely that you will find a model that fits your needs in these places. If you can't try to google \n\n### Pre-Trained Models: Computer Vision\n\n- [Computer Vision pre-trained models - GitHub](https://github.com/balavenkatesh3322/CV-pretrained-model?fbclid=IwAR3Q1-xSTP46P5Mg_BRxgxskDBS9q5B7wHeJl_z3TO_0ABee3LkYIDd4bI0)\n- [PyTorch Image Models](https://github.com/rwightman/pytorch-image-models)\n- [PyTorch Segmentation Models](https://github.com/qubvel/segmentation_models.pytorch)\n- [Classification Models (TF and Keras)](https://github.com/qubvel/classification_models)\n\n### Pre-Trained Models: Natural Language Processing and Understanding\n\n- [NLP Pre-Trained Models](https://github.com/balavenkatesh3322/NLP-pretrained-model)\n- [Pre-Trained Models for Natural Language Processing: A Survey](https://arxiv.org/abs/2003.08271)\n- [Hugging Face Website](https://huggingface.co/)\n- [Hugging Face Repository](https://github.com/huggingface)\n- [NLP Recipes - Microsoft](https://github.com/microsoft/nlp-recipes)\n\n### Transfer Learning Tutorials\n\n- [A Comprehensive Hands-on Guide to Transfer Learning](https://towardsdatascience.com/a-comprehensive-hands-on-guide-to-transfer-learning-with-real-world-applications-in-deep-learning-212bf3b2f27a)\n- [BigTransfer (BiT): State-of-the-art transfer learning for computer vision](https://blog.tensorflow.org/2020/05/bigtransfer-bit-state-of-art-transfer-learning-computer-vision.html)\n- [Transfer Learning in Practice with Keras](https://www.hackerearth.com/practice/machine-learning/transfer-learning/transfer-learning-intro/tutorial/)\n- [Transfer learning with a pretrained ConvNet](https://www.tensorflow.org/tutorials/images/transfer_learning)\n- [Fine-tuning a BERT model](https://www.tensorflow.org/official_models/fine_tuning_bert)\n- [Pytorch Model Transfer Learning for Computer Vision](https://pytorch.org/tutorials/beginner/transfer_learning_tutorial.html)\n\n\n## Conclusions\n\nIn this guide, you've seen what is Transfer Learning, why it's so useful, and why it's a hot topic in research today. Also, now you know where to find the model that fits your needs!"
  },
  {
    "path": "content/purgatorio/select-and-train-machine-learning-models/deep-learning-theory.md",
    "content": "---\ntitle: Deep Learning Theory\nauthor: clone95\ndescription: Get started with Deep Learning, the branch of machine learning that uses deep neural networks to solve problems that are intractable for traditional Machine Learning systems. This guide is library-agnostic.\n---\n\n# Index\n- [Take your Bible with You](#Take-your-Bible-with-You)\n- [What is Deep Learning](#What-is-Deep-Learning)\n- [Why Deep Learning](#Why-Deep-Learning)\n- [Neural Networks](#Neural-Networks)\n  + [Feedforward Neural Networks](#Feedforward-Neural-Networks)\n  + [Convolutional Neural Networks](#Convolutional-Neural-Networks)\n  + [Recurrent Neural Networks](#Recurrent-Neural-Networks)\n  + [Generative Adversarial Networks](#Generative-Adversarial-Networks)\n  + [AutoEncoders](#AutoEncoders)\n- [Training Neural Networks Effectively](#Training-Neural-Networks-Effectively)\n  + [Understanding BackPropagation](#Understanding-BackPropagation)\n  + [Transfer Learning](#Transfer-Learning)\n- [Conclusions](#Conclusions)\n\n\n## Take your Bible with You\n\nIn this guide you will **learn how to learn** the theory about Deep Learning, its most recent applications and challenges, and how you can develop solid DL skills. \n\nVirgilio has arranged for you a comprehensive list of link and resources, but he strongly recommends you to be use the following awesome book along the way:\n\n- [**Dive into Deep Learning**](http://d2l.ai/)\n\nThis book represents our attempt to make Deep Learning approachable, teaching you the concepts, the context, and the code (both in Pytorch, Tensorflow and MXNET).\n\nA more theoretical book is the following, and Virgilio used it to structure the content of this guide. \n\n- [**Deep Learning Book**](https://www.deeplearningbook.org/)\n\n*Armed with these 2 books, you should have no problem during your learning journey about Deep Learning!*\n\n## What is Deep Learning\n**[Deep Learning](https://en.wikipedia.org/wiki/Deep_learning) is a subcategory of Machine Learning** and indicates the branch that refers to algorithms called artificial neural networks. These algorithms are inspired by the structure and function of the [biological brain](https://dzone.com/articles/deep-learning-and-the-human-brain-inspiration-not).\n\nThe similarities between neural and artificial networks are much more limited than the name suggests. In fact, artificial neural networks (pieces of software) [are not even comparable](https://thenextweb.com/syndication/2018/09/01/human-intelligence-and-ai-are-vastly-different-so-lets-stop-comparing-them/) to their biological counterparts in terms of complexity, functions, and vastness of processes that take place in a brain!\n\nDespite this, neural networks are surprisingly useful in detecting hidden patterns in large amounts of data, quantities that are much larger than those that a single human could even see in the course of his life, let alone make sense of them!\n\nDeep Learning is part of a wider family of Machine Learning methods based on the assimilation of data representations, as opposed to algorithms for the execution of specific tasks (like more traditional ML algorithms).\n\nNeural networks (with which today the concept of Deep Learning is also brought to the attention of the general public) for examples [have been applied](https://deepindex.org/) in computer vision, automatic recognition of spoken language, natural language processing, audio recognition and bioinformatics (the use of computer tools to describe from a numerical and statistical point of view certain biological phenomena such as gene sequences, protein composition, and structure, biochemical processes in cells, etc.).\n\nThe _main characteristics_ of Deep Learning are the following:\n\n- The learning algorithm always involves at least a neural network (more precisely, an acyclic graph) composed by several layers of neurons. These neurons are connected across layers, and these connections are adjustable weights, represented by a floating number. These numbers (the weights, the connections) are randomly initialized and then tweaked through an iterative process (the training phase) showing the network a big amount of data examples. The output of the training phase is the trained model.\n\n- Neural networks are part of the [broader class](https://pathmind.com/wiki/ai-vs-machine-learning-vs-deep-learning) of algorithms for learning data representation within Machine Learning\n\n- Neural networks use various levels of cascading [non-linear units](https://www.quora.com/Why-does-deep-learning-architectures-only-use-the-non-linear-activation-function-in-the-hidden-layers) to perform characteristics extraction and transformation tasks. Each successive level uses the output of the previous level as input.\n\n- Neural networks learn multiple levels of representation corresponding to different levels of abstraction and these levels form a hierarchy of concepts. This is why Deep Learning is also called [Representational Learning](https://www.quora.com/What-is-representation-learning-in-deep-learning).\n\nAs the 2010’s draw to a close, it’s worth taking a look back at the monumental progress that has been made in Deep Learning in this decade.\n\nRead: [The Decade of Deep Learning](https://leogao.dev/2019/12/31/The-Decade-of-Deep-Learning/)\n\n## Why Deep Learning\n\nIn traditional Machine learning techniques, most of the features need to be identified by a domain expert in order to reduce the complexity of the data and make patterns more visible to learning algorithms to work.\n\nFor example, in a time-series dataset, traditionally an expert would separate the day from the month and year, giving them different columns in the dataset. Maybe he would build a \"season\" columns, of flag columns to indicate the Christmas holidays for example. \n\nSo an expert is helping the ML algorithm \"disentangling\" the several features it has to deal with. \n\nOne of the biggest advantages of Deep Learning algorithms is that they try **to learn features from data** in an **automatic** and **incremental** manner.\n\nThis reduces the need for domain expertise and hardcore feature extraction.\n\nSee: [What is the difference between handcrafted and learned features](https://datascience.stackexchange.com/questions/54390/what-is-the-difference-between-handcrafted-and-learned-features) \n\nAlthough the demand for huge computational capabilities may represent a limit, the scalability of Deep Learning thanks to the increase in available data and algorithms is what differentiates it from Machine Learning: _Deep Learning systems, in fact, improve their performance as the data increases while Machine Learning applications once they reach a certain level of performance are no longer scalable even by adding examples and training data to the neural network._\n\nThis is because in Machine Learning systems the characteristics of a given object (in the case of visual recognition systems) are extracted and selected manually and are used to create a model capable of categorizing objects (based on the classification and recognition of those characteristics).\n\nIn Deep Learning systems, on the other hand, the extraction of characteristics is done automatically: the neural network **learns autonomously** how to analyze raw data and how to perform a task (for example, classifying an object by recognizing its characteristics autonomously).\n\n**BUT!**\n\nWe'll see that even if Deep Learning is such a powerful approach, this doesn't mean that every problem should be tackled with it. \n\nData scarcity and computational requirements often suggest that more traditional Machine Learning algorithms should be considered way before Deep Learning algorithms.\n\nBasically, you _should avoid Deep Learning_ in the following cases:\n\n- If there is a simpler approach that provides an adequate solution.\n\n- If you need to know why the network produced the output it did, and this is critical to the application ([Deep Learning is hardly explainable](https://www.kdnuggets.com/2018/12/machine-learning-explainability-interpretability-ai.html)).\n\n- If you can't define a loss function.\n\n- If you don't have resources to train the network (data or GPU-power).\n\n- If you don't have resources to tweak out the hyperparameters (i.e. training multiple models with different configurations and choose the best one).\n\nSee the discussion and the article:\n\n[When not to use Deep Learning](https://www.reddit.com/r/MachineLearning/comments/6lo3va/d_when_not_to_use_deep_learning/)\n\nFrom the point of view of potentiality, if Deep Learning may seem more \"fascinating\" and useful than Machine Learning, it should be pointed out that the computational calculation required for their operation is really impacting, also from an economic point of view: the most advanced CPUs and top-of-the-range GPUs useful to \"hold\" the workloads of a Deep Learning system still cost thousands of dollars.\n\nThe use of computational capabilities via Cloud only partially mitigates the problem because the formation of a deep neural network often requires the processing of large amounts of data using clusters of high-end GPUs for many, many hours (so it is not said that buying \"as a service\" the necessary computing capacity is cheap).\n\n**Of course, this is valid for enterprise-level requirements, with a good local GPU you can still experiment and obtain good results with most of the small/medium-sized datasets. These will be enough to learn and be comfortable in training neural networks.**\n\nSee the [**Workspace Setup and Cloud Computing**](serving/purgatorio/define-the-scope-and-ask-questions/workspace-setup-and-cloud-computing/workspace-setup-and-cloud-computing.md) Guide for a complete overview of the opportunities that Cloud Computing offers you to train your deep learning models, or how to set up your local workspace.\n\n_Advanced approach_:\nIn the last couple of years, two [TPUs](https://cloud.google.com/tpu/docs/tutorials) and [clustered FPGAs](https://www.reddit.com/r/FPGA/comments/2tr15l/what_are_clusters_of_hundreds_of_fpgas_useful_for/) - these approaches use much less power than CPUs and GPUs and can do low- and mixed- precision calculations especially suited for NN kind of computations. And they are faster than CPUs and GPUs in performance (use less energy as well).\n\n## Neural Networks \n\nSo, it's time to understand what Neural Networks are and how you can use them in tackling real-world problems.\n\nFrom now on we'll follow a track that will take us from zero knowledge about Neural Networks to fully understanding them, thanks to the [Stanford University Deep Learning](https://www.youtube.com/watch?v=vT1JzLTH4G4&list=PL3FW7Lu3i5JvHM8ljYj-zLfQRF3EO8sYv) course and tutorials. Some of them come from Google, others from Stanford or Cambridge universities, and you will learn to leverage neural networks for several kinds of Deep Learning tasks.\n\nWe'll focus on the main 4 types of Neural Networks, even if novel architectures are discovered out on a daily basis (most of the time revisiting the existing ones, or mixing them in more complex ways).\n\n**It is not easy to understand the theory and application of Neural Networks at first glance.** You will need to go through tutorials repeatedly to fully comprehend the topic. You should expect a good amount of time to grasp all the concepts related. \n\nVirgilio tries to propose the following proven learning strategy, but you can tweak it as you prefer because every brain is different.\n\n> 3-step iterative cycle:\n\n>- 1 Get an idea of the main concepts through an **entire pass of this** [Stanford course](https://www.youtube.com/watch?v=vT1JzLTH4G4&list=PL3FW7Lu3i5JvHM8ljYj-zLfQRF3EO8sYv), don't worry too much about the math explanations, focus on the **what and why**.\n\n>- 2 Deeply explore **one kind of network**, with theory + tutorials + examples (e.g. RNN theory + RNN tutorials + RNN examples)\n>with the links and resources of the topic section of the guide.\n\n>- 3 After iterating the 2nd step for each topic, go through the entire Stanford course again. This time you can fully understand all the formulae, connecting them and picking up the \"math flow\" of the course.\n\nThis iterative process (1-2-2-2-2.....-3) can be repeated as many times as you want, and will probably construct in your mind a nice **general schema** of the things. In each complete iteration, you can drop one or more topics, and focus on the ones that are more interesting to you or not so clear.\n\nIn each section, there is content for the first time you arrive there (during the first complete iteration), and some content for next time you arrive there (after the 3rd step).\n\nThe structure follows the track proposed by the awesome Stanford course. You can find the slides [here](http://cs231n.github.io/) and the video [here](https://www.youtube.com/watch?v=vT1JzLTH4G4&list=PL3FW7Lu3i5JvHM8ljYj-zLfQRF3EO8sYv).\n\nThe course leans a bit more on the Convolutional Neural Network type, but it gives you a good understanding of all the other types.\n\n[This](http://introtodeeplearning.com/) is an alternative course from MIT, it has slightly different contents. \n\nOf course, you should consider [Deep Learning Specialization](https://www.coursera.org/specializations/deep-learning) from the same course of the [Machine Learning Theory](https://github.com/virgili0/Virgilio/blob/master/serving/purgatorio/select-and-train-machine-learning-models/machine-learning/machine-learning.md) Guide.\n\nIt's worth watching all of them, to compare and have a different point of view on the things you are learning, besides listening to some of the best professors of the world exploring each topic.  \n\nOnce you're done, you should have a complete panoramic view of Deep Learning, even if some concepts or passages are not clear, so it's time to dive deep into each Neural Network type to understand them fully. Without diving deep in them you won't be able to use them in a useful way, because as you've already seen they have a lot of parameters and tricky configurations to consider.\n\nThis is the [**Deep Learning Book**](https://www.deeplearningbook.org/) we refer to in each of the next sections.\n\n## Feedforward Neural Networks\n\nThe basic kind of Neural Network. Best suited for classification and regression tasks where the input is a tabular dataset, or very simple images or text. \n\n_First look (in order):_\n- [3Blue1Brown awesome intro](https://www.youtube.com/playlist?list=PLZHQObOWTQDNU6R1_67000Dx_ZCJB-3pi).\n- [This video](https://www.youtube.com/watch?v=v2tKoymKIuE).\n- [This is your bible](http://neuralnetworksanddeeplearning.com/chap1.html), understand it totally.\n- [This is a gem](https://playground.tensorflow.org/#activation=tanh&batchSize=10&dataset=circle&regDataset=reg-plane&learningRate=0.03&regularizationRate=0&noise=0&networkShape=4,2&seed=0.85356&showTestData=false&discretize=false&percTrainData=50&x=true&y=true&xTimesY=false&xSquared=false&ySquared=false&cosX=false&sinX=false&cosY=false&sinY=false&collectStats=false&problem=classification&initZero=false&hideText=false) and read [this](https://www.guru99.com/artificial-neural-network-tutorial.html) from the authors.\n- [This](https://www.youtube.com/watch?v=o64FV-ez6Gw&t=540s) is a live-coding implementation of a Neural Network basic library from scratch, super useful to understand how the core of an NN is implemented in Python. You can imagine that each existing framework is just an enormous expansion of this concept-library.\n- [This](https://mattmazur.com/2015/03/17/a-step-by-step-backpropagation-example/) is a step-by-step backpropagation example with calculus.\n\n_Second pass:_\n- [ANN Chapter](https://www.deeplearningbook.org/contents/mlp.html).\n\n_Play with a Neural Network_: [Deep Learning Playground](https://playground.tensorflow.org/#activation=tanh&batchSize=10&dataset=circle&regDataset=reg-plane&learningRate=0.03&regularizationRate=0&noise=0&networkShape=4,2&seed=0.85356&showTestData=false&discretize=false&percTrainData=50&x=true&y=true&xTimesY=false&xSquared=false&ySquared=false&cosX=false&sinX=false&cosY=false&sinY=false&collectStats=false&problem=classification&initZero=false&hideText=false)\n\n_Tips & Best practices:_\n[1](https://developers.google.com/machine-learning/crash-course/training-neural-networks/best-practices), [2](https://hackernoon.com/8-deep-learning-best-practices-i-learned-about-in-2017-700f32409512), [3](https://towardsdatascience.com/10-things-to-think-about-before-starting-to-code-your-deep-neural-network-65094a1e7c08), [4](https://towardsdatascience.com/how-to-increase-the-accuracy-of-a-neural-network-9f5d1c6f407d), [5](https://www.reddit.com/r/MachineLearning/comments/abj1mc/d_notes_on_why_deep_neural_networks_are_able_to/), [6](https://www.reddit.com/r/MachineLearning/comments/abj1mc/d_notes_on_why_deep_neural_networks_are_able_to/), [7](http://karpathy.github.io/neuralnets/), [8](https://medium.com/cracking-the-data-science-interview/a-gentle-introduction-to-neural-networks-for-machine-learning-d5f3f8987786).\n\n## Convolutional Neural Networks\n\nThe most used kind of Neural Network to deal with images and videos. They are thought to be less computationally expensive than vanilla Neural Networks (sharing weight among the layers) and have other useful features that help in dealing with 2D images or videos.\n\n_First look (in order):_\n- [Here](http://cs231n.github.io/convolutional-networks/)'s your reference, love it!\n- [Here](https://ujjwalkarn.me/2016/08/11/intuitive-explanation-convnets/) is an awesome deep explanation. \n- [Here](https://medium.com/technologymadeeasy/the-best-explanation-of-convolutional-neural-networks-on-the-internet-fbb8b1ad5df8) another super good one.\n- [Here](https://developers.google.com/machine-learning/practica/image-classification/) is a serious CNN tutorial from Google.\n- [Here](http://setosa.io/ev/image-kernels/) you have an amazing interactive demo.\n\n_Second pass:_\n- [CNN Chapter](https://www.deeplearningbook.org/contents/convnets.html).\n\n_Dive Deeper_: Use the latest \"survey paper\" to choose which papers are worth exploring for your case and get the big picture of the state of the art:\n[A Survey of the Recent Architectures of Deep Convolutional Neural Networks](https://arxiv.org/abs/1901.06032)\n\n_Tips & Best practices:_\n[1](https://ujjwalkarn.me/2016/08/11/intuitive-explanation-convnets/), [2](https://www.topbots.com/14-design-patterns-improve-convolutional-neural-network-cnn-architecture/), [3](https://arxiv.org/abs/1709.02601), [4](https://de.mathworks.com/matlabcentral/answers/362024-convolutional-neural-networks-what-is-the-best-practice-training-approach-using-graphics-cards), [5](http://www.academia.edu/4057996/Best_Practices_for_Convolutional_Neural_Networks_Applied_to_Visual_Document_Analysis), [6](https://www.microsoft.com/en-us/research/publication/best-practices-for-convolutional-neural-networks-applied-to-visual-document-analysis/), [7](https://missinglink.ai/guides/neural-network-concepts/neural-networks-image-recognition-methods-best-practices-applications/), [8](https://machinelearningmastery.com/best-practices-document-classification-deep-learning/).\n\n## Recurrent Neural Networks\n\nRecurrent Neural Network (RNNs) outperform other kinds when dealing with text and time-series data because it implements the concept of \"memory\" inside the network.  \n\n_First look (in order):_\n- [Here](http://colah.github.io/posts/2015-08-Understanding-LSTMs/), a gentle but detailed explanation.\n- [Here](https://www.niklasschmidinger.com/posts/2020-09-09-lstm-tricks/) is another super-suggested explanation.\n- [Here](https://www.youtube.com/watch?v=9zhrxE5PQgY) is a video with a more practical approach.\n- [Here](https://becominghuman.ai/a-noobs-guide-to-implementing-rnn-lstm-using-tensorflow-1907a5bbb1fa), a guide to implementing RNN in TensorFlow.\n- [Here](https://medium.com/@erikhallstrm/hello-world-rnn-83cd7105b767), a 7-page long blog post regarding the TensorFlow implementation.\n\n_Second pass:_\n- [RNN Chapter](https://www.deeplearningbook.org/contents/rnn.html)\n\n_Dive Deeper_: Use the latest \"survey paper\" to choose which papers are worth exploring for your case and have a nice panoramic of the state of the art:\n[Fundamentals of Recurrent Neural Network and Long Short-Term Memory Network](https://arxiv.org/abs/1901.06032)\n\n_Tips & Best practices:_\n[1](https://danijar.com/tips-for-training-recurrent-neural-networks/), [2](https://svail.github.io/rnn_perf/), [3](https://towardsdatascience.com/rnn-training-tips-and-tricks-2bf687e67527), [4](http://slazebni.cs.illinois.edu/spring17/lec20_rnn.pdf), [5](https://www.quora.com/What-are-the-best-practices-for-choosing-hidden-state-size-in-RNNs), [6](https://www.quora.com/Can-recurrent-neural-networks-with-LSTM-be-used-for-time-series-prediction), [7](https://www.reddit.com/r/MachineLearning/comments/5ogbd5/d_training_lstms_in_practice_tips_and_tricks/).\n \n## Generative Adversarial Networks\n\nGenerative Adversarial Networks, are an approach to generative modeling using deep learning methods, such as convolutional neural networks.\n\nGenerative modeling is an [unsupervised learning](https://en.wikipedia.org/wiki/Unsupervised_learning) task in machine learning that involves automatically discovering and learning the regularities or patterns in input data in such a way that the model can be used to generate or output new examples that plausibly could have been drawn from the original dataset.\n\nGANs are a smart way of training a generative model by framing the problem as a supervised learning problem with two sub-networks: the generator network that we train to generate new examples, and the discriminator network that tries to classify examples as either real (from the domain) or fake (generated). The two networks are trained together in a [zero-sum game](https://en.wikipedia.org/wiki/Zero-sum_game), \"adversarial\", until the discriminator model is fooled about half the time, meaning the generator model is generating plausible examples.\n\n_First look (in order):_\n- [Here](https://machinelearningmastery.com/what-are-generative-adversarial-networks-gans/) you find a gentle introduction to Generative Adversarial Networks.\n- [Play with a GAN!](https://poloclub.github.io/ganlab/)\n- [This](https://developers.google.com/machine-learning/gan) is a tutorial from Google which gets you started in training GANs in real-world scenarios.\n- [Here](https://machinelearningmastery.com/impressive-applications-of-generative-adversarial-networks/) you can read which are some example applications of Generative Adversarial Networks.\n- [Here](https://www.youtube.com/watch?v=3-qazNQS2JU&t=1629s) you can find a panoramic overview of GANs \"applications explosion\" from their inventor (Ian Goodfellow). He's also co-author of the [Deep Learning Book](http://www.deeplearningbook.org/)!\n- [Here](https://www.youtube.com/watch?v=KudkR-fFu_8) you find a detailed Theory and Applications video on GANs.\n- [GANs in Action - Book](https://www.amazon.com/GANs-Action-learning-Generative-Adversarial/dp/1617295566)\n\n_Dive Deeper_: Use the latest \"survey paper\" to choose which papers are worth exploring for your case and have a nice panoramic of the state of the art:\n[Generative Adversarial Networks: recent developments](https://arxiv.org/abs/1903.12266)\n\n_Second pass_: [Generative Models Chapter](http://www.deeplearningbook.org/contents/generative_models.html).\n\n## AutoEncoders \n\nAutoencoders are a particular class of Deep Learning algorithms that tries to, given and input, compress it in the internal layers and then reconstruct it as approaching the output layer, with the final output of the network that should be similar as much as possible to the input. They can be used to a variety of tasks, for example, denoising data, compress the data to visualize them, and use some trained layers of an Autoencoder to bootstrap the learning process of another Neural Network. \n\nAutoencoders are based on the same principles of compression/decompression algorithms (zip/unzip archives).\n\n_First look (in order):_\n- [Here](https://www.quora.com/What-is-an-auto-encoder-in-machine-learning) you find a first read.\n- [This](https://towardsdatascience.com/deep-inside-autoencoders-7e41f319999f) is your second recommended read.\n- [This](https://www.youtube.com/watch?v=vfnxKO2rMq4) is a lecture from Andrew NG.\n- Some examples: [1](https://www.guru99.com/autoencoder-deep-learning.html), [2](https://github.com/aymericdamien/TensorFlow-Examples/blob/master/examples/3_NeuralNetworks/autoencoder.py), [3](https://towardsdatascience.com/deep-autoencoders-using-tensorflow-c68f075fd1a3), [4](http://machinelearninguru.com/deep_learning/tensorflow/neural_networks/autoencoder/autoencoder.html), [5](https://mathspp.blogspot.com/2019/03/generating-natural-looking-digits-with.html)\n\n_Second pass:_\n[AutoEncoders Chapter](https://www.deeplearningbook.org/contents/autoencoders.html).\n \n_Dive Deeper_: Use the latest \"survey paper\" to choose which papers are worth exploring for your case and have a nice panoramic of the state of the art:\n[Recent Advances in Autoencoder-Based Representation Learning](https://arxiv.org/abs/1812.05069)\n\n _Tips & Best practices:_\n [1](https://stats.stackexchange.com/questions/257163/architecture-of-autoencoders), [2](https://stats.stackexchange.com/questions/193780/how-much-noise-for-denoising-autoencoder), [3](https://www.reddit.com/r/MachineLearning/comments/6aw8ik/d_reddit_do_you_use_autoencoders_in_practice/), [4](https://www.reddit.com/r/MachineLearning/comments/89f17m/d_current_best_practices_for_vaes/), [5](https://www.reddit.com/r/MachineLearning/comments/5k8h07/p_insights_into_variational_autoencoders_for/)\n \n## Training Neural Networks Effectively\n \nThe Deep Learning field, even if rapidly developing and giving awesome results, often lacks a theoretical understanding of the phenomenon that happens under the hood (especially during training). \n\nThere are some efforts about understanding the effect of hyperparameters (like the number of neurons per layer, the number of layers, etc..) but unluckily a big number of concepts in Deep Learning are still somewhat a [_magical black-box_](https://towardsdatascience.com/the-black-box-metaphor-in-machine-learning-4e57a3a1d2b0) that we didn't crack yet.\n\nDoes this mean that you won't be able to train a neural net well? Not really! In fact, you'll probably get better results than you could ever get with any other method, and the hard thing will be understanding **why you get them!** \n\nWith experience, you'll develop an insight into which approaches work well and which don't, how to fix existing architectures to your specific problems, and so on.\n\nHere you have some of the best interactive explanations on the Internet about **training Neural Networks** (Parameter initialization and Optimization):\n\n- [Interactive Explanation: **Initialization of Neural Networks**](https://deeplearning.ai/ai-notes/initialization/)\n\n- [Interactive Explanation: **Optimization of Neural Networks**](https://deeplearning.ai/ai-notes/optimization/)\n\nSome other super-useful resources:\n\n- [Stanford Deep Learning Lectures - Training Neural Networks](https://www.youtube.com/watch?v=wEoyxE0GP2M)\n- [Common Practices in Training Neural Networks](https://www.youtube.com/watch?v=Hb6ISunEJcI&list=PLpOGQvPCDQzvgpD3S0vTy7bJe2pf_yJFj&index=22&ab_channel=AndreasMaier)\n\n#### Common Issues\n\nYou already know that training a Neural Network involves using a training dataset to update the model weights to create a good mapping of inputs to outputs.\n\nThis training process is solved using an optimization algorithm that searches through a space of possible values for the neural network model weights for a set of weights that results in a good performance on the training dataset.\n\n[Training Neural Networks can be hard](https://machinelearningmastery.com/why-training-a-neural-network-is-hard/), and some of the reasons are listed here:\n\n[37 Reasons why your Neural Network is not working](https://blog.slavv.com/37-reasons-why-your-neural-network-is-not-working-4020854bd607)\n\nOf course, your small CNN is performing well when testing it on a benchmark dataset like MNIST, but how does it work against a real-life dataset, maybe with millions of images? \n\nTraining Neural Networks effectively requires experience and even the most expert researchers try a lot of different neural architectures before the results they want. \n\nIt's hard to find a list on the internet that includes expert knowledge and best practices, and that's what Virgilio tries to do in this section.\n\nFirst things first:\n\n**Must read:**\n\n- [My Neural Network isn't working! What should I do?](http://theorangeduck.com/page/neural-network-not-working)\n\nIt's **strongly recommended** to refer to [this page](http://cs231n.github.io/) from Stanford and go through all the Modules 1 and 2.\n\n\n### Understanding Backpropagation\n\nBackpropagation is the mathematical \"magical trick\" that powers the training of neural networks. \n\nBasically, it allows using the Gradient Descent iterative algorithm to find the optimal weights of the network (the connections among the neurons).\n\nHow?\n\nBackpropagation computes the gradient of the loss function with respect to the weights of the network for a single input/output example, and does so efficiently, unlike a naive direct computation of the gradient with respect to each weight individually.\n\nUnderstanding backpropagation is simple if you have the necessary math basics (you can find them in the [Math Fundamentals](serving\\purgatorio\\fundamentals\\math-fundamentals\\math-fundamentals.md) Guide).\n\nThe basic reference you need to understand backpropagation is the following chapter of the book [Neural Networks and Deep Learning](http://neuralnetworksanddeeplearning.com/):\n\n[**How the backpropagation works**](http://neuralnetworksanddeeplearning.com/chap2.html)\n\nOnce you're done with this reading, you can play with some other different explanations in order to deepen your understanding (remember that visualization is awesome for learning, as stated in the [Virgilio's Teaching Strategy](serving\\paradiso\\virgilio-teaching-strategy\\virgilio-teaching-strategy.md) Guide.\n\nAdditional resources:\n\n- [Backpropagation Demo](https://google-developers.appspot.com/machine-learning/crash-course/backprop-scroll/)\n- [Backpropagation by 3Blue1Brown](https://www.youtube.com/watch?v=Ilg3gGewQ5U)\n\n_Reinvent the wheel_:\nA good way to understanding backpropagation is to code it from scratch! Try to do it without help, but these tutorials will give you the solution.\n\n- [How to Code a Neural Network with Backpropagation In Python (from scratch)](https://machinelearningmastery.com/implement-backpropagation-algorithm-scratch-python/)\n- [Let's Build a Deep Learning Library](https://www.youtube.com/watch?v=o64FV-ez6Gw)\n\n\n### Transfer Learning:\n\nThis is probably one of the most **useful and beautiful** ideas about the world of machines that _learns_ from data.\n\nTransfer learning is a learning strategy in which a model developed for one task is reused as a starting point for a model on a second task. \n\nIt is a popular approach in deep neural network learning, where preformed models are used as a starting point for computer vision and natural language processing activities, given the vast computing resources and time needed to develop neural models on these problems.\n\nLearn the theory behind Transfer Learning in this lecture:\n\n- [Transfer Learning](https://www.youtube.com/watch?v=MIsSuWsZtKE)\n\nTransfer Learning brings with it very useful and powerful features:\n\n- It allows you to train models in a fraction of the expected time.\n\n- Requires much fewer data than \"from scratch\" training.\n\n- The _diversity_ of the starting dataset (on which the pre-training was done) compared to the dataset on which the fine-tuning is done (the second task) _help the model's generalizing ability_. \n\nEven is Transfer learning may sometimes work when use models that were trained across different domains (i.e. image for text analysis), it works best within the same domain most of the time\n\nOnce you approach new problems, the first thing you should do is to **look for a similar public dataset**, order to find pre-trained models and fine-tune them on your task. Of course, the dataset and the problem need to be _similar_! \n\nFor example, if you want to train a neural network for image classification, you should try to [fine tune a pre-trained model from the Imagenet dataset](https://flyyufelix.github.io/2016/10/03/fine-tuning-in-keras-part1.html). Or, if you are trying some text classification, you should try to [fine tune the BERT model](https://arxiv.org/abs/1905.05583)!\n\nThere are a lot of models you can find at the following links:\n\n- [ModelZoo](https://modelzoo.co/)\n- [TensorFlow Hub](https://www.tensorflow.org/hub)\n- [Papers with Code](https://paperswithcode.com/)\n- [State-of-the-art models](https://github.com/onnx/models)\n\nNever forget to try Transfer Learning on your problem!\n\n\n### Full Stack Deep Learning Course \n\nThis is the most useful set of resources about Deep Learning in production you can find over the Internet, be **sure** to take it!\n\n- [Full Stack Deep Learning](https://course.fullstackdeeplearning.com/)\n\n\n## Conclusions\n\nIn this guide, you found a path to a theoretical understanding of Deep Learning, the reasons to use it, the main kinds of neural networks you can find in literature. You have also seen how to forge a solid understanding of the math happening behind a neural network, and you've seen that Transfer Learning is often the go-to tool when facing a new problem. \n\nIn the next guides, you will get your hands dirty and start training models on real-world problems.\n\n"
  },
  {
    "path": "content/purgatorio/select-and-train-machine-learning-models/evaluation-and-finetuning.md",
    "content": "---\ntitle: Evaluation and Fine Tuning\nauthor: clone95\ndescription: Learn how to evaluate your models after the training process, which model to choose depending on your requirements, and how to investigate possible solutions if your model is not learning well.\n---\n\n# Index\n\n- [There Is No One Ring to Rule them All](#There-Is-No-One-Ring-to-Rule-them-All)\n- [Be Sure About the Type of the Problem](#Be-Sure-About-the-Type-of-the-Problem)\n- [Build a Meaningful Test Set](#Build-a-Meaningful-Test-Set)\n- [Select a Metric](#Select-a-Metric)\n- [Evaluate the Model](#Evaluate-the-Model)\n- [Hyperparameters Tuning](#Hyperparameters-Tuning)\n- [Conclusions](#Conclusions)\n\n\n## There Is No One Ring to Rule them All\n\nIn many of Virgilio's guides, you have learned that there is rarely a \"best\" way to do something, as is common in all engineering disciplines. \n\nData Science doesn't make any difference, on the contrary, it takes to the extreme the concept of **tradeoff**, of \"choice\" in front of various possibilities, with the best choice often guided by the details of the specific problem.\n\nThis concept is well illustrated by the [\"No Free Lunch Theorem\"](http://www.no-free-lunch.org/), which states\n\n> All algorithms that search for an extremum of a cost function perform the same when averaged over all possible cost functions.\n\nThat is, in human-understandable words, that there's **no one model that can fit every need or solve every problem**.\n\nSee also: [What are the implications of the “No Free Lunch” theorem for machine learning?](https://ai.stackexchange.com/questions/15650/what-are-the-implications-of-the-no-free-lunch-theorem-for-machine-learning)\n\nSure, there are _certain classes_ of algorithms that work better for _certain classes of problems_, or algorithms that have been completely outclassed by more \"intelligent\" versions, but in general, it is not possible to state this with certainty for every problem.\n\nThe bottom line is that you must learn how to choose the right algorithm that will give you the best-trained model _for your specific problem_.\n\nHow to do this?\n\nWell, in this case, the experience plays the master role, and even after years of doing Data Science, you'll find yourself learning new stuff about how an algorithm can perform better or worse given certain conditions. \n\nBut luckily you can measure algorithm performance on our problem and discover what works best!\n\nTo do that, you need to do 3 things:\n- Build a meaningful test set\n- Choose the right metric to measure your model performances against it \n- Track the parameters and the associated results with each evaluation \n\n## Be sure about the type of problem \n\nIt would be impossible to list all the existing types and sub-types of problems, also because some of them can be classified as classification or regression problems depending on the approach!\n\nThe advice that Virgilio gives you is, therefore, the following:\n\nOnce you are in front of a problem, understand first **what type** problem you are facing, and _from that_ start to learn, search and understand the metrics that may interest you! \n\nBe sure to know what problem you're dealing with, even though you should have done this _before start solving the problem_:\n\n- [Common ML Problems](https://developers.google.com/machine-learning/problem-framing/cases)\n\n## Build a Meaningful Test Set\n\nTo evaluate your model, you should have a clear picture of what kind of \"real-world\" it will behave in, which means having a test set representative of the actual problem you want to solve.\n\nOften, if you pick a pre-built dataset, it comes with a ready-to-go test set, but in real problem scenarios, you don't have that! \n\nA technique to generate a test set from a dataset is to [shuffle and randomly draw a set](https://stackoverflow.com/questions/37114273/how-to-randomly-split-a-dataset-into-training-set-test-set-and-dev-set-in-pyth) from it, and this _can work_ for certain situations, but it's not a general rule. This approach assumes that your dataset is balanced, is representative of the real-world problem, and some other details.\n\nIn general, when you build a test set you should make it:\n\n- Big enough to draw conclusions about the performance of the model\n- Representative of the real-world scenario in which the model will be deployed\n- Representative of the training set (if not, for sure you won't get good performances)\n- It needs to avoid biases introduced by pre-processing transformations or outlier removal\n\nLuckily for us, [Andrew NG](https://it.wikipedia.org/wiki/Andrew_Ng) collected for us all a very exhaustive list of tips and trick to build a meaningful test set, and you can find them in the practical book:\n- [Machine Learning Yearning](https://www.deeplearning.ai/machine-learning-yearning/) \n\n## Select a Metric\n\nYou know, Google is your friend, and with a 99.99% chance someone will already be in the same situation as you, and probably a simple query like 'ML metric for **type_X** problem' can give you a ton of good answers. \n\nA good starting point though can be the following:\n\n- [Selecting Metrics for Machine Learning](https://fayrix.com/machine-learning-metrics)\n\nEven if you can easily find in a lot of literature and good information about each ML metric on Google, be sure to read this presentation about the ML evaluation phase in general: \n\n- [Performance Evaluation for Learning Algorithms](https://www.icmla-conference.org/icmla11/PE_Tutorial.pdf)\n\nThen you can dive deeper into these more detailed resources:\n\n- [Model Selection and Evaluation](https://frnsys.com/ai_notes/machine_learning/model_selection.html)\n- [Performance Metrics (Error Measures) in Machine Learning Regression](https://arxiv.org/abs/1809.03006)\n\nBonus resources about model evaluation:\n\n- [Practical Model Evaluation: What matters for your model?](https://www.youtube.com/watch?v=7RdKnACscjA&t=2374s)\n- [Applied ML 2020 - Model Evaluation and Metrics](https://www.youtube.com/watch?v=trg3YkCsjqE)\n\nCheck this library for testing machine learning models, specifically those in scikit-learn:\n- [Drifter_ML](https://github.com/EricSchles/drifter_ml)\n\n## Evaluate the Model\n\nAfter you've built your test set, is time to evaluate your trained algorithm against it!\n\nBut to do that, you should have well clear in mind which is a valuable metric to measure the performance of your algorithms. \n\nIt turns out that this heavily depends on the problem you are facing, and in particular the type of problem: are you facing a supervised problem or not? If yes, are you solving a classification or regression problem? \n\nAnd so on... \n\nTo learn how to evaluate your model after the training phase, get through Chapter 6 of the book [Machine Learning Engineering](http://www.mlebook.com/wiki/doku.php) by [Andriy Burkov](https://www.linkedin.com/in/andriyburkov/):\n\n- [Chapter 6 - Model Evaluation](https://www.dropbox.com/s/4ly72ahtz6vsy5n/Chapter6.pdf?dl=0)\n\n\n## Hyperparameters Tuning\n\nWhen you evaluate a Machine Learning model, you evaluate a model trained with a certain configuration, and the parameters in this configuration are called **\"hyperparameters\"**.\n\nSee also: [What is the difference between model hyperparameters and model parameters?](https://datascience.stackexchange.com/questions/14187/what-is-the-difference-between-model-hyperparameters-and-model-parameters)\n\n**Choosing the right hyperparameters to let the ML algorithm learn well is probably the most difficult job in the Data Science Process (someone calls it \"[Black Magic](https://medium.com/@rayheberer/black-magic-and-hyperparameter-tuning-ef875eb31712)\"). \n\nThere are no Golden Rules ([There Is No One Ring to Rule them All](#There-Is-No-One-Ring-to-Rule-them-All)), even though some best practices are recognized to work well in a variety of situations. \n\nBut when you tackle a novel problem, with a custom dataset, it's difficult to choose these hyperparameters right at the first shot. \n\nFor example, imagine you're training a neural network (even a simple one), you can have _a lot_ of these hyperparameters:\nAbout the topology of the network:\n- the type of layers\n- the number of layers\n- the number of neurons in each layer\n- the activation functions\n\nOr about the optimization phase (the actual training):\n\n- the number of training epochs\n- the batch size \n- the learning rate\n- the learning rate decay\n- regularization techniques\n\nWhat a mess! How to get these right?\n\nOften data scientists try to overcome this problem with some techniques, like Grid Search, Random Search, or Evolutionary Algorithms.\n\nBe sure to get through the following resources to understand how to tune the hyperparameters of your model!\n\n- [Introduction to Hyperparameter Tuning](https://community.alteryx.com/t5/Data-Science-Blog/Hyperparameter-Tuning-Black-Magic/ba-p/449289)\n- [Grid Search](https://machinelearningmastery.com/grid-search-hyperparameters-deep-learning-models-python-keras/)\n- [Random Search](https://towardsdatascience.com/feature-selection-by-random-search-in-python-730ffd2912e9)\n- [Cross-validation: evaluating estimator performance - with Scikit-Learn](https://scikit-learn.org/stable/modules/cross_validation.html)\n\nRead also:\n\n- [Practical hyperparameter optimization: Random vs. grid search](https://stats.stackexchange.com/questions/160479/practical-hyperparameter-optimization-random-vs-grid-search)\n- [Practical Guide to Hyperparameters Optimization for Deep Learning Models](https://blog.floydhub.com/guide-to-hyperparameters-search-for-deep-learning-models/)\n- [Hyperparameter tuning with Keras Tuner](https://blog.tensorflow.org/2020/01/hyperparameter-tuning-with-keras-tuner.html)\n\nAnd more advanced techniques:\n- [Hyp-RL : Hyperparameter Optimization by Reinforcement Learning](https://arxiv.org/abs/1906.11527)\n\nRemember that these techniques are not meant to substitute the Data Scientist knowledge, but to help him in finding the most promising directions! \n\nWith the experience, you'll learn by yourself what are likely good configurations, depending on the problem at hand.\n\nEven though Hyperparameter Tuning can help, remember that can sometimes give a small/marginal gain over the original metric.\n\nThe real factors resulting in better metrics/results is always the quality of the dataset.\n\n## Conclusions\n\nIn this guide, you've learned how to choose the right test set for your evaluation, how to choose a meaningful metric for the problem at hand, and how to evaluate the model against it. \n\nYou've also seen some techniques that help you move in the deep space of the hyperparameters configurations. \n\nNow, once you're satisfied by the performance fo your model, you're ready to use it in the real world!\n"
  },
  {
    "path": "content/purgatorio/select-and-train-machine-learning-models/machine-learning-theory.md",
    "content": "---\ntitle: Machine Learning Theory\nauthor: clone95\ndescription: Learn how to train and build powerful Machine Learning models and use them to make predictions, that is the natural goal of a Data Science project.\n---\n\n# Index\n\n- [Buy This Book](#Buy-This-Book)\n- [The Machine Learning Landscape](#The-Machine-Learning-Landscape)\n- [End-to-End Machine Learning project](#End-to-end-machine-learning-project)\n- [Machine Learning Full Course](#Machine-Learning-Full-Course)\n- [Code an Algorithm from Scratch](#Code-an-Algorithm-from-Scratch)\n- [Must-Know Supervised Learning Algorithms](#Must-Know-Supervised-Learning-Algorithms)\n- [Unsupervised Learning Algorithms](#Unsupervised-Learning-Algorithms)\n- [Conclusions](#Conclusions)\n\n## Buy This Book\nVirgilio **strongly recommend** you to buy this phenomenal book: [**Hands-On Machine Learning with Scikit-Learn and TensorFlow**](https://www.amazon.it/Hands-Machine-Learning-Scikit-learn-Tensorflow/dp/1492032646/ref=sr_1_1?adgrpid=58345655971&gclid=Cj0KCQiA6IHwBRCJARIsALNjViW4Jw8kyO8xEPOiBSRLof5hccJ-xVOtW0PHCUOSBszyNIJZZlMfNYoaAorMEALw_wcB&hvadid=255175924799&hvdev=c&hvlocphy=1008144&hvnetw=g&hvpos=1t1&hvqmt=e&hvrand=214277416768465994&hvtargid=aud-834369398293%3Akwd-295090772533&hydadcr=18606_1822710&keywords=hands+on+machine+learning&qid=1577095736&sr=8-1). \n\nThe book has inspired the birth of Virgilio and has driven most of the organization and hierarchy of the content listed below.\n\n::: warning\n**Be sure to buy the 2nd edition of the book, which comes with TensorFlow 2.0 and many of the chapters updated.**\n:::\n\nApart from this, **everything** listed here is open source and free, from world-renowned universities and open source associations, in pure Virgilio's spirit. \n\nNote: _if you think about the price of the book is high, be okay with that, but remember that you won't find a higher quality hands-on book on Machine and Deep Learning. Don't hesitate, the book is definitely worth its price._  \n\nIt is necessary to avoid confusion when we learn something new, especially when the topic is as wide and complex as Machine Learning. When possible, we've tried to create this guide and the following ones _preferring content from the same author or context_.\n\n## The Machine Learning Landscape\nFirst things first! \n\nDirectly from the book cited earlier, this is the most concise and illuminating overview of **what is** and **when you need** machine learning. Let's stop using buzzwords!\n\nCheck it here: [**The Machine Learning Landscape**](https://www.oreilly.com/library/view/hands-on-machine-learning/9781491962282/ch01.html).\n\nAlso check this: [A Visual Introduction to Machine Learning](http://www.r2d3.us/visual-intro-to-machine-learning-part-1/).\n\n## End-to-End Machine Learning project\nVirgilio wants you to _feel_ what a complete Data Science project would be, along with model creation and selection. You\n\nFor a first taste, go through [this](https://www.kaggle.com/startupsci/titanic-data-science-solutions) Kaggle notebook, which has a classical example of an ML task. \n\n**The goal is to try to predict if a Titanic passenger would have been most likely to survive or not.**\n\nThis is commonly considered the \"Hello World\" problem for new Machine Learning practitioners.\n\nMany things will be unclear for now, but don't worry, they will all be explained comprehensively later. It is nice to get the picture of the \"applied\" project, going through the classical steps of applied Machine Learning (problem framing, data exploration, question formulation...). \n\nThe notebook is on [Kaggle](https://www.kaggle.com/), the go-to platform for ML and general Data Science projects, which provides a lot of free datasets and offers interesting challenges and ML model experiments.\n\nRemember: Read the notebook and try to understand the big picture of the process. Some details, functions, and code will be clearer later.\n\n## Machine Learning Full Course\nNow that you've been exposed to your first machine learning end-to-end project, you maybe start wondering _how do you choose an algorithm to try on your data_, and what is the learning theory behind them. \n\nThe best thing you can do now is to take a full course on Machine Learning theory. \n\nThere are plenty of those out there, but the most classical and complete course is probably the most famous one too.\n\nPlan some weeks of study and prepare to follow: \n\n[**Machine Learning Course from Andrew NG**](https://www.coursera.org/learn/machine-learning)\n\nThis course would take you through the basics of Machine Learning algorithms, plus the math theory behind the training process. Concepts like Overfitting, Regularization, and Loss Functions are explained in-depth.\n\nThe course has a part in Deep Learning, so you're not obliged to take them (even if it's recommended). \n\nIn the next guide, \"Deep Learning\", we'll give you specific courses about it.\n\nThe course has homework to do (highly recommended), but unluckily these assignments are thought with the Octave programming language in mind, which is kind of out-dated and limited if compared to Python. \n\nBut don't be scared! \n\nAwesome people out there re-created the course assignments in Python, through Jupyter notebooks!\n\nCheck them here: \n\n[**Coursera Machine Learning by Andrew Ng - Python Programming Assignments**](https://github.com/dibgerge/ml-coursera-python-assignments)\n\nThanks to this course and the exercises you should grasp most of the basics concepts behind Machine Learning theory and the process of training models. \n\nAlternatively, you can replace the former course with this one:\n\n- [Machine Learning from Bloomberg](https://www.youtube.com/watch?v=MsD28INtSv8&list=PLnZuxOufsXnvftwTB1HL6mel1V32w0ThI)\n\n\nOnce you're done with the course, check also the following course from Google:\n\n[**Machine Learning Crash Course**](https://developers.google.com/machine-learning/crash-course)\n\nThis second one should take you no more than some days to get through, and it can give you a more practical perspective on the Machine Learning modeling process (selection, training, evaluation). \n\nIn the next sections of this guide, we'll see some criteria on how to choose the algorithms to deepen your knowledge about. \n\nIt's nearly impossible to know all the Machine Learning algorithms along with their versions, and many more algorithms are being developed every month!\n\nNevertheless, there are _some algorithms_ which are the foundation of statistical learning theory, so you want to have them clear in mind. \n\nFor example, these algorithms are the ones a recruiter can ask you about!\n\n## Must-Know Supervised Learning Algorithms\nThe algorithms listed here are of the \"Supervised\" type, in the sense that you need labeled data to make your models work.\n\nRead here about:\n[Difference between supervised and unsupervised algorithms](https://www.guru99.com/supervised-vs-unsupervised-learning.html) \n\nThe algorithms that we retain the most foundational are:\n\n#### Linear Regression\nClassification is one of the most important ML tasks when wanting to predict an outcome out of different possibilities. For example, given handwritten digits, classify them with the lowest error possible.\nThe simplest case is the binary classification (Yes or No, Survived or Not Survived), have a look [here](https://machinelearningmastery.com/make-predictions-scikit-learn/).\nCheck [here](https://towardsdatascience.com/building-a-logistic-regression-in-python-301d27367c24) for a brief explanation of the theory of logistic regression for classification, and check [here](https://www.youtube.com/watch?v=VCJdg7YBbAQ) for a deeper comprehension (using the Titanic dataset).\nYou can use a lot of different ML models to classify things, even neural networks! For now, just take a look [here](https://scikit-learn.org/stable/auto_examples/classification/plot_classifier_comparison.html), where you see an example of accuracy and recall comparison among different models.\n[Here](https://medium.com/thalus-ai/performance-metrics-for-classification-problems-in-machine-learning-part-i-b085d432082b) you have an article about the metrics used to **evaluate** your classifiers.\n\n#### Support Vector Machines\nThis is another classical algorithm to create ML models.\n[Here](https://www.youtube.com/watch?v=_PwhiWxHK8o) you have the explanation of the theory, and [here](https://www.youtube.com/watch?v=g8D5YL6cOSE) a more practical approach. Check both.\n[Here](https://scikit-learn.org/stable/modules/svm.html) is a very good explanation + practice application in Scikit-Learn.\n\n#### Decision Trees\nDecision Trees are one of the most simple but effective ideas behind predicting outcomes, and they're used in many ways (e.g. Random Forest). Check [here](https://www.youtube.com/watch?v=eKD5gxPPeY0&list=PLBv09BD7ez_4temBw7vLA19p3tdQH6FYO) and go through the playlist to get a theoretical overview of Decision Trees (ID3).\n[Here](https://scikit-learn.org/stable/modules/tree.html) you have the practical application of ID3.\nHere you have some end-to-end examples with Scikit-Learn:\n- [Example 1](https://www.youtube.com/watch?v=9YcMzsFvfxU) \n- [Example 2](https://www.youtube.com/watch?v=RmajweUFKvM)\n- [Example 3](http://dataaspirant.com/2017/02/01/decision-tree-algorithm-python-with-scikit-learn/)\n- [Example 4](https://mathspp.blogspot.com/2018/08/teaching-robot-how-to-vacuum-clean-with.html) couples decision trees with genetic algorithms.\n\n#### Ensemble Learning and Random Forest \nThe idea of Ensemble Learning is to leverage all the different features, pros, and cons of several ML models to obtain a group of \"voters\" that, for each prediction, gives you the most likely outcome, voted by different classifiers (SVM, ID3, maybe Logistic Regression). \n[Here](https://www.youtube.com/watch?v=9VmKYwX_U7s) you get the basics of ensemble learning model, and [here](https://www.youtube.com/watch?v=3kYujfDgmNk) you find the most classic of them, the Random Forest. Although the idea is simple, this ensemble model turned out to be effective in tackling even some \"hard\" classification problems, or with a lot of data.\n\n[Here](https://scikit-learn.org/stable/modules/ensemble.html) you get a complete overview of the best practices for ensemble learning, and [here](https://towardsdatascience.com/random-forest-in-python-24d0893d51c0) you find an example of Random Forest with Scikit-Learn. Both links come with a bunch of useful techniques to use in practice. \n\n### Unsupervised Learning\nUp to now, we've considered more the Supervised type of learning, where you have labeled data and you learn from them.\n\nBut **the world is often full of un-labeled data**, and the labeling process is tedious and costly. \n\nSo it's important to be aware of unsupervised learning classes of algorithms.\n\n- [This](https://www.youtube.com/watch?v=8dqdDEyzkFA&t=14s) is a brief introductory video.\n- [This](https://www.coursera.org/lecture/machine-learning/unsupervised-learning-olRZo) are the Unsupervised Learning lectures from Stanford, take these if you want to go deeper.\n- [This](https://www.reddit.com/r/MachineLearning/comments/3pkt1i/why_is_unsupervised_learning_so_important/) is a very good Reddit post on **Why Unsupervised is so important**. \n- [Here](https://blogs.nvidia.com/blog/2018/08/02/supervised-unsupervised-learning/) is an interesting read about the difference between Supervised Learning, Unsupervised Learning, and Reinforcement Learning.\n\nThe two most important techniques here are [Association Rules Exploration](https://searchbusinessanalytics.techtarget.com/definition/association-rules-in-data-mining) and [Clustering](https://www.geeksforgeeks.org/clustering-in-machine-learning/). \n\nAssociation Rules tutorials and examples: [1](https://www.learndatasci.com/tutorials/k-means-clustering-algorithms-python-intro/), [2](https://towardsdatascience.com/an-introduction-to-clustering-algorithms-in-python-123438574097), [3](https://pythonprogramming.net/flat-clustering-machine-learning-python-scikit-learn/), [4](https://www.datacamp.com/community/tutorials/k-means-clustering-python), [5](https://stackabuse.com/hierarchical-clustering-with-python-and-scikit-learn/).\n\nClustering tutorials and examples: [1](https://pbpython.com/market-basket-analysis.html), [2](http://rasbt.github.io/mlxtend/user_guide/frequent_patterns/association_rules/), [3](https://stackabuse.com/association-rule-mining-via-apriori-algorithm-in-python/), [4](http://intelligentonlinetools.com/blog/2018/02/10/how-to-create-data-visualization-for-association-rules-in-data-mining/), [5](https://www.kaggle.com/datatheque/association-rules-mining-market-basket-analysis), [6](https://www.kdnuggets.com/2016/04/association-rules-apriori-algorithm-tutorial.html).\n\n_Dive deep with_:\n[Stanford slides](https://lagunita.stanford.edu/c4x/HumanitiesScience/StatLearning/asset/unsupervised.pdf).\n[MIT slides](http://www.mit.edu/~9.54/fall14/slides/Class13.pdf).\n\n _Tips & Best practices when dealing with unsupervised datasets:_\n [1](https://towardsdatascience.com/the-5-clustering-algorithms-data-scientists-need-to-know-a36d136ef68), [2](https://dzone.com/articles/10-interesting-use-cases-for-the-k-means-algorithm), [3](https://medium.com/@blazetamareborn/practicing-clustering-techniques-on-survey-dataset-f7d7a322e6ff), [4](https://www.analyticsindiamag.com/most-popular-clustering-algorithms-used-in-machine-learning/), [5](https://www.analyticsvidhya.com/blog/2017/02/test-data-scientist-clustering/).\n\n## Conclusions\nThis guide is very dense and assuming average skills (in programming, math, and statistics) you should consider _at least_ a month to digest all the content listed here. We know that you're excited to put things in practice, but don't underestimate the importance of building a solid theoretical \"ground floor\" on which to build the rest of your knowledge.\n\nThis guide is probably the most important of the Purgatorio, in terms of single concepts learned, so if you feel that two or 3 months are needed to grasp all the concepts, don't be afraid of! "
  },
  {
    "path": "content/purgatorio/select-and-train-machine-learning-models/tools-and-libraries.md",
    "content": "---\ntitle: Tools and Libraries\nauthor: clone95\ndescription: Learn to use existing libraries, frameworks and out-of-the-box tools, developing Machine Learning and Deep Learning systems to solve real-world problems.\n---\n\n# Index\n- [How this guide is designed](#How-this-guide-is-designed)\n- [Solving the Learning Problem](#Solving-the-Learning-problem)\n- [Navigating the Ocean](#Navigating-the-Ocean)\n- [The Data Science Process Toolkit](#The-Data-Science-Process-Toolkit) \n    + [Data Collection](#Data-Collection)\n    + [Data Preparation](#Data-Preparation)\n    + [Data Visualization](#Data-Visualization)\n    + [Feature Engineering](#Feature-Engineering)\n    + [Machine Learning](#Machine-Learning)\n    + [Deep Learning](#Deep-Learning)\n    + [Hyperparameter Tuning](#Hyperparameter-Tuning)\n    + [Serving Models](#Serving-Models)\n    + [Automation Tools](#Automation-Tools)\n    + [Miscellaneous](#Miscellaneous)\n\n\n- [Production Ready Tools](#Production-Ready-Tools)\n    + [Computer Vision](#Computer-vision)\n    + [Natural Language](#Natural-Language)\n    + [Time Series Forecasting](#Time-Series-Forecasting)\n\n- [Conclusions](#Conclusions)\n\n# How this guide is designed\n\nThis guide is designed in the same fashion as the **Purgatorio** structure, so you find a subsection for each phase of the Data Science process.\n\nFor _each section_, we list for you different libraries and the best resources to learn them.\n\nWe'll give you some general tips to learn effectively and develop rock-solid foundations, that you can rely on to address and solve Data Science problems in the complexity of the real world (which is messy by definition).\n\nIn this guide, you'll find a ton of different small tools, big libraries, and even entire frameworks, but be aware!\n\nAs stated in the [Virgilio's Teaching Strategy](https://github.com/virgili0/Virgilio/blob/master/serving/paradiso/virgilio-teaching-strategy/virgilio-teaching-strategy.md) Guide, the best way to deal with the learning process is to leverage the \"[Divide et Impera](https://en.wikipedia.org/wiki/Divide_and_rule)\" principle, which states that every time you're tackling a problem (in this case, the _learning problem_) you should split it into smaller parts, easier to handle and understand. \n\n# Solving the Learning Problem \n\nThe process of learning a tool and use it effectively **is equal to solving a problem**.\n\nWe consider \"solved\" the learning problem when you can use the tool comfortably for the task at hand.\n\nSo, you shouldn't try to learn all the features of a library in the same run, or you're going to be overwhelmed! \n\nEvery rich Python library contains thousands of different functions and utilities, but _you'll need a small subset to get the things done!_\n\n**So, Virgilio suggests the following approach**:\n\n- Choose a library from the ones that are widely used and feature-rich.\n- Get a general introduction through to Virgilio's resources listed in this guide.\n- Find a problem (similar but not equal to the introductory ones).\n- Dig into the problem, and get your hands dirty with the chosen library.\n- Learn _on the way to the problem solution_.\n- Solve the problem, trying to do it yourself.\n\nIf you follow this approach, you take home the following 3 things:\n- **real problem experience**\n- **you feel comfortable coding with a subset of the functions of the tool**\n\nBelieve it or not, it works like magic!\n\nKnow you know how to solve a new _learning problem_.\n\nBonus tip: \n\nWhen trying to know about a library or framework or tool, use these two methods:\n\n- search for them on Medium.com\n- search for them on YouTube or another video/learning channel\n\nBoth these will show how others are using it or how else it can be used, often better than learning from the documentations initially.\n\nNow, how to choose from the myriad of tools and libraries available?\n\n# Navigating the Ocean\n\nIt's very easy to find out articles, blog posts, and YouTube videos telling you \"the 20 libraries you need to learn in 2020!\". \n\nWhat? 20 libraries? \n\nCome on, this is ridiculous _and_ impossible, for a beginner!\n\nDon't even try to do that, or you will miserably get stuck, because it is impossible to learn 20 programming libraries together, even for an expert.\n\nLearning tools and libraries will be a thing most of your life if you want to study or work in the Data Science field. \n\n**But, as a beginner**:\n\n- is better to start learning very well _some_ tools/libraries, and meanwhile becoming \"aware\" of the similar ones (and their pro/cons).\n\n- For doing that, it's useful to read the homepage of the official documentation (God bless good documentation!). \n\n- It's way better to learn **one** (max 2) libraries for each step of the Data Science process, _as a starting point!_\n\n- You'll always be capable of learning more libraries when you reach the capabilities limits of the one that you already know or you have different needs.  \n\nNow you know what is the best approach to learn tools and libraries and frameworks, and how to do it [using wisely your time](https://waitbutwhy.com/2014/05/life-weeks.html)!\n\nThe following links expand these points and you should read them if you are a beginner, some answers are illuminating:\n\n- [What are some tips for a beginning ML/data scientist who feels overwhelmed?](https://www.quora.com/What-are-some-tips-for-a-beginning-ML-data-scientist-who-feels-overwhelmed)\n- [SO MUCH to Learn... Overwhelmed. How to Learn so Much?](https://www.reddit.com/r/learnprogramming/comments/dnujl0/so_much_to_learn_overwhelmed_how_to_learn_so_much/)\n- [Beginner to \"data science\" but unsure of what I should be doing](https://www.reddit.com/r/datascience/comments/7yg61i/beginner_to_data_science_but_unsure_of_what_i/)\n\nHaving that said, let's jump in!\n\n# The Data Science Process Toolkit\n## Data Collection\n\nData collection is one of the most crucial parts of a Data Science project (you don't say?), and often a tedious one if you have to label your data on your own!\n\nLuckily, good researchers and institutions often release their datasets, so you don't have to collect the data (or label it), just download!\n\nBut if you can't find the dataset that you need? \n\nLet's see at some tools that can help you in this task:\n\n- [Digitalmethods Tools](https://wiki.digitalmethods.net/Dmi/ToolDatabase) is a set of free web scraping tools developed by Europe's leading Internet Studies groups\n\n- [BeautifulSoup](https://www.dataquest.io/blog/web-scraping-tutorial-python/) is a Python library to scrape webpages\n\n- [Selenium](https://www.pluralsight.com/guides/web-scraping-with-selenium) is a Python library meant to automate browser testing, but it can be perfectly used in combination with BeautifulSoup to set up a powerful web scraper\n\nSee also:\n- [10 Best Web Scraping Tools to Extract Online Data](https://www.hongkiat.com/blog/web-scraping-tools/)\n\nRemember that a lot of free access datasets are available for free, for example in the [UCI Dataset](https://archive.ics.uci.edu/ml/datasets.php) website or at the Data science Challenge platform [Kaggle](https://www.kaggle.com/).\n\nCheck also this repo:\n\n- [Datasets and sources of raw data](https://github.com/neomatrix369/awesome-ai-ml-dl/blob/master/data/datasets.md)\n\n## Data Preparation\n\nData preparation is often the [most time-consuming part of the Data Science project](https://www.infoworld.com/article/3228245/the-80-20-data-science-dilemma.html), so it's crucial to make sure that the right tools are used from you or your team. \n\nOften the right tools in this phase are the programming languages and their libraries.\n\nThe most popular and widely-used libraries are:\n\n- [Scikit-Learn](https://scikit-learn.org/) offers a lot of pre-made data transformations. Get started [here](https://scikit-learn.org/stable/tutorial/basic/tutorial.html).\n- [Pandas](https://pandas.pydata.org/) is the go-to library to handle data in the popular DataFrame format. Get started [here](https://www.learndatasci.com/tutorials/python-pandas-tutorial-complete-introduction-for-beginners/).\n- [Datacleaner](https://github.com/rhiever/datacleaner) saves you a ton of time encoding and cleaning your data once it's already in a format that pandas DataFrames can handle.\n- [Scrubadub](https://scrubadub.readthedocs.io/en/stable/index.html) to remove identifiable information from text.\n- [Ftfy](https://github.com/LuminosoInsight/python-ftfy)  to take in bad Unicode and output good Unicode, for use in your Unicode-aware code.\n- [Arrow](https://arrow.readthedocs.io/en/latest/) to creating, manipulating, formatting and converting dates, times and timestamps.\n\n## Data Visualization\nAs you learned in the [Data Visualization Guide](https://github.com/virgili0/Virgilio/blob/master/serving/purgatorio/collect-and-prepare-data/data-visualization/data-visualization.md), the human race evolved in the African savannah through thousands of years, and the sight is most advanced surviving technology that he has developed.\n\nMore than 60 % of the actual computation power of our brains is all-time processing visual information, and using it to create an internal representation of the world!\n\nSo, it's easy to understand _why_ to visualize data and their relationships it's compelling to get rich insights from them. \n\nAlso, remember that data visualizations are **the way** to communicate your results to other people, including the non-technical audience.\n\nYou can get an overview of the most popular and wide-used data visualization libraries in the [Data Visualization Guide](https://github.com/virgili0/Virgilio/blob/master/serving/purgatorio/collect-and-prepare-data/data-visualization/data-visualization.md).\n\nOne thing to note Data Visualization isn't properly a separate step or stage, it is done at every step and stage before and after doing a step.\n\nCheck also this repo for a very exhaustive list of Data Visualization tools: \n\n- [Data visualization libraries and tools](https://github.com/neomatrix369/awesome-ai-ml-dl/blob/master/things-to-know.md#data-visualization-libraries-or-tools)\n\n## Feature Engineering\n\nThe feature engineering is the process of transforming your data into useful features, that can be consumed by ML and DL algorithms during training.\n\nIt's [hard to suggest](https://datascience.stackexchange.com/questions/8286/are-there-any-tools-for-feature-engineering) a single tool for feature engineering: currently, feature engineering is still largely a laborious and manual process, and it heavily depends on your data.\n\nBy the way, you can consider the way Scikit-Learn applies transformations to data, as a good starting point. \n\nScikit-learn provides a library of transformers, which may clean (see Preprocessing data), reduce (see Unsupervised dimensionality reduction), expand (see Kernel Approximation) or generate (see Feature extraction) feature representations.\n\nSee: \n\n- [Data Transformers](https://scikit-learn.org/stable/data_transforms.html)\n- [Pandas, Pipelines and Custom Transformers](https://www.youtube.com/watch?v=BFaadIqWlAg)\n\n## Machine Learning\n\nFortunately for all aspiring Data Science practitioners, there are now mature frameworks and libraries that implement most of the best algorithms to train models from data. \n\nLike any branch of computer science, you can find dozens of similar libraries that do more or less the same things, and in the case of Machine Learning model building, it's no different. \n\nVirgilio suggests you focus on one particular library in order not to risk wasting your time and especially because it is the most widespread and supported.\n\n[Scikit-Learn](https://scikit-learn.org/stable/) is one of the most complete, mature and well-documented libraries for Machine Learning tasks. It comes out-of-the-box with powerful and advanced models that offer facility functions for the data science process.\n\nAlso, they have a [wonderful map](https://scikit-learn.org/stable/tutorial/machine_learning_map/index.html) to guide you in finding the right ML model for the problem you want to solve.\n\nScikit-Learn resources:\n\n- [Getting Started](https://scikit-learn.org/stable/getting_started.html)\n- [Tutorials](https://scikit-learn.org/stable/tutorial/index.html)\n- [Examples](https://scikit-learn.org/stable/auto_examples/index.html)\n\nAlso, Scikit-Learn is the library chosen by the awesome book [Hands-On Machine Learning with Scikit-Learn, Keras, and Tensorflow](https://www.amazon.it/Hands-Machine-Learning-Scikit-learn-Tensorflow/dp/1492032646/ref=pd_sbs_14_img_0/258-4192675-5285822?_encoding=UTF8&pd_rd_i=1492032646&pd_rd_r=b7c5b3eb-2cd0-4a82-a022-b68cefb4854f&pd_rd_w=I7oG4&pd_rd_wg=OyB1L&pf_rd_p=5b7cecc6-3c99-46e5-b3e1-0370a7bd6b14&pf_rd_r=AYXZXWBE4DBSAA0M723G&psc=1&refRID=AYXZXWBE4DBSAA0M723G), which is highly recommended to have in your pocket as a learning companion.\n\nAdditional Machine Learning libraries and tools:\n\n- [A curated list of awesome Machine Learning frameworks, libraries, and software](https://github.com/josephmisiti/awesome-machine-learning#python)\n- [A curated list of awesome open source libraries to deploy, monitor, version and scale your machine learning models](https://github.com/EthicalML/awesome-production-machine-learning)\n\n\n## Deep Learning\n\nWhen it comes to Deep Learning it is not easy to decide which framework to recommend to a beginner. \n\nOut there, on the Internet, at the query \"which Deep Learning framework to learn first?\", you quickly understand that the two most complete frameworks are [Tensorflow](https://www.tensorflow.org/) (from Google) and [Pytorch](https://pytorch.org/) (from Facebook), both open-source and full of useful features to work with Deep Learning.\n\nAfter evaluating several factors as:\n\n- completeness and maturity of the framework\n- usability and learning curve \n- how easy to understant is the official documentation \n- number of official and unofficial examples, guides and tutorials\n- industry-side diffusion \n\nVirgilio suggests you start with learning TensorFlow and try Pytorch later.\n\nBrief argument: Tensorflow, especially from 2.0 version and with the [Keras](https://www.tensorflow.org/guide/keras) Interface (native in TF from 2.0), is a better choice for a beginner. Pytorch has different pros but it's more suitable for research and high flexibility needs.\nTF 2.0 is the tools chosen in the up-to-date version of the mythical (and _\"mandatory\"_) book [Hands-On Machine Learning with Scikit-Learn, Keras, and Tensorflow](https://www.amazon.it/Hands-Machine-Learning-Scikit-learn-Tensorflow/dp/1492032646).\n\nTo learn TensorFlow, start with the Keras wrapper!\n\n- [Why you should start with Keras](https://www.reddit.com/r/learnmachinelearning/comments/biynuy/difference_between_keras_and_tensorflow/)\n\n#### Keras\n\nKeras is an Open Source Neural Network library written in Python that runs on top of TensorFlow. \n\nEasy to use and widely supported, [Keras](https://keras.io/) makes deep learning about as simple as deep learning can be!\n\nThere is a reason why Google engineers decided to go integrate Keras natively in TF 2.0: because it's awesome!\nMost of the time you don't need to dive **so deep** inside a neural network architecture to make it work!\n\nStart from the official Keras guide integrated in the TF Docs:\n\n- [Google official Keras guide](https://www.tensorflow.org/guide/keras/overview)\n\n#### Tensorflow 2.0\n\nTo learn TensorFlow you'll need mostly a lot of practice, starting from toy examples to most complex projects, but Virgilio collected for you the most important resources out there:\n\n- [Here](https://www.youtube.com/watch?v=tYYVSEHq-io&t=2s) you have a gentle and brilliant introduction to what is TensorFlow.\n- [Here](https://www.tensorflow.org/tutorials) you find the official Tutorials.\n- [Here](https://www.tensorflow.org/guide) you find the official Guide, a more detailed guide to each aspect of the framework.\n- [Here](https://github.com/jtoy/awesome-tensorflow) you have an awesome list of additional resources about Tensorflow.\n\nYou should be able to find different frameworks and dozens of other exotic neural network libraries on the Internet, but as usual, _Virgilio highly recommends to use your time wisely_ (one enemy at time). \nIt's not always true that the most used thing is the best, but for sure you can be certain that Tensorflow is here to stay and to remain one (or the most) widely used deep learning framework.  \n\nDon't try to learn the old TF1 version, hadn't aged well, and Google learned a lot from that experience: go for 2.0.\n\n- [TensorFlow 2.0: Easier for beginners, and more powerful for experts](https://www.youtube.com/watch?v=5ECD8J3dvDQ)\n\n## Hyperparameter Tuning\n\nIf you’ve ever tried to tune hyperparameters for a machine learning model, you know that it can be a very painful process!\n\nTo fine-tune your models you can check a variety of tools, check this article:\n\n- [A Comprehensive List of Hyperparameter Optimization & Tuning Solutions](https://medium.com/@mikkokotila/a-comprehensive-list-of-hyperparameter-optimization-tuning-solutions-88e067f19d9)\n\nIn particular, if you are learning [Keras](https://www.tensorflow.org/guide/keras) as a top-level framework on the top of Tensorflow, Virgilio suggests you check [Hyperas](https://github.com/maxpumperla/hyperas).\n\nA very simple convenience wrapper around [Hyperopt](https://github.com/hyperopt/hyperopt) for fast prototyping with Keras models. Hyperas lets you use the power of hyperopt without having to learn the syntax of it. Instead, just define your Keras model as you are used to, but use a simple template notation to define hyper-parameter ranges to tune.\n\n## Serving Models\n\nAfter training Machine Learning models, you may want to make them available as a service, to your users, or to other computer systems that may use them.\nThe most general way to serve a trained ML model is to use a library like [Flask](https://github.com/pallets/flask) API.\n\nHere are some resources to get started with this framework:\n\n- [Learn Flask for Python - Full Tutorial](https://www.youtube.com/watch?v=Z1RJmh_OqeA)\n- [The Mega Flask Tutorial](https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world)\n\nThen follow these tutorials to learn how to use Flask to serve your trained models:\n\n- [A Flask API for serving scikit-learn models](https://towardsdatascience.com/a-flask-api-for-serving-scikit-learn-models-c8bcdaa41daa)\n- [Deploying Keras models using TensorFlow Serving and Flask](https://towardsdatascience.com/deploying-keras-models-using-tensorflow-serving-and-flask-508ba00f1037)\n\nThe best way to understand something is _to do it_! So, check your knowledge with this 2-hours guided project from Coursera.\n\n- [Project: Deploy Models with TensorFlow Serving and Flask](https://www.coursera.org/learn/deploy-models-tensorflow-serving-flask)\n\nAlso noteworthy is the Streamli project:\n\n- [Awesome Streamlit](https://www.awesome-streamlit.org/)\n\nStreamlit is an open-source Python library that makes it easy to build beautiful custom web-apps for machine learning and data science.\n\n## Automation Tools\n\nThere's an old rule that says:\n\n> If you have to do a job more than 3 times, it's time to automate it.\n\nRead this intro to Automation in the Data Science process:\n\n- [Automation in Data Science](https://towardsdatascience.com/automation-in-data-science-f11fe389d49b)\n\nHere you can find a very comprehensive list of automation tools, targeting different parts of the Data Science project. \n\n- [Awesome-AutoML](https://github.com/windmaple/awesome-AutoML)\n\n## Miscellaneous\n\nVirgilio lists here for you a bunch of incredible good GitHub pages with lists of hundreds of tools and libraries you can find useful when working in the Data Science environment. \nWhat is the best way to use these pages? \nThe answer is that every problem has different characteristics and caveats, and you should be able to understand _if you need_ to learn a new tool, or you can get the things done with those that you already know! \nSo, use these pages to compare the pros and cons of the hundreds of tools that exist!\n\n- [Awesome AI-ML-DL](https://github.com/neomatrix369/awesome-ai-ml-dl)\n- [Awesome Machine Learning](https://github.com/josephmisiti/awesome-machine-learning)\n- [Amazing ML OpenSource 2019](https://github.com/Mybridge/amazing-machine-learning-opensource-2019)\n- [Awesome Machine Learning Model Management Frameworks](https://github.com/awoerner92/awesome-ml-tools)\n- [A Curated List of Awesome Machine Learning Frameworks, Libraries and Softwares](https://www.mo-data.com/a-curated-list-of-awesome-machine-learning-frameworks-libraries-and-software/)\n\n\n\n# Production Ready Tools\nIn this section, Virgilio listed for you some \"Production-Ready\" tools that can speed up the process of creating value with data. You can use these tools along with those listed in the previous sections.\n\nFor a comprehensive list of production-ready tools, be sure to take a tour at:\n\n- [Awesome Production Machine Learning](https://github.com/EthicalML/awesome-production-machine-learning#data-labelling-tools-and-frameworks)\n\nVirgilio has chosen for you the best tools of this type for 3 problem categories:\n\n## Computer Vision\n\n- [OpenCV](https://opencv.org/about/)\n\nOpenCV (Open Source Computer Vision Library) is an open-source computer vision and machine learning software library. OpenCV was built to provide a common infrastructure for computer vision applications and to accelerate the use of machine perception in commercial products. Being a BSD-licensed product, OpenCV makes it easy for businesses to utilize and modify the code.\n\nLearn how to use OpenCV here:\n\n- [OpenCV Python for Beginners - Full Course in 10 Hours (2020)](https://www.youtube.com/watch?v=N81PCpADwKQ)\n\nCheck also Virgilio's tutorials in the Inferno section, They all use OpenCV!\n\n## Natural Language Processing\n\n- [Spacy](https://spacy.io/)\n\nSpaCy is a free, open-source library for advanced Natural Language Processing (NLP) in Python.\n\nIf you’re working with a lot of text, you’ll eventually want to know more about it. For example, what’s it about? What do the words mean in context? Who is doing what to whom? What companies and products are mentioned? Which texts are similar to each other?\n\nspaCy is designed specifically for production use and helps you build applications that process and “understand” large volumes of text. It can be used to build information extraction or natural language understanding systems or to pre-process text for deep learning.\n\nThey offer a free course on their website:\n\n- [Advanced NLP with Spacy](https://course.spacy.io/)\n\n## Time Series Forecasting\n\n- [Prophet](https://facebook.github.io/prophet/)\n\nProphet is a procedure for forecasting time series data based on an additive model where non-linear trends are fit with yearly, weekly, and daily seasonality, plus holiday effects. It works best with time series that have strong seasonal effects and several seasons of historical data. Prophet is robust to missing data and shifts in the trend, and typically handles outliers well.\n\nProphet is open source software released by Facebook’s Core Data Science team. It is available for download on CRAN and PyPI.\n\nGet the tutorials here:\n\n- [Prophet Quick Start](https://facebook.github.io/prophet/docs/quick_start.html)\n- [A Guide to Time Series Forecasting with Prophet in Python 3](https://www.digitalocean.com/community/tutorials/a-guide-to-time-series-forecasting-with-prophet-in-python-3)\n- [Forecasting in Python with Facebook Prophet](https://towardsdatascience.com/forecasting-in-python-with-facebook-prophet-29810eb57e66)\n\n## Conclusions\n\nIn this guide, we listed A LOT of tools, libraries, and a project that can help you be faster and more effective during the Data Science process. \n\nThe amount of tools listed here is enormous, so choose wisely what you _really need_ for your problem! \n\nAnd remember, no one is going to ask you to know 10 different Computer Vision tools, but they are going to ask you to know one of them very well!\n\n"
  },
  {
    "path": "docs/contributing.md",
    "content": "# Index\n - [You have immense power](#Contribute)\n - [Easiest way to contribute](#Easiest-way-to-contribute)\n - [Contributing with new guides](#Contributing-with-new-guides)\n - [General Tips](#General-Tips)\n - [Guide Template](#Guide-Template)\n - [Creating a Pull Request](#Creating-a-Pull-Request)\n\n \n# Contribute\n\n> “There is immense power when a group of people with similar interests gets together to work toward the same goals.” \n\nThe mission of Virgilio is to share free and curated knowledge paths and high-quality content, and we think that everyone can put his hands in this wonderful and serious game!\n\nIf you know how to use a tool or a framework, or you faced some business problems and their complications, why not writing a guide about it?\n \n> Several studies and empirical proofs show that the fastest and most effective way to learn something, is to teach it.\n\nMoreover, thousands of people will read it and would be grateful to you! 👍 \nDon't worry about the correctness of your English or the depth of your knowledge, experienced people at Virgilio will help you make your guide of the highest quality.\nIf you want to contribute to the Virgilio project, test to @Clone95 on Telegram and check out our future guides roadmap: maybe you can find that we already need your help!\nFeel free to suggest new ideas, guides, or entire sections! \n\n\n## Easiest way to contribute\nThe easiest way to contribute would be by sharing this repository with everyone you know. Send it to everyone who might enjoy leaning something new!\n\n## Contributing with new guides\nIf you want to write a new guide, that would be great! You can contact us if you want to be sure that no one else is already writing about what you had in mind, or to find out if someone else would be interested in helping you write about a particular topic!\n\nIf you want to write a guide, please take some time to read a couple of them to get a feel for the style that the guides should follow. You can have a look at the WolframAlpha or GeoGebra guides.\n\nBefore writing, you also need to check the [Guide Template](#Guide-Template).\n\nDo your best to write clearly and without errors! Provide relevant links whenever you can and only free resources. You are welcome to leave your contact details in the end of the guide, but you are not forced to do so!\n\n# General Tips\nIn general, Virgilio has to be the place that you go to and ensures you that the next step you're taking and the approach you are following are the right ones. This means that the ideal guide:\n\n- Introduces you to the what, why and the context in plain English (following the template).\n- If practice oriented (_Purgatorio and Inferno_), exposes you to practical experience with exercises and hands-on projects. Kaggle is a good place to find them: choose a project and give it as a “final homework”, giving tips and different solutions (if possible).\n- Drives you step-by-step through progressive theory+practice+example for each step. Like a book basically, but concise, with pointers to the right resources and brief suggestions about how to approach them.\n- Don't re-invent the wheel. Probably someone has done a very good job explaining Back Propagation, why not to leverage this? Other authors will be more than happy to have credits and share their work!\nThe thing that matters is that you provide this resource inside a logical path, with reasons for that, introducing it, and \"linking\" with explanations to the rest of the guide. It can just be 3-4 lines, if they are sufficient. Of course, the more original content you develop, the more you can build an awesome learning place. \n- Gives you, for each step, some pointers to resources like \"best practices for ____\" or repos of examples.\n\n### **The bottom line** is the following: \n\nVirgilio wants to be the mentor who \"lines up\" a series of resources of which the Internet already possesses most. \n\nIt wants to be those _lines that connect the dots_ of knowledge.\nIt wants to be the place in which you go to, to look for references and useful links, organized in a _logical and progressive way_. \nIt wants to _decrease the cognitive load_ in the approach to complex and interconnected themes such as machine learning and data science in general.\n\n\nYou have a lot of examples of guides that have already been written.\nIf the guide you are writing is highly pratical, consider using a Jupyter Notebook.\n\n# Guide Template\n\n# Title of the guide about X\n\n# What you will learn \nTry to be specific.\n\n## Prerequisites\nIt would be great if you knew\n  1. this thing\n  2. this other thing\n  3. and this might be useful as well\n\nLink here all prerequisites.\n\n## Time to complete\nGive here an estimation of the time needed to walk through the contents and to tackle the practice part (if any).\n\n# Index\n - [Section A](#section-a)\n   - [Subsection A1](#subsection-a1)\n   - [Subsection A2](#subsection-a2)\n - [Section B](#section-b)\n - ...\n - [Practice](#Practice)\n - [Conclusions](#Conclusions)\n - [Further reading](#Further-reading)\n\nLet's dive right in!\n \n### Section A\nSection A is great because it is the first section of them all!\n\nAnd this would be another very interesting paragrah!\n \n#### Subsection A1\nIn particular, I just went deeper into subsection A1!\n\n#### Subsection A2\nAnd of course there is subsection A2...\n\n### Section B\nWhich is then followed by Section B.\n\n### Practice \nHere you can give exercises too, in order to access to the next step of the path, \n\nor a project from Kaggle. For the project, give some guidelines and try to give an example solution (you can easily find dozens of solution notebooks on Kaggle)\n\n### Conclusions\nWe concluded that _x_, _y_ and _z_.\n\n### Further reading\nYou should definitely check this if you liked **x**, or read this if you liked **y**.\n\n----\nWritten by _author_\n\n\n## Creating a Pull Request\nIf you are going to create a Pull Request, regardless of the reason, please take the time to give the PR a concise, relevant title (less than 50 characters) and write a descriptive, informative summary in the larger text field. This will let us review your PR faster, instead of having to first interpret what you did, and then decide if the changes are any good (which they probably are!).\n\nWe are very interested in having people help us! That is the point of a community! But we would rather not spend hours trying to decipher the changes you made.\n"
  },
  {
    "path": "docs/contributors.md",
    "content": "# Contributors\n\nHere's the list of the awesome people making Virgilio possible.\n\nCore team:\n\n- **[clone95](https://github.com/clone95)**\n- **[avivace](https://github.com/avivace)**\n- **[entropizza](https://github.com/entropizza)**\n- **[neomatrix369](https://github.com/neomatrix369)**\n- **[khaledbay](https://github.com/khaledbay)**\n- **[RojerGS](https://github.com/RojerGS)**\n\nContributors:\n\n- [jiaxianhua](https://github.com/jiaxianhua)\n- [taotianli](https://github.com/taotianli)\n- [adnan7400](https://github.com/adnan7400)\n- [Lulzx](https://github.com/Lulzx)\n- [zszazi](https://github.com/zszazi)\n- [laravignotto](https://github.com/laravignotto)\n- [damianoazzolini](https://github.com/damianoazzolini)\n- [wuodland](https://github.com/wuodland)\n- [tdslinden](https://github.com/tdslinden)\n- [mindflayer](https://github.com/mindflayer)\n- [mikeshatch](https://github.com/mikeshatch)\n- [kjaisingh](https://github.com/kjaisingh)\n- [jiaoqiyuan](https://github.com/jiaoqiyuan)\n- [hechmik](https://github.com/hechmik)\n- [claude9493](https://github.com/claude9493)\n- [S-HuaBomb](https://github.com/S-HuaBomb)\n- [KARAKI93](https://github.com/KARAKI93)\n- [Ghost-717](https://github.com/Ghost-717)\n- [EthanITA](https://github.com/EthanITA)\n- [3nomis](https://github.com/3nomis)\n"
  },
  {
    "path": "docs/template.md",
    "content": "This file contains a generic template for a guide about some subject X.\n\nPlease remember to:\n - be consistent throughout the guide.\n - be as clear as possible.\n - write in your best English.\n - include examples whenever possible.\n - use internal links for easier navigation; an internal link to a section can be made by using the `#` sign, followed by the section name, with hyphens `-` instead of spaces (so section \"Who am I\" can be referenced with `#who-am-i`).\n - provide relevant links if you list some prerequisites.\n - provide a small challenge each step of the guide, it's too easy and not effective to just walk around among topics! \n------\n\n# Title of the guide about X\n\n## What is X\n**X** is what we will be talking about now!\n\n## Why does X matter \n**X** matters because unicorns are great!\n\n## Who am I?\n**X** I am definitely not a robot!\n\n## Prerequisites\nIt would be great if you knew\n  1. this thing\n  2. this other thing\n  3. and this might be useful as well\n\n# Index\n - [Section A](#section-a)\n   - [Subsection A1](#subsection-a1)\n   - [Subsection A2](#subsection-a2)\n - [Section B](#section-b)\n - ...\n \nLet's dive right in!\n \n### Section A\nSection A is great because it is the first section of them all!\n\nAnd this would be another very interesting paragrah!\n \n#### Subsection A1\nIn particular, I just went deeper into subsection A1!\n\n#### Subsection A2\nAnd of course there is subsection A2...\n\n### Section B\nWhich is then followed by Section B.\n\n### Conclusions\nWe concluded that _x_, _y_ and _z_.\n\n### Further reading\nYou should definitely check this if you liked **x**, or read this if you liked **y**.\n\n----\nWritten by _author_\n"
  },
  {
    "path": "google50cedcfbb5fc73b6.html",
    "content": "google-site-verification: google50cedcfbb5fc73b6.html"
  }
]