{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Speeding up OMP\n", "\n", "This example generates a sparse signal and tries to recover it using the orthogonal matching pursuit algorithm" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note: Much of the following is copied from last weeks solution notebook" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# imports\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "from scipy import misc\n", "from IPython import display\n", "from simulator import *\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# the setting\n", "\n", "# file name for the sparse image\n", "fname = 'pika.png'\n", "# number of measurements to be taken from the sparse image\n", "numMeasurements = 9000\n", "# the sparsity of the image\n", "sparsity = 800\n", "\n", "# read the image in black and white\n", "I = misc.imread(fname, flatten=1)\n", "# normalize the image to be between 0 and 1\n", "I = I/np.max(I)\n", "\n", "# shape of the image\n", "imageShape = I.shape\n", "# number of pixels in the image\n", "numPixels = I.size\n", "\n", "plt.title('input image')\n", "plt.imshow(I, cmap=plt.cm.gray, interpolation='nearest');" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# generate your image masks and the underlying measurement matrix\n", "Mask, A = randMasks(numMeasurements,numPixels)\n", "# vectorize your image\n", "full_signal = I.reshape((numPixels,1))\n", "# get the measurements\n", "measurements = np.dot(Mask,full_signal)\n", "# remove the mean from your measurements\n", "measurements = measurements - np.mean(measurements)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nAioDQgghAP4/qM1w7p4K4asAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# measurements\n", "plt.title('measurements')\n", "plt.plot(measurements)\n", "plt.xlabel('measurement index')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# WRITE A FUNCTION THAT RETURNS a MATRIX U WHOSE COLUMNS FORM\n", "# AN ORTHONORMAL BASIS FOR THE COLUMNS OF THE MATRIX A\n", "def gramschmidt(A):\n", " ### ADD YOU WORK HERE\n", " return U\n", "\n", "\n", "### ANOTHER -- BETTER -- OPTION IS TO WRITE A FUNCTION THAT TAKES IN a MATRIX U0\n", "## WITH ORTHONORMAL COLUMNS AND A SINGLE NEW VECTOR v AND ADDS ANOTHER \n", "## ORTHONORMAL COLUMN TO U0 CREATING A NEW MATRIX U WHOSE COLUMNS ARE OTHORNORMAL\n", "## AND SPAN THE COLUMN SPACE OF [U0,v]\n", "## NOTE: USING THIS FUNCTION WILL MAKE YOUR CODE FASTER\n", "\n", "def gramschmidt_addone(U0,v):\n", " ## ADD YOUR WORK HERE\n", " return U\n", " \n", " " ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# THERE ARE MISSING LINES THAT YOU NEED TO FILL\n", "def OMP(imDims, sparsity, measurements, A):\n", " r = measurements.copy()\n", " indices = []\n", " \n", " # threshold to check error. if error is below this value stop\n", " THRESHOLD = 0.1\n", " \n", " # for iterating to recover all signal\n", " i = 0\n", " \n", " ######################################\n", " ### THIS LINE INITIALIZES THE MATRIX U\n", " U = np.zeros([np.size(A,0),0])\n", " ########################################\n", " \n", " while i < sparsity and np.linalg.norm(r) > THRESHOLD: \n", " # calculate the correlations\n", " print('%d - '%i,end=\"\",flush=True)\n", " corrs = A.T.dot(r)\n", "\n", " # Choose highest-correlated pixel location and add to collection\n", " # COMPLETE THE LINE BELOW\n", " best_index = np.argmax(np.abs(corrs))\n", " \n", " ###########################\n", " ### MODIFY THIS SECTION ###\n", " ## TO USE GRAM-SCHMIDT ###\n", " ###########################\n", " \n", " indices.append(best_index)\n", " \n", " # Build the matrix made up of selected indices so far\n", " Atrunc = A[:,indices]\n", " \n", " #############################\n", " ## COMPLETE ONE OF THESE LINES\n", " U = gramschmidt(Atrunc)\n", " ### OR\n", " v = A[:,best_index]\n", " U = gramschmidt_addone(U,v)\n", " ##########################\n", " \n", " # Find orthogonal projection of measurements to subspace\n", " # spanned by recovered codewords\n", " b = measurements\n", " \n", " ###################################\n", " ## REWRITE THESE LINES USING GRAMSCHMIDT TO SPEED UP LEAST SQUARES\n", " #xhat = np.linalg.lstsq(Atrunc, b)[0] \n", " xhat = np.linalg.inv(np.dot(Atrunc.T,Atrunc)).dot(Atrunc.T).dot(b)\n", " r = b - Atrunc.dot(xhat)\n", " ####################################\n", " \n", " # Find component orthogonal to subspace to use for next measurement\n", " ## CHANGE THIS LINE \n", "\n", " \n", " ###########################\n", " ### ------------------- ###\n", " ###########################\n", " \n", " \n", " # this is for viewing the recovery process\n", " if i%100 == 0 or i == sparsity-1 or np.linalg.norm(r) <= THRESHOLD:\n", " \n", " # RECOVERING xhat for plotting\n", " xhat = np.dot(np.linalg.inv(np.dot(Atrunc.T,Atrunc)),np.dot(Atrunc.T,b-r))\n", " \n", " recovered_signal = np.zeros(numPixels)\n", " for j, x in zip(indices, xhat):\n", " recovered_signal[j] = x\n", " Ihat = recovered_signal.reshape(imDims)\n", " plt.title('estimated image')\n", " plt.imshow(Ihat, cmap=plt.cm.gray, interpolation='nearest') \n", " display.clear_output(wait=True)\n", " display.display(plt.gcf())\n", " \n", " i = i + 1\n", " \n", " display.clear_output(wait=True)\n", "\n", " # fill in the recovered signal\n", " recovered_signal = np.zeros(numPixels)\n", " for i, x in zip(indices, xhat):\n", " recovered_signal[i] = x\n", " \n", " return recovered_signal" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "data": { "image/png": "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\n0Jtl5v8BkjPI4SUxokkAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "rec = OMP(imageShape,sparsity,measurements,A)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "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.4.3" }, "name": "_merged" }, "nbformat": 4, "nbformat_minor": 0 }