Skip to content

Instantly share code, notes, and snippets.

@csullivan
Last active October 9, 2017 00:50
Show Gist options
  • Select an option

  • Save csullivan/4677b91112601ac75429a22a3f1db02e to your computer and use it in GitHub Desktop.

Select an option

Save csullivan/4677b91112601ac75429a22a3f1db02e to your computer and use it in GitHub Desktop.
Least squares using QR, and L2 regularization
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Least Squares - Chris Sullivan - 10/09/17"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here we explore the solution to a system of equations, as well as the least squares solution to an underdetermined system, and"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import numpy as np\n",
"import numpy.linalg"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Classic Gram-Schmidt QR decomposition"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def classic_gram_schmidt(A):\n",
" \"\"\" The jth column of Q is the jth column \n",
" of A with the projected subtractions of \n",
" every preceeding column in A, then normalized \"\"\"\n",
" \n",
" nrows,ncols = A.shape\n",
" \n",
" Q = np.copy(A,order='F') # columns in contiguous memory\n",
" R = np.zeros(shape=(ncols,ncols))\n",
" for colj in range(ncols):\n",
" for coli in range(colj):\n",
" R[coli,colj] = Q[:,coli].dot(Q[:,colj])\n",
" Q[:,colj] -= R[coli,colj]*Q[:,coli]\n",
" norm2 = np.linalg.norm(Q[:,colj],ord=2)\n",
" if norm2:\n",
" Q[:,colj] /= norm2\n",
" else:\n",
" raise RuntimeError(\"One of the vectors of A is the 0 vector, or A is not of full rank\")\n",
" \n",
" R[colj,colj] = norm2\n",
" \n",
" return Q,R"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Modified Gram-Schmidt QR decomposition"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def modified_gram_schmidt(A):\n",
" \"\"\" Subtract the ith normalized column of A from every jth column of A such that j>i \"\"\"\n",
" nrows,ncols = A.shape\n",
" \n",
" Q = np.copy(A,order='F') # columns in contiguous memory\n",
" R = np.zeros(shape=(ncols,ncols))\n",
" \n",
" for coli in range(ncols):\n",
" R[coli,coli] = np.linalg.norm(Q[:,coli],ord=2)\n",
" if R[coli,coli]:\n",
" Q[:,coli] /= R[coli,coli]\n",
" else: \n",
" raise RuntimeError(\"One of the columns of A is the 0 vector\")\n",
" for colj in range(coli+1,ncols):\n",
" R[coli,colj] = Q[:,coli].dot(Q[:,colj])\n",
" Q[:,colj] -= R[coli,colj]*Q[:,coli] \n",
" return Q,R"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Householder algorithm for QR decomposition"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def householder_reflector(x):\n",
" v = np.copy(x)\n",
" v[0] += np.sign(x[0])*np.linalg.norm(x,ord=2)\n",
" return v\n",
"\n",
"def householder_qr(A):\n",
" R = np.copy(A,order='F')\n",
" nrows,ncols = R.shape\n",
" \n",
" hvectors = []\n",
" for icol in range(ncols):\n",
" print(R[icol:,icol])\n",
" v = householder_reflector(R[icol:,icol])\n",
" norm2 = np.linalg.norm(v,ord=2)\n",
" if norm2:\n",
" v /= norm2\n",
" else:\n",
" raise RuntimeError(\"Norm of zero vector\")\n",
" \n",
" R[icol:,icol:] -= 2*np.outer(v,v.dot(R[icol:,icol:]))\n",
" hvectors.append(v)\n",
" \n",
" # calculate Q according to 10.3\n",
" Q = np.eye(nrows)\n",
" for icol in range(ncols):\n",
" for k in reversed(range(ncols)): \n",
" Q[k:,icol] -= 2*hvectors[k]*(hvectors[k].dot(Q[k:,icol]))\n",
"\n",
" return Q[:nrows,:ncols], R[:ncols,:ncols]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Least squares methods"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def back_substitution(R,b):\n",
" nrows,ncols = R.shape\n",
" if nrows != ncols: raise RuntimeError(\"This function only supports square upper triangular matrices.\")\n",
" x = np.zeros(ncols)\n",
" for i,row in enumerate(np.flip(R,axis=0)):\n",
" pos = ncols-(i+1)\n",
" x[pos] = (b[pos] - row[pos+1:].dot(x[pos+1:]))/row[pos]\n",
" return x"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def least_squares_via_qr(A,b,qr_decomp_method):\n",
" # Step 1, compute the reduced QR factorization A = QR\n",
" Q,R = qr_decomp_method(A)\n",
" # Step 2, Compute the vector [Q*]b\n",
" rhs = Q.transpose().dot(b)\n",
" # Step 3, Solve Rx = [Q*]b\n",
" return back_substitution(R,rhs)\n",
"\n",
"def least_squares_given_qr(Q,R,b,qr_decomp_method):\n",
" # Step 1, Compute the vector [Q*]b\n",
" rhs = Q.transpose().dot(b)\n",
" # Step 2, Solve Rx = [Q*]b\n",
" return back_substitution(R,rhs)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Problem 2 - Solving a linear system (fully determined)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"methods_for_qr_decomposition = [classic_gram_schmidt,modified_gram_schmidt, householder_qr]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Part (a)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"A = np.array([\n",
" [1,2,3],\n",
" [4,5,6],\n",
" [7,8,7],\n",
" [4,2,3],\n",
" [4,2,2]\n",
"], dtype=np.float64)\n",
"\n",
"x = np.ones(A.shape[1]) # true answer\n",
"b = A.dot(x) # inferred b"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"classic_gram_schmidt\n",
"x = [ 1. 1. 1.]\n",
"modified_gram_schmidt\n",
"x = [ 1. 1. 1.]\n",
"householder_qr\n",
"[ 1. 4. 7. 4. 4.]\n",
"[ 0.78129666 0.61726916 -2.21870334 -2.21870334]\n",
"[-1.81439764 0.71132573 -0.28867427]\n",
"x = [ 1. 1. 1.]\n"
]
}
],
"source": [
"for qr_decomp in methods_for_qr_decomposition:\n",
" print(qr_decomp.__name__)\n",
" x = least_squares_via_qr(A,b,qr_decomp_method=qr_decomp)\n",
" print('x = ',x) "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Part (b)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"A = np.array([\n",
" [0.70000,0.70711],\n",
" [0.70001,0.70711]\n",
"], dtype=np.float64)\n",
"\n",
"x = np.ones(A.shape[1]) # true answer\n",
"b = A.dot(x) # inferred b"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"classic_gram_schmidt\n",
"x = [ 0.99999352 1.00000641]\n",
"modified_gram_schmidt\n",
"x = [ 0.99999352 1.00000641]\n",
"householder_qr\n",
"[ 0.7 0.70001]\n",
"[ -7.14283864e-06]\n",
"x = [ 1. 1.]\n"
]
}
],
"source": [
"for qr_decomp in methods_for_qr_decomposition:\n",
" print(qr_decomp.__name__)\n",
" x = least_squares_via_qr(A,b,qr_decomp_method=qr_decomp)\n",
" print('x = ',x) "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Part (c) - underdetermined system"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"A = np.array([\n",
" [1,2,3],\n",
" [4,2,9]\n",
"], dtype=np.float64)\n",
"\n",
"b = np.asarray([6,15])"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"classic_gram_schmidt\n",
"x = [ 3. 1.5]\n",
"modified_gram_schmidt\n",
"x = [ 3. 1.5]\n"
]
}
],
"source": [
"for qr_decomp in methods_for_qr_decomposition[:-1]:\n",
" print(qr_decomp.__name__)\n",
" Q,R = qr_decomp(A) \n",
" x = least_squares_given_qr(Q[:2,:2],R[:2,:2],b,qr_decomp_method=qr_decomp)\n",
" print('x = ',x) "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"with the last element of x equal to zero"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Problem 3 - Tikhonov regularization - L2 regularization"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Part (a)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$(A^TA + \\alpha^2I)\\textbf{x}=A^T\\textbf{b}\\\\\n",
"\\iff \n",
"A^TA\\textbf{x} + \\alpha^2\\textbf{x} = A^T\\textbf{b}\\\\\n",
"\\iff \n",
"A\\textbf{x} + \\alpha^2 (A^T)^{-2} \\textbf{x} = \\textbf{b} \\\\\n",
"\\iff\n",
"\\textbf{b}-A\\textbf{x} = \\alpha^2 (A^T)^{-2}\\textbf{x}\n",
"$\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Thus, as $\\alpha$ approaches 0, the above system reduces to the lineary system we wish to solve, which shows that this is the necessary condition to minimize the system $\\textrm{min}\\; \\vert\\vert\\textbf{b} - A\\textbf{x}\\vert\\vert^2_2 + \\alpha^2\\vert\\vert\\textbf{x}\\vert\\vert^2_2$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Part (b)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Solving $A\\textbf{x} = \\textbf{b}$ exactly would entail finding an $\\textbf{x}$ such that $\n",
"\\textbf{b}-A\\textbf{x} = \\textbf{0}$ if such a solution exists, or alternatively minimizing $\\vert\\vert\\textbf{b}-A\\textbf{x}\\vert\\vert$ so that it is as close to 0 as possible.\n",
"\n",
"Instead, if we solve the system,\n",
"\n",
"$\n",
"\\left( \\begin{array}{c} A\\\\ \\alpha I \\\\ \\end{array} \\right)\\textbf{x}=\n",
"\\left( \\begin{array}{c} \\textbf{b}\\\\ \\textbf{0} \\\\ \\end{array} \\right)\n",
"$\n",
"\n",
"$\\alpha I$ is a perturbation to the system, and so we wish to minimize $\\textbf{b} - (A\\textbf{x}+\\alpha\\textbf{x})$, which corresponds to a minimization of the norm of the system, $ \\vert\\vert\\textbf{b} - A\\textbf{x}\\vert\\vert^2_2 + \\alpha^2\\vert\\vert\\textbf{x}\\vert\\vert^2_2$, which is the same statement as from part (a)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Parts (c), (d)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Hilbert matrix (nth order) from SciPy"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import scipy.linalg"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First, I will simply solve the hilbert system $H\\textbf{x} = \\textbf{b}$"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"n = 10, difference 2-norm = 0.00020605530255466347\n",
"\n",
"n = 20, difference 2-norm = 89.90788456902843\n",
"\n",
"n = 30, difference 2-norm = 322.3055400531063\n",
"\n"
]
}
],
"source": [
"for n in [10, 20, 30]:\n",
" A = scipy.linalg.hilbert(n=n)\n",
" rhs = A.dot(np.ones(n))\n",
" x = least_squares_via_qr(A,rhs,qr_decomp_method=np.linalg.qr)\n",
" norm = np.linalg.norm(x-np.ones(n))\n",
" print('n = {}, difference 2-norm = {}'.format(n,norm))\n",
" print()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As we can see from above, the two-norm of the difference of the true answer and the solved answer are quite large with increasing n. Now let's try with the L2 regularization, that is, instead of solving the system directly, we introduce a small purturbation that is included in the system that is solved, inorder to \"desensitize\" the system to small changes in the inputs"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"i. n = 10, and α = 0, 0.00000001, 0.00001, 0.001, 0.1, respectively"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"ii. n = 20, and α = 0, 0.00000001, 0.00001, 0.001, 0.1, respectively"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"iii. n = 30, and α = 0, 0.00000001, 0.00001, 0.001, 0.1, respectively"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"n = 10, alpha = 0, difference 2-norm = 0.00020605530255466347\n",
"n = 10, alpha = 1e-07, difference 2-norm = 0.0005005253874793714\n",
"n = 10, alpha = 1e-05, difference 2-norm = 0.005937874373324046\n",
"n = 10, alpha = 0.001, difference 2-norm = 0.041267524232109526\n",
"n = 10, alpha = 0.0001, difference 2-norm = 0.015234704854219882\n",
"n = 10, alpha = 0.1, difference 2-norm = 0.5228232167543837\n",
"\n",
"n = 20, alpha = 0, difference 2-norm = 89.90788456902843\n",
"n = 20, alpha = 1e-07, difference 2-norm = 0.0005819618680212335\n",
"n = 20, alpha = 1e-05, difference 2-norm = 0.007845509096597253\n",
"n = 20, alpha = 0.001, difference 2-norm = 0.07542418674153994\n",
"n = 20, alpha = 0.0001, difference 2-norm = 0.024791110109748844\n",
"n = 20, alpha = 0.1, difference 2-norm = 0.7615408185841933\n",
"\n",
"n = 30, alpha = 0, difference 2-norm = 322.3055400531063\n",
"n = 30, alpha = 1e-07, difference 2-norm = 0.0008341651584820031\n",
"n = 30, alpha = 1e-05, difference 2-norm = 0.007791498487394957\n",
"n = 30, alpha = 0.001, difference 2-norm = 0.08100881360882856\n",
"n = 30, alpha = 0.0001, difference 2-norm = 0.025128440467763434\n",
"n = 30, alpha = 0.1, difference 2-norm = 0.8941539547744562\n",
"\n"
]
}
],
"source": [
"for n in [10, 20, 30]:\n",
" A = scipy.linalg.hilbert(n=n)\n",
" rhs = A.dot(np.ones(n))\n",
" for alpha in [0,1e-7, 1e-5, 1e-3, 1e-4, 1e-1]:\n",
" matrix = np.vstack((A,alpha*np.eye(n)))\n",
" hrhs = np.hstack((rhs,np.zeros(n))) \n",
" x = least_squares_via_qr(matrix,hrhs,qr_decomp_method=np.linalg.qr)\n",
" norm = np.linalg.norm(x-np.ones(n))\n",
" print('n = {}, alpha = {}, difference 2-norm = {}'.format(n,alpha,norm))\n",
" print()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Thus, as we can see, this regularization greatly improves the accuracy of the solution to the hilber system"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Part (e)"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import pandas as pd\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"data = {'Hilbert':[],'Alpha':[],'two-norm':[]}\n",
"ns = [10, 20, 30, 40, 50]\n",
"alphas = [np.power(10,-x) for x in list(reversed(np.arange(5,20,0.5)))]\n",
"for n in ns:\n",
" A = scipy.linalg.hilbert(n=n)\n",
" rhs = A.dot(np.ones(n))\n",
" for alpha in alphas:\n",
" matrix = np.vstack((A,alpha*np.eye(n)))\n",
" hrhs = np.hstack((rhs,np.zeros(n))) \n",
" x = least_squares_via_qr(matrix,hrhs,qr_decomp_method=np.linalg.qr)\n",
" norm = np.linalg.norm(x-np.ones(n))\n",
" data['Hilbert'].append(n)\n",
" data['Alpha'].append(alpha)\n",
" data['two-norm'].append(norm)\n",
"data = pd.DataFrame(data).set_index('Hilbert').set_index('Alpha',append=True)"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.lines.Line2D at 0x7f08de0b97f0>"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f08de0b97b8>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig,axes=plt.subplots()\n",
"labels = []\n",
"for n in ns:\n",
" data.loc[(n,)].plot(ax=axes)\n",
" labels.append('Hilbert n={}'.format(n))\n",
"axes.set_xscale('log')\n",
"axes.set_yscale('log')\n",
"axes.set_xlim(1e-20,1e-5)\n",
"axes.legend(labels)\n",
"axes.axvline(x=3e-11,color='red',linestyle='--')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Thus, choosing an $\\alpha \\sim 3\\times10^{-11}$ minimizes the 2-norm yielding an answer closest to the true solution for $\\textbf{x}$ with the hilbert system of equations."
]
}
],
"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.2"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment