4833 lines
659 KiB
Plaintext
4833 lines
659 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"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",
|
||
"\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.*"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Before we start, let's ensure that this notebook works well in both Python 2 and 3:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 1,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"from __future__ import division, print_function, unicode_literals"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# Vectors\n",
|
||
"## 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",
|
||
"\n",
|
||
"**velocity** $= \\begin{pmatrix}\n",
|
||
"10 \\\\\n",
|
||
"50 \\\\\n",
|
||
"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",
|
||
"\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",
|
||
"\n",
|
||
"\n",
|
||
"## Purpose\n",
|
||
"Vectors have many purposes in Machine Learning, most notably to represent observations and predictions. For example, say we built a Machine Learning system to classify videos into 3 categories (good, spam, clickbait) based on what we know about them. For each video, we would have a vector representing what we know about it, such as:\n",
|
||
"\n",
|
||
"**video** $= \\begin{pmatrix}\n",
|
||
"10.5 \\\\\n",
|
||
"5.2 \\\\\n",
|
||
"3.25 \\\\\n",
|
||
"7.0\n",
|
||
"\\end{pmatrix}$\n",
|
||
"\n",
|
||
"This vector could represent a video that lasts 10.5 minutes, but only 5.2% viewers watch for more than a minute, it gets 3.25 views per day on average, and it was flagged 7 times as spam. As you can see, each axis may have a different meaning.\n",
|
||
"\n",
|
||
"Based on this vector our Machine Learning system may predict that there is an 80% probability that it is a spam video, 18% that it is clickbait, and 2% that it is a good video. This could be represented as the following vector:\n",
|
||
"\n",
|
||
"**class_probabilities** $= \\begin{pmatrix}\n",
|
||
"0.80 \\\\\n",
|
||
"0.18 \\\\\n",
|
||
"0.02\n",
|
||
"\\end{pmatrix}$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Vectors in python\n",
|
||
"In python, a vector can be represented in many ways, the simplest being a regular python list of numbers:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 2,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"[10.5, 5.2, 3.25, 7.0]"
|
||
]
|
||
},
|
||
"execution_count": 2,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"[10.5, 5.2, 3.25, 7.0]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Since we plan to do quite a lot of scientific calculations, it is much better to use NumPy's `ndarray`, which provides a lot of convenient and optimized implementations of essential mathematical operations on vectors (for more details about NumPy, check out the [NumPy tutorial](tools_numpy.ipynb)). For example:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 3,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([ 10.5 , 5.2 , 3.25, 7. ])"
|
||
]
|
||
},
|
||
"execution_count": 3,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"import numpy as np\n",
|
||
"video = np.array([10.5, 5.2, 3.25, 7.0])\n",
|
||
"video"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The size of a vector can be obtained using the `size` attribute:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 4,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"4"
|
||
]
|
||
},
|
||
"execution_count": 4,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"video.size"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The $i^{th}$ element (also called *entry* or *item*) of a vector $\\textbf{v}$ is noted $\\textbf{v}_i$.\n",
|
||
"\n",
|
||
"Note that indices in mathematics generally start at 1, but in programming they usually start at 0. So to access $\\textbf{video}_3$ programmatically, we would write:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 5,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"3.25"
|
||
]
|
||
},
|
||
"execution_count": 5,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"video[2] # 3rd element"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Plotting vectors\n",
|
||
"To plot vectors we will use matplotlib, so let's start by importing it (for details about matplotlib, check the [matplotlib tutorial](tools_matplotlib.ipynb)):"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 138,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"%matplotlib inline\n",
|
||
"import matplotlib.pyplot as plt"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### 2D vectors\n",
|
||
"Let's create a couple very simple 2D vectors to plot:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 7,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"u = np.array([2, 5])\n",
|
||
"v = np.array([3, 1])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"These vectors each have 2 elements, so they can easily be represented graphically on a 2D graph, for example as points:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 8,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\n",
|
||
"text/plain": [
|
||
"<matplotlib.figure.Figure at 0x104eaffd0>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"x_coords, y_coords = zip(u, v)\n",
|
||
"plt.scatter(x_coords, y_coords, color=[\"r\",\"b\"])\n",
|
||
"plt.axis([0, 9, 0, 6])\n",
|
||
"plt.grid()\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Vectors can also be represented as arrows. Let's create a small convenience function to draw nice arrows:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 9,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"def plot_vector2d(vector2d, origin=[0, 0], **options):\n",
|
||
" return plt.arrow(origin[0], origin[1], vector2d[0], vector2d[1],\n",
|
||
" head_width=0.2, head_length=0.3, length_includes_head=True,\n",
|
||
" **options)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Now let's draw the vectors **u** and **v** as arrows:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 10,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\nAXQATcLZ84MAAAAASUVORK5CYII=\n",
|
||
"text/plain": [
|
||
"<matplotlib.figure.Figure at 0x104f890d0>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"plot_vector2d(u, color=\"r\")\n",
|
||
"plot_vector2d(v, color=\"b\")\n",
|
||
"plt.axis([0, 9, 0, 6])\n",
|
||
"plt.grid()\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### 3D vectors\n",
|
||
"Plotting 3D vectors is also relatively straightforward. First let's create two 3D vectors:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 11,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"a = np.array([1, 2, 8])\n",
|
||
"b = np.array([5, 6, 3])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Now let's plot them using matplotlib's `Axes3D`:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 12,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\nAElFTkSuQmCC\n",
|
||
"text/plain": [
|
||
"<matplotlib.figure.Figure at 0x105067790>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"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",
|
||
"subplot3d.set_zlim3d([0, 9])\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"It is a bit hard to visualize exactly where in space these two points are, so let's add vertical lines. We'll create a small convenience function to plot a list of 3d vectors with vertical lines attached:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 13,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\nQmCC\n",
|
||
"text/plain": [
|
||
"<matplotlib.figure.Figure at 0x105166e90>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"def plot_vectors3d(ax, vectors3d, z0, **options):\n",
|
||
" for v in vectors3d:\n",
|
||
" x, y, z = v\n",
|
||
" ax.plot([x,x], [y,y], [z0, z], color=\"gray\", linestyle='dotted', marker=\".\")\n",
|
||
" x_coords, y_coords, z_coords = zip(*vectors3d)\n",
|
||
" ax.scatter(x_coords, y_coords, z_coords, **options)\n",
|
||
"\n",
|
||
"subplot3d = plt.subplot(111, projection='3d')\n",
|
||
"subplot3d.set_zlim([0, 9])\n",
|
||
"plot_vectors3d(subplot3d, [a,b], 0, color=(\"r\",\"b\"))\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Norm\n",
|
||
"The norm of a vector $\\textbf{u}$, noted $\\left \\Vert \\textbf{u} \\right \\|$, is a measure of the length (a.k.a. the magnitude) of $\\textbf{u}$. There are multiple possible norms, but the most common one (and the only one we will discuss here) is the Euclidian norm, which is defined as:\n",
|
||
"\n",
|
||
"$\\left \\Vert \\textbf{u} \\right \\| = \\sqrt{\\sum_{i}{\\textbf{u}_i}^2}$\n",
|
||
"\n",
|
||
"We could implement this easily in pure python, recalling that $\\sqrt x = x^{\\frac{1}{2}}$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 14,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"|| [2 5] || =\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"5.3851648071345037"
|
||
]
|
||
},
|
||
"execution_count": 14,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"def vector_norm(vector):\n",
|
||
" squares = [element**2 for element in vector]\n",
|
||
" return sum(squares)**0.5\n",
|
||
"\n",
|
||
"print(\"||\", u, \"|| =\")\n",
|
||
"vector_norm(u)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"However, it is much more efficient to use NumPy's `norm` function, available in the `linalg` (**Lin**ear **Alg**ebra) module:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 15,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"5.3851648071345037"
|
||
]
|
||
},
|
||
"execution_count": 15,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"import numpy.linalg as LA\n",
|
||
"LA.norm(u)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Let's plot a little diagram to confirm that the length of vector $\\textbf{v}$ is indeed $\\approx5.4$:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 16,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\nAAAASUVORK5CYII=\n",
|
||
"text/plain": [
|
||
"<matplotlib.figure.Figure at 0x105198250>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"radius = LA.norm(u)\n",
|
||
"plt.gca().add_artist(plt.Circle((0,0), radius, color=\"#DDDDDD\"))\n",
|
||
"plot_vector2d(u, color=\"red\")\n",
|
||
"plt.axis([0, 8.7, 0, 6])\n",
|
||
"plt.grid()\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Looks about right!"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Addition\n",
|
||
"Vectors of same size can be added together. Addition is performed *elementwise*:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 17,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
" [2 5]\n",
|
||
"+ [3 1]\n",
|
||
"----------\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([5, 6])"
|
||
]
|
||
},
|
||
"execution_count": 17,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"print(\" \", u)\n",
|
||
"print(\"+\", v)\n",
|
||
"print(\"-\"*10)\n",
|
||
"u + v"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Let's look at what vector addition looks like graphically:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 18,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"scrolled": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\n",
|
||
"text/plain": [
|
||
"<matplotlib.figure.Figure at 0x1052840d0>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"plot_vector2d(u, color=\"r\")\n",
|
||
"plot_vector2d(v, color=\"b\")\n",
|
||
"plot_vector2d(v, origin=u, color=\"b\", linestyle=\"dotted\")\n",
|
||
"plot_vector2d(u, origin=v, color=\"r\", linestyle=\"dotted\")\n",
|
||
"plot_vector2d(u+v, color=\"g\")\n",
|
||
"plt.axis([0, 9, 0, 7])\n",
|
||
"plt.text(0.7, 3, \"u\", color=\"r\", fontsize=18)\n",
|
||
"plt.text(4, 3, \"u\", color=\"r\", fontsize=18)\n",
|
||
"plt.text(1.8, 0.2, \"v\", color=\"b\", fontsize=18)\n",
|
||
"plt.text(3.1, 5.6, \"v\", color=\"b\", fontsize=18)\n",
|
||
"plt.text(2.4, 2.5, \"u+v\", color=\"g\", fontsize=18)\n",
|
||
"plt.grid()\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Vector addition is **commutative**, meaning that $\\textbf{u} + \\textbf{v} = \\textbf{v} + \\textbf{u}$. You can see it on the previous image: following $\\textbf{u}$ *then* $\\textbf{v}$ leads to the same point as following $\\textbf{v}$ *then* $\\textbf{u}$.\n",
|
||
"\n",
|
||
"Vector addition is also **associative**, meaning that $\\textbf{u} + (\\textbf{v} + \\textbf{w}) = (\\textbf{u} + \\textbf{v}) + \\textbf{w}$."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"If you have a shape defined by a number of points (vectors), and you add a vector $\\textbf{v}$ to all of these points, then the whole shape gets shifted by $\\textbf{v}$. This is called a [geometric translation](https://en.wikipedia.org/wiki/Translation_%28geometry%29):"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 19,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\nOri8613ESkr2Xc5kLVxIj1Wr5Pa0aXDTTXKkVPmeH40buxdnQoJMTD76qBRoO3fe/72pU+WPx+WX\nuxefSw5s2cvOxrcH42ZlyWZMQRXQNwrOilWN060kHdH4rJX/o0tKpEPjvPNki7aSErI6dqTHRRfB\nyy9DYqLsoeGBjZn2jW/kSIl/2rSD7zBjhrwD8OnemDX9/fR6y1444wvqZkzlNFGrquXlyRLtlStl\nr4xbbpH3mX37yrFTCxdCgwZkFhWR5uVLsm7dZKJyxoz9X1u4UMY3cqRrYXmBn3fZKyiAn34KTvdK\nZbRG7YKPtm8nZC3pRx3ldiiV27pVOi6MkfeTzZvDX/8qifn77yv9PyK/pISWixaxY8AAEr08o/PE\nE/KHZu5cOPNMuOoqOR18zRqZTIxjfm3ZW7RINmJassTtSCKn7XkeZK3lybVruWj5ckq89EetqAi2\nbYPiYvjd76RgOWeO9Dc/8wy89ZYsPqlV64j/B0/t3NnbSRqkHy0xUcofRUXw+utyOECcJ2nwV8ve\ngbKy9nd0BpXH/6/yBidq1OX90c+vX89naWkMdnNTpVAItm+XVrSxY8kYNAief14KlHfdJef3XXyx\nJLRTTgmrn7lRYiK/P/bYGAQfuYNev+bN4eyz4Y03pASyc6fvyx5OzqF4sWWvqvEFvT4Nmqhj4sD+\n6M/c6o/Oz5dE/M9/yhrbO+6Qy6Y//lHKGn/5iyzbTkvz/akmVRo5Ugqbt94qE57nn+92RJ5x4MG4\nc+e6HU14grzHRzmtUcfA/G3b+Co/P7b90UVFcoLJrFnw3nsyU/T22/Djj9CkiVw2xau9e2XvkK1b\nZbe9Z55xOyLPKd89dulSb7fsFRfL39rNm6VS5ze610e82btXWuE+/1xKF7Nny/9la9bI9046KbjL\ntlRU+OFg3OxsqamvWOF2JNWjk4kO8uReEaGQlDJyc6Vs0aED/PKLHHFx/vkyhd+oEXTtWuXaWk+O\nz0E6vurxSsvekcaXmRn8iUTQRO24wmjuFWGt1Jpvukla5b76Slb+9ewplz4tW8quNOnp0d03o4JZ\nGzfy+Nq1MXs+FRt+OBg3HurToKUPRy3cvp0RK1Y4uxTcWrj9djlF++KLpWNh+nQ5F7BpU2eeo4au\n//57jq9fn1vatXM7FBUFzz4rZXwvHow7YICcHXHmmW5HUj1ao46h8v2j71u9mpe6dKn5UVmPPy6H\n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\n",
|
||
"text/plain": [
|
||
"<matplotlib.figure.Figure at 0x1054941d0>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"t1 = np.array([2, 0.25])\n",
|
||
"t2 = np.array([2.5, 3.5])\n",
|
||
"t3 = np.array([1, 2])\n",
|
||
"\n",
|
||
"x_coords, y_coords = zip(t1, t2, t3, t1)\n",
|
||
"plt.plot(x_coords, y_coords, \"c--\", x_coords, y_coords, \"co\")\n",
|
||
"\n",
|
||
"plot_vector2d(v, t1, color=\"r\", linestyle=\":\")\n",
|
||
"plot_vector2d(v, t2, color=\"r\", linestyle=\":\")\n",
|
||
"plot_vector2d(v, t3, color=\"r\", linestyle=\":\")\n",
|
||
"\n",
|
||
"t1b = t1 + v\n",
|
||
"t2b = t2 + v\n",
|
||
"t3b = t3 + v\n",
|
||
"\n",
|
||
"x_coords_b, y_coords_b = zip(t1b, t2b, t3b, t1b)\n",
|
||
"plt.plot(x_coords_b, y_coords_b, \"b-\", x_coords_b, y_coords_b, \"bo\")\n",
|
||
"\n",
|
||
"plt.text(4, 4.2, \"v\", color=\"r\", fontsize=18)\n",
|
||
"plt.text(3, 2.3, \"v\", color=\"r\", fontsize=18)\n",
|
||
"plt.text(3.5, 0.4, \"v\", color=\"r\", fontsize=18)\n",
|
||
"\n",
|
||
"plt.axis([0, 6, 0, 5])\n",
|
||
"plt.grid()\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Finally, substracting a vector is like adding the opposite vector."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Multiplication by a scalar\n",
|
||
"Vectors can be multiplied by scalars. All elements in the vector are multiplied by that number, for example:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 20,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"1.5 * [2 5] =\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([ 3. , 7.5])"
|
||
]
|
||
},
|
||
"execution_count": 20,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"print(\"1.5 *\", u, \"=\")\n",
|
||
"\n",
|
||
"1.5 * u"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Graphically, scalar multiplication results in changing the scale of a figure, hence the name *scalar*. The distance from the origin (the point at coordinates equal to zero) is also multiplied by the scalar. For example, let's scale up by a factor of `k = 2.5`:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 21,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\ntSAIgsf5f+8HlIWQVm5RAAAAAElFTkSuQmCC\n",
|
||
"text/plain": [
|
||
"<matplotlib.figure.Figure at 0x10553e990>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"k = 2.5\n",
|
||
"t1c = k * t1\n",
|
||
"t2c = k * t2\n",
|
||
"t3c = k * t3\n",
|
||
"\n",
|
||
"plt.plot(x_coords, y_coords, \"c--\", x_coords, y_coords, \"co\")\n",
|
||
"\n",
|
||
"plot_vector2d(t1, color=\"r\")\n",
|
||
"plot_vector2d(t2, color=\"r\")\n",
|
||
"plot_vector2d(t3, color=\"r\")\n",
|
||
"\n",
|
||
"x_coords_c, y_coords_c = zip(t1c, t2c, t3c, t1c)\n",
|
||
"plt.plot(x_coords_c, y_coords_c, \"b-\", x_coords_c, y_coords_c, \"bo\")\n",
|
||
"\n",
|
||
"plot_vector2d(k * t1, color=\"b\", linestyle=\":\")\n",
|
||
"plot_vector2d(k * t2, color=\"b\", linestyle=\":\")\n",
|
||
"plot_vector2d(k * t3, color=\"b\", linestyle=\":\")\n",
|
||
"\n",
|
||
"plt.axis([0, 9, 0, 9])\n",
|
||
"plt.grid()\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"As you might guess, dividing a vector by a scalar is equivalent to multiplying by its inverse:\n",
|
||
"\n",
|
||
"$\\dfrac{\\textbf{u}}{\\lambda} = \\dfrac{1}{\\lambda} \\times \\textbf{u}$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Scalar multiplication is **commutative**: $\\lambda \\times \\textbf{u} = \\textbf{u} \\times \\lambda$.\n",
|
||
"\n",
|
||
"It is also **associative**: $\\lambda_1 \\times (\\lambda_2 \\times \\textbf{u}) = (\\lambda_1 \\times \\lambda_2) \\times \\textbf{u}$.\n",
|
||
"\n",
|
||
"Finally, it is **distributive** over addition of vectors: $\\lambda \\times (\\textbf{u} + \\textbf{v}) = \\lambda \\times \\textbf{u} + \\lambda \\times \\textbf{v}$."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Zero, unit and normalized vectors\n",
|
||
"* A **zero-vector ** is a vector full of 0s.\n",
|
||
"* A **unit vector** is a vector with a norm equal to 1.\n",
|
||
"* The **normalized vector** of a non-null vector $\\textbf{u}$, noted $\\hat{\\textbf{u}}$, is the unit vector that points in the same direction as $\\textbf{u}$. It is equal to: $\\hat{\\textbf{u}} = \\dfrac{\\textbf{u}}{\\left \\Vert \\textbf{u} \\right \\|}$\n",
|
||
"\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 22,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\nFfDkk9HyihXRIXZr16a29d1XzkVb0sOHw5IlcOutUFUFn/1sNIxFUhX72iQVu1pb+eqKFVy5Zg2N\nA2BwQ1SlLNi2jSNff503Gxp8x+mxBx6Ac8/du7xoEUycmNnB/eKLUR3yzW9Gp6fn5UXD+mc/i6qQ\nz31Og1v6X2yGd197p7rmZsr//Gce3LzZb03Sj513d3Ylk6xvbuaExYt54K9/TWldmej9PvwQ1q//\neGWyaBG0nWHMLbf0bb37y75zJ6xbB9//fjSsH3kEEgn42teiYf2970U/PAoK+vb6qVJn7Jc6bw9W\nNzZyanU1W1paaMnySqe/OKIu/KKVK6nbvZv/66N76KHCwminXvtW7erV8NRT0VCtrY3OPEyXZDLq\nns84I/qhMH58tP6Cgr7/kBBJpwHbeS9raODU6mrqW1sHRE3SE4WJBNeNH88P9nExHN/uugseewym\nT4eRI6OBeued0RmHP/5xdBZiX9XVRcP5T3+Cp5+GIUOiY6vHjFENIv7oOO8OljY0cEp1NdsDu+xq\nJhQmElwzbhz/MnGi7ygZsWcPrFkTDf5Bg+CLX4xqmETCXw0i0lHsd1j2tHd6f9cuTq+pyb7B7aHz\n7kpjMslt69bxHxs29Or7Quotm5qi463nzo2u5veXv1RxxRUwbx6cc05Uz4Q0uEP67Lui/H0zoDrv\n+pYWTq2pob7z+cfyMY3JJFe9/Tbj8vM5e9gw33HS4sEHo+rj2WejreyxY6GyEoYOjU74OfFE3wlF\nemfA1Ca7k0lOq6mheseOtFxfO+utWwfjxqW0isJEghemT2d651MBA7BhQ3R0yl13RWcqzp0bnTBT\nUgKHHOI7nUjPxb422Z9r3nmHpQ0NA2NwP/oo3Hgj/PGPKa2mMZnk7KVLg/hNxbnolPQ77oiu0nfz\nzdHZmEceGe14bL8AlAa3xEVshve+eqent27lzrq67D7dPV2d92OPRVPsN7+BbduiQydSUN/SwiUr\nV+73eb56v2XLord5660wZw689VZUj9x+e7SlXVm5/3Woc/VL+fsm9p335t27OX/Fiuwe3Ol0zDF7\n65Ivfzm6yn8Kmp3jya1buWfjRr46enQaAqampSU6QuSVV+Cee6I/f/vbcNVVHz8GXCTuYt95n7Vk\nCVXbtrF7INQl/agokWD5zJlM8HQYxqZN0TVEmpqiy6Z+8YtRp33ooV7iiGRMd513rLe8H9+yhRfq\n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\nIiIB+v/muDwvCNxNZwAAAABJRU5ErkJggg==\n",
|
||
"text/plain": [
|
||
"<matplotlib.figure.Figure at 0x105494050>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"plt.gca().add_artist(plt.Circle((0,0),1,color='c'))\n",
|
||
"plt.plot(0, 0, \"ko\")\n",
|
||
"plot_vector2d(v / LA.norm(v), color=\"k\")\n",
|
||
"plot_vector2d(v, color=\"b\", linestyle=\":\")\n",
|
||
"plt.text(0.3, 0.3, \"$\\hat{u}$\", color=\"k\", fontsize=18)\n",
|
||
"plt.text(1.5, 0.7, \"$u$\", color=\"b\", fontsize=18)\n",
|
||
"plt.axis([-1.5, 5.5, -1.5, 3.5])\n",
|
||
"plt.grid()\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Dot product\n",
|
||
"### Definition\n",
|
||
"The dot product (also called *scalar product* or *inner product* in the context of the Euclidian space) of two vectors $\\textbf{u}$ and $\\textbf{v}$ is a useful operation that comes up fairly often in linear algebra. It is noted $\\textbf{u} \\cdot \\textbf{v}$, or sometimes $⟨\\textbf{u}|\\textbf{v}⟩$ or $(\\textbf{u}|\\textbf{v})$, and it is defined as:\n",
|
||
"\n",
|
||
"$\\textbf{u} \\cdot \\textbf{v} = \\left \\Vert \\textbf{u} \\right \\| \\times \\left \\Vert \\textbf{v} \\right \\| \\times cos(\\theta)$\n",
|
||
"\n",
|
||
"where $\\theta$ is the angle between $\\textbf{u}$ and $\\textbf{v}$.\n",
|
||
"\n",
|
||
"Another way to calculate the dot product is:\n",
|
||
"\n",
|
||
"$\\textbf{u} \\cdot \\textbf{v} = \\sum_i{\\textbf{u}_i \\times \\textbf{v}_i}$\n",
|
||
"\n",
|
||
"### In python\n",
|
||
"The dot product is pretty simple to implement:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 23,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"11"
|
||
]
|
||
},
|
||
"execution_count": 23,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"def dot_product(v1, v2):\n",
|
||
" return sum(v1i * v2i for v1i, v2i in zip(v1, v2))\n",
|
||
"\n",
|
||
"dot_product(u, v)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"But a *much* more efficient implementation is provided by NumPy with the `dot` function:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 24,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"11"
|
||
]
|
||
},
|
||
"execution_count": 24,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"np.dot(u,v)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Equivalently, you can use the `dot` method of `ndarray`s:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 25,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"11"
|
||
]
|
||
},
|
||
"execution_count": 25,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"u.dot(v)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"**Caution**: the `*` operator will perform an *elementwise* multiplication, *NOT* a dot product:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 26,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
" [2 5]\n",
|
||
"* [3 1] (NOT a dot product)\n",
|
||
"----------\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([6, 5])"
|
||
]
|
||
},
|
||
"execution_count": 26,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"print(\" \",u)\n",
|
||
"print(\"* \",v, \"(NOT a dot product)\")\n",
|
||
"print(\"-\"*10)\n",
|
||
"\n",
|
||
"u * v"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### Main properties\n",
|
||
"* The dot product is **commutative**: $\\textbf{u} \\cdot \\textbf{v} = \\textbf{v} \\cdot \\textbf{u}$.\n",
|
||
"* The dot product is only defined between two vectors, not between a scalar and a vector. This means that we cannot chain dot products: for example, the expression $\\textbf{u} \\cdot \\textbf{v} \\cdot \\textbf{w}$ is not defined since $\\textbf{u} \\cdot \\textbf{v}$ is a scalar and $\\textbf{w}$ is a vector.\n",
|
||
"* This also means that the dot product is **NOT associative**: $(\\textbf{u} \\cdot \\textbf{v}) \\cdot \\textbf{w} ≠ \\textbf{u} \\cdot (\\textbf{v} \\cdot \\textbf{w})$ since neither are defined.\n",
|
||
"* However, the dot product is **associative with regards to scalar multiplication**: $\\lambda \\times (\\textbf{u} \\cdot \\textbf{v}) = (\\lambda \\times \\textbf{u}) \\cdot \\textbf{v} = \\textbf{u} \\cdot (\\lambda \\times \\textbf{v})$\n",
|
||
"* Finally, the dot product is **distributive** over addition of vectors: $\\textbf{u} \\cdot (\\textbf{v} + \\textbf{w}) = \\textbf{u} \\cdot \\textbf{v} + \\textbf{u} \\cdot \\textbf{w}$."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### Calculating the angle between vectors\n",
|
||
"One of the many uses of the dot product is to calculate the angle between two non-zero vectors. Looking at the dot product definition, we can deduce the following formula:\n",
|
||
"\n",
|
||
"$\\theta = \\arccos{\\left ( \\dfrac{\\textbf{u} \\cdot \\textbf{v}}{\\left \\Vert \\textbf{u} \\right \\| \\times \\left \\Vert \\textbf{v} \\right \\|} \\right ) }$\n",
|
||
"\n",
|
||
"Note that if $\\textbf{u} \\cdot \\textbf{v} = 0$, it follows that $\\theta = \\dfrac{π}{4}$. In other words, if the dot product of two non-null vectors are orthogonal, it means that they are orthogonal.\n",
|
||
"\n",
|
||
"Let's use this formula to calculate the angle between $\\textbf{u}$ and $\\textbf{v}$ (in radians):"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 27,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Angle = 0.868539395286 radians\n",
|
||
" = 49.7636416907 degrees\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"def vector_angle(u, v):\n",
|
||
" cos_theta = u.dot(v) / LA.norm(u) / LA.norm(v)\n",
|
||
" return np.arccos(np.clip(cos_theta, -1, 1))\n",
|
||
"\n",
|
||
"theta = vector_angle(u, v)\n",
|
||
"print(\"Angle =\", theta, \"radians\")\n",
|
||
"print(\" =\", theta * 180 / np.pi, \"degrees\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Note: due to small floating point errors, `cos_theta` may be very slightly outside of the $[-1, 1]$ interval, which would make `arccos` fail. This is why we clipped the value within the range, using NumPy's `clip` function."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### Projecting a point onto an axis\n",
|
||
"The dot product is also very useful to project points onto an axis. The projection of vector $\\textbf{v}$ onto $\\textbf{u}$'s axis is given by this formula:\n",
|
||
"\n",
|
||
"$\\textbf{proj}_{\\textbf{u}}{\\textbf{v}} = \\dfrac{\\textbf{u} \\cdot \\textbf{v}}{\\left \\Vert \\textbf{u} \\right \\| ^2} \\times \\textbf{u}$\n",
|
||
"\n",
|
||
"Which is equivalent to:\n",
|
||
"\n",
|
||
"$\\textbf{proj}_{\\textbf{u}}{\\textbf{v}} = (\\textbf{v} \\cdot \\hat{\\textbf{u}}) \\times \\hat{\\textbf{u}}$\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 28,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\n",
|
||
"text/plain": [
|
||
"<matplotlib.figure.Figure at 0x104e9d9d0>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"u_normalized = u / LA.norm(u)\n",
|
||
"proj = v.dot(u_normalized) * u_normalized\n",
|
||
"\n",
|
||
"plot_vector2d(u, color=\"r\")\n",
|
||
"plot_vector2d(v, color=\"b\")\n",
|
||
"\n",
|
||
"plot_vector2d(proj, color=\"k\", linestyle=\":\")\n",
|
||
"plt.plot(proj[0], proj[1], \"ko\")\n",
|
||
"\n",
|
||
"plt.plot([proj[0], v[0]], [proj[1], v[1]], \"b:\")\n",
|
||
"\n",
|
||
"plt.text(1, 2, \"$proj_u v$\", color=\"k\", fontsize=18)\n",
|
||
"plt.text(1.8, 0.2, \"$v$\", color=\"b\", fontsize=18)\n",
|
||
"plt.text(0.8, 3, \"$u$\", color=\"r\", fontsize=18)\n",
|
||
"\n",
|
||
"plt.axis([0, 8, 0, 5.5])\n",
|
||
"plt.grid()\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# Matrices\n",
|
||
"A matrix is a rectangular array of scalars (ie. any number: integer, real or complex) arranged in rows and columns, for example:\n",
|
||
"\n",
|
||
"\\begin{bmatrix} 10 & 20 & 30 \\\\ 40 & 50 & 60 \\end{bmatrix}\n",
|
||
"\n",
|
||
"You can also think of a matrix as a list of vectors: the previous matrix contains either 2 horizontal 3D vectors or 3 vertical 2D vectors.\n",
|
||
"\n",
|
||
"Matrices are convenient and very efficient to run operations on many vectors at a time. We will also see that they are great at representing and performing linear transformations such rotations, translations and scaling."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Matrices in python\n",
|
||
"In python, a matrix can be represented in various ways. The simplest is just a list of python lists:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 29,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"[[10, 20, 30], [40, 50, 60]]"
|
||
]
|
||
},
|
||
"execution_count": 29,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"[\n",
|
||
" [10, 20, 30],\n",
|
||
" [40, 50, 60]\n",
|
||
"]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"A much more efficient way is to use the NumPy library which provides optimized implementations of many matrix operations:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 30,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[10, 20, 30],\n",
|
||
" [40, 50, 60]])"
|
||
]
|
||
},
|
||
"execution_count": 30,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"A = np.array([\n",
|
||
" [10,20,30],\n",
|
||
" [40,50,60]\n",
|
||
"])\n",
|
||
"A"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"By convention matrices generally have uppercase names, such as $A$.\n",
|
||
"\n",
|
||
"In the rest of this tutorial, we will assume that we are using NumPy arrays (type `ndarray`) to represent matrices."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Size\n",
|
||
"The size of a matrix is defined by its number of rows and number of columns. It is noted $rows \\times columns$. For example, the matrix $A$ above is an example of a $2 \\times 3$ matrix: 2 rows, 3 columns. Caution: a $3 \\times 2$ matrix would have 3 rows and 2 columns.\n",
|
||
"\n",
|
||
"To get a matrix's size in NumPy:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 31,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"(2, 3)"
|
||
]
|
||
},
|
||
"execution_count": 31,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"A.shape"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"**Caution**: the `size` attribute represents the number of elements in the `ndarray`, not the matrix's size:\n",
|
||
"\n",
|
||
"$M_{i,j}$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 32,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"6"
|
||
]
|
||
},
|
||
"execution_count": 32,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"A.size"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Element indexing\n",
|
||
"The number located in the $i^{th}$ row, and $j^{th}$ column of a matrix $X$ is sometimes noted $X_{i,j}$ or $X_{ij}$, but there is no standard notation, so people often prefer to explicitely name the elements, like this: \"*let $X = (x_{i,j})_{1 ≤ i ≤ m, 1 ≤ j ≤ n}$*\". This means that $X$ is equal to:\n",
|
||
"\n",
|
||
"$X = \\begin{bmatrix}\n",
|
||
" x_{1,1} & x_{1,2} & x_{1,3} & \\cdots & x_{1,n}\\\\\n",
|
||
" x_{2,1} & x_{2,2} & x_{2,3} & \\cdots & x_{2,n}\\\\\n",
|
||
" x_{3,1} & x_{3,2} & x_{3,3} & \\cdots & x_{3,n}\\\\\n",
|
||
" \\vdots & \\vdots & \\vdots & \\ddots & \\vdots \\\\\n",
|
||
" x_{m,1} & x_{m,2} & x_{m,3} & \\cdots & x_{m,n}\\\\\n",
|
||
"\\end{bmatrix}$\n",
|
||
"\n",
|
||
"However in this notebook we will use the $X_{i,j}$ notation, as it matches fairly well NumPy's notation. Note that in math indices generally start at 1, but in programming they usually start at 0. So to access $A_{2,3}$ programmatically, we need to write this:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 33,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"60"
|
||
]
|
||
},
|
||
"execution_count": 33,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"A[1,2] # 2nd row, 3rd column"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The $i^{th}$ row vector is sometimes noted $M_i$ or $M_{i,*}$, but again there is no standard notation so people often prefer to explicitely define their own names, for example: \"*let **x**$_{i}$ be the $i^{th}$ row vector of matrix $X$*\". We will use the $M_{i,*}$, for the same reason as above. For example, to access $A_{2,*}$ (ie. $A$'s 2nd row vector):"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 34,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([40, 50, 60])"
|
||
]
|
||
},
|
||
"execution_count": 34,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"A[1, :] # 2nd row vector (as a 1D array)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Similarly, the $j^{th}$ column vector is sometimes noted $M^j$ or $M_{*,j}$, but there is no standard notation. We will use $M_{*,j}$. For example, to access $A_{*,3}$ (ie. $A$'s 3rd column vector):"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 35,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([30, 60])"
|
||
]
|
||
},
|
||
"execution_count": 35,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"A[:, 2] # 3rd column vector (as a 1D array)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Note that the result is actually a one-dimensional NumPy array: there is no such thing as a *vertical* or *horizontal* one-dimensional array. If you need to actually represent a row vector as a one-row matrix (ie. a 2D NumPy array), or a column vector as a one-column matrix, then you need to use a slice instead of an integer when accessing the row or column, for example:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 36,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[40, 50, 60]])"
|
||
]
|
||
},
|
||
"execution_count": 36,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"A[1:2, :] # rows 2 to 3 (excluded): this returns row 2 as a one-row matrix"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 37,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[30],\n",
|
||
" [60]])"
|
||
]
|
||
},
|
||
"execution_count": 37,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"A[:, 2:3] # columns 3 to 4 (excluded): this returns column 3 as a one-column matrix"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Square, triangular, diagonal and identity matrices\n",
|
||
"A **square matrix** is a matrix that has the same number of rows and columns, for example a $3 \\times 3$ matrix:\n",
|
||
"\n",
|
||
"\\begin{bmatrix}\n",
|
||
" 4 & 9 & 2 \\\\\n",
|
||
" 3 & 5 & 7 \\\\\n",
|
||
" 8 & 1 & 6\n",
|
||
"\\end{bmatrix}"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"An **upper triangular matrix** is a special kind of square matrix where all the elements *below* the main diagonal (top-left to bottom-right) are zero, for example:\n",
|
||
"\n",
|
||
"\\begin{bmatrix}\n",
|
||
" 4 & 9 & 2 \\\\\n",
|
||
" 0 & 5 & 7 \\\\\n",
|
||
" 0 & 0 & 6\n",
|
||
"\\end{bmatrix}"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Similarly, a **lower triangular matrix** is a square matrix where all elements *above* the main diagonal are zero, for example:\n",
|
||
"\n",
|
||
"\\begin{bmatrix}\n",
|
||
" 4 & 0 & 0 \\\\\n",
|
||
" 3 & 5 & 0 \\\\\n",
|
||
" 8 & 1 & 6\n",
|
||
"\\end{bmatrix}"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"A **triangular matrix** is one that is either lower triangular or upper triangular."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"A matrix that is both upper and lower triangular is called a **diagonal matrix**, for example:\n",
|
||
"\n",
|
||
"\\begin{bmatrix}\n",
|
||
" 4 & 0 & 0 \\\\\n",
|
||
" 0 & 5 & 0 \\\\\n",
|
||
" 0 & 0 & 6\n",
|
||
"\\end{bmatrix}\n",
|
||
"\n",
|
||
"You can construct a diagonal matrix using NumPy's `diag` function:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 38,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[4, 0, 0],\n",
|
||
" [0, 5, 0],\n",
|
||
" [0, 0, 6]])"
|
||
]
|
||
},
|
||
"execution_count": 38,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"np.diag([4, 5, 6])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"If you pass a matrix to the `diag` function, it will happily extract the diagonal values:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 39,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([1, 5, 9])"
|
||
]
|
||
},
|
||
"execution_count": 39,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"D = np.array([\n",
|
||
" [1, 2, 3],\n",
|
||
" [4, 5, 6],\n",
|
||
" [7, 8, 9],\n",
|
||
" ])\n",
|
||
"np.diag(D)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Finally, the **identity matrix** of size $n$, noted $I_n$, is a diagonal matrix of size $n \\times n$ with $1$'s in the main diagonal, for example $I_3$:\n",
|
||
"\n",
|
||
"\\begin{bmatrix}\n",
|
||
" 1 & 0 & 0 \\\\\n",
|
||
" 0 & 1 & 0 \\\\\n",
|
||
" 0 & 0 & 1\n",
|
||
"\\end{bmatrix}\n",
|
||
"\n",
|
||
"Numpy's `eye` function returns the identity matrix of the desired size:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 40,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[ 1., 0., 0.],\n",
|
||
" [ 0., 1., 0.],\n",
|
||
" [ 0., 0., 1.]])"
|
||
]
|
||
},
|
||
"execution_count": 40,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"np.eye(3)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The identity matrix is often noted simply $I$ (instead of $I_n$) when its size is clear given the context. It is called the *identity* matrix because multiplying a matrix with it leaves the matrix unchanged as we will see below."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Adding matrices\n",
|
||
"If two matrices $Q$ and $R$ have the same size $m \\times n$, they can be added together. Addition is performed *elementwise*: the result is also a $m \\times n$ matrix $S$ where each element is the sum of the elements at the corresponding position: $S_{i,j} = Q_{i,j} + R_{i,j}$\n",
|
||
"\n",
|
||
"$S =\n",
|
||
"\\begin{bmatrix}\n",
|
||
" Q_{11} + R_{11} & Q_{12} + R_{12} & Q_{13} + R_{13} & \\cdots & Q_{1n} + R_{1n} \\\\\n",
|
||
" Q_{21} + R_{21} & Q_{22} + R_{22} & Q_{23} + R_{23} & \\cdots & Q_{2n} + R_{2n} \\\\\n",
|
||
" Q_{31} + R_{31} & Q_{32} + R_{32} & Q_{33} + R_{33} & \\cdots & Q_{3n} + R_{3n} \\\\\n",
|
||
" \\vdots & \\vdots & \\vdots & \\ddots & \\vdots \\\\\n",
|
||
" Q_{m1} + R_{m1} & Q_{m2} + R_{m2} & Q_{m3} + R_{m3} & \\cdots & Q_{mn} + R_{mn} \\\\\n",
|
||
"\\end{bmatrix}$\n",
|
||
"\n",
|
||
"For example, let's create a $2 \\times 3$ matric $B$ and compute $A + B$:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 41,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[1, 2, 3],\n",
|
||
" [4, 5, 6]])"
|
||
]
|
||
},
|
||
"execution_count": 41,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"B = np.array([[1,2,3], [4, 5, 6]])\n",
|
||
"B"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 42,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[10, 20, 30],\n",
|
||
" [40, 50, 60]])"
|
||
]
|
||
},
|
||
"execution_count": 42,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"A"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 43,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[11, 22, 33],\n",
|
||
" [44, 55, 66]])"
|
||
]
|
||
},
|
||
"execution_count": 43,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"A + B"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"**Addition is *commutative***, meaning that $A + B = B + A$:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 44,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[11, 22, 33],\n",
|
||
" [44, 55, 66]])"
|
||
]
|
||
},
|
||
"execution_count": 44,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"B + A"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"**It is also *associative***, meaning that $A + (B + C) = (A + B) + C$:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 45,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[111, 222, 333],\n",
|
||
" [444, 555, 666]])"
|
||
]
|
||
},
|
||
"execution_count": 45,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"C = np.array([[100,200,300], [400, 500, 600]])\n",
|
||
"\n",
|
||
"A + (B + C)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 46,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[111, 222, 333],\n",
|
||
" [444, 555, 666]])"
|
||
]
|
||
},
|
||
"execution_count": 46,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"(A + B) + C"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Scalar multiplication\n",
|
||
"A matrix $M$ can be multiplied by a scalar $\\lambda$. The result is noted $\\lambda \\times M$ or $\\lambda \\cdot M$ or simply $\\lambda M$, and it is a matrix of the same size as $M$ with all elements multiplied by $\\lambda$:\n",
|
||
"\n",
|
||
"$\\lambda M =\n",
|
||
"\\begin{bmatrix}\n",
|
||
" \\lambda \\times M_{11} & \\lambda \\times M_{12} & \\lambda \\times M_{13} & \\cdots & \\lambda \\times M_{1n} \\\\\n",
|
||
" \\lambda \\times M_{21} & \\lambda \\times M_{22} & \\lambda \\times M_{23} & \\cdots & \\lambda \\times M_{2n} \\\\\n",
|
||
" \\lambda \\times M_{31} & \\lambda \\times M_{32} & \\lambda \\times M_{33} & \\cdots & \\lambda \\times M_{3n} \\\\\n",
|
||
" \\vdots & \\vdots & \\vdots & \\ddots & \\vdots \\\\\n",
|
||
" \\lambda \\times M_{m1} & \\lambda \\times M_{m2} & \\lambda \\times M_{m3} & \\cdots & \\lambda \\times M_{mn} \\\\\n",
|
||
"\\end{bmatrix}$\n",
|
||
"\n",
|
||
"In NumPy, simply use the `*` operator to multiply a matrix by a scalar. For example:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 47,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[ 20, 40, 60],\n",
|
||
" [ 80, 100, 120]])"
|
||
]
|
||
},
|
||
"execution_count": 47,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"2 * A"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Scalar multiplication is **commutative**, meaning that $\\lambda \\times M = M \\times \\lambda$. For example:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 48,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[ 20, 40, 60],\n",
|
||
" [ 80, 100, 120]])"
|
||
]
|
||
},
|
||
"execution_count": 48,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"A * 2"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"It is also **associative**, meaning that $\\alpha \\times (\\beta \\times M) = (\\alpha \\times \\beta) \\times M$, where $\\alpha$ and $\\beta$ are scalars. For example:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 49,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[ 60, 120, 180],\n",
|
||
" [240, 300, 360]])"
|
||
]
|
||
},
|
||
"execution_count": 49,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"2 * (3 * A)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 50,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[ 60, 120, 180],\n",
|
||
" [240, 300, 360]])"
|
||
]
|
||
},
|
||
"execution_count": 50,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"(2 * 3) * A"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Finally, it is **distributive over addition** of matrices, meaning that $\\lambda \\times (Q + R) = \\lambda \\times Q + \\lambda \\times R$:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 51,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[ 22, 44, 66],\n",
|
||
" [ 88, 110, 132]])"
|
||
]
|
||
},
|
||
"execution_count": 51,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"2 * (A + B)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 52,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[ 22, 44, 66],\n",
|
||
" [ 88, 110, 132]])"
|
||
]
|
||
},
|
||
"execution_count": 52,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"2 * A + 2 * B"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Matrix dot product\n",
|
||
"So far, matrix operations have been rather intuitive. But multiplying matrices is a bit more involved.\n",
|
||
"\n",
|
||
"A matrix $Q$ of size $m \\times n$ can be multiplied by a matrix $R$ of size $n \\times q$. This is also called a **dot product** and it is noted $Q \\cdot R$ or simply $QR$. The result $P$ is an $m \\times q$ matrix where each element is computed as a sum of products:\n",
|
||
"\n",
|
||
"$P_{i,j} = \\sum_{k=1}^n{Q_{i,k} \\times R_{k,j}}$\n",
|
||
"\n",
|
||
"The element at position $i,j$ in the resulting matrix is the sum of the products of elements in row $i$ of matrix $Q$ by the elements in column $j$ of matrix $R$.\n",
|
||
"\n",
|
||
"$P =\n",
|
||
"\\begin{bmatrix}\n",
|
||
"Q_{11} R_{11} + Q_{12} R_{21} + \\cdots + Q_{1n} R_{n1} &\n",
|
||
" Q_{11} R_{12} + Q_{12} R_{22} + \\cdots + Q_{1n} R_{n2} &\n",
|
||
" \\cdots &\n",
|
||
" Q_{11} R_{1q} + Q_{12} R_{2q} + \\cdots + Q_{1n} R_{nq} \\\\\n",
|
||
"Q_{21} R_{11} + Q_{22} R_{21} + \\cdots + Q_{2n} R_{n1} &\n",
|
||
" Q_{21} R_{12} + Q_{22} R_{22} + \\cdots + Q_{2n} R_{n2} &\n",
|
||
" \\cdots &\n",
|
||
" Q_{21} R_{1q} + Q_{22} R_{2q} + \\cdots + Q_{2n} R_{nq} \\\\\n",
|
||
" \\vdots & \\vdots & \\ddots & \\vdots \\\\\n",
|
||
"Q_{m1} R_{11} + Q_{m2} R_{21} + \\cdots + Q_{mn} R_{n1} &\n",
|
||
" Q_{m1} R_{12} + Q_{m2} R_{22} + \\cdots + Q_{mn} R_{n2} &\n",
|
||
" \\cdots &\n",
|
||
" Q_{m1} R_{1q} + Q_{m2} R_{2q} + \\cdots + Q_{mn} R_{nq}\n",
|
||
"\\end{bmatrix}$\n",
|
||
"\n",
|
||
"You may notice that each element $P_{i,j}$ is the dot product of the row vector $Q_{i,*}$ and the column vector $R_{*,j}$:\n",
|
||
"\n",
|
||
"$P_{i,j} = Q_{i,*} \\cdot R_{*,j}$\n",
|
||
"\n",
|
||
"So we can rewrite $P$ more concisely as:\n",
|
||
"\n",
|
||
"$P =\n",
|
||
"\\begin{bmatrix}\n",
|
||
"Q_{1,*} \\cdot R_{*,1} & Q_{1,*} \\cdot R_{*,2} & \\cdots & Q_{1,*} \\cdot R_{*,q} \\\\\n",
|
||
"Q_{2,*} \\cdot R_{*,1} & Q_{2,*} \\cdot R_{*,2} & \\cdots & Q_{2,*} \\cdot R_{*,q} \\\\\n",
|
||
"\\vdots & \\vdots & \\ddots & \\vdots \\\\\n",
|
||
"Q_{m,*} \\cdot R_{*,1} & Q_{m,*} \\cdot R_{*,2} & \\cdots & Q_{m,*} \\cdot R_{*,q}\n",
|
||
"\\end{bmatrix}$\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Let's multiply two matrices in NumPy, using `ndarray`'s `dot` method:\n",
|
||
"\n",
|
||
"$E = A \\cdot D = \\begin{bmatrix}\n",
|
||
" 10 & 20 & 30 \\\\\n",
|
||
" 40 & 50 & 60\n",
|
||
"\\end{bmatrix} \\cdot \n",
|
||
"\\begin{bmatrix}\n",
|
||
" 2 & 3 & 5 & 7 \\\\\n",
|
||
" 11 & 13 & 17 & 19 \\\\\n",
|
||
" 23 & 29 & 31 & 37\n",
|
||
"\\end{bmatrix} = \n",
|
||
"\\begin{bmatrix}\n",
|
||
" 930 & 1160 & 1320 & 1560 \\\\\n",
|
||
" 2010 & 2510 & 2910 & 3450\n",
|
||
"\\end{bmatrix}$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 53,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[ 930, 1160, 1320, 1560],\n",
|
||
" [2010, 2510, 2910, 3450]])"
|
||
]
|
||
},
|
||
"execution_count": 53,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"D = np.array([\n",
|
||
" [ 2, 3, 5, 7],\n",
|
||
" [11, 13, 17, 19],\n",
|
||
" [23, 29, 31, 37]\n",
|
||
" ])\n",
|
||
"E = A.dot(D)\n",
|
||
"E"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Let's check this result by looking at one element, just to be sure: looking at $E_{2,3}$ for example, we need to multiply elements in $A$'s $2^{nd}$ row by elements in $D$'s $3^{rd}$ column, and sum up these products:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 54,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"2910"
|
||
]
|
||
},
|
||
"execution_count": 54,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"40*5 + 50*17 + 60*31"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 55,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"2910"
|
||
]
|
||
},
|
||
"execution_count": 55,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"E[1,2] # row 2, column 3"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Looks good! You can check the other elements until you get used to the algorithm.\n",
|
||
"\n",
|
||
"We multiplied a $2 \\times 3$ matrix by a $3 \\times 4$ matrix, so the result is a $2 \\times 4$ matrix. The first matrix's number of columns has to be equal to the second matrix's number of rows. If we try to multiple $D$ by $A$, we get an error because D has 4 columns while A has 2 rows:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 56,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"ValueError: shapes (3,4) and (2,3) not aligned: 4 (dim 1) != 2 (dim 0)\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"try:\n",
|
||
" D.dot(A)\n",
|
||
"except ValueError as e:\n",
|
||
" print(\"ValueError:\", e)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"This illustrates the fact that **matrix multiplication is *NOT* commutative**: in general $Q \\cdot R ≠ R \\cdot Q$\n",
|
||
"\n",
|
||
"In fact, $Q \\cdot R$ and $R \\cdot Q$ are only *both* defined if $Q$ has size $m \\times n$ and $R$ has size $n \\times m$. Let's look at an example where both *are* defined and show that they are (in general) *NOT* equal:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 57,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[400, 130],\n",
|
||
" [940, 310]])"
|
||
]
|
||
},
|
||
"execution_count": 57,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"F = np.array([\n",
|
||
" [5,2],\n",
|
||
" [4,1],\n",
|
||
" [9,3]\n",
|
||
" ])\n",
|
||
"A.dot(F)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 58,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[130, 200, 270],\n",
|
||
" [ 80, 130, 180],\n",
|
||
" [210, 330, 450]])"
|
||
]
|
||
},
|
||
"execution_count": 58,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"F.dot(A)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"On the other hand, **matrix multiplication *is* associative**, meaning that $Q \\cdot (R \\cdot S) = (Q \\cdot R) \\cdot S$. Let's create a $4 \\times 5$ matrix $G$ to illustrate this:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 59,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[21640, 28390, 27320, 31140, 13570],\n",
|
||
" [47290, 62080, 60020, 68580, 29500]])"
|
||
]
|
||
},
|
||
"execution_count": 59,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"G = np.array([\n",
|
||
" [8, 7, 4, 2, 5],\n",
|
||
" [2, 5, 1, 0, 5],\n",
|
||
" [9, 11, 17, 21, 0],\n",
|
||
" [0, 1, 0, 1, 2]])\n",
|
||
"A.dot(D).dot(G) # (A⋅B)⋅G"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 60,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[21640, 28390, 27320, 31140, 13570],\n",
|
||
" [47290, 62080, 60020, 68580, 29500]])"
|
||
]
|
||
},
|
||
"execution_count": 60,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"A.dot(D.dot(G)) # A⋅(B⋅G)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"It is also ***distributive* over addition** of matrices, meaning that $(Q + R) \\cdot S = Q \\cdot S + R \\cdot S$. For example:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 61,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[1023, 1276, 1452, 1716],\n",
|
||
" [2211, 2761, 3201, 3795]])"
|
||
]
|
||
},
|
||
"execution_count": 61,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"(A + B).dot(D)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 62,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[1023, 1276, 1452, 1716],\n",
|
||
" [2211, 2761, 3201, 3795]])"
|
||
]
|
||
},
|
||
"execution_count": 62,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"A.dot(D) + B.dot(D)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The dot product of a matrix $M$ by the identity matrix (of matching size) results in the same matrix $M$. More formally, if $M$ is an $m \\times n$ matrix, then:\n",
|
||
"\n",
|
||
"$M \\cdot I_n = I_m \\cdot M = M$\n",
|
||
"\n",
|
||
"This is generally written more concisely (since the size of the identity matrices is unambiguous given the context):\n",
|
||
"\n",
|
||
"$MI = IM = M$\n",
|
||
"\n",
|
||
"For example:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 63,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[ 10., 20., 30.],\n",
|
||
" [ 40., 50., 60.]])"
|
||
]
|
||
},
|
||
"execution_count": 63,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"A.dot(np.eye(3))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 64,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[ 10., 20., 30.],\n",
|
||
" [ 40., 50., 60.]])"
|
||
]
|
||
},
|
||
"execution_count": 64,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"np.eye(2).dot(A)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"**Caution**: NumPy's `*` operator performs elementwise multiplication, *NOT* a dot product:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 65,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"scrolled": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[ 10, 40, 90],\n",
|
||
" [160, 250, 360]])"
|
||
]
|
||
},
|
||
"execution_count": 65,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"A * B # NOT a dot product"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"**The @ infix operator**\n",
|
||
"\n",
|
||
"Python 3.5 [introduced](https://docs.python.org/3/whatsnew/3.5.html#pep-465-a-dedicated-infix-operator-for-matrix-multiplication) the `@` infix operator for matrix multiplication, and NumPy 1.10 added support for it. If you are using Python 3.5+ and NumPy 1.10+, you can simply write `A @ D` instead of `A.dot(D)`, making your code much more readable (but less portable). This operator also works for vector dot products."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 66,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Python version: 2.7.11\n",
|
||
"Numpy version: 1.10.4\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"import sys\n",
|
||
"print(\"Python version: {}.{}.{}\".format(*sys.version_info))\n",
|
||
"print(\"Numpy version:\", np.version.version)\n",
|
||
"\n",
|
||
"# Uncomment the following line if your Python version is ≥3.5\n",
|
||
"# and your NumPy version is ≥1.10:\n",
|
||
"\n",
|
||
"#A @ D"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Note: `Q @ R` is actually equivalent to `Q.__matmul__(R)` which is implemented by NumPy as `np.matmul(Q, R)`, not as `Q.dot(R)`. The main difference is that `matmul` does not support scalar multiplication, while `dot` does, so you can write `Q.dot(3)`, which is equivalent to `Q * 3`, but you cannot write `Q @ 3` ([more details](http://stackoverflow.com/a/34142617/38626))."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Matrix transpose\n",
|
||
"The transpose of a matrix $M$ is a matrix noted $M^T$ such that the $i^{th}$ row in $M^T$ is equal to the $i^{th}$ column in $M$:\n",
|
||
"\n",
|
||
"$ A^T =\n",
|
||
"\\begin{bmatrix}\n",
|
||
" 10 & 20 & 30 \\\\\n",
|
||
" 40 & 50 & 60\n",
|
||
"\\end{bmatrix}^T =\n",
|
||
"\\begin{bmatrix}\n",
|
||
" 10 & 40 \\\\\n",
|
||
" 20 & 50 \\\\\n",
|
||
" 30 & 60\n",
|
||
"\\end{bmatrix}$\n",
|
||
"\n",
|
||
"In other words, ($A^T)_{i,j}$ = $A_{j,i}$\n",
|
||
"\n",
|
||
"Obviously, if $M$ is a $m \\times n$ matrix, then $M^T$ is a $n \\times m$ matrix.\n",
|
||
"\n",
|
||
"Note: there are a few other notations, such as $M^t$, $M′$, or ${^t}M$.\n",
|
||
"\n",
|
||
"In NumPy, a matrix's transpose can be obtained simply using the `T` attribute:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 67,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[10, 20, 30],\n",
|
||
" [40, 50, 60]])"
|
||
]
|
||
},
|
||
"execution_count": 67,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"A"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 68,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[10, 40],\n",
|
||
" [20, 50],\n",
|
||
" [30, 60]])"
|
||
]
|
||
},
|
||
"execution_count": 68,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"A.T"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"As you might expect, transposing a matrix twice returns the original matrix:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 69,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[10, 20, 30],\n",
|
||
" [40, 50, 60]])"
|
||
]
|
||
},
|
||
"execution_count": 69,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"A.T.T"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Transposition is distributive over addition of matrices, meaning that $(Q + R)^T = Q^T + R^T$. For example:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 70,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[11, 44],\n",
|
||
" [22, 55],\n",
|
||
" [33, 66]])"
|
||
]
|
||
},
|
||
"execution_count": 70,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"(A + B).T"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 71,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[11, 44],\n",
|
||
" [22, 55],\n",
|
||
" [33, 66]])"
|
||
]
|
||
},
|
||
"execution_count": 71,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"A.T + B.T"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Moreover, $(Q \\cdot R)^T = R^T \\cdot Q^T$. Note that the order is reversed. For example:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 72,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[ 930, 2010],\n",
|
||
" [1160, 2510],\n",
|
||
" [1320, 2910],\n",
|
||
" [1560, 3450]])"
|
||
]
|
||
},
|
||
"execution_count": 72,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"(A.dot(D)).T"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 73,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[ 930, 2010],\n",
|
||
" [1160, 2510],\n",
|
||
" [1320, 2910],\n",
|
||
" [1560, 3450]])"
|
||
]
|
||
},
|
||
"execution_count": 73,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"D.T.dot(A.T)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"A **symmetric matrix** $M$ is defined as a matrix that is equal to its transpose: $M^T = M$. This definition implies that it must be a square matrix whose elements are symmetric relative to the main diagonal, for example:\n",
|
||
"\n",
|
||
"\\begin{bmatrix}\n",
|
||
" 17 & 22 & 27 & 49 \\\\\n",
|
||
" 22 & 29 & 36 & 0 \\\\\n",
|
||
" 27 & 36 & 45 & 2 \\\\\n",
|
||
" 49 & 0 & 2 & 99\n",
|
||
"\\end{bmatrix}\n",
|
||
"\n",
|
||
"The product of a matrix by its transpose is always a symmetric matrix, for example:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 74,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[ 87, 279, 547],\n",
|
||
" [ 279, 940, 1860],\n",
|
||
" [ 547, 1860, 3700]])"
|
||
]
|
||
},
|
||
"execution_count": 74,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"D.dot(D.T)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"source": [
|
||
"## Converting 1D arrays to 2D arrays in NumPy\n",
|
||
"As we mentionned earlier, in NumPy (as opposed to Matlab, for example), 1D really means 1D: there is no such thing as a vertical 1D-array or a horizontal 1D-array. So you should not be surprised to see that transposing a 1D array does not do anything:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 75,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([2, 5])"
|
||
]
|
||
},
|
||
"execution_count": 75,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"u"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 76,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([2, 5])"
|
||
]
|
||
},
|
||
"execution_count": 76,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"u.T"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We want to convert $\\textbf{u}$ into a row vector before transposing it. There are a few ways to do this:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 77,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[2, 5]])"
|
||
]
|
||
},
|
||
"execution_count": 77,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"u_row = np.array([u])\n",
|
||
"u_row"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Notice the extra square brackets: this is a 2D array with just one row (ie. a 1x2 matrix). In other words it really is a **row vector**."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 78,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[2, 5]])"
|
||
]
|
||
},
|
||
"execution_count": 78,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"u[np.newaxis, :]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"This quite explicit: we are asking for a new vertical axis, keeping the existing data as the horizontal axis."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 79,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[2, 5]])"
|
||
]
|
||
},
|
||
"execution_count": 79,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"u[np.newaxis]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"This is equivalent, but a little less explicit."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 80,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[2, 5]])"
|
||
]
|
||
},
|
||
"execution_count": 80,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"u[None]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"This is the shortest version, but you probably want to avoid it because it is unclear. The reason it works is that `np.newaxis` is actually equal to `None`, so this is equivalent to the previous version.\n",
|
||
"\n",
|
||
"Ok, now let's transpose our row vector:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 81,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[2],\n",
|
||
" [5]])"
|
||
]
|
||
},
|
||
"execution_count": 81,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"u_row.T"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Great! We now have a nice **column vector**.\n",
|
||
"\n",
|
||
"Rather than creating a row vector then transposing it, it is also possible to convert a 1D array directly into a column vector:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 82,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[2],\n",
|
||
" [5]])"
|
||
]
|
||
},
|
||
"execution_count": 82,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"u[:, np.newaxis]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Plotting a matrix\n",
|
||
"We have already seen that vectors can been represented as points or arrows in N-dimensional space. Is there a good graphical representation of matrices? Well you can simply see a matrix as a list of vectors, so plotting a matrix results in many points or arrows. For example, let's create a $2 \\times 4$ matrix `P` and plot it as points:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 83,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\nABSCQAeAQvw/B1t9ETAG6CIAAAAASUVORK5CYII=\n",
|
||
"text/plain": [
|
||
"<matplotlib.figure.Figure at 0x105492790>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"P = np.array([\n",
|
||
" [3.0, 4.0, 1.0, 4.6],\n",
|
||
" [0.2, 3.5, 2.0, 0.5]\n",
|
||
" ])\n",
|
||
"x_coords_P, y_coords_P = P\n",
|
||
"plt.scatter(x_coords_P, y_coords_P)\n",
|
||
"plt.axis([0, 5, 0, 4])\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Of course we could also have stored the same 4 vectors as row vectors instead of column vectors, resulting in a $4 \\times 2$ matrix (the transpose of $P$, in fact). It is really an arbitrary choice.\n",
|
||
"\n",
|
||
"Since the vectors are ordered, you can see the matrix as a path and represent it with connected dots:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 84,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\nAABJRU5ErkJggg==\n",
|
||
"text/plain": [
|
||
"<matplotlib.figure.Figure at 0x10502f390>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"plt.plot(x_coords_P, y_coords_P, \"bo\")\n",
|
||
"plt.plot(x_coords_P, y_coords_P, \"b--\")\n",
|
||
"plt.axis([0, 5, 0, 4])\n",
|
||
"plt.grid()\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Or you can represent it as a polygon: matplotlib's `Polygon` class expects an $n \\times 2$ NumPy array, not a $2 \\times n$ array, so we just need to give it $P^T$:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 85,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\nZmZ3MjJ+AqwDGpwO8xsyMuYwfvytiCTD1MzkZikXYyJg586dzJ+/gGefLeOf/6ygrm5MYI57P5yd\n426l/onAcujGOGTr1q2Ulpbx3HNlVFenUls7NjDH/XwHonmRPn2msGnTWgfObSLFcuguZ/nBoERr\ni969ezNp0hN89tlHrFkzj7vvriIn5yqys/NJSZkEfHqcn/ZENJZ4LvVPtPdFLFiHbkyUiAj9+/fn\n6af/xBdf7GLp0inccsvHdOrUj+zs7wJ/BvZHMYIK6upWM3r06Ciew7iJpVyMibHDhw+zatUqZs0q\nY8WKV0hP7x+Y434DEMl7rFipf6KwHLoxcaCmpoZly5Yxc2YZ69atJj39ysAiHaOAju06dnb25cyb\n9yCjRo2KSKzGOZZDdznLDwYlc1t07NiRm266iZUrF7N//y7uuSePgQNnk5HRnY4dbwFeBg634cjx\nX+qfzO+LtrIO3RiX6Ny5M8OGDWP9+lfZtetDJk36LhddNImMjFPJzLwLWAMcCelYqalzGTt2DOnp\n6VGN2biLpVyMcbldu3ZRVraQZ58tY8+efRw5cjOHDxcCA2h+jruV+icay6Ebk4C8Xi9z5y7gr38t\n46uv6vH5xlJfPxZovNzvm3TvXsTu3V6rDk0QlkN3OcsPBllbBLXWFnl5eTzxxGPs3u1l3brnmTDh\nMF26jCAr60JSUv4L+DhhSv3tfRG+UBaJniUi+0XkvePs85SIbBeRchHJj2yIxpimRIS+ffvy5JO/\n5/PPP2XFimkUFe2lQ4e++HxTOXDgC/bu3et0mCbGWk25iMggoAooVdWLm3l9ODBRVUeKyKXAk6p6\nWQvHspSLMVH0/PPPc/PNN9Ohw200NCzhwgv7MG5cIaNH30iXLl2cDs+0UcRSLqr6OvDlcXa5FigN\n7LsB6Cwi3UIN1BgTOTNnlgEzqa0twef7jHffnch9962ke/deDB78b8ybN4+qqiqnwzRREokcei7f\nXIBxT+A5cxyWHwyytghqT1tUVFSwbt1q4GipfyZwA9XVz+Pz7WbdurHcffd8unbNZeTIMbz00kv4\nfL4IRB0d9r4IX1qsT1hUVPT1bTxzcnLIz8+noKAACP4CbTu5to9ySzxObpeXl7f55x9//AmgD8Hb\nB3gC3wuAbOA0qqoeAJ5j+fK/8dprj9HQ8GOuu+4m7ryzkJSUFFJTU13THuXl5Y6e38ltj8dDSUkJ\n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\nRU5ErkJggg==\n",
|
||
"text/plain": [
|
||
"<matplotlib.figure.Figure at 0x1057458d0>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"from matplotlib.patches import Polygon\n",
|
||
"plt.gca().add_artist(Polygon(P.T))\n",
|
||
"plt.axis([0, 5, 0, 4])\n",
|
||
"plt.grid()\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Geometric applications of matrix operations\n",
|
||
"We saw earlier that vector addition results in a geometric translation, vector multiplication by a scalar results in rescaling (zooming in or out, centered on the origin), and vector dot product results in projecting a vector onto another vector, rescaling and measuring the resulting coordinate.\n",
|
||
"\n",
|
||
"Similarly, matrix operations have very useful geometric applications."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### Addition = multiple geometric translations\n",
|
||
"First, adding two matrices together is equivalent to adding all their vectors together. For example, let's create a $2 \\times 4$ matrix $H$ and add it to $P$, and look at the result:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 86,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\n",
|
||
"text/plain": [
|
||
"<matplotlib.figure.Figure at 0x1058b3410>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"H = np.array([\n",
|
||
" [ 0.5, -0.2, 0.2, -0.1],\n",
|
||
" [ 0.4, 0.4, 1.5, 0.6]\n",
|
||
" ])\n",
|
||
"P_moved = P + H\n",
|
||
"\n",
|
||
"plt.gca().add_artist(Polygon(P.T, alpha=0.2))\n",
|
||
"plt.gca().add_artist(Polygon(P_moved.T, alpha=0.3, color=\"r\"))\n",
|
||
"for vector, origin in zip(H.T, P.T):\n",
|
||
" plot_vector2d(vector, origin=origin)\n",
|
||
"\n",
|
||
"plt.text(2.2, 1.8, \"$P$\", color=\"b\", fontsize=18)\n",
|
||
"plt.text(2.0, 3.2, \"$P+H$\", color=\"r\", fontsize=18)\n",
|
||
"plt.text(2.5, 0.5, \"$H_{*,1}$\", color=\"k\", fontsize=18)\n",
|
||
"plt.text(4.1, 3.5, \"$H_{*,2}$\", color=\"k\", fontsize=18)\n",
|
||
"plt.text(0.4, 2.6, \"$H_{*,3}$\", color=\"k\", fontsize=18)\n",
|
||
"plt.text(4.4, 0.2, \"$H_{*,4}$\", color=\"k\", fontsize=18)\n",
|
||
"\n",
|
||
"plt.axis([0, 5, 0, 4])\n",
|
||
"plt.grid()\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"If we add a matrix full of identical vectors, we get a simple geometric translation:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 87,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\nLgc/c+ziTaeLAAAAAElFTkSuQmCC\n",
|
||
"text/plain": [
|
||
"<matplotlib.figure.Figure at 0x10587ce50>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"H2 = np.array([\n",
|
||
" [-0.5, -0.5, -0.5, -0.5],\n",
|
||
" [ 0.4, 0.4, 0.4, 0.4]\n",
|
||
" ])\n",
|
||
"P_translated = P + H2\n",
|
||
"\n",
|
||
"plt.gca().add_artist(Polygon(P.T, alpha=0.2))\n",
|
||
"plt.gca().add_artist(Polygon(P_translated.T, alpha=0.3, color=\"r\"))\n",
|
||
"for vector, origin in zip(H2.T, P.T):\n",
|
||
" plot_vector2d(vector, origin=origin)\n",
|
||
"\n",
|
||
"plt.axis([0, 5, 0, 4])\n",
|
||
"plt.grid()\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Although matrices can only be added together if they have the same size, NumPy allows adding a row vector or a column vector to a matrix: this is called *broadcasting* and is explained in further details in the [NumPy tutorial](tools_numpy.ipynb). We could have obtained the same result as above with:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 88,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[ 2.5, 3.5, 0.5, 4.1],\n",
|
||
" [ 0.6, 3.9, 2.4, 0.9]])"
|
||
]
|
||
},
|
||
"execution_count": 88,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"P + [[-0.5], [0.4]] # same as P + H2, thanks to NumPy broadcasting"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### Scalar multiplication\n",
|
||
"Multiplying a matrix by a scalar results in all its vectors being multiplied by that scalar, so unsurprisingly, the geometric result is a rescaling of the entire figure. For example, let's rescale our polygon by a factor of 60% (zooming out, centered on the origin):"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 89,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\nRU5ErkJggg==\n",
|
||
"text/plain": [
|
||
"<matplotlib.figure.Figure at 0x105809f90>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"def plot_transformation(P_before, P_after, text_before, text_after, axis = [0, 5, 0, 4], arrows=False):\n",
|
||
" if arrows:\n",
|
||
" for vector_before, vector_after in zip(P_before.T, P_after.T):\n",
|
||
" plot_vector2d(vector_before, color=\"blue\", linestyle=\"--\")\n",
|
||
" plot_vector2d(vector_after, color=\"red\", linestyle=\"-\")\n",
|
||
" plt.gca().add_artist(Polygon(P_before.T, alpha=0.2))\n",
|
||
" plt.gca().add_artist(Polygon(P_after.T, alpha=0.3, color=\"r\"))\n",
|
||
" plt.text(P_before[0].mean(), P_before[1].mean(), text_before, fontsize=18, color=\"blue\")\n",
|
||
" plt.text(P_after[0].mean(), P_after[1].mean(), text_after, fontsize=18, color=\"red\")\n",
|
||
" plt.axis(axis)\n",
|
||
" plt.grid()\n",
|
||
"\n",
|
||
"P_rescaled = 0.60 * P\n",
|
||
"plot_transformation(P, P_rescaled, \"$P$\", \"$0.6 × P$\", arrows=True)\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### Dot product – Projection onto an axis\n",
|
||
"The dot product is more complex to visualize, but it is also the most powerful tool in the box.\n",
|
||
"\n",
|
||
"Let's start simple, by defining a $1 \\times 2$ matrix $U = \\begin{bmatrix} 1 & 0 \\end{bmatrix}$. This row vector is just the horizontal unit vector."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 90,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"U = np.array([[1, 0]])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Now let's look at the dot product $P \\cdot U$:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 91,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[ 3. , 4. , 1. , 4.6]])"
|
||
]
|
||
},
|
||
"execution_count": 91,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"U.dot(P)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"These are the horizontal coordinates of the vectors in $P$. In other words, we just projected $P$ onto the horizontal axis:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 92,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\nq1ocHZ4AAAAASUVORK5CYII=\n",
|
||
"text/plain": [
|
||
"<matplotlib.figure.Figure at 0x1054add90>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"def plot_projection(U, P):\n",
|
||
" U_P = U.dot(P)\n",
|
||
" \n",
|
||
" axis_end = 100 * U\n",
|
||
" plot_vector2d(axis_end[0], color=\"black\")\n",
|
||
"\n",
|
||
" plt.gca().add_artist(Polygon(P.T, alpha=0.2))\n",
|
||
" for vector, proj_coordinate in zip(P.T, U_P.T):\n",
|
||
" proj_point = proj_coordinate * U\n",
|
||
" plt.plot(proj_point[0][0], proj_point[0][1], \"ro\")\n",
|
||
" plt.plot([vector[0], proj_point[0][0]], [vector[1], proj_point[0][1]], \"r--\")\n",
|
||
"\n",
|
||
" plt.axis([0, 5, 0, 4])\n",
|
||
" plt.grid()\n",
|
||
" plt.show()\n",
|
||
"\n",
|
||
"plot_projection(U, P)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We can actually project on any other axis by just replacing $U$ with any other unit vector. For example, let's project on the axis that is at a 30° angle above the horizontal axis:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 93,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\n",
|
||
"text/plain": [
|
||
"<matplotlib.figure.Figure at 0x1059ec750>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"angle30 = 30 * np.pi / 180 # angle in radians\n",
|
||
"U_30 = np.array([[np.cos(angle30), np.sin(angle30)]])\n",
|
||
"\n",
|
||
"plot_projection(U_30, P)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Good! Remember that the dot product of a unit vector and a matrix basically performs a projection on an axis and gives us the coordinates of the resulting points on that axis."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### Dot product – Rotation\n",
|
||
"Now let's create a $2 \\times 2$ matrix $V$ containing two unit vectors that make 30° and 120° angles with the horizontal axis:\n",
|
||
"\n",
|
||
"$V = \\begin{bmatrix} \\cos(30°) & \\sin(30°) \\\\ \\cos(120°) & \\sin(120°) \\end{bmatrix}$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 94,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[ 0.8660254, 0.5 ],\n",
|
||
" [-0.5 , 0.8660254]])"
|
||
]
|
||
},
|
||
"execution_count": 94,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"angle120 = 120 * np.pi / 180\n",
|
||
"V = np.array([\n",
|
||
" [np.cos(angle30), np.sin(angle30)],\n",
|
||
" [np.cos(angle120), np.sin(angle120)]\n",
|
||
" ])\n",
|
||
"V"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Let's look at the dot product $V \\cdot P$:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 95,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[ 2.69807621, 5.21410162, 1.8660254 , 4.23371686],\n",
|
||
" [-1.32679492, 1.03108891, 1.23205081, -1.8669873 ]])"
|
||
]
|
||
},
|
||
"execution_count": 95,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"V.dot(P)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The first row is equal to $V_{1,*} \\cdot P$, which is the coordinates of the projection of $P$ onto the 30° axis, as we have seen above. The second row is $V_{2,*} \\cdot P$, which is the coordinates of the projection of $P$ onto the 120° axis. So basically we obtained the coordinates of $P$ after rotating the horizontal and vertical axes by 30° (or equivalently after rotating the polygon by -30° around the origin)! Let's plot $V \\cdot P$ to see this:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 96,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXMAAAEACAYAAABBDJb9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJztnXd4G2XW9u/HRe7dcUlxnEJ6LySEAHZIIASW3mFZAwtk\nKUsL9V06+0KANwRCWXYXyEdJwi5lqQmBJEpoyaaZOM0JKW5xi0ssN8mSnu+PY0WyLNmyNJJm7PO7\nLl32aEajo5HmzJn7Oec8QkoJhmEYRtuEBNsAhmEYxnfYmTMMw/QC2JkzDMP0AtiZMwzD9ALYmTMM\nw/QC2JkzDMP0AhRz5kKIECHEDiHEF0rtk2EYhvEMJSPzuwHsVXB/DMMwjIco4syFEAMBLADwTyX2\nxzAMw/QMpSLzlwE8AIDLSRmGYYKAz85cCHE+gEopZT4A0f5gGIZhAojwtTeLEOJ/AVwPwAwgCkAc\ngE+llDc4bcdRO8MwjBdIKbsNkn2OzKWUj0ops6SUQwFcDWC9syN32Fb1jyeeeCLoNrCdbCPbyXba\nHp7CeeZOHD16NNgmeATbqRxasBFgO5VGK3Z6SpiSO5NSbgSwUcl9MgzDMN3DkbkTeXl5wTbBI9hO\n5dCCjQDbqTRasdNTfB4A9fiNhJCBei+GYZjeghACMhADoL0NvV4fbBM8gu1UDi3YCLCdSqMVOz2F\nnTnDMEwvgGUWhmEYFcMyC8MwTB+CnbkTWtHR2E7l0IKNANupNFqx01PYmTMMw/QCWDNnGIZRMayZ\nMwzD9CHYmTuhFR2N7VQOLdgIsJ1KoxU7PYWdOcMwTC+ANXOGYRgVw5o5wzAB59ChtmCb0GdhZ+6E\nVnQ0tlM5tGAjoG47GxubsHTpYQwfvguPPvp5sM3xCDUfT29QtJ85wzB9Bykldu+ux5tvVuLzz804\ndqwfBg5swJlnRgXbtD4Ja+YMw3hMYSHw979bEBFxHGvXVmH7dh2AdAAJ0OkMeP/9Mlx55ehgm9mr\n8FQz58icYZguqa8HVq4Eli0z4fDhKpjNNbBY4gAMBRADAIiMBK64og5nnpkcVFv7MqyZO6EVHY3t\nVA4t2AgEx86PPwZSU5tw332HsW/fPhiNgMUyGo6OHADS0iSuuqoeyclJfDyDBDtzhmE6IaVEXV0d\nUlP344YbjqC1NRbAOAADAeg6bHvxxcCzzzYgIyMCOp3O1e6YAMCaOcMwJ7FYLKiuPo5Dh6rQ0KBD\nVFQ6YmMTsHKlwJIlnbcfOBBYtQpoaDiKqVOjkZaWFnijezmsmTMM4zEmkwnl5VU4dKgGRmMc4uKG\nIi3NLqOMGQOkpQFVVR1f9/jjgE5nhRD1SEoaEGCrGUdYZnFCKzoa26kcWrAR8I+dTU1N2L//MDZs\n2If9+4Ho6NFISxuKqChy5FYrsHUrOe2rr6aBThtXXglMmQI0NTUgIyMa4eHhfrPTH2jFTk/hyJxh\n+hhSStTX1+Pw4UpUVZkRHp6GpKTBCA0N7bCdwQA89hjQ1EQDoTodMGECcOedQEwM/QWAlpY6jB2b\nFIRPwjjCmjnD9BHc6eFCdJZjDxwAHngAmDULuO8+oD3oBgBs3w4UFAB5eYDVakVd3S7MmTMOYWEc\nG/oDTzVzduYM08vprIenn5RRXPHll8DSpcCiRcB553W974aGOqSkHMeECacobDVjgxtteYlWdDS2\nUzm0YCPQczu708OdMZuBJ54AnnoKeOut7h05ALS21qJ//44SS289nmqH74sYphfhqR7uTE0N8PDD\nJKd8/z2QmNj9e1ksFoSGGpCYOFgh6xlf8FlmEUJEANgEqiTQAfhcSvmoi+1YZmEYP9ETPdyZ/Hxy\n5BddBNx6K9CN3z/JiRO1SEurxbhxw320numKgOWZSymNQohcKWWzECIUwE9CiNOllD/5um+GYbqm\nu/zwrrBagdWrgZdfBp58Epg9u2fvbTTWIjOTs1jUgiKauZSyuf3fiPZ91imx32CgFR2N7VQOLdgI\ndLSzp3q4MwYDZamUlADLl/fckVssFoSFNSLRhR6jxePZG1BEMxdChADYDmAYgL9JKfcqsV+GYezY\n+qX0VA93xjHt8OabO6YdeorBUI8BA+J6/N6M/1A0NVEIEQ9gLYCHpJQbndaxZs4wXuCLHu5MT9IO\nu6Kq6iBmzkxFUhLLLP4mKL1ZpJQNQoivAUwDsNF5fV5eHrKzswEAiYmJmDRpEnJycgDYb3l4mZd5\nmZbb2towYsRoHDpUg61b9yA6OgmzZpEH3raNtp82Lcej5S1b9HjuOQDIwVtvAfX1emzb5vnrHZfN\nZjP27t2IiIihmDNnjmqOV29Z1uv1WL58OQCc9JeeoEQ2SyqANinlCSFEFIBvATwlpVzntJ0mInO9\nXn/yAKsZtlM51GZjU1MTSkoqUVRkAJCChIQ0hIfrsG2b/qRz7Qm2tMO6OsofT0nxzb66umoMGGDA\n6NFDXa5X2/F0h1bsDGRkngng/wm65wsB8L6zI2cYpmu8zQ/vDm/TDruira0OmZnc6lZtcDk/wwQR\nJfVwR6QEPvyQMlW8STt0h9nchsbGPcjNnYCQEC4gDwTcz5xhVIwv+eHdYTDQnJ1FReTMBw5UZLcA\nqBdLVlYCO3IVwt+IE7aBCLXDdipHIG30JT/cNgjZFQcOANdfT/r4U08p68gBwGyuQ0ZG15M2a+E7\nB7Rjp6dwZM4wfsZfergzSqUduqOtzYTIyFbEx8crv3PGZ1gzZxg/4S893JnWVuCvfwV27wZeegkY\nNkzR3Z+ktrYSQ4a0YvhwbqwVSFgzZ5gg4U893JmaGuD++8mR6/VAbKxf3gYASSxpaf399waMT7Bm\n7oRWdDS2UzmUstHXfind4ayZ5+cD110HzJgBbNniX0duMhkRFWVEXFxct9tq4TsHtGOnp3BkzjA+\nECg9vON7+iftsCsMhjoMH56kuETEKAdr5gzjBYHSw50xGIBPPgHWrCF9XOlsFXdUVe3F7NmDPIrM\nGWVhzZxh/EAg9XBnbN0Or7mGovLIyIC8LYzGVsTEmBHrTx2H8RnWzJ3Qio7GdiqHJzb6Ww/vji+/\nBG65RY+FC4Grrw6cIwdIYsnK8lxi0cJ3DmjHTk/hyJxh3BAMPdwZkwl44QVg+3aaTMIf+ePdYbXW\nIjWV0xHVDmvmDONEsPRwZ2pqgHPPBaZNI308GCpHa2sLpPwNs2ePD/ybMwBYM2eYHhNMPdwZW7fD\nvDzgT39SptuhNzQ11WHUKJ6AQguwZu6EVnQ0tlM5Vq9eHVQ93BEpgQ8+oJL8v/wFuPNOuyP3pDeL\n0lgstUhN7boXizNa+M4B7djpKRyZM30SRz18164KhIdPDbge7ozZTA786FHlux16Q2trM+Ljgejo\n6OAawngEa+ZMn0ItergzBw4AS5YAc+cCF1wQ2GwVd1RXl2LsWIFBgwYE25Q+DWvmDOOAmvRwZ/zd\n7dBbpKxDaurwYJvBeAhr5k5oRUdjOz3Dk/zwYGjRAKUdPvss8M47NDdnd448kHa2tDQhMTEEUVFR\nPX5tsL9zT9GKnZ7CkTnT61BDfnh3lJcDV10FTJ8OvP9+cNIOu6KxsRYTJvRs4JMJLqyZM70Gterh\nzuTnA488AowdC7z4IqAy8wAAVVW7kJs7ApFqEO/7OKyZM30GNevhjkgJrFgBvPtu4LodekNzcyOS\nk8PYkWsM1syd0IqOxnYq1y8lEFp0czNF419+SWmH3jjyQGnmTU21yMryXmLh32Zw4Mic0RRa0MOd\nOXAAWLuW0g0D2e3QG6SUkLIOycmjgm0K00NYM2c0gVb0cGdsaYePPgqcfXawremexsYGxMSUYdq0\n0cE2hWmHNXOmV6AVPdwZx26Hb70FDNdIunZzcx1GjuQsFi3CmrkTWtHRerudgewfrrQWXVoK3Hwz\nUFdHaYdKOXJ/a+ZSSghRj+Rk3xpr9fbfplrhyJxRDVrUw53Jzwf++Efg2muBe+9VZ9qhO5qaGpCW\nFgmdThdsUxgvYM2cCTpa1cMdCcYky0pTVXUUU6dGIy0tLdimMA6wZs6oHq3q4c40NwNPP62ebofe\nYLVaIUQ9kpK4qZZW8VkzF0IMFEKsF0LsEUIUCCH+rIRhwUIrOpqW7Qz2fJrO+KJFGww0eYQt7dCf\njtyfmnlTUwMyMqIRHh7u8760/NvUMkpE5mYA90kp84UQsQC2CyHWSin3K7BvppfQG/RwZ778Enj9\ndUo9HDlSW/q4My0tdRg7lmcU0jKKa+ZCiP8AWCalXOf0PGvmfZDeoIc745h2+OKL2kk7dIfVakVd\n3S7MmTMOYWGsvKqNoGjmQohsAJMAbFFyv4z2sFqB//63Ck1Nx2AyxWtWD3emooL6jqenq7PboTc0\nNp5ARkYMO3KNo9i31y6xfAzgbillo6tt8vLykJ2dDQBITEzEpEmTkJOTA8CuXwV72facWuxxt7x0\n6VJVHj/b8quv6nHvvfVYurQGI0bMwubNaxEdHY8ZM6gM0qb/TpuWE/RlRy26q+1pNqAc3HknMG6c\nHvv3B9bewsJ8XHfdPYrvv7W1FkeO7EVtbZki37/zueTr/vy1nJ+fj3vuuUc19tiW9Xo9li9fDgAn\n/aUnKCKzCCHCAHwFYLWU8hU322hCZtHr9ScPsJpRs50bNtDUZ0OHAq++ugFTp05FeXkNSkpOoK0t\nDlFRKaqSWrZt0590cq5wTDtctAiYPz9gpnWgOzu9wWKxoL6+AGefPV6x8Qs1/zYd0YqdnsosSjnz\n9wAcl1Le18U2mnDmjG+sWgXccAPQ1kaFMx9+aF9nsVhQV1eHkpIaVFa2AkhGXFwKIiPVO2GwY9rh\nSy9pM+2wK06cqEVaWi3GjdO48N+LCZhmLoQ4HcB1AAqEEDsBSACPSinX+LpvRju0tABvvEGRKwDo\ndMCUKR23CQ0NRWpqKlJTU2E0GlFTU4sjRw6jqkogNDQFCQkpCAvzPTVOKYqLgfvuA8aNU3+3Q28x\nGmvRvz/3YukN+JxnLqX8SUoZKqWcJKWcLKWcomVHrpXcUzXZuWIFkJVld+QAOb4xY9zbGRERgf79\nM3H66eNwxhmDMXSoEY2Ne1BVdRAnTtTCarUGxni4zt/+8ktg5UrguuuAJ55QhyNXOs/cYrEgLKwR\nCQkJiu5XTb/NrtCKnZ7Cw9eM10gJLF5MMkRLS8d1oaHA6NEkT3RHbGwshg+PxdChg1BfX4+yshoc\nO1YMKZMQE5OC6OjApYz0hrTDX3+lC9Evv5DclZMDhIUBZjNQWQlERwMLFwIDBtRjwIA4Tef6M3a4\nNwvjFVYrcPvtlJ7X3Nx5/QsvUKTu7RhnW1sbampqUVRUg9paK0JCkhEfnwKdLsI3w7vAMe3wqae0\nn3Z40UXAqFF0wXVk2TLgo4+A118/gksuSURSEhcLqRlPNXNugcv0GCmBiy9278gBklh8SVYJDw9H\nRkY6ZswYg7POGoqRIy1obd2PqqpC1Ncfh8Vi8X7nLvjPf4Df/x6YO5cGOrXuyMvLgWPHOo9bAMC0\naYDRKLFtm05xiYUJHuzMndCKjhZMO4WgtMP4ePfbjG6fqEYJO6Ojo5GdPQg5ORNw2mnpyMw8gfr6\nAlRVHUFjYwN8ueOTEnjuOT2efRa4804gL0+9Zfk90cz/+1/6HFOndl535Aity84OR0iI8i6Az6Hg\nwM6c8YqlS4GiIuC994BTTum4LjISGDxY+fcUQiAxMRFjxgzDnDnjMHVqDGJiylBdXYDjx8tgNLb2\naH+2SZZ/+YUi84suUt7mYLFtGxAX51rz//prICOjDTfcwH3LexOsmTM+YTCQM4+JocG1piZg/Hhg\n167A2dDa2orq6hocOVKDpqZwhIWlID4+ucvy9KNHSR8fNw54+GF1ZKsoyYIFJHW99JL9ucZG4P/+\nDzh40IrHH9+Hq64a7ZfInFGWgBYNeQI7897JaacBFguwZQuwaRNltmRkdCwWChRSShgMhm6rTTdv\nprzxefOASy9Vr6ziLUVFwOWXk8QyfjxJSc3NNGh92mnA+PFVGDy4GSNGZAfbVMYDeHIKL9FKia8a\n7CwsBA4eBPbsIYd41lnAunXkPGwE0k4hBOLj4xEfH4/hw23VppWorCwCkIyIiBS8+mo0tm8H/vEP\nIDWVXuePMnl/4KmdW7fS90E9ZDqvr6qqQ3p6hvIGtqOG36YnaMVOT2FnznjNokXAgw9SKp8jaoh0\nnatNd+2qxe9/fxiJiQKvvJKCxMQUAOqpNlWSrVtJ9ho7tvO6tjYTIiNbEd/V6DWjSVhmYbxi/Xqa\ngX7/fiDCf6nfirB2LaUd3ncfcPvtjaisrEFRUR1MphhERKQgLi6xV2nH8+YBkyZR0ZMztbWVGDKk\nFcOH+2GEmvELLLMwfsNioZnnFy9WtyOXEliyhO4g1q8HcnMBIBZxceqoNvUHhYVAfT0wfbrr9WZz\nHdLS+gfWKCYg9J5wRCG0knsaTDsLCijP/Iorut82WHY2NgJXXUWpk4cO2Ry5nZCQECQnJ2P8+FMQ\nGnocEydGIDy8CFVVu3H8+DGYTMag2N0VXeWZHzpEaZaPPEIy15o1HTNZAMBkMiIqyoi4uDi/2snn\nUHDgyJzpEa2tlCnxzTfq0MZdUVhIFaozZlDmSlRU19uHhYUhMzMDmZkZaG5uRlVVDY4c2Y/6+kjo\ndCmIi0tSff+SYcOA557rehuDoQ7Dhyeppo88oyysmTM9YvFi4McfqaugGvnpJ3Lkzz4L3Hqr9xcc\nKSVOnDiBY8dqUFpqgMWSgOjoFMTExGnWGVZV7cXs2YP8HpkzysKaOaM41dXUQOvnn4NtSWeMRuCu\nu6hL4PffAxMn+rY/W7VpYmIiRowwo7a2FsXFZaiubkNISAri4lIQEaGdSiOjsRUxMWbEar3pDOMW\n1syd0IqOFgw7H3uMZg8aOdLz1wTCzuJi4PTTgaoq4JVXeu7Iu7MxLCwMaWlpmDZtNHJzR2DMGMBs\nPoCqqn2ora2C2Wz23vge4Es/c4OhDllZgZFY+BwKDhyZMx6xYQO1Tf3tt2Bb0hHHtMMHH/S/jh8Z\nGYlBgwZg4MD+DtWmx1Q5t6kjVmst+vXLDrYZjB9hzZzpFimpC+LMmVQGrwakBK6+GvjqK3o4Z6sE\nErXPbdra2gIpf8Ps2eODbQrjBayZM4rx2Wc0U83bbwfbEqKxEbjpJmojsGEDcOqpwbVH7XObNjXV\nYdQonoCit8OauRNa0dECZafJBDzwABXfeJOdp7SdhYVUEBMdTW1elXDkStroz7lNvdXMLZZapKYG\nbtJmPoeCA0fmTJcsW0Ytbs85J9iWAP/+N01V52vaYaBwN7ep1ZqE2NjAVJu2tjYjPp4m+GB6N6yZ\nM26pqyNHvmkT9cYOFkYj8MQTJK/k5dG0Z1qlra0Nx4/XoKioBnV10u9zm1ZXl2LsWIFBgwb4Zf+M\n/+F+5ozPvPUW9V7JywueDcXF1HN84EAqze9Nzf7s1aa1aG31T7VpVVUBcnKGI6q7MlhGtbAz9xKt\n9Dj2t51FRTQZ8K+/kiP1Fl/s9Dnt0GqlUdJNm4DVq2nyywcfJME9IoIeOh30e/ciZ9ask8sIC+v4\nCA/vuKxwab+n1aY97bve0tKE0NCjOO00F71w/QifQ8rC2SyMTzz4IOnTvjhyb5ESuPtu0shXrepB\n2qHJRKOiGzeS896+HQgJAcxm0mquvZZaPjY0kENvaKDloiJy4lZrx5k1APsVxPF5IWh7hwvCyf8j\nI+1/nS8CzsthYUBIiN+qTRsbazFhQuAGPpngwpE504nNm0naOHAACHT1ty3t8N//BkpLgQFdSb0G\nA83GvGEDtQncu5ecaGsrOXYbkZHAGWeQg6+tBT75BEhJ8X7iTynpIuDqYbXa/3fE8bbC8TwICXF7\nUTBKidoWI0qrm9FkjERoRCpiElIRGhEJGRoGGRbe/jcMCA3rdOtSVbULubkjENnbJjjtY3BkzniF\nlMA99wDPPBN4R+7Y7bC5uZtuh2vWAL/7HUXYTU125+noxAGKhocPB/7zH5JH+vUD5s+nSqP+/Wl9\nTxHCHln7iqPzb2sDWlpOXhQiLBZkWizIsFjQajTiRL0BtXVGWK2RCA+PQUREFPlvCQCSnHt4BKzh\nEWiVVgyJOoHIyBq6SERG0sOVjOR81xAaqv5UIaYTHJk7oRUdzV92PvMM8PjjpEwoIQ17ameP0w7L\ny6ks9cQJ99sIAWRmAvn55MQd2bWLtPRBg6Dfswc549VfHakvKMAZY8agqakJ1dUNqK9vAxCLqKh4\nyoaxWiDaLwSG+koMHiiQFB/X8c7BWS5yxHGd7S7BWU6yXRRcyUjtFwX9zz8jZ84cv4wvKIlWzvWA\nRuZCiLcBXACgUko5QYl9MoGnsRF4801gy5bAnYNGI/D556TRr17dg7TDzEzgX/+iUL6lxfU28fHk\nsJ0dOUDT1jc0kFPXEKGhoScnrW5ra0NDgwGVlRU4cUIgJCQO0dFxCAkLhyXSitj+A72785DSfsdg\nNtOdj218wVFOcndhKCykcQgp6YcUHq7Y+ALjHkUicyHEbACNAN5z58y1Epn3ZR57jBpprVwZmPez\npR1Omwa8/HL3k0h0wmh0r3tHR3df62+xUMpMSQldHDRMS0sL6uoMqK5uRGOjREKCxJgxQ4M/t6nV\n2lFKcje+ICVdEFzdLdj8Rmio+4uCTkc/oIgI1zLSI49QX4r+/YHsbGDECGDIEGDQIPsjKUmV8lLA\nUxOFEIMBfMnOXJuUllLr2J07gaws/7+fz2mHTz9NlUQAkJBAtxU23TwqitJgLryw+/0YjcAXX1D0\nmZLSQyPUh9VqxW+/HUF1tURsbAj69YtFUlJc78gz9+SiYLHYf0yOP6r336eZSxwJD7ffgra10d/E\nRCAtjU6CkSOpp3KQ8dSZ832LE1rp16C0nQ8/TFq10o7c2U6rlXT5P/yB/O1DD/XQkf/8M73giSeA\nK6+kHRYUUCQO0N+XXvLMkQNARAT0MTH0f0NDDwwJPPqCgm63EUKgtTUEKSmDERmZhcrKcOzdW429\ne4tw/HgN2mxOK8h2ekVICDngyEggJoZktKQkuginpdHd1cCBlAI1YABF4bbHjBmd7uL0bW2U+dTa\nar8Q1NQA+/YB334LfPwxXeQ1QkCzWfLy8pCdnQ0ASExMxKRJk04OQNhO+mAv21CLPe6W8/PzFdtf\nVRVQXKzHtdcCgLL22tDr9WhpAe66Kwfl5cDy5fp2J+7h/r76Crj0UuS0OyP9f/4DJCQgRwgaxHzo\nIeAvf0HO7bcDt9/eM3ujo6FPTAQ2bULOzJlAVNRJh2QbGFXDcv7hw91uP33oULS1haPg2H4AwIzh\n4wEk4cd9O2DcV4xp2QORmBiO/dWliIyKwtntM3mo4fP5bdlqhb6kBGhtbf+1AXoA+UCHZQDIiYgA\nEhOhnz8fuOYa5LRf6AN5fuv1eixv7zVt85eewDILg3PPpZnsb7rJf+/hmHb4xhv2QLpbpCTDbI3U\n160D5sxxvW1REd1aeKt7FhVRymJmpncDhyqgrKwSVVURiItLdLleSonW1iaYTAaEhLSgX78YJCeT\nDKPGSTV6TEUFDXpv2kSDMp4SEUFR/oUX0m3jjBmqycQJRp65aH8wGmLNGuDQIeD66/33Hv/+N/Cn\nPwF//WsPux1+9hmNkAIkrC9e3PX2gwf7ZCcGDwbOOgvQ62lALNiDhz3EarXi+PEmREe71/6FEIiK\nikVUVCwsFguqqw2orKxBRIQZ6enxSEiIg06nC6DVXtLcTNVtGzfSQI8rMjPp+zzzTJJdHnusc/ZS\nZCTp5NdeCwwdSoHC6NH+t98PKJWauAJ0x5IihCgG8ISU8l0l9h1otJJ7qoSdZjMNQL7wAiUDKI2U\nwA036LFpUw7WrOlB2mFJiV28z8oiDdOPLVw7HMuxY0k737mTHLqKolV9QUGX+fDNzc0wmyMQGurZ\naR0aGtoewSfCZDKipKQRxcVliI8PQ79+cYiLi/Oq6Vd3dvYIiwXYvZsi7Y0bOxeFAfTjPesseowd\n6z6injSJqoTNZhoriYpCzsKFlNlisQDnn6/prCZFnLmU8lol9sMEln/+E0hNBS65RPl9FxfTtG5T\np1KLlNRUD15kNgNz59JJC1CXrwkBLlsQgm6xGxroQ2jo5K6vb0JoqHdluzpdBHS6CEiZDKOxBYcO\nGRASUouUlCgkJ8chJibGvzKMlEBZmd1pl5e73m7yZHLaM2f2/AI/ejT9xlJTSbqLiwPS0yn76bzz\nKCtKw3AFaB+lqIjSbbdvp+6ISuJV2uHrrwN33kn/v/YacMcdyhrVU0wmSllsaHBddKQyrFYrdu06\niqiowYq10LVaLWhpaYLZ3IDw8DakpcciKTEeERE+9l639dTZuJEykVyRlUXyyJlnAhkZvr2fDSmB\no0ft4yplZXQSzJnjfZ+eAMAtcJkuuf124McflS2AtFpJF3/jDWDFCg+7HRYU2KPvnBzgu++U6Xmi\nBI2NwKef0m27yhupNzY2orCwAQkJ/f2yf7O5Dc3NBkhpQEyMQFpaHOLj4xDW1XdlNtPd1caNFHG7\nmjIvOtoukYwaFZhxirY24Ngxum089VTVDHS6gxtteUlf0MwLC4GPPgL271fOnsZGmpUoO5u60Nq6\nHbq1s7mZTt6SElouLiaNOgi4tTE2lnTUjz+mC0yQp17rSouurTUgLMx/ndHCwsIRH58MgGSYI0cM\nAIqRnByJ1JRYxNTUIOSHH4CNG6Gvrj6Z8teB6dPJaZ96avAi4aYm6px59tnQV1YiR+WOvCewM++D\nLFpE8odS6oEt7TA7m4KwbgdTH37Ynpny2Wf0YrWSkkJ66pdfqjZl0WKxoKamBTExaf5/s8ZGRPya\nj4jtO2A9ehgNsKIWrQiDAf3QgiRY6TjNnw/Mnq0uiaq2lqLySy4hGysrg22RorDM0sdYvx64+WZK\nEFEiOLKlHT77LHDbbd3o4xs22HPE8/KAd95RVbZIl+zdSznugwap7rbcYDDgwAGDshKLuQ3YXwjs\n2A7ku0n9i4kFpkwFpkyBZUB/NLc0wmo1ICpKIj2dZJhwtVz8KipowFODA50sszCdkJIi8uef992R\nm820r0903Y0QAAAgAElEQVQ+oW6H06d3sfHx4/YILTKSMhUSXRe1qJYxY6jd7o4dqktZJIklzrsX\nSwmUldLn2r4dMLhpaTBhIo2Ujxrt8tYrFEBcXBKAJJhMRhw92gCgFImJ4ejXLx4xMTGKzm3qMRYL\n6eMaGOj0FXbmTvRmzfzzz+kO88orfXvv4mLg//0/SgzoMu1QSuhzc5FjSzX86Sdg1izf3twPeHws\nZ8ygTIwjR6jfR4BxpZlbLBbU1rYiJia9+x2cOEG93XdsB0rcVEdmZQNTpwATJ3k96Luz+ABmDB8P\nKVPR3NyEgwcNCAk5Hvhq024GOrVyrnsKO/M+QmsrzSD07ru+BZW2tMNFiyjRwy0rV6K92Qvw1FM0\n44XWCQmhjJvGRqC6WhV6cFNTE6zWKISEODgqk4lkoR07gN1u0pXiEynSnjKFRqv94FyDWm1qG+ic\nO5cG2vsArJn3EZ5/ngLjL7/07vUepx0ePgwMG0b/jxlDDsXXvGS10dREVzIhgqu/Wq04svEXGH4p\nRvSuPUBzo+vtJpOujZEjVZH2aTIZ0draCCkbfK42dYltoFPjFZ02OM+cOUlVFRW//fILVS73lPJy\n4I9/pHPk44/dTLLc1kYSyrZttLx/PzmP3ortYCQkBCZlsbraXh159CgAwAJgF+IRg1TqZT10GA1I\nTpxAg5MqR0oJo7EFRqMBISFNylSbanig0x3szL1EKzpaT+y87TYKjl99tefvU1hIPVWGD6fp5Fze\nFb/0EvDAA/T/2293aL+ohePptY1lZTRRdEaGcs1tWlqA//6XnLbtwmizE+0tW9PTgTPPxIkpU/Bb\nSzISEtUVfW75raC99a7n+Fxt6sVApxZ+mwBnszDtbNkC/P3v1HO/p9jSDl980U3a4bZt9jSW88+n\n8neNdRr0iQEDyHGsW0eTIvREJrBYKD/UVh3pah7T0FB7deSECaSDOwyA1hwug87qZRaLitDrAas1\nFDt3xmPgwHgMGtSGlFQDUlMqkJDgQbWpyUS3jxqp6PQXHJn3YqSk1hbXX0/O2FMc0w4//thF2qHB\nQBFQbS0tl5cr1z9Di2zZQhc2dymL5eV2iaS01PU+JkygwdWZM6nytBvMZjN27SpGbFw2QoS2L6Af\nfghs225f1oXTYaSeWC247joD4uMbqdo0lWSYk3Ob2gY658zptQOdHJkz+OwzoK6O9G5PqaykGdkO\nHXKRdiglNcN64w1aXr2aKv36OtOn0wVu927SszdupBRAVwwYYO+x7UN6Y2NjI6SM0bwjB4Dk5I7L\nJoeZ7SqrorDk5SjExiQhPb0OiYmVsFpDcMcd/ZEe3tyxorOPw87cCa3oaN3ZaTKRjP3mm57fddrS\nDv/xD1JNOrxu9WpgwQL6/447gGXLPEpn08Lx7LGNZjNpAytW0MNo7LxNZKRdIhk9WpFbf8c885qa\nRkREJPm8T3/QlWZuNtN1r6HB3jbebO6wBQBTp0djk4CxWIfi4gRMn65D2PFaIDuBWkF4OdCphd9m\nT2Bn3ktZtowaX51zTvfbOqYdrlrllHZYXm6PIFNTKfUwTvs6rUdISVk5K1eS0z50yPV2551HOfVz\n5wLff0+v82OFa1tbG+rr2xAfH9zGXzakpOtZQwPVU+2rAixVVKNkc9rTp9PEQL/9RnMxx8WZERNj\nwqFDJlisjo5bANC1PyIAxCFCp0NCQiguvhiYk2NBTH3fqOjsKayZ90IMBuB//gdYuJBSvbuivp40\n9Zoap7RDqxW44AKKyAHShKdO9avdQaWmhgYJVqywT47hzPjx5LSvvpqciStqa2k/8fF+S1msq6vH\n4cMmJCT4t7GWVdLvo6WZis5sjvnECSol2L+fxnANBto+Lg6oqQXi44CRo4DEBHLa0dEmpKeboNOZ\nEBFBTjs8XCAmRoeYGB3eeEOHnfk2B053MEmJFIiMH0+p8WPGAKKtbw50smbeh3n2Weow250jLyyk\nMaPbb6camJPZde+8Q924AEplWbTIr/YGFJOJomebROIqwEhOJqd97bVUwt+TDJ3kZNKo/vMf8kJ+\nqHAkiSW5+w3dYJVAcxM5ZpvkkZJC3YgLC+3PNTUBlvYW5NmDyVnHxdFNR3w8cMYZ9IiPB8LCzDCb\nTWhrM8HqEGk7Ou2oqAiE6yjSdiwQGjIE2Nk+xDBxAt3ozJjhVN/UBys6ewo7cye0oqO5s7OoiKaD\n627SCVva4SuvAHfd1S5/799vn8z21FNp9gofu94F7XhKSRNf2Jy2rW+6MxddBP3Eich56CHlIun+\n/YGzz6aJNnqastgF+oICnD5qFE6caEN8fFSn9Y56dFQU9Tc7eLCj066som2jo8gxx8fTY9w4MjU5\n2f5cXFznglGLxYy2to5O22g0wWolp52aqsO2o4cxZ+LETk7bHdnZQGgIVSm79NO1tfThFB7o1Mq5\n7inszHsZDz5I45MuqzRB58RDD5GkcnKSZaORJru1zVZx6BDNVK4VKivp6rRiBZW5umLqVIq0r7yS\nvJYjer3yksjIkeRBt2zxqcuilJSCbjZTcePXhxpx5EgsWlsFDAagYDdtFxNNUkhMDDniqVPblZ4Y\nurbYnHNUFGU+dneNtjntlhbXkXZqqvtIO7a6AtFRnS827sjNJU3dZUamraLTh4HOvgJr5r2IzZuB\nyy4DDhygk9qZ2loKbnQ6GtNLTQU1wXrySdpg5UrSg9VKaytdgVasIOftiowMctrXXEMeLZitaq1W\n6uF+8KDLq2tDAxUt1tUBtXVAbQ2weQtQWkJtF+rraZ0QFOgPGQL8/HMxYmL6ISUlCgkJtC46mgLW\n6BggpIcf11Wk3Vke0SFcp/M40lYEW0XnkCHk7fvwQCeX8/cxLBa6JXaqpj/J2rW07owzSF4J3fwT\nzQQDkANfsUI9PbqlpCR3m0TibkaYK64gxz1/vipOdilpcLCigsbpysuBXza1IWrD1xjVrwbFLWkn\nHfSIESRt6PVAUhI9kpMpAg8NpRulpCQgKZkkEQAwmUwoKChDfHx2j3uXqNZpu4IrOjvAA6BeohUd\nzdnO5cvpLvQPf+i4Xaduh5PqgOgMOmEAauDktiG58nZ2orSUJiRduZIcuCtOO42c9hVXUF+SANto\nsdBhKi+nuqCdOynQLimhJmYVFcDgweScn3qKbg4yMshUgyEcrQnn4JwRn2FifB3iBiUhKYluLDZv\nBiZPpoHqUaMooSYmxv3XsXrrVgyMHNGlI+/OaXcljyhFV3OVdksABzq1cq57CjvzXkBjI/DYY8C3\n33YMYurqqAiopgbYtlViwGM3AXOW08oNG6h8PFA0NwNffUVXlM8/d71NVpZdIhk/3u93Ci0tVLD5\nww/0f3k53dmXlZFMO3kycO+9dPwSE8lBNzTQ5Bx33EHS++TJJHFkZ1Mzsvvvd/VO0UDdAkpZjG2C\nNSoGa9YAEsDuPfatEuLJjshIGoe2OfqsLPpeT9S34JQhlOOvBqetOH4a6OwrsMzSC/jLX6gYY9Uq\n+3Pffw9cdRX5xZfP+gzhV15KKx56iNIG/IXVSiGnTSKpq+u8TUiI3WnPnato+p5N6qivt0sdFRU0\nxjtxIvD007RcUUGO03aDMncuOevMTHLSw4cDp59OF8q0NIXmcS4vpx4LaWm44voItLooHHUkQkeH\n6pxzgPh4EzIyihETEwnVyiO+0Atb1yoFa+Z9hJIS0ld37qQIDqBMlVtuAe6+tARPvtP+ZHY2sGeP\nslkbR4/SFWTFCkoDdEVODjnuSy+lZGYvsTlpm3M2GEh3fvllu3OurKTUTIAcsqPcMWoUcN11dAgy\nM+mRlOR78C8lKQOlpfTexcV0iBMSKLoeNoyCTZOJlKTN7x+EbuO3KMVAWNG94w1vv3fOygIWLmxA\n1uBwbTttZ2wDnUOH0m9FBWMfaoM1cy/Rio5ms3PxYnLcWVn2tMPP/m1G8dC5iHunvZKxoIAEXW8x\nGEgaWbHCXhHqzLBh5C2vvpo8Z7uX9ESPrqqinOi0NOBf/yKZ49gxctAHD9I1IzKSomObgx4yhKpc\nx40D5s2zO+j0dEq/c1fn4+ru3WZjcTEVzfz0E0kvNuc8fjxN1PO731EEb+P554HnnnPuLULMn0/f\nS2YmSSTR0bSPlJRT0DazAZte2IyjchCofL0joSH0WWNjaT9z5tAMdfqCIoyK8lKLDiAea+ZBHujU\nyrnuKezMNczevSRFL15MUemVVwJXVL6GwyV3ASUAXn+dyjs9xWIhL2aTSJqaOm8TGUnyyLXXUiTl\npsd0SwspLtu3091DRQX9LSujatOJE+m5mhrK4hgwwB7g9+9PTQVtztlkou2d0y2NRuo40NREzjsq\nquM269aRqvHBBxTVOzJoEHD33ZTZYzTScfz6a7qY6PUdt83IoLufIUM63tg88ghJXOHhnkX4kyfT\nAxdOxg/fNGBAwX6UwZ7zPmY0Oe7sbPJrw4apJ8FIcbiiU3EUkVmEEPMBLAUQAuBtKeViF9uwzKIw\n8+eTnjpxIvDD67vw5GcTaUVuLlUfdhXpHDxobyBVWOh6m3POIafdXrBhtXbUoW0Dhk8+SRcSR7mj\ntZXaudx5Jznk9HRyoJmZdBG69FKSIiwWirx//dUeCaelkUQxYQKlUtoc2vvv06RGBw92NnXUKKpk\nzcuj7aUk6X7HDtq+ooLuXrKyaL8jRtD7uMrHDwTXXN6Gpk++wbi045gwNw05uUCG8ok66sQ20Llg\nAQ90ekDANHMhRAiAAwDOBnAMwFYAV0sp9zttx85cQb79loLuG69qxk2LR6K/tX3Sg5KSjhWO9fUU\nCq9YQaGqC5pGTkHFgptQPuNilIcMwBtvUOdWm9O2PT79lNqOpKeTI0xLIwe9di1w330U4R46BGzd\nSgOwjpx5JiUp3Hqr3Tm/8w455/YpLU8SH09O+YILSEKxUVVFfkAIcsLp6QoNTAaB5cuBd15vwfq7\nPkMYzCTg9wUqKugLnj+fBzo9JJDOfCaAJ6SU57UvPwxAOkfnWnHmWtDRLBZgyBA9njF+jT9UvURP\nfvwxZQO0SySyrQ21SEY5MvENFmAoDuOYbghKRs1DcfJEFDWn4eprBB5+mPaXlETOcdgwksfvv5+k\n8s2bXfd50ekobe/xx+3OeeNG6i9VUEBzM2RlAbGxelxwQQ5mz6YMkcGDA3ecPCWo33l9PaUsRkd3\nO8OQT/nb3fHaa3QrVVdHOs+0aZTXasNsplSgX38lAX/OHLpr88TOffvoR7VjB/3YLr6Y5Lq2Ngo+\nYmOBZ55xMaWVf9HCuQ4EdgB0AEihtVEK4FQF9su44bX5X+CpkrswAKfgA1yHY+iP0svLcBeW4Xp8\ngGN4BpXIgE4nMSArDAd+C8F555FMuWmTfT9b/mv/f+ZMioSvv54mfw4NpYh5zx5Kz2tqIkeclUX6\ntqukmPnzO088pNcHNp1dcyQm0u3OZ5/RbYanExgrzZ13UquEv/0NuOceGiBwJCyMBhneeotG2Xsy\nWDlsGI2zHD1KBWD/+lfH9Q8/TD+SggJt9QRSGQEdAM3Ly0N2ex/oxMRETJo06eSVUd8+6sTL3S/P\n+f5R1KAYx2DC9yG/x/6QsdhtLscy/ANCzMCsWcBl0/QYMQK4/Xb76y0WIDc3ByEh7vcfHd1x+fzz\nOy6fckrwP7/Syzk5OcG1JyMD+vh44IcfaDksDPr2VE9bhKt3Sv10t96X5aSWFkyUEigvh76xsdP6\nUz7/HAPuuw8IDe1yfznjx9uXhw4Famrwi8mEmeXlEK4+f24u5Asv4NCSJRj+2mv+P94OyyePp4p+\nj3q9HsuXLweAk/7SE5SSWZ6UUs5vX9a0zKIJmpvplnTvXvtz998PvPBCz3pvM+pixw7q+jhwYHC+\nx/JymtEkL48GOBzZsMHejtFTampIVlmwgFJab7mF9DdnqWjpUvr9vvcepbcyHfBUZlHiF7MVwHAh\nxGAhhA7A1QC+UGC/QcH5iq1KoqOhf/11Stl4+ml67v/+j259k5JIG1EJWjieqrFx8mRg7FhKEXKB\nc3SuOGlpdBGpqOj4fF0djWx76Mj1BQW0j6go4PLLKWNl/Xr6bbrS/N97j6SYyy5T4EN4jmq+d4Xw\n2ZlLKS0A7gSwFsAeAKuklPt83S/jIY89Zu8yCNCA2rhxNCp57700yMRoAyGok+XAgZ0daiAIDaUq\nXef37klrZIuFclMHDerYg1yvpzxTRxoagBtvpAvIunVc/ekjXM7f2zhxAjj3XJoUwUZoKI18zpoV\nPLsYz2ltpQFRk4kqqgLJX/5CLSLfeouW9XqKsGfM6P61jhWdjtPtHThAhQA5OTTSLiWNqlssNGJ+\n4YX++jS9Ai7n76skJFA+oZRUzfP003TSnH46rb/+ejpR/TTZMKMAkZGkM3/yCTm9blIWFSUjg8Zi\npCR5pbAQuO0219v++is1x7n/fspCcVfRuW4d3XU8/zyV7TN+gUfLnNCKjtatnUJQc20pqcLIxgcf\nUMWNEMA33/jVRkAbx1OVNiYkUMpifT1VYyEAmjlAxQZWK1VorVjhNpccAEXiRiNF8k1NVNY7alTn\n47l+PQ2eBjiPvDtU+b37ADvzvsA555BTLy6mghAb559PTv2881y3qmWCS3o6fXcVFa67efmDjAz6\nrXz0EXUGi4tzv+306RSZz5xJE4dkZLjebuNGajHRaxvNqAPWzPsiJhPdOrfnsnbgvfdIiuETTz3s\n3EmtHAcN8n/K4sGDwKJFJMs9+KD77SwW6po2bBg5anfFTvn5dFFYtoxm9GB6TCBTExmtodMB775L\nEdi773Zcd8MN5DCmT6eTlQk+kyZRdzA3KYuKkplJGS0LF7rfxmSiBu5TptCdgytHvmcPZcBceSUF\nBh9+SBWkjN9gZ+6EVnQ0xezMyyOn/uuvHaO+bdsoRU4IupX28q5KC8dT9TYKAcyaBX19vf9TFmNj\nqQNafLzr9Y2NlHo4bx6V5ru4U9Dr9ZQvv2oVZbJYLMDPPwOvvOJf23uI6r/3HsLOnCEmTKCT7sQJ\naqJkIzSUWiKGhJDefuBA0Ezs04SFUcpffDxVVgaDmhqqPr70UmDkyODYwLiFNXPGNVICzz5LbRFd\n8eijlPbYW6Yv0woNDZSyGBHR9eCk0tha1553nvuonfELPAcooxzr1nWcLy0tjVLXAEpz1OupZSoT\nGKqqyKGnpvq/atLTgU7Gb/AAqJdoRUcLqJ1nn02RemkpndQ2Rz5uHOUXT59Ouu6tt1L1YrDs9BIt\n2Ag42JmWRpWTlZX+TVn0ZKCzKztVjlbs9BR25oznDBgA/PYbneQ33wzs3k3P22Yr/sc/qPRbiM5T\nDTHKMmQITd9UVkZFPkrjwUAnoy5YZmF84/33KZ3Rxj33UEtTG5dcQvnsrLMqj5TAjz/SpA6DBim3\n35oaukAsWOC+EIgJGKyZM4Fl925q4Wq77b/5Zirz/sKhG/JHH1HeMaMcFgu1aygrU8bxlpdTKwEe\n6FQNrJl7iVZ0NNXZOW4ctdttaKBb87ffBr74AvrBg+3ThF11FUkwZ5xBt/AqQXXH0g0u7QwNpTGN\nhATfUhYtFmr3kJVFrWt9cOSaPp4ahp05oyxxccDatXSb/te/AkVF9mh87VqabebHHymKFAJ4802v\nC5KYdiIiKJKWki6mPcVkoomVp03r0UAnoy5YZmH8z4YNHQuRFi+mNLfcXMqGAagIZfXqzhMJM55T\nXQ18+in1QPc0ZbGxkZqszZ0LjBjhX/sYr2CZhVEPubkUNZaVkcN46CHqa33mmdTi9dFHqW/20KEU\nrT/9tH8yNHo7/fpRymJVlWczTNXUAC0tVNHJjlzzsDN3Qis6mibt7N+fnHZbG3VtXL0aSEwEliyh\nCRH276eWAU88QVpwaiqwa1dgbVQxHtk5eDBdJI8dc39BlJIGOm1zdCqcsdKrjqeGYGfOBJ6wMOBv\nfyOn8sEHVGg0ZgzNUPO//0tOaMkSihwnTqRo/c9/Jm2X6Z5x4yizyFXXS4uF9HEFBjoZdcGaOaMO\n9u6lRlK2CtLbbgNee42yXi6+mLo42ti4kaJPxj0WC/Ddd5ShkplJz5lMFLGfeipV7XIhkCZgzZzR\nFmPGkH5rMJDu+9ZbQHg4pd198QVF6++9R9uedRZF69dcQwN4TGdCQ2msIjkZOH7cXtF57rkdJ1tm\neg38jTqhFR2t19oZG0tautUKPPccaez9+5PzGTSIpJmaGnL4q1ZRKqQQHYuT/G1jkOixnRERdJws\nFkpZDNBAZ689niqHnTmjToQAHn6YnLftpLPNI/m3v9Fk1FICX31F6y66iNbNmxe8ft9qwzbva0MD\nReqxscG2iPEjrJkz2qGigmSXvXtped48agUbF0eTJixcSL1ibLzzDs2k1BfnM7VYgF9+oflDBwyg\nFNC4OLro6XTBto7pAdybhem9mM00n+Qbb9ByeDg5rbFjafnnn2mA1GKh5UmTSIZRshmVmmltpR70\nRUXkyG36+LFjlLo4bx5PKqIheADUS7Sio/VpO8PCgNdfJxlh1SrKWx83zj5x8KxZ5PBNJuDee2mG\n+KwsWv/ii53aB/SqY1lfD3z2GTnuQYM6DnRmZgKHDwObN/u1hUKvOp4agp05o22uuooc0759NOvR\n9deT077lFlq/ZAmtLygA0tOBBx8kBzdwIL2mN1FaCnz8MV3cXBUCCUGR+s6dwJ49gbeP8SssszC9\ni6YmcvBff03Lw4YBmzZRRgxAWTKLF1MLARsPPEDFSmFhgbdXCaSkcQS9nqpmo6O73r6tjSpAL7iA\nZBdG1QREZhFCXC6E2C2EsAghpviyL4ZRhJgYynCxWklSOXSIolEhgPXrKSp/5BFygEePkjzz4ouk\nu0dEkAShJSwW4Kef6LNlZnbvyAH6rP36UQpodbX/bWQCgq8ySwGASwBsVMAWVaAVHY3t7AYhgEWL\nyGn/8AM9d/bZ9Pyzz9LzgwcDBQXQr18P/P3vpLGfdhptc+ONVMSkIjody9ZWYM0a6l+TlUVO2lOi\noii75euvqVDLn3aqFK3Y6Sk+OXMpZaGU8iCAPpj7xWiG2bPJeVdUUCT+2GMUoc+dSznYNo1dSuo4\nmJtLU91FR9O6b78N9ifoTFcDnZ4SH0+fec0awGhU3kYmoCiimQshNgC4X0q5o4ttWDNn1IHFQlku\ny5bRckgIZbyMH99xu08/BS67zL58wQWUx56YGDhbXVFaSg5YpwOSknzfX3k5DQifey6nLKoQxTRz\nIcR3QohdDo+C9r+/U8ZUhgkwoaHAq69SVPqvf5G+PmECReG2/i8Alb/bZu+54grS4pOSaLuVKwNv\nt5SUhfL55ySRKOHIAdLajx6l/HwOuDRLQCPzP/zhD8jOzgYAJCYmYtKkScjJyQFg16+CvWx7Ti32\nuFteunSpKo+fFo+nXq+ntrALFyKnuZnWz58P3H8/cubO7bg9AOTmwvbpcmbOBD79FPrCQv/au24d\n8j//HPeMGAH07w/9/v20vv1uQl9Q4Nvyr78CVVXIuflmYOJE34+n7fio4Pt1t5yfn4977rlHNfbY\nlvV6PZYvXw4AyM7OxlNPPRW4CtB2Z75ISrm9i200IbPo9fqTB1jNsJ3K0cHG5mbqxmhr3DVkCKU2\nDhzY8UVGI3DfffYqVICi/TvvVL59QHtFp/6775CTm+u/jodtbaTBn3++T9P3aeE7B7RjZ0DK+YUQ\nFwNYBiAVQD2AfCnleW621YQzZxgAJDcsXUoO28batVQK78zOnTRoeuIELQ8bRpr28OG+21FfTymE\njY2KzwjkktZWapl72WVAWpr/34/pFu7NwjBK8fPPwOmn25effBJ4/PHOEbjFQo2sbAVLAGXO2KbB\n6ylKD3R6isFAdx6XXcYzEakA7s3iJY56n5phO5WjWxtnzbKnLU6cSM48JATIybFH4wA5wY0baV1S\nEuV+P/MMVZYmJAA73A4pdcTNQKdN5/Y7th7xq1fbZ37qAVr4zgHt2Okp7MwZxlP69aMURrMZuOce\nctyJieT4fv2VInCzmbJj6uqA2lrqXvjqq5QRM3UqbfunP7nP67ZVdG7Y4HlFpz9ISaEL1bp19u6T\njKphmYVhfME5F92ZqCiaAu/3v6d87ssuoz7jNtavJ70dcN+6NpiUlFD+/ezZfbMvvApgzZxhAklu\nLmW9WK2d10VHAw89RPq5zSGuXAlce619mwsvpIfVGpiBTk+xWsmhz55NfeGZgMOauZdoRUdjO5XD\nZxu3bQO2bHHtyAFKd1y8mGY9MpvpuWuuIW28rs4+afUf/wjceisNuLqyM1CauSMhIXSX8OOP1LTM\nA7TwnQPasdNT2JkzjK/86U/dN+VqbqZe43PnUpohQM68tBS45BKaZOPJJ+n555+nKP3RRzsOsAaL\nsDC6W1i7FqisDLY1jBtYZmEYX1m4EPj+e2rkZTSSTi4EFeE4O/mICCrI+f574MgRGlDt379jx0Oj\nkXT277+3P3fHHcA55wRXt25spM9z+eWcshhAWDNnmGDQ2AgUF9MgZlERSRP799N0beXlFGlbrZTi\neNVV5NhjYtzvr7CQIvS2NlrOyqIc92AV9NTU0AXpkkuAyMjg2NDHYGfuJVop8WU7lSOgNppMJK0Y\nDOTU9+0jBy8E5aLHxLiOvi0W6JcsQY6tNztAU+Rdfnngs14qKkh2Oe88l7MzaeE7B7Rjp6fOXKPz\nZDGMRtHpgKFD7cuTJ5MzLy2lKLysjJ6PjSUpw+aoQ0OB+fNpiruSEorOP/iAHgkJNOFGoKaAy8gg\ne3/8ETjrLE5ZVAkcmTOMmmhqIjnm4EGSa6xW0uATEjpHwVLSBBXtHfYA0MBpXp7/5zO1pSzOmgVM\n4Rkj/QnLLAyjdYxGyh45dAj47TdKawwPp/J+na7jttXVFJ0fOULLQgDPPQeMGeM/+8xmupOYP1+Z\npmKMSzjP3Eu0knvKdiqHam2MiKABz9xc4MYboU9LA8aOJb29tJQieFu2TL9+wCuvUD+XP/+ZovaH\nHwpxy00AAAfzSURBVKZIfckS/0wLZ0tZ/O470tHbUe3xdEIrdnoKa+YMowXCwqhfymmnATNmUN+X\nkhIaQLXp7LYB1Llz7fObvvQSoNfTA6Aq1OnTlbMrIoL603z9NQ3GJiQot2+mR7DMwjBax3EA1VbU\n4zyAumUL8Ne/2l8zeTKwaBF1SFSCujq64FxyCWn8jGKwZs4wfZHuBlBbW4HXXqM+MjbuuYekHF+z\nUiorKf99wQL/D8D2IVgz9xKt6Ghsp3JowUbAQztjYmgw8rzzKKvl/PMpZfH4cYreGxpIU//iCxog\nBWhGpYsuAu69l4qCvCU9HSgrg942WbbK0cr37il8+WSY3optADUrCzjjDMp4OXIEOHCAIvTkZOCj\njyiKfvdd4KuvgBtvpNfedBM5+J5G6wMGUBvfHTuofzsTMFhmYZi+htVKEXhJCbUacKxAraqiQVKD\ngbZNTQWefrrzhNZdYbHQXcC55wKnnOKfz9CHYM2cYRjPqK+njJjCQnLmUpJcs2YN9V23cdll1EKg\nq/lMS0vpDmDMGNrXxRdTIzHGa1gz9xKt6Ghsp3JowUbAj3YmJlL++qWX0oxI8+ZRRH7WWcCbbwIv\nvkgO+ZNPKFvl8stpgNUZKYFnnoH+qaeAFStov998QxcLFaKV791TWDNnGMaObQB1+PCOFahPPkkV\nnz//TP1g7r+ftp83D7jtNqpI3bqV8t+tVso7/+034Pbb6f9LLgnefKZ9BJZZGIbpHrOZ5JPDhykq\nr6oC/vEPctg2YmIoNdJGWBjp8HffDUyYQCmLjn3bGY9gzZxhGP/gOIC6bx+wYQPw9tvut4+IoOyY\nyy8HcnLUMVG1hmDN3Eu0oqOxncqhBRsBFdkZEkK9YKZMAa67jjT1IUNOrtY7b280Av/8J223bVsg\nLe0S1RxPhWBnzjCMb2zeTLJLV7S1Uf55Xh6wc2dAzOprsMzCMIxvnH8+OeqQkO4ntrbp6F98Qb3Q\nmW5hzZxhmMBQVETySXU1Zb+UllLeekUFaet1dTQ3ang45ai3tND8oZWVPDG0BwREMxdCvCCE2CeE\nyBdCfCKE0Pw3oxUdje1UDi3YCKjYzsGDqaBo4ULgiSegv+46yi/fsYMcfUMDZcMcOwZs304Dph9+\nGHRHrtrj6SW+auZrAYyVUk4CcBDAI76bFFzy8/ODbYJHsJ3KoQUbAY3bGRJC/dhHj6aMlksvDbhd\nzmjleHqKT85cSvm9lNLavrgZQA8aOKiTepVWqznDdiqHFmwE2E6l0YqdnqJkNstNAFYruD+GYRjG\nQ7ot5xdCfAcg3fEpABLA/0gpv2zf5n8AtEkpV/jFygBy9OjRYJvgEWyncmjBRoDtVBqt2OkpPmez\nCCHyANwCYI6U0u2ssUIITmVhGIbxAk+yWXxqtCWEmA/gAQBnduXIPTWGYRiG8Q6fInMhxEEAOgC2\nuaY2SylvV8IwhmEYxnMCVjTEMAzD+I+A9mbRSpGREOJyIcRuIYRFCDEl2PY4IoSYL4TYL4Q4IIR4\nKNj2uEII8bYQolIIsSvYtnSFEGKgEGK9EGKPEKJACPHnYNvkCiFEhBBiixBiZ7ut/xtsm9whhAgR\nQuwQQnwRbFu6QghxVAjxa/sx/W+w7XGFECJBCPHvdp+5Rwgxo6vtA91oSytFRgUALgGwMdiGOCKE\nCAHwGoBzAYwFcI0QYlRwrXLJuyAb1Y4ZwH1SyrEATgNwhxqPZ/t4VK6UcjKACQDmCCFOD7JZ7rgb\nwN5gG+EBVgA5UsrJUspTg22MG14B8I2UcjSAiQD2dbVxQJ25VoqMpJSFUsqDoDRMNXEqgINSyiIp\nZRuAVQAuCrJNnZBS/gigLth2dIeUskJKmd/+fyPoZBkQXKtcI6Vsbv83AnTequ74CiEGAlgA4J/B\ntsUDBFTcNbZdtThDSvkuAEgpzVLKhq5eE8wPw0VGPWcAgBKH5VKo1PloDSFENoBJALYE1xLXtMsX\nOwFUANBLKdUY/b4Mym7TwkCcBPCdEGKrEOKWYBvjgiEAjgsh3m2Xrf4uhIjq6gWKO3MhxHdCiF0O\nj4L2v79z2CboRUae2Mn0DYQQsQA+BnB3e4SuOqSU1naZZSCAM4UQZwXbJkeEEOcDqGy/0xFQ312t\nM6dLKaeA7iTuEELMDrZBToQBmALg9XY7mwE83N0LFEVKOa+r9e1FRgsAzFH6vXtCd3aqlDIAWQ7L\nA9ufY7xECBEGcuTvSyk/D7Y93SGlbBBCfA1gGtQ1pnM6gAuFEAsARAGIE0K8J6W8Ich2uURKWd7+\nt1oI8RlIwvwxuFZ1oBRAiZTSNjXTxwC6THgIdDaLrcjowu6KjFSEmiKMrQCGCyEGCyF0AK4GoNas\nAS1EZwDwDoC9UspXgm2IO4QQqUKIhPb/owDMA6Cqln9SykellFlSyqGg3+V6tTpyIUR0+90YhBAx\nAM4BsDu4VnVESlkJoEQIMaL9qbPRzcByoDXzZQBiQVrVDiHEGwF+f48QQlwshCgBMBPAV0IIVWj7\nUkoLgDtBWUF7AKySUnY5wh0MhBArAPwMYIQQolgIcWOwbXJFe0bIdaDskJ3tv8n5wbbLBZkANrRr\n5psBfCGlXBdkm7RMOoAfHY7nl1LKtUG2yRV/BvChECIflM3SZUoqFw0xDMP0AlSbmsMwDMN4Djtz\nhmGYXgA7c4ZhmF4AO3OGYZheADtzhmGYXgA7c4ZhmF4AO3OGYZheADtzhmGYXsD/B9GZ8XZFUbj5\nAAAAAElFTkSuQmCC\n",
|
||
"text/plain": [
|
||
"<matplotlib.figure.Figure at 0x105083210>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"P_rotated = V.dot(P)\n",
|
||
"plot_transformation(P, P_rotated, \"$P$\", \"$V \\cdot P$\", [-2, 6, -2, 4], arrows=True)\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Matrix $V$ is called a **rotation matrix**."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### Dot product – Other linear transformations\n",
|
||
"More generally, any linear transformation $f$ that maps n-dimensional vectors to m-dimensional vectors can be represented as an $m \\times n$ matrix. For example, say $\\textbf{u}$ is a 3-dimensional vector:\n",
|
||
"\n",
|
||
"$\\textbf{u} = \\begin{pmatrix} x \\\\ y \\\\ z \\end{pmatrix}$\n",
|
||
"\n",
|
||
"and $f$ is defined as:\n",
|
||
"\n",
|
||
"$f(\\textbf{u}) = \\begin{pmatrix}\n",
|
||
"ax + by + cz \\\\\n",
|
||
"dx + ey + fz\n",
|
||
"\\end{pmatrix}$\n",
|
||
"\n",
|
||
"This transormation $f$ maps 3-dimensional vectors to 2-dimensional vectors in a linear way (ie. the resulting coordinates only involve sums of multiples of the original coordinates). We can represent this transformation as matrix $F$:\n",
|
||
"\n",
|
||
"$F = \\begin{bmatrix}\n",
|
||
"a & b & c \\\\\n",
|
||
"d & e & f\n",
|
||
"\\end{bmatrix}$\n",
|
||
"\n",
|
||
"Now, to compute $f(\\textbf{u})$ we can simply do a dot product:\n",
|
||
"\n",
|
||
"$f(\\textbf{u}) = F \\cdot \\textbf{u}$\n",
|
||
"\n",
|
||
"If we have a matric $G = \\begin{bmatrix}\\textbf{u}_1 & \\textbf{u}_2 & \\cdots & \\textbf{u}_q \\end{bmatrix}$, where each $\\textbf{u}_i$ is a 3-dimensional column vector, then $F \\cdot G$ results in the linear transformation of all vectors $\\textbf{u}_i$ as defined by the matrix $F$:\n",
|
||
"\n",
|
||
"$F \\cdot G = \\begin{bmatrix}f(\\textbf{u}_1) & f(\\textbf{u}_2) & \\cdots & f(\\textbf{u}_q) \\end{bmatrix}$\n",
|
||
"\n",
|
||
"To summarize, the matrix on the left hand side of a dot product specifies what linear transormation to apply to the right hand side vectors. We have already shown that this can be used to perform projections and rotations, but any other linear transformation is possible. For example, here is a transformation known as a *shear mapping*:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 97,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"scrolled": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\nTAAAAABJRU5ErkJggg==\n",
|
||
"text/plain": [
|
||
"<matplotlib.figure.Figure at 0x10550f3d0>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"F_shear = np.array([\n",
|
||
" [1, 1.5],\n",
|
||
" [0, 1]\n",
|
||
" ])\n",
|
||
"plot_transformation(P, F_shear.dot(P), \"$P$\", \"$F_{shear} \\cdot P$\",\n",
|
||
" axis=[0, 10, 0, 7])\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Let's look at how this transformation affects the **unit square**: "
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 98,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\n",
|
||
"text/plain": [
|
||
"<matplotlib.figure.Figure at 0x105166f90>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"Square = np.array([\n",
|
||
" [0, 0, 1, 1],\n",
|
||
" [0, 1, 1, 0]\n",
|
||
" ])\n",
|
||
"plot_transformation(Square, F_shear.dot(Square), \"$Square$\", \"$F_{shear} \\cdot Square$\",\n",
|
||
" axis=[0, 2.6, 0, 1.8])\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Now let's look at a **squeeze mapping**:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 99,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\n",
|
||
"text/plain": [
|
||
"<matplotlib.figure.Figure at 0x105a4ac10>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"F_squeeze = np.array([\n",
|
||
" [1.4, 0],\n",
|
||
" [0, 1/1.4]\n",
|
||
" ])\n",
|
||
"plot_transformation(P, F_squeeze.dot(P), \"$P$\", \"$F_{squeeze} \\cdot P$\",\n",
|
||
" axis=[0, 7, 0, 5])\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The effect on the unit square is:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 100,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\n",
|
||
"text/plain": [
|
||
"<matplotlib.figure.Figure at 0x1058023d0>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"plot_transformation(Square, F_squeeze.dot(Square), \"$Square$\", \"$F_{squeeze} \\cdot Square$\",\n",
|
||
" axis=[0, 1.8, 0, 1.2])\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Let's show a last one: reflection through the horizontal axis:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 101,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\n",
|
||
"text/plain": [
|
||
"<matplotlib.figure.Figure at 0x105bd8dd0>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"F_reflect = np.array([\n",
|
||
" [1, 0],\n",
|
||
" [0, -1]\n",
|
||
" ])\n",
|
||
"plot_transformation(P, F_reflect.dot(P), \"$P$\", \"$F_{reflect} \\cdot P$\",\n",
|
||
" axis=[-2, 9, -4.5, 4.5])\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Matrix inverse\n",
|
||
"Now that we understand that a matrix can represent any linear transformation, a natural question is: can we find a transformation matrix that reverses the effect of a given transformation matrix $F$? The answer is yes… sometimes! When it exists, such a matrix is called the **inverse** of $F$, and it is noted $F^{-1}$.\n",
|
||
"\n",
|
||
"For example, the rotation, the shear mapping and the squeeze mapping above all have inverse transformations. Let's demonstrate this on the shear mapping:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 102,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\n",
|
||
"text/plain": [
|
||
"<matplotlib.figure.Figure at 0x1055438d0>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"F_inv_shear = np.array([\n",
|
||
" [1, -1.5],\n",
|
||
" [0, 1]\n",
|
||
"])\n",
|
||
"P_sheared = F_shear.dot(P)\n",
|
||
"P_unsheared = F_inv_shear.dot(P_sheared)\n",
|
||
"plot_transformation(P_sheared, P_unsheared, \"$P_{sheared}$\", \"$P_{unsheared}$\",\n",
|
||
" axis=[0, 10, 0, 7])\n",
|
||
"plt.plot(P[0], P[1], \"b--\")\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We applied a shear mapping on $P$, just like we did before, but then we applied a second transformation to the result, and *lo and behold* this had the effect of coming back to the original $P$ (we plotted the original $P$'s outline to double check). The second transformation is the inverse of the first one.\n",
|
||
"\n",
|
||
"We defined the inverse matrix $F_{shear}^{-1}$ manually this time, but NumPy provides an `inv` function to compute a matrix's inverse, so we could have written instead:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 103,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[ 1. , -1.5],\n",
|
||
" [ 0. , 1. ]])"
|
||
]
|
||
},
|
||
"execution_count": 103,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"F_inv_shear = LA.inv(F_shear)\n",
|
||
"F_inv_shear"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Only square matrices can be inversed. This makes sense when you think about it: if you have a transformation that reduces the number of dimensions, then some information is lost and there is no way that you can get it back. For example say you use a $2 \\times 3$ matrix to project a 3D object onto a plane. The result may look like this:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 104,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\n",
|
||
"text/plain": [
|
||
"<matplotlib.figure.Figure at 0x105775dd0>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"plt.plot([0, 0, 1, 1, 0, 0.1, 0.1, 0, 0.1, 1.1, 1.0, 1.1, 1.1, 1.0, 1.1, 0.1],\n",
|
||
" [0, 1, 1, 0, 0, 0.1, 1.1, 1.0, 1.1, 1.1, 1.0, 1.1, 0.1, 0, 0.1, 0.1],\n",
|
||
" \"r-\")\n",
|
||
"plt.axis([-0.5, 2.1, -0.5, 1.5])\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Looking at this image, it is impossible to tell whether this is the projection of a cube or the projection of a narrow rectangular object. Some information has been lost in the projection.\n",
|
||
"\n",
|
||
"Even square transformation matrices can lose information. For example, consider this transformation matrix:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 105,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\n1Vdb+6tfWdvTY21NjbXRqLWtrdYODnr3f/zj1v7P/3iXT5+2duVK7/Jjj1l7+LC1v/mNtV/8orXD\nw9Zed521+/Z5999zj7XvvONd/uhHrd227dzlP/zBu/yd71j7s58lX/uuXV7tP/pR8vuShIz0zil7\nsR8xSz1weMz1IyO3ibjltdfgU5+CT37Sm5XeeSd8+tPw4osXbnvzzbBrlzeDLS72bjt2DFavhuef\n95YtVlR4scesWd5H5A8ehBtu8Lbt6PC2B7jmGmhogB074Ior4L/+y4tN9uyBn/7UizsaG+HZZ+HI\nkXN59w9/CB/4gHf5qafOz/dnWvstt3i1P/ggfOUrM9+f+C6tb4Bu3LiRxpGlW2VlZaxevfrsORVG\nc69MvX7X5z/P6sWLaRpZd9vc0uLd78j1ux591Nn6Ri8ntP2tt8Ktt55//4kTNG/adMH2Dc8+yyWN\njfD44zz/1FOsaW+nYP9+eOgh3hgYoHXTprPbv3XPPcyKRFjw+OMAvH7//VTV1lI9cr25pYXVDz1E\n2Te+Af/xHxwqKeHtN9/0fv/4cZo3bWL+00+zpKEBHn/8vPFt37WLq/bs4fmHH6Zp4UIoKZnZ/69V\nq7z6x94/ZnwJ7e+OO7zrPv77G5uZh6UfJFvP5s2bAc72y4QkMn2f7AcvZnnCZnnMsm30T1tHuVxf\nymr75Cet3b7du3z77db++Mfe5euvPxeRjPrFL6z9x3/0Lvf3W/u+91n7pz+duz8Ws7a+3rv82GPW\n/sM/nLvvlVe86OeXvzy3D2utPXTI2r177Y4f/9jaD3/Yu+3OO/2rLyRcPjatTTxmSXqduTEmF9iH\n9wboceBF4NPW2tfHbWeTfSyRjLJiBfzd30E87q0Q+cY3vNuvvdaLVcaKx+E734GlS+Gtt7woZ+yn\nK3fu9O7//e+967ff7n361FqoqfFim3gcvv1tWLbM26a42DujYWcn/PVfe2vA3/9+mJ/+L+CQmUt0\nnbkvHxoyxtwI/CveUsf7rLXfn2AbNXPJHkePemu2t271Z3933w1dXV5Dl6ySaDP3ZZ25tfYJa+1l\n1tpLJ2rk2cD1ta4u15eS2p57Lvl12NbC3/6td57wBx/0Ztkz4PJzB+7Xlyh9AlTEb6+95p3+tbDQ\ni0yWzPCr6M6c8T46/4MfwN//vRfbiFyEzs0iIhJiaY1ZREQkWGrmPnE9t3O5PpdrA9WXLdTMRUQc\noMxcRCTElJmLiGQRNXOfuJ7buVyfy7WB6ssWauYiIg5QZi4iEmLKzEVEsoiauU9cz+1crs/l2kD1\nZQs1cxERBygzFxEJMWXmIiJZRM3cJ67ndi7X53JtoPqyhZq5iIgDlJmLiISYMnMRkSyiZu4T13M7\nl+tzuTZQfdlCzVxExAHKzEVEQkyZuYhIFlEz94nruZ3L9blcG6i+bKFmLiLiAGXmIiIhpsxcRCSL\nqJn7xPXczuX6XK4NVF+2UDMXEXGAMnMRkRBTZi4ikkXUzH3iem7ncn0u1waqL1uomYuIOECZuYhI\niCkzFxHJIkk1c2PMJ4wxrxpjho0x7/ZrUJnI9dzO5fpcrg1UX7ZIdmbeAnwU2O7DWDLa7t27gx5C\nSrlcn8u1gerLFnnJ/LK1dh+AMWbKPMd1nZ2dQQ8hpVyuz+XaQPVlC2XmIiIOmHJmboz5b6B27E2A\nBb5trX08VQPLNAcOHAh6CCnlcn0u1waqL1v4sjTRGLMN+Ia19uVJttG6RBGRGUhkaWJSmfk4kz5Y\nIoMREZGZSXZp4s3GmMPA1cBvjTG/92dYIiIyHWn7BKiIiKROylezGGNuNMa8YYzZb4z5VqofL92M\nMfcZY04YY14Jeix+M8Y0GGOeNMa8ZoxpMcZ8Oegx+ckYU2CMecEYs2ukxk1Bj8lvxpgcY8zLxpjH\ngh5LKhhjDhhj9ow8hy8GPR4/GWNKjTEPG2NeHzk+r5p0+1TOzI0xOcB+4AbgGLAD+JS19o2UPWia\nGWPeC/QC91trVwU9Hj8ZY+YCc621u40xRcBLwEcce/7mWGv7jDG5wLN4b+Q/G/S4/GKM+RpwJVBi\nrb0p6PH4zRjzNnCltbYj6LH4zRizGdhurf25MSYPmGOt7b7Y9qmemb8HeNNae9BaOwQ8BHwkxY+Z\nVtbaZwDnDiQAa22rtXb3yOVe4HWgPthR+cta2zdysQDv34Mzz6UxpgH4c+DeoMeSQgYHPy9jjCkB\n3met/TmAtTY2WSOH1P9PqAcOj7l+BMeaQbYwxjQCq4EXgh2Jv0ZiiF1AK9Bsrd0b9Jh8dCdwG97n\nQlxlgf82xuwwxvzfoAfjo0VAmzHm5yMx2U+MMbMn+wXnXtHEfyMRyyPAV0Zm6M6w1sattWuABmCd\nMWZ90GPygzHmQ8CJkb+sDFMsHc5g11lr3433F8gXR2JPF+QB7wb+baS+PuD2yX4h1c38KLBgzPWG\nkdskQ4xkdY8Av7TWPhr0eFJl5E/Y3wFrgx6LT64DbhrJlH8NbDDG3B/wmHxnrT0+8t9TwH/iRbsu\nOAIcttaPSb+nAAABEElEQVTuHLn+CF5zv6hUN/MdwCXGmIXGmHzgU4CL76q7PPP5GbDXWvuvQQ/E\nb8aYKmNM6cjl2cD7ASdOwWetvcNau8Bauxjv392T1trPBj0uPxlj5oz81YgxphD4APBqsKPyh7X2\nBHDYGLN05KYbgEkjQD8/ATrRgIaNMV8CtuC9cNxnrX09lY+ZbsaYXwFNQKUx5hDw3dE3LTKdMeY6\n4FagZSRXtsAd1tongh2Zb+qAX4yc9TMH76+PrQGPSRJXC/znyKlC8oAHrbVbAh6Tn74MPGiMmQW8\nDXxuso31oSEREQfoDVAREQeomYuIOEDNXETEAWrmIiIOUDMXEXGAmrmIiAPUzEVEHKBmLiLigP8P\ngcH+WokETwMAAAAASUVORK5CYII=\n",
|
||
"text/plain": [
|
||
"<matplotlib.figure.Figure at 0x10500dcd0>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"F_project = np.array([\n",
|
||
" [1, 0],\n",
|
||
" [0, 0]\n",
|
||
" ])\n",
|
||
"plot_transformation(P, F_project.dot(P), \"$P$\", \"$F_{project} \\cdot P$\",\n",
|
||
" axis=[0, 6, -1, 4])\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"This transformation matrix performs a projection onto the horizontal axis. Our polygon gets entirely flattened out so some information is entirely lost and it is impossible to go back to the original polygon using a linear transformation. In other words, $F_{project}$ has no inverse. Such a square matrix that cannot be inversed is called a **singular matrix** (aka degenerate matrix). If we ask NumPy to calculate its inverse, it raises an exception:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 106,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"LinAlgError: Singular matrix\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"try:\n",
|
||
" LA.inv(F_project)\n",
|
||
"except LA.LinAlgError as e:\n",
|
||
" print(\"LinAlgError:\", e)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Here is another example of a singular matrix. This one performs a projection onto the axis at a 30° angle above the horizontal axis:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 107,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\nAAAAAElFTkSuQmCC\n",
|
||
"text/plain": [
|
||
"<matplotlib.figure.Figure at 0x105a41550>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"angle30 = 30 * np.pi / 180\n",
|
||
"F_project_30 = np.array([\n",
|
||
" [np.cos(angle30)**2, np.sin(2*angle30)/2],\n",
|
||
" [np.sin(2*angle30)/2, np.sin(angle30)**2]\n",
|
||
" ])\n",
|
||
"plot_transformation(P, F_project_30.dot(P), \"$P$\", \"$F_{project\\_30} \\cdot P$\",\n",
|
||
" axis=[0, 6, -1, 4])\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"But this time, due to floating point rounding errors, NumPy manages to calculate an inverse (notice how large the elements are, though):"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 108,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[ 1.20095990e+16, -2.08012357e+16],\n",
|
||
" [ -2.08012357e+16, 3.60287970e+16]])"
|
||
]
|
||
},
|
||
"execution_count": 108,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"LA.inv(F_project_30)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"As you might expect, the dot product of a matrix by its inverse results in the identity matrix:\n",
|
||
"\n",
|
||
"$M \\cdot M^{-1} = M^{-1} \\cdot M = I$\n",
|
||
"\n",
|
||
"This makes sense since doing a linear transformation followed by the inverse transformation results in no change at all."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 109,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[ 1., 0.],\n",
|
||
" [ 0., 1.]])"
|
||
]
|
||
},
|
||
"execution_count": 109,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"F_shear.dot(LA.inv(F_shear))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Another way to express this is that the inverse of the inverse of a matrix $M$ is $M$ itself:\n",
|
||
"\n",
|
||
"$((M)^{-1})^{-1} = M$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 110,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[ 1. , 1.5],\n",
|
||
" [ 0. , 1. ]])"
|
||
]
|
||
},
|
||
"execution_count": 110,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"LA.inv(LA.inv(F_shear))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Also, the inverse of scaling by a factor of $\\lambda$ is of course scaling by a factor or $\\frac{1}{\\lambda}$:\n",
|
||
"\n",
|
||
"$ (\\lambda \\times M)^{-1} = \\frac{1}{\\lambda} \\times M^{-1}$\n",
|
||
"\n",
|
||
"Once you understand the geometric interpretation of matrices as linear transformations, most of these properties seem fairly intuitive.\n",
|
||
"\n",
|
||
"A matrix that is its own inverse is called an **involution**. The simplest examples are reflection matrices, or a rotation by 180°, but there are also more complex involutions, for example imagine a transformation that squeezes horizontally, then reflects over the vertical axis and finally rotates by 90° clockwise. Pick up a napkin and try doing that twice: you will end up in the original position. Here is the corresponding involutory matrix:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 111,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\nAElFTkSuQmCC\n",
|
||
"text/plain": [
|
||
"<matplotlib.figure.Figure at 0x104ff9fd0>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"F_involution = np.array([\n",
|
||
" [0, -2],\n",
|
||
" [-1/2, 0]\n",
|
||
" ])\n",
|
||
"plot_transformation(P, F_involution.dot(P), \"$P$\", \"$F_{involution} \\cdot P$\",\n",
|
||
" axis=[-8, 5, -4, 4])\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Finally, a square matrix $H$ whose inverse is its own transpose is an **orthogonal matrix**:\n",
|
||
"\n",
|
||
"$H^{-1} = H^T$\n",
|
||
"\n",
|
||
"Therefore:\n",
|
||
"\n",
|
||
"$H \\cdot H^T = H^T \\cdot H = I$\n",
|
||
"\n",
|
||
"It corresponds to a transformation that preserves distances, such as rotations and reflections, and combinations of these, but not rescaling, shearing or squeezing. Let's check that $F_{reflect}$ is indeed orthogonal:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 112,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[1, 0],\n",
|
||
" [0, 1]])"
|
||
]
|
||
},
|
||
"execution_count": 112,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"F_reflect.dot(F_reflect.T)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Determinant\n",
|
||
"The determinant of a square matrix $M$, noted $\\det(M)$ or $\\det M$ or $|M|$ is a value that can be calculated from its elements $(M_{i,j})$ using various equivalent methods. One of the simplest methods is this recursive approach:\n",
|
||
"\n",
|
||
"$|M| = M_{1,1}\\times|M^{(1,1)}| - M_{2,1}\\times|M^{(2,1)}| + M_{3,1}\\times|M^{(3,1)}| - M_{4,1}\\times|M^{(4,1)}| + \\cdots ± M_{n,1}\\times|M^{(n,1)}|$\n",
|
||
"\n",
|
||
"* Where $M^{(i,j)}$ is the matrix $M$ without row $i$ and column $j$.\n",
|
||
"\n",
|
||
"For example, let's calculate the determinant of the following $3 \\times 3$ matrix:\n",
|
||
"\n",
|
||
"$M = \\begin{bmatrix}\n",
|
||
" 1 & 2 & 3 \\\\\n",
|
||
" 4 & 5 & 6 \\\\\n",
|
||
" 7 & 8 & 0\n",
|
||
"\\end{bmatrix}$\n",
|
||
"\n",
|
||
"Using the method above, we get:\n",
|
||
"\n",
|
||
"$|M| = 1 \\times \\left | \\begin{bmatrix} 5 & 6 \\\\ 8 & 0 \\end{bmatrix} \\right |\n",
|
||
" - 2 \\times \\left | \\begin{bmatrix} 4 & 6 \\\\ 7 & 0 \\end{bmatrix} \\right |\n",
|
||
" + 3 \\times \\left | \\begin{bmatrix} 4 & 5 \\\\ 7 & 8 \\end{bmatrix} \\right |$\n",
|
||
"\n",
|
||
"Now we need to compute the determinant of each of these $2 \\times 2$ matrices (these determinants are called **minors**):\n",
|
||
"\n",
|
||
"$\\left | \\begin{bmatrix} 5 & 6 \\\\ 8 & 0 \\end{bmatrix} \\right | = 5 \\times 0 - 6 \\times 8 = -48$\n",
|
||
"\n",
|
||
"$\\left | \\begin{bmatrix} 4 & 6 \\\\ 7 & 0 \\end{bmatrix} \\right | = 4 \\times 0 - 6 \\times 7 = -42$\n",
|
||
"\n",
|
||
"$\\left | \\begin{bmatrix} 4 & 5 \\\\ 7 & 8 \\end{bmatrix} \\right | = 4 \\times 8 - 5 \\times 7 = -3$\n",
|
||
"\n",
|
||
"Now we can calculate the final result:\n",
|
||
"\n",
|
||
"$|M| = 1 \\times (-48) - 2 \\times (-42) + 3 \\times (-3) = 27$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"To get the determinant of a matrix, you can call NumPy's `det` function in the `numpy.linalg` module:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 113,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"27.0"
|
||
]
|
||
},
|
||
"execution_count": 113,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"M = np.array([\n",
|
||
" [1, 2, 3],\n",
|
||
" [4, 5, 6],\n",
|
||
" [7, 8, 0]\n",
|
||
" ])\n",
|
||
"LA.det(M)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"One of the main uses of the determinant is to *determine* whether a square matrix can be inversed or not: if the determinant is equal to 0, then the matrix *cannot* be inversed (it is a singular matrix), and if the determinant is not 0, then it *can* be inversed.\n",
|
||
"\n",
|
||
"For example, let's compute the determinant for the $F_{project}$, $F_{project\\_30}$ and $F_{shear}$ matrices that we defined earlier:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 114,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"0.0"
|
||
]
|
||
},
|
||
"execution_count": 114,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"LA.det(F_project)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"That's right, $F_{project}$ is singular, as we saw earlier."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 115,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"2.0816681711721642e-17"
|
||
]
|
||
},
|
||
"execution_count": 115,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"LA.det(F_project_30)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"This determinant is suspiciously close to 0: it really should be 0, but it's not due to tiny floating point errors. The matrix is actually singular."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 116,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"1.0"
|
||
]
|
||
},
|
||
"execution_count": 116,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"LA.det(F_shear)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Perfect! This matrix *can* be inversed as we saw earlier. Wow, math really works!"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The determinant can also be used to measure how much a linear transformation affects surface areas: for example, the projection matrices $F_{project}$ and $F_{project\\_30}$ completely flatten the polygon $P$, until its area is zero. This is why the determinant of these matrices is 0. The shear mapping modified the shape of the polygon, but it did not affect its surface area, which is why the determinant is 1. You can try computing the determinant of a rotation matrix, and you should also find 1. What about a scaling matrix? Let's see:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 117,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\ngg==\n",
|
||
"text/plain": [
|
||
"<matplotlib.figure.Figure at 0x104edf8d0>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"F_scale = np.array([\n",
|
||
" [0.5, 0],\n",
|
||
" [0, 0.5]\n",
|
||
" ])\n",
|
||
"plot_transformation(P, F_scale.dot(P), \"$P$\", \"$F_{scale} \\cdot P$\",\n",
|
||
" axis=[0, 6, -1, 4])\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We rescaled the polygon by a factor of 1/2 on both vertical and horizontal axes so the surface area of the resulting polygon is 1/4$^{th}$ of the original polygon. Let's compute the determinant and check that:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 118,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"0.25"
|
||
]
|
||
},
|
||
"execution_count": 118,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"LA.det(F_scale)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Correct!\n",
|
||
"\n",
|
||
"The determinant can actually be negative, when the transformation results in a \"flipped over\" version of the original polygon (eg. a left hand glove becomes a right hand glove). For example, the determinant of the `F_reflect` matrix is -1 because the surface area is preserved but the polygon gets flipped over:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 119,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"-1.0"
|
||
]
|
||
},
|
||
"execution_count": 119,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"LA.det(F_reflect)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Composing linear transformations\n",
|
||
"Several linear transformations can be chained simply by performing multiple dot products in a row. For example, to perform a squeeze mapping followed by a shear mapping, just write:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 120,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"P_squeezed_then_sheared = F_shear.dot(F_squeeze.dot(P))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Since the dot product is associative, the following code is equivalent:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 121,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"P_squeezed_then_sheared = (F_shear.dot(F_squeeze)).dot(P)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Note that the order of the transformations is the reverse of the dot product order.\n",
|
||
"\n",
|
||
"If we are going to perform this composition of linear transformations more than once, we might as well save the composition matrix like this:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 122,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"F_squeeze_then_shear = F_shear.dot(F_squeeze)\n",
|
||
"P_squeezed_then_sheared = F_squeeze_then_shear.dot(P)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"From now on we can perform both transformations in just one dot product, which can lead to a very significant performance boost."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"What if you want to perform the inverse of this double transformation? Well, if you squeezed and then you sheared, and you want to undo what you have done, it should be obvious that you should unshear first and then unsqueeze. In more mathematical terms, given two invertible (aka nonsingular) matrices $Q$ and $R$:\n",
|
||
"\n",
|
||
"$(Q \\cdot R)^{-1} = R^{-1} \\cdot Q^{-1}$\n",
|
||
"\n",
|
||
"And in NumPy:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 123,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[ True, True],\n",
|
||
" [ True, True]], dtype=bool)"
|
||
]
|
||
},
|
||
"execution_count": 123,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"LA.inv(F_shear.dot(F_squeeze)) == LA.inv(F_squeeze).dot(LA.inv(F_shear))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Singular Value Decomposition\n",
|
||
"It turns out that any $m \\times n$ matrix $M$ can be decomposed into the dot product of three simple matrices:\n",
|
||
"* a rotation matrix $U$ (an $m \\times m$ orthogonal matrix)\n",
|
||
"* a scaling & projecting matrix $\\Sigma$ (an $m \\times n$ diagonal matrix)\n",
|
||
"* and another rotation matrix $V^T$ (an $n \\times n$ orthogonal matrix)\n",
|
||
"\n",
|
||
"$M = U \\cdot \\Sigma \\cdot V^{T}$\n",
|
||
"\n",
|
||
"For example, let's decompose the shear transformation:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 124,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[ 0.89442719, -0.4472136 ],\n",
|
||
" [ 0.4472136 , 0.89442719]])"
|
||
]
|
||
},
|
||
"execution_count": 124,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"U, S_diag, V_T = LA.svd(F_shear) # note: in python 3 you can rename S_diag to Σ_diag\n",
|
||
"U"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 125,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([ 2. , 0.5])"
|
||
]
|
||
},
|
||
"execution_count": 125,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"S_diag"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Note that this is just a 1D array containing the diagonal values of Σ. To get the actual matrix Σ, we can use NumPy's `diag` function:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 126,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[ 2. , 0. ],\n",
|
||
" [ 0. , 0.5]])"
|
||
]
|
||
},
|
||
"execution_count": 126,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"S = np.diag(S_diag)\n",
|
||
"S"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Now let's check that $U \\cdot \\Sigma \\cdot V^T$ is indeed equal to `F_shear`:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 127,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[ 1. , 1.5],\n",
|
||
" [ 0. , 1. ]])"
|
||
]
|
||
},
|
||
"execution_count": 127,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"U.dot(np.diag(S_diag)).dot(V_T)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 128,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[ 1. , 1.5],\n",
|
||
" [ 0. , 1. ]])"
|
||
]
|
||
},
|
||
"execution_count": 128,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"F_shear"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"It worked like a charm. Let's apply these transformations one by one (in reverse order) on the unit square to understand what's going on. First, let's apply the first rotation $V^T$:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 129,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\n",
|
||
"text/plain": [
|
||
"<matplotlib.figure.Figure at 0x10550fbd0>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"plot_transformation(Square, V_T.dot(Square), \"$Square$\", \"$V^T \\cdot Square$\",\n",
|
||
" axis=[-0.5, 3.5 , -1.5, 1.5])\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Now let's rescale along the vertical and horizontal axes using $\\Sigma$:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 130,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\nUiqK/R9kJsBsOB4OigAAAABJRU5ErkJggg==\n",
|
||
"text/plain": [
|
||
"<matplotlib.figure.Figure at 0x105067d10>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"plot_transformation(V_T.dot(Square), S.dot(V_T).dot(Square), \"$V^T \\cdot Square$\", \"$\\Sigma \\cdot V^T \\cdot Square$\",\n",
|
||
" axis=[-0.5, 3.5 , -1.5, 1.5])\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Finally, we apply the second rotation $U$:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 131,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\nAElFTkSuQmCC\n",
|
||
"text/plain": [
|
||
"<matplotlib.figure.Figure at 0x1058a8190>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"plot_transformation(S.dot(V_T).dot(Square), U.dot(S).dot(V_T).dot(Square),\"$\\Sigma \\cdot V^T \\cdot Square$\", \"$U \\cdot \\Sigma \\cdot V^T \\cdot Square$\",\n",
|
||
" axis=[-0.5, 3.5 , -1.5, 1.5])\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"And we can see that the result is indeed a shear mapping of the original unit square."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Eigenvectors and eigenvalues\n",
|
||
"An **eigenvector** of a square matrix $M$ (also called a **characteristic vector**) is a non-zero vector that remains on the same line after transformation by the linear transformation associated with $M$. A more formal definition is any vector $v$ such that:\n",
|
||
"\n",
|
||
"$M \\cdot v = \\lambda \\times v$\n",
|
||
"\n",
|
||
"Where $\\lambda$ is a scalar value called the **eigenvalue** associated to the vector $v$.\n",
|
||
"\n",
|
||
"For example, any horizontal vector remains horizontal after applying the shear mapping (as you can see on the image above), so it is an eigenvector of $M$. A vertical vector ends up tilted to the right, so vertical vectors are *NOT* eigenvectors of $M$.\n",
|
||
"\n",
|
||
"If we look at the squeeze mapping, we find that any horizontal or vertical vector keeps its direction (although its length changes), so all horizontal and vertical vectors are eigenvectors of $F_{squeeze}$.\n",
|
||
"\n",
|
||
"However, rotation matrices have no eigenvectors at all (except if the rotation angle is 0° or 180°, in which case all non-zero vectors are eigenvectors).\n",
|
||
"\n",
|
||
"NumPy's `eig` function returns the list of unit eigenvectors and their corresponding eigenvalues for any square matrix. Let's look at the eigenvectors and eigenvalues of the squeeze mapping matrix $F_{squeeze}$:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 132,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([ 1.4 , 0.71428571])"
|
||
]
|
||
},
|
||
"execution_count": 132,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"eigenvalues, eigenvectors = LA.eig(F_squeeze)\n",
|
||
"eigenvalues # [λ0, λ1, …]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 133,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[ 1., 0.],\n",
|
||
" [ 0., 1.]])"
|
||
]
|
||
},
|
||
"execution_count": 133,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"eigenvectors # [v0, v1, …]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Indeed the horizontal vectors are stretched by a factor of 1.4, and the vertical vectors are shrunk by a factor of 1/1.4=0.714…, so far so good. Let's look at the shear mapping matrix $F_{shear}$:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 134,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([ 1., 1.])"
|
||
]
|
||
},
|
||
"execution_count": 134,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"eigenvalues2, eigenvectors2 = LA.eig(F_shear)\n",
|
||
"eigenvalues2 # [λ0, λ1, …]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 135,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[ 1.00000000e+00, -1.00000000e+00],\n",
|
||
" [ 0.00000000e+00, 1.48029737e-16]])"
|
||
]
|
||
},
|
||
"execution_count": 135,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"eigenvectors2 # [v0, v1, …]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Wait, what!? We expected just one unit eigenvector, not two. The second vector is almost equal to $\\begin{pmatrix}-1 \\\\ 0 \\end{pmatrix}$, which is on the same line as the first vector $\\begin{pmatrix}1 \\\\ 0 \\end{pmatrix}$. This is due to floating point errors. We can safely ignore vectors that are (almost) colinear (ie. on the same line)."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Trace\n",
|
||
"The trace of a square matrix $M$, noted $tr(M)$ is the sum of the values on its main diagonal. For example:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 136,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"123"
|
||
]
|
||
},
|
||
"execution_count": 136,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"D = np.array([\n",
|
||
" [100, 200, 300],\n",
|
||
" [ 10, 20, 30],\n",
|
||
" [ 1, 2, 3],\n",
|
||
" ])\n",
|
||
"np.trace(D)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The trace does not have a simple geometric interpretation (in general), but it has a number of properties that make it useful in many areas:\n",
|
||
"* $tr(A + B) = tr(A) + tr(B)$\n",
|
||
"* $tr(A \\cdot B) = tr(B \\cdot A)$\n",
|
||
"* $tr(A \\cdot B \\cdot \\cdots \\cdot Y \\cdot Z) = tr(Z \\cdot A \\cdot B \\cdot \\cdots \\cdot Y)$\n",
|
||
"* $tr(A^T \\cdot B) = tr(A \\cdot B^T) = tr(B^T \\cdot A) = tr(B \\cdot A^T) = \\sum_{i,j}X_{i,j} \\times Y_{i,j}$\n",
|
||
"* …\n",
|
||
"\n",
|
||
"It does, however, have a useful geometric interpretation in the case of projection matrices (such as $F_{project}$ that we discussed earlier): it corresponds to the number of dimensions after projection. For example:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 137,
|
||
"metadata": {
|
||
"collapsed": false
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"1"
|
||
]
|
||
},
|
||
"execution_count": 137,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"np.trace(F_project)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# What next?\n",
|
||
"This concludes this introduction to Linear Algeabra. Although these basics cover most of what you will need to know for Machine Learning, if you wish to go deeper into this topic there are many options available: Linear Algebra [books](http://linear.axler.net/), [Khan Academy](https://www.khanacademy.org/math/linear-algebra) lessons, or just [Wikipedia](https://en.wikipedia.org/wiki/Linear_algebra) pages. "
|
||
]
|
||
}
|
||
],
|
||
"metadata": {
|
||
"kernelspec": {
|
||
"display_name": "Python 2",
|
||
"language": "python",
|
||
"name": "python2"
|
||
},
|
||
"language_info": {
|
||
"codemirror_mode": {
|
||
"name": "ipython",
|
||
"version": 2
|
||
},
|
||
"file_extension": ".py",
|
||
"mimetype": "text/x-python",
|
||
"name": "python",
|
||
"nbconvert_exporter": "python",
|
||
"pygments_lexer": "ipython2",
|
||
"version": "2.7.11"
|
||
},
|
||
"toc": {
|
||
"toc_cell": false,
|
||
"toc_number_sections": true,
|
||
"toc_threshold": 6,
|
||
"toc_window_display": false
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 0
|
||
}
|