Math for AI 102

Acknowledgement: This post is based mainly on Dr. Quang-Vinh Dinh’s presentation and slides and partly on on TA, STA, and peers’ responses from the course AIO2025 offered by AI VIETNAM.

Relevance: The audience of this lecture were those who have read Math for AI 101, had some coding experience, and known a bit of AI knowledge. Absolute beginners are encouraged to read the material and repeatedly practice coding without AI assistance to strengthen their coding and code-reading skills. Note that only necessary Python knowledge is introduced here. Also, not every single detail from Linear Algebra is introduced in this Math for AI series. Instead, we’ll learn pick up more material along the way.

The simplest ideas reveal what is most essential and enduring.
-Dr. Quang-Vinh Dinh

In today’s post, we’ll explore matrices and cosine similarity. We’ll also discuss some applications in AI including background substraction, traffic sign matching, and K-nearest neighbors.


All data can be transformed into vectors, so Linear Algebra can handle most of the real-world information.

Vector and Matrix

A vector is a collection of real numbers and has a length of n, that is, \(\mathbf{u} = \vec{u} = \begin{bmatrix} u_1 \\ \vdots \\ u_n \end{bmatrix} \in \mathbb{R}^n\).

A matrix is a collection/generalization of vectors and has m rows and n columns, that is, \(A = \begin{bmatrix} a_{11} &\cdots& a_{1n} \\ \vdots &\ddots& \vdots \\ a_{m1} &\cdots& a_{mn} \end{bmatrix} \in \mathbb{R}^{m \times n}\).

Mathematically, a linear equation is an equation where the variables/unknowns’ power is at most one. Its graph for one variable is called a line, for two variables is a plane, and for more than two is a hyperplane. For example, if $x_1, \cdots, x_n$ are variables, then some linear equations are

\[\begin{align*} y &= a x + b \\ y &= a_1 x_1 + a_2 x_2 + b \\ y &= a_1 x_1 + \cdots + a_n x_n + b. \end{align*}\]

System of Linear Equations

Assume that a company’s sales depends on their advertising expenses on TV, radio, and newspaper and specifically computed based on the linear equation formula

\[\begin{align*} \text{Sales } &= a_1 \text{TV} + a_2 \text{Radio} + a_3 \text{Newspaper} &+ b \\ S &= a_1 T + a_2 R + a_3 N &+ b \end{align*}\]

where $a_1, a_2, a_3, \text{ and } b$ are fixed for specific sets of T, R, and N. If we know all these parameters and expenses, we can easily figure out S.

For the sake of simplicity, we can exclude b or set b to be 0. If there are three sets of T, R, N, and S, we can construct a system of linear equations

\[\begin{align*} a_1 T_1 + a_2 R_1 + a_3 N_1 = S_1 \\ a_1 T_2 + a_2 R_2 + a_3 N_2 = S_2 \\ a_1 T_3 + a_2 R_3 + a_3 N_3 = S_3. \end{align*}\]

We can also rewrite this system using vectors

\[a_1 \begin{bmatrix} T_1 \\ R_1 \\ N_1 \end{bmatrix} + a_2 \begin{bmatrix} T_2 \\ R_2 \\ N_2 \end{bmatrix} + a_3 \begin{bmatrix} T_3 \\ R_3 \\ N_3 \end{bmatrix} = \begin{bmatrix} S_1 \\ S_2 \\ S_3 \end{bmatrix}\]

and a matrix

\[\begin{bmatrix} T_1 & R_1 & N_1 \\ T_2 & R_2 & N_2 \\ T_3 & R_3 & N_3 \end{bmatrix} \begin{bmatrix} a_1 \\ a_2 \\ a_3 \end{bmatrix} = \begin{bmatrix} S_1 \\ S_2 \\ S_3 \end{bmatrix}.\]

For this matrix-vector calculation, each linear equation or each entry in the resulting vector is obtained by element-wise multiplying the corresponding row of the matrix with the vector and summing the results. Each multiplication is known as dot product, which will be introduced later.

Generally, we can have more unknowns $a_i’s$ than equations or vice versa and, regardless of circumstance, write

\[A \mathbf{x} = \mathbf{b}\]

where $A$ is a data matrix, $\mathbf{x}$ is an unknown, $\mathbf{b}$ is a data vector, and the number of columns in $A$ must match that of the unknown vector $\mathbf{x}$.

