{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"###### Content under Creative Commons Attribution license CC-BY 4.0, code under BSD 3-Clause License © 2019 Lorena A. Barba, Tingyu Wang"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Transform all the vectors\n",
"\n",
"This is the first lesson in the module titled **\"Land on Vectors Spaces\"**, for learning practical linear algebra with Python. We take a visual and intuitive approach to illuminate some of the core ideas in linear algebra, enabled by computing. \n",
"\n",
"Linear algebra is a surprisingly useful subject, at the heart of computer graphics, cryptography, and machine learning. It is applied in data compression, game theory, and understanding networks. Engineering applications of linear algebra are everywhere: electric circuits, statics and dynamics, digital signal processing, optimization, robotics, multi-body dynamics… you name it!\n",
"\n",
"Whether you missed out on taking a college linear algebra course, or you did so a long time ago and need a refresher, this learning module can be your launching pad to the wonderful world of _vector spaces_.\n",
"\n",
"Let's get started! We will be using our favorite libraries of the Python ecosystem: NumPy and Matplotlib. We also have a few helper functions in the `plot_helper.py` script, which will make it easy to visualize the ideas in these lessons. \n",
"Go ahead and load these by executing the next two cells."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import numpy\n",
"%matplotlib inline\n",
"from matplotlib import pyplot"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"If you don't have the plotting script locally, you can get it by adding a code cell and executing this code in it.\n",
"\n",
"```Python\n",
"from urllib.request import urlretrieve\n",
"URL = 'https://go.gwu.edu/engcomp4plot'\n",
"urlretrieve(URL, 'plot_helper.py')\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"import sys\n",
"sys.path.append('../scripts/')\n",
"\n",
"# Our helper, with the functions: \n",
"# plot_vector, plot_linear_transformation, plot_linear_transformations\n",
"from plot_helper import *"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Vectors\n",
"\n",
"### What's a vector?\n",
"\n",
"Vectors are everywhere: physics, engineering, mathematics, computer science, video games, and more. Each field's interpretation of what a vector *is* may be different, but vectors live a similar life in every space.\n",
"\n",
"The first episode in the wonderful video series, [_\"Essence of Linear Algebra\"_](http://3b1b.co/eola) tells you of three different ideas about vectors [1]:\n",
"\n",
"1. For physicists, a vector is an \"arrow\" of a given length (magnitude) and direction. It can represent directional quantities like velocity, force, acceleration.\n",
"2. For computer scientists, a vector is an ordered list of numbers. It can represent a set of variables or features stored in order.\n",
"3. For mathematicians, vectors are generic objects that behave a certain way when they are added or scaled: $\\mathbf{u}+\\mathbf{v}$, $\\alpha\\mathbf{v}$.\n",
"\n",
" \n",
"#### How you think of a vector depends on who you are..."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In physics, vectors are almost always two- or three-dimensional (although in some fancy branches of physics they do go to higher dimensions). Vectors help physicists describe things like motion and electro-magnetic fields on a plane or in physical 3D space.\n",
"\n",
"In computer science and in data science, vectors are often multi-dimensional, that is, they have many components. They contain a set of ordered variables in a data model, like for example: the age, weight, daily hours of sleep, weekly hours of exercise, and blood pressure of an individual (five dimensions)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Visualizing vectors\n",
"\n",
"Let's start with the idea of a vector as an \"arrow\" (magnitude plus direction). We visualize a vector by placing this arrow with its tail at the origin of a coordinate system.\n",
"But changing the position of the tail doesn't change the vector's magnitude or direction, so the vector is the same no matter where we draw it. \n",
"\n",
"In the code cell below, we define a list with a single vector of coordinates $(2, 2)$, and we use our custom function `plot_vector()` to plot the vector with its tail at four different positions on a 2D coordinate system. "
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"image/png": "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LyYvL8+zWiKVl5cza9YsDj74YDZt2uR1OQAsWLCA0aNHM2XKFAYPHszYsWM97d8AixYt4txzz2X06NFcc801nHbaaSxYsMDTmqozxlxjjLHGmCFe1eD5T2zW5rHHHmPDhg20adPG61LYuXMns2bN4uOPP6Z9+/aEQiHGjx/PRRddxL///W9PanrjjTdYuHAhK1asoE2bNnz77bf06dOH8vJy7rrrrhqf01wBPm/ePB5//HESExObtN1ofPTRR1x33XXh6bFjxzJy5EjWrVvn6e8s37RpExdeeCEHH3wwFRWe/kGYKiZOnMiCBQs46KAovSfQAAATeElEQVSD6N27N9deey1nnnkmn332Ga1bt/akpieeeIIJEyYwZswYcnNz2bZtG7/4xS845phjOO644zypKVJ+fj7AVK/r8OWV+JYtW3jmmWe4/PLLvS4FgLZt27J06VLat28PQEJCAoMGDWL9+vWe1nT99deH3+Q6dOjAuHHjmD9/fo3rN+cQSrt27Xj77bfp2rVrk7ddX/fffz/Dhg0LT48aNYo9e/Ywd+5cz2oCKC4u5umnn+ass87ytI7qRo8ezemnnw44/fvqq69mw4YNrF692rOa7rnnHiZMmBCeHjhwIKFQiI0bN3pWU6Q//OEPAPd6XYcvQ/z3v/899957LykpKV6XAkCrVq3o3bt3eHrLli3MnTuXa6+91rOaRowYUeWPDAO0bt2a8vLyfdZt7jHws88+m1atWsWk7fpavnw5xx9/fHg6ISGBvn37smzZMg+rgp49e9KlSxdPa6jJwoULq0xXXn3X1J+aS9++fUlKcgYL9uzZwyOPPEKPHj0444wzPKup0uLFiytr+5fXtfguxCt3jt+uVMAJ7759+9KlSxdGjhxZ67CFVz744AN+/vOfV5kXj19ifv/99/z444/87Gc/qzI/MzPT83HeoPjggw/o0KEDp556qtelMGXKFM4//3zefvttXn/9ddLT0z2tp6SkhJtvvpn77rvP0zoq+SrEi4uLuemmm3j44Ye9LqVGHTt2JDc3ly+//JI33niDyy67zOuSwt58802+/vprbrnllvC8eAxwgNLSUoB9Pg0ccMAB4WVSu927dzNjxgxmzpxJcnKy1+Xw0EMPsWjRIgYPHsypp55aORbtmVtvvZXJkyf75jdjNkuIG2PucL/BrfXfF198wfTp05k8eXKVXyEaS3fccQfGmBr/HXjggQwdOrTGMcEOHTpw7733Mnv27Ca/46Gumirr+uKLL6o8Z8uWLUyePJlFixaFx8ibOsAbUpdXUlNTgX2HAnbv3h1eJrW79tprGTduHGPHjvW6lLDExERuuukmrLU89NBDntXx8ccfs3LlSiZPnuxZDdU1190pfwaerGuFrl275v/1r3/l888/D4/Pbdq0iYKCAoYMGULXrl2ZPXt2kxY1derUWg9GcXExn332Gb169QrfRRB5t0W3bt0AWLt2Lccee2yz1FRZ11dffRWe3rFjB6NGjeLxxx+nT58+QGyuwKOty0vt2rWjTZs2bNu2rcr8goICjjrqKI+qCoann36a5ORk7rnnHq9Loby8vMqnqYSEBLKzs1m7dq1nNS1ZsoRdu3YxbNiwylyovJPgYWPMD8Cl1tpm/ea1WULcWlsMFNe1Tk5ODitWrKhy+9cdd9zBc889R05OTkzqSk9Pr3V8raioiLZt25KUlMS8efPYvn07U6fuvZuo8iNdhw4dmq2myroq/7p8UVER5513HrfddhvDhw8H4IknnyJnq2nyIZRo6vKDYcOG8dlnn4WnrbWsXr2am2++2cOq/O0vf/kLBQUFvPzyyxhjyM3NBZwvGL3Qp08f1qxZU2Vefn6+p+P0t956K7feeivg9PkDDzxwPPB/wHXW2hwvavLVmLifzZkzh+3btwNQVlbG3XffTc+ePTnppJM8qaesrIxRo0Zxyimn0LFjR1atWsWHKz/iphf+N+7GwGsybdo03nzzzfD04sWLSUxM5JJLLvGwKv968sknmT9/PmPHjuWTTz5h1apVLF68mM8//9yzmtauXcvSpUvD0/Pnz+eLL77QMazOWuuLf2+99ZYtLCy01lqbn59vBw8ebI844gh7wAEH2MGDB9tnn33WNqfCwkJbWdPXX39tr776atu7d287aNAg27t3bztx4kT79ddfN2tNkXX9+c9/tsDef8ZYegyzDLnMMuQye+NTL9lQKNTsdRUWFtpFixbZwYMH2/bt29s2bdrYwYMH29mzZzdbLZWefvrp8P458cQT7Zo1a5q9hup2795tBw4caLt06WIBe/LJJ9tx48Z5WlNhYaFNSEio2p/cf8193kWaOXOm7d+/v+3fv7899thj7cknn2yXLFniWT3VXXnllRb40N1XnwDzrQfZaay1Hrx17CsnJ8f27dvX05+mi1RUVERubi5+qglqrssPd6H4cX9t3ryZrKwsANatW0f37t09rsjhx30FqitaRUVF+hub0nh+CHAR8Y5CPMCCHOB++AVZIi2BQjygghzg8+bNY9KkSSQkqPuJNJbOogCqCIW49MEXAxng4I9fkCXSUvj2V9FKzfZUVDD9HyvIyfsaCF6Ag/MLsprC/u5L9/rHs0Wag29CvKKigpKSEq/LCCspKfFdTXsqKvjV/c+HA/y/xg7lpvHDKS6u8+eomkVD9tdPP/1ERUUFRUVFDdpm5Z0n9VFaWtrg7TQ1P/YtUF3RKikp8cXdMr4J8V27drF27VrfjJOGQiFf1VQRClW5Ah8/4BjOOzbT09/3HKkh++v7778P3z4Waxs2bKCwsDDm26kPv/WtSn6sq7isnNVfFtCnU1tf1QXO/vLDL8HyTYinpKTQo0cP0tLSvC4FcN5l8/LyfFHTnooKLn3wxXCAXzSgOw9dPd7zX8kZ6c477+TBBx+sc52cnJzw73cBZ2y8pKSkwT/WvW7dujqXFxQUMHToUACys7PJzs5u0Haamp/6ViQ/1VVW/hOzX13BjIXLmHXthaSwyxd1RfLLJwPfhHhiYiJpaWm++HhSyQ81Vd6F8o/3PgWcIZTzjs0kPT3dV/vq+uuvZ8CAAfTq1avWN5dDDjkk/Ev+AZKTk0lMTGzw69jfD+9E1pGamuqr/eWHvlUTr+uqqAjx4rKV3PrsIr7euoMz+x3LiH7HkZub68v95Qe+CXHZV023Ed40frhvhlAipaen07ZtW9q3b68TTaJmreW1lWuYNusffP7llvD8ey+7wMOqgkEh7lO13Qfuhy8xRZrSh2u/5ManXuKdzzZUmf/L4SdzQtcs33wh7VcKcR8K8g/y1Mcrr7zCQw89xH/+8x/KysoYMmQIF198Mb/97W+9Lk2a0bfbf+Camf/NP979eJ9lyUmJ3P2b0R5UFTwKcZ9p6QEOzl+eHzVqlNdliMcOa9eG2yadS7sD05m19N0qy343eghHHnaIR5UFi3/u15G4CHCRSsYYMtu24b01Vf8QTkZqa26e2DQ/EBYPFOI+oQCXeLN1RyFDpzzIuq/ySU5K5MIhJwJww/iRHHqQvhyvLw2n+IACXOJN9QBfePsVDOjZhffXbOS/xg33urxAUYh7TAEu8aamAB898AQAFv/patJSDvC4wmDRcIqHFOASb+oKcIDe2Z08rC6YFOIeUYBLvNlfgEvDKMQ9oACXeKMAjx2FeDNTgEu8UYDHlkK8GSnAJd4owGNPId5MFOASbxTgzUMh3gwU4BJvFODNRyEeYwpwiTcK8OalEI8hBbjEGwV481OIx4gCXOKNAtwbCvEYUIBLvFGAe0ch3sQU4BJvFODeUog3IQW4xBsFuPcU4k1EAS7xRgHuDwrxJqAAl3ijAPcPhXgjKcAl3ijA/UUh3ggKcIk3CnD/UYg3kAJc4o0C3J8U4g2gAJd4owD3L4V4lBTgEm8U4P6mEI+CAlzijQLc/xTi9aQAl3ijAA+GJK8LCAIFeNPZsWMHM2fOZNmyZSQlJfHDDz8wbtw4pk2bRlKSuqNfKMCDQ2fNfijAm9arr77KwoULWbFiBW3atOHbb7+lT58+lJeXc9ddd3ldngDbdhZx3m1PKcADQsMpdagIhbj0wRcV4E2oXbt2XH/99bRp0waADh06MG7cOObPn+9xZQKwo3gX59zyhAI8QHQlXos9FRVM/8cKcvK+BhTgTeWss87aZ17r1q0pLy+Puq3NmzfXuTw/Pz/qNuPZtp1FTJm7nK+2FyrAA8Q3IV5RUUFJSYnXZYRt/CafTzZtBeC/xg7lpvHDKS4u9rgqKCkp8d2+gsbV9d577zF69GiKioqiel5WVla91y0tLY26/Vjx4zHctrOIs256zAnwxESev2ESw47v4ot95sf9BU5dGRkZXpeBsdZ6XQMAS5YssampqSQk+GOEJxQK8Z9vtpK7aTsTT+vpmyvwUChEaWkpftpX0PC6Vq9ezX333cecOXNIT0+PaptDhw6t97rz58+nffv2UbUfK347hjuKd4WvwJMSDLeNO5VBx3Tyuqwwv+2vSqFQiGHDhnkeDL65Ek9JSaFHjx6kpaV5XQrgvMtaa7lg5FDf1AROXXl5eb7aVwB33nknDz74YJ3r5OTk0KdPn/D0t99+y+OPP85LL73ECSdE/7F93bp1dS4vKCgIB312djbZ2dlRbyMW/HQMt+0sYvItT4SvwG+5oD+XjRnheV2R/LS/Ivnlk4FvQjwxMZG0tDRffDyp5MeawJ91XX/99QwYMIBevXrVekV9yCGHhG8j3LFjBxMmTODJJ59k0KBBDdpm9+7d61weWUdqaqqv9pcfjuHWHYWcd9tTfPHNVpKTnCGUzOTdntdVEz/sL7/yz2cTCbT09HTatm1L+/btyczMrPFfZYAXFRVx3nnncdtttzF8+HAAnn76aS/Ljzs13Qd+zik9vS5LGkAhLs2qrKyMUaNGccopp9CxY0dWrVrFqlWreOqpp7wuLW7oB3laFt8Mp0h8eOaZZ8jJySEnJ4eHHnrI63LijgK85dGVuDSrq666Cmttjf8kthTgLZNCXCQOKMBbLoW4SAunAG/ZFOIiLZgCvOVTiIu0UArw+KAQF2mBFODxQyEu0sIowOOLQlykBVGAxx+FuEgLoQCPTwpxkRZAAR6/FOIiAacAj28KcZEAU4CLQlwkoBTgAgpxkUBSgEslhbhIwCjAJZJCXCRAFOBSnUJcJCAU4FIThbhIACjApTYKcRGfU4BLXRTiIj6mAJf9UYiL+JQCXOpDIS7iQwpwqS+FuIjPKMAlGgpxER9RgEu0FOIiPqEAl4ZQiIv4gAJcGirJ6wIkvuzevZs//elP5OTkkJyczPfff0/nzp158MEHOeqoo7wuzxMKcGkMXYlLs9q5cyezZs1iwYIFLFu2jNzcXJKTk7nooou8Ls0TCnBpLIW4NKu2bduydOlS2rdvD0BCQgKDBg1i/fr1HlfW/LbtLFKAS6MpxKVZtWrVit69e4ent2zZwty5c7n22ms9rKr57SjexTm3PKEAl0bTmLh4YsuWLYwaNYq8vDyuv/567rrrrqjb2Lx5c53L8/PzG1peTG3bWcSUucv5anuhAlwazTchXlFRQUlJiddlhJWUlPiuJmg5dR144IHk5OSQn5/P+PHj2bJlC48++mhU28zKyqr3uqWlpRQVFUXVfqyE9pST3jqZ5MREnr9hEsOO7+KL2lpK32ouJSUlZGRkeF0GxlrrdQ0ALFmyxKamppKQ4I8RnlAoRGlpKX6qCfxb17PPPsvzzz9f5zpPPvkk3bp122d+bm4uU6dOZc6cORx55JH13ubQoUPrve78+fPD4/BeC4VCbN/5I9/8WEbfow7zupwwv/YtP9c1bNgw43UdvrkST0lJoUePHqSlpXldCuC8y+bl5fmqJvBvXVlZWZx77rl069aN1NTUGtdp164dxjh9PjExMTy/ffv2TJ06lcTERPr27Vvvba5bt67O5QUFBeGgz87OJjs7u95tx1LlMTzt1P6+OoZ+7Vt+rssPfBPiiYmJpKWl+eLjSSU/1gT+revQQw/lyCOPrLOu5557ju3btzN16tTwvMqhhC5dukT1mrp3717n8vT09PDj1NRUX+0vvx5D1RU8/vlsInFjzpw5bN++HYCysjLuvvtuevbsyUknneRxZSLB45srcYkPp59+Orm5uYwYMYL09HSKi4s59thjefXVV2nVqpXX5YkEjkJcmlVWVlbUd6GISO00nCIiEmAKcRGRAFOIi4gEmEJcRCTAFOIiIgGmEBcRCTCFuIhIgCnERUQCTCEuIhJgCnERkQBTiIuIBJhCXEQkwBTiIiIBphAXEQkwhbiISIApxEVEAkwhLiISYApxEZEAU4iLiASYQlxEJMAU4iIiAaYQFxEJMIW4iEiAKcRFRAJMIS4iEmAKcRGRAFOIi2dCoRD9+vWjc+fOXpciElgKcfHMY489xoYNG7wuQyTQFOLiiS1btvDMM89w+eWXe12KSKApxMUTv//977n33ntJSUnxuhSRQEvyugCJP4sXLyYpKYmzzjqLlStXNridzZs317k8Pz+/wW2LBIVvQryiooKSkhKvywgrKSnxXU0Q/LqKi4uZNm0a//znPykqKmL37t1YaykqKop6m1lZWfVet7S0tEHbiIWgH8Pm5ue6MjIyvC4DY631ugZpAYwxdwC372e1k4BfAhuttY9FPO9X1trODdhmNJ03y1pb96W7SAApxKVJGGPSgfT9rLYdyAV+BELuvM5AJvAhTrhfGsU2D9/PKonAoUABUGCt3VPftkWCQiEunmrMlbiI6O4UEZFAU4iLJ4wxmcaYHOBXQKYxJscY8ytPixIJIA2niIgEmK7ERUQCTCEuIhJgCnERkQBTiIuIBJhCXEQkwBTiIiIBphAXEQkwhbiISIApxEVEAkwhLiISYApxEZEAU4iLiASYQlxEJMAU4iIiAaYQFxEJMIW4iEiAKcRFRAJMIS4iEmAKcRGRAFOIi4gEmEJcRCTAFOIiIgH2/wHxMPpfDh9/5QAAAABJRU5ErkJggg==\n",
"text/plain": [
"