{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.3.5" }, "colab": { "name": "2. - Matrices for data scientists.ipynb", "provenance": [], "include_colab_link": true } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "\"Open" ] }, { "cell_type": "markdown", "metadata": { "id": "qmxOoUHSKz1-", "colab_type": "text" }, "source": [ "# Matrices for data scientists" ] }, { "cell_type": "markdown", "metadata": { "id": "fjZox9_qKz2D", "colab_type": "text" }, "source": [ "#### Guillermo Moncecchi" ] }, { "cell_type": "markdown", "metadata": { "id": "Pag1HfZfKz2J", "colab_type": "text" }, "source": [ "If you wanto to do machine learning, you need to work with matrices with the same fluency you have with numbers.This notebooks aims to review the main properties of matrices, show the intuition behind them, and inspect how to manipulate them using `numpy` and `scipy` (see [the difference](http://www.scipy.org/scipylib/faq.html#what-is-the-difference-between-numpy-and-scipy)). It is not a numpy/scipy tutorial, but a brief introduction to matrices, showing also how to manipulate them using Python 3.\n" ] }, { "cell_type": "code", "metadata": { "id": "aBvRL6jlKz2L", "colab_type": "code", "colab": {} }, "source": [ "%matplotlib inline\n", "import numpy as np, scipy as sp, matplotlib.pyplot as plt" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "ZFEdlHaWKz2X", "colab_type": "text" }, "source": [ "### 1. Very basic operations" ] }, { "cell_type": "markdown", "metadata": { "id": "GHiCw09DKz2a", "colab_type": "text" }, "source": [ "First, let's create some numpy arrays, the common structure for dealing with n-dimensional matrices. I will mostly work with two-dimensional matrices since are easier to interpret, but most results admints n-dimensional matrices." ] }, { "cell_type": "markdown", "metadata": { "id": "3ceVDWyXKz2d", "colab_type": "text" }, "source": [ "First, let's create a 2D-numpy array, and show that its elements are integers." ] }, { "cell_type": "code", "metadata": { "id": "LtYv3WU0Kz2f", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 146 }, "outputId": "4e6efbce-dc2d-4922-c6b9-d4c9fc2c6ac9" }, "source": [ "# Specify each row of the matrix as a Python list\n", "A=np.array([[0,0,1],[1,1,0],[1,1,1]])\n", "print (A)\n", "print (A.dtype)\n", "\n", "print (np.sum(A))\n", "print (np.sum(A,axis=0))\n", "print (np.sum(A,axis=1))" ], "execution_count": 2, "outputs": [ { "output_type": "stream", "text": [ "[[0 0 1]\n", " [1 1 0]\n", " [1 1 1]]\n", "int64\n", "6\n", "[2 2 2]\n", "[1 2 3]\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "iD6R6NKKKz2o", "colab_type": "text" }, "source": [ "Create an matrix of 3 rows by 4 columns, filled with zeros and another filled with ones." ] }, { "cell_type": "code", "metadata": { "id": "Yk71MWwAKz2r", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 72 }, "outputId": "1a80459c-a76e-433c-cb3b-76694c01039c" }, "source": [ "print (np.zeros((3,4)))\n" ], "execution_count": 3, "outputs": [ { "output_type": "stream", "text": [ "[[0. 0. 0. 0.]\n", " [0. 0. 0. 0.]\n", " [0. 0. 0. 0.]]\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "c3qPlp62Kz2z", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 72 }, "outputId": "5850c8bc-9cd5-4ea1-ca25-8a616a2a5f72" }, "source": [ "print (np.ones((3,4)))" ], "execution_count": 4, "outputs": [ { "output_type": "stream", "text": [ "[[1. 1. 1. 1.]\n", " [1. 1. 1. 1.]\n", " [1. 1. 1. 1.]]\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "JSWKOcmLKz27", "colab_type": "text" }, "source": [ "1D-arrays in Python are always row vectors, i.e. **vectors are just $1\\times n$ matrices**:" ] }, { "cell_type": "code", "metadata": { "id": "SLU8_-XFKz2-", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 54 }, "outputId": "9647a36a-3ba0-4ca1-da37-3eb58aba47c1" }, "source": [ "print (np.ones(10))\n", "print (\"Size:\"+ str(np.ones(10).size))" ], "execution_count": 5, "outputs": [ { "output_type": "stream", "text": [ "[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]\n", "Size:10\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "i6dqXAwpKz3F", "colab_type": "text" }, "source": [ "**First operation: matrix sum** (both matrices should have the same dimensionns)" ] }, { "cell_type": "code", "metadata": { "id": "QHKz4WuSKz3H", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 72 }, "outputId": "f1018735-8615-46b7-d7ba-49a8b3b8c394" }, "source": [ "A=np.array([0,1,1,0,0,1,1,1,1]).reshape((3,3))\n", "B=np.array([1,1,1,1,0,1,0,1,1]).reshape((3,3))\n", "print (str(A + B))\n" ], "execution_count": 6, "outputs": [ { "output_type": "stream", "text": [ "[[1 2 2]\n", " [1 0 2]\n", " [1 2 2]]\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "72MTq0yzKz3O", "colab_type": "text" }, "source": [ "If the two matrices have different dimensions, numpy __upcasts__ matrices (adding elements to make both matrices compatibles). In the following example the only row in b is repeated to make b a 2x2 matrix" ] }, { "cell_type": "code", "metadata": { "id": "ZMh8gUN2Kz3P", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 109 }, "outputId": "e6e9a1a7-69ac-4b23-a2d3-07ad7154f1fa" }, "source": [ "A=np.array([0,1,2,1]).reshape((2,2))\n", "B=np.array([0,1])\n", "\n", "print (A)\n", "print (B)\n", "print (A + B)" ], "execution_count": 7, "outputs": [ { "output_type": "stream", "text": [ "[[0 1]\n", " [2 1]]\n", "[0 1]\n", "[[0 2]\n", " [2 2]]\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "g711pbAiKz3Y", "colab_type": "text" }, "source": [ "**Second operation: multiply a scalar by a matrix**. " ] }, { "cell_type": "code", "metadata": { "id": "e0DOdCOXKz3a", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 54 }, "outputId": "10dbcfdc-8e5d-444b-ee3b-b9550e269d3c" }, "source": [ "a=8.1\n", "B=np.ones((2,3))\n", "print (a*B)" ], "execution_count": 8, "outputs": [ { "output_type": "stream", "text": [ "[[8.1 8.1 8.1]\n", " [8.1 8.1 8.1]]\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "4w3iydjPKz3i", "colab_type": "text" }, "source": [ "**Third operation: Matrix product**. Given $A(n,p)$ and $B(p,m)$, $A.B=C$, where $C=((c_{ij}))$ and $c_{ij}=\\Sigma_{h=1}^p a_{ih}b_{hj}$" ] }, { "cell_type": "code", "metadata": { "id": "BwIreZvPKz3k", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 146 }, "outputId": "434d20b4-d5da-459f-bee9-feb835fc8602" }, "source": [ "A=np.array([1,2,1,0,1,1,0,1,1,0,0,0]).reshape(4,3)\n", "print (A)\n", "B=np.array([[2,1],[1,1],[0,0]])\n", "print (B)" ], "execution_count": 9, "outputs": [ { "output_type": "stream", "text": [ "[[1 2 1]\n", " [0 1 1]\n", " [0 1 1]\n", " [0 0 0]]\n", "[[2 1]\n", " [1 1]\n", " [0 0]]\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "mfe0AV0gKz3t", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 90 }, "outputId": "fa422ce0-0314-49c0-ef5e-1e7fe8dab39b" }, "source": [ "print (A.dot(B) )" ], "execution_count": 10, "outputs": [ { "output_type": "stream", "text": [ "[[4 3]\n", " [1 1]\n", " [1 1]\n", " [0 0]]\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "2GdRd7onKz3z", "colab_type": "text" }, "source": [ "or..." ] }, { "cell_type": "code", "metadata": { "id": "NedUvvhpKz3z", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 90 }, "outputId": "159d1ef1-228b-4817-865c-4efb5e0b6d34" }, "source": [ "print (np.dot(A,B))" ], "execution_count": 11, "outputs": [ { "output_type": "stream", "text": [ "[[4 3]\n", " [1 1]\n", " [1 1]\n", " [0 0]]\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "gk4Qi-r4Kz37", "colab_type": "text" }, "source": [ "I find easier to see matrix product as a matrix where each row in the product is the dot product of the corresponding row in A ($A_i$) and B. numpy allows to slice columns and rows:" ] }, { "cell_type": "code", "metadata": { "id": "qxfBuclZKz3-", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 109 }, "outputId": "8ae402b5-3a6c-45c6-93ad-bddb31c96b4a" }, "source": [ "print (\"Shape of A:\"+ str(A.shape))\n", "for i in range(A.shape[0]):\n", " print (np.dot(A[i],B))" ], "execution_count": 12, "outputs": [ { "output_type": "stream", "text": [ "Shape of A:(4, 3)\n", "[4 3]\n", "[1 1]\n", "[1 1]\n", "[0 0]\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "a5SFi1c6Kz4F", "colab_type": "text" }, "source": [ "Alternatively, we can see the product matrix as a matrix where each column is the dot product of A and the corresponding column in B ($B^j$)" ] }, { "cell_type": "code", "metadata": { "id": "MAlRiD21Kz4H", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 54 }, "outputId": "dcd4faf4-f702-4d07-c939-7dba89a76476" }, "source": [ "for j in range(B.shape[1]):\n", " print (np.dot(A,B[:,j]))" ], "execution_count": 13, "outputs": [ { "output_type": "stream", "text": [ "[4 1 1 0]\n", "[3 1 1 0]\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "XQ9CQc7YKz4L", "colab_type": "text" }, "source": [ "Note that resulting arrays are row arrays, not (as you could have expected) column arrays. The reason is simple: **1-D arrays in numpy are all the same (no matter if they row or column)**. If you want a column vector, you must use v.reshape(rows,1)" ] }, { "cell_type": "markdown", "metadata": { "id": "Ib2bLgedKz4N", "colab_type": "text" }, "source": [ "**Matrix transposition**: change columns into rows, and viceversa" ] }, { "cell_type": "code", "metadata": { "id": "Js2vA_vuKz4Q", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 146 }, "outputId": "dee67a5e-d134-41e3-c8ff-167fa37e11a0" }, "source": [ "print (A)\n", "print (np.transpose(A))" ], "execution_count": 14, "outputs": [ { "output_type": "stream", "text": [ "[[1 2 1]\n", " [0 1 1]\n", " [0 1 1]\n", " [0 0 0]]\n", "[[1 0 0 0]\n", " [2 1 1 0]\n", " [1 1 1 0]]\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "ZEG2N9kpKz4V", "colab_type": "text" }, "source": [ "An interesting property (prove it!): \n" ] }, { "cell_type": "markdown", "metadata": { "id": "m9SnUErPKz4X", "colab_type": "text" }, "source": [ "$(A\\cdot B)^t = B^t \\cdot A^t$ **[1]**\n" ] }, { "cell_type": "code", "metadata": { "id": "E47OYjugKz4Y", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 90 }, "outputId": "e4d01d7b-1849-4913-87d0-8320780ec929" }, "source": [ "print (np.transpose(A.dot(B)))\n", "print (np.transpose(B).dot(np.transpose(A)))" ], "execution_count": 15, "outputs": [ { "output_type": "stream", "text": [ "[[4 1 1 0]\n", " [3 1 1 0]]\n", "[[4 1 1 0]\n", " [3 1 1 0]]\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "PSVZRKA_Kz4e", "colab_type": "text" }, "source": [ "### 2. Matrices as linear transformations" ] }, { "cell_type": "markdown", "metadata": { "id": "W2X7PHilKz4g", "colab_type": "text" }, "source": [ "From [Wikipedia](http://en.wikipedia.org/wiki/Matrix_%28mathematics%29): \n", "\n", "*A major application of matrices is to represent linear transformations, that is, generalizations of linear functions such as f(x) = 4x. For example, the rotation of vectors in three dimensional space is a linear transformation which can be represented by a rotation matrix R. If v is a column vector (a matrix with only one column) describing the position of a point in space, the product Rv is a column vector describing the position of that point after a rotation. **The product of two matrices is a matrix that represents the composition of two linear transformations.** *\n", "\n", "The following picture shows how the unit square is transformed under a linear transformation represented by a 2-by-2 matrix. I found that this use of matrices can let us imagine better the abstract properties we will describe. \n", "\n" ] }, { "cell_type": "code", "metadata": { "id": "IjBmhL4aKz4i", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 423 }, "outputId": "acf9b4a4-02b7-413e-c0f4-3347119155c7" }, "source": [ "from IPython.display import Image\n", "Image(url='http://upload.wikimedia.org/wikipedia/commons/a/ad/Area_parallellogram_as_determinant.svg',width=350)\n" ], "execution_count": 16, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": { "tags": [] }, "execution_count": 16 } ] }, { "cell_type": "markdown", "metadata": { "id": "NAZqkyS_Kz4n", "colab_type": "text" }, "source": [ "The vectors represented by a 2-by-2 matrix correspond to the sides of a unit square transformed into a parallelogram.\n", "Let's show this in Python. Suppose we have the matrix [[1,1],[2,1]]. This matrix represents a rotation, where each of point in $R^2$ (x,y) is mapped to (x+2y,x+y). Let's verify this:" ] }, { "cell_type": "code", "metadata": { "id": "UJKu1HtRKz4p", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 35 }, "outputId": "cedf007e-04c8-4996-f802-357afd4e9cb8" }, "source": [ "Ex=np.array([[1,1],[2,1]])\n", "print (np.dot([1,1],Ex)) # [1+2,1+1]" ], "execution_count": 17, "outputs": [ { "output_type": "stream", "text": [ "[3 2]\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "7b63P95BKz4u", "colab_type": "text" }, "source": [ "Let's see how the unit square is transformed under our Example matrix. First let us write a function that shows the transformation of the unit square under any matrix transformation" ] }, { "cell_type": "code", "metadata": { "id": "Oj3-VWoPKz4v", "colab_type": "code", "colab": {} }, "source": [ "def transform_unit_square(A):\n", " nxp=20\n", " nxq=20\n", " p = np.linspace(-1.0,1.0,nxp)\n", " q = np.linspace(-1.0,1.0,nxq)\n", " m=np.meshgrid(p,q) # Create grid for plotting\n", " xx=m[0]\n", " yy=m[1]\n", "\n", " # Apply transform to every point in grid.\n", " for i in range(nxp):\n", " for j in range(nxq):\n", " x = np.array([xx[i][j], yy[i][j]])\n", " y = np.dot(A,x) \n", " plt.plot(x[0], x[1], '.b', y[0], y[1], '.r')\n", "\n", " plt.suptitle('Using the transform y=Ax on a grid of points')\n", " plt.axis('equal')\n", " plt.show()\n", " \n" ], "execution_count": 0, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "W295AYX4Kz4y", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 294 }, "outputId": "cbaca693-b2a8-4d1b-9e34-10ea7f572bf2" }, "source": [ "transform_unit_square(Ex)" ], "execution_count": 19, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] } } ] }, { "cell_type": "markdown", "metadata": { "id": "pohmKHyvKz42", "colab_type": "text" }, "source": [ "It will be useful for us to see how a matrix transforms the unit circle (note that the origin always remain unchanged)" ] }, { "cell_type": "code", "metadata": { "id": "5gOFCge2Kz44", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 294 }, "outputId": "0e150544-b09f-4a62-9672-b040a5d3c5d8" }, "source": [ "def transform_unit_circle(A):\n", " nrp=100\n", " t = np.linspace(0,np.pi*2,nrp)\n", "\n", "\n", "\n", " p = np.linspace(-1.0,1.0,nrp)\n", " for i in range(100):\n", " x=[np.cos(t),np.sin(t)]\n", " y=np.dot(A,x)\n", " plt.plot(x[0], x[1], '.b', y[0], y[1], '.r')\n", " \n", " plt.suptitle('Using the transform y=Ax on the unit circle')\n", " plt.axis('equal')\n", " plt.show()\n", "\n", "transform_unit_circle(Ex)\n" ], "execution_count": 20, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\nRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] } } ] }, { "cell_type": "markdown", "metadata": { "id": "i574Tty4Kz48", "colab_type": "text" }, "source": [ "What happens with the matrix [[1,1],[1,1]]?" ] }, { "cell_type": "code", "metadata": { "id": "bj5USXjjKz4_", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 571 }, "outputId": "2eb16d85-fb79-44bf-cbfb-414273ff3ed3" }, "source": [ "transform_unit_square([[1,1],[1,1]])\n", "transform_unit_circle([[1,1],[1,1]])" ], "execution_count": 21, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] } }, { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] } } ] }, { "cell_type": "markdown", "metadata": { "id": "ez9cn9CAKz5F", "colab_type": "text" }, "source": [ "### 3. Inverse Matrix" ] }, { "cell_type": "code", "metadata": { "id": "mkUj93_UKz5G", "colab_type": "code", "colab": {} }, "source": [ "import scipy.linalg" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "yj2z0rSeKz5K", "colab_type": "text" }, "source": [ "An $(n,n)$ matrix A is _invertible_ if there is a matrix B such that $A \\cdot B = I$, where $I$ is the identity matrix. B is the _inverse matrix_ of $A$. \n", "\n", "**For linear transformations (you guessed it), inverse matrices represent the linear transformation that gives back the original plane.**" ] }, { "cell_type": "code", "metadata": { "id": "dnsnlpfIKz5M", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 72 }, "outputId": "830f3032-57e8-4f78-895f-9b798a911046" }, "source": [ "A=np.array([1,1,1,0,1,1,1,2,1]).reshape((3,3))\n", "B=sp.linalg.inv(A)\n", "print (B)" ], "execution_count": 23, "outputs": [ { "output_type": "stream", "text": [ "[[ 1. -1. 0.]\n", " [-1. 0. 1.]\n", " [ 1. 1. -1.]]\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "j-n_VLRwKz5Q", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 72 }, "outputId": "3834fab9-cea9-4ede-bddf-ba39a4a9d2d6" }, "source": [ "print (np.dot(A,B))" ], "execution_count": 24, "outputs": [ { "output_type": "stream", "text": [ "[[1. 0. 0.]\n", " [0. 1. 0.]\n", " [0. 0. 1.]]\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "62Wc1bRbKz5V", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 72 }, "outputId": "4bc14e17-1448-4674-e64b-9989eab41dd5" }, "source": [ "print (np.dot(B,A))" ], "execution_count": 25, "outputs": [ { "output_type": "stream", "text": [ "[[1. 0. 0.]\n", " [0. 1. 0.]\n", " [0. 0. 1.]]\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "IYRIM9IeKz5Y", "colab_type": "text" }, "source": [ "Find the inverse of some matrix, plot the way each of them modifies the unit circle:" ] }, { "cell_type": "code", "metadata": { "id": "0aQQyZpYKz5Z", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 54 }, "outputId": "c3abf68d-2fad-4ff0-8b0a-d653a25daedc" }, "source": [ "A=np.array([2,-2,-1,3]).reshape((2,2))\n", "Inv=sp.linalg.inv(A)\n", "print(Inv)" ], "execution_count": 26, "outputs": [ { "output_type": "stream", "text": [ "[[0.75 0.5 ]\n", " [0.25 0.5 ]]\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "pxdWZXIeKz5d", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 571 }, "outputId": "eea7b74f-1f94-469a-8966-25837d3a427d" }, "source": [ "transform_unit_circle(A)\n", "\n", "transform_unit_circle(Inv)\n", "\n" ], "execution_count": 27, "outputs": [ { "output_type": "display_data", "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXIAAAEVCAYAAAD91W7rAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0\ndHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAcMklEQVR4nO3de7hcdX3v8fcnIQEqVKzEUggQFcWD\niODZciCUh0CipZSWFusFkYIV87SnHokHjwWxSkvxUo6KVi0nR0EqUQsCRSlUEiUol4AJgkfuiFwF\n3KjcamHn8j1/rLXD7M3MntuaWes36/N6nnmSua31WzOzP/Od7/rNGkUEZmaWrlllD8DMzPrjIDcz\nS5yD3MwscQ5yM7PEOcjNzBLnIDczS5yDvEuSbpG0aEjr+rKkvx/GugZJmXMk/UrSDWWPZ9RJOlXS\neRUYx9GSrihoWT3/3UkKSbsVMY6qqmWQN3tiO33xR8SrI2L1AMZ0nKSri15uw/JXSzp+UMtv43eB\nNwDzI2LfksZQCEkvlbRJ0j+VPRYASYskPVj2OJqJiBUR8cbJ8/0E6qD+7kZFLYPcnk/SFgNc/K7A\nvRHxH93eccDj6sWfAb8C3ippy7IHY5V8jQydg7wJSdtLulTS45J+Ken7kmbl190raUn+/1MlnS/p\nnyU9lX/8G2tYzusk/TC/7gJJ/9KsVSLpvwBnAftLelrS4w1Xv0jSv+XLuF7Syxvu9ypJK/Mx3iHp\nLS2253TgQOBz+fI/l18ekv5K0l3AXflln5H0gKQnJa2TdGDDctpt719Leii/7g5JiyW9C/hiw7b9\nbX7bd0u6Ox/7NyXt2LCcZuMKSf9d0l358k+T9HJJ1+ZjPV/S3CbbPjdfx2saLnuJpF9Lmtfs8WpF\nksiC/EPAeuAPG65bKOkxSTvn51+bt5Je1WJZCyX9QNIT+b8LG65bnW/fNfm2XiFp+ybLeAFwObBj\n/tg+3fA4zp3hedpR0oWSxiX9VNJ7Z9jmKZ/kNO2TY/68/EX+vDwu6fP54zTltpK+l9/l5nycb22x\nvndLui0f962SXpdfPv3v7huSzpP0JHCcpNmSPijpJ/l9100+F9OWv6Wk/y3pfkmPSjpL0tattj8Z\nEVG7ExDAbtMuOxU4L///x8iCdU5+OhBQft29wJKG+zwDHAbMzu+3Jr9uLnAfcEK+jCOBCeDvW4zp\n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\nyM3MEvf/ASCy0rLPzcViAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] } }, { "output_type": "display_data", "data": { "image/png": "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\nuEdfrAAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] } } ] }, { "cell_type": "markdown", "metadata": { "id": "rZbznl8uKz5h", "colab_type": "text" }, "source": [ "### 4. Norms" ] }, { "cell_type": "markdown", "metadata": { "id": "IrIlDd2NKz5j", "colab_type": "text" }, "source": [ "The _norm_ of a vector $\\lVert x \\rVert$ is a measure of its \"length\". The _Euclidean_ or $l_2$ norm is:\n", "\n", "$ \\lVert x \\rVert _2 = \\sqrt{\\sum_{i=1}^n{x_i^2}}$\n", "\n", "... which is equivalent to $\\sqrt{x^Tx}$.\n", "\n", "Other examples of norms: \n", "\n", "$ \\lVert x \\rVert _1 = \\sum_{i=1}^n{|x_i|}$\n", "\n", "$ \\lVert x \\rVert _\\infty = \\max_{i}|x_i|$\n", "\n", "Let us calculate them using scipy.linalg.norm function:" ] }, { "cell_type": "code", "metadata": { "id": "80J_AT5MKz5j", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 72 }, "outputId": "f1c8639b-5b71-43ee-cdfd-9512fc6b6a1a" }, "source": [ "v=np.array([1,2,3,5,5])\n", "\n", "print(sp.linalg.norm(v,2))\n", "print(sp.linalg.norm(v,1))\n", "print(sp.linalg.norm(v,np.inf))\n", "\n", "\n" ], "execution_count": 28, "outputs": [ { "output_type": "stream", "text": [ "8.0\n", "16.0\n", "5.0\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "exTseYFzKz5m", "colab_type": "text" }, "source": [ "\n", "### 5. Some Basic Matrix Identities" ] }, { "cell_type": "code", "metadata": { "id": "mfqlc0GtKz5o", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 127 }, "outputId": "e9eb03d4-d981-4d13-cfab-fc7a8a393629" }, "source": [ "A=np.array([1,1,1,0,1,1,1,2,1]).reshape((3,3))\n", "B=np.array([1,0,1,0,1,1,0,1,2]).reshape((3,3))\n", "print (A)\n", "print (B)\n" ], "execution_count": 29, "outputs": [ { "output_type": "stream", "text": [ "[[1 1 1]\n", " [0 1 1]\n", " [1 2 1]]\n", "[[1 0 1]\n", " [0 1 1]\n", " [0 1 2]]\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "L4VSQugrKz5r", "colab_type": "text" }, "source": [ "*Property 1:* " ] }, { "cell_type": "markdown", "metadata": { "id": "fGwf8A1dKz5s", "colab_type": "text" }, "source": [ "$A\\cdot A^{-1} = A^{-1}\\cdot A = I$ **[2]**." ] }, { "cell_type": "markdown", "metadata": { "id": "V4KCS2yDKz5t", "colab_type": "text" }, "source": [ "That is, _if we multiply a matrix by its inverse, we get the identity matrix (no matter the product order)_" ] }, { "cell_type": "code", "metadata": { "id": "GsEaiE8SKz5t", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 72 }, "outputId": "5b320442-fc33-4840-cc48-b12a3d26922f" }, "source": [ "print (np.dot(A,sp.linalg.inv(A)))" ], "execution_count": 30, "outputs": [ { "output_type": "stream", "text": [ "[[1. 0. 0.]\n", " [0. 1. 0.]\n", " [0. 0. 1.]]\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "h0471S0MKz50", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 72 }, "outputId": "cabf7992-e088-4e0c-dd71-1d515ad8df52" }, "source": [ "print (np.dot(sp.linalg.inv(A),A))" ], "execution_count": 31, "outputs": [ { "output_type": "stream", "text": [ "[[1. 0. 0.]\n", " [0. 1. 0.]\n", " [0. 0. 1.]]\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "Z4Qbo1D3Kz53", "colab_type": "text" }, "source": [ "_Property 2_: $(AB)^{-1} = B^{-1}A^{-1}$ **[3]**. Proof: just left multiply with $AB$ both sides and get $I$" ] }, { "cell_type": "code", "metadata": { "id": "eW3dbRhXKz55", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 127 }, "outputId": "95822a7e-2c3b-4999-b2c6-8f84f3d24f7f" }, "source": [ "print (sp.linalg.inv(np.dot(A,B)))\n", "print (np.dot(sp.linalg.inv(B),sp.linalg.inv(A)))" ], "execution_count": 55, "outputs": [ { "output_type": "stream", "text": [ "[[ 0.5 1.18181818 -0.63636364]\n", " [ 0. 2. -1. ]\n", " [ 0. -1.18181818 0.63636364]]\n", "[[ 0.5 1.18181818 -0.63636364]\n", " [ 0. 2. -1. ]\n", " [ 0. -1.18181818 0.63636364]]\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "UN16XRqiKz59", "colab_type": "text" }, "source": [ "_Property 3_: $(A^T)^{-1}= (A^{-1})^T$ **[4]**. _The inverse of the trasposed is the trasposed inverted_ \n", "\n", "Proof: using Property 1 and transposing, we get $(AA^{-1})^{T}=I$. Applying [1], we get $(A^{-1})^T A^T=I$. Multiplying both sides to the right by $(A^T)^{-1}$, we get the result we were searching for. Let's verify it using our examples:" ] }, { "cell_type": "code", "metadata": { "id": "pLrAxLu9Kz5-", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 127 }, "outputId": "17bb2727-ff47-4d83-9c83-54c7ef618119" }, "source": [ "print (sp.linalg.inv(np.transpose(A)))\n", "print (np.transpose(np.linalg.inv(A)))" ], "execution_count": 33, "outputs": [ { "output_type": "stream", "text": [ "[[ 1. -1. 1.]\n", " [-1. 0. 1.]\n", " [ 0. 1. -1.]]\n", "[[ 1. -1. 1.]\n", " [-1. 0. 1.]\n", " [ 0. 1. -1.]]\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "KfGlRSWCKz6F", "colab_type": "text" }, "source": [ "### Rank and linear independece\n", "\n", "A set of vectors is _linearly independent_ if none of the vectors can be expressed as a lineal combination of the reminder (or, equivalently, if $\\sum_{n} \\alpha_{n}a_n = 0$ only if all $\\alpha_{n}$). The _rank_ of a matrix is the maximum number of linearly independent rows (or, equivalently, columns). The rank measures how much \"information\" the matrix stores. If the number of columns is greater than the rank, we can somehow \"compress\" the matrix. " ] }, { "cell_type": "markdown", "metadata": { "id": "zsQQbbYsKz6G", "colab_type": "text" }, "source": [ "### 6. Traces and determinants." ] }, { "cell_type": "markdown", "metadata": { "id": "PtDgu-MtKz6I", "colab_type": "text" }, "source": [ "The _trace_ of a matrix is defined as the sum of the elements of its diagonal. " ] }, { "cell_type": "code", "metadata": { "id": "2ygG6iXHKz6X", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 90 }, "outputId": "24c69020-882e-457f-f3ce-14b4be37d3c4" }, "source": [ "print (A)\n", "print (np.trace(A))" ], "execution_count": 34, "outputs": [ { "output_type": "stream", "text": [ "[[1 1 1]\n", " [0 1 1]\n", " [1 2 1]]\n", "3\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "PN__81wGKz6b", "colab_type": "text" }, "source": [ "We have $Tr(AB)=Tr(BA)$ **[5]**" ] }, { "cell_type": "code", "metadata": { "id": "sUBnwHZmKz6b", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 35 }, "outputId": "84857733-f263-4e2a-e98d-99dfae40517d" }, "source": [ "print (np.trace(np.dot(A,B)),\"=\",np.trace(np.dot(B,A)))" ], "execution_count": 35, "outputs": [ { "output_type": "stream", "text": [ "8 = 8\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "ZeTcaPsaKz6e", "colab_type": "text" }, "source": [ "The determinant $|A|$ of a $N\\times N$ matrix is defined by:\n", "\n", "$|A| = \\sum (\\pm 1)A_{1i_1}A_{2i_2}\\ldots A_{Ni_N}$, where \"the sum is taken over all products consisting of precisely one element from each row and one element from each column, with a coefficient $+1$ or $-1$ according to whether the permutation $i_1i_2\\ldots i_N$ is even or odd, respectively\". From Wikipedia: _\"A geometric interpretation can be given to the value of the determinant of a square matrix with real entries: **the absolute value of the determinant gives the scale factor by which area or volume (or a higher-dimensional analogue) is multiplied under the associated linear transformation, while its sign indicates whether the transformation preserves orientation**. Thus a 2 × 2 matrix with determinant −2, when applied to a region of the plane with finite area, will transform that region into one with twice the area, while reversing its orientation\"_\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "id": "x1O2XrxaKz6f", "colab_type": "text" }, "source": [ "Property: $|AB| = |A||B|$ **[6]** (**The determinant of a product of matrices is the product of their determinants**)" ] }, { "cell_type": "code", "metadata": { "id": "H8FIACrQKz6g", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 54 }, "outputId": "0d01e529-f097-4551-c21e-9f1ba5c450f7" }, "source": [ "print (np.linalg.det(np.dot(A,B)))\n", "print (np.linalg.det(A), np.linalg.det(B))" ], "execution_count": 36, "outputs": [ { "output_type": "stream", "text": [ "-1.0\n", "-1.0 1.0\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "e_ZyRWh8Kz6k", "colab_type": "text" }, "source": [ "Determinant of the inverse matrix: $|A^{-1}| = \\frac{1}{|A|}$ **[7]**(**The determinant of the inverse of a matrix is the real inverse of its determinant**). Note that this implies that a matrix is invertible if it has a non-zero determinant!" ] }, { "cell_type": "code", "metadata": { "id": "exhACixMKz6l", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 54 }, "outputId": "32b39bcf-8e15-4f42-e0fd-9b2329126a84" }, "source": [ "C=np.array([2,-2,-1,3]).reshape((2,2))\n", "print (np.linalg.det(np.linalg.inv(C)))\n", "print (np.linalg.det(C))" ], "execution_count": 37, "outputs": [ { "output_type": "stream", "text": [ "0.25000000000000006\n", "4.0\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "EjrN4QLSKz6o", "colab_type": "text" }, "source": [ "### 7. Eigenvector Equation" ] }, { "cell_type": "markdown", "metadata": { "id": "ZQyHWwx2Kz6o", "colab_type": "text" }, "source": [ "If A is of size $M \\times M$, then the eigenvector equation is $Au_i = \\lambda _i u_i$ ($u_i$ is an _eigenvector_ and $\\lambda_i$ is its corresponding _eigenvalue_). If you have a vector $v$, and a matrix $A$, the dot product $Av$ produces another vector $v'$. If $v$ and $v'$ are parallel, then $v$ is an eigenvector of $A$, and the scale factor between $v$ and $v'$ is its eigenvalue. In the following picture (taken from the beautiful Wikipedia page for Eigenvalues and Eigenvectors), the transformation produced by the matrix [[2,1],[1,2]] is shown; blue and pink vectors are eigenvectors:" ] }, { "cell_type": "code", "metadata": { "id": "UsPXCykQKz6p", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 521 }, "outputId": "b18e7cb6-4ff2-48dc-c113-4c110c010be7" }, "source": [ "from IPython.display import Image\n", "Image(url='http://upload.wikimedia.org/wikipedia/commons/a/ad/Eigenvectors-extended.gif')" ], "execution_count": 38, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": { "tags": [] }, "execution_count": 38 } ] }, { "cell_type": "markdown", "metadata": { "id": "Htx-Y5eQKz6s", "colab_type": "text" }, "source": [ "**The eigenvalue equation for $A$ is $(A -\\lambda I)v =0$**. This equation has a non-zero solution iif its determinant $|A - \\lambda I|=0$; its roots are precisely the eigenvalues of A." ] }, { "cell_type": "markdown", "metadata": { "id": "EMLN5G9EKz6t", "colab_type": "text" }, "source": [ "Suppose we have the following A (Wikipedia, again!):" ] }, { "cell_type": "code", "metadata": { "id": "KYCLfVvcKz6u", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 72 }, "outputId": "c5851597-2dd3-43cc-9bff-3ba5a272a0e5" }, "source": [ "A=np.array([2,0,0,0,3,4,0,4,9]).reshape(3,3)\n", "print (A)" ], "execution_count": 39, "outputs": [ { "output_type": "stream", "text": [ "[[2 0 0]\n", " [0 3 4]\n", " [0 4 9]]\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "SEtMj3ClKz6x", "colab_type": "text" }, "source": [ "Its rank is the number of nonzero eigenvalues:" ] }, { "cell_type": "code", "metadata": { "id": "-lUkUrBUKz6z", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 35 }, "outputId": "1119fe3f-5ddf-458d-fdda-54585ef5fb51" }, "source": [ "print (np.linalg.matrix_rank(A))" ], "execution_count": 40, "outputs": [ { "output_type": "stream", "text": [ "3\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "7O-OC6DaKz62", "colab_type": "text" }, "source": [ "Find the eigenvalues and eigenvectors (note that any non-zero multiple of an eigenvector is also an eigenvector)" ] }, { "cell_type": "code", "metadata": { "id": "PComXmjZKz63", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 90 }, "outputId": "faf4b87b-b13d-4b6f-d471-d21c449ed05d" }, "source": [ "print (np.linalg.eig(A)[0]) #Eigenvalues\n", "print (np.linalg.eig(A)[1]) #Eigenvectors are columns!\n" ], "execution_count": 41, "outputs": [ { "output_type": "stream", "text": [ "[11. 1. 2.]\n", "[[ 0. 0. 1. ]\n", " [ 0.4472136 0.89442719 0. ]\n", " [ 0.89442719 -0.4472136 0. ]]\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "811xWExTKz69", "colab_type": "text" }, "source": [ "**The eigenvectors of a matrix can be choosen to be orthonormal** (i.e. $u_i^Tu_j = I_{ij}$, and, by normalizing, can be set to unit length)" ] }, { "cell_type": "code", "metadata": { "id": "ZmypcmcUKz6-", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 164 }, "outputId": "d75c34cd-d3d5-4acc-ddc9-347a3512aaff" }, "source": [ "ev=np.linalg.eig(A)[1]\n", "print (ev)\n", "print (ev[:,0])\n", "print (np.dot(ev[:,0],ev[:,1]))\n", "print (np.dot(ev[:,1],ev[:,2]))\n", "print (np.dot(ev[:,1],ev[:,1]))\n", "print (np.linalg.norm(ev[:,1]))" ], "execution_count": 42, "outputs": [ { "output_type": "stream", "text": [ "[[ 0. 0. 1. ]\n", " [ 0.4472136 0.89442719 0. ]\n", " [ 0.89442719 -0.4472136 0. ]]\n", "[0. 0.4472136 0.89442719]\n", "0.0\n", "0.0\n", "0.9999999999999999\n", "0.9999999999999999\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "1gPqPGjnKz7B", "colab_type": "text" }, "source": [ "Symmetric matrices have the property that $A^T=A$. Matrices where $A=-A^T$ are *antisymmetric*. \n", "The inverse of a symmetric matrix is also symmetric (demonstrate). **For symmetric matrices, the eigenvalues are real**. See, for example:" ] }, { "cell_type": "code", "metadata": { "id": "589ehi7YKz7C", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 90 }, "outputId": "5aa351c4-2cd8-4a97-feeb-c0e360b791fb" }, "source": [ "S=np.array([3,1,1,1,5,0,1,0,1]).reshape(3,3)\n", "print (S)\n", "evS=np.linalg.eigvals(A)\n", "print (evS)" ], "execution_count": 43, "outputs": [ { "output_type": "stream", "text": [ "[[3 1 1]\n", " [1 5 0]\n", " [1 0 1]]\n", "[11. 1. 2.]\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "CNwpfJuwKz7F", "colab_type": "text" }, "source": [ "**Any M-dimensional vector can be expressed as a linear combination of the eigenvectors.**\n", "\n", "Let's define an $M \\times M$ matriz **U**, where the eigenvectors $u_i$ are the columns. This matrix satisfies $U^TU=I$. This matrix is _orthogonal_. The eigenvector equation can be defined now as: $AU = U\\Lambda$ **[8]**, where $\\Lambda$ is a diagonal matrix whose elements are the eigenvalues. It can be shown that multiplication by $U$ can be interpreted as a rigid rotation or a reflection of the coordinate system." ] }, { "cell_type": "code", "metadata": { "id": "dxLkQzVgKz7F", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 72 }, "outputId": "370aafab-c1c6-4157-e9fa-e2c6cef4e3a5" }, "source": [ "# Show the eigenvectors of A\n", "print (ev)\n" ], "execution_count": 44, "outputs": [ { "output_type": "stream", "text": [ "[[ 0. 0. 1. ]\n", " [ 0.4472136 0.89442719 0. ]\n", " [ 0.89442719 -0.4472136 0. ]]\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "54S7cSEVKz7I", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 72 }, "outputId": "d03473af-dd0c-42af-cf94-18501784e7f6" }, "source": [ "print(A)" ], "execution_count": 45, "outputs": [ { "output_type": "stream", "text": [ "[[2 0 0]\n", " [0 3 4]\n", " [0 4 9]]\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "RfeYgOPKKz7L", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 127 }, "outputId": "406d6543-8864-4cda-8819-797b3b64b97b" }, "source": [ "# Verify that AU = U\\Lambda\n", "print (np.dot(A,ev))\n", "\n", "lmbda= np.diag(np.linalg.eigvals(A))\n", "print (np.dot(ev,lmbda))" ], "execution_count": 46, "outputs": [ { "output_type": "stream", "text": [ "[[ 0. 0. 2. ]\n", " [ 4.91934955 0.89442719 0. ]\n", " [ 9.8386991 -0.4472136 0. ]]\n", "[[ 0. 0. 2. ]\n", " [ 4.91934955 0.89442719 0. ]\n", " [ 9.8386991 -0.4472136 0. ]]\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "5YayFUFrKz7O", "colab_type": "text" }, "source": [ "From $AU = U\\Lambda$, it follows $U^TAU = \\Lambda$ ($A$ is _diagonalized_ by $U$). From this, left multiplying by $U$, right multiplying by $U^T$, we get \n", "\n", "$A = U \\Lambda U^T$, or $A = \\sum_{i=1}^M {\\lambda_i} u_i u_i^T$ **[9]**\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "id": "MnbSgUfAKz7O", "colab_type": "text" }, "source": [ "Let us draw the linear transformation for each matrix in the A descomposition: since $U$ is orthogonal, it represents a rotation;after that, multiplying by $\\lambda$ scales the axis using the eigenvalues; finally $U^T$ rotates the axis back..." ] }, { "cell_type": "code", "metadata": { "id": "C4P04j8NKz7Q", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 1000 }, "outputId": "c1386657-2f12-4072-83fe-44e7707ca2cb" }, "source": [ "Ex=np.array([3,1,1,1]).reshape(2,2)\n", "# Find eigenvectors\n", "U=np.linalg.eig(Ex)[1]\n", "lmbda1= np.diag(np.linalg.eigvals(Ex))\n", "\n", "transform_unit_square(Ex)\n", "transform_unit_square(U)\n", "transform_unit_square(lmbda1)\n", "transform_unit_square(np.transpose(U))\n", "\n", "\n", "\n" ], "execution_count": 47, "outputs": [ { "output_type": "display_data", "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXIAAAEVCAYAAAD91W7rAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0\ndHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAdDklEQVR4nO3cf7QkZX3n8fdnBkYmgkFl3Cw/xgHH\nkEVR0PHHMLKZA2SWdVk5Cv6ISEQw7FnDilnWHywkmqigIWbJhnWFg8AmsqgJuhpMwi8ZFWZE7yAo\niCigCMjIoBABowjz3T+qLjQ91be7763qep6uz+ucOvdWP13VT/et+73f/vQzo4jAzMzytajtCZiZ\n2cK4kJuZZc6F3Mwscy7kZmaZcyE3M8ucC7mZWeZcyIeQdJOktRN6rAskfWASj9UkFc6XdL+kr7U9\nHxudpAMl3TLH+LyvUUmvlnSnpIck7T//WW5z3uXlORfXdc7cdKKQSwpJK/tue5+kTww7NiKeFxHr\nG5jTMZKurvu8PedfL+mtTZ1/iFcAvwPsHhEvbWkOtZC0p6Stkv5323OZhIj4SkTs3dDp/xw4ISJ2\njIhv1HXSiPhhec7Hht1X0oqyHmxX1+OnoBOF3LbV8IX8bOAHEfHwuAcm+Av2e8D9wOslPaXtyTRp\nAq/9s4GbGn6MTnIhByTtIukSSQ9I+qmkr0haVI79QNIh5ffvk/RpSX8t6cEydlnVc54XSfpGOfa3\nkj5V9TZU0r8BPgasLt8SPtAz/HRJXyjPca2k5/Qc91uSLi/neIuk1w14Ph8EDgTOKs9/Vnl7SPoD\nSd8Dvlfe9pfl292fSdok6cCe8wx7vu+WdHc5doukgyUdB5zb89z+pLzv70u6tZz75yXt2nOeqnmF\npLdJ+l55/vdLeo6kDeVcPy1pScVzX1I+xr49tz1L0s8lLat6vQaRJIpCfirwK+A/9owdIOk+SXuU\n+y8so6TfGnCuAyR9XdI/l18P6BlbXz6/a8rnepmkXQac5+nltbqlfLxLJO0+x3MYeE1KWivprvLn\nuBk4f/a2nuP3l3RdefyngB3meKxFkk6VdIeke8vr5tclPUXSQ8Bi4AZJtw04PiS9XdLt5Wt7hp74\nPaw8dzn2pC57yOv55fLrA+X1uVrSSklfKn8295XPMy8RMfUbEMDKvtveB3yi/P50isK6fbkdCKgc\n+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\ndQlUhLd3eAAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] } }, { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] } }, { "output_type": "display_data", "data": { "image/png": "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\njvzAAw9ky5YtnWhaCCGCxczuaVSu0IoQQgSOHLkQQgSOHLkQQgSOHLkQQgSOHLkQQgSOHLkQQgSO\nHLkQQgSOHLkQQgSOHLkQQgSOHLkQQgSOHLkQQgSOHLkQQgSOHLkQQgSOHLkQQgSOHLkQQgTOlB25\nmS00s+vM7HYz+6mZnd0Ow4QQQiSjHS+WqADvdvetZrY7cIuZXevut7ehbiGEEJMw5Styd7/f3bfG\nf/8BuAPYb6r1CiGESEZbY+RmdiCwGLixwXcrzWyLmW156KGH2tmsEELMadrmyM1sAbAeWOXuj479\n3t3XufsSd1+y997j3h0qhBCiRdriyM2si8iJX+ruV7SjTiGEEMlox1MrBlwE3OHun566SUIIIdLQ\njivyI4BTgKPN7NZ4eUUb6hVCCJGAKT9+6O4bAWuDLUIIIVpAIzuFECJw5MiFECJw5MiFECJw5MiF\nECJw5MiFECJw5MiFECJw5MiFECJw5MiFECJw5MiFECJw5MiFECJw5MiFECJw5MiFECJw5MiFECJw\n5MiFECJw5MiFECJw5MiFECJw5MiFECJw5MiFECJw5MiFECJw5MiFECJw5MiFECJw5MiFECJw5MiF\nECJw5MiFECJw5MiFECJw5MiFECJw5MiFECJw5MiFECJw5MiFECJw5MiFECJw5MiFECJw5MiFECJw\n5MiFECJw5MiFECJw5MiFECJw2uLIzexiM3vQzH7SjvqEEEIkp11X5F8Cjm9TXUIIIVLQFkfu7j8E\nHm5HXWL2sHkznH9+9NlofSpls103lbrEHMTd27IABwI/SbLti1/8Yhezm8FB9/nz3fP56HPt2l3X\nBwfHb5O0rNW6QtFNpS4xuwG2eAOfWpipHwwzWwmsBFi0aNFMNSs6RKkE5TJUq9Hn+vW7rpdK0Xat\nlLVaVyi6qdTV1zfFAyeCZMYcubuvA9YBLFmyxGeqXdEZikXo7o4cTHc3rFgBAwOj68VitF39NknL\nWq0rFN1U6xJzkEaX6a0sKLQixrB2rftxx0WfjdanUjbbdVOpS8xeaBJaaZcT/xpwPzAM3AucMdH2\ncuSznyzEi0PVKUYumtHMkbcltOLub2hHPWL2oBi5YuRi5pixGLmYWyhGrhi5mDnkyMW00NcH/f3R\nVWKxGK339u66DuO3SVrWal2h6KZSl5h7aK4VIYQInUaB8+lelOyc/WQh8ReqTslO0Qw6PSBIzC2U\n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\nWaibSl1idsOsGKIvgmHSxF8p2q6VslbrCkU3lbqm42JPZB85cjEtjEt21if+kiYokyQRZ6FuqnWJ\nuUd+9erVM97ounXrVq9cuXLG2xUzx8KFsPfe8MQT8K53wcqVu66feOL4bZKWtVpXKLqp1CVmN+ed\nd979q1evXjfui0bxluleFCOf/WQhXhyqTjFy0QwUIxcziWLkipGLmUOOXEwLipErRi5mDjlyMS2M\nm/2wfibAYsIZCycoa7WuUHRTqUvMPcKZa0UIIURjGgXOp3tRsnP2k4XEX6g6JTtFM1CyU8wkSnYq\n2Slmjik5cjN7DbAaeB6w1N1bmAlLzEaU7FSyU8wcU70i/wlwErC2DbaIWYSSnUp2ipljSo7c3e8A\nMLP2WCOEECI9jQLnaReiSTmXJN1eyc7ZTxYSf6HqlOwUzaDVZKeZ/QB4ZoOvPujuVyX9wTCzlcBK\ngEWLFiWViUBRslPJTjFzTOrI3f2YdjTk7uuAdRC9IagddYrsomSnkp1i5tDjh2JaULJTyU4xc0zp\nnZ1m9irgQmBvYAdwq7u/fDJdy+/sFEKIOcy0vLPT3a8ErpxKHUIIIaaG5loRQojAkSMXQojAkSMX\nQojAkSMXQojAkSMXQojAkSMXQojAkSMXQojAkSMXQojAkSMXQojAkSMXQojAkSMXQojAkSMXQojA\nkSMXQojAkSMXQojAkSMXQojAkSMXQojAkSMXQojAkSMXQojAkSMXQojAkSMXQojAkSMXQojAkSMX\nQojAkSMXQojAkSMXQojAkSMXQojAkSMXQojAkSMXQojAkSMXQojAkSMXQojAkSMXQojAkSMXQojA\nkSMXQojAkSMXQojAkSMXQojAkSMXQojAkSMXQojAmZIjN7MLzOxnZvZjM7vSzPZsl2FCCCGSMdUr\n8muBF7j7XwI/B94/dZOEEEKkYUqO3N2vcfdKvHoDsP/UTRJCCJGGdsbI3wJ8t9mXZrbSzLaY2ZaH\nHnqojc0KIcTcpjDZBmb2A+CZDb76oLtfFW/zQaACXNqsHndfB6wDWLJkibdkrRBCiHFM6sjd/ZiJ\nvjez04ATgOXuLgcthBAzzKSOfCLM7HjgHOAod/9je0wSQgiRhqnGyP8d2B241sxuNbPPt8EmIYQQ\nKZjSFbm7P6ddhgghhGgNjewUQojAkSMXQojAkSMXQojAkSMXQojAkSMXQojAkSMXQojAkSMXQojA\nkSMXQojAkSMXQojAkSMXQojAkSMXQojAkSMXQojAkSMXQojAkSMXQojAsU681MfMHgLumfGGx/N0\n4PedNiIFodkL4dkcmr0Qns2h2QvZsfkAd997bGFHHHlWMLMt7r6k03YkJTR7ITybQ7MXwrM5NHsh\n+zYrtCKEEIEjRy6EEIEz1x35uk4bkJLQ7IXwbA7NXgjP5tDshYzbPKdj5EIIMRuY61fkQggRPHPa\nkZvZR8zsx2Z2q5ldY2b7dtqmyTCzC8zsZ7HdV5rZnp22aTLM7DVm9lMzq5lZZjP/Zna8md1pZneZ\n2fs6bc9kmNnFZvagmf2k07YkwcwWmtl1ZnZ7fD6c3WmbJsPMdjOzm8zsR7HN53XapkbM6dCKme3h\n7o/Gf58FHOru/9BhsybEzI4DNrh7xcw+DuDu7+2wWRNiZs8DasBa4D3uvqXDJo3DzPLAz4FjgXuB\nm4E3uPvtHTVsAszsZcBjwFfc/QWdtmcyzOzPgT93961mtjtwC3BixvvYgKe6+2Nm1gVsBM529xs6\nbNouzOkr8hEnHvNUIPO/au5+jbtX4tUbgP07aU8S3P0Od7+z03ZMwlLgLne/293LwNeBV3bYpglx\n9x8CD3fajqS4+/3uvjX++w/AHcB+nbVqYjzisXi1K14y5yfmtCMHMLOPmdl24I3Av3TanpS8Bfhu\np42YJewHbK9bv5eMO5mQMbMDgcXAjZ21ZHLMLG9mtwIPAte6e+ZsnvWO3Mx+YGY/abC8EsDdP+ju\nC4FLgXd21tqIyWyOt/kgUCGyu+MksVkIADNbAKwHVo25K84k7l5198OI7n6XmlnmwliFThsw3bj7\nMQk3vRT4DvChaTQnEZPZbGanAScAyz0jSY4U/ZxV7gMW1q3vH5eJNhLHmdcDl7r7FZ22Jw3uvsPM\nrgOOBzKVYJ71V+QTYWYH162+EvhZp2xJipkdD5wD/J27/7HT9swibgYONrNnmVk38HrgWx22aVYR\nJw4vAu5w90932p4kmNneI0+Gmdl8omR45vzEXH9qZT1wCNETFfcA/+Dumb4KM7O7gHnAUFx0QwBP\n2rwKuBDYG9gB3OruL++sVeMxs1cAa4A8cLG7f6zDJk2ImX0NKBLNzPc74EPuflFHjZoAMzsSGABu\nI/qfA/iAu3+nc1ZNjJn9JfBlonMiB3zD3T/cWavGM6cduRBCzAbmdGhFCCFmA3LkQggROHLkQggR\nOHLkQggROHLkQggROHLkQggROHLkQggROHLkQggROP8fS3Igmp7Abj0AAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] } }, { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] } } ] }, { "cell_type": "markdown", "metadata": { "id": "vLziIxmrKz7U", "colab_type": "text" }, "source": [ "Taking inverse and given $U^{-1} = U^T$ (since U is orthogonal), we have: \n", "\n", "$A^{-1} = U \\Lambda^{-1} U^T$, or \n", "\n", "$A^{-1} = \\sum_{i=1}^M \\frac{1}{\\lambda_i} u_i u_i^T$ **[10]**" ] }, { "cell_type": "code", "metadata": { "id": "X1ggAumDKz7U", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 127 }, "outputId": "e0f855f7-2b54-49c7-b4ea-f2a40a3f7c82" }, "source": [ "# Calculate the inverse of A\n", "print (ev.dot(np.linalg.inv(lmbda).dot(np.transpose(ev))))\n", "\n", "print (np.linalg.inv(A))\n" ], "execution_count": 48, "outputs": [ { "output_type": "stream", "text": [ "[[ 0.5 0. 0. ]\n", " [ 0. 0.81818182 -0.36363636]\n", " [ 0. -0.36363636 0.27272727]]\n", "[[ 0.5 0. 0. ]\n", " [ 0. 0.81818182 -0.36363636]\n", " [-0. -0.36363636 0.27272727]]\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "O40GbF-VKz7X", "colab_type": "text" }, "source": [ "We can also show that **the determinant of a matrix is the products of its eigenvalues**:\n", "\n", "$|A| = \\prod_{i=1}^{M}\\lambda_i$ **[11]**\n", "\n", "And that **the trace of a matrix is the sum of its eigenvalues**\n", "\n", "$Tr(A) = \\sum_{i=1}^{M}\\lambda_i$ **[12]**\n", "\n" ] }, { "cell_type": "code", "metadata": { "id": "OrZcnV4tKz7Y", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 54 }, "outputId": "ff7ff3be-6dfd-4df9-f2e6-3cee1be43c3d" }, "source": [ "print (str(np.prod(np.linalg.eigvals(A))) + ','+ str(np.linalg.det(A)))\n", "\n", "print (str(np.sum(np.linalg.eigvals(A))) + ','+ str(np.trace(A)))" ], "execution_count": 49, "outputs": [ { "output_type": "stream", "text": [ "22.0,21.999999999999996\n", "14.0,14\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "lcwSZJd2Kz7b", "colab_type": "text" }, "source": [ "A symmetric matrix A is _positive (semi)definite_ if, for all w, $w^T A w >(\\geq) 0$ ($w^T A w $ is called the _quadratic form_). A positive definite matrix has all positive eigenvalues. The intution behind definite matrices is that they are a multi-dimensional version of a positive scalar. When you multiply a vector with a matrix, you multiply the vector by different factors in the different space directions. If the matrix is positive definite, this is all true, but just like with a positive scalar, the new vector and the old vector go \"in the same direction\" in the sense that their angle is less than 90 degrees. More precisely: the old and the new have a positive inner product. (Taken from https://www.quora.com/What-is-a-positive-definite-matrix-in-laymans-terms).\n", "\n", "One important property of positive definite and negative definite matrices is that they are always full rank, and hence, invertibles.\n", "\n", "Given $A \\in {\\rm I\\!R}^{n \\times n}$ there is a special matrix $G =A^TA$, called the _Gram Matrix_, always positive semidefinite, and if $m \\geq n$, $G$ is positive definite.\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "id": "8J55PzpbKz7c", "colab_type": "text" }, "source": [ "### 9. Matrix Derivatives" ] }, { "cell_type": "markdown", "metadata": { "id": "75DuikhUKz7d", "colab_type": "text" }, "source": [ "Given a function $f$ mapping from $m$-by-$n$ matrices to real numbers, we can define the _gradient_ $\\nabla_A f(A)$ as an $m$-by-$n$ matrix whose $(i,j)$ element is $\\partial f/\\partial A_{ij}$. Some properties of gradients (see Bishop's appendix for details), are the following:\n", "\n", "- $\\nabla_{A}Tr(AB)=B^T$ **[11]**\n", "- $\\nabla_{A}Tr(A^TB)=B$ **[12]**\n", "- $\\nabla_{A}Tr(A)=I$ **[13]**\n", "- $ \\nabla_{A}Tr(ABA^T)=A(B+B^T)$**[14]**\n", "\n", "And the beautiful\n", "\n", "- $\\nabla_{A}\\ln|A|=(A^{-1})^T$**[15]**\n", "\n", "Yet another two properties of gradients (from Andrew Ng's course notes, see next section):\n", "\n", "- $\\nabla_{A^T} f(A)= (\\nabla_{A} f(A))^T$ **[16]**\n", "- $\\nabla_{A} Tr(ABA^TC) = CAB + C^TAB^T$ **[17]**" ] }, { "cell_type": "markdown", "metadata": { "id": "Hs2DWN5wKz7d", "colab_type": "text" }, "source": [ "### 10. Matrices for Machine Learning" ] }, { "cell_type": "markdown", "metadata": { "id": "GLJ0NM7qKz7e", "colab_type": "text" }, "source": [ "It is difficult to find a machine learning method that does _not_ use matrices. From linear regression to deep neural networks, going through Principal Component Analysis, things are much easier if we use matrices and vectors. Just as an example, let's show how to find a closed-form solution for the problem of linear regression, following exactly the [notes](http://cs229.stanford.edu/notes/cs229-notes1.pdf) of Mr. @andrewyng. In the next section, we will see how to implement everything using Python.\n", "\n", "First, let's define the problem of linear regression: we have a number of input _features_ from $\\mathbb{R}^n$, noted as $x$, and an associated _target value_ $y$ in $\\mathbb{R}$. Our _hypothesis_ is that, given $x$, $h(x) = \\sum_{i=0}^{i=n} \\theta_i x_i$ (assuming that $x_0=1$), or, using matrix notation (see how easier it looks):\n", "\n", "$h(x)=\\theta^T x$\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "id": "jW_WlFAhKz7f", "colab_type": "text" }, "source": [ "(Note that, by convention, an instance from $\\mathbb{R}^n$ is considered a column vector). What we want to do is to find $\\theta^T$, given a training set (i.e. instances from $\\mathbb{R}^n$ and their associated target value). The cost function we want to minimize wrt $\\theta$ is the following:\n", "\n", "$J(\\theta) = \\frac{1}{2}\\sum_{i=1}^{i=m} (h_\\theta(x^{(i)})- y^{(i)})^2$\n", "\n", "where $x^{(i)}$ denotes the i-th instance, and $y^{(i)}$ its value. Note we are squaring the difference to take into account only the absolute value of the differences. \n", "\n", "This method is called _ordinary least squares_.\n" ] }, { "cell_type": "markdown", "metadata": { "id": "lEqTH6HQKz7f", "colab_type": "text" }, "source": [ "A typical way for minimizing $J$ is using some numerical method, i.e. _gradient descent_, which allows to minimize any convex function of multiple variables. For ordinary least squares, however, there is a _closed form_ solution, which we will show. The use of matrix notation will make things much easier than if we had to use index notation. \n", "\n", "First, let's rewrite J using matrix notation.\n", "\n", "$J(\\theta) = \\frac{1}{2}(X\\theta - y)^T(X\\theta - y)$\n", "\n", "where $X$ is the _design matrix_ that includes the training instances input values as rows, and $y$ is a column matrix including the corresponding target values (you can use index notation to check the equivalence, keeping in mind that $zz^T$ equals the sum of the squared elements of $z$!)\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "id": "obwkEQY3Kz7g", "colab_type": "text" }, "source": [ "From now on, things are easy (especially if you compare to using index notation). First, use [1]:" ] }, { "cell_type": "markdown", "metadata": { "id": "SX8cgK1jKz7h", "colab_type": "text" }, "source": [ "$$\n", "\\nabla_\\theta J(\\theta) =\\nabla_\\theta\\frac{1}{2}(X\\theta - y)^T(X\\theta - y) = \\nabla_\\theta\\frac{1}{2} (\\theta^TX^TX\\theta - \\theta^TX^Ty - y^TX\\theta+ yy^T) \n", "$$\n" ] }, { "cell_type": "markdown", "metadata": { "id": "X-_R0wZtKz7h", "colab_type": "text" }, "source": [ "Now, since $J(\\theta)$ is a real number, its trace is the same number" ] }, { "cell_type": "markdown", "metadata": { "id": "WsH0w-P5Kz7i", "colab_type": "text" }, "source": [ "$$\n", "\\nabla_\\theta J(\\theta) =\\nabla_\\theta\\mathrm{Tr}(\\frac{1}{2} (\\theta^TX^TX\\theta - \\theta^TX^Ty - y^TX\\theta+ yy^T))\n", "$$\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true, "id": "JXPT-XkaKz7j", "colab_type": "text" }, "source": [ "Now, since $\\mathrm{Tr}(A) = \\mathrm{Tr}(A^T)$:\n", "\n", "$$\n", "\\nabla_\\theta J(\\theta) = \\frac{1}{2} \\nabla_\\theta(\\mathrm{Tr}(\\theta^TX^TX\\theta) - 2 \\mathrm{Tr}(\\theta^TX^Ty) + \\mathrm{Tr}(yy^T))\n", "$$" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true, "id": "79qCRfr9Kz7j", "colab_type": "text" }, "source": [ "Applying [16] and [17] we get:" ] }, { "cell_type": "markdown", "metadata": { "id": "Mk5et7OLKz7l", "colab_type": "text" }, "source": [ "$$\n", "\\nabla_\\theta J(\\theta) = \\frac{1}{2} (X^TX\\theta + X^TX\\theta -2X^Ty )= X^TX\\theta -X^Ty\n", "$$" ] }, { "cell_type": "markdown", "metadata": { "id": "-lP_Y0ZHKz7m", "colab_type": "text" }, "source": [ "To minimize $J$, we just equals its gradient to 0, obtaining,\n", "\n", "$$\n", "X^TX\\theta = X^Ty\n", "$$\n", "\n", "and, from here, we get a closed formula for our parameter vector $\\theta$:\n", "\n", "$$\n", "\\theta = (X^TX)^{-1}X^Ty\n", "$$" ] }, { "cell_type": "markdown", "metadata": { "id": "3kRlaDXOKz7n", "colab_type": "text" }, "source": [ "### 11. Linear regression with Python" ] }, { "cell_type": "markdown", "metadata": { "id": "9jIC2lXUKz7o", "colab_type": "text" }, "source": [ "Suppose we have target class _y_ (say, a house's price), dependent on 3 real-valued attributes $x_1,x_2,x_3$ (for example, number of rooms, minimum tax and house age). Suppose that we have the attributes and prices for 10 houses. _If we assume_ that the price of a house is a _linear combination_ of the three attributes, $y = \\theta_0 + \\theta_1x_1 + \\theta_2x_2 + \\theta_3x_3$, and that we should find the $\\theta$ values. Now, we can define $X$ (the design matrix) and $y$" ] }, { "cell_type": "code", "metadata": { "id": "zlsDJA4ZKz7p", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 201 }, "outputId": "a5400661-870e-4210-82be-f0fa8fbdad2f" }, "source": [ "X=np.array([\n", "[1.0,1.0,1.9,1.1],\n", "[1.0,0.1,1.0,1.0],\n", "[1.0,1.1,1.0,0.1],\n", "[1.0,1.1,1.1,0.9],\n", "[1.0,2.1,1.2,1.0],\n", "[1.0,0.9,1.0,3.0],\n", "[1.0,3.1,0.9,3.0],\n", "[1.0,1.9,0.9,2.1],\n", "[1.0,0.0,-0.1,1.1],\n", "[1.0,1.0,1.0,0.1]\n", "])\n", "print (X)\n" ], "execution_count": 50, "outputs": [ { "output_type": "stream", "text": [ "[[ 1. 1. 1.9 1.1]\n", " [ 1. 0.1 1. 1. ]\n", " [ 1. 1.1 1. 0.1]\n", " [ 1. 1.1 1.1 0.9]\n", " [ 1. 2.1 1.2 1. ]\n", " [ 1. 0.9 1. 3. ]\n", " [ 1. 3.1 0.9 3. ]\n", " [ 1. 1.9 0.9 2.1]\n", " [ 1. 0. -0.1 1.1]\n", " [ 1. 1. 1. 0.1]]\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "467GOJA-Kz7t", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 35 }, "outputId": "bf9e3bf7-f337-496b-fcbf-f24cc831115b" }, "source": [ "y=np.array([5.0,2.0,4.1,3.0,5.0,1.0,2.8,2.6,-0.4,4.1])\n", "print (y)\n" ], "execution_count": 51, "outputs": [ { "output_type": "stream", "text": [ "[ 5. 2. 4.1 3. 5. 1. 2.8 2.6 -0.4 4.1]\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "GtrS7M6GKz7v", "colab_type": "text" }, "source": [ "Note that we added a left column to the matrix, each cell valued with 1. This is to add a new $x_0$ attribute, as before. We can now calculate the parameters for the hyperplane that minimizes the sum of squares using the previous formula ($\\theta = (X^TX)^{-1}X^Ty$):" ] }, { "cell_type": "code", "metadata": { "id": "MSvKlTntKz7w", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 35 }, "outputId": "62918b07-1c0b-4ce3-c51b-a041fc44c5db" }, "source": [ "theta=np.dot(np.dot(np.linalg.inv(np.dot(np.transpose(X),X)),np.transpose(X)),y)\n", "print (theta)" ], "execution_count": 52, "outputs": [ { "output_type": "stream", "text": [ "[ 0.87782702 1.051817 2.18366554 -1.05476926]\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "dpZ7wwk-Kz7z", "colab_type": "text" }, "source": [ "Let's verify that our just found parameter vector, dot the attributes of each instance, gives us (approximately) the corresponding $y$ cell. We can do this for every training examples, just calculating $X\\theta$" ] }, { "cell_type": "code", "metadata": { "id": "M8Klf7ahKz7z", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 54 }, "outputId": "00f196f0-160a-4fec-d2fd-3342a6b20107" }, "source": [ "print (np.dot(X,theta))\n" ], "execution_count": 53, "outputs": [ { "output_type": "stream", "text": [ "[ 4.91836235 2.111905 4.11301432 3.48756547 4.6522721 0.84382008\n", " 2.93945092 2.62656285 -0.50078572 4.00783262]\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "iuPBiMn2Kz72", "colab_type": "text" }, "source": [ "Of course, a) ordinary least squares is a very simple method for regression and b) every statistical/machine learning package includes much more efficient ways of finding $\\theta$. For example, using the linalg library:" ] }, { "cell_type": "code", "metadata": { "id": "nKuA74wUKz73", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 110 }, "outputId": "fa0278fa-eb2c-4572-deb5-075387fb575f" }, "source": [ "print (np.linalg.lstsq(X, y)[0])" ], "execution_count": 54, "outputs": [ { "output_type": "stream", "text": [ "[ 0.87782702 1.051817 2.18366554 -1.05476926]\n" ], "name": "stdout" }, { "output_type": "stream", "text": [ "/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:1: FutureWarning: `rcond` parameter will change to the default of machine precision times ``max(M, N)`` where M and N are the input matrix dimensions.\n", "To use the future default and silence this warning we advise to pass `rcond=None`, to keep using the old, explicitly pass `rcond=-1`.\n", " \"\"\"Entry point for launching an IPython kernel.\n" ], "name": "stderr" } ] }, { "cell_type": "markdown", "metadata": { "id": "95a31TnbKz77", "colab_type": "text" }, "source": [ "### 12. Principal Component Analysis" ] }, { "cell_type": "markdown", "metadata": { "id": "OG1eQ4uGKz78", "colab_type": "text" }, "source": [ "To show how operating with matrices looks in numpy, I've sligthly adapted a tutorial on PCA with Python to a very simple example. The IPython notebook is [here](https://github.com/gmonce/datascience/blob/master/src/Just%20some%20notes%20on%20PCA%20in%20Python.ipynb). " ] }, { "cell_type": "markdown", "metadata": { "id": "WFzvjHE_Kz79", "colab_type": "text" }, "source": [ "### 13. References" ] }, { "cell_type": "markdown", "metadata": { "id": "W2cuCXcVKz7-", "colab_type": "text" }, "source": [ "[Linear Algebra Review and Reference](http://cs229.stanford.edu/section/cs229-linalg.pdf) (Zico Kolter)\n", "\n", "[A Beginner’s Guide to Eigenvectors, PCA, Covariance and Entropy](http://deeplearning4j.org/eigenvector)\n", "\n", "[A tutorial on PCA](http://www.cs.otago.ac.nz/cosc453/student_tutorials/principal_components.pdf)(Lindsay Smiths)\n", "\n", "[PCA Step by step in Python](http://sebastianraschka.com/Articles/2014_pca_step_by_step.html) (Sebastian Raschka)\n", "\n", "[CS229 Notes - 1](http://cs229.stanford.edu/notes/cs229-notes1.pdf) (Andrew Ng)\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "id": "HtVn5e_-Kz7-", "colab_type": "text" }, "source": [ "### 14. Addendum" ] }, { "cell_type": "markdown", "metadata": { "id": "KtaP7BUmKz7_", "colab_type": "text" }, "source": [ "A geometric interpretation in four intuitive steps, taken from StackExchange: http://math.stackexchange.com/q/636198\n", "\n", "**The Determinant is the Volume Change Factor**\n", "\n", "Think of the matrix as a geometric transformation, mapping points (column vectors) to points: x↦Mx. The determinant det(M)gives the factor by which volumes change under this mapping.\n", "\n", "For example, in the question you define the determinant as the volume of the parallelepiped whose edges are given by the matrix columns. This is exactly what the unit cube maps to, so again, the determinant is the factor by which the volume changes.\n", "\n", "**A Matrix Maps a Sphere to an Ellipsoid**\n", "\n", "Being a linear transformation, a matrix maps a sphere to an ellipsoid. The singular value decomposition makes this especially clear.\n", "\n", "If you consider the principal axes of the ellipsoid (and their preimage in the sphere), the singular value decomposition expresses the matrix as a product of (1) a rotation that aligns the principal axes with the coordinate axes, (2) scalings in the coordinate axis directions to obtain the ellipsoidal shape, and (3) another rotation into the final position.\n", "\n", "**The Transpose Inverts the Rotation but Keeps the Scaling**\n", "\n", "The transpose of the matrix is very closely related, since the transpose of a product is the reversed product of the transposes, and the transpose of a rotation is its inverse. In this case, we see that the transpose is given by the inverse of rotation (3), the same scaling (2), and finally the inverse of rotation (1).\n", "\n", "(This is almost the same as the inverse of the matrix, except the inverse naturally uses the inverse of the original scaling (2).)\n", "\n", "**The Transpose has the Same Determinant**\n", "\n", "Anyway, the rotations don't change the volume -- only the scaling step (2) changes the volume. Since this step is exactly the same for $M$ and $M^⊤$, the determinants are the same." ] } ] }