If we have more unknowns than equations, then there are infinitely many solutions. In such cases, our goal is to figure out the most optimized solution.

Vectors Operations

For scalar $\alpha$, \(\mathbf{u} = \begin{bmatrix} u_1 \\ \vdots \\ u_n \end{bmatrix} \in \mathbb{R}^{n}\), and \(\mathbf{v} = \begin{bmatrix} v_1 \\ \vdots \\ v_n \end{bmatrix} \in \mathbb{R}^{n}\), we have the following vector operations.

Operation Formula Commutative
Vector Addition
  • element-wise addition
  • $+$
  • np.add(vec1, vec2)
  • np.add(vec2, vec1)
$$\mathbf{u} + \mathbf{v} = \begin{bmatrix} u_1 + v_1 \\ \vdots \\ u_n + v_n \end{bmatrix}$$ $$\mathbf{u} + \mathbf{v} = \mathbf{v} + \mathbf{u}$$
Vector Subtraction
  • element-wise subtraction
  • $-$
  • np.subtract(vec1, vec2)
$$\mathbf{u} - \mathbf{v} = \begin{bmatrix} u_1 - v_1 \\ \vdots \\ u_n - v_n \end{bmatrix}$$ :x:
Hadamard Product
  • element-wise multiplication
  • $*$
  • np.multiply(vec1, vec2)
  • np.multiply(vec2, vec1)
$$\mathbf{u} \odot \mathbf{v} = \begin{bmatrix} u_1 v_1 \\ \vdots \\ u_n v_n \end{bmatrix}$$ $$\mathbf{u} \odot \mathbf{v} = \mathbf{v} \odot \mathbf{u}$$
Hadamard Division
  • element-wise division
  • $/$
  • np.divide(vec1, vec2)
$$\mathbf{u} \oslash \mathbf{v} = \begin{bmatrix} u_1 / v_1 \\ \vdots \\ u_n / v_n \end{bmatrix}$$ :x:
Scalar Multiplication
  • $*$
$$\alpha \mathbf{u} = \alpha \begin{bmatrix} u_1 \\ \vdots \\ u_n \end{bmatrix} = \begin{bmatrix} \alpha u_1 \\ \vdots \\ \alpha u_n \end{bmatrix}$$ $$\alpha \mathbf{u} = \mathbf{u} \alpha$$
Transpose
  • convert rows into columns
  • vec.T
$$\mathbf{u}^\intercal = [u_1 \cdots u_n] \in \mathbb{R}^{1 \times n}$$ :x:
Dot Product
  • np.dot(vec1, vec2)
  • np.dot(vec2, vec1)
  • vec1.subtract(vec2)
  • vec2.subtract(vec1)
$$\begin{align*} &\mathbf{u} \cdot \mathbf{v} = \langle \mathbf{u}, \mathbf{v} \rangle = \mathbf{u}^\intercal \mathbf{v} \\ &= u_1 \times v_1 + \cdots + \ u_n \times v_n \end{align*}$$ $$\mathbf{u} \cdot \mathbf{v} = \mathbf{v} \cdot \mathbf{u}$$
Norm/Length of a Vector
  • np.linalg.norm(vec)
  • normally use squared norm $\left \lVert \mathbf{u} \right \rVert ^2$
$$\begin{align*} &\left \lVert \mathbf{u} \right \rVert = \sqrt{\mathbf{u} \cdot \mathbf{u}} \\ &= \sqrt{u_1^2 + \cdots u_n^2} \end{align*}$$ :x:


Geometrically, dot product of two vectors is based on the projection of the first vector onto the second, that is, represent how much the former points in the same direction as the latter. The more positive and higher the result is, the closer they are, the more similar directions they point towards and vice versa. If the result is 0, then two vectors are perpendiclar/orthogonal.

Matrix Operations

For \(A = \begin{bmatrix} a_{11} &\cdots& a_{1n} \\ \vdots &\ddots& \vdots \\ a_{m1} &\cdots& a_{mn} \end{bmatrix} \in \mathbb{R}^{m \times n}\), \(B = \begin{bmatrix} b_{11} &\cdots& b_{1q} \\ \vdots &\ddots& \vdots \\ b_{p1} &\cdots& b_{pq} \end{bmatrix} \in \mathbb{R}^{p \times q}\), and \(\mathbf{x} = \begin{bmatrix} x_1 \\ \vdots \\ x_n \end{bmatrix} \in \mathbb{R}^{n}\), we have the following operations.

