# Going Inside Machine Learning and Deep Learning Algorithms

## From Machine Learning Algorithms in Depth by Vadim Smolyakov

If you want to excel in ML and deep learning, you need to know more than how to implement the algorithms — you need to know them inside-out. This book delves into selected algorithms and teaches you how to build your own from scratch.

## Why Learn Algorithms from Scratch?

This book dives into the design of machine learning (ML) algorithms from scratch. It builds up algorithms from first principles and takes the reader on a journey from mathematical derivation to software implementation of some of the most exciting algorithms in the field of ML. Understanding ML algorithms from scratch has a number of advantages.
Breaking down a complex problem into smaller pieces and understanding where things went wrong often requires a strong sense of fundamentals and algorithmic intuition. This book will allow the reader to construct minimum working examples and build upon existing algorithms to develop and be able to debug more complex models. Finally, we are often interested in improving the performance of existing models. The principles discussed in this book will enable the reader to accomplish that. To summarize, understanding ML algorithms from scratch will help you choose the right algorithm for the task, explain the results, troubleshoot advanced problems, extend an algorithm to a new situation and improve performance of existing algorithms.

## Implementing Algorithms

A key part of learning algorithms from scratch is software implementation. It’s important to write good code that is both efficient in terms of its use of data structures and low algorithmic complexity. While the intention of this book is to write all code from scratch (without reliance on third party libraries), we can still use ML libraries (such as scikit-learn: https://scikit-learn.org/stable/) to check the results of our implementation if available. We’ll be using Python language throughout this book.

## Data Structures

A data structure is a way of storing and organizing data. Each data structure offers different performance trade-offs and some are more suitable for the task than others. We’ll be using a lot of linear data structures such as fixed size arrays in our implementation of ML algorithms since the time to access an element in the array is constant `O(1)`. We’ll also frequently use dynamically resizable arrays (such as lists in Python) to keep track of data over multiple iterations.
Throughout the book, we’ll be using non-linear data structures, such as map (dictionary) and set. The reason is that ordered dictionary and ordered set are built upon self-balanced binary search trees (BSTs) that guarantee `O(nlogn)` insertion, search and deletion operations. Finally, a hash table or unordered map is another commonly used, efficient data structure with `O(1)` access time assuming no collisions.

Many ML algorithms that are explored in this book can be grouped into four main problem-solving paradigms: complete search, greedy, divide and conquer, and dynamic programming. Complete search is a method for solving a problem by traversing the entire search space in search of a solution. A machine learning example where complete search takes place is an exact inference by complete enumeration. During exact inference, we must completely specify a number of probability tables to carry out our calculations. A greedy algorithm takes a locally optimum choice at each step with the hope of eventually reaching a globally optimum solution. Greedy algorithms often rely on a greedy heuristic. A machine learning example of a greedy algorithm consists of sensor placement. For example, given a room and several temperature sensors, we would like to place the sensors in a way that maximizes room coverage. Divide and conquer is a technique that divides the problem into smaller, independent sub-problems and then combines the solutions to each of the sub-problems. A machine learning example that uses divide and conquer paradigm can be found in CART decision tree algorithm. As we’ll see in a future chapter, in CART algorithm an optimum threshold for splitting a decision tree is found by optimizing a classification objective (such as Gini index). The same procedure is applied to a tree of depth one greater resulting in a recursive algorithm. Finally, Dynamic Programming (DP) is a technique that divides a problem into smaller, overlapping sub-problems, computes a solution for each sub-problem and stores it in a DP table. A machine learning example that uses dynamic programming occurs in Reinforcement Learning (RL) in finding a solution to Bellman equations. For a small number of states, we can compute the Q-function in tabular way using dynamic programming.

## What you will learn in this book

This book is about learning algorithms from the inside out by building them from scratch. You can expect to learn the following:

1. Develop mathematical intuition for classic and modern ML algorithms
2. Learn the fundamentals of Bayesian inference and deep learning
4. Learn about supervised, unsupervised and deep learning algorithms
5. Apply algorithms developed in this book to the areas of core ML, natural language processing, computer vision, optimization, computational biology and finance
6. and much more!

## Who this book is for

This book is for anyone who wants to learn the inner workings of machine learning and deep learning algorithms and those who want to learn how to design their own algorithms, e.g. data scientists, and ML and deep learning engineers. Knowledge of Python is assumed and experience with ML and deep learning algorithms, tools, and libraries is helpful.