{"nbformat_minor": 0, "nbformat": 3, "worksheets": [{"cells": [{"cell_type": "markdown", "source": ["# Computing the SVD"], "metadata": {}}, {"prompt_number": 7, "language": "python", "metadata": {}, "cell_type": "code", "input": ["import numpy as np\n", "import numpy.linalg as la"], "collapsed": false, "outputs": []}, {"prompt_number": 25, "language": "python", "metadata": {}, "cell_type": "code", "input": ["np.random.seed(15)\n", "n = 5\n", "A = np.random.randn(n, n)"], "collapsed": false, "outputs": []}, {"cell_type": "markdown", "source": ["Now compute the eigenvalues and eigenvectors of $A^TA$ as `eigvals` and `eigvecs` using `la.eig` or `la.eigh` (symmetric):"], "metadata": {}}, {"prompt_number": 26, "language": "python", "metadata": {}, "cell_type": "code", "input": ["eigvals, eigvecs = la.eigh(A.T.dot(A))"], "collapsed": false, "outputs": []}, {"prompt_number": 27, "language": "python", "metadata": {}, "cell_type": "code", "input": ["eigvals"], "collapsed": false, "outputs": [{"output_type": "pyout", "prompt_number": 27, "text": ["array([ 0.08637178, 0.457892 , 2.04177547, 2.34383161, 8.37000184])"], "metadata": {}}]}, {"cell_type": "markdown", "source": ["Eigenvalues are real and positive. Coincidence?"], "metadata": {}}, {"prompt_number": 28, "language": "python", "metadata": {}, "cell_type": "code", "input": ["eigvecs.shape"], "collapsed": false, "outputs": [{"output_type": "pyout", "prompt_number": 28, "text": ["(5, 5)"], "metadata": {}}]}, {"cell_type": "markdown", "source": ["Check that those are in fact eigenvectors and eigenvalues:"], "metadata": {}}, {"prompt_number": 29, "language": "python", "metadata": {}, "cell_type": "code", "input": ["B = A.T.dot(A)\n", "B - eigvecs.dot(np.diag(eigvals)).dot(la.inv(eigvecs))"], "collapsed": false, "outputs": [{"output_type": "pyout", "prompt_number": 29, "text": ["array([[ 4.44089210e-16, 1.77635684e-15, 2.22044605e-15,\n", " -4.44089210e-16, 2.22044605e-16],\n", " [ 2.22044605e-16, -1.77635684e-15, -4.44089210e-16,\n", " -1.11022302e-15, 1.66533454e-16],\n", " [ -4.44089210e-16, -6.66133815e-16, 1.77635684e-15,\n", " -4.44089210e-16, -1.66533454e-16],\n", " [ -4.44089210e-16, 0.00000000e+00, 1.33226763e-15,\n", " 0.00000000e+00, -7.77156117e-16],\n", " [ 2.22044605e-16, 5.55111512e-17, -5.55111512e-16,\n", " -8.88178420e-16, 6.66133815e-16]])"], "metadata": {}}]}, {"cell_type": "markdown", "source": ["`eigvecs` are orthonormal! (Why?)\n", "\n", "Check:"], "metadata": {}}, {"prompt_number": 30, "language": "python", "metadata": {}, "cell_type": "code", "input": ["eigvecs.T.dot(eigvecs) - np.eye(n)"], "collapsed": false, "outputs": [{"output_type": "pyout", "prompt_number": 30, "text": ["array([[ 8.88178420e-16, -3.19189120e-16, -1.66533454e-16,\n", " -5.55111512e-17, -1.31838984e-16],\n", " [ -3.19189120e-16, 1.33226763e-15, -6.93889390e-17,\n", " 1.66533454e-16, 4.29344060e-16],\n", " [ -1.66533454e-16, -6.93889390e-17, 4.44089210e-16,\n", " 1.11022302e-16, 1.04083409e-17],\n", " [ -5.55111512e-17, 1.66533454e-16, 1.11022302e-16,\n", " 4.44089210e-16, 8.32667268e-17],\n", " [ -1.31838984e-16, 4.29344060e-16, 1.04083409e-17,\n", " 8.32667268e-17, 4.44089210e-16]])"], "metadata": {}}]}, {"cell_type": "markdown", "source": ["------\n", "Now piece together the SVD:"], "metadata": {}}, {"prompt_number": 19, "language": "python", "metadata": {}, "cell_type": "code", "input": ["Sigma = np.diag(np.sqrt(eigvals))"], "collapsed": false, "outputs": []}, {"prompt_number": 20, "language": "python", "metadata": {}, "cell_type": "code", "input": ["V = eigvecs"], "collapsed": false, "outputs": []}, {"prompt_number": 38, "language": "python", "metadata": {}, "cell_type": "code", "input": ["U = A.dot(V).dot(la.inv(Sigma))"], "collapsed": false, "outputs": []}, {"cell_type": "markdown", "source": ["Check orthogonality of `U`:"], "metadata": {}}, {"prompt_number": 39, "language": "python", "metadata": {}, "cell_type": "code", "input": ["U.dot(U.T) - np.eye(n)"], "collapsed": false, "outputs": [{"output_type": "pyout", "prompt_number": 39, "text": ["array([[ -2.10942375e-15, -1.08246745e-15, -8.46545056e-16,\n", " 8.32667268e-17, 8.25728375e-16],\n", " [ -1.08246745e-15, 4.44089210e-16, -1.38777878e-16,\n", " -5.55111512e-17, -1.38777878e-16],\n", " [ -8.46545056e-16, -1.38777878e-16, 2.22044605e-16,\n", " 9.85322934e-16, -3.95516953e-16],\n", " [ 8.32667268e-17, -5.55111512e-17, 9.85322934e-16,\n", " 2.22044605e-16, 4.99600361e-16],\n", " [ 8.25728375e-16, -1.38777878e-16, -3.95516953e-16,\n", " 4.99600361e-16, -2.22044605e-16]])"], "metadata": {}}]}], "metadata": {}}], "metadata": {"name": "", "signature": "sha256:0681e5cbedc6ae8e1a403f2da022bc69765556757869db2a13d24d3757513d00"}}