Operation Formula Commutative
Matrix Addition
  • element-wise addition
For $m = p$ and $n = q$, $$A + B = \begin{bmatrix} a_{11} + b_{11} &\cdots& a_{1n} + b_{1q} \\ \vdots &\ddots& \vdots \\ a_{m1} + b_{p1} &\cdots& a_{mn} + b_{pq} \end{bmatrix}$$ $$A + B = B + A$$
Vector Subtraction
  • element-wise subtraction
For $m = p$ and $n = q$, $$A - B = \begin{bmatrix} a_{11} - b_{11} &\cdots& a_{1n} - b_{1q} \\ \vdots &\ddots& \vdots \\ a_{m1} - b_{p1} &\cdots& a_{mn} - b_{pq} \end{bmatrix}$$ :x:
Transpose
  • convert rows into columns
  • mat.T
$$A^\intercal = \begin{bmatrix} a_{11} &\cdots& a_{m1} \\ \vdots &\ddots& \vdots \\ a_{1n} &\cdots& a_{mn} \end{bmatrix} \in \mathbb{R}^{n \times m}$$ :x:
Matrix-Vector Multiplication
  • transform a vector using a matrix
  • np.dot(mat, vec)
  • mat @ vec
  • mat.dot(vec)
$$\mathbf{c} = A \mathbf{x} = \begin{bmatrix} a_{11} x_1 + \cdots + a_{1n} x_n \\ \vdots \\ a_{m1} x_1 + \cdots + a_{mn} x_n \end{bmatrix}$$ $$c \in \mathbb{R}^m \text{ where } c_i = \sum_{j=1}^{n} a_{ij} x_j$$ :x:
Matrix-Matrix Multiplication
  • transformations B -> A
  • np.dot(mat1, mat2)
  • mat1 @ mat2
  • mat1.dot(mat2)
For $n = p$, $$\begin{align*} &C = AB \\ &= \begin{bmatrix} \sum_{j=1}^n a_{1j} b_{j1} &\cdots& \sum_{j=1}^n a_{1j} b_{jq} \\ \vdots &\ddots& \vdots \\ \sum_{j=1}^n a_{mj} b_{j1} &\cdots& \sum_{j=1}^n a_{mj} b_{jq} \end{bmatrix} \end{align*}$$ $$C \in \mathbb{R}^{m \times q} \text{ where } c_{ik} = \sum_{j=1}^{n} a_{ij} b_{jk}$$ :x:


Notation and Other Operations
$X \in \mathbb{R}^{m \times n}$ is also denoted by $X \sim (m, n)$. This is also applied to higher-dimensional matrices.

We can also take exponential function or square root of a matrix as follows.

x = np.arange(6).reshape((2,3))
print(f'x is {x}')
print(f'square root of x is {np.sqrt(x)}')
print(f'exponential of x is {np.exp(x)}')

'''
x is [[0 1 2]
      [3 4 5]]
square root of x is [[0.         1.         1.41421356]
                     [1.73205081 2.         2.23606798]]
exponential of x is [[  1.           2.71828183   7.3890561 ]
                     [ 20.08553692  54.59815003 148.4131591 ]]
'''

argmin and argmax
Let $\mathbf{x}$ be and array and $D$ be its elements’ indices.

  min max
np.min()
np.max()
get the value
$\{x_i \in \mathbf{x} | x_i \le x_j \forall x_j \in \mathbf{x} \}$ $\{x_i \in \mathbf{x} | x_i \ge x_j \forall x_j \in \mathbb{x} \}$
np.argmin()
np.argmax()
get the index
$\{i \in D | x_i \le x_j \forall x_j \in \mathbf{x} \}$ $\{x_i \in D | x_i \ge x_j \forall x_j \in \mathbf{x} \}$


Summation and Average
We use np.sum() and np.mean() to compute the summation and average of values of a vector. The mathematical formulae for these methods are as follows.

\[sum(\mathbf{x}) = \sum_{i} x_i\] \[average(\mathbf{x}) = \frac{1}{n} \sum_{i} x_i\]
Practice Exercises
Exercise 1: Given x = np.array([1, 2, 3, 4]) and y = np.array([5, 6, 7, 8]), write code for vector operations using NumPy.
Exercise 2: Consider vectors in exercise 1 as lists, use zip() to write code for vector operations above.
Exercise 3: For exercise 1, write code for norm of a vector without using the suggested method.
Exercise 4: Given x = np.array([[4, 2], [9, 8]]) and y = np.array([[1, 2], [3, 4]]), write code for matrix operations using NumPy.
Exercise 5: Explain the third equality in the dot product formula in vector operations.
Exercise 6: Given u = [1, 12, 20, 2] is a vector, what is $\frac{\mathbf{u}}{\left \lVert \mathbf{u} \right \rVert}$?
Exercise 7: If $A \in \mathbb{R}^{m \times n}$ and $B \in \mathbb{R}^{d \times n}$, which of the following is valid?
  • $AB$
  • $BA$
  • $A^\intercal B$
  • $AB^\intercal$
Exercise 8: Which of the following compute sum of elements of x = np.array([1, 4, 3])?
  • np.dot(x, x)
  • np.sqrt(np.dot(x, x))
  • np.dot(x, y) where y = np.ones_like(x)


:bulb: Applications in AI

We know from the previous post that

  • a color image is a 3D matrix of values between 0 and 255, (Height, Width, channel) where there are 3 color channels RGB
  • a grayscale image is a 2D matrix of values between 0 and 255, (Height, Width).

Rotate Left an Image (Perpendicular)
We’ve learned how to handle a 2D matrix above, so rotating left a grayscale image should be feasible just using some above operations.

About the case of a color image—a 3D matrix, we know the last dimension is always 3 since it contains color channels. But we do want to swap its height and width. We can certainly do this using the idea of array indexing. The hint is that we can use the NumPy method np.transpose().

Convert Color to Grayscale Image

Example: Image Color Conversion
Problem statement: Convert a color image into a grayscale image.
Breakdown: Broadcasting and Matrix-Vector Multiplication $A \mathbf{x}$
  • Broadcasting can stretch a vector to be suitable for an operation.
  • The multiplication can change the shape of the matrix.
  • The resulting "vector" is obtained by multiplying the elements of each row of the matrix with the corresponding elements of the vector and summing such results.
  • The original vector acts as weights/coefficients of each row of the matrix.
Idea: To perform this conversion, we want to exterminate the last dimension. If we think of the color matrix, what we want is to suppress three channels into one in a sense that the values are still in the range from 0 to 255.
  1. Solution 1: Take their mean (without np.mean())
  2. The mean of three numbers is calculated as their sum divided by three. As such the weight for each number is $\frac{1}{3}$. Then, we can use matrix-vector multiplication on the color image and $vector = \begin{bmatrix} \frac{1}{3} \\ \frac{1}{3} \\ \frac{1}{3} \end{bmatrix}$ to create a grayscale image.
  3. Solution 2: Use standard ratio
  4. The standard ratio for color-grayscale is $[R, G, B] = [0.213, 0.715, 0.072]$. Using this ratio, we can also create a vector and apply the matrix-vector multiplication on it and a color image.
    :warning: OpenCV reads a color image in order BGR, not RGB.


In fact, OpenCV provides a function that can convert a color to grayscale image. The example above demonstrates behind-the-scene computation.

color_image = cv2.cvtColor(color_image, cv2.COLOR_BGR2GRAY)

Background Subtraction
In OpenCV, there is a function called cv2.threshold(), which works quite similarly to np.clip() or np.where() in NumPy. This function is specifically used for image data, not ndarray in general. Be mindful about the proper data type that it can handle.

import cv2

_, array_output = cv2.threshold(array_input, threshold, max_value, cv2.THRESH_BINARY)

This statement returns two outputs including the threshold and the thresholded image known as mask, respectively. Note that the threshold and max_value are numbers but need not be integers. According to THRESH_BINARY, we can interpret the condition statement that

\[\begin{equation*} output\_values = \begin{cases} max\_value &\text{if } input\_value > threshold \\ 0 &\text{otherwise}. \end{cases} \end{equation*}\]
Example: Background Subtraction
Problem statement: We want to place a foreground image into a fake background provided that the placement region in the fake background is erased before we place it.
Breakdown: Consider three input images and one output image as follows.
  • Background B: the original background without the object.
  • Fake Background F: the background that we want to place the object on.
  • Input Image I: the image with the original background and object on it.
  • Output Image O: the image with the fake background and object on it.
Idea: We first need to get the object out of the original background. Then we can place it on the fake background.
  1. Any image is a matrix of values between 0 (black) and 255 (white), so we can do matrix operations on it.
  2. Matrix operations only work when matrices are proper in the situation. So we need to make sure our image matrices are of the same size.
  3. Get the object out of the original background by taking absolute difference.
    • We can separate the object and B in I by creating a clear distinction between them. Since the only difference between B and I is the object area, we can take their difference.
    • Taking the difference only might result in negative values since the background can be darker than the object itself. So we instead take the absolute difference.
    • As such the duplicated parts result in 0, practically close to 0 due to external factors like lighting.
    We need to make values close to 0 become exactly 0 so we have the resulting image which is called foreground mask.
  4. Place the object on the fake background.
    • If the foreground mask is 0, O takes F's values.
    • If the foreground mask is 255, O takes I's values.
    Once we apply these conditions, we will obtain O.
  5. We can improve this solution.
    • We replace the absolute difference values with their (weighted) average along the color channel dimension.
    • As such, image positions being 0 on all three channels (black) are replaced with F's values.
    • Image positions being 0 on fewer than three channels are replaced with I's values.
    This technique is applied to avoid values from both F and I are mixed up.
Practice Exercises
Exercise 1: Write code for the color-grayscale conversion problem (both solutions).
Exercise 2: Write code to rotate left a grayscale image using both matrix operation and NumPy method and a color image using NumPy method.
Exercise 3: Try cv2.threshold() with an arbitrary array.
Exercise 4: In the second step of background subtraction problem, provide a situation where the difference is negative.
Exercise 5: Write code for background subtraction problem using arbitrary images (two versions).

Cosine Similarity

A loss function is a part of the model training process and cosine similarity can be used for such a function.

Dot Product

In addition to length/norm, a vector is always associated with only one direction. Two vectors can have similar or different directions. For example, scale of a vector have different length but the same direction as itself. Practically, we can think words like teachers, students, and banks. The first two may be arranged in relevant categories, so their vectors may point in closer directions. On the other hand, the last two may not.

Figure 1. Interactive GeoGebra applet illustrating the vector projection and dot product. Drag the vectors to see how the projection and dot product change in real time. Click on the symbol in the bottom right corner to open the applet in full-screen mode. If the applet does not load, you can open it directly here.

As mentioned previously, the dot product of two vectors is geometrically based on the projection of one vector onto another. This contributes to the geometric definition in the table below. The interactive figure above illustrates

  • the smaller the angle between two vectors is
  • the closer they are
  • the longer the projection of one vector onto the other is
  • the more they points in the same direction.

If the result is negative, their directions are different or opposite. If it is positive, they are similar or the same. If it is 0, they are perpendicular. Therefore, dot product actually represents how much one vector points in the same direction as the other. This refers to the similarity of two vectors, which goes together with cosine similarity. In fact, the definition of dot product between two vectors involves the cosine of their smaller angle.

Algebraic Geometric
\(\mathbf{u} \cdot \mathbf{v} = \sum_{i=1}^n u_i v_i\) \(\mathbf{u} \cdot \mathbf{v} = \left \lVert \mathbf{u} \right \rVert \cos{(\mathbf{u}, \mathbf{v})} \left \lVert \mathbf{v} \right \rVert\)


Cosine Similarity

Cosine similarity is used to measure the similarity between two vectors. From two definitions above, we have the formula for cosine of the smaller angle between two vectors

\[\cos(\alpha) = \cos{(\mathbf{u}, \mathbf{v})} = \frac{\mathbf{u} \cdot \mathbf{v}}{\left \lVert \mathbf{u} \right \rVert \left \lVert \mathbf{v} \right \rVert} = \frac{\sum_{i=1}^n u_i v_i}{\sqrt{\sum_{i=1}^n u_i^2} \sqrt{\sum_{i=1}^n v_i^2}} \in [-1, 1].\]

Three important property for $\cos(\mathbf{u}, \mathbf{v})$ are

  1. The more similar two vectors are, the closer to 1 $\cos(\alpha)$ is.
  2. $\cos(\mathbf{u}, \mathbf{v}) = \cos(a \mathbf{u}, b \mathbf{v}) \text{ for } ab > 0$.
  3. $\cos(\mathbf{u}, \mathbf{v}) \neq \cos(\mathbf{u} + c, \mathbf{v} + d)$.

Above we have an example of words that shows usefulness of cosine similarity. Moreover, this concept can be applied to spot similar images.

  • We know that we can use basic operations to change brightness of an image.
  • Obviously, images with different brightness are still the same image.
  • If we use absolute difference on them, a computer will distinguish them as dissimilar.
  • Using cosine similarity can address this issue thanks to the second property.
Practice Exercises
Exercise 1: Prove two definitions of dot product are equivalent.
Hints: Use cosine formula in a triangle. Use vector formula for sides in a triangle. Use squared norm instead of norm.
Exercise 2: Prove the second property. Give an example for the third.
Exercise 3: Write code to compute dot product using the geometric definition.
Exercise 4: Write code to compute cosine similarity between two vectors using zip() and NumPy.
Exercise 5: Given u = [1, 1], which of the following vector is the most similar to u?
  • n = [-2, 1]
  • k = [-2, -1]
  • m = [2, -1]
  • r = [2, 1]
Exercise 6: Given the following, compute cosine between x and y and between u and v.

:bulb: Applications in AI

A unit vector is a vector of length 1. The unit vector in the direction of $\mathbf{x}$ is the vector $\frac{\mathbf{x}}{\left \lVert \mathbf{x} \right \rVert}$.

The distance between two points $x, y \in \mathbb{R}^n$ is the length of the vector from $\mathbf{x}$ to $\mathbf{y}$.

\[dist(x,y) = \left \lVert \mathbf{y} - \mathbf{x} \right \rVert.\]

While the absolute difference of two vectors is a vector, the distance between their heads (two points) is the length/norm of the resulting vector.

vector subtraction
Figure 2. $\left \lVert \mathbf{a} - \mathbf{b} \right \rVert$ is the distance between two endpoints

Traffic Sign Matching

One real-world application for absolute difference, distance, and cosine similarity is checking if two traffic signs are similar or not. They are similar when

  1. Absolute difference and distance are small and close to 0
    • Issue: The flip of an image is concluded to be more similar than its brighter image. This is because the results for the former may be smaller than that for the latter.
  2. Cosine similarity is close to 1.
    • Address the Issue: The brightness of an image has no significant effect on images’ similarity.

Figures below demonstrates the problem with absolute difference and distance and a solution using cosine similarity.

sign1: limit speed 60
Sign 1
sign2: darker than sign1
absdiff: 35.87637
dist: 9594.23593
cosine: 0.95924
sign3: stop
absdiff: 142.28993
dist: 28068.19955
cosine: 0.57510
sign2: darker than sign1 and sign2
absdiff: 90.49527
dist: 16025.60757
cosine: 0.96697
sign2: flip of sign1
absdiff: 37.02897
dist: 10076.56851
cosine: 0.95471
Figure 3. Absolute difference, distance, and cosine similarity between sign 1 and other signs.

:question: What if two images are the same but one is a rotation of the other?

K-Nearest Neighbors (KNN)

KNN is a popular algorithm in Machine Learning. It involves considering each piece of data as a vector and computing the distance between a testing point and training points. As such, the algorithm can select the K nearest neighbors and make further analysis to provide an suitable ouput.

knn algorithm example
Figure 4. Example for KKN algorithm
Practice Exercises
Exercise 1: Write code to compute absolute difference, distance, and cosine similarity.
Exercise 2: From exercise 1, which pair of signs has the lowest absolute difference/distance? Do they also have the highest or lowest cosine similarity?

:speech_balloon: FAQ

Here are some good questions asked during class. The answers to these questions came from either some admin, TA, STA, or members of AIO2025.

Questions Answers
Resources https://textbooks.math.gatech.edu/ila/index.html
What are other practical use of cosine similarity? NLP, Classification, Film Recommendation, Plagarism checker or budget control and sales prediction.
Should I use cosine similarity to preprocess image data to eliminate external factors? No. Other common functions to deal iwth external factors are Gaussian blurring or median filtering.





    Enjoy Reading This Article?

    Here are some more articles you might like to read next:

  • Math for AI 101
  • Math for AI 105
  • Python for AI 101
  • Math for AI 103
  • Machine Learning 101 Warm-up