diff --git a/README.md b/README.md
index 94912c4..82df105 100644
--- a/README.md
+++ b/README.md
@@ -2,11 +2,11 @@ Machine Learning Notebooks, 3rd edition
=================================
This project aims at teaching you the fundamentals of Machine Learning in
-python. It contains the example code and solutions to the exercises in the second edition of my O'Reilly book [Hands-on Machine Learning with Scikit-Learn, Keras and TensorFlow (3rd edition)](https://homl.info/er3):
+python. It contains the example code and solutions to the exercises in the third edition of my O'Reilly book [Hands-on Machine Learning with Scikit-Learn, Keras and TensorFlow (3rd edition)](https://homl.info/er3):
-**Note**: If you are looking for the second edition notebooks, check out [ageron/handson-ml2](https://github.com/ageron/handson-ml2). For the first edition, see check out [ageron/handson-ml](https://github.com/ageron/handson-ml).
+**Note**: If you are looking for the second edition notebooks, check out [ageron/handson-ml2](https://github.com/ageron/handson-ml2). For the first edition, see [ageron/handson-ml](https://github.com/ageron/handson-ml).
## Quick Start
@@ -34,7 +34,7 @@ Read the [Docker instructions](https://github.com/ageron/handson-ml3/tree/main/d
### Want to install this project on your own machine?
-Start by installing [Anaconda](https://www.anaconda.com/distribution/) (or [Miniconda](https://docs.conda.io/en/latest/miniconda.html)), [git](https://git-scm.com/downloads), and if you have a TensorFlow-compatible GPU, install the [GPU driver](https://www.nvidia.com/Download/index.aspx), as well as the appropriate version of CUDA and cuDNN (see TensorFlow's documentation for more details).
+Start by installing [Anaconda](https://www.anaconda.com/products/distribution) (or [Miniconda](https://docs.conda.io/en/latest/miniconda.html)), [git](https://git-scm.com/downloads), and if you have a TensorFlow-compatible GPU, install the [GPU driver](https://www.nvidia.com/Download/index.aspx), as well as the appropriate version of CUDA and cuDNN (see TensorFlow's documentation for more details).
Next, clone this project by opening a terminal and typing the following commands (do not type the first `$` signs on each line, they just indicate that these are terminal commands):
diff --git a/math_linear_algebra.ipynb b/math_linear_algebra.ipynb
index c9f1312..629b175 100644
--- a/math_linear_algebra.ipynb
+++ b/math_linear_algebra.ipynb
@@ -6,7 +6,7 @@
"source": [
"**Math - Linear Algebra**\n",
"\n",
- "*Linear Algebra is the branch of mathematics that studies [vector spaces](https://en.wikipedia.org/wiki/Vector_space) and linear transformations between vector spaces, such as rotating a shape, scaling it up or down, translating it (ie. moving it), etc.*\n",
+ "*Linear Algebra is the branch of mathematics that studies [vector spaces](https://en.wikipedia.org/wiki/Vector_space) and linear transformations between vector spaces, such as rotating a shape, scaling it up or down, translating it (i.e. moving it), etc.*\n",
"\n",
"*Machine Learning relies heavily on Linear Algebra, so it is essential to understand what vectors and matrices are, what operations you can perform with them, and how they can be useful.*"
]
@@ -33,7 +33,7 @@
"## Definition\n",
"A vector is a quantity defined by a magnitude and a direction. For example, a rocket's velocity is a 3-dimensional vector: its magnitude is the speed of the rocket, and its direction is (hopefully) up. A vector can be represented by an array of numbers called *scalars*. Each scalar corresponds to the magnitude of the vector with regards to each dimension.\n",
"\n",
- "For example, say the rocket is going up at a slight angle: it has a vertical speed of 5,000 m/s, and also a slight speed towards the East at 10 m/s, and a slight speed towards the North at 50 m/s. The rocket's velocity may be represented by the following vector:\n",
+ "For example, say the rocket is going up at a slight angle: it has a vertical speed of 5,000 m/s, and also a slight speed towards the East at 10 m/s, and a slight speed towards the North at 50 m/s. The rocket's velocity may be represented by the following vector:\n",
"\n",
"**velocity** $= \\begin{pmatrix}\n",
"10 \\\\\n",
@@ -41,9 +41,9 @@
"5000 \\\\\n",
"\\end{pmatrix}$\n",
"\n",
- "Note: by convention vectors are generally presented in the form of columns. Also, vector names are generally lowercase to distinguish them from matrices (which we will discuss below) and in bold (when possible) to distinguish them from simple scalar values such as ${meters\\_per\\_second} = 5026$.\n",
+ "Note: by convention vectors are generally presented in the form of columns. Also, vector names are usually lowercase to distinguish them from matrices (which we will discuss below) and in bold (when possible) to distinguish them from simple scalar values such as ${meters\\_per\\_second} = 5026$.\n",
"\n",
- "A list of N numbers may also represent the coordinates of a point in an N-dimensional space, so it is quite frequent to represent vectors as simple points instead of arrows. A vector with 1 element may be represented as an arrow or a point on an axis, a vector with 2 elements is an arrow or a point on a plane, a vector with 3 elements is an arrow or point in space, and a vector with N elements is an arrow or a point in an N-dimensional space… which most people find hard to imagine.\n",
+ "A list of N numbers may also represent the coordinates of a point in an N-dimensional space, so it is quite frequent to represent vectors as simple points instead of arrows. A vector with 1 element may be represented as an arrow or a point on an axis, a vector with 2 elements is an arrow or a point on a plane, a vector with 3 elements is an arrow or a point in space, and a vector with N elements is an arrow or a point in an N-dimensional space… which most people find hard to imagine.\n",
"\n",
"\n",
"## Purpose\n",
@@ -203,7 +203,7 @@
"metadata": {},
"source": [
"### 2D vectors\n",
- "Let's create a couple very simple 2D vectors to plot:"
+ "Let's create a couple of very simple 2D vectors to plot:"
]
},
{
@@ -306,7 +306,7 @@
"metadata": {},
"source": [
"### 3D vectors\n",
- "Plotting 3D vectors is also relatively straightforward. First let's create two 3D vectors:"
+ "Plotting 3D vectors is also relatively straightforward. First, let's create two 3D vectors:"
]
},
{
@@ -345,8 +345,6 @@
}
],
"source": [
- "from mpl_toolkits.mplot3d import Axes3D\n",
- "\n",
"subplot3d = plt.subplot(111, projection='3d')\n",
"x_coords, y_coords, z_coords = zip(a,b)\n",
"subplot3d.scatter(x_coords, y_coords, z_coords)\n",
@@ -470,7 +468,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "Let's plot a little diagram to confirm that the length of vector $\\textbf{v}$ is indeed $\\approx5.4$:"
+ "Let's plot a little diagram to confirm that the length of vector $\\textbf{u}$ is indeed $\\approx5.4$:"
]
},
{
@@ -480,7 +478,7 @@
"outputs": [
{
"data": {
- "image/png": "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\n",
+ "image/png": "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\n",
"text/plain": [
"