{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Matrix Completion in Julia via Semidefinite Programming\n", "### Author: [Alex Williams](http://alexhwilliams.info)\n", "\n", "**License**: \"Creative
This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Relevent papers\n", "\n", "Maryam Fazel. [Matrix Rank Minimization with Applications](https://faculty.washington.edu/mfazel/thesis-final.pdf). Stanford University, Thesis (2002).\n", "\n", "Benjamin Recht. [A Simpler Approach to Matrix Completion.](http://www.eecs.berkeley.edu/~brecht/papers/09.Recht.ImprovedMC.pdf). *J Mach Learn*. 12, 3413-3430 (2009).\n", "\n", "Emmanuel J. Candès, Benjamin Recht. [Exact Matrix Completion via Convex Optimization](http://dx.doi.org/10.1007/s10208-009-9045-5). *Found Comput Math* 9, 717–772 (2009)\n", "\n", "Emmanuel J. Candès, Terence Tao. [The Power of Convex Relaxation: Near-Optimal Matrix Completion](http://dx.doi.org/10.1109/tit.2010.2044061). *IEEE Transactions on Information Theory* 56, 2053–2080 (2010).\n", "\n", "Emmanuel J Candès, Yaniv Plan. [Matrix Completion With Noise](http://dx.doi.org/10.1109/jproc.2009.2035722). *Proc. IEEE* 98, 925–936 (2010).\n", "\n", "Benjamin Recht, Maryam Fazel, Pablo A. Parrilo. [Guaranteed Minimum-Rank Solutions of Linear Matrix Equations via Nuclear Norm Minimization](http://dx.doi.org/10.1137/070697835). *SIAM Rev.* 52, 471–501 (2010).\n", "\n", "### Relevent Code\n", "\n", "**Github Repo**: [Convex.jl](https://github.com/JuliaOpt/Convex.jl)\n", "\n", "**Paper**: Madeleine Udell, Karanveer Mohan, David Zeng, Jenny Hong, Steven Diamond, Stephen Boyd. [Convex Optimization in Julia](https://web.stanford.edu/~boyd/papers/pdf/convexjl.pdf). *SC14 Workshop on High Performance Technical Computing in Dynamic Languages*" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO: Loading help data...\n" ] } ], "source": [ "using PyPlot\n", "using Convex\n", "using SCS\n", "\n", "# passing in verbose=0 to hide output from SCS\n", "solver = SCSSolver(verbose=0)\n", "set_default_solver(solver);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Overview/Background\n", "\n", "Many datasets are naturally organized into a table or matrix. Each row represents an object, event, or person under study, and each column represents a different measurement or attribute of those items. A famous example is the *Netflix problem* dataset. The dataset contains user ratings of Netflix movies, with each row representing a customer/user and each column representing a movie available to watch. However, each user only watches and rates very few movies, so our observations of this matrix are very incomplete. Estimating the complete matrix would help Netflix predict how individual users would rate future movies, and thus make appropriate reccomendations.\n", "\n", "In this case, we might expect the data matrix of user ratings to be approximately low-rank, since an individual’s tastes or preferences are probably well-described by a handful of factors and interests. Other applications and motivations for low-rank matrix completion can be found in the papers above, and in [this lecture by Emmanuel Candès](https://www.youtube.com/watch?v=1E1guA4pbv4). \n", "\n", "### Problem Statement\n", "\n", "Let $D$ denote a data matrix with many incomplete entries, and let $\\Omega$ be the set of all indices in $D$ that are observed. Ideally, we would seek a reconstruction of the full matrix, $X$, as the solution to the optimization problem:\n", "\n", "$$\n", "\\begin{aligned}\n", "& \\underset{X}{\\text{minimize}} & & \\text{rank}(X) & & \\\\\n", "& \\text{subject to} & & X_{ij} = D_{ij} & & \\forall (i,j) \\in \\Omega\n", "\\end{aligned}\n", "$$\n", "\n", "However, as described in the references above, this is an NP-hard problem that is very difficult to solve directly. Instead, we solve a convex relaxation of this problem (which turns out to be a semidefinite program):\n", "\n", "$$\n", "\\begin{aligned}\n", "& \\underset{X}{\\text{minimize}} & & ||X||_* & & \\\\\n", "& \\text{subject to} & & X_{ij} = D_{ij} & & \\forall (i,j) \\in \\Omega\n", "\\end{aligned}\n", "$$\n", "\n", "Where $||\\cdot||_*$ denotes the nuclear norm of a matrix, which is simply the sum of the singular values:\n", "\n", "$$||A||_* = \\sum_{k=1}^n \\sigma_k(A) = \\text{trace}\\left(\\sqrt{A^T A}\\right)$$\n", "\n", "Penalizing the nuclear norm of our reconstructed estimate, $X$, encourages a low-rank solution. This is analogous to penalizing the $\\ell_1$ norm of a reconstructed signal, which encourages the signal to be sparse. In our case, we want the singular values, $\\sigma_k$, to be sparse." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Create some synthetic data, and observe a subset of the entries" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": [ "iVBORw0KGgoAAAANSUhEUgAAAjIAAAEgCAYAAACuOplUAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAIABJREFUeJzt3Xd0VWX2PvB903tvkASSECCUUBKKhV4VFHFExYKAgwXFAio6YtcZO45lLDgqiorYlSbYAqIUITTphDRCQgipkJ6c3x9+cxc3efY1B+Po4fd81spasnPu6ffkzfV9sm2GYRhCREREZEEuf/YOEBEREZ0uDmSIiIjIsjiQISIiIsviQIaIiIgsiwMZIiIisiwOZIiIiMiyOJAhIiIiy+JAhoiIiCyLAxkiIiKyLA5kiIgsYuHCheLi4mL/ysnJ+bN3ydIeeughh/NJ1sQr9zvExcU5vAla8zV9+vQ/e7dNa34Mbm5u4uPjI1FRUZKamipTp06VL7/8UhobG9t0u8OGDbNvc/jw4W26bqI/04EDB+TOO++Ufv36SWhoqLi7u0toaKj0799f7rzzTjl48OBvrsNms/0P9vT/H2bOZ/MBkIuLi3h4eEhQUJB06tRJxowZI4888ojk5ua26T6mpaU5bHPNmjVtun6r4kDmdzD7ILHZbGfEw6exsVGqq6ulsLBQtm7dKosWLZKJEydKz549Zfv27W22nVPP1Zlw3ogaGxvl/vvvl6SkJJk/f76kp6dLSUmJNDQ0SElJiWzZskXmz58vSUlJ8sADDwhb4VlHfX29lJeXS2ZmpnzzzTfy0EMPSXx8vMybN08aGhraZBvNn4l8Lv7K7c/eASubN2+elJeX2/9tGIbcdddd9n8nJCTITTfd5PCaHj16/M/274/QdEw1NTWSnZ0tK1eutP/WsXfvXhk0aJCkpaVJamrq797WqQ9xPtDpTDB37lyZP3++/d+BgYEyefJk6dixo2RlZckHH3wg5eXl0tjYKI899phUV1fLU0899SfuMbXGzJkzJSEhQUpKSmTz5s3yzTffSGNjozQ2Nsrjjz8umZmZ8v777//u7TR/JvK5+H8MalM2m83+NXz48Bbf79ixo/3706ZNM3bs2GFMmDDBCAkJMWw2m7FmzRojMzPTYT0LFy50WMfUqVPt34uLi2uxjRMnThjPPvusce655xrBwcGGu7u7ERERYVx00UXG119/3abHVF9fb9xzzz0OyyQmJhp1dXX2ZbZu3WrMnDnTOOuss4yYmBjDx8fH8PDwMNq1a2eMGzfOWLJkicM6H3zwQYf1oa+mc5KZmWncfvvtxuDBg40OHToYfn5+hru7uxEeHm6MGDHCWLBggdHQ0GD6mIna2s8//+xwD8fExBg5OTkOy2RnZxvR0dEOy23ZssX+/bfeested3FxMTIzM41XX33V6NWrl+Hl5WVEREQY06dPN44cOdJi+xs3bjQuv/xyo0OHDoanp6fh5eVlxMbGGkOGDDFmz55tbN68ucVrcnJyjDvvvNNITk42/Pz8DA8PDyMhIcG47rrrjH379rVYvvl79+TJk8Y999xjxMfHG+7u7sa0adOMwYMH278/duzYFutIT093WMeyZcvs32tsbDSWLFlijB8/3oiKijLc3d2NwMBAY8iQIcaCBQuM+vp6eO6/+uorY9CgQYaPj48RFBRkTJgwwdixY4fD/rq4uOgX7zeOc82aNQ7f37lzpxEfH++wzJtvvumwzFNPPWVMnDjR6NKlixEaGmq4ubkZfn5+Rq9evYw5c+YYhw8fdlj+t56Jp/4seOONN4zLL7/c6N69uxEeHm64u7sbvr6+Rrdu3YwbbrjB2LNnT6uP1Qo4kGljZgYyKSkphq+vr8MbCQ1k3n77bYd1nDqQiY+Pd/heRkaG0blzZ6c3/N13392mx2QYhjF+/HiH5T788EP791588cXffBPeeOON9uUfeughp8u6uLjYz8nSpUt/c93jxo0zGhsbTR0zUVu79tprHe7L1157DS736quvOiz397//3f69UwcyNpvNuOCCC+A936FDByMvL8/+urS0NMPNzc3p++Shhx5y2I/ly5cb/v7+6vLe3t7Gp59+6vCa5j/gTx202Gw2Y/r06cY777xj/7ebm5tRUFDgsI477rjDYbDX9N6trq42xo0b5/QYhg8fblRWVjqsr/k5a/ry8fExRo8e/YcMZAzDMDZt2uSwTPfu3R2+Hxoa6vRYQkJCjN27d9uX/63n3Kk/C1JTU50u6+XlZaSlpbX6eP/q+L+W/kRbt24VNzc3ufrqq6Vr165y8OBB8fX1Pe31NTQ0yMUXX2yfKBgYGChXXXWVtG/fXjZu3ChLly4VEZGnnnpKevfuLVdccUWbHIeIyHXXXScrVqyw//vbb7+VSy+9VEREvLy8ZODAgdK3b18JCwsTX19fOXHihPz444+SlpYmIiKvvfaazJgxQ1JTU2XMmDHi5+cnr7zyihw6dEhEWv5vuv79+4uIiLu7u/Tp00f69esn4eHhEhAQIFVVVbJ161ZZtmyZGIYhK1eulE8//VQuueSSNjteIrNOnZhps9nU99/kyZNl5syZ9n+vXbtWXefy5cvlwgsvlJSUFPnuu+/khx9+EBGR3NxcueWWW+STTz4REZFXXnnFPk8jJiZGrr76avH395cjR47I/v37Zd26dQ7zLbKzs+XSSy+VqqoqEfn1/XfZZZeJl5eXfP7557Jt2zaprq6Wq666Snbt2iXx8fFw/9atWycDBw6U0aNHS01NjQQHB8ull14qt956q5SVlUlDQ4MsXrxYbr/9dhH5dQ7R4sWL7a+fPn26fb/uuOMOWblypYiIuLq6yqRJkyQ5OVmysrJk0aJFUlNTI2lpaXL77bfLa6+9JiIi+fn5cvPNN9vX5+HhIdOmTZOwsDD58MMP5ZtvvlHP7e/Vv39/6d27t33e4N69e6WgoECioqJERCQ2NlZGjBghHTt2lODgYBEROXz4sHz44YdSXFwsJSUlMnfuXPtz++mnn5aMjAx59dVX7duYOXOmdOrUSUR+fd43iYiIkAsvvFASExMlODhY3NzcpKCgQD777DPJzc2VmpoamTVrluzcufMPO/7/qT97JHWm+a1PL079RMZmsxlffPFFi2VO9xOZ5p9O/Pzzzw6vu+yyy+zf69OnT5sdk2EYxu7du1v8ptjcL7/8YixevNh48cUXjWeffdZ45plnDB8fH/trHn30UYflhw4d+pvbbXLw4EHjww8/NP7zn//Y1x0TEwN/qyX6M3h7ezv8tu1MYGCgfVk/Pz97vfmnCzNmzLB/r7Gx0Rg+fLjDJwxHjx41DMMwJk6caK8/+eSTLbZXXV3t8AnOqZ+KtG/f3igvL3dYNjY21v7922+/3f695p9UTJo0CR7fTTfdZF8mNTXVXv/222/tdVdXVyMrK8swDMMoLi52+ETp6aefdljfyy+/7PApT1FRkWEYhvHEE0847M+p/5u+tLTU4VORtv5ExjAcn7k2m63F/76rqKgwVq1aZSxYsMB47rnnjGeeecbhWnl7ezv877K0tLRWbdcwfr1O33//vfHGG28Y//73v41nnnnG4VNBFxcXIzc3t9XH/FfGT2T+RMnJyTJhwoQ2W1/Tb2NNBgwYoC67fft2OXny5O/6BOhURrNJZ6f+drdt2zaZOnXqb47+8/LyTG83OztbpkyZIuvWrWvzdRP91U2dOtX+3zabTaZMmWL/lNMwDElPT5fzzjtPhg4dKl988YWI/BpS+Oyzz6RLly6SmJgo/fr1k6FDh0r79u3t6zr1WZKfn+/w235zzt579957L6zPmDFDXnnlFRERSU9Pl71790pSUpK899579mWaPq0QEdmwYYND8mfu3Lkyd+5cuO6GhgbZuHGjjBs3Tn7++Wd7venT7yaBgYFy0UUXyVtvvaXu/++lPRcbGxvlvvvuk/nz50ttba36+pqaGikqKpLIyEi4Ps3zzz8vDzzwgFRUVDjdt7y8PImJiWnVOv/KGL/+EyUlJbVqueY3b01NDVyuuLi41du22WxSVFTU6uV/y759+xz+3fTmqKqqkvHjxzsMYmz/Fxu0NYsOasflzMUXX+zwIG3LdRO1pejoaPt/l5aWOiQeT9X8e6cOME5ls9nsP+CaREREOPy7pKRERERuvfVWmTFjhri7u9t/0C9atEgefPBBGT9+vERHR8tnn31mf52ZZ4n2HLHZbOozrm/fvtK3b1/7v999912pra21/68wkV//d/Xp7I/NZpNjx46JyK/nsklwcLC4uro6LNv8fLW1U5+LNpvNfg+89NJL8sQTT9gHMdpzS8T8s+vLL7+U2bNnOwxizvTnIj+R+RNpn4Y0/wuTTf+fusmBAwfg60JDQ+3/bbPZ5PHHHxc3N/0SBwUFtXZXf9Prr7/u8O+RI0eKyK+/2eXn59vrc+bMkXvuuUfCwsJE5NcHyekOqPbv3y/btm2z//uKK66Qp59+2v7gHzBggGzevPm01k3U1oYOHSoZGRki8usvJ0uWLHH4Yd1kyZIlDv8eMmQIXJ9hGFJQUCCdO3e2144ePeqwTNN73MXFRRYsWCBPP/20rF+/Xvbv3y8HDx6UlStXSkZGhpSVlcnUqVPl/PPPFy8vLwkNDbXva8eOHeWWW25Rj8vf31/9nre3t/q9GTNm2OevvP/++9KnTx/7AC4sLEwuvvhi+7KnPttERK6//nrp0qWLuu5+/fo5HL/Ir4O6+vp6h2di8/PVljZu3OjwC1z37t3tA88PPvjAXo+OjpZPPvlE+vbtK+7u7vLKK684zOsx69R1+/n5yccffyxDhw4VT09PWblypYwfP/601/2X9ef9X60zk5k5MtOnT4frKCsrc1jPNddcY//eV199pc5Ubz5H5q233oLrz8jIML766qs2Oaa6ujrj7rvvdlima9eu9sjze++95/C99PR0+2tP/f/h6HyMGjXK/r0BAwa02K8ff/zR4fWnJih2795teHh4tHqODdEfbfPmzQ73a0xMTIs5Cjk5OQ7xaxcXFzV+3XzuV0NDgzFs2DCHOSZNc2T27dtnnDhxosU+bdmyBb4/T50j4+3trcZ1f/rpJ2Pbtm32f5uJM5eVlTnMkevUqZP9v+fMmeOwbElJieHu7m7//tSpU+E6S0pKjMWLF9v//eSTT6rPxJKSEvufvfi9c2SaJ4B27tzZYj7kO++8Y//+qcnSiy66yF5vfg1dXFyM7Oxs+/fXrVvnsM4VK1a02LdTk1i9e/d2+N6UKVNaPcfGSviJzF9QQECAJCUlyd69e0VEZNGiRZKXlydeXl6yevVq9XXjxo2Tnj17yi+//CIiv340+/nnn0ufPn3Ezc1NcnNzZcOGDbJz506ZOnWqjB071vS+5eTkyLPPPis1NTWSk5MjK1askMOHD9u/7+fnJ4sXL7Z/qtT8o+WrrrpKrrjiCjly5IgsXLjQ6bZiY2Pt/71lyxa57bbbJDY2Vmw2m9x8882SmJgoLi4u9tYIt912m2zdulUqKipk4cKFUldXZ/r4iP4oqampMmfOHPsfxMvLy5Pk5GSZPHmydOjQQbKzs+1/EK/JHXfcISkpKeo633zzTSksLJSUlBT5/vvvHea2TJgwwf6/Tl544QV54403ZMSIERIfHy9RUVFSU1Mjn376qX15m81mT8/ccsst8sorr0hVVZVUV1fLwIEDZdKkSZKQkCB1dXVy4MABWbt2reTl5clbb70lvXv3Nn0+AgICZNKkSbJo0SIREXtC0WaztfikKigoSK677jr7vJp33nlH9uzZI6NGjRI/Pz8pLCyU9PR0Wb9+vURHR8vkyZNFRGTKlCny8MMP2z/VvuGGG2T9+vX21FLT/3r7vZYsWSKbNm2SsrIyhz+I1+TKK6+UKVOm2P+dlJRkT5cuW7ZMrr/+emnfvr0sX75ctmzZom7n1GeiyK/znbZt2ybu7u6SkpIiI0aMkKSkJHsaa8eOHTJ58mTp0aOHpKWlyffff98mx/uX82ePpM40bfGJjGEYxsKFCx3W1fQVGRlpDBw40P7v5n8Q79ChQ0aXLl3ga08d5TvbtrNjcvbVs2dPY8eOHS1e3/xvzDR9jR071iH90HyfVqxYoW7r+PHjhmEYxs033wy/36dPH6Nfv378RIb+UhobG4377rvPcHV1dfpecnNzM+6///4Wr2/+iczIkSPh62NjYx3+oNqsWbN+8/175ZVXOmxr+fLlRkBAwG8+S05NVTb/pOK3rF27tsU6zz33XLhsdXW1+ndzTv1q/re13njjDcPFxaXFcl5eXsagQYNM7a92nNqXu7u7cd9997X4o5w//fSTwyfGTV8eHh4tPjU59RMZwzCMAQMGwG3NmjXLMIxfP3E/NfV26rVq/reMzpRPZDiQaWNNN4yLiwv84RkXF2f//m8NJt5++20jOTnZ8PLyMiIjI41p06YZhw8fNqZNm2bfTvM3rWEYRmVlpfHCCy8Yw4YNs/9VRz8/P6Nbt27GlVdeabz55ptGaWnpaR2Ti4uL4erqavj4+Bjt2rUzUlNTjalTpxpLly5V/+hcVVWVcddddxkxMTGGp6enkZCQYMybN8+orq7+zfPxxhtvGH369DG8vb0d9qFpINPQ0GA8/vjjRkJCguHp6WnExMQYN998s1FaWmoMGzbM6bUg+rPs37/fuOOOO4zU1FQjJCTEcHd3N0JCQox+/foZd955p3HgwAH4uqZfcJru68zMTOPFF180kpOTDW9vb/Uv+27ZssWYN2+eMWrUKCMhIcHw9/c3PDw8jMjISGPkyJHGggUL4Pv38OHDxj/+8Q8jNTXVCAwMNNzd3Y3g4GAjNTXVmDlzprF06VKjtrbWvnzTH7Ns2r/W6Nq1q8N7W/tf4k0+/fRTY+LEiUZsbKzh5eVleHt7G3Fxccb48eONp59+2sjMzGzxmpUrVxqDBg0yfH19jaCgIGP8+PHG5s2bT2t/0XG6uLgY7u7uRlBQkJGYmGiMGTPGePTRR1v8dd5TrV271hgyZIjh4+NjBAYGGqNGjTLWr1/f4ho3H8gcPnzYmDx5shEZGWm4ubnZl7vlllvsy+zYscMYN26c4e/vb/j5+RnnnHOOsWzZMnt8u+k1Z8pAxmYYbNZARERE1sT4NREREVkWBzJERERkWRzIEBERkWVxIENERESW1aq/I1NUVCSrVq2SuLg4p3+pkYispaqqSrKysmTs2LH2v7ZsNXw+EZ15TD2bWhNtevfddw0R4Re/+HWGfr377rt/bD7yD8TnE7/4deZ+tebZ1KpPZOLi4kRE5NqHnpOouESH70V6e8HX/HykDNZDfPRNdg/FPTt2FeEOnltz8DZsoPGWiMiopFBY33+sCtZFRAbG4K6vhyvwa3blV8L64ATc1+jQcbyek3UNsO5sn45W4gZgB45Vw3qQtyusB3rhursbPq8iIttyT8B67jFcv/acjrC+JR830uvXPgDW1+fi5UVEfD3x/zktr8Lntnd73PuqWxje9k+5x2F9W67ecTY8AL9fOofh+slavK/HT9bD+okavLyrK7524TUF8vJ9t9jf41bUps8nb/35NLV/LKwbyl+wmP3JL7D+70nJ6jbairZPD63EfdoeOr8zrC9YnwPr15/dQd32T4fwX8s9ehI/h/7WCzfFbEva+bj27XRYf2taapus/5nvM9XX3DUiwdQ2zNL2ae6Xe2FdezaJiCSGecL635LNXTttn54E56nk8CH55vm7W/VsatVApunj2qi4ROnQtafD92L9fOBrcrxxt9JIf3d1O12i8A/70vxSWD8k+AeJNpCJS4qC9bKAk+o+JXYKwdsoxa8p8MI/xBK64Y/Gqo7i9VQoP5Cc7ZOXMrgqDcCDq3BffPm1waaHk4FMrhv+wVDigeuduneF9cM++CGYGB8M6xkeelfcAGVA5qkMAuLi8IClR3u87Vxv3HAu20X/s+cRIfj90rEdrpdX4/vArQK3X/Cqwsfmpgxkoqt//eXByv9Lpi2fTxF++iMxJSUR1rWHc+DP+Fo4aznQVrR9Ct2Ljy8lpRestzuGf7lMScEDHxGRQq9jsO5Zjp9DKSlx6rrainY+/L7Bv2iZvUba+iNy9PdVSkp3U9swS9un4O14ee3ZJCLSMQofh9lrp+1TeLZ+nlrzbOJkXyIiIrIsDmSIiIjIsjiQISIiIsviQIaIiIgsq1WTfZscKauVxmLHZMyqXXjCrTa5MNwPJ25ERD7ejSdPxgbhGdMT+0TCuosyJzWzGM+aL6nEEydFRNZm44mb0YEesN6vA54cl12Gt90lHE9kCvLE6xcRWbwtH9YDfPBrjlfgbXu64m1nHMOT8lI74MmwIiIRAfgand+9E6xvP4onRWvXYncRnpTXJVyfab8pCyeatMng+4vwcWv1CD88cb1fHJ60LiKyp0CZJK5M3u0ZgZNUeWW1sD4iEW+7vAZPPHUp1CffW01+aY0Yxx3v9esH4nTc+T3CYV2bjCgiMuuTXbAeE4Tfd1/eMMDUNh5ejRNFucpzS0QkMgBvu30Avq5vXoETU8+uOQTrXSLwBNCVuwrVfVqyHT+fFl7ZW31NW3B27e5augfW180d0ibbeDotA9YTnTyfzNK2/eCqfbD+8FgcqEjtiH8G3z1cT1H96zt8f3y2LQ/WJ/bGaaYP0w/D+ksXd2tRS0+vko/UPXLET2SIiIjIsjiQISIiIsviQIaIiIgsiwMZIiIisiwOZIiIiMiyTKWWAr3dJNTXcTb8nCF4pnPuCZz02OykD81wpR/RBqWfzvd78J/C1v6Q/pAk3CZgQEecNBIRcVUSLtuO4PRJ8Qnc76hzJE6f/HgA/6n0Y6X4/ImI3Deu5QxvEZFc5U+Ae8X6wXpeOU6+9I/F52NDjt7XyMsNj4nnr9gP65cPwmkS7VpovYV2HNb3aXQSbuVQVY//7H9FTSOsdwzEyYNvD+JEW5XSH0lEZFACTgxoKaT//pQL6wOVNhWv/4h744T44VRZF9H7jFnNzYPiJCXFMamhJdS0BMhdS3EfGhGRF0CyQkTk7mU4NaI5/+X1sL5i5lmwvmAjvqYi+m+i152F31/a+bhjaNv1/Tm/R4Sp5Rdtyob1q/vjfk5LtuKkzAal956IyHMX4XYAZu+P1zZkwXp9A17+5qFx6j69oxz3NQPwtdMkR+E06U0f45Sd9nxycdE/15g3EqdPzfrvevw8uzy1ZR8z7dog/ESGiIiILIsDGSIiIrIsDmSIiIjIsjiQISIiIsviQIaIiIgsy1Rqqa7BkNp6x2RHnpJOOl6JUxgebvpM5NIa3G/GXenbFKakSTSNSiuOiho9ZeKuNG7ydsdjwABv3PtESz+FBuBjcFdSQCIixypx7xXtOCrrcBqnTplpX1qNr4OWTHKmfQROTDUoF6O8Wr8WiL+33iuopAonnWob8PlQynKiDq/H18PV+c4BpdV4XdoE/Ygg3A9LO3+RyvK+nvit7lVr6hFgOR8ovV2KTuJ04TMTcDJJRE9RPHkB7mlz9XtbYV1LJ/3r24OwPm9UZ3WfzLrxw19gPUrpHZdXis9TWRWui4gsmZoK6/OVfk5uyjNWO9+X9402VXdm4usbYf3z6wbC+g1nxZnehqZESUk+/T3uuXXXcHwfTOrdDtYv6RUF6zd/shvWnfWqemQ1Tp8+MKYLrD+8Ci+/+uaz1W38HvxEhoiIiCyLAxkiIiKyLA5kiIiIyLI4kCEiIiLL4kCGiIiILMtUZOHYiTqRZj1h9h3FqaVuUbi3UJWSoBERWbX7OKzHhPrA+pBE3JtJ83POCVhPDMNJDxGRLdm4f4fWu6ZzBF7XjsO4x1S4P15PiI+exlm9F/dnCvTFyYO4ELyN6np8LQ4WKakoJ4minu3wNUpuh2fUL/sF98lKjsa9lrYp/bZ6tNf7ZJUqqSV/T5w22nsM989anl4K67074d5dfaLxvS+iJ8uOKL2WPJSkmJZy6hKBt+2ivCCg3Hzy6q/KZrO1SLqYTbKY6e/yW68Z3CnY1PLZxXoSSHPl2zgZFeyHnwUvT8I9h6Yt3gnr4cp6FlzWU90n7fjmtGE/J+TGj3EiS0Tk1Ul4fy9NaW9qG2bvD2dJoNJKnA59YEzbpNRu/XwPrP/nEnwPPJOGU3MiIvePxvs0UznnL1/SA9YfWY0TWei8Hjmg9xhrjp/IEBERkWVxIENERESWxYEMERERWRYHMkRERGRZHMgQERGRZZlKLfl7uUqwj+NLhifg5JCWksgp0Wfm9+0QAOt5SqLjxwycKNImiocF4PROpL+eEOqgJKYKynCyZ38hTgJpvZP2F+A0U3FplbpPfx/WEb+mCidi4pX+O7X1OKWTFI6X/+5AibpPWgLq4/QCWG8XjM9ruwCckjjkg+vZxfg6iIiM6IxTI5ojPvg+65UQCuvlSj+xg0V6sqF3O5wqyi3F69qRhRNqcUoflR/24+RfkJI+SWzA27Wil3/MknZHHc9vryjc60v7De5vffQUi9YLKV95PpUrfbV+zNgG6+9c1QfWnSVl3p/aV/2emXW9fWUvWNdSN4OfXqNuY93cYab26ZNtR2D9EuVaLNqcC+u19XpCSEvk3DksEda14164KRvWpw3Az+QZH+A0mIjIMOX5ZDYZpS3/4sU4naQtr50LZ695RUmDaX7OxD9Dlt4woEUtPbRcXmvlevmJDBEREVkWBzJERERkWRzIEBERkWVxIENERESWxYEMERERWZap1JKnq4t4NUvfaLOZi6vxTH4fD33sFO6L00OlShqn5KS5xEWQF+4rU6b05BERiVASTVpKp7IW72uUkpiqU9bjjIcrPg43G952URVOijUqk/xrGvA+BSm9nET0a1SnrEtLJ2nXIiYQn7/8cv0eKK/B66prwAce5I3fDgmhuL77KE6WVdbq17RYOb4A5d6MUtJdNcp94+uF99XTDa/f9Qz6XWbmOR0lJaWLQ01Ln7yxCfdxcZYY+ceITri+fD+sv/g3nBox699OeuDc7iRp0hamLd4O6z/cNbTNtlGk/KzQrsWUfrGm6iL6fTBhwSZYHxAfAuv+yvv04VW4h5C7q/7+uioF9wF7fk0GrN86BPeqevmnLFjfo/RB1NJML6w9BOvn+G8PAAAgAElEQVTOtq31+kpS0pkonSSCr7WZ9NaZ8xQjIiKi/+9wIENERESWxYEMERERWRYHMkRERGRZHMgQERGRZXEgQ0RERJZlKn6NfHsQN4EqqsDN/M6Kx00mRURKlSZrWgRai6y6KKktH3c8btued0Ldp9QO/rDeq53STLKiDtajA3HcuFsEXo+fu35pNuTiZplaWi2jEDeHjAtTGhgqjT37xeIGfCIiWw7jczioM264GOaLj++nzHJYH5aI7xvtHhAR+Tkbr0uLLvdTmpZGKA0r3dvhE763UG/4uVnZp34d8bb7p7SD9bTMUlg/v0cYrJdX43i853G9YarV/HdjrrQvdjyPBUpDx2Mn8D2unScRkUYD3zePj+8C6//8Bkdy543qDOta7Pa2oTj2fTrMNkN8+0rcyNKZe5btgfUnLugG6zecFQfr2r7O/GgXrKfG4OeZiMiMs/E2zknEz6d7lKh9W9LixVrUWVt+5tm4YeV/N+I/MaDZkoMbGDvbtta01Ox9Nn1gnPOd+w38RIaIiIgsiwMZIiIisiwOZIiIiMiyOJAhIiIiy+JAhoiIiCzLVGqp6GSd2Jo16XNzxbOZRybhpls7juBGViIixUqSINTfC9YTQnAjQa1l3858nN5JicXJJBGRdQdxOsTHE5+6+FBvWF+1+zis+3nj1EiD0mxRRMTdDY8/fZV9GtMNz8zPKcXn29cDp3R+ysRpKRGR/krqRrNaOR/ndMLppM+2HYX1ru30a5fcHqes/D1x0ml9Fk4UfbLxMKwndQyG9b4xerqrczi+lzfn4tTXTxk4FZgcg8/39iP4HvdQmtdF1OgpHas5XlkvLs1Sg9rzaYmStjgdWqJDSydpy2vpJDPN85poqZHHvsZJqvtGm9tXbf0iIiWVOH2qNvDckAXrf1fSTO2C8HNfe/+KiFx3Dj6Ou4fjhNDlC9Nh/ewE/Hz6YX8xrHdppz8LtBSX5toPcAPPNyf3hvXrzsJpJs3ZnQJNLS+i3x9afWr/DrB+99K9LWoFGZmt3g9+IkNERESWxYEMERERWRYHMkRERGRZHMgQERGRZXEgQ0RERJZlKrVkE1uL2cgXJ0XAZSMCcDrj690tZyc3iQzCiZ+icty3qbAM97RxMqEe6hOh939ao8xG35ON63X1eF3ZBXhGfaHSB6kgp0Ddp5fnjoL140pa4JxY3H/nRA1OAvUIx4mYr7fnq/s0Ngknoxaux4mf2jqclukTic/fez/gviENjfrFvmgETmJoqa80pW9YWTlOd+3JxstryTURkTEJ4bCupbi+Xr0T1ofdPgzW31l9ENZjY3EioY8Hfm9Z0d3D4yUlpXVJkNNJApnVVtv4YR9+1oiIvPAj7s/04fR+sH7gKE6NtuX5OCce32vPKb2kZpvsJXVOLE4LOns+fbAlF9Ynp8bC+pJpKab26bbB8bA+8b9b1Nf8qPxsOaczPr6aevysS75/NawH+uP06Q93DYX11Ei83bbk4oKfvU9c0LVFLT39pLzT2vX+jn0iIiIi+lNxIENERESWxYEMERERWRYHMkRERGRZHMgQERGRZZlKLcWHekqHSMdERkVdHVx21dYiWO8fryeEekfitMw2JfGz4RBOjWjz7y/shRMjX+7D6R0RkSn9omH9UCme/b9T6XUzazSemb+nEK/nRA2eBS8iEuyFZ6NX1eP+TK9vxjP2g7xwz6HdRRWwfvk5eIa/iMhqJVlRWY3vj1tH4vPx1cFjsH4PmNUuIrImE/fCEhFZmVEI6yWVODE1pivuDzZ3CN7X1Zl4X7dk6T2pipVk2dgeOPU1IGEwrGcX4yTV8P74Gmk9h0Kr9f40VmOztUxVav19/rEMpyeDfPB7QkRk7vBEWH/yO5wUu2ckTs1p+/TWxixYnz4wTt2nQV1wOklLIS28qhesv6ekevYoqcpHz8PvRxGRIE/cP+6afvjeNJuYGqUkJEcl4feKiH7Oh81fC+tpc4aY2idNXLiv+j0tnaSdj3evwj2VNNoxX/EO7iO1+Bo9qaWt66nv8b1/t5IY1aBjNnNf8BMZIiIisiwOZIiIiMiyOJAhIiIiy+JAhoiIiCyLAxkiIiKyLFOppT1HT8oxH8dEyys7D8Ble3bB/X083PRZ3P9cgZMEw5MjYX324ARY17rvvLv9CKy7Opkd/cYGPJu/fzyeca4lX74/iNM1QzvhviTtfPV+PXd/jPvvJMTgdXl74CSGYeB0weYsvK+9O+D1i4j0bIev65xBOH31z+/wfRPgjRNZX+zECaSRXfX+IN/sw6k2f2983N8dwMf93HK8r5OHxMH6xF64/5iIfh/sOILTa4PicJKvVEk/XdIDb7u4phbW6/Nx8upMoSUf/jVeT92YXdfdI3CaSUt6rNmL+2pNG9AR1md+tEvdpyOlOFX05fUDYV07hrWHcHptSAK+/5wlSiYkR5l6jXaeZn+xB9YPFZ6A9V6xeF9FRB47PwnWv5+tJ53M0I7t+Yl67y+zaa22Wl5LJ51Ovy0tyfe/xk9kiIiIyLI4kCEiIiLL4kCGiIiILIsDGSIiIrIsDmSIiIjIskylliL8PKRdkKdD7fJhOJVS34BnotcrM9RFREb1wrPd6xrxa5YfMJe4aB+IEzHOtAvAvaGqlb5G2/PxjPrIAJyU2VmAUwfbGnFdROTCATGw3qCcp0Ylx6UsLqkd8TE7u3bHlRTNwq2HYb1rpB/eJzVzhs/f3mNV6j7Fh+vJLyTMD78dEs/FaZKKGtyzSbsHRPT7QLNDuT+03knfZeKeV1ogIewE7tl0pjudhIaWrrn/q/2wXqs8I568ACdoNBFO7plXLh0A69q+3qskQ1+5BKdr7luJj+10PKScp0bB5+m5i/A+acf2wGrc90dEZJ5y3P8cZ+5aaLR9mrdin/oaN6Wt1yPn4X3StvHo1/i4tfuvwcD1x8frCSvN6byP/gj8RIaIiIgsiwMZIiIisiwOZIiIiMiyOJAhIiIiy+JAhoiIiCyLAxkiIiKyLFPxaw83F/Fycxz7NP93k7xK3KQu2EffZIjyveMncbS3tKpOXRcS7ofj10cr9PXEhXjC+slaHGErVNYV5Y+3XV6NI7yNTqLO/p74nFfW4X06dhJvw9fD3DjW31PJC4pIXhm+3tV1eNvaec0pwevRlte2KyJSW4/PoRadjwnC24gJwPWskmpYP+xknzyV2HSEP47YuijpxmIl7u6qvMDZ/XSmeGNjjnxV7O9Q83LD52P20E6w/s9vcINQEZH7RneB9UfGdob12z7HkV/NM2k4RvvQGLx+EZH/rDsE67MGK8d3Pm6W+eIPmXj5ceaba2rclWtx70hz23hkNb5Gj47F18cZLdJs9rxqXJzEkx82ub9a1Pn+0eYaN2rHfKfSpFNEJNwf/2y+e4R+b5rZNoqpFxzE9yTCT2SIiIjIsjiQISIiIsviQIaIiIgsiwMZIiIisiwOZIiIiMiyTKWWjp2oE2mWyFiTngeXjWkfAOvDksLU9S/ddhTWhyqvubhbOKxr+YyV+4tgvaAcp09ERArLcVO9AXH4+AbE+sP6zqO4+d/ZMYGw3s5fb3g4a8k2WI9rh/fpZDVOUsWG4caNB/PLYX1MD3y+RURCvPGtdHEqbnD5+mbcTLLkJD7fWuomJRofg4jIR+kFsO7tife1Tml0umYvvm/G94qA9Xb+vuo+fbXnOKx7KImOMQn43l+2HzdMvTgJ71NhFb7Hq4/gRJYVHTtZL1LueK+vVZqWzhmGkx73jtQTIOe/vAHWh3bF1+gi5fmkKajACb9r3tuuvsZVS8UMxmUXF/y7661DEmD9dJoCaq/5xwic+Ln49Z9hPUZ7PhVUwPpzazLUfdJSattz8LPu5kH4fGi0Y370fD2ZpL1GS/bM+nQ3rOcU4Sa143vi++/Gc/GxPXWhnh7Tmodq+3rXlzixN6Erfj6hdFx6+kl5S90jR/xEhoiIiCyLAxkiIiKyLA5kiIiIyLI4kCEiIiLL4kCGiIiILMtUasnFZmvRyyU/Fyc6Kk/ifjOX9YtS16+ljUKVHkwh3rh/kSZISdZsOoBnfYuIJMeFwHp8oA+suyupgE6hOJHQKRTPzO8YpidfiourYD0iBO/TngM4KRMeiJNRR/JxKiDu3A7qPn1/qBTWw/yV/kWB+NptP4T3dXCnIFgP9/ZS9ykrDycS3N3xNRrRux2sa+muuEB8jY5V6im4jMNlsN6/I06vJbXDKbgPdubDeodQfE3dS3FCotDD1CPgL81VRJqHv3Y8MtrUOrRUj4jIipkDT2OvWi/QC/cye+bCPm22DS1lsvDnHFg/KyYU1juG68+nfvevgvVdj4+F9T0Z+D3/2XX91W20Fe0Z+OR3uO/VPSPN9RZqy9TXixd3g/VZn+IeSTecE98m2xURCVP6FBYofeUqanAvuEFdgmF9Y0bLnx/7DuOfQwg/kSEiIiLL4kCGiIiILIsDGSIiIrIsDmSIiIjIsjiQISIiIssyFVloNAxpaHSc9T5mZBJctnMkntW+qwAnbkRE/L3dYX3fMfwaV2UY1qjEnw6X4j4+o5Ij1X3ap/RI+jqjGNbjgnFKZ8cRvJ6M4zjh4uWmjzH7dsf9KoJ98bZTR+P+MZV1OEk1LDUa1r9TkkkiIomheNs/ZeFU264jOCk2sie+Fj+AWe0iIkVReHa8iMi4AbjPk68HPrdZxfha7M/DSSNPJf3UNVxPUl3YH+/TwSK87WfXHIL1dgH4fC/ZiXufNTTi/fEr0xNWVoOeT6eTGjFr7lLcV6ZbBL4Ppg+Mg/U8JQHyyGrc50ZE5MGxuD+Olk56XulHpPVaemA1Tu84ez717oafT9q12PvEeeq6kNs/xykd7bkvItIpBKdublN6MM0djusPfbUP18/T+xSZpV27Gz/5BdZfvaQnrM/5Ep+n+RNw+umxrw+o+zRvFP4ZMncZvje155N2D6TltPx5mpePn7sIP5EhIiIiy+JAhoiIiCyLAxkiIiKyLA5kiIiIyLI4kCEiIiLLMpVaqq5rkKpax6RLTR2OQ0T44QTSLxWV6voLS5UeQoF49r+3G+5Nok1eL6vEqYDuUbhHkYjIUWWf3Fzw7OtOoXhftfV4ueNjcFHWLyJSUVUH675e+JxH+eN6Vgm+du7KtvOdJFyCY3BKzc8Db/tICb4P+sbi3kJ5RTj11SVC7/kSoPSu0Xp3bc3BvZkOHjgG6/GReF8DYnBvJmf2HsUprpKT+G5OjsbbrqzF19RFSQs0KgkJK5o7IkFSUro71LQEyH/W4TTYrME4reJMlfIM1NJJWnLj1UndYf10aNvQUjra8o+ONddbyBntWry+IRvWs0vw8+bfE3Hq5nSYTbX5e/15vclKTuCEZsdbv4D10efgJJom3F/vXXjNe9thvVGJir13TV9Y18733cNb7mt6YKm8pO6RI34iQ0RERJbFgQwRERFZFgcyREREZFkcyBAREZFlcSBDRERElmVqCnZShI/ENktkNO9t0uSnQ7hPwtnxger6RyYGw3peOZ69npaBt6FNRB/TPRTW1ynrERG5aUgcrJ+oxcmhHfk4jXPt2bGwXlaDk1TuLk56mbTDKavSajyr/eu9x2G9k5L4cVVSS+d1w+dPROSbfbj3lBglsHzL0HhYX7oHJ4TuGoXTE+n5OGkkIpJRhJNi25XU1wU9w2D93hF429sK8bGt2qucC9Fn+Y/sgu/9YC+cJFibhe/Z2EC8fKWSrDmT2Gy2FqkILSmzPgvfN7MGO18/8uLfcNrIbCJGW147BhGRj7fi3lqT+uJ+aWa38dbGLFi/9iz8/nVG28a3+/Dz6YOpKabWv2hzrvq9b/bjbbxzlbl0zewh+LiX7yiA9XFO+vjd8PFOWF9waS9Y/3Aa3ldjah9YX6icD+3Yrh/YAdZFRJS2cnLtgI7qa5D5abh315xhLXs5mXn/8BMZIiIisiwOZIiIiMiyOJAhIiIiy+JAhoiIiCyLAxkiIiKyLA5kiIiIyLJMxa+PlNdKQ3GNQy1tez5c1l9pQNXQMUBd/2c7jsJ6v444sn1Rt3BY18KKP+fhyGq50kxSRGRNZimsp0bj6HKq0jAwtwxHgXuG4/MR4Y+bT4qIzP4Mx/ZiQvE+FZ+ogfWIQG9Yz1AizV3C9X2KCPCE9Ut7tIP1rw4Wwnp5JY5G7y6qgHWtSaeIyMZDOAbt5orH73sK8TXafBg3rOwfi6/1wDj9Hl+9uwjWj5Tj4+4Riu/9hkZ8X57VHse4CyrxnzCorsNNPa3IMIwWEd/+j30Pl/Xzx/frv5V4qIjI7SAiKmI+Zm2Ws/Vf0qf9H7qNaUq8dkcufj+KiMz5XHk+heDn0/ET+Pl7y2e7Yf2lv/WA9atTY9R92pGP38NmuSh/FuP8nhGwvniLHgl/bVKyqW2bvc9c2yj+LyKSrzyfNLd/vgfWL+sRZWo9rcVPZIiIiMiyOJAhIiIiy+JAhoiIiCyLAxkiIiKyLA5kiIiIyLJMpZZstpYNGbV0kq8XTkPU6/3PxNPdFdYblGZjJ+txk0SzGQJPD7xdEb2BYnUDbsKn7at23Cfr8DFU1eC6iIifF75snkpnL19PvLybMoz1VpavbdAvnosy472ixtxsdw/lGJRei1Jd36Cuy9sDH4d2TbVJ+26u+Bu1yj1QW683aPRS7nHNCeX+0I6hXFm+ugGfp3rtxFoQahq5ad4wuOyFCzbDer1N/91u+uJtsP7WFbhpn9Yk0Wyjxynv4u2KiEQE4NRe13CcyrrhnAR1XYiW0klW0pkiIl/POtvUNrTzdMeXe00t/8r6bHUb2nF8vQunJ0f3wCkkjZb4qVKeEc5csTAd1uPDcbPgKuV5M39CN1jXzt+Vb29V96l7tD+sa8f93EVJsL5qD05t/l78RIaIiIgsiwMZIiIisiwOZIiIiMiyOJAhIiIiy+JAhoiIiCzLVGrJ1WYTt2ZpiQ7hePa6lhg5WaOnTHyUtExlLZ6VffQk7iGkqVMSGqF+eIa/iIgSWJGSSnwcWsLlRDVePrcC9/cprdH7P4UrPZK0dFK7YDzb3UuJLUUE4iREcaWepHJXjjunAvc40RJQ2rU4WYvPnxLeERGRcCXR4eLsRSYUncTno1FJBYiIhCn7pCWgDpaegHVP5Xxnl+PzXaW8h7zq9Pej1aBeS9MWb4fLLruhv7oOza2f4f4x2mv+s+4QrN90bjys37dyP6w7ez49OwGnQzTavj68Cm/7wbFdYP2dTXpC6BqlP9OcL/H5e+6i7rCuHdvMj3+B9ZcvwT2YREQe+OoArI/sFgbr81bsg/UKJU36wsV429cq50JET/y8P7Wv+hozzPZmcrZd7b55dX0mrGcdx73dHh9v7n5tLX4iQ0RERJbFgQwRERFZFgcyREREZFkcyBAREZFlcSBDRERElmUqteTr6SoBXo69YtxCcYKmsAKnbjy1Bj8i0jkMJzqqlUZFh0vxNrTJ2qG+uP9TaZWexumo7JPWoubYSdxbqH0A7knVoKxI6+UkItIxGO+Ttq6KaqUnlXKefJXeU/6eep+gggp83HsL8ez1uBCcxNh9FKe4YgPx8tp2RfR0Up3SmyRU2aeYAG3bODWXVaInzuqV6xrghbfhrhyDdv9V1OD1V9fhuouT/llW8+amHFlV4tgTZuEVveGyN3y8E9Zfm5Ssrj8xHD/rnvzuIKzPHd4J1rV0UogffkaUOXk+ackULWXywFd421HK80lb/5T+HdR9euxrnBAy2/tHO0++nvg5/sK6LHWfSpX3xT+W4210UJ4FM8/uDOuv/4TTO9edgxNqp+PZNRmwfsdQfJ/9Ow3fl7cPSzS97flrcQJP27bGbJKqtfiJDBEREVkWBzJERERkWRzIEBERkWVxIENERESWxYEMERERWZap1FJBea00lDgmNUpP4oRGz2h/WC9Q0kwiIpmFuK9MYiReV692uIeQlvdZd6gM1uOV5JWIyJr9xbAeofQ76hKOE0U/HiqF9dhgvB4PN3129958fJ5ClJ4snZW0hZbWalBSBLsLKtV9Sm6Pr0U7P3w+lmzNx+uJDoD1VbuLYL1Ph0B1n0J8cMpKSwjtOoLP60c/5sB6/26ReJ+UcyGi92faX4jPrbur0g/LDyc36pUUktZe6o/JEPw5jpbXSWOzxJiLCz5/WjrJWaritsE4gaKlbt7ZnAvrWvppupMkkEbb9qxPdsN65wi87fXK8+mmc/D6H1qN0z4iIg+P7QrrZhNWmmcuxOv/X9CO4e9n4Z5Kj32tn6f7RuM+Vto25gxJgPWzHk+D9f7domD9v0p/pBln6wkrbduzPt0F6/+5pKe6rj8CP5EhIiIiy+JAhoiIiCyLAxkiIiKyLA5kiIiIyLI4kCEiIiLLMpVa6hrhLR2ifR1qh47jVXy9owDWrx2sz8wfFh8E60VVOOm0U0nRuCizvsd2DYX1dzflqft006A4WK9vxNmoTXk4GXW9kkiobWyA9UBP3PtERCTIC5/zSqWfztLN+PgGdo2A9bJK3L9oUjKeBS8i8sZGnNCIDcUJnpvOjoP153/APT3uHo77g2wuKFH36evd+HvlStLuxqF4n+4bhfur7Cooh/WPlXtfRCS/BN+zM87F90fXUJzienUTTlKN7hwC60VVuC+U68kz53eZLpE+0iHGz6E2d+keuOxTF+K+P6fjzY3ZsP73s+LaZP0Xvb5J/d6X1w+E9Zcu6Q7rWkJobQR+r2gJGi2Z5IyW4JmnvL9qlR57bdmvRzsfa/Yeh/Vh3cJgXUvH3TtS72s08fWNsP75dfiaatvY8I9h6jbMcJYe+2jbEVi/rp/5pN0f4cx5ihEREdH/dziQISIiIsviQIaIiIgsiwMZIiIisiwOZIiIiMiyOJAhIiIiyzIVv84pqZGaY9UOtfyyarhszzgcA80oxsuLiOSV4uhydJDWDBE3JNRsysVx2c5RuCmliMiXe47BeqQ/btqnRaOXH8DraR+A1+PniRseiohsO1wB6wE+OLKd0jkc1t1dcYzRww1ve2MebiwnItI7FseEO4fhJnWf7z0K63ERfrC+ZBeONGvnT0QkNgyvyzMSH/eGXHxeV+7BUcxO4Tha3idGv59C/fG9vFVpWFlwAkfFg33wfXasEsesK2txNN9baTJpRej5VFCKnzda1PTBVXqTvyOl+Ny2D8bPodc2ZMG6Tdn2DefgxnxfXDdA3SftOB5ZfQDW/T3x766zh3ZSt2HW1Pe3wfrbV/YxtR7t+aRxFh9+RGly+cAY3Ljx8/34ef3F/kJYnz8Bx/mfWYP/nISISEyo/pxAtOOb/v4OWO+kNCe9XzlmZy7rG21qn+5dvhfWOwThn1E3novv/dbiJzJERERkWRzIEBERkWVxIENERESWxYEMERERWRYHMkRERGRZplJLR0qqpfLYSYeaizKx/OLuuCHhqz/hBmsiIjv24pniqT0jYb1XJE6lNCgzqX8+cBjWZ4/SG3vNfRfPwI9Stn3pQDy7+4sfMmE9JiYQ1mtq6tV98vDAqaJYpZna9f1jYf3rQ0Ww3jEEJ2uWb8GNw0REHlKa8Lkpjc6+XLMd1p+6JgXWb1+wAdYvPU9v/jcoDieponyU2fzLdsP6lveWwPpZU6+A9bmjcRM8EZGe+G0hjyspkyNHcNJu1oW4ad/GLLx8oA9Od0U5uc+s5vbBHSUlxTGRcflb6XBZvRmi+USHWVrSY9j8tbCeNmeI6W08MEa/BxGzjRidLb/wit6wPn0xTtdc1w8/nzzd8XPuX9/gBNK9o/Rrd7/ynkzbi5+Bz01IUtdlRn6F/v4aFI+f/Wl78D4NTcJNjz989r+wfmLz87C+8hecGD1f+Tkrol9vrf7Pceabiv4e/ESGiIiILIsDGSIiIrIsDmSIiIjIsjiQISIiIsviQIaIiIgsy2Y4a1Dxf9LT0yU1NVVuefVzie7S0+F7DY345VlKT6VOSu8dEZFgbxyiKq7EM78LKnAfGk18CO6Jsv9YlfqavtG+sF5Vh3vX5JXhfUoMw9s+qfTAcdZnpFrZdqVS165FpD/ue6Fd02ilT4aIyK78Slh3VWa1p8Ti87o1D6+nfyxOiWUe13t3FSn3TV19A6x3j8L71CkI37MZpfi+2Veo30/aue0Wibfh74WTG3uO4m2E+eJ0Uk09vjcCy7Nl9qWjZcuWLZKSghNjf3VNz6fNmze3OIbHv8uAr8kqxvfZgkt7qdvRHpVPfncQ1u8ZaS45pK3fWUJIe81LP+AeP7cMMddTSVv/Kz/iFKaIyE2DcN8cbV1a/YGvcJLvkfPweX3ZyT7NGoyPu7ERvy8WbsLp2ukD42B90c85sD6lfwd1n7TjnvnJLlh/7dJkU+vRzPoEpzNfuqS7+pp/r8X3U6DSu0s7T08o78da8Hw6cmCXLLjlb616NvETGSIiIrIsDmSIiIjIsjiQISIiIsviQIaIiIgsiwMZIiIisixTvZaOVtRLY6ljKqeiqg4um6Ckkwor8PIiItsPV8B6+yCc+EmKwNtQgiGy48hJWI8OxL2FRETWHiyF9RA/nOCJDsT19UoPnAglOeQstZRVhBMrAT54XQmh+PxV1OD0Tk0DPoH7CvWEUJdwfC3ClRTNN/tLYF27b77dVwzrnSNw0khEJMQHJ3583PF52l2AkywrduDeJN1jg3A9Sk/mlVbhc36gCJ9bDzf8u0agJz62RiXB4Ko0RdN6pZ0p9hfg9/ybV+AEyB1f4ESHiMizF+FUx9zhOBHz6o846XHjuTjVo3lE6cMlInLw2AlYf/vKPqa2YdbRE/pzXEvR3PKZkpb5Ww9Yf/R8c32v9hbpKdb5aThZNnsovnZrDuGfRTll+FpkFuFnxzUDOqr7pKXRXp3UE9bNrkfz4t9wf7rHvsHnSETkaDk+ty9cjNf18CrcD+tBE73M0sMqZEErl+UnMkRERGRZHMgQERGRZXEgQ0RERJbFgQwRERFZFgcyREREZFmmUrMgV9MAABG3SURBVEshPm4S6eeYQgn3xasorcbpjBCln5KISFSAP6xXKv2IDh2vUdeFdAjG6SStl5OISHI07vHTgHdJXVdSpA+s1ykJIRcnM9G7ROKkTr2yrkIlYeDroaV68Lb9/fDyInqPKa2undcCZXZ8nxh8b5RW69dOu28qanC9Ywi+P/opfZ6OncTnNdPkfSmip9201NJxZds2G16+QUmSaCknK3p9Q660Px7gUIsPx++7O5buhfX5E3AKQ0RP4zz6NU6yPDDGXOpGU66kC0VEerbH7wuzSRbt2B7/Fh/bQ07SJ9q2X5iIz+3tn+PeQs8pKbH7Vu7D67+oq7pPdy3DKZo7v9wD629NxsmhucvxenpF4+vgrA/SXOUerFdeo92b/12fBeszzo5TtovPn+HknmmnPJ9cXPDz5oExuB/Ww0oCD52n/IO43xXcj1YvSURERPQXw4EMERERWRYHMkRERGRZHMgQERGRZXEgQ0RERJZlKrXk4iLi2mzoExeI+/gcVVIVJU4SQlrfIa0/zbEKc+mQIG+cYAhykqTyaH7A/6egEqdrypR91RJC+UpKp7JGP0+DOwXCerGybW8PfAzVdTi9o50PLf0kovfyyTyGe91EBeAeTCE+eNt1SgMt7d4QEYkNwvdTTb25pJib0veqXEnmVSnnVUSkvTL7X0vBHVJ6MIX54fOUU4KX93TD95+XkuCyohkDYyQlxbF3znvpeXDZghP4PWE27SOip5NOZ13I6TyftLTMrE9wv6Mo5b48Wq6l48wfm5Zw0dJJmnClz522fhGRZy7EiSbtPD2zBvfJCvbG76PZQ+Jh/bbP9d5d/74Ip5D+9R3e9pPf4V5Id49IhHXtGj2lnIt/fpsB6yIi947E29CoaabReD2zPmuZ4Cqpav2ziZ/IEBERkWVxIENERESWxYEMERERWRYHMkRERGRZHMgQERGRZXEgQ0RERJZlKn6dX1YjdcWO8c4f9h2Hy6bEB8N6pZNo6seb82G9Vwe8rnHdwmBda9O1ck8RrHcM8Vb36RvtNeG4kWDvaBzxXnOgFNa7Kg0g/UNxrF1E5KMtBbDePgRvO045Pi0mnFeGI9POGln2ao+PY0xiKKy//CNuCNZTaQ65M7cc1s9JxPeGiMjxkzjCHuCFI5S7jpyA9ff3H4P1EanRsH52R3wMIiJZJfhPBmQrsekQHxxTdxF8LVJj8bZr6/G19io29Qj4S/vXtxkSlukYzX31Etz874GvWt+8rsmY//wE61/POreVe3h66pVrJyJy28hO6veQXjH4fbp2fwmsvzulj6n1O6Od28eUppv3K7H22wbjqLMzWhRZq981zNx51dbz/EQ9Wq695t4RCbA+7b0dptajne/3NufC+n2j9Ii12W08vApf03B//DzrEt7y5513CY7ZI/xEhoiIiCyLAxkiIiKyLA5kiIiIyLI4kCEiIiLL4kCGiIiILMtUZMHL3VV8mjU/9PXCqyhTGuoFKU23REQignC6Rmt6eKJOb6yIBCoJkIoavfFgpLJPIT74OKrr8CzuSKW5pr8nXo+WrBERCfLFs7m1xoDHK3HjN63hnCbUF58/EZHSKnwtymrwtqOU83pSaWKoJbKcNa/TEnL1SgPKQOW8donDyagg5d4vrdbvS+08BSrrilJm+R9Xmq+6K80769qogeFf2bxRiZKSktyqZbXnkzORgfge1GiJjrd+zoH1HUpqzmxTRRGRB1ftg/WHx+KGgdcN6IC3vQY3Epw9VE/1XLkoHdYXX5MK6/OUtMzcpXtg/ckLkmD9vhX4mEVEfDyUhNCoP7bhp7P1aPfH3cvwcWjPJ7NKa/Fz8a4vWzZubGIoWeBnlXvzwbGd8XqUY34RpFhtSjIT4ScyREREZFkcyBAREZFlcSBDRERElsWBDBEREVkWBzJERERkWaZSS97uLuLbLLV0db/2cFkXGx4jrdiHexeJiPRoh/sXHS6thfXMomJ1XUionyesp0bj/iMiItvzcd+hjGOVsJ7njpNDjUpSZs/hMlg/XoLXLyJy0xicGNCSLJ2DcdpiTxE+tt5K36SvduO+WiIivZUeP+9sOgzrUUF4n7Rtf38A94LZmYeTHiIi5yWFwLqWJPg5twLWQ/1x4mx/IT5/7YP0Pln9YvA9vi4L95L6ZCM+fxP64z5PH23B/cpC/fG939nAvZ/OFJ9vPwLrz0/EyZeZH/+irmvR1eb6Dmn32bR+sbA++wucGjmd5EtGEe7ddd2SnbCuPZ+OlOL1fLAOJ69ERDbcOwzWn0k7COt3DsOppSfG44TV4i24V9Cj5+MEkoh+nia+vhHWP5sxANYXKYmzawZ0VLet0a7rUxfie1M7hhs+wtf01Um4z1hOMb6mT0/A2z0dZntb3ToorkUt3adYnm3l9viJDBEREVkWBzJERERkWRzIEBERkWVxIENERESWxYEMERERWZap1FKkv7vEBjn2ezhWiRNFaw7ilMlZ8YHq+jsF4cSKrwdOh2zJwX18tJnRA5RkzXf79fTTpOQoWD9ejdMeG3NximZsIk7QHKvCM8hdnSQVXF3w+NNNecl7W3Byo3MUTtDsPooTU+d1D1X3adkvx2DdRTmOiT0iYP2TnQWwflVfnI5bl43vMxGR7zNKYb1C6T11YXI4rKe0x9duQy5O4K3ao6e7Csrw9R6ThM/taOW+ScvExz2iGz6GaqXvVFBF2/Rv+Suw2Wwt3vsTe+P7RtOjnZ5g1Dyv9CO6TelHpD2f+ncIgPXpi7ep237rCpykWnRlL1i/9Qvcx2dMJ9xP7IKe+H26aAtO04mIvK987w4n/ZkQF+U5d0UqTn05S3dp39PSSdryU/rjnlQaLWkkInLjRzghV1aFf6YuviYF1mcPSoB1s6motuov5Yx2Ph5edaBFLf+gnoxrjp/IEBERkWVxIENERESWxYEMERERWRYHMkRERGRZHMgQERGRZZlKLR0/US8e5Y6Jj5wSnMJoUHp3VCnpCRGR9YdxyqR5f6cmvWJwCkkbneWV46SRzUWfrb2jEPffCfDC+9Q81dUkuxwngQI88SUI8NAvzTdKGsdLiS25ueEzUteAr1GxkuppF+Cu7lN4AO4v1CVc6VN0XOmRpMyc31+Ml9eug4hITgk+Pg+lH1aWci+X1xTCunKLS0K4nnzRetccPYGTCr7B+D7QUm3tA/D9V1aN+3B5VP/xSYX/ldd+ypZ2hY5JvFzlmlbV4vPRt6Oeqnxo1X5Y91GeTxotHXJVCu6fpdVPZxsxgfg9bDadFOipPwu+VRKrV/dvm3utLdM1ZtfVlsu/einuhWRWWhZOjH57CD+3jpThn4OPnY97W4mIPJOGk3nxQd6wPqkvvme18/Hg2M4taunhFbJA3SNH/ESGiIiILIsDGSIiIrIsDmSIiIjIsjiQISIiIsviQIaIiIgsy1Rq6eiJWmloNuP5l0O4r0xyJ9w7prSqQV3/j/vw7Otzu+L+MYM74v4gmo9/OQrrvkpySERkfQbuw5Qci9MNXcPwLO41h8pgfWAHnLyyeeiz3bcr5zwuEq8ryAcnWeqU2E250j8rp0RPKiSEeML6WdH4Pnh2LZ4FH+qPU07rlKTW0M5B6j65KGm0YB98HPuUHlM7D+CeShPOwj1fekT6qPt0shbf/5nHcZJAS2V5uePfQfzc8b2s9TgxXM+c32WuP7uDpKQ4ph+0477+Q9zn5s6huG+NM9o2Vu7CqRFRlj+/Z6TpbWu0dMjdw831f5qSGgPrS39Rjk1Etmfi55N2nmZ9shvWPZR7PK8E9977cFo/dZ+0bW/OxM/l/gn6c8UMZ72WrvtoJ6y/fmkyrE9bvB3WF17R2/yOmZSlPJ/uHIbvJ+24P92G+/5dAlJOZhJiZ85TjIiIiP6/w4EMERERWRYHMkRERGRZHMgQERGRZXEgQ0RERJZlKrUUHeQp0aGOqZIbB6TAZU/U4F4mi3fkq+v/++COsP6jMrP8ya8PwLo213lAIk7QpEbjtI+I3jtpS3Y5rO/Ow72ZtF5EC3/IhvW8w/iYRUT+O/NsWM8px7P5Y/1x75/thfgYxijn6f10PONcRCTIG6drpr+xEdbPH9gB1vsr/bPSDuHU0updOCEhIjJtAE5cNBi439e2fNzPqWd0HKz/nIn36bDST0lE5IJuYbC+Jgtf75eW43v8mpE4XfPY53tgPULp/9TLXel5ZUE2m61F0kFLPrx+OU6GnE4fH+0153XHaUuNlvT4eGue+hqtp82Vb2+F9doGnJr75O/9Yd3FBf+uOyFZT1g5+x4ysTvu8zRKea9onCWE/vXtQVj/YE0mrO94ZDSsa9dCuw6T3tys7tNH01Nh/XPlZ2R8iJ6GRCYvTId1Px/8Y/+/l/VS1+WpJMi0e1+7Fv/8ch/e9k+5LWpluXhZhJ/IEBERkWVxIENERESWxYEMERERWRYHMkRERGRZHMgQERGRZXEgQ0RERJZlKn5dUlkv7ifqHGr//GY/XDYyCDdPjAzQGw+u3I2b8yVG4NjZOefipn1aCG/bERxP/jFbjzqfqMFxxW7t/GA91BefUq0p4OSz8TEEesar+7RgQw6sh/jhxo1bXPBx+3rgyPSeggJYjw/H11REROk/KY8qDdBWH8DNOLVrocX8BnfWG4eu3I+j2VqUsK4BH8QveTim3ltpHBrsg8+riEiaEtl2UxpcXn9eIqwfKcONPW8Zh5fXmlV6FJ058WtEi4HO/Bg3jXxlUk91XVcv2gbr2vOpUwj+kwtT+uM/PTDnSxydnz+hm7pPmq7K8+nBMZ1hXTtPL/1wCNZvGYKbBZ6OkUn4zz3cvWwvrD91IT4fzuLXhvJHOR6dZC6Gr8WsNYM742MTEbnlU3y9PZTnsvZ8uuytLbCeHIOfT/eNwtdu9he4eaeIyHMXdVe/h2jnb8sDw1u9jvR0d+n3ZOuW5ScyREREZFkcyBAREZFlcSBDRERElsWBDBEREVkWBzJERERkWaZSSy42Eddms5HdXPFYqFGZQe6itnQU8XTD69JeU9+Im/9pXJVN1zpZjYdyfK5KyqRBWZeHG15e61HnrHedu3KetH1yMplf2TZeT/Nrf6p6ZUZ9jdKkTksONSjxJy/l/GlpKWe0bbgrN4ivF07aKbeG1NbrO6Xtr7Ztd+WaarTkhnYPnMbp+8uan5YpkbmOybrcYpzY+2Aqbnb78CrcpFNExMMdp0lsNnwj4La5Im9uwo1i3U6jYeXNn+yC9f9c0sPUeu5dgRNC/zy/K6wvUo5BRGTKANz8V7s3Z32K0zIv/Q0nZWZ8uAPWX1cSkiIi9fX4wXxRryj1NYjZJonOnk+Gsi7TzydP/Hy6fzROMGoanXyuMW8FbuDYQWmqfOO5uKmt5sV1LZt35u7Tm6U2x09kiIiIyLI4kCEiIiLL4kCGiIiILIsDGSIiIrKsVk32raqqEhGR4sMt/1x1SVk1fE2DN56AZPPFk4NERI6X4z/j73Ec/+l9w0m7A+RoMd7XOjwfVUT0iVfih7fto0xiPV5ZB+uNynpKlD9TLSJSnIX/jH+dMilVm+h5UtnXsmo8TdHVX7922qxRr+P4z7QXHsWTMLXJ0so8S2n01e+BY6X4z/hrk6K1ybtllfh85JXjY/PUZpWLSGE5vg+83ZXJ4AH4nBeU42PzKMLvlao6fGLdy36dUNf0Hrcip8+ncnxc6el4XfkHc9XtHNfOucnnkzYx9Ggxfv6lp1eq+3TsUIbyGrwuTcHBLGU9+H2atfeouq50N9waRDtu/Rjw87pIXR6/t0RE8g/iti7p4RWwrk3q1WjHdni/PmG1rZ5P5Sfxcaena9PNscKMLPV7J7SRgj++x9O9cSsW7Tyhib1Hs3+9zq16Nhmt8O677xry648qfvGLX2fg17vvvtuaR8FfEp9P/OLXmfvVmmeTzTB+O5xbVFQkq1atkri4OPH21hsHEpG1VFVVSVZWlowdO1bCwsL+7N05LXw+EZ15zDybWjWQISIiIvor4mRfIiIisiwOZIiIiMiyOJAhIiIiy+JAhoiIiCyLAxkiIiKyLA5kiIiIyLI4kCEiIiLL+n90TnormTLsfwAAAABJRU5ErkJggg==" ], "text/plain": [ "Figure(PyObject )" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Construct a random m-by-n matrix matrix of rank k\n", "m,n,k = 40,40,2\n", "Dfull = randn(m,k)*randn(k,n) # ground truth data\n", "\n", "# Suppose that we only observe a fraction of entries in Dfull\n", "n_obs = 600\n", "Dobs = fill(NaN,(m,n))\n", "obs = randperm(m*n)[1:n_obs]\n", "Dobs[obs] = Dfull[obs] # partially observed matrix\n", "\n", "# Plot the ground-truth, full dataset and our partial observations\n", "figure(figsize=(7,14))\n", "subplot(1,2,1)\n", "imshow(Dfull,cmap=ColorMap(\"Blues\"),interpolation=\"None\")\n", "xticks([]),yticks([]),title(\"True Data\",fontweight=\"bold\")\n", "\n", "subplot(1,2,2)\n", "imshow(Dobs,cmap=ColorMap(\"Blues\"),interpolation=\"None\")\n", "xticks([]),yticks([]),title(\"Observed Data\",fontweight=\"bold\")\n", "show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Solve the Semidefinite Program using Convex.jl" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": [ "iVBORw0KGgoAAAANSUhEUgAAAjIAAAEgCAYAAACuOplUAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAIABJREFUeJzt3Xl4lfWZPvA7yTkn+75vEJZA2DGAaAVFKVK0itjaDrWK2tpx7HRcamsvbafqjO38itar047O2DqD1Snj0qm7IlZFBTfWIGtCCISE7Pu+vb8/HE5ywv2ERKHhpffnunK1ec573v08fvPyfc4T5DiOAxEREREXCh7tHRARERH5rDSQEREREdfSQEZERERcSwMZERERcS0NZERERMS1NJARERER19JARkRERFxLAxkRERFxLQ1kRERExLU0kBERERkla9asQXBwsP/n8OHDo71LrqOBzOeQk5MTcAMO5+f6668f7d0escHH4PF4EBERgbS0NMyZMwerVq3CCy+8gL6+vpO63UWLFvm3eeGFF57UdYv8JZWUlJg5ITIyEpMmTcI111yDjRs3jvaunpYGn7/HH398tHdpWK677jr/Po8bN44uExQURP+/DJ9ntHfAzUZ60wUFBZ0RN2pfXx86OjrQ0dGBqqoqbNu2DU888QTy8vKwdu1azJo166RsRx9w+WvQ3t6OoqIiFBUV4Q9/+AMee+wxXHfddaO9W6eVwZ9/t+SD4eSwefPm4YEHHvD/Hh8ff8r360yjgczncPfdd6Opqcn/u+M4+MEPfuD/ffz48bj55psD3jNt2rS/2P6dCseOqbOzE4cOHcKrr76K0tJSAMDevXuxYMECvP3225gzZ87n3tbAfqbqbSpnknnz5uHrX/862tvb8f777+OVV14B8Ol9fuedd2LVqlWu+Y/1X8Lgz79b8sFw9nPq1KmYOnXqX2BvzmCOnFRBQUH+nwsvvPC418eOHet//brrrnMKCgqcyy+/3ElISHCCgoKcDRs2OAcPHgxYz5o1awLWsWrVKv9rOTk5x22jpaXFefDBB53zzjvPiY+Pd7xer5OSkuIsX77cWb9+/Uk9pp6eHudHP/pRwDITJ050uru7/cts27bN+bu/+zvnnHPOcbKyspyIiAjH5/M56enpziWXXOI89dRTAev86U9/GrA+9nPsnBw8eNC59dZbnYULFzpjxoxxoqKiHK/X6yQnJzsXXXSR8+ijjzq9vb0jPmaRk2nwZ/r6668PeP2cc87xvxYcHOxUVVUF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" ], "text/plain": [ "Figure(PyObject )" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Reconstruct the full matrix, via nuclear norm minimization\n", "Dest = Variable(m,n) # reconstructed/estimated matrix\n", "p = minimize(nuclear_norm(Dest)) # objective function\n", "p.constraints += norm_2(Dobs[obs] - Dest[obs]) <= 0.01 # error tolerance/constraint\n", "solve!(p)\n", "\n", "# Plot the ground-truth vs our reconstruction\n", "figure(figsize=(7,14))\n", "subplot(1,2,1)\n", "imshow(Dfull,cmap=ColorMap(\"Blues\"),interpolation=\"None\")\n", "xticks([]),yticks([]),title(\"True Data\",fontweight=\"bold\")\n", "\n", "subplot(1,2,2)\n", "imshow(Dest.value,cmap=ColorMap(\"Blues\"),interpolation=\"None\")\n", "xticks([]),yticks([]),title(\"Reconstruction\",fontweight=\"bold\")\n", "show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### A simple histogram of the residuals shows the matrix was exactly recovered" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": [ "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FiZJatGihTp16qR58+Zp6NCh7iwPAAAAQDG49ZoHwzCUlpamy5cvFzp92bJliomJMYODJHXo0EERERFasmSJO0sDAAAAUExuDQ+DBw9WhQoV5O/vrwcffFB79+41p506dUrnzp1T8+bNneaLjo5WUlKSO0sDALhZdna2p0sAALiYW05b8vX1VWxsrLp3764qVarof/7nfzRt2jS1adNG3333nSIjI5WcnCxJCg0NdZo/NDRUqampysnJ4boHACilCA8AUPa4JTy0atVKrVq1Mn+OiYlRbGysmjRpohdffFHr1q1TZmampCtB42p+fn6SpMzMTMIDAAAAcIu4ac95qFevnh566CFt2bJFhmHI399fUuHfTGVlZUmS2QcAAACA57n1bktXu+2223Tp0iWlp6ebpyvln75UUHJyskJCQq551GHs2LGqUKGCQ1u/fv3Ur18/1xYNACixtLQ0T5cAAPg/ixcv1uLFix3aLl68aGnemxoejhw5In9/fwUFBSkoKEhVq1bV7t27nfolJiYqMjLymsuaMWOGoqKi3FUqAMCFCA8AcOso7Av3ffv2qVmzZted1y2nLZ07d86p7cCBA1q9erU6d+5stj322GNas2aNTp48abZt3rxZv/76q3r37u2O0gAAAADcILcceejbt68CAgLUqlUrVatWTT/99JM++OADBQUF6e233zb7vfTSS1q6dKnat2+vMWPGKC0tTVOnTlWTJk00ePBgd5QGAAAA4Aa55chDr169lJKSohkzZmjkyJFaunSpYmNjtWfPHt1xxx1mv7CwMG3btk316tXTCy+8oGnTpikmJkYbN27kLksAAADALcYtRx5GjRqlUaNGWerbqFEjrV+/3h1lAAAAAHChm3arVgAAAAClG+EBAOB26enpni4BAOAChAcAgNtlZGR4ugQAgAsQHgAAAABYQngAAAAAYAnhAQAAAIAlhAcAAAAAlhAeAAAAAFhCeAAAAABgCeEBAAAAgCWEBwAAAACWEB4AAAAAWEJ4AAAAAGAJ4QEA4BY5OTnm+8zMTA9WAgBwFcIDAMAtMjIyzPdZWVkerAQA4CqEBwCAWxQ88gAAKBsIDwAAt8vOzvZ0CQAAFyA8AADcIjc313xPeACAsoHwAABwi8uXL3u6BACAixEeAAAAAFhCeAAAAABgCeEBAOAWeXl5ni4BAOBihAcAgFtwzQMAlD2EBwCA2126dMnTJQAAXIDwAABwOx4YBwBlA+EBAAAAgCWEBwAAAACWEB4AAAAAWEJ4AAC4Hdc8AEDZQHgAALgdt20FgLKB8AAAcAvDMMz3hAcAKBsIDwAAt8jNzTXf85wHACgbCA8AALcrGCQAAKUX4QEAAACAJYQHAIBbFLzmIS8vz4OVAABchfAAAHCLgqcqER4AoGwgPAAA3I7wAABlA+EBAOAWHHkAgLKH8AAAcIuCgYHwAABlg8fDQ3Z2tiZMmKCaNWsqICBALVu21KZNmzxdFgCghAoGBm7VCgBlg8fDw6BBgzRjxgw9+eSTevfdd1WuXDl1795dO3bs8HRpAIASIDwAQNnj0fCQmJioL774Qm+//bamTJmiuLg4ffPNN6pTp47Gjx/vydJKvcWLF3u6BJQBjCOURMFbtQIlwe8iuALjyDU8Gh7i4+Pl5eWlYcOGmW2+vr4aMmSIdu7cqVOnTnmwutKNfyBwBcYRXIVrHlAS/C6CKzCOXMOj4SEpKUkREREKCgpyaI+OjpYk7d+/3xNlAQBKaN++fU4XTB8+fNiDFQEAXMGj4SE5OVmhoaFO7fltp0+fvtklAQBcICYmxqnt888/90AlAABX8mh4yMzMlK+vr1O7n5+fOR0AUPokJyc7tU2ePJkjygBQynl58sP9/f2VnZ3t1J6VlWVOv1p+oDh48KB7iyvlLl68qH379nm6DJRyjCPcKG9vb+Xk5Di0ZWRkaM2aNVz/gGLjdxFcgXF0bfn71tf98t7woI4dOxqNGjVyat+0aZNhs9mMNWvWOE1buHChIYkXL168ePHixYsXL14ufi1cuPCa++8ePfLQtGlTbd26VWlpaQoODjbbd+3aJUmKjIx0mqdLly5auHChwsPDCz0yAQAAAKB4MjMzdfToUXXp0uWa/WyG4bkbcScmJqply5aaOnWqxo0bJ+nKE6fvvvtuVa1aVd99952nSgMAAABwFY8eeWjRooV69+6tF198Uf/7v/+revXqaf78+Tp+/Lg++eQTT5YGAAAA4CoePfIgXTnS8Oqrr2rhwoX6448/dM8992jSpEnq1KmTJ8sCAAAAcBWPhwcAAAAApYNHn/MA17hw4YKGDRumqlWrKigoSA8++KCSkpJuaFmdOnWS3W7XqFGjXFwlbnUlGUfLly9X3759dfvttyswMFB33nmnnnvuOV28eNHNVcMTsrOzNWHCBNWsWVMBAQFq2bKlNm3aZGleV/6+Qul2o+No8+bNeuqppxQREaHAwEDVq1dPQ4cO1ZkzZ25C1bjVlOT3UUFDhw6V3W5Xz5493VBl2cKRh1IuLy9Pbdq00Q8//KDx48crJCRE77//vk6cOKG9e/eqfv36lpe1fPlyDRw4UOnp6XrmmWf07rvvurFy3EpKOo6qVq2qWrVq6ZFHHlHt2rX1ww8/aM6cObr99tu1b98+88GPKBv69eunZcuWaezYsWrQoIE++eQT7d69W1u2bNF9991X5Hyu/H2F0u9Gx1Hz5s114cIF9e7dWw0aNNDhw4c1a9YsBQQEaP/+/apevfpNXAt42o2Oo4L27Nmj1q1by8vLSx07dtTq1avdXHUpV+KHNcCjvvjiC8NmsxnLli0z286dO2dUqlTJ6N+/v+XlZGZmGuHh4cYbb7xh2Gw2Y9SoUe4oF7eoko6jbdu2ObUtWLDAsNlsxocffujSWuFZu3btMmw2mzF9+nSzLSsry6hfv77RunXra87rqt9XKP1KMo4SEhKc2rZv327YbDbjlVdecXmtuHWVZBzly8vLM1q1amXExcUZ4eHhRs+ePd1VbpnBaUulXHx8vGrUqKFHH33UbKtSpYr69OmjVatWOT3htSjvvPOOJJm3zMXfS0nHUdu2bZ3aHnnkEUnSoUOHXFssPCo+Pl5eXl4aNmyY2ebr66shQ4Zo586dOnXq1DXndcXvK5R+JRlH999/v1NbmzZtVLlyZX7f/M2UZBzl+/TTT/XTTz/pjTfekMHJOJYQHkq5pKQkRUVFObVHR0crIyNDv/zyy3WXcfz4cU2ZMkVTpkzh9JK/KVeMo6vln39cpUqVEteHW0dSUpIiIiIUFBTk0B4dHS1J2r9//zXndfU4Q+lUknFUmL/++ktpaWn8vvmbKek4SktL04QJE/TSSy9xulsxEB5KueTkZIWGhjq157edPn36ussYN26coqKi1KdPH5fXh9LBFePoalOmTJGXl5diY2NLXB9uHSUZK+4YZyidXD0WZs6cqZycHPXt29cl9aF0KOk4mjhxogIDAzV27Fi31FdWefQhcXBkGIays7Mt9c0/QpCVlSVfX98ip2dmZl5zOVu2bNHy5cuVmJhYzGpxq/LEOLraZ599po8//lgTJkxQvXr1ijUvbm2ZmZk3PFZcPc5QepVkHF1t+/btev3119W3b1+1a9fOVSWiFCjJOPrll1/07rvv6vPPP5e3t7fbaiyLOPJwC9m2bZsCAgIsvfIP7/v7+xe6o5iVlWVOL8rly5c1evRoDRgwQM2aNXPPSuGmu9nj6GoJCQkaMmSIunbtqjfffNM1K4VbRknGiivHGUo3V42FQ4cOqVevXmrSpIk+/PBDl9aIW19JxtGYMWN03333qVevXm6rr6ziyMMtpGHDhpo3b56lvjVq1JB05dBcYYflkpOTJUk1a9YschkLFizQL7/8og8++EBHjx51mPbnn3/q2LFjqlatGv+hlzI3exwVdODAAT300ENq0qSJ4uPjZbfz/URZU5Kx4qpxhtLPFWPhxIkT6ty5sypVqqSvvvpKgYGBLq8Tt7YbHUfffPONNmzYoOXLlzvs/1y+fFkZGRk6duyYKleurODgYLfUXdoRHm4h1atX14ABA4o1T2RkpBISEmQYhmw2m9m+a9cuBQYGKiIiosh5T5w4oZycnELvg7xgwQItWLBAK1eu1EMPPVSsmuBZN3sc5Tt8+LC6du2qGjVq6KuvvlJAQECxa8etr2nTptq6davS0tIc/mPdtWuXpCtjqSiuGGcoG0oyjiTp/Pnz6ty5s3JycrRlyxYudv2butFxdPz4cUlyuPNbvtOnT6tu3bqaOXOmRo8e7YaqSz++FizlYmNjdfbsWS1fvtxsS0lJ0dKlS9WzZ0+H8/iOHz/ucBu7f/zjH1q5cqXDa8WKFZKkHj16aOXKlWrRosXNWxl4TEnGkXTlzkqdO3eWl5eXNmzYoJCQkJtWO26u2NhY5ebm6oMPPjDbsrOz9cknn6hly5aqVauWpCtj4tChQ7p8+bLDvFbHGcq2koyj9PR0de/eXcnJyfrqq6+4rupv7EbHUYcOHQrd/6lataqio6O1cuVKxcTEeGSdSgOeMF3K5eXl6f7779d///d/6/nnnzef2Hry5Ent3r1bDRo0MPu2a9dO27dvV15e3jWXabfbecL030xJx1FkZKT51OC7777bYdk1atRQx44db9q6wP369u2rFStWaOzYsapXr57mz5+vPXv2aPPmzeY9+AcNGqQFCxbo6NGjql27tqTijTOUfTc6jh555BGtXr1aTz31lNMF0sHBwXr44Ydv9qrAg250HBUmPDxcTZo04QnT1+O559PBVf744w8jLi7OqFKlihEYGGi0b9/e2Lt3r1O/du3aGXa7/brL4wnTf08lGUc2m82w2+2GzWZzerVv3/5mrQJukqysLOP55583QkNDDT8/P+Pee+81vv76a4c+gwYNMux2u3Hs2DGHdqvjDGXfjY6j8PDwIn/f1K1b92avBjysJL+PrsYTpq3hyAMAAAAAS7jmAQAAAIAlhAcAAAAAlhAeAAAAAFhCeAAAAABgCeEBAAByS4U0AAARKUlEQVQAgCWEBwAAAACWEB4AAAAAWEJ4AAAAAGAJ4QEAAACAJYQHAAAAAJYQHgAAAABYQngAUCq1a9dOdrtddrtdx48f90gNr732mlnD/PnzPVIDSo958+aZ4+X111+/bn9PjK/8z6tbt+5N+TwApQ/hAcAt5emnnzZ3YOx2u6ZMmVJoP5vN5vCnJ9lsthLVMW/ePL322mt6/fXXdfHiRRdW9v+Fh4c7bNerX2PHjnXL53pK27Zt5e3trYsXL2rr1q2FrnOFChXUqlUrvffee8rLy3N7TQXHbHHGS0nH1424Ff5dAbg1eXm6AADIl5OTo/j4eIe2zz//XBMmTHDqaxjGzSrrukpay7x587R9+3ZJ0uDBg1WhQgVXlHVNV+8clqWdxT/++EPfffed7r///kK3Zf66pqWladeuXdq1a5eOHDmi6dOnu7Wu7t2769tvv5Uk1a5d2/J8t9JYBwDCA4BbxsaNG5WamurQduDAAf3888+64447PFTVzWOz2W7KjuK///1vNW3a1KGtZs2a150vOztbXl5eKleuXKHTDcNQVlaW/P39XVLn9T6vKBs2bFBeXp5iYmKcpoWGhmrp0qVKT0/XRx99pCVLlkiS5syZoylTpsjLy33/LVatWlVVq1Z12/IB4GbgtCUAt4zPP//cfN+vX79C2wuTnp6uMWPGqFq1agoMDFTPnj115MgRhz4HDhzQww8/rGrVqsnb21shISGKjIzU8OHDdeLECYe+33zzjXr06KEqVarIx8dHtWvX1uDBg/Xbb79ZWo+izhu/+jqN/NNp8o86GIahunXrFnotx6pVq9SxY0dVqlRJvr6+uvPOOzVx4kRlZWVZqqmgxo0bq3Xr1g6v8PBwc/qgQYPMGtavX69x48YpNDRUAQEBOnnypNO5+3PmzNEdd9whX19fc2dckuLj49W+fXtVrFhRvr6+qlevnkaNGqUzZ8441HOtzzt16pTy8vL05ptv6u6775a/v7/8/PxUu3ZtxcTE6OOPP3ZavzVr1kiSevTo4TTN19dXrVu3VqdOnTR79myzPSsrS+fPn3foe+7cOT377LNq0KCBfH19ValSJcXExGjXrl1Oy507d66aN2+uoKAg+fr6qlatWurUqZOmTp1q9rnWNQ9LlizRXXfdJT8/PzVu3FhLly4t7K9OkvXxlW/cuHFq3bq1QkND5evrq6CgIDVr1kzTp09Xbm5ukZ+Tr7jbH0AZZwDALSAzM9MIDg42bDabUb16dePs2bOGl5eXYbPZjDvvvNOp/wMPPGDYbDbDZrMZTZo0Md/nv8LCwozz588bhmEYKSkpRtWqVc1pdrvdoe+mTZvM5b733nsO0wr2LV++vLF7926z77/+9S9z2vz58832/La6des61NyuXTtzmceOHTO2bNniVHf+5+X3MQzDePXVV4usqW3btsalS5euu33r1KljzrN169Zr9h04cKDZt169eg6fe+zYMeOTTz4pcnr+dhg/fnyRNYeGhhq///67pc87evSoMXHixCKXdf/99zvUnpuba4SEhBi333672VZwOxf8O0lJSTHb/fz8jMuXL5vTjh07ZoSFhRX6mT4+Psbq1avNvgsWLCiyvrCwMLNfwe32+uuvm+1LlixxGgc2m8245557SjS+8vn6+hp2u93hlb+Mp556ymEZhS27ONsfQNnHkQcAt4Q1a9bor7/+kiQ98sgjqlatmtq3by9J+vnnn7V///4i5z1z5ozmzZunpUuX6vbbb5cknTp1SpMnT5Yk7dy5UykpKZKk/v37a+PGjVq1apWmTZumdu3amaeqnDhxwrxw2G6369VXX9XatWvVu3dvSVfOkR80aNANr6Nx1SlJUVFRSkhIUGRkpNm2dOlSffvtt0pISFCNGjW0e/duvfHGG5KunFr08ccfa926dea36gkJCZoxY0ax6mjfvr3TxcPbtm0rtO+RI0c0ZswYbdiwQXPnzlVQUJDT9K5du2rVqlVasmSJGjVqpF27dpnfuPv7+2v69OlatWqV+fd55swZjRgxwtLnBQcHa9WqVZKkSpUqadGiRdq0aZM+/fRTPf30006nW33//fdKTU0t9KiDdOUIw44dO/T1119r+PDhkq6cLjZ48GCH06NGjBihU6dOSZIGDhyo9evXa/bs2QoKClJOTo6eeuopZWRkSJJZn5eXl+bOnavNmzfrs88+07hx48zxWJTc3FyHi9X79eunr776SmPHjtUPP/xwzXmvdvX4yvfKK6/os88+07p167RlyxYtW7ZM9957r6QrR0Py17Moxdn+AMo+rnkAcEvIPzXJZrMpNjZWkhQbG6tNmzaZ0wvuZBf01ltvacCAAZKkihUrqlOnTpKklStXatq0afL29jb7hoWFKSIiQmFhYZKkZ5991pwWHx+vnJwcSdKjjz5qnlrSsWNHJSQk6MyZM/rpp5904MAB3XPPPSVe5/Lly+u+++5T+fLlzXVv3ry5w8W0ixYtMt8PGjRIDRo0kCT985//1Nq1ayVJCxcu1Pjx44v12fkXDRuGcc27+Tz++OPXDCfh4eFas2aN7Pb//13UmDFjzPcjR440d45btWqlsLAwZWdna8OGDbpw4YIqVqx43c/z8fGRJAUEBOj2229XkyZN5O/vr8cff9ypnvxTlgq73kG6ElzatGlj/uzl5aXnn39eEydONNtSU1P11VdfSZJq1KihuLg4GYahu+66S506ddKKFSt0/vx5rV+/Xo8++qhZn4+Pj+rVq6dmzZopODhY//jHP4rcbvn27t2r06dPS5Jq1aqlTz/9VHa7XV27dlViYqJ27Nhx3WVcT/v27TV16lTt2rVLKSkpDqcqGYahffv2qVatWkXOX5ztD6Ds48gDAI9LS0szd4QrV65sfkPdq1cvc6f0iy++KHRem81mfosqSdHR0eb7Y8eOSbpy2878ne533nlHtWvXVvny5dW+fXt9+OGH5je2v/zyizlvwWV6eXk5XGD866+/3vjKFlPBmiZPnqw2bdqoTZs2euihh8z2Q4cOFWuZ//73v5WQkKCEhATzKEdRwaxnz57XXFbXrl0dgsPVNRfcjiEhIQ7fxBd2DUlhnzdkyBBJV44mtWrVSoGBgapfv76efvppp7+LtWvXKigoyBxDhSkYli5fvqzvv//eDI1X15UfNtq2bau2bdtqxYoV5rSDBw9KunKHLJvNpoyMDHXs2FEVKlTQbbfdpieffFJ79+4tsg5JDtfmREZGOmzLFi1aXHNeKxITE9W+fXutXr1aZ8+eVW5urlNQvN7tgYuz/QGUfYQHAB63cuVKZWdnS5LOnz8vb29v2e12Va9e3bz//rFjx7Rz587rLquwb9D9/f21Y8cOTZw4UR06dFBoaKjS09O1bds2DRs2TO+8845rV+j/XH0xav6pU8VR8FSU/J3eq1+5ubkOO7/XU9gF0/lHP65WvXr1ay7retOLUtQpNoUtb8iQIVq3bp2efPJJNW7cWH5+fjpy5Ig++OADPfDAA+bO74kTJ/Tjjz+qQ4cODkebCgoPD1dubq5++ukn8w5eW7Zs0SuvvFJkbUVt9/zTljp16qQdO3Zo6NChioqKUmBgoE6dOqVFixbpgQce0O+//178DWSBlfE1Z84cXb58WdKVYLZu3Tpt377dPFIn6brPuLC6/QH8PRAeAHjc4sWLLfUr7K5LhmE43P2m4PuCdxCqUqWKXnnlFW3cuFGnTp3S4cOHzfP3ly9fLkkOt4MtuJycnBwlJSWZP0dERFyzzvwd8fPnz5s7bkePHi3yCEHBb5uv3iEsWNP8+fOVm5vr9Prrr7+K3Fkuqes9/6Gw6UVtx/Pnz+vw4cOSrqxz/fr1LX9ely5dNH/+fB04cEBpaWn6j//4D0lXjgx89913kmQevSrqlKWra5w7d67583vvvaezZ89KkurXr2/WUb9+/UK3eVZWliZNmmTO37JlS82dO1d79uzRn3/+aT4zIiMjQ+vXry+yjnr16pnvk5KSHHbkC7urk1S88ZV/PYPNZtNbb72lLl266L777nO649X1FLX9z549a25/AH8PXPMAwKPOnz+vjRs3SrqyU5R/kXO+7OxsjRs3TtKVi4n/8z//02kZL774ory8vBQQEKAXX3zRbH/44YclSTt27NDo0aMVGxur+vXrq0qVKvrhhx/Mb44vXbok6co1FhMmTFBOTo6WL1+u1157Tffee6/mz59v7mzdddddatKkyTXXqUGDBtq7d68yMjLUv39/tWnTRu+//36R3/BWrlxZ0pUg9F//9V/q1q2bAgIC1KxZM/Xv31/vvvuupCvXEqSkpKhx48b6448/dPjwYa1fv16NGjXSe++9d82aCvrhhx+cTjWqWLGi7r77boe2G31wXL9+/cyaZ82apZo1a6p+/fqaOXOmua27dOnidL1DUZ/32GOPqXz58rr//vsVFhamy5cva/fu3eb0/GWuXbtWNptN3bt3t1Rn27Zt1bJlS33//ffKzs7Wu+++qzfffFMhISHq0qWL1q9fr99++00PP/ywBg8erICAAB0/flz79u3TsmXL9OOPP6patWoaNWqUkpOT1blzZ4WFhcnLy8u8/W7B+goTFRWlWrVq6dSpUzp9+rQGDBigxx9/XJs3by5yp7w44ys/QBuGocmTJ2vAgAFat26dvv76a0vbSLr29jcM45rrB6AM8sg9ngDg/8yZM8e87WPv3r0L7dO0aVOzz+bNmw3DcLxVa0REhNNtLmvVqmWkpKQYhmEYCQkJhd4KM/+2k1OmTDE/6/3333e6lWv+q0KFCsaePXvMvkXdqvWDDz5wmrd8+fLGbbfdZv5c8Faas2bNcuofHh5uTn/55ZeLrN9msxnDhw+/7nYueKvWwl7t2rUz+xa8deq2bducllXULUcLmjBhQpGfVbNmTePo0aOWP69jx45FLis0NNT4888/jczMTCMgIMBo1qyZ0/wFb9VacLsahmHEx8eb0ypVqmT89ddfhmEYxtGjR41atWpdc9ycPXvWMAzDiIuLK7JfYGCgeVvaorbb559/Xui8DRo0KPH4SkxMdBrPdrvdaN269TVvA1twO1nZ/gD+PjhtCYBHFbzLUsGLgAvKv4jWZrOZF07nf0tts9kUHx+vYcOGqUqVKgoICFD37t21fft2hYSESLpyisqECRPUqlUr1ahRQ97e3goODlaLFi303nvvOdypaPjw4dq4caO6deumkJAQeXt7q1atWho4cKD27t2rZs2amX0L1lBQXFycXnzxRVWrVk0BAQHq0KGDEhISzFNUru7/z3/+UxMmTFDt2rVVrlw5p7sfvfHGG1q1apU6d+6skJAQ+fj4KCwsTG3bttXUqVP18ssvX3c724o4b7/g63rrZXW6JL399ttasmSJHnjgAVWoUEE+Pj6qW7eunnnmGe3bt0916tSxvLwRI0aob9++ql+/voKDg+Xt7a2wsDA98cQT+vbbbxUcHKxvvvlGmZmZhZ6yVHD5V39Gr169VLduXdlsNl28eFEffvihJKlOnTrav3+/nnvuOd1xxx3y9/dX+fLl1ahRIw0aNEhr1qwxnxb9+OOPa+DAgbrzzjtVsWJFeXl5qXr16urVq5cSEhLMb/+LWs++fftq8eLFatiwofkAwE8++cS8m1FJxld0dLRWrFihxo0by9/fX3fffbfi4+PVuXPnIrf51dvJyvYH8PdhM4wirloDAKCUGDlypObMmaPvv//e4Y5bAADX4sgDAKDUi4yM1MSJEwkOAOBmHHkAAAAAYAlHHgAAAABYQngAAAAAYAnhAQAAAIAlhAcAAAAAlhAeAAAAAFhCeAAAAABgCeEBAAAAgCWEBwAAAACWEB4AAAAAWEJ4AAAAAGDJ/wN/PoxvpnGbKwAAAABJRU5ErkJggg==" ], "text/plain": [ "Figure(PyObject )" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "figure(figsize=(8,3))\n", "PyPlot.hist(vec(Dfull-Dest.value),100)\n", "xlim([-0.5,0.5]),xlabel(\"Absolute Errors/Residuals\",fontweight=\"bold\"),tight_layout()\n", "show()" ] } ], "metadata": { "kernelspec": { "display_name": "Julia 0.3.9", "language": "julia", "name": "julia-0.3" }, "language_info": { "name": "julia", "version": "0.3.9" } }, "nbformat": 4, "nbformat_minor": 0 }