{"nbformat": 3, "worksheets": [{"cells": [{"cell_type": "markdown", "metadata": {}, "source": ["# Finding the SVD"]}, {"cell_type": "code", "outputs": [], "language": "python", "prompt_number": 10, "input": ["import numpy as np\n", "import numpy.linalg as la\n", "import matplotlib.pyplot as pt"], "metadata": {}, "collapsed": false}, {"cell_type": "code", "outputs": [], "language": "python", "prompt_number": 11, "input": ["np.random.seed(27)\n", "X = np.random.randn(2,2)"], "metadata": {}, "collapsed": false}, {"cell_type": "code", "outputs": [], "language": "python", "prompt_number": 7, "input": ["phi = np.linspace(0, 2*np.pi, 100)\n", "norm1_vecs = np.array([\n", " np.cos(phi),\n", " np.sin(phi)\n", "])"], "metadata": {}, "collapsed": false}, {"cell_type": "code", "outputs": [{"text": [""], "metadata": {}, "png": "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\npu8+/izirbeszm2LFubacaPvOBVj40YLdc7JseRrmWj0Y8UNf4pIlB91wwa46iqrhDV8uKWI3SPg\ncjruI85sslG/tWvh9NOhcWN7Ws62UGc3/BnEhx/CMcfAvvvC5MnQrFnQEjlO5rFypaVhOO00eO45\n+F0WWkH38WcAW7dagfN+/eDFF704iuPEysyZcM458Le/hScNg9fcDSFLl0K7drDffjBlSubnAXec\noBg3zpKtPfEEtG8ftDTBkoUPOcEQix912DA44QS44AIYMSJ9jX42+ojDRDbo9/rrloZhwAA3+uAz\n/rRk82bo2hWGDrXjpJOClshxMhNVW7z94AOb8ftOdsN9/GnGggU2Mzn4YHjpJahWLWiJHCcz2brV\nSiVOngzvvgu1awctUXIIJI5fRFqLyBwRmS8iXcto80z086ki0jTePsPK229bXH6nTnbuRt9xYmPt\nWovRX73aouHCavRjJS7DLyKVgN5Aa+BIoJ2INC7R5mzgcFVtAFwH/DeePjOVXflRt20z187tt8PI\nkXDTTZmV/zsbfMRhJmz6zZhhoc7HHgvvvAOTJkWCFintiNfH3wxYoKpLAERkAHABMLtYm/OBfgCq\nOlFEckSkpqquibPvUPDttxa1IwKTJkGNGkFL5DiZy5AhcN110KuX5d9xSifemruXAGep6rXR6/ZA\nc1W9uVib4cCjqvpp9Hos0FVVvyxxr6zz8U+aZCUQr7wSHnwwnAUfHCcVFBXBQw9Z8aEhQ+D444OW\nKHUEEcdfXktdUqjssvCl8PLL5t7p08fqejqOExs//mh59Fetgs8/d39+eYjX8K8A6he7rg8s302b\netH3fkPHjh3Jzc0FICcnh7y8PPLz84GdfshMve7Vqxd5eXm0aJHPLbfAiBERevaEiy9OD/niuS7u\nI04HeVy/7NGvTp182raF+vUjPPAA1K4dLv3KGq+CggKAHfaywqhqzAf2xbEQyAUqA1OAxiXanA2M\niJ6fCHxWxr00zIwbN07XrlXNz1c97zzVDRuClihxjBs3LmgRkorrl568+aZqjRqq//2valFR2e0y\nVb/yErWdFbLdccfxi0gboBdQCXhJVR8VkS5RS94n2mZ75M8moJOqflXKfTReWdKZefPg3HNtF+5j\nj7k/33FiZcsWuPNOy047aBAcd1zQEgVLLD5+38CVAj74wAo4P/IIdO4ctDSOk7ksXQqXXQY1a0JB\n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\n", "output_type": "display_data"}], "language": "python", "prompt_number": 8, "input": ["X_norm1_vecs = X.dot(norm1_vecs)\n", "\n", "pt.grid()\n", "pt.plot(X_norm1_vecs[0], X_norm1_vecs[1])\n", "pt.gca().set_aspect(\"equal\")"], "metadata": {}, "collapsed": false}, {"cell_type": "markdown", "metadata": {}, "source": ["Approximately, what is $\\|X\\|_2$?"]}, {"cell_type": "code", "outputs": [{"text": ["1.4317821063276355"], "metadata": {}, "prompt_number": 15, "output_type": "pyout"}], "language": "python", "prompt_number": 15, "input": ["np.sqrt(1.3**2 + 0.6**2)"], "metadata": {}, "collapsed": false}, {"cell_type": "code", "outputs": [{"text": ["1.4309926780552626"], "metadata": {}, "prompt_number": 16, "output_type": "pyout"}], "language": "python", "prompt_number": 16, "input": ["la.norm(X, 2)"], "metadata": {}, "collapsed": false}, {"cell_type": "markdown", "metadata": {}, "source": ["--------------\n", "Let's find the vector $v_1$ that achieves that.\n", "\n", "First, find the norms of all the $Xn$, where $n$ are the norm-1 vectors we generated above:"]}, {"cell_type": "code", "outputs": [{"text": ["1.4308557961109123"], "metadata": {}, "prompt_number": 18, "output_type": "pyout"}], "language": "python", "prompt_number": 18, "input": ["norm_X_norm1_vecs = np.sqrt(np.sum(X_norm1_vecs**2, axis=0))\n"], "metadata": {}, "collapsed": false}, {"cell_type": "markdown", "metadata": {}, "source": ["Next, find the approximate 2-norm of X from this as `approx_norm`:"]}, {"cell_type": "code", "outputs": [{"text": ["1.4308557961109123"], "metadata": {}, "prompt_number": 19, "output_type": "pyout"}], "language": "python", "prompt_number": 19, "input": ["approx_norm = np.max(norm_X_norm1_vecs)\n", "approx_norm"], "metadata": {}, "collapsed": false}, {"cell_type": "markdown", "metadata": {}, "source": ["And find the vector $v_1$ that achieves `approx_norm`:"]}, {"cell_type": "code", "outputs": [{"text": ["(array([48]),)"], "metadata": {}, "prompt_number": 22, "output_type": "pyout"}], "language": "python", "prompt_number": 22, "input": ["np.where(norm_X_norm1_vecs == approx_norm)"], "metadata": {}, "collapsed": false}, {"cell_type": "code", "outputs": [], "language": "python", "prompt_number": 25, "input": ["v1 = norm1_vecs[:, 48]"], "metadata": {}, "collapsed": false}, {"cell_type": "code", "outputs": [{"text": ["0.99999999999999989"], "metadata": {}, "prompt_number": 28, "output_type": "pyout"}], "language": "python", "prompt_number": 28, "input": ["la.norm(v1, 2)"], "metadata": {}, "collapsed": false}, {"cell_type": "code", "outputs": [{"text": [""], "metadata": {}, "png": "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\n2Xi51wAAAABJRU5ErkJggg==\n", "output_type": "display_data"}], "language": "python", "prompt_number": 27, "input": ["\n", "X_v1 = X.dot(v1)\n", "\n", "pt.grid()\n", "pt.plot(X_norm1_vecs[0], X_norm1_vecs[1])\n", "pt.arrow(0, 0, X_v1[0], X_v1[1])\n", "pt.gca().set_aspect(\"equal\")"], "metadata": {}, "collapsed": false}, {"cell_type": "markdown", "metadata": {}, "source": ["------------------\n", "Now $v_2$ has to be orthogonal--that doesn't leave much choice in 2D:"]}, {"cell_type": "code", "outputs": [], "language": "python", "prompt_number": 32, "input": ["v2 = np.array([v1[1], -v1[0]])"], "metadata": {}, "collapsed": false}, {"cell_type": "code", "outputs": [{"text": ["1.0\n", "0.0\n"], "stream": "stdout", "output_type": "stream"}], "language": "python", "prompt_number": 33, "input": ["print(la.norm(v2, 2))\n", "print(v1.dot(v2))"], "metadata": {}, "collapsed": false}, {"cell_type": "markdown", "metadata": {}, "source": ["------------\n", "Now define the matrices $V$ and $\\Sigma$:"]}, {"cell_type": "code", "outputs": [{"text": ["[[-0.99547192 0.09505604]\n", " [ 0.09505604 0.99547192]]\n", "[[ 1.4308558 0. ]\n", " [ 0. 0.48749067]]\n"], "stream": "stdout", "output_type": "stream"}], "language": "python", "prompt_number": 36, "input": ["V = np.array([v1, v2]).T\n", "print(V)\n", "\n", "Sigma = np.diag([\n", " la.norm(X.dot(v1)),\n", " la.norm(X.dot(v2))\n", "])\n", "print(Sigma)"], "metadata": {}, "collapsed": false}, {"cell_type": "code", "outputs": [], "language": "python", "prompt_number": 45, "input": ["U = X.dot(V).dot(la.inv(Sigma))"], "metadata": {}, "collapsed": false}, {"cell_type": "markdown", "metadata": {}, "source": ["Now watch this:"]}, {"cell_type": "code", "outputs": [{"text": ["array([[ 0.97276264, 0.02674873],\n", " [ 0.02674873, 1.02723736]])"], "metadata": {}, "prompt_number": 48, "output_type": "pyout"}], "language": "python", "prompt_number": 48, "input": ["U.dot(U.T)"], "metadata": {}, "collapsed": false}, {"cell_type": "markdown", "metadata": {}, "source": ["Notice anything? (It's not very accurate, but still visible.)"]}, {"cell_type": "markdown", "metadata": {}, "source": ["--------------\n", "What we have discovered is called the *singular value decomposition (\"SVD\")*."]}, {"cell_type": "code", "outputs": [{"text": ["(array([[-0.91254817, -0.40896923],\n", " [-0.40896923, 0.91254817]]),\n", " array([ 1.43099268, 0.48708872]),\n", " array([[-0.99676245, 0.08040283],\n", " [ 0.08040283, 0.99676245]]))"], "metadata": {}, "prompt_number": 47, "output_type": "pyout"}], "language": "python", "prompt_number": 47, "input": ["la.svd(X)"], "metadata": {}, "collapsed": false}, {"cell_type": "code", "outputs": [{"text": ["[[-0.9145846 -0.36918512]\n", " [-0.40439462 0.92935588]]\n", "[[ 1.4308558 0. ]\n", " [ 0. 0.48749067]]\n", "[[-0.99547192 0.09505604]\n", " [ 0.09505604 0.99547192]]\n"], "stream": "stdout", "output_type": "stream"}], "language": "python", "prompt_number": 53, "input": ["print(U)\n", "print(Sigma)\n", "print(V)"], "metadata": {}, "collapsed": false}], "metadata": {}}], "metadata": {"name": "", "signature": "sha256:7c90e0de6146bb41bedebb25735e6f0bb71860df65e6312e232b2dd7e4c48ba3"}, "nbformat_minor": 0}