Files
hands-on/math_linear_algebra.ipynb
2016-05-03 11:35:17 +02:00

4837 lines
658 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"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": false
},
"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": 6,
"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 0x10672e2d0>"
]
},
"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": "iVBORw0KGgoAAAANSUhEUgAAAWoAAAEACAYAAACatzzfAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAFqVJREFUeJzt3X+MZXV5x/H3s8wu3R/CUBVrd4UBGqMxykAUSZEyZQFt\nJZo2MWJNzCjRP1ojVINYTLOEWIE/1FVr0tjqWi22DRQCWmugMAOBRPzBjktlV4vk1oXCRlLAwGoL\nO0//uGfc2dmZuc+de+79PvfczyuZzD13z9795M7sM2ee7/l+v+buiIhIXutKBxARkdWpUIuIJKdC\nLSKSnAq1iEhyKtQiIsmpUIuIJBcq1GZ2vJndaGZ7zexHZvbGfgcTEZG2seB5nwW+5e7vMLMxYFMf\nM4mIyCLWacKLmR0H7Hb30wYTSUREFou0Pk4BnjSzXWb2gJl90cw29juYiIi0RQr1GHAm8AV3PxM4\nCHysr6lEROTXIj3qR4H97v796vgm4MqlJ5mZFg0REemSu1unczpeUbv7AWC/mb2yemo78NAK56b6\n2LFjR/EMytScTFlzKdPwZoqK3vXxIeAGM1sPPAK8N/wvFNRqtUpHOIoyxWTMBDlzKVNMxkxRoULt\n7j8E3tDnLCIisoxGz0ycnp4uHeEoyhSTMRPkzKVMMRkzRXW8jzr8QmZe12uJiIwCM8PrGEwcZrOz\ns6UjHEWZYjJmgpy5lCkmY6aoRhdqEZEmUOtDRKQQtT5ERBqi0YU6Y09KmWIyZoKcuZQpJmOmqEYX\nahGRJlCPWkSkEPWoRUQaotGFOmNPSpliMmaCnLmUKSZjpqhGF2oRkSZQj1pEpBD1qEVEGqLRhTpj\nT0qZYjJmgpy5lCkmY6aoRhdqEZEmUI9aRKQQ9ahFRBqi0YU6Y09KmWIyZoKcuZQpJmOmqEYXahGR\nJlCPWkSkEPWoRUQaotGFOmNPSpliMmaCnLmUKSZjpqhGF2oRkSZQj1pEpBD1qEVEGqLRhTpjT0qZ\nYjJmgpy5lCkmY6aoRhdqEZEmCPWozawFPAPMA8+7+1nLnKMetYhIF6I96rHg680DU+7+VG+xRESk\nW9HWh3VxbhoZe1LKFJMxE+TMpUwxGTNFRYuvA3eY2ffM7P39DCQiIkeK9qhf7u6Pm9lLgTuAD7r7\nvUvOUY+6k1tvhde9Dk45pXQSEUmg1h61uz9eff65md0CnAXcu/S86elpJiYmABgfH2dycpKpqSng\n8K8dI3t87bVw1VVM7dwJl11WPo+OdazjgR8vPG61WnTF3Vf9ADYBW6rHm4H7gIuWOc+zmZmZKR2h\nbc8e982b3dev95krryyd5ihp3qdFMmZyz5lLmWIyZqrqZsc6HLmifhlwi5k57SvwG9z99u5+HIyw\nJ56A7dvhuefguONg8+bSiURkyGitj3765S/hrLNg3z544QU4/ni4+WY4//zSyUQkAa31Udr8PLzz\nnfDww+0iDeDeLtYiIl1odKFe3MAfuI9/HO68E371q8PPzc8zu29fuUwrKPo+rSBjJsiZS5liMmaK\nanShLuZrX4PPfQ4OHjzy+eefV49aRLqmHnXd7rsPLryw3Z9eyqx9hb1hw+BziUg60R61CnWd3OHE\nE+HJJ5f/87Gx9lW1iAgaTAQK9KTM4POfh9e+FjZuhGOOOfLPN21K2SdTpriMuZQpJmOmqEYX6iIu\nuQT27IH774dDh9rPbdnS/qz+tIisgVof/XLNNbBjBzz7LNx4I3z603DSSfDNb5ZOJiJJqEddmhmc\neir89KeHn3NvPy8ignrUQMGe1MK90rcvmWlvlrJPpkxxGXMpU0zGTFGNLtTFXHBB+/Npp5XNISKN\noNZH3ebn23d7XH89fPSjpdOISGJqfZTyiU+0P19xRdkcItIYjS7URXpSO3a0BxFXGDTM2CdTpriM\nuZQpJmOmqEYX6oFbaRBRRKQH6lHXads2eOyx9m14IiIdqEc9aPPz7SJ9/fWlk4hIwzS6UA+0JxUc\nRMzYJ1OmuIy5lCkmY6aoRhfqgeowiCgislbqUddh3z549avb225pkouIBGmtj0HSIKKIrIEGExlQ\nT6rLQcSMfTJlisuYS5liMmaKanShHgjNRBSRPlPro1fLLWcqIhKg1scgaCaiiAxAowt133tSa1jO\nNGOfTJniMuZSppiMmaIaXaj7SjMRRWRA1KNeq4U9EefnNclFRNZE91H3mwYRRaRHtQ8mmtk6M3vA\nzG7rLdrg9K0n1cMgYsY+mTLFZcylTDEZM0V106O+DHioX0GGivZEFJEBCrU+zGwbsAv4K+DD7v62\nZc4ZjdaH9kQUkZrU3fr4DHAFMAKVuAPNRBSRARvrdIKZvRU44O5zZjYFrFj9p6enmZiYAGB8fJzJ\nyUmmpqaAw/2hQR7Pzc1x+eWX1/v61XKms3ffvaa/v/BcifdjpeOl2UrnAdi5c2fx75/ljheey5JH\nX7/4cV/qwRq+f2ZnZ2m1WnTF3Vf9AD4J/Ax4BHgceBb46jLneTYzMzP1vuDeve7g/vDDa36J2jPV\nQJniMuZSppiMmaq62bEOd3V7npmdB3zER7VHreVMRaRGWuujbpqJKCKFdFWo3f3u5a6ms1rcF+pZ\nTYOItWaqiTLFZcylTDEZM0XpijpKeyKKSCGaQh6hPRFFpA+01kedNIgoIn2gwURq6knVPIiYsU+m\nTHEZcylTTMZMUY0u1LXQTEQRKUytj060nKmI9IlaH3XQnogikkCjC3XPPak+LGeasU+mTHEZcylT\nTMZMUY0u1D3RTEQRSUI96pVoT0QR6TPdR90rDSKKSJ9pMJEeelJ9HETM2CdTpriMuZQpJmOmqEYX\n6jXTnogikohaH0tpT0QRGRC1PtZKMxFFJJlGF+o19aT6vJxpxj6ZMsVlzKVMMRkzRTW6UHdNMxFF\nJCH1qBfTcqYiMkDqUXdLMxFFJKlGF+quelIDGkTM2CdTpriMuZQpJmOmqEYX6q5oT0QRSUo9atCe\niCJShNb66IYGEUWkAA0mEuxJDXgQMWOfTJniMuZSppiMmaIaXahDNBNRRJJT60PLmYpIIWp9RGgm\noogMgUYX6o49qQLLmWbskylTXMZcyhSTMVPUWKcTzOxY4B5gQ/Vxq7tf1e9gfbcwiHjddaWTiIis\nKtSjNrNN7n7QzI4B7gM+4u73LTlnuHrU2hNRRAqrtUft7gerh8dWf+epHrLloJmIIjIkQoXazNaZ\n2W7gCWDW3R/qb6x6rNiTKjiImLFPpkxxGXMpU0zGTFEde9QA7j4PnGFmxwG3m9l57n730vOmp6eZ\nmJgAYHx8nMnJSaampoDDb9Igj+fm5pb/8wsuYBZg/36mqoHEQeVbUOL9GKbjubm5VHn09evuOOPX\nb8V6MMDjhcetVotudH0ftZn9JXDQ3T+15Pnh6FEv7Il43XVw5ZWl04jICKutR21mLzGz46vHG4EL\ngbneIxayMBNRG9eKyJCI9KhfDsxUPervALe5+539jVWPpb+uAsUHEZfNVJgyxWXMpUwxGTNFdexR\nu/uDwJkDyNJ/mokoIkNotNb60HKmIpKI1vpYSjMRRWRINbpQH9GTSjKImLFPpkxxGXMpU0zGTFGN\nLtRH0ExEERlSo9Gj1p6IIpKQ9kxcTIOIIpKQBhOpelLJBhEz9smUKS5jLmWKyZgpqtGFGkgziCgi\nslbNb31oT0QRSUqtD9BMRBFphEYX6tlzz20/SHSnR8Y+mTLFZcylTDEZM0U1t1DPz8OTT6YZRBQR\nWavm9qi1J6KIJKf7qDWIKCLJjfZgYjWIOHvNNYWDHC1jn0yZ4jLmUqaYjJmimlmoL7ig/Xnr1rI5\nRERq0LzWh/ZEFJEhMbqtD81EFJGGaV6hXrScacaelDLFZMwEOXMpU0zGTFHNKtSaiSgiDdSsHrWW\nMxWRITJ6Pepky5mKiNSlOYV6mUHEjD0pZYrJmAly5lKmmIyZoppTqLUnoog0VDN61NoTUUSG0Git\n9aFBRBEZQqMzmLjKIGLGnpQyxWTMBDlzKVNMxkxRw1+oNRNRRBquY+vDzLYBXwVeBswDf+vun1vm\nvDKtDy1nKiJDKtr6GAu81gvAh919zsy2AD8ws9vdfV/PKXulmYgiMgI6tj7c/Ql3n6sePwvsBXKs\nH7qwnOkKd3pk7EkpU0zGTJAzlzLFZMwU1VWP2swmgEng/n6E6YpmIorIiIi0PgCo2h43AZdVV9ZH\nmZ6eZmJiAoDx8XEmJyeZmpoCDv80q+340kvbx9Ug4krnL6j932/Q8dTUVKo8C2ZnZ9PkyXysr1/8\neHG2Uv/+7OwsrVaLboTuozazMeCbwL+5+2dXOGewg4kaRBSRIVf3fdRfBh5aqUgPXHAQcelP0QyU\nKSZjJsiZS5liMmaK6liozewc4N3A+Wa228weMLO39D/aKjoMIoqINMnwTSHXnogi0hDNnUKumYgi\nMmKGr1B3sZxpxp6UMsVkzAQ5cylTTMZMUcNVqDUTUURG0HD1qLWcqYg0SPN61JqJKCIjangK9RoG\nETP2pJQpJmMmyJlLmWIyZooankKtPRFFZEQNR49aeyKKSAM1a89EDSKKSAM1ZzCxh0HEjD0pZYrJ\nmAly5lKmmIyZovIXas1EFJERl7/1oeVMRaShmtH60ExEEZHkhbrH5Uwz9qSUKSZjJsiZS5liMmaK\nyluoNRNRRATI3KO+5pr2JJf5eU1yEZFGGv77qDWIKCINN9yDiTUNImbsSSlTTMZMkDOXMsVkzBSV\ns1BrT0QRkV/L1/rQnogiMiKGt/WhmYgiIkfIV6hrXM40Y09KmWIyZoKcuZQpJmOmqFyFWjMRRUSO\nkqtHreVMRWSEDF+PWjMRRUSWladQ92EQMWNPSpliMmaCnLmUKSZjpqg8hVp7IoqILCtHj1p7IorI\nCKptrQ8z+xJwMXDA3V+3ynlrL9QaRBSREVTnYOIu4M29R1pBHwcRM/aklCkmYybImUuZYjJmiupY\nqN39XuCpviXQTEQRkVWFetRmdjLwjb60PrScqYiMqGjrY2wQYVakmYi1O3QITj8dHn00dr4ZfOUr\n8Pa39zWWiPSg1kI9PT3NxMQEAOPj40xOTjI1NQUc7g8dcfyOdzAFcNppy/95j8dzc3Ncfvnltb1e\nHccLz/Xz33vuOXjmmYV/b6r6fPTx+vXwhjdMMT8/y0K80u/PwvHOnTs7f/8UOF54LkuexVmy5IGc\nX78M9WDhcavVoivu3vEDmAAe7HCOd+XQIXdwv+667v5eF2ZmZvr22ms1iExXX+2+YUP77V3pY+NG\n9x072l+GUX2f1iJjLmWKyZipqpsda3Dk9ryv074MezFwANjh7ruWOc87vdYRtCdi39xxB1x00fJ/\ntn49bNkCt9wC55032FwicqT8eyZqELFWrRa8730wM7PyOZs2wRlnwM03w4knDiyaiKwg96JMAxpE\nXNwXyqLOTK0WnH9++2feKae0i/TFF7cHEq++GjZsOHzuxo3tOyDvuefoIt3096lOGXMpU0zGTFFl\nCrX2RFyz1YqzO3zjG7B1K1xySXtHs/Xr4YQT4Nvfbnea1uVZ3UVEggbf+tCeiF1brq1x8cXwN3/T\nLsorOf10eNGL1OoQySpvj1qDiCFrLc6LLdzjoatokZzy9qgHuJxpxp7UapmibY0os1iRHrb3qaSM\nuZQpJmOmqMHOTNRMxKPUceUsIs022NaHljMFVJxFpC3fWh8jvieiirOIrNXgetQFljMt3ZNarud8\n9tmza+4590vp92k5GTNBzlzKFJMxU9TgCvWI7InYaUDw2mtzFGcRGR6D6VE3fE9EtTVEZC1y3Ufd\nwEFEFWcR6VWe+6gLDiLW3ZOq4z7njH0yZYrLmEuZYjJmiur/XR9DvieirpxFpLT+tz6GcDlTFWcR\nGYQc91EP0UxEFWcRyaq/PerCy5l26km1WrB9e31ra9SRqQRlisuYS5liMmaK6t8VddKZiK0WXHop\n3HXX4ed05SwimfWvR51oOVMVZxHJqPx91IUHEVWcRSS7svdRFxpEXNpzvuuu2b73nLuVsU+mTHEZ\ncylTTMZMUf0p1AMcRDy6OB8eEJyZyVGcRUR6UX/rYwB7IqqtISJNUO4+6j7NRFRxFpFRVX/ro8bl\nTFdra0R6zhl7UsoUkzET5MylTDEZM0XVe0VdwyCirpxFRI5Ub49669Y1LWeq4iwio6hMj7qLmYgq\nziIiMaEetZm9xcz2mdlPzGz1WzlWGUTstefcrYw9KWWKyZgJcuZSppiMmaI6FmozWwf8NfBm4DXA\nu8zsVcuevMwg4qCL82Jzc3P9eeEeKFNMxkyQM5cyxWTMFBW5oj4L+E93/y93fx74J+Dty55ZDSKW\nLM6LPf300/3/R7qkTDEZM0HOXMoUkzFTVKRHvRXYv+j4UdrF+yjbP3Caes4iIjWrdTBx4co5S3Fu\ntVqlIxxFmWIyZoKcuZQpJmOmqI6355nZ2cDV7v6W6vhjgLv79UvOa84W4yIiA1LLMqdmdgzwY2A7\n8DjwXeBd7r63jpAiIrK6jq0Pdz9kZh8Ebqc9+PglFWkRkcGpbWaiiIj0R8+LMnU1GWZAzOxLZnbA\nzPaUzrLAzLaZ2V1m9iMze9DMPpQg07Fmdr+Z7a5yfbJ0pgVmts7MHjCz20pnATCzlpn9sHqvvls6\nD4CZHW9mN5rZ3urr98YEmV5ZvUcPVJ+fSfK9/hfVe7THzG4wsw0JMl1W1YLO9cDd1/xBu9A/DJwM\nrAfmgFf18pp1fABvAiaBPaWzLMr0W8Bk9XgL7b5/hvdqU/X5GOA7wDmlM1V5/hz4B+C20lmqPI8A\nJ5TOsSTTV4D3Vo/HgONKZ1qSbx3w38ArCuc4ufr6baiO/xl4T+FMrwH2AMdW//duB05d6fxer6jj\nk2EGyN3vBZ4qnWMxd3/C3eeqx88Ce2nfo16Uux+sHh5L+z9W8ffNzLYBfwj8Xeksixj92hFpDczs\nOOBcd98F4O4vuPsvCsda6gLgp+6+v+OZ/fUL4P+AzWY2Bmyi/QOkpFcD97v7/7r7IeAe4I9XOrnX\nb7zlJsMULz7ZmdkE7Sv++8sm+XWLYTfwBDDr7g+VzgR8BrgCyDSA4sAdZvY9M3t/6TDAKcCTZrar\najN80cw2lg61xDuBfywdwt2fAj4F/Ax4DHja3f+9bCr+AzjXzE4ws020L0xesdLJaa4QRoWZbQFu\nAi6rrqyLcvd5dz8D2Ab8npmdVzKPmb0VOFD99mHVRwbnuPuZtP9D/ZmZvalwnjHgTOALVa6DwMfK\nRjrMzNYDbwNuTJDlVNqttJOB3wa2mNmflMzk7vuA64E7gG8Bu4FDK53fa6F+DDhp0fG26jlZRvVr\n103A19z91tJ5Fqt+bf5X4PWFo5wDvM3MHqF9Nfb7ZvbVwplw98erzz8HbmGFZRQG6FFgv7t/vzq+\niXbhzuIPgB9U71dprwfuc/f/qdoMNwO/WzgT7r7L3V/v7lPA08BPVjq310L9PeB3zOzkahT1EiDF\nKD25rsYWfBl4yN0/WzoIgJm9xMyOrx5vBC6kPSBcjLtf5e4nufuptL+f7nL395TMZGabqt+EMLPN\nwEW0f3Utxt0PAPvN7JXVU9uBDG2rBe8iQduj8mPgbDP7DTMz2u9V8bkgZvbS6vNJwB8BX1/p3J7W\n+vCkk2HM7OvAFPBiM/sZsGNh0KVgpnOAdwMPVj1hB65y928XjPVy4O+rb951tK/07yyYJ6uXAbdU\nyySMATe4+9r3m6vPh4AbqjbDI8B7C+cB2j/YaA8kfqB0FgB3/2H1W9kPaLcXdgNfLJsKgH8xs98E\nngf+dLXBYE14ERFJToOJIiLJqVCLiCSnQi0ikpwKtYhIcirUIiLJqVCLiCSnQi0ikpwKtYhIcv8P\nAXQATcLZ84MAAAAASUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10680f550>"
]
},
"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 0x106897550>"
]
},
"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 0x106a05250>"
]
},
"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 0x106a35350>"
]
},
"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 0x106a21c50>"
]
},
"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 0x106c168d0>"
]
},
"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 0x106b97510>"
]
},
"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": "iVBORw0KGgoAAAANSUhEUgAAAW8AAAD7CAYAAAClvBX1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAH1lJREFUeJzt3Xt0VfWd9/H39yQhISEY5Rq5BRVBUQyieGHUWMfqY9uZ\nTqvLaluNpbU6+oyt2tY1tRZGa6tTp31a21l2BovacXSqdby03lAi3rWSAIJctAYRguUigZAQSM7v\n+WMnEmMCSc7J+Z3fzue1Vpbsw8k+n3PUb3Y++2bOOUREJCwJ3wFERKT3NLxFRAKk4S0iEiANbxGR\nAGl4i4gESMNbRCRAuZl6ITPTMYkiIn3gnLPOj2V0y9s5129fP/zhD/t1/f39pfzKrvxhfvV3/u7E\npjapra31HSElyu9PyNlB+X3zlT82w1tEZCCJzfCurKz0HSElyu9PyNlB+X3zld/21amk9YXMXKZe\nS0QkLswM53uHZX+qqqryHSElyu9PyNlB+X3zlT82w1tEZCBRbSIiksViX5uIiAwksRne6s38Cjl/\nyNlB+X1T5y0iIj2mzltEJIup8xYRiZHYDG/1Zn6FnD/k7KD8vqnzFhGRHlPnLSKSxdR5i4jESMrD\n28zyzexVM6s2s+VmdnM6gvWWejO/Qs4fcnZQft985U/5NmjOuWYzO90512hmOcCLZjbLOfdiGvKJ\niEgX0tp5m1khUAVUOudWdPo7dd4iIr3Ur523mSXMrBrYCFR1HtwiIpJeabl7vHMuCUw3s6HAU2Z2\nmnPuuc7Pq6yspKysDICSkhLKy8upqKgA9vZGfV3++c9/ntb1ZXpZ+f0td+wssyGP8mdXvkznr6qq\nYv78+QAfzcuupP1QQTP7AdDonLut0+P9WptUVVV99EGESPn9CTk7KL9v/Z2/u9ok5eFtZsOBPc65\nejMbDDwJzHXOPdPpeeq8RUR6qbvhnY7apBS4y8yMqEO/p/PgFhGR9Ep5h6Vzbplz7ljn3HTn3DHO\nuZ+mI1hvdeydQqT8/oScHZTfN1/5dYaliEiAdG0TEZEspmubiIjESGyGt3ozv0LOH3J2UH7f1HmL\niEiPqfMWEcli6rxFRGIkNsNbvZlfIecPOTsov2/qvEVEpMfUeYuIZDF13iIiMRKb4a3ezK+Q84ec\nHZTfN3XeIiLSY+q8RUSymDpvEZEYic3wVm/mV8j5Q84Oyu+bOm8REekxdd4iIllMnbeISIzEZnir\nN/Mr5PwhZwfl902dt4iI9Jg6bxGRLKbOW0QkRmIzvNWb+RVy/pCzg/L7ps5bRER6TJ23iEgWU+ct\nIhIjsRne6s38Cjl/yNlB+X1T5y0iIj2mzltEJIup8xYRiZHYDG/1Zn6FnD/k7KD8vqnzFhGRHlPn\nLSKSxdR5i4jESMrD28zGmtmzZrbczJaZ2T+lI1hvqTfzK+T8IWcH5ffNV/7cNKyjBbjaOVdjZkOA\nN8zsKefcyjSsW0REupD2ztvM/hf4pXPumU6Pq/MWEemljHTeZlYGlAOvpnO9IiLycWkb3m2VyQPA\nVc65hnStt6fUm/kVcv6Qs4Py+xZy542Z5RIN7nuccw9397zKykrKysoAKCkpoby8nIqKCmDvB9DX\n5ZqampS+3/ey8mtZy1quqKigqqqK+fPnA3w0L7uSls7bzO4GNjvnrt7Hc9R5i4j0Unedd8rD28xm\nAYuAZYBr+/pn59wTnZ6n4S0i0kv9tsPSOfeicy7HOVfunJvunDu28+DOhPZfO0Kl/P6EnB2U3zdf\n+XWGpYhIgHRtExGRLKZrm4iIxEhshrd6M79Czh9ydlB+39R5i4hIj6nzFhHJYuq8RURiJDbDW72Z\nXyHnDzk7KL9v6rxFRKTH1HmLiGQxdd4iIjESm+Gt3syvkPOHnB2U3zd13iIi0mPqvEVEspg6bxGR\nGInN8FZv5lfI+UPODsrvmzpvERHpMXXeIiJZTJ23iEiMxGZ4qzfzK+T8IWcH5fdNnbeIiPSYOm8R\nkSymzltEJEZiM7zVm/kVcv6Qs4Py+6bOW0REekydt4hIFlPnLSISI7EZ3urN/Ao5f8jZQfl9U+ct\nIiI9ps5bRCSLqfMWEYmR2Axv9WZ+hZw/5Oyg/L6p8xYRkR5T5y0iksXUeYuIxEhshrd6M79Czh9y\ndlB+34LuvM1snpl9YGZL07E+ERHZt7R03mb2N0ADcLdzblo3z1HnLSLSS/3aeTvnXgA+TMe6RERk\n/9R5Z1hLMsmG5maqd+xgwdatPL5lC49u3sxPHn6Yp7Zu5aX6et5pamJna6vvqL0SyufflWzI/vLL\nsGlT75cbGmDhwqqM5ewP2fD5p8JX/txMvlhlZSVlZWUAlJSUUF5eTkVFBbD3A+jrck1NTUrfn+7l\nRxYs4J2mJigv54X6el5etIgPW1rYPW0a+YkEVlODAbnTpwPQvGABOWvXkjt9Oq3O0bh4MQlg2PHH\nM6mwkHErVjC5sJAvn3UWhwwezKLnnsuq95ttn39oyxdeWEVrK4wYES2/+24VQ4bsf7moqILLLgOz\n7Ho/Wu77clVVFfPnzwf4aF52JW3HeZvZBODRgdp572pt5bn6eh7evJmHN29m8549DE4k2JVM0pyG\n950AinJySDpHEjj1gAM4b+RIzj7oIMbk56e8fvHrppvgBz/o+fOLi+EXv4DzzoOiov7LJf5113mn\nc3iXEQ3vo7v5+9gN7+Zkkkc2b+ZX69fzyvbt5CcSNLS2kszQ6xclErQ4R2l+PpeMHs3s0lIN8kC9\n+SYc3eX/OZ900EHw/PNw5JH9m0myQ7/usDSze4GXgMPN7D0zuyQd6+2N9l87MmFZQwOXr17N8Bdf\nZPaqVTxXX0+zc2xPZXC31Q69sbNtq7521y5+/N57HPrKK5xaXc2DmzaxO5mpHyGRTH7+6ZYN2d97\nDw4+eN/Pyc2Fm2+GBx6AI47Y+3g25E+F8vdNWjpv59yF6VhPtnupvp5r33mHmoYG9iSTtPgO1MGu\ntmH9fH09NQ0N5Jkxt6yMr5eWUpCT4zmddGfVKtixAx56CK69Fq6+uuvnjR0LDz8Mxx6b2XySvXRt\nkx54sb6e77zzDksaGmjM8BZtKooSCfITCeaUlfENDfGs0NoK27fDr38NV14J//qv0UDOyYFZs6C0\nFFo6bRV89atRRXLddX4yi1/93nn3IEBww3vdrl18fdUqXqivD2pod1aUSFCYk8O8yZP53PDhvuP0\n2R/+AMuXw0svwb33woEHRo//z//AnXfCE0/4zbcvL7wAkybB/PnR8C4ogG99K9rx2G7XLjjuuOg9\nAowaBXfdBWed5SWyZInYX5gqnb1TSzLJT997jymvvcaz27ZlZnD3ofPuqZ3JJJv27OFLK1Zw9pIl\nvL9rV9pfo797vw0boLY2OiKjthbajpQEouE9dmzf190f2Rsbob4ennkGvvAFuP9+qKuD73wHfvSj\n6H10HNwA+flw+OHRn6dMgRtu6NngVmfsV9Cdd5wsa2jg3OXLWd/cHPTWdlcak0me+fBDJr/2Grcc\ncghXjBmD2Sd+oGelBQvgkktg6VJ4+22YOXPv3z3/PNx2m79s7ZyLTpy5+urot4JjjoELLoBp02DE\niP1/vxn87nfw4INw4YVRlSLSHdUmHfy2ro4r16yhKZkku5OmriiR4PSSEu498kiKc8P5Gf7tb8OK\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 0x106b00550>"
]
},
"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 is zero, 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 0x106dcf210>"
]
},
"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:"
]
},
{
"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 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",
"A more concise way of writing this is:\n",
"\n",
"$(\\lambda M)_{i,j} = \\lambda (M)_{i,j}$\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 also defined on the right hand side, and gives the same result: $M \\lambda = \\lambda M$. 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": [
"This makes scalar multiplication **commutative**.\n",
"\n",
"It is also **associative**, meaning that $\\alpha (\\beta M) = (\\alpha \\times \\beta) 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 (Q + R) = \\lambda Q + \\lambda 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 multiplication\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$. It is noted simply $QR$ without multiplication sign or dot. 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 = AD = \\begin{bmatrix}\n",
" 10 & 20 & 30 \\\\\n",
" 40 & 50 & 60\n",
"\\end{bmatrix} \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 $QR ≠ RQ$\n",
"\n",
"In fact, $QR$ and $RQ$ 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(RS) = (QR)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) # (AB)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(BG)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It is also ***distributive* over addition** of matrices, meaning that $(Q + R)S = QS + RS$. 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 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 I_n = I_m 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 matrix multiplication:"
]
},
{
"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 matrix multiplication"
]
},
{
"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 an $m \\times n$ matrix, then $M^T$ is an $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 0x106a2c490>"
]
},
"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 0x106b0e090>"
]
},
"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 0x1070bf910>"
]
},
"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 0x1072322d0>"
]
},
"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 0x107264cd0>"
]
},
"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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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x1073a8550>"
]
},
"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": [
"### Matrix multiplication Projection onto an axis\n",
"Matrix multiplication 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 0x1073a84d0>"
]
},
"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": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAEACAYAAACj0I2EAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xl8VNXZwPHfk33fCAFDgCAishoQRAUEsa64VW0FcUFt\n0Vrrhlvrq2hdqrV1X4pooe5WfEWlL60oRCwKEiEiu2Ig7EmY7GSbzHn/mCFBCGQmmZk7y/P9fPIh\nd+bm3oeTmZM7zz3POWKMQSmlVPCLsDoApZRS3qEdulJKhQjt0JVSKkRoh66UUiFCO3SllAoR2qEr\npVSIcLtDF5EIEVkpIh8d5vlnReR7ESkUkTzvhaiUUsodnlyh3wKsa+sJETkH6GuM6QdcD/zNC7Ep\npZTygFsduojkAOcCrxxmlwuB1wCMMcuBVBHp5pUIlVJKucXdK/SngDuBw5WV9gC2HbC9w/WYUkop\nP2m3QxeRicAeY0whIK4vpZRSASbKjX1GAxeIyLlAPJAsIq8ZY646YJ8dQM8DtnNcj/2EiOjEMUop\n1QHGmHYvptu9QjfG/MEY08sYczQwCVh0UGcO8BFwFYCInARUGGP2HOZ4+mUMM2bMsDyGQPnSttC2\n0LY48pe73LlCb5OIXO/sn83Lxpj/E5FzReQHoBa4pqPHDRdbtmyxOoSAoW3RStuilbaF5zzq0I0x\nnwOfu76fedBzN3kxLqWUUh7SSlGLTJ061eoQAoa2RStti1baFp4TT/IznT6ZiPHn+ZRSKhSICMYb\nN0WVb+Tn51sdQsDQtmilbdFK28Jz2qErpVSI0JSLUkoFOE25KKVUmNEO3SKaH2ylbdFK26KVtoXn\ntENXSqkQoTl0pZQKcJpDV0qpMKMdukU0P9hK26KVtkUrbQvPaYeulFIhQnPoSikV4DSHrpRSYUY7\ndItofrCVtkUrbYtW2hae0w5dKaVChObQlVIqwGkOXSmlwox26BbR/GArbYtW2hattC08126HLiKx\nIrJcRFaJyFoRebSNfcaJSIWIrHR9/Y9vwlVKKXU4buXQRSTBGLNPRCKBpcB0Y8zSA54f53rsgnaO\nozl0pZTykFdz6MaYfa5vY10/U97WOd0PTymllLe51aGLSISIrAJ2A/nGmHVt7HayiBSKyL9EZKBX\nowxBmh9spW3RStuilbaF59y9QncYY4YBOcCprhTLgb4Behlj8oDngXneDVMpFQ4cDgelpaV8O38R\njS+/bHU4QSfKk52NMVUi8i9gBPD5AY/XHPD9AhF5UUQyjDG2g48xdepUcnNzAUhLSyMvL4/x48cD\nrX+Rw2F7/PjxARWPbgfO9n6BEo8/tuvr65k37yN27qxiwIDTMPVxxC1ZQv799zP+j3+0PD5/b+fn\n5zNnzhyAlv7SHe3eFBWRTKDJGFMpIvHAf4AHjTGfHbBPN2PMHtf3JwL/NMYcEoXeFFVK7WeMobKy\nkq1bS9i1q56IiExSUjKx25uIjNzCydF1MHEirFwJPXpYHa6lvHlT9ChgsSuHvgz4yBjzmYhcLyLT\nXPtcKiJrXPs8DVzW4cjDxMFXY+FM26JVOLRFU1MTO3fuYunSNXz11R727s0kM3MIXbpkEx0dQ03N\nXnr3ziC/pgZ++1u49lrQC0G3tJtyMcZ8Bwxv4/GZB3z/AvCCd0NTSoWSmpoaduwoZevWSpqb00lJ\nOYasrPif7OP8BF9OZuYANm0C/vAHGD0aXnzR2bmrI9K5XJRSPuNwONi7dy9FRaXs3WuIiupKamoX\nIiMj29y/urqC1NQ9DBvWv/XBTZtg6VK45ho/RR143E25aIeulPK6+vp6du8u5ccfbTQ0JJGYmEVi\nYnK7P1dSspmRI1PJzMz0Q5TBQyfnCnDhkCt1l7ZFq2BuC2MMFRUVfPvtJvLzN7FpUyQJCQPIyurr\nVmdut9uJiqomPT0dCO62sIpHwxaVUupgTU1NlJaW8eOPZVRXxxAb25XMzHREPCser64uJycn5bDp\nGNU+TbkopTrk0JucWcTFxbf/g4dRUrKRU07pTmpqqhejDA3uplz0Cl0p5ba2bnKmpfXq9FV1Y2MD\n8fH1pKSktL/z55/DggXw2GOdOmco0hy6RTQ/2ErbolWgtkV9fT1btmwjP/87CgqqqK/vSVbWIDIy\nsrySIqmqspGbm/GTNM1h2+L44+Gtt+CTTzp93lCjV+hKqTa1Xck5gNTUGK+fy+HYS9eufdzbOS0N\nZs+Gq6+G1ashI8Pr8QQrzaErpX6irZucKSme3+R0V11drbPU/+RBnv3gLbfAnj3wzjs+iSuQ6Dh0\npZRHvH2T012lpcUMHRpNdvZRnv1gXR0MHw733w+TJ/smuACh49ADXKDmSq2gbdHK322xf7rar79e\nxxdfbKW4OJG0tCFkZfX2S2feWurf5ZDn2m2L+Hjn1fkgD6/sQ5jm0JUKQ4dWcvYkK6v94h9vq6mp\npFu3OGJiOpiXP/547wYU5DTlolSYONx0tdHR3r/J6S4t9XePjkNXSgHeq+T0ttZS/1xL4wglmkO3\niOaNW2lbtPJmW9TU1LBxYxGLF6/l228bETmGrKz+pKZmWN6ZQ/ul/h1uizDOAugVulIhxFeVnL7Q\n1GQjO7u7dw/69NNQXg4PPujd4wYJzaErFQI6Ol2tVRobG2ho2MC4cUO9+2lh1y7Iy4OPPoJRo7x3\nXItpDl2pEOfPSk5vq6qy0b+/D1I/Rx0FL7wAV14Jq1ZBYqJ3jx/gNIduEc0bt9K2aOVOW7S3Jmcw\ncJb6H7lkv8Ovi0svdV6d33VXx34+iLV7hS4iscASIMb19aEx5g9t7PcscA5QC0w1xhR6OValwpo7\na3IGg7q6WtLShERfXj0/95xzjPrFF8Ppp/vuPAHGrRy6iCQYY/aJSCSwFJhujFl6wPPnADcZYyaK\nyCjgGWPMSW0cR3PoSnnA0zU5g0GHS/09tXYt5OaGRNrFqzl0Y8w+17exONM05QftciHwmmvf5SKS\nKiLdjDF7PIhZKeUSKJWc3tZa6j/A9ycLwykB3Mqhi0iEiKwCdgP5xph1B+3SA9h2wPYO12PqMDRv\n3ErbwskYw/z58zu8Jmcw8KTUX18XnnP3Ct0BDBORFOATERlnjPm8IyecOnUqubm5AKSlpZGXl8f4\n8eOB1l+gbofX9n6BEo+/t0ePHk1paRnvv7+A7777nkmTTiEzM51vvvkc2MSIEc79Cwqc+wfzdkXF\nDq677iy32qewsPCIz4fydn5+PnPmzAFo6S/d4fE4dBG5D9hnjPnrAY/9DVhsjHnXtb0BGHdwykVz\n6Eq1smq6WqvY7XaqqtYwYcIQa+4B1NVBbCxEBN/gPq/l0EUkE2gyxlSKSDxwBnBwGdZHwG+Bd0Xk\nJKBC8+dKHSqYKjm9rb1Sf5+bNg1GjoSbb7bm/H7gzp+qo4DFrhz6MuAjY8xnInK9iEwDMMb8H1Ak\nIj8AM4EbfRZxiDg43RDOwqEt3F2Tc3+aIhQ5S/0Pnff8cLz+upgxAx56CNav9+5xA0i7V+jGmO+A\n4W08PvOg7Zu8GJdSQS+YKzm9rbGxgfj4elJSUqwL4phj4OGH4Yor4KuvICb0fg86l4tSXubvNTmD\nQVnZLvr3t5Ob29PaQIyB885zLl330EPWxuIBXVNUKT8Lt5ucnigpWcOpp/bxbXWou3btgmHDYMkS\nOPZYq6M5ooULF3LmmWcC6JqigSwc8sbuCua28PaanKGYQ+9oqb/PXhdHHQXffBPQnfncuXMRkZbO\n3F0626JSHRCqlZy+UFOzl6FDjzwRl9/1CMy6x1mzZjFt2jQAkpKSWLt2Lb169XI7XacpF6XcFIhr\ncgY6YwxlZauZMGFAxxeCDnHGGJ544gnuvvtuwFlI9PXXX9O1a9eWfXQ+dKW8JFDX5AwGnpT6hxtj\nDPfccw9//vOfARgxYgSfffZZp0YCaQ7dIsGcN/a2QG0LK9bkDLUcel3dXnr2dH/s+YH8+rooLvbb\nWqTNzc1ce+21RERE8Oc//5kzzjiDffv2sWLFik4P69QrdKUOEM6VnN5mt9uJiqomPT3X6lCOzBjn\nvOm33uoco+4jjY2NXHbZZcybNw+Ayy+/nDlz5hAdHe21c2gOXSmCb03OYFBeXkqPHtUMGHC01aG0\nb9UqOOssKCiAXr28euja2lrOOussli51LiHxu9/9jqeffpoID+aU0Ry6Uu3QSk7fcpb6d7c6DPcM\nGwa33QZTp8Knn3plAi+bzcbo0aPZsGEDADNmzGDGjBk+vfeiOXSLBGre2Ar+botAXpMzVHLo3ij1\n9/t75K67oKEBnn22U4fZuXMnWVlZdOnShQ0bNvDss89ijOGBBx7w+Y10vUJXYSNU1uQMBlVVNvr3\n993NY5+IjITXXoOf/Qx+9StISvLoxzdv3syxxx6Lw+EA4PXXX+cKH+bk26I5dBXSQnFNzmAQUKX+\nnqqrg3j3/9CvXr2a448/vmX7448/5rzzzvNqSJpDV2Ht4JucCQk5ZGVZONNfGOloqX/AcLMzX7p0\nKWPGjGnZXrJkCWPHjvVVVG7RHLpFNIfeylttYYyhoqKizTU5k5KCozMPhRx6Tc1eevfufKl/ILxH\nthYV8eAVVzDjtNN48Ior2FpUxL///W9EpKUzX7lyJcYYyztz0Ct0FQK0kjNwOFOq5WRmDrA6lE7b\nWlTEc2ecwYObN5MI1AJT3nyTD13Pb9y4kWMDbIIvzaGroKXT1Qae6uoKUlP3MGxYf6tD6bQHr7iC\nO958kwMTR7XAHy+6iMc/+MCvsWgOXYUkreQMbHV1exk8uGOl/oHEGMOPX37JwXcBEoG4ykorQnKL\n5tAtEgj5wUDhTlscvCZnXV1Om2tyBrtgzqG3lvqne+V4VrxHHA4Ht99+OxEREXxZVETtQc/XAhHZ\n2X6Py13tdugikiMii0RkrYh8JyKHLJktIuNEpEJEVrq+/sc34apwEgo3OcNJdXU5OTkpQfkH1m63\nc/XVVxMZGclTTz3FxIkTmb9+PTP69m3p1GuBGX37MjWAl65rN4cuIt2B7saYQhFJAr4BLjTGbDhg\nn3HAdGPMBe0cS3Poql26JmdwKinZyCmndCc1NdXqUNxWX1/PxRdfzIIFCwC46qqrePXVV4mKcmaj\ntxYVMee++3Ds3ElEdjZTH3qI3n36+D1Or+XQjTG7gd2u72tEZD3QA9hw0K76blOdopWcwcsbpf7+\nVF1dzemnn86KFSsAuP3223niiScOmTCrd58+zHjjDStC7BCPcugikgvkAcvbePpkESkUkX+JyEAv\nxBbSNIfu5HA4mDdvntfW5Ax2wZpDr6qykZvr3VJ/X7xHysrKOOaYY0hJSWHFihU8/PDDOBwO/vrX\nv3o0+2GgcnuUiyvdMhe4xRhTc9DT3wC9jDH7ROQcYB7Q5gDNqVOnkpubC0BaWhp5eXmMHz8eaP0F\n6nbob9fX1zNv3kfs3FlFU1M86ek5FBevBEoZMcK5//7OLZy2N24sDKh43N12OPayfv02tmzZ7LXX\nS2FhYad+/sDt7du3c9xxx1Fb68yIv/jiiwwY4Bwrv/+PUCC9P/Lz85kzZw5AS3/pDrfGoYtIFDAf\nWGCMecaN/YuAE4wxtoMe1xx6GNM1OUNTXV0tkZFbOPnkQVaHcohNmzbRv3/rmPi3336bSZMmWRhR\nx3h7HPrfgXWH68xFpJsxZo/r+xNx/qGwtbWvCj9ayRnaamr2MnRo50v9vWnVqlUMHz68ZXvBggWc\nffbZFkbkH+4MWxwNTAEmiMgq17DEs0XkehGZ5trtUhFZIyKrgKeBy3wYc0gIhxy6u2tyBmve2BeC\nrS1aS/29X0zUkffIkiVLEJGWznzp0qUYY8KiMwf3RrksBY44sNQY8wLwgreCUsFLKznDS01NJd26\nxRETY23abP78+Zx//vkt299++y1Dhw61MCJr6FwuyisOna62qxb/hIGSks2MHJlKZmamJed/4403\nuPLKKwGIjIxk48aN9O3b15JYfEnnclE+p2tyhrfWUv9cv5/72Wef5ZZbbgEgKyuLVatWkR3AJfn+\nEvwDL4NUMOfQvb0mZ7DljX0pmNrC16X+B79HjDEtiyzfcsstDBw4kL1797Jnzx7tzF30Cl25TSs5\n1YGammxkZ3f3+XkcDgc333wzL7zgvE03ZswY/v3vfwfvikg+pDl0dUS6JqdqS2NjAw0NGxg3bqjP\nhp82NTVx1VVX8c477wBw0UUX8c477xAbG+uT8wUyzaGrTtE1OdWRVFXZ6N/fu6X++9XV1XHBBRfw\n6aefAnDdddcxc+ZMvYhwg+bQLRKIOXSrpqsNpryxrwVLWzgce+na1bvFRFVVVZxwwgkkJCTw6aef\nMmnSJBwOB6+88op25m7SK3SllZzKI3V1taSliddy2CUlJYwcOZLi4mIAHn/8ce68804+//xzfQ16\nSHPoYUzX5FQdUVpazNCh0WRnH9Wp4xQXFzNw4MCWCbNmzZrFr371K2+EGHI0h67apJWcqjNaS/0H\ndPgYGzZsaJnpEOC9997j0ksv9UJ0SnPoFvF3Dj2Q1+QMlryxPwR6W3Sm1L+goAARaenMP/nkE4wx\nh+3MA/E+U6DTK/QQppWcytvq6vYyeLBnE3EtXryYCRMmtGwvW7aMUaNGeTs0hebQQ5Kuyal8wW63\nU1W1hgkThrj1qW7evHn8/Oc/b9les2YNgwYF3pzpwUBz6GFIKzmVL7lb6j979myuvfZaAOLi4li/\nfr1Hq+6ojtMO3SL5+fktS091Rijc5CwoyG9Z1izcBXJbHFzqv7WoiDn33Ydjxw4kOxt7bi6PPPoo\nADk5ORQUFNCtW7cOn89b75Fwoh16kNJKTuVPjY0NxMfXk5LifI1tLSriuTPO4MHNm0kEanGugnPc\nscfy1fLlpKWlWRlu2NIcehDRNTmVVcrKdtG/v53c3J4AzLj8cu56+20OLC2qBf4yZQoz3njDkhhD\nmebQQ4hWciqrOUv9+9DY2MiUKVPYPXcuDx60TyLg2LnTivCUi45Dt4g7Y2zdXZMz2AX62Gt/CsS2\nqKurJS6unvPOO4/Y2Fjmzp1L8jHHUHvQfrVAhBfnJddx6J5zZ5HoHBFZJCJrReQ7Ebn5MPs9KyLf\ni0ihiOR5P9Tw4HA4KC0t5euv1/HFF1spLk4kLW0IWVm9tSxf+V11dTVTplzKhAkjyc/P595778Xh\ncPDSJ58wo2/flk69FpjRty9TH3rIynDDXrs5dBHpDnQ3xhSKSBLwDXChMWbDAfucA9xkjJkoIqOA\nZ4wxJ7VxLM2hH4auyakCSVlZGVdccQVlZSXATv785+nccccdP/lk2DLKZedOIrKzmfrQQ/Tu08e6\noEOYuzl0j2+Kisg84DljzGcHPPY3YLEx5l3X9npgvDFmz0E/qx36AfQmpwo0O3bs4JJLLsFubwLg\n7rvv4LLLhjNsWH+LIwtv7nboHuXQRSQXyAOWH/RUD2DbAds7XI+pNhhjmPvP97y2JmewC8S8sVWs\naovNmzczYsQJXHjhBdjtTfzlL3+hoOAbxo07kZ49PSv1p7LSKzFpDt1zbo9ycaVb5gK3GGNqOnrC\nqVOntlSNpaWlkZeX11I8sP8XGOrb44YMIem22/hy6nRIzWH06PMQkZY38/7CknDZ3i9Q4rFye+PG\nQr+er6joRx5/3LlWJ1Rz2223M2XKDQAsX/4Z+/YVceaZ1wBuvr5tNsbfdBN8/TX5P/zQ/v5H2C4s\nLOzUzwfzdn5+PnPmzAHwqMrWrZSLiEQB84EFxphn2nj+4JTLBmCcplyOYPp07EVF7HzqGYq3VVBd\nHUlERDopKRnExITfmonKv5YtW8ZNN/22Zfu1115n4MCBP9mnvLyUHj2qGTDgaM8O/vDDkJ8Pn3wC\nETqQzhu8mkMXkdeAMmPM7Yd5/lzgt66boicBT+tN0XbU18OIEXDPPXDFFdTU1FBSYqO4uJy6ulii\nojJISUknKira6khVCPn000+55567W7bnzp1Lbm7bNzJLSjZyyindSU1N9ewkdjuMHQuTJ8PNbQ6K\nUx7yWocuIqOBJcB3gHF9/QHoDRhjzMuu/Z4HzsY5gukaY8zKNo6lHbpLfn4+41NT4cwz4ZtvoFcv\nwJlfr66uZs8eG8XFFTQ2JhATk0FSUhpRUaFZBxbI85f4m6/a4oMPPuCRRx4GICEhkX/+8126dz/8\nikONjQ00NGxg3LihHat5+P57OOUUWLIEBnRsMQydy6WV1ypFjTFLgXZnejLG3ORmbGq/YcPgttvg\n17+G//wHcP7iUlJSSElJoW9fB1VVVezaZWP79u3Y7UnExmaQnJxGhH6UVe0wxvCPf/yD559/DoCj\njsrmtddeIz09vd2fraqy0b9/JwrY+vWDhx6CW29teW0r39O5XKxmt8P69TBkyBF3a25uprKykp07\nbezcWUNzcwrx8RkkJaWGVNWo6jxjDM8++yyvv/4aAAMGDOSll14iKSnJ7WOUlKzh1FP7dG4haGNg\n717IzOz4MRTgw3HonaEdunfY7XbKy8vZsaOc3bv3YUwaCQkZJCYma+cexpqbm3n44Yf5+OOPABg1\n6iT++te/EhcX59Fx6upqiYzcwskn62IUgcIn49CV93RmjG1UVBRdu3YlL+9YTj99EMOHx5OYuIPS\n0tWUlBSzb1+HR5VaQseht+pIWzQ2NjJ9+nRGjTqRjz/+iLPPPptly5bxwgsveNyZA9TU7KV37wyP\nf87bdBy650LzLlsYiY6Oplu3bnTr1o2Ghgb27rVRXLyVkhIHEREZJCWlExeXYHWYygfq6uq46aab\n+PZb53jtSZMmcfvt0zt1f8X5CbqczMyO3chU1tKUSyCqqoKUzs3jUldXR1mZja1bbVRXRxARkaFj\n3ENEZWUl1113LVu2bAFg2rTr+fWvf+2VdFt1dQWpqXt8U+rf3AxbtkDfvt4/dojTHHqwWrUKfvEL\nKCwED25iHUltbS2lpTa2bi1n375ooqIySE5OD8tpBoJZaWkpkydPpqKiHIA77riTSZMmefUcJSWb\nGTkylUxf3Mj8+mu4+GL49lvo4uF0AmFOc+gB7rD5wWHDnEUZ06d77VyJiYnk5vbk1FOHMHp0D/r0\nqaeubj0lJRspLy/Fbrd77VwdoTn0Vm21xfbt2xg5ciTnnHM2FRXl/PGPD1FQ8I3XO3O73U5UVLVb\nwxo75MQT4Ze/hN/8xjkCph2aQ/ec5tAD0TPPwPHHw7/+BRMneu2wPx3j3ovKykr27Cln27YdNDUl\nEhPjHOMeTAtMh7Lvv/+eyZNbO+2nnnqasWPH+ux81dXl5OSk+Pb3/+ijcMIJ8NZbMGWK784TpjTl\nEqg+/xwuv9z58dTH43gdDgcVFRXs2mVjx44ampuTiYtzjnHXAib/Kyws5Fe/uq5le9asVxg2bJjP\nz9vhUn9PrVoFZ53lrJDu2dO35woRmkMPBXfeCbW18OKLfjul3W6noqKCHTts7N69D4cjjYSEdBIT\nU3SMu48tXbqUW25pnfvkzTffon9//8xD3ulSf089+iiUl8MTT/j+XCFAO/QA59Y8FfX10NAAvr5i\nOoympibKy8vZts1GaWkDkE5iYgYJCd65WbtfuM/l8p///Id77/2Da6ua999fSO/evf0aQ1nZLvr3\nt5Ob66cr5uZm579HSO/oXC6tvDaXi7JQXJzzyyLR0dFkZWWRlZVFQ0MDNls5xcXFlJTYXWPcM3SM\neyfMnfsejz32GAApKam8/fbbbNu23u+dOYDDsZeuXf24fJzep/EJvUJXHqurq2Pv3nK2brVRVQWR\nkc7OPTbWuj8+wcIYw9///ndeesmZRuvZsxezZ88mLS3Nspi01D/wacpF+UVtbS1lZc7OvbY2ishI\nZwGTjnH/KYfDwVNPPcXbb78FwODBg3nhhRc7N/mVl5SWFjN0aDTZ2YefTldZS8ehB7gOjbFtaIDt\n270eS2ckJibSu3cOY8cOYcyYnvTt2+Aa474Bm62kZbHhIwnlceh2u53777+fE08cydtvv8WYMWNY\nuvRL5sz5R5udub/borXU3+JCn9274bvvfvKQjkP3nObQg8mHHzpHB3z9NcQE1hWwiJCcnExycjJH\nH92Lqqoqdu+2sX37ThobE4mJSSc5OT1sxrg3NDRw55138uWXSwE477zz+J//uS/gFimpqamkW7c4\nYqx+PX31Fdx1l3NIo5cqpMORplyCiTFw4YUweLCzYw8CDoeDyspK1xj3auz20B7jXltby29+8xvW\nrVsLwJQpV3DLLbcE7P/Vp6X+nrr6aoiPh7/9zepIAo7m0EPVnj2Qlwdz58Lo0VZH45Hm5uYDxrjX\n0tyc6prHPfjHuFdUlDN16lS2u1JiN974W6655pqA/n/Z7XaqqtYwYcKQwPjkVFnprJB+8UU491yr\nowko2qEHuE6Nsf3wQ7j9ducEXsnJXo3LX/Yv0rFtm41PP/2CIUPOaBnjHsid4MH27NnDZZddRk1N\nNQD33PN7Lr300g4fz59j8svLS+nRo5oBA472y/nckp/vrJBevZr8NWt0HLqL18ahi8irwHnAHmPM\n0DaeHwd8CPzoeuh/jTEPexiv8sSFFzo79ddfhxtvtDqaDtm/SEfXrl3Zu7eYIUPi2LZtO6WlTYik\nk5SUQXy89SNADmfr1q1ccsnFLduPPPIoZ511loURea6pyUZ2dnerw/ip8ePhyivhs8+gWzerowk6\n7V6hi8gYoAZ47Qgd+nRjzAXtnkyv0L2nsRGioyGIrmbdUV9f71qko5yKCkNERLqrgCne6tAA2LBh\nA1dc0Tqp1LPPPscpp5xiYUQd4/dSf9UpXrtCN8b8V0TaK13TV4S/WT0qwUfi4uLo0SObHj2y2bdv\nH2VlNoqLf6CkJJKIiHTLFulYuXIl06b9umX71Vf/zvHHH+/3OLylqspG//4Z2pmHGG/dej9ZRApF\n5F8iMtBLxwxpOsa21eHaIiEhgV69chgzZghjx/aiX78mGho2eDTGvbOWLFnCiBEntHTmb7/9DgUF\n3/isM/fXOHRnqb/164Yeib5HPOeNQbHfAL2MMftE5BxgHnDs4XaeOnUqubm5AKSlpZGXl9dy42P/\nL1C3w2vp25ZrAAAfO0lEQVR7vyPtn5SUREFBAcYYRo8+gT17bHz88Uc0NcUyYsQ5JCWlUVj4X4CW\nm4r7O8eObP/rX/9ixozbAIiMTOf99+eye/dmKit3AP06ffzDbW/cWOjV47W1PWjQSNLShBUrVgDW\n//4Pt11YWBhQ8fhzOz8/nzlz5gC09JfucGuUiyvl8nFbOfQ29i0CTjDG2Np4TnPovvL99840jAUT\nO1nF4XBQVVXFrl02tm+vwm5PIjbWuUhHR8Z9G2N49913+Mtf/gJAenoGb731Fl27dvV26JYKulL/\nTz+F7GwYGL4f/r0926JwmDy5iHQzxuxxfX8izj8Sh3Tmysc+/BA+/hgWLQqbmewiIiJIS0sjLS2N\nY49tprKykp07bezcWUxzcwrx8c4CpvbyxMYYZs6cySuvzAKgT5+jeeWVV3y/0IMFWkv9B1gdivu2\nbHFWkS5bFrL3jryl3csYEXkL+BI4VkSKReQaEbleRKa5drlURNaIyCrgaeAyH8YbMryeH7ztNmcl\n6VNPefe4fuCNtoiMjCQjI4PBg49hwoTBjBiRTFpaCWVl31JSsoWamioO/nTocDh4/PHHGTlyBK+8\nMou8vGF88cV/ee+99yzrzH2dQw+YUn83tLwurrsOcnLgwQctjScYuDPK5fJ2nn8BeMFrEamOiYyE\nf/zDuRDvWWfBkCFWR2SZA8e4NzU1YbPZ2LZtB6WljUA6cXHJPPbYE3zyyX8AGD/+NP70pz8RHR1t\nbeB+UFe3l8GDLZ6Iy1MiMGuWs0J64kQIwmGi/qKVoqFm9mx4+mnnBF6x/h/eF8gqKio4//wL+O9/\nVwKpnHnmJO699wESE4Oz2tZTAVfq76l58+COO5wV0mE2gZeuWBSupk6FhQuhoCDo5nrxpq1FRcy5\n7z4cO3bQnJXFh2vXsmatc8Ksu+++m/vvv9+1SMcWSkoiiIjIsGyMu79UV5eTk5MSnJ05wEUXwfLl\n8OOPMLTd8RlhSa/QLZLvy/USjQmqClJvt8XWoiKeO+MMHty8mUSgFpgCDLjrLh597LFDbpLW1tZS\nWmpj69Zy9u2LJioqg+TkdEsW6fDlXC4lJRs55ZTuQXOz16fvkSCjV+jhLIg6c194/rbbWjpzgETg\nTeAvO3a0OeIlMTGxZaGO6upqSkrK2bZtPeXlcURHOzv3QJvH3FONjQ3Ex9eTkpJidSjKh/QKXYWM\n9evXM3DgQMYAX7Tx/IzTTuPBRYvcOpYxhsrKSvbsKWfbtkqamhKJiXGOcQ/GlEVZ2S7697eTm9vT\n6lBUB+gVugobBQUFjBw5smV70IQJ1C5axIFzNdYCEdnZbh9TRFrGuPfr56CiosK1SMc2mpuDb5EO\nZ6l/H6vDUD4WHK/GEOT1cehH8s9/QkmJ/87noY62xaJFixCRls582bJlGGP4/SuvMKNvX2pd+zmA\n97t1Y+pDD3XoPBEREWRkZDBokHOM+8iRqWRklGKzrXaNca88ZIx7R/liHHpdXS1paRIQC1J7wq3X\nxaOPOguPFKBX6OFh5Up46y344IOQyK/PmzePn//85y3ba9asYdCgQS3bvfv04XcLF/KX++7DsXMn\nPWNiuKaggMi4uE6fOyoqiszMTDIzMxk4sMm1SMcuSku3AOkti3QEkpqavQwdGtgTcXVYZKRzZNei\nRRAkn5Z8SXPo4aChwVlwdOutcM01VkfTYbNnz+baa68FnNPsrl+/3v2Ji2bOhHHj4LjjfBJbQ0MD\nNls5xcU2bDY7EREZrnncE3xyPncZYygrW82ECQOCojrUY83NzkUxLroIpk+3Ohqf0SXo1E999x1M\nmOAsOOoTPLlUYwxPPfUU011v1pycHAoKCugWwKvZ1NXVuca426iqgshIZ+ceG9v5Twieqq6uIDV1\nD8OG9ff7uf3mxx9h1ChYvNi5gHoIcrdD188oFvFrDh2cUwHcfbdzZfXmZv+eux1ttYUxhnvvvZeI\niAimT5/O0KFDXemNbQHdmQPEx8eTk5PN6NGDOfXUPvTv78Bu30RJyTr27t1NU1PjYX/W2zn0urq9\n9OwZZKX+Lm6/R44+Gh57DK64wvlpNIxpDj2c3HYbbNwIu3dDjx5WR9Om5uZmbrzxRl5++WUAJkyY\nwMcff0xCgrWpi47aP8a9V68e1NTUUFJio7h4PeXlsURFZZCSkk5UlG/mkLHb7URFVZOenuuT4weU\na6+FPXugtjasp7zQlIsKCI2NjUyZMoW5c+cC8Mtf/pI33ngjJCfMMsZQVVXF7t02tm+vpLExkZiY\ndJKT0706xr28vJQePaoZMOBorx1TWUPHoaugsG/fPiZOnNjy8fqGG27g+eef933xzh13wKRJMGKE\nb8/TBhEhNTWV1NRU+vVzUFlZ6Rrjvh273Xtj3JuabGRnd/dS1CoYaA7dIn7PoQeYiooKhgwZQmJi\nIvn5+dx77704HA5eeukl/1RinnACXHkl1NX5/lxHEBERQXp6OgMH9mXChCE0Nq6hS5cyystXU1JS\n1OEx7qFQ6h/u75GO0Ct05Ve7d+9m+PDh7Nq1C4Ann3ySvLw8TjvtNP8GMnmyc5Wn3//eOd1wAIiM\njCQ1NZWhQ/sxcKDddRN4NyUlWzAmrWWMe3srMAFUVdno3z/DrX1V6NAcejhzOODee52dmo+v5IqK\nijjuuONobHSO8Jg9ezZTp0716TnbZbPB8cc755D/2c+sjeUIGhsbsdnK2bbNRllZEyLpJCVlEB9/\n+MrPkpI1nHpqn6CrDvUau935R/vFFyEE1oTVYYuqfRERUFbmLDjykbVr1yIiHH300TQ2NvLBBx9g\njLG+MwfIyIBXX3WOkKiosDqaw4qJiaF7926MHDmA0047liFDIomM3EJJyRrKynZQX//TtFGwlvp7\nVVSUczjjtGnO6aTDhHboFgmY/OCTT8LnnzvTD160fPlyRITBrkKPxYsXY4zhoosuOmRfS9vizDPh\nz392dgABoL22iIuLo0ePbE4+eRDjxh3NgAEGY36gpGQdZWW7aGxsoKZmL717B3+pf6dfF3/8o7Po\n6B//8Eo8wcCdRaJfFZE9IrL6CPs8KyLfi0ihiOR5N0TlU8nJ8NprcMMNznG8nbRw4UJEhJNOOgmA\nFStWYIwJ7IUKJk0KyiXNEhIS6NUrhzFjhjB2bC/69Wuivn49sbGl2O12mpqarA7RWrGx8PrrcOed\nYTOBV7s5dBEZA9QArxljDln3SUTOAW4yxkwUkVHAM8aYkw5zLM2hB6o//AHWrHFeqXfgRtrcuXP5\nxS9+0bK9fv16jvPRvCnq8MrLy1m06EcSErogUkH37gnk5GSQlpYW9It0dNgTT8D8+c4JvIJwLnvw\n4jh0Y8x/RaT3EXa5EHjNte9yEUkVkW7GmM5f7in/eeABeOQRaGz0qNJu1qxZTJs2DYDk5GTWrFlD\nr169fBSkas+uXTbS0nqTlpaJw+GgoqKKXbtsREZuJzs7iexsZ+ceLPO4e8Xtt8NRR1kdhV9447fa\nA9h2wPYO12PqCAImh75fTAw8+KBbnbkxhscffxwRYdq0aeTm5lJSUkJVVVWHOvOAawsLP0V2pi3s\ndjvbt1eTnJwOOMe4JyenkZV1NGlpQygpyWD5chuLFq1m/fofqaio8No87r7gtddFZKRznpcgvTr3\nhN8/g02dOrVlytO0tDTy8vJa8qv7f4G6HZjbixcvZubMmbz77rsAHHvssTz55JNMnDixU8ffz+r/\nX35+PjgcjH/wQZg1i/ydO/1+/sLCwg7//Pz589m4cR8/+5nzNtb+ib5GjBhPZGQk33/vvA2WlzeG\nHTvK+eijj4mObuD8839Gt24ZfPPNN4hIwLzeCgsLLT2/ldv5+fnMmTMHwP0ponFzHLor5fLxYXLo\nfwMWG2PedW1vAMa1lXLRHHpw2FpUxJz77sOxYwcRPXpw5QMP8PCjjzJ79mwAzjzzTObNm0d8fLzF\nkfrICy84bxQvXRowo1/csXLlRqqru5OUlOr2z9jtTVRW2mhuthEf30ivXulkZWWQFIQ3iUOZV+dD\nF5FcnB36kDaeOxf4reum6EnA03pTNHhtLSriuTPO4MHNm0nEuRbnFOBD4PLLL2fOnDkhOWHWTxgD\nZ58No0fD/fdbHY1bGhoaWLRoA127Du1wdWhjYwNVVTYcDhvJyQ56986gS5f0oJ3p8oiMCarVu7xW\nWCQibwFfAseKSLGIXCMi14vINABjzP8BRSLyAzATuLGTsYeFg9MNgWLOffe1dOYAicCbwIzLL+fN\nN9/0SWcecG0hAn//Ozz/PKxY4ddTd7QtyspsiHSu1D8mJpbMzKPIyhqEyDGsWweff76Zr75ay86d\nu2jw81zjPntdlJQ4F8SoqvLN8S3kziiXy93Y5ybvhKOsZLPZ+PJ//5eD6wsTAeOaeyVs9OgBzz7r\nnMDr228Dfo7tLVv2kpTkvZWo4uLiiYvrAfSgrq6W1attGLORzMxoevbMICMjPXiXtMvKgqFDnesD\nvPqq1dF4lc7loti5cyd5eXmUlpZyDFAIP+nUa4G/TJnCjDfesCZAK33xBYwZE9Afz2tra1myZAtZ\nWYPa37kTjDHU1lazb185EREVdO0aR8+eGaSnpwffGPfqasjLc1ZKX3ih1dG0S9cUVe3avHkz/fr1\naxm69sYbbzDmlFMOyaHP6NuX3y1cSO8gWos0nPz4YzHffx9NZqb/xlobY6ipqaSurpzIyEq6d0+k\nRw/nGHe/TH/sDf/9L/ziF85PYFlZVkdzRNqhB7j8/PyW4Ur+tnr1ao4//viW7fnz57cMPYQDRrns\n3ElEdjZTH3rIp525lW0RaDxtC2MM+fmriY8fQHS0NSkQh8NBdXUFDQ02oqJq6NEjmaOOyiA1tXOL\ndPjldXHPPbBpE/zv//r2PJ2kKxapQyxdupQxY8a0bC9ZsoSxY8cesl/vPn3CM70ShCorK6mvjyMl\nxbp8dkREBKmpGUAGdrudXbsq2Lq1lJiYrfTsmUa3bumkpKQE5tzsDz4I331ndRReo1foYWDBggWc\ne+65LdurVq0iL0/nUOuQ+nqIi7M6ihbr1m1m165U0tIyrQ7lEHZ7E1VV5djtNuLiGujdW8e4d5Sm\nXBTvvPMOkydPbtnetGkT/fr1szCiIGezwfDhzoKjHtbPbmG321m0aA1paUMCPm/d2NhAdXU5zc02\nEhPt9O6dQdeuGaE5xt0HdIGLAOfLsdcvvfQSIsLkyZPJyMhg27ZtGGMCtjMPuHHoh5OR4VwM49pr\nfTbfiydtUV5eTnNzSsB35uAc496lS3eysgYSGdmPjRsj+PzzH1m6dA3bt++kvr7+kJ8JmtdFANEO\nPUQYY3j44YcREW688Ub69etHWVkZe/fuJScnx+rwQscf/uBc3ejFF62OhG3bbCQkdLE6DI/FxcXT\npUs2WVmDMaYPa9c6WLx4E8uXr2PXrt0tyxRaxuKFwztDUy5BzuFwMH36dJ52LXQ8atQoFi5cSHJy\nssWRhbBNm+CUU5ypl/79LQnBG6X+gcQYw759NdTW2hCpoGvX2JYx7n6damL5cueydV9/HVDFZJpD\nD3F2u51rr72W119/HYCJEyfy/vvvExtAL8KQ9tJL8M9/wuLFlpx+x45dfPedna5de1pyfl9yFjBV\nsW+fjYiISo46KpHs7HTS09N9n14yBi65BI45xrk0YYDQHHqA62h+sL6+nnPOOYfo6Ghef/11rr76\napqampg/f37QduZBmSu94QafrFXpbls4S/2Df93QtogISUmpFBdvJSNjKHv3ZrJiRSWfffYd69Zt\npry8HIfD4auTw8yZ8MYbsGSJb87hQzoOPUhUV1dz+umns8I1WdTtt9/OE088EV4rzwQSEbBoZaba\n2lqqqoSsrINn3Qk9ERERpKSkk5KSTnNzs2uMexnR0Vvp2TOV7t0zvD/GvWtXmDULrr7aWUWakuK9\nY/uYplwCXFlZGSeddBKbN28G4JFHHuH3v/99SORNVcdYUeofaOx2O9XV5TQ12YiLq3cVMDnHuHvt\nvXH99ZCY6JzvxWKaQw9y27dvZ/DgwVRWVgLOoYg33HCDxVEpqwVCqX+gaWpqpKrKOcY9IaGJ3r3T\n6do1g8TETn6CqamBpiZIT/dOoJ2gOfQAd7hc6aZNmxARevbsSWVlJW+//TbGmJDuzIMyh34wY8C1\nZF1ntNcW+0v9w6Ez37+EXnuio2Po0qUbWVkDiI4+lo0bI1myZAtLl65h27Yd1HV0GGJSUkB05p7Q\nHHqAWLVqFcOHD2/ZXrBgAWeffbaFESmPrF4NEyc6/83w3c3KnTv3EhMTfGPP/SU2No7Y2Gwgm/r6\nfaxda8OYH8jIiKRnz3S6dMkI2sED7tCUi8WWLFnCuHHjWraXLl3KKaecYmFEqsNuvRV274Z33vHJ\n4YOp1D/Q7B/jbkw5WVmx5OQ4F+kIluUUNYce4ObPn8/555/fsr169WqGDDlkyVYVTOrq4IQT4L77\n4IA5dLyltLSUgoJqsrKO9vqxw0XrIh3OAqbu3RPIyXHO497uIh2NjVBeDt26+SfYA3g1hy4iZ4vI\nBhHZJCJ3t/H8OBGpEJGVrq//6UjQ4eD1119HRDj//POJiorihx9+wBgT1p15SOTQAeLj4fXX4ZZb\nYPv2Dh3iSG0RrKX+HeVuDt0TzjHuKWRl5dKly1AqKrJYsaKKRYvWsGbND9hstsOPcX/rLWfRUXOz\n1+PyFncWiY4AngfOAgYBk0XkuDZ2XWKMGe76etjLcQY1YwzPPPMMIsJVV11Ft27dmDt3Lk1NTfTt\n29fq8JQ3nXAC3HwzPPqoVw/b0NDAnj31JCYGz5joQBcREUFychpZWUeTljaEkpIMli+3sWjRatav\n/5GKigp+klG46iqIjoYnnrAu6Ha0m3IRkZOAGcaYc1zb9wDGGPP4AfuMA+4wxpx/mMPs3y+sUi7G\nGB544AH++Mc/AjBw4EC++OILMnx400wFALvd+eXFedNDudQ/0LSOcS8nNnZfyxj35ORkpLgYRoyA\nhQuda5L6iTdXLOoBbDtgeztwYhv7nSwihcAO4E5jzDq3Ig1BDoeD3/3ud7zompFv7NixLFiwoPPj\nYlVwiIpyfnmRs9Rf13T1h6ioKNLTuwJdsdubKCqy8cMPO4iPb6RXr3SyH3mEuCuugIKCgFrsBLw3\nDv0boJcxJg9nemael44bVJqampg8eTKRkZG8+OKL/PznP6ehoYElS5Yc0pmHTN7YC7QtWrXVFvtL\n/ePjw+uCwBc5dE9FRUX/ZIz7mjV2/t11OGVdj6L+lVesDu8Q7lxG7AAOnLQix/VYC2NMzQHfLxCR\nF0UkwxhjO/hgU6dOJTc3F4C0tDTy8vJaFoLd/2IOtu1Ro0ZxwQUX8OmnnwJw3XXXMXPmTL744gu+\n/PJLy+ML9O39AiUeK7cLCwsPeb5Xr6OJiMho6eBGjHA+H+rbGzcWWnL+vLzRNDTUs2LFZzQ3NzJ0\n6DCgnjVrlpGQEM1pp51Kw6y/sfLHzcQcsJC1N18P+fn5zJkzB6Clv3SHOzn0SGAjcDqwC/gamGyM\nWX/APt2MMXtc358I/NMYc0gUoZZDr6ys5LTTTmPVqlUA3H333fzpT3/SeVbUT1VWwq5dcFxbYwmO\nTEv9fcMYQ2NjA42N9TQ01GNMPeD8io0VUlPjSEmJIzk5jrg451dMTIxl722v5dCNMc0ichPwCc4U\nzavGmPUicr3zafMycKmI/AZoAuqAyzoXfmArKSlh5MiRFBcXA/D4449z5513akeu2pafD3feCatW\nOSd78sD+Uv+UFO3MO6K5ubml025qau20RRpISoqhS5c4UlPjSEhIIi4uk7i4uPbHowcwLSzywNat\nWxk0aBC1tbUAzJo1i1/96lcdOlb+AR/Vwl1YtMWVVzqnYX3hhSPudnBbrFu3mV27UklLy/RxgIGn\noCC/JR3SnqamRhoa6mlsrKe5ubXjjopqJiUlruUrPt55tR0bGxtUU097c5RL2Fu/fj0DBw5s2Z47\ndy6XXHKJhRGpoPPcc3D88XD++eDmHD12u53t26tJS8v1bWxBwuFwtKRJGht/miaJj48kJcV5tZ2U\nFEdcXFpLmiSc6BX6ERQUFDBy5MiW7YULF/Kzn/3MwohUUFu0yFmc8u230KX9is9wLfW325tarrbt\n9tZOOzLSTnJybEt++8Cr7VCf20bncumERYsWcfrpp7dsL1u2jFGjRlkYkQoZt98OAweCG6m6lSs3\nUl3dnaSkVD8E5l/BdlPSatqhd8AHH3zAxRdf3LK9du3an6RavCks8sZuCqu2cDjgCLnb/W3R0NDA\nokUb6Np1aFB3Yu3dlNyfJklIaO2499+UDKvXRTs0h+6B2bNnc+211wIQFxfH+vXrPRr7qZTb3LwR\nV1ZmQyQjaDrz9m5KZmbuT5NkBOVNyWARtlfoxhiefPJJ7rjjDgBycnIoKCigmwVTYyp1sKVL12BM\nn4CqDvXspmRcWN6U9BW9Qj8MYwz33nsvf/rTnwA4/vjjyc/PJy0tzeLIlHLaX+qflWVNZ97eTcnu\n3fdfbacSF9ctLG5KBouw6dCbm5u58cYbefnllwGYMGECH3/8MQkJCZbEo/nBVmHdFgUFzrUrXVWk\n+fn5LaX+vuTZTckUS25KhvXrooNCvkNvbGzk8ssv5/333wfgl7/8JW+88UbQLD2lQtzKlTBzJnz1\nFcTEYIxh69ZyUlMHeOXw4VYpGe5CNoe+b98+zj33XD7//HMAbrjhBp5//nn9aKgCizHOYqNhw+Ch\nh6ioqOCrr/aQldXfo8OEeqVkuAvbYYsVFRWMHTuWNWvWAHDvvffy0EMPBc1oARWGdu92LpbwwQes\nS806bKm/3pQMX2HXoe/evZvhw4eza9cuAJ588kluvfXWgO3INT/YStsCeP99zD338OTUWzn5tOuw\n25tobPxpmiQy0k5KSvhUSurrolXYjHIpKiriuOOOo7GxEYA5c+Zw9dVXWxyVUh665BKaPv2U+N3b\naGjYGBA3JVXwCdor9LVr1zJ48OCW7Xnz5nHhhRd65dhKWaW5uTkkr7ZV54TsFfqyZcs4+eSTW7YX\nL16sH8tUyNDOXHVG0NzmXrhwISLS0pkXFBRgjAnazvzg5dfCmbZFK22LVtoWngv4Dv29995DRDjz\nzDMB59zkxhhOOOEEiyNTSqnAErA59FmzZjFt2jQAkpOTWbNmDb169Wrnp5RSKvS4m0MPqCt0YwyP\nP/44IsK0adPIzc2lpKSEqqoq7cyVUqodbnXoInK2iGwQkU0icvdh9nlWRL4XkUIRyfMkCGMMd911\nFxEREdxzzz2MGDGCyspKioqK6Nq1qyeHChqaH2ylbdFK26KVtoXn2u3QRSQCeB44CxgETBaR4w7a\n5xygrzGmH3A98Dd3Tt7c3Mw111xDREQETzzxBGeeeSb79u1jxYoVpKSkePyfCSaFhYVWhxAwtC1a\naVu00rbwnDtX6CcC3xtjthpjmoB3gIMHfF8IvAZgjFkOpIrIYScWb2ho4KKLLiIqKoo5c+Zw+eWX\n09jYyH/+8x/i4+M7+F8JLhUVFVaHEDC0LVppW7TStvCcOx16D2DbAdvbXY8daZ8dbewDwOjRo4mL\ni+PDDz/k5ptvprm5mTfffFNnP1RKqU7y+03RL7/8kgceeACHw8EzzzwTtjO+bdmyxeoQAoa2RStt\ni1baFp5rd9iiiJwEPGCMOdu1fQ9gjDGPH7DP34DFxph3XdsbgHHGmD0HHSsw1p9TSqkg463S/xXA\nMSLSG9gFTAImH7TPR8BvgXddfwAqDu7M3Q1IKaVUx7TboRtjmkXkJuATnCmaV40x60XkeufT5mVj\nzP+JyLki8gNQC1zj27CVUkodzK+VokoppXzHb3ck3SlOCgci8qqI7BGR1VbHYjURyRGRRSKyVkS+\nE5GbrY7JKiISKyLLRWSVqz0etTomK4lIhIisFJGPrI7FaiKyRUS+db02vj7ivv64QncVJ20CTgd2\n4szLTzLGbPD5yQOMiIwBaoDXjDFDrY7HSiLSHehujCkUkSTgG+DCcHxdAIhIgjFmn4hEAkuB6caY\npVbHZQURuQ04AUgxxlxgdTxWEpEfgROMMeXt7euvK3R3ipPCgjHmv0C7v5hwYIzZbYwpdH1fA6zn\nMPUL4cAYs8/1bSzO92ZYvk5EJAc4F3jF6lgChOBmX+2vDt2d4iQVxkQkF8gDllsbiXVcaYZVwG4g\n3xizzuqYLPIUcCegN/icDLBQRFaIyK+PtGN4VvWogOJKt8wFbnFdqYclY4zDGDMMyAFOFZFxVsfk\nbyIyEdjj+uQmrq9wN9oYMxznp5bfutK2bfJXh74DOHD+2xzXYyrMiUgUzs78dWPMh1bHEwiMMVXA\nv4ARVsdigdHABa688dvAaSLymsUxWcoYs8v1bynwAc4Udpv81aG3FCeJSAzO4qRwvnutVx6t/g6s\nM8Y8Y3UgVhKRTBFJdX0fD5wBhN10g8aYPxhjehljjsbZTywyxlxldVxWEZEE1ydYRCQROBNYc7j9\n/dKhG2Oagf3FSWuBd4wx6/1x7kAjIm8BXwLHikixiIRtEZaIjAamABNcQ7JWisjZVsdlkaOAxa4c\n+jLgI2PMZxbHpKzXDfjvAa+Lj40xnxxuZy0sUkqpEKE3RZVSKkRoh66UUiFCO3SllAoR2qErpVSI\n0A5dKaVChHboSikVIrRDV0qpEKEdulJKhYj/B48LGYLHpWijAAAAAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x107232350>"
]
},
"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": [
"### Matrix multiplication 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 product $VP$:"
]
},
{
"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,*} 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,*} 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 $VP$ to see this:"
]
},
{
"cell_type": "code",
"execution_count": 96,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x1069c4690>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"P_rotated = V.dot(P)\n",
"plot_transformation(P, P_rotated, \"$P$\", \"$VP$\", [-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": [
"### Matrix multiplication 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 matrix multiplication:\n",
"\n",
"$f(\\textbf{u}) = F \\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 $FG$ results in the linear transformation of all vectors $\\textbf{u}_i$ as defined by the matrix $F$:\n",
"\n",
"$FG = \\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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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x106806c50>"
]
},
"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} 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 0x106b8b790>"
]
},
"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} 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 0x106c90710>"
]
},
"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} 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 0x106cb6090>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_transformation(Square, F_squeeze.dot(Square), \"$Square$\", \"$F_{squeeze} 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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\nXPAjHzE3LFtazGMJbLnOkYhZT2WmkRF45BHzKeT55y1L3PJ77QxSNhHOMzEB3d3m439Xl3kuEDDJ\neinrc4+PQ28vfPnL0zckP/95s15JLvzgB7Bvn1m86q674KMfhf37F/fHIRIxKyPW11/+tWPH4OxZ\nM8Ho0UfNH6NYzHy6eO974WtfW2okogBI2UQ4QzxuElK2Lg1mO7NAIHcbKvzkJ/Av/2LeY8MG89zf\n/R38wR+YndyX6tprzXscOwZ3322S77FjizvXO94BP/6xmeJ/qa98BT72MbPhxC23LK3NwvFknLdw\nnuxO6tmEncmYMkhTkzWbGLS3m5t4sdj0c5/6VG7e69Qps/nC2rXm8eKLZuTKYoyOmk8JsyVuMKWf\nQEDGcbuc1Lwt5MQ6mdWuGnMiYcZhP/ss7N4NP/2pKWUsW2ZGigSD1u0+c/AgbN5sknh2tuXM9zp0\nCP75n01S/OhH4Z3vNCNRwIwff/xxMxTxsccu2iNz/z/9kxlb7fHAZz5jzv3CC3DnndPnnu37Jyfh\nr//a/Bw++1lzM/aZZ+AP/9B8EvjbvzVJ/FIvvGDKMjbtfym/184gPW9hvWTSjLE+ftw8MhkzdC+f\nu86cOmVu6G3ZYkatnD9vVgycqbfXjOJ4/HH47/827a6tNe397d+GJ5805ZavfMX0juvqABjZtMkk\n5/p6U4IBk2C/8AXz79m+f2QEfv/3zUzO1lZz83T7djNk8cABM1HokUcuj6OtzYwwuece635WoiBI\nzVtYI5UyCfLYMXj7bZMIq6pMzzqfu810dJgp8SdOmD8gK1eaPxqPPGJmU17quefg6183veGsH//Y\n9Jb/8i9Nkr7xxstLIh/+MPzxH8Ptt5vY162brt3P9v2Tk/AnfwK/+pV5TXe3uSELJpn/279dPN78\n0CEz5X3/fhPLjh3mE8IXv5irn5RwKKl5C+tlx1KfOGHq2KmUGa7W0GDf9mCrVpm69qXt7O2dfZ3v\n//mfy4fgHTkCv/Eb8IEPzP0+hw+bkgzAq6/Ctm3mJqzXO/v3f/7zF0+wySbuRMJ8SrjmGtPDzo42\n2bwZvv3t+cctip7UvC3kxDpZzqXT5qbj3r2wezeRz33OlEbq600Nu77eefs6Zve2zA5DnOnFFy9P\n3tdeO73lGZia+YEDFw4jzz9vyiDBoHli3z647TbT45/r++Pxi1c07Ow0Sb69Ha6/3jz39a8vIUjr\n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\nAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x106f6d510>"
]
},
"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} 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 0x1070c0a50>"
]
},
"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 0x107380610>"
]
},
"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": "iVBORw0KGgoAAAANSUhEUgAAAXMAAAEACAYAAABBDJb9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3WlwVNed9/HvkYTUoH1HSIAAGxsCGGIm3hIQ9pM8ziTl\nOJsnGafykKk8M5lKJrsnHqcyeTFVJC8mY4+TcaUSOyGOnXjKnsxjO5k4zGCEl3gBG7BsbHBssyNA\nrR2hpdXneXElEEJILfXtvrdP/z5VKvdydfv83Zd/H/369G1jrUVERDJbTtADEBGR5KmZi4g4QM1c\nRMQBauYiIg5QMxcRcYCauYiIA3xr5saYHGPMy8aYx/zap4iIJMbPmflXgL0+7k9ERBLkSzM3xjQA\nfw7c68f+RERkevyamd8J3Abo46QiIgFIupkbYz4EnLDW7gbMyI+IiKSRSfbcLMaYTcBngBgwGygG\nfmOt/ey47TRrFxGZAWvtlJPkpGfm1to7rLULrLWLgU8BT45v5GO2dfbnu9/9buBjUH2qTfW595Mo\nrTP3yYEDB4IeQkq5XJ/LtYHqyxZ5fu7MWrsd2O7nPkVEZGqamftk48aNQQ8hpVyuz+XaQPVli6Tf\nAE34gYyx6XosERFXGGOw6XgDVDzNzc1BDyGlXK7P5dpA9WULNXMREQcoZhERCTHFLCIiWUTN3Ceu\n53Yu1+dybaD6soWauYiIA5SZi4iEmDJzEZEsombuE9dzO5frc7k2UH3ZQs1cRMQBysxFREJMmbmI\nSBZRM/eJ67mdy/W5XBuovmyhZi4i4gBl5iIiIabMXCTLxeNx2tvbGRgYCHookgZq5j5xPbdzuT7X\nauvv7+fAgcNs397CU08d4Le//V3QQ0op156/mfL1O0BFJBjxeJzOzk4OHjxFa+sAOTmVFBUtZfbs\nfeTmlgQ9PEkDZeYiGay/v5/W1lO88047/f1zmD27mqKiUowxdHZGqa3tYMWKS4IepiQh0cxcM3OR\nDDPRLLyk5HJKSgrO225wMEp9fXVAo5R0U2buE9dzO5fry5TaxmbhL7wQpaurlurqlVRV1ZOfP76R\nDxCJnKGsrCxj6psp1+tLlGbmIiGW6Cx8vJ6eKEuXVmDMlH+diyOUmYuE0GRZeCJOnmxh/folzJkz\nJ8UjlVRTZi6SYWY6Cx/v9OkeKitz1cizjDJzn7ie27lcX9C1TScLT8Tp0200NladvR50fanmen2J\n0sxcJAB+zcLHGx4eJje3i4qK+T6NVDKFMnORNEo2C59KZ2cbdXVdLF++xJf9SfCUmYuERKpm4RMZ\nHGyjvr7O9/1K+Ckz94nruZ3L9aWqNr+z8KkMDPRTWDhIScn5H993+bkD9+tLlGbmIj6Kx+N0dHRw\n6FBbymfh4/X0RFm2TGvLs5UycxEfpDoLn4q1llOnWtiwYSmRSCQtjynpocxcJMWCnIWPd/p0NzU1\n+WrkWUyZuU9cz+1crm+6tY3Nwl98sT3lWXgi+vqiLFhQOeF9Lj934H59idLMXCQBYZqFjxeLxcjL\n66aiYmHQQ5EAJZ2ZG2MKgKeA/JGfR621d0ywnTJzyThBZ+GJaG8/yYIFp7nsskVBD0VSIG2ZubV2\nwBizwVrbZ4zJBZ41xlxnrX022X2LBCHMs/CJxGJR6urqgx6GBMyXzNxa2zdysWBknx1+7DeTuJ7b\nuVzfaG1hzMKn0t9/huLiGMXFxRfdxuXnDtyvL1G+ZObGmBzgJWAJ8GNr7V4/9iuSavF4nK6uLnbt\n2pcRs/DxenraWLGiMlSxjwTDl2ZurY0Da4wxJcAWY8x6a+328dtt3LiRxsZGAMrKyli9ejVNTU3A\nuVfXTL0+eltYxqP6Jr++ZcsW2ts7qa29jPz85Wzfvo/ZswtZu3YVADt3etuvXdsU4uuWhQsrqK6+\nfNJ6m5qaAv//ncrrrtXX3NzM5s2bAc72y0T4/qEhY8x3gD5r7Q/G3a43QCVQE2fhVaGNUKbS09NJ\naekJ1qy5LOihSAol+gZo0pm5MabKGFM6cnk28H5gd7L7zTSjr6yuyuT6psrCR2e9mebMmTYWLKia\ncrtMfu4S4Xp9ifIjZqkDfmG80C4H+KW1dqsP+xWZsUxbkTJdsdgQ+fm9lJcvDnooEhI6N4s4JRPW\nhfuhvf0EjY1nuPTSxqCHIimmc7NI1nB9Fj6RWKyNujp94lPO0blZfOJ6bhfG+vxaF55pmfmZM6cp\nLbUUFRUltH0Ynzs/uV5fojQzl4ySjbPw8Xp7o6xaNfFJtSR7KTOXjJAtWfhU4vE47e0tbNiwjPz8\n/KCHI2mgzFwynmbhF+rp6WTevDlq5HIBZeY+cT23S2d96T5HSiZl5gMDUerrpxex6NjMDpqZSyho\nFj61oaFBIpE+ysqWBD0UCSFl5hIoZeGJa2s7zqWXDrF48YKghyJppMxcQkuz8JmJx6PU1uoLKGRi\nysx94npu50d9YT1feCZk5n19vVRU5FBYWDjt39WxmR00M5eU0izcH729baxZo7XlcnHKzCUllIX7\nx3tBfIUNG97FrFmzgh6OpJkyc0k7zcJTo7u7g4aGYjVymZQyc5+4nttNVl9Ys/BEhT0zHxxsY968\nmUcs2XxsZhPNzGVGxs/Cc3OrKC7WLNxvg4MDzJ7dT2lpadBDkZBTZi7Toiw8vaLRY1x2WZyFCxuC\nHooERJm5+Eaz8GBYaxkejlJTc0nQQ5EMoMzcJy7mdmOz8Hvv/f3ZLLyycl5GZOGJCmtmfvp0D9XV\necyePTup/bh4bI7len2J0sxcznOxWXhZWQfFxWVBDy+r9PVFWb586i9sFgFl5jJCWXi4DA8P09nZ\nwvXXryAvT3OubKbMXKakLDy8urvbmT+/RI1cEqbM3CeZlNtdbF34ZFl4WHNlP4SxtqGhKPX1/kQs\nmXRszoTr9SVKL/tZQrPwzNHff4bCwkGKi4uDHopkEGXmjlMWnnna2o6wfLlh/vz6oIciIaDMPItp\nFp65rLVY20519dKghyIZRpm5T8KQ280kC09UGHNlv4Sptt7eLmpqCohEIr7tMwzHZiq5Xl+iNDPP\ncJqFu+XMmSgrVui85TJ9yswzlLJw98RiMXp6XmXDhpXk5uYGPRwJCWXmDtIs3G1dXVEWLSpTI5cZ\nUWbuk1TmdqnMwhMVplzZb2GpbXg4yty5/kcsrmfKrteXKM3MQ0qz8OzS399HScmw1pbLjCkzDxll\n4dnp5MlDXHHFLObNqwt6KBIyyswziGbh2c1aizEdVFUtC3ooksGUmftkJrldGLLwRIUlV06FoGvr\n6emkrm42+fn5Kdm/65my6/UlSjPzNNMsXMbr748yf77OWy7JSTozN8Y0APcDtUAc+Km19u4Jtsvq\nzFxZuEwkFhuit/c1NmxYRU6O/lCWC6UzM48BX7fW7jbGFAEvGWO2WGvf8GHfGU2zcJlKV1eUJUvK\n1cglaUkfQdbaVmvt7pHLvcDrQNad7m1sbpdJWXiigs6VUynI2ry15amNWFzPlF2vL1G+ZubGmEZg\nNfCCn/vNBPF4nGg0qlm4JKyvr5eyMigsLAx6KOIA39aZj0QszcA/WWsfneB+ZzPzzs4uXn75Hfr6\nIhQVzVUWLgk5deogV1xRQF3d3KCHIiGW1nXmxpg84BHglxM18lEbN26ksbERgLKyMlavXk1TUxNw\n7k+lTLxeUJDP4cN7aWvrY/nydQwPx9i3bw+5ubmsXettP/qnvK7rOsCOHU/S3f02N9zwf4BwHc+6\nHuz15uZmNm/eDHC2XybCl5m5MeZ+oM1a+/VJtnF2Zg7ek7Fu3Tq6urpobe3g6NFuhobmkJ9fQVFR\nWcZ/Me/Onc1nG5FrgqitszNKbW0HK1ZckvLHam5uPts0XOR6fWmbmRtjrgNuBVqMMbsAC9xhrX0i\n2X1nmpycHMrLyykvL+eyy+JjGvsRpxq7JG9wMEp9fXXQwxCH6NwsaRCPx52dscv0DQ4O0N//Bk1N\nq/Teikwp0Zm5mnmaqbFLNHqMpUuHaWycH/RQJAMk2sz1SQWfJLrWdTSKWbZsMddfv4qrr65m3rxu\nenpe5eTJ/XR2thGLxVI72BnQOnP/DA9HqalJ31fDub4O2/X6EqWpYICUsWef06d7qKzMZc6cOUEP\nRRyjmCWEFMW46+TJd7jyykJqamqCHopkCGXmjlBjd8fw8DCdnS1cf/0KPXeSMDXzNEvHWtcgG7vW\nmZ9vzx749a/huedgaAiamiAvD2IxOHEC5syBL3wB3vWuc7/T2dlGXV0Xy5cv8XX8U3F9Hbbr9emb\nhhykjD08rrjC+/nIR+Dyy2HTpvPv/+EP4W/+Bh56CBoavNsGB9uor9fXwklqaGbuAEUxwTh+HG66\nCb75TfiLvzj/vueegy9/Gb72NfjLv4SBgX6Ghvazbt1KrS2XadHMPItoxh6MF18EY+DKKy+87513\nvPvKy73rPT1Rli2rUCOXlNE6c5+EZa1rqtaxa535RL8HxcVwyQSnV/nd77x45frrvS9sjsej1NQE\n89VwYTk2U8X1+hKlqZrDNGNPrZdegjVrzr+ttxd+8APIyYF77oGCAujt7aamJp9IJBLMQCUrKDPP\nQsrYk3fwIHziE17EsnIlWAt9fRCPwzXXwPr157Y9efJt1q4tprpaJ9aS6VNmLhelGXvyduzwMvEv\nfQlWrLj4drFYjLy8bioqFqZvcJKVlJn7JFNzu0QzdmXm59uxAwoLz19HPpHu7nYWLCglNzd3ZoPz\nQaYem4lyvb5EaeolZ002Y+/sPExnZ5tm7CNefhnWrvVm55OJxaLU1WXd95tLAJSZy5SUsZ9v3z74\nzGfgttvgllsuvl1//xms/RPXXbdCSxJlxvRxfkmJbG7sb70F997rNfMjR7ysfPly70NDEzl16jAr\nVuTS0DAvvQMVp6iZp5nr54eYqD5XGnsqzjtjraWt7RU2bLicgoICX/c9Xdl4bLpEq1kk5bQq5uJ6\ne7uorY0E3sgle2hmLr5zZcaejJMn/8R73lNOZWX6vlFI3KSYRUIhGxt7LDZEb+9rbNiwipwcrf6V\n5Og7QNPM9bWuM60vE77z1O819N7a8rLQNHIdm9nBzamRhFK2ZOyxWBt1dfrEp6SXYhYJnEtRzJkz\np8nJeYdrr53kM/4i06DMXDJSpjf2U6cOsWrVLObN0zcKiT+UmaeZ67lduuoLImP3KzOPx+NAO1VV\n4VrBomMzO4R/qiNZK9My9p6eTurrC8nPzw96KJKFFLNIxglrFHPy5JtcdVUlFRUVgY1B3KPMXLJC\nWBr70NAgZ868zvr1K0OzJFHcoMw8zVzP7cJanx8Zux+ZeVdXlIULy0PZyMP63PnF9foSFY6wUcQH\nk2fsheTnl6dsxh6PR6mtXeT7fkUSpZhFnHdhFONvY+/r6yU//xBXXbXch9GKnE+ZucgEUtHYT548\nwJo1s5k7t9bn0YooM08713M7V+q7MGOv4siRLSMZ+5vTXscej8fJze2ksjK8K1hcee4uxvX6EqXM\nXLLWaGNfuHAe69atmlHG3t3dQUNDMbNmzUrjyEUupJhFZJzpRDEnT+7jmmtqKSsrC2i04rq0ZubG\nmPuADwMnrLWrLrKNmrlknMkaezw+zMDAG6xfv0pf2Cwpk+7M/OfA//ZpXxnJ9dzO5fomq22ijH10\nHfuxY69SVBRneHg4fYOdAZefO3C/vkT5kplba58xxugEzuK08evYm5t3cfhwPtHoq8ydW0h9fTll\nZeE5V4xkF98y85Fm/rhiFskG3d3dPPvsUWpqlhGPx+nt7aK/v4OcnG41dvFVojGLjjSRGTh+PMqs\nWVWAN2MvKSmnpKSceDxOe3sXx451kJNzRI1d0iatR9fGjRtpbGwEoKysjNWrV9PU1AScy70y9fpd\nd93lVD3ZVN/YzDWR7YeHh3n88a3MmbOIq666ATh3fpe1a5soKSln//49WBsnP38hx4510NLy/6io\niHDzzTdSVlbGM888E9r6Mu26a/U1NzezefNmgLP9MhF+xiyNeDHLyovc73TM0tzcfPaJcZHL9U23\ntlOnTrFzZw81NYsT/p0goxiXnztwv750L038FdAEVAIngO9aa38+bhunm7lkj5deeoPe3jqKikpn\n9PvK2GU6dG4WkRQ4c+YMzc1vUl290pe15WrsMhWdmyXNxuZ2LnK5vunUdvJklJycSt8+JDT65mlN\nzWIqKlbR3l7Fjh3dbN36Knv2vElbW/Lfeerycwfu15covfSLJMhay4ED7RQXL03J/rUqRpKhmEUk\nQZ2dnTz33Alqai5L6+MqisluysxFfLZ371scP15KWVlVYGNQY88+yszTzPXczuX6EqktFotx5EgP\nxcXlqR/QJGaSsbv83IH79SVKL+UiCWhrizI8XEZubm7QQzkr0YxdsoNiFpEEvPDCXgYG5lNYWBz0\nUKakKMYtOjeLiE/6+vpobx+mpib8jRy0KiZbKTP3ieu5ncv1TVVba2sbOTnBvemZjJycHPbv35PS\ndexBc/nYnA69NItMIh6Pc/BgB6Wly4IeStI0Y3ebMnORSXR0dPD886eoqUnNB4XCQBl7uGmduYgP\nWlre5NSpSkpLK4IeSlqosYeP1pmnmeu5ncv1Xay2oaEhjh49TXFxZi/vGz3XeiLSca4Yv7l8bE6H\nXmpFLqKtLYq15eTkZOecRxl7ZlHMInIRf/zjq8Tji5g9uzDooYSKopj00jpzkST09vbS1WWoqVEj\nH08z9nDKzr8fU8D13M7l+iaqrbU1Sm5uZfoHkwLTycynKwwZu8vH5nTopVNknHNry98V9FAyytgZ\neywW49ixE+zff4Ti4kNcemkVS5YsCHqITlNmLjJONBrlxRc7qKm5JOihhJq1lsHBAYaGBhgY6Cce\n7wcGgH7y8oYpKiqgtDRCSUmE4uIiSkpKgh5yRlJmLjJDhw9HiUSqgx5GaMRiQwwM9DM0NMDQUD/g\nNW1jBigqyqeszGvahYVzKCgoJxKJkJ+fH/Sws46auU+am5tpamoKehgp43J9Y2sbGBigtfUMVVWZ\nvbZ8rJ07m1m7tmnSbYaHh8/OsAcHz82wYYCCAkNpaYTi4gjFxQVEIlVEIhEKCgp8+y7UZLh8bE6H\nmrnIGKdORYGKUDQpvyUSi9TVebFIJFJCJFJDJBIJ1Tnc5eKUmYuM8cwzLRizhEhkTtBDmbGpYpHR\nLLuw0JtdKxYJN2XmItPU09NDT08uNTXhb+RjY5GhoX6s9WbY1vYTieScfeOxqCh8sYikhpq5T1zP\n7Vyub7S2Y8fayMsLz3nL/YpFXH7uwP36EqVmLoI30z10qIuSkvlpf2ytFhE/KDMXAdra2tixo4ua\nmiUp2f/0YpGIYhE5S5m5yDQcPNjGnDl1Se1Dq0UkSGrmPnE9t3O5vi1btjA8PJfq6sQ+oRiLDZH/\n8lPMe+huKnZuI3ewn9Zrb4C8HPJm5ZJvY8xuPUp+SwsD3/8+OV/9aqCxiO/P3R//CHfdBU88AYOD\n8NGPwqxZMDQEhw9DURH80z/Bn/2Zf485CZePzelQM5es19nZRUnJ8vMijalikVlXNdDz/rup/F/r\nia1cScXDD18Yi3zhC0SWLAHX8u1rr/V+liyBd78bfv3r8++//XZoaoKWFli8OJAhZiNl5pLVrLU8\n/XQLPT1l5OZaLnZukUjkXJZ9NhY5eBAWLYKf/AQ+//kLd37vvXDllbBmTTpLSo/R2u++G770pfPv\n+8Mf4IMfhH/5F/jqV4MZn0OUmYskaN68MvLyDIWFs6e3WmTrVjDGa1yjHnkEPvEJ73J9PVx6aWoG\nHbTR2tevv/C+11/37qvW+W3SSecz94nr51R2tT5jDEeOvE1j43yqq6spKSlJPN/etg2WL/eaNkBb\nGzzwwLn7P/hBLz8OWEqeuyefhPJyWLnywvvuv9+LYD7+cf8fdwKuHpvTpWYuMlPbtoG18Fd/BR/7\nGDQ2ej/ZoLkZ3ve+82/r7obPfQ5ycryZeyQSyNCylTJzkZnYvx8uvxwefvjcDPSf/xkuuQRuvjk1\nj9ne7r2x+MorM/v95mZYsQKqkvyU62jtTU1w9dXeC1pvLwwPw403wk03Jbd/OY8yc5FUGs2M3/ve\nc7cND0+cIfulogIefXTmv3/bbfDb3178/q1b4bOfhQcf9Br1ZNsZA9//PrznPTMfj/jKl5jFGHOj\nMeYNY8x+Y8y3/NhnpnE9t3O5vhnVtm2bt+yutvbcbbfd5uXIqbRo0bR/pbm5GXp6oK/v/PGO198P\np097203mySehpCRt68in4vKxOR1Jz8yNMTnAj4AbgGPADmPMo9baN5Ldt0hoNTfDhz98/m05Y+ZG\nra3w7/8OBw7A2rUwMOAt57vlFnj6abjvPm9W+9JL8M1veitgBgfhe9+DhQvh6FFYt+5cLv3AA7B3\nr7evj30MOjvhzju9uOPVV+HrX4fKSu9xvvc9L7tvbYVbb6V6+3Zv+WR5OWza5C0XnDPBmSE/9CFv\nv1PZvh02bPBm5xIe1tqkfoCrgd+PuX478K0JtrMiTti921pjrL3vvotv88AD1vb3W9vQYG13t3fb\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 0x106c520d0>"
]
},
"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 0x106b0ef50>"
]
},
"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 0x106a0ea90>"
]
},
"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 0x1063a9b90>"
]
},
"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 0x1070a5c10>"
]
},
"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 0x1069c2e90>"
]
},
"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 0x106fb4650>"
]
},
"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
}