From 9093ea2c135f23a5a32f2f04beec8ebdf3fcb528 Mon Sep 17 00:00:00 2001 From: Pawel Sarkowicz Date: Mon, 30 Mar 2026 18:45:32 -0400 Subject: [PATCH] to notebooks --- .gitignore | 1 + README.md | 2062 +--- bibliography.md | 114 + .../bella_reconstruction_error_vs_rank.jpeg | Bin 19673 -> 0 bytes figures/bella_singular_value_decay.jpeg | Bin 19187 -> 0 bytes figures/house_price_vs_sqft_cubic.png | Bin 29325 -> 0 bytes figures/projection_of_vector_onto_plane.png | Bin 144052 -> 0 bytes figures/quadratic_degree_11_best_fit.png | Bin 20719 -> 0 bytes figures/quadratic_line_of_best_fit.png | Bin 12778 -> 0 bytes figures/quadratic_poly_of_best_fit.png | Bin 20650 -> 0 bytes {figures => images}/L1_unit_ball.png | Bin {figures => images}/Linf_unit_ball.png | Bin .../bedrooms_vs_square_ft.png | Bin 19064 -> 19064 bytes {pictures => images}/bella.jpg | Bin .../house_price_vs_bedrooms.png | Bin 17847 -> 17847 bytes .../house_price_vs_square_ft.png | Bin 18280 -> 18280 bytes .../line_of_best_fit_easy_example.png | Bin 19783 -> 19783 bytes .../line_of_best_fit_generated_1.png | Bin images/projection_of_vector_onto_plane.png | Bin 0 -> 144069 bytes .../quadratic_data_generated_1.png | Bin images/quadratic_data_line_of_best_fit.png | Bin 0 -> 12474 bytes .../quadratic_data_quadratic_of_best_fit.png | Bin 0 -> 20626 bytes notebooks/01_least_squares.ipynb | 1377 +++ notebooks/02_qr_svd.ipynb | 914 ++ .../03_some_notes_and_what_goes_wrong.ipynb | 433 + notebooks/04_pca.ipynb | 751 ++ notebooks/05_svd_image_denoising.ipynb | 473 + .../data_science_for_linear_algebraist.ipynb | 2861 ++++++ notebooks/html/01_least_squares.html | 9027 +++++++++++++++++ notebooks/html/02_qr_svd.html | 8586 ++++++++++++++++ .../03_some_notes_and_what_goes_wrong.html | 8000 +++++++++++++++ notebooks/html/04_pca.html | 8332 +++++++++++++++ notebooks/svd_image_denoising_color.ipynb | 455 + pictures/bella_grayscale.jpg | Bin 23792 -> 0 bytes pictures/bella_grayscale_noisy.jpg | Bin 17638 -> 0 bytes pictures/bella_grayscale_svd.jpg | Bin 33689 -> 0 bytes .../bella_grayscale_svd_200_500_1000_3000.jpg | Bin 47280 -> 0 bytes requirements.txt | 4 + 38 files changed, 41415 insertions(+), 1975 deletions(-) create mode 100644 .gitignore create mode 100644 bibliography.md delete mode 100644 figures/bella_reconstruction_error_vs_rank.jpeg delete mode 100644 figures/bella_singular_value_decay.jpeg delete mode 100644 figures/house_price_vs_sqft_cubic.png delete mode 100644 figures/projection_of_vector_onto_plane.png delete mode 100644 figures/quadratic_degree_11_best_fit.png delete mode 100644 figures/quadratic_line_of_best_fit.png delete mode 100644 figures/quadratic_poly_of_best_fit.png rename {figures => images}/L1_unit_ball.png (100%) rename {figures => images}/Linf_unit_ball.png (100%) rename figures/bedrooms_vs_square_footage.png => images/bedrooms_vs_square_ft.png (99%) rename {pictures => images}/bella.jpg (100%) rename {figures => images}/house_price_vs_bedrooms.png (99%) rename {figures => images}/house_price_vs_square_ft.png (99%) rename {figures => images}/line_of_best_fit_easy_example.png (99%) rename figures/line_of_best_fit_generated1.png => images/line_of_best_fit_generated_1.png (100%) create mode 100644 images/projection_of_vector_onto_plane.png rename figures/quadratic_data.png => images/quadratic_data_generated_1.png (100%) create mode 100644 images/quadratic_data_line_of_best_fit.png create mode 100644 images/quadratic_data_quadratic_of_best_fit.png create mode 100644 notebooks/01_least_squares.ipynb create mode 100644 notebooks/02_qr_svd.ipynb create mode 100644 notebooks/03_some_notes_and_what_goes_wrong.ipynb create mode 100644 notebooks/04_pca.ipynb create mode 100644 notebooks/05_svd_image_denoising.ipynb create mode 100644 notebooks/data_science_for_linear_algebraist.ipynb create mode 100644 notebooks/html/01_least_squares.html create mode 100644 notebooks/html/02_qr_svd.html create mode 100644 notebooks/html/03_some_notes_and_what_goes_wrong.html create mode 100644 notebooks/html/04_pca.html create mode 100644 notebooks/svd_image_denoising_color.ipynb delete mode 100644 pictures/bella_grayscale.jpg delete mode 100644 pictures/bella_grayscale_noisy.jpg delete mode 100644 pictures/bella_grayscale_svd.jpg delete mode 100644 pictures/bella_grayscale_svd_200_500_1000_3000.jpg create mode 100644 requirements.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..87714a7 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +whole_project_as_readme.md diff --git a/README.md b/README.md index ee26b5f..172ca93 100644 --- a/README.md +++ b/README.md @@ -1,2037 +1,149 @@ -The LaTeX does not seem to render properly on GitLab/Github. This repo is mirrored on my gitea server here, where the LaTeX seems to render properly. +# Data Science for the Linear Algebraist -# Data Science for the Linear Algebraist. - -## Project Overview -A not-so comprehensive guide bridging linear algebra theory with practical data science implementation. Meant for someone to learn data science by using their strong linear algebra background. -This project demonstrates how fundamental linear algebra concepts power modern machine learning algorithms, with hands-on Python implementations. +A practical, linear-algebra-first introduction to data science. -## Main Dependencies -- **Python 3** -- **NumPy** - Matrix operations and linear algebra -- **Pandas** - Data manipulation -- **Matplotlib** - Visualization +This repository demonstrates how core linear algebra concepts -- least squares, matrix decompositions, and spectral methods -- directly power modern data science and machine learning workflows. We finish off with a mini-project involving image denoising using the truncated SVD. -## Key Demonstrations -1. **Least Squares Regression** - From theory to implementation -2. **QR Decomposition and SVD** - Numerical stability in solving systems -3. **PCA** - Dimensionality reduction -4. **Project** - Applying low-rank approximation (via truncated SVD) to an image of my beautiful dog - -## To do -- [ ] Upload Jupyter notebook - -## Contact -Pawel Sarkowicz - -💼 LinkedIn - -🌐 website - -💻 git - -📧 email - -January 2026 +Rather than treating data science as a collection of tools, this project builds everything from first principles and connects theory to implementation through jupyter notebooks. --- -## Table of Contents +## Structure -1. [Introduction: The Basic Data Science Problem](#introduction) -2. [Solving the Problem: Least Squares and Matrix Decompositions](#solving-the-problem-least-squares-regression-and-matrix-decompositions) -3. [Principal Component Analysis](#principal-component-analysis) -4. [Project: Spectral Image Denoising via Truncated SVD](#project-spectral-image-denoising-via-truncated-svd) -5. [Appendix](#appendix) -6. [Bibliography](#bibliography) +This project is organized as a collection of focused notebooks: -## Introduction - -This is meant to be a not entirely comprehensive introduction to Data Science for the Linear Algebraist. There are of course many other complicated topics, but this is just to get the essence of data science (and the tools involved) from the perspective of someone with a strong linear algebra background. - -One of the most fundamental questions of data science is the following. - -> **Question**: Given observed data, how can we predict certain targets? - -The answer of course boils down to linear algebra, and we will begin by translating data science terms and concepts into linear algebraic ones. But first, as should be common practice for the linear algebraist, an example. - -> **Example**. Suppose that we observe $n=3$ houses, and for each house we record -> - the square footage, -> - the number of bedrooms, -> - and additionally the sale price. -> -> So we have a table as follows. -> -> |House | Square ft | Bedrooms | Price (in $1000s) | -> | --- | --- | --- | --- | -> | 0 | 1600 | 3 | 500 | -> | 1 | 2100 | 4 | 650 | -> | 2 | 1550 | 2 | 475 | -> -> So, for example, the first house is 1600 square feet, has 3 bedrooms, and costs $500,000, and so on. Our goal will be to understand the cost of a house in terms of the number of bedrooms as well as the square footage. -> Concretely this gives us a matrix and a vector: -> $$ X = \begin{bmatrix} 1600 & 3 \\ 2100 & 4 \\ 1550 & 2 \end{bmatrix} \text{ and } y =\begin{bmatrix} 500 \\ 650 \\ 475 \end{bmatrix} $$ -> So translating to linear algebra, the goal is to understand how $y$ depends on the columns of $X$. - - -## Translation from Data Science to Linear Algebra - -| Data Science (DS) Term | Linear Algebra (LA) Equivalent | Explanation | -| --- | --- | --- | -| Dataset (with (n) observations and (p) features) | A matrix $X \in \mathbb{R}^{n \times p}$ | The dataset is just a matrix. Each row is an observation (a vector of features). Each column is a feature (a vector of its values across all observations). | -| Features | Columns of $X$ | Each feature is a column in your data matrix. | -| Observation | Rows of $X$ | Each data point corresponds to a row. | -| Targets | A vector $y \in \mathbb{R}^{n \times 1}$ | The list of all target values is a column vector. | -| Model parameters | A vector $\beta \in \mathbb{R}^{p \times 1}$ | These are the unknown coefficients. | -| Model | Matrix–vector equation | The relationship becomes an equation involving matrices and vectors. | -| Prediction Error / Residuals | A residual vector $e \in \mathbb{R}^{n \times 1}$ | Difference between actual targets and predictions. | -| Training / "best fit" | Optimization: minimizing the norm of the residual vector | To find the "best" model by finding a model which makes the norm of the residual vector as small as possible. | - -So our matrix $X$ will represent our data set, our vector $y$ is the target, and $\beta$ is our vector of parameters. We will often be interested in understanding data with "intercepts", i.e., when there is a base value given in our data. So we will augment a column of 1's (denoted by $\mathbb{1}$) to $X$ and append a parameter $\beta_0$ to the top of $\beta$, yielding - -$$ \tilde{X} = \begin{bmatrix} \mathbb{1} & X \end{bmatrix} \text{ and } \tilde{\beta} = \begin{bmatrix} \beta_0 \\ \beta_1 \\ \beta_2 \\ \vdots \\ \beta_p \end{bmatrix}. $$ - -So the answer to the Data Science problem becomes - -> **Answer**: Solve, or best approximate a solution to, the matrix equation $\tilde{X}\tilde{\beta} = y$. - -To be explicit, given $\tilde{X}$ and $y$, we want to find a $\tilde{\beta}$ that does a good job of roughly giving $\tilde{X}\tilde{\beta} = y$. There of course ways to solve (or approximate) such small systems by hand. However, one will often be dealing with enormous data sets with plenty to be desired. One view to take is that modern data science is applying numerical linear algebra techniques to imperfect information, all to get as good a solution as possible. - -# Solving the problem: Least Squares Regression and Matrix Decompositions - -If the system $\tilde{X}\tilde{\beta} = y$ is consistent, then we can find a solution. However, we are often dealing with overdetermined systems, in the sense that there are often more observations than features (i.e., more rows than columns in $\tilde{X}$, or more equations than unknowns), and therefore inconsistent systems. However, it is possible to find a **best fit** solution, in the sense that the difference - -$$ e = y - \tilde{X}\tilde{\beta} $$ - -is small. By small, we often mean that $e$ is small in $L^2$ norm; i.e., we are minimizing the the sums of the squares of the differences between the components of $y$ and the components of $\tilde{X}\tilde{\beta}$. This is known as a **least squares solution**. Assuming that our data points live in the Euclidean plane, this precisely describes finding a line of best fit. - -![line_of_best_fit_generated1.png](./figures/line_of_best_fit_generated1.png) - -The structure of this sections is as follows. -- [Least Squares Solution](#least-squares-solution) -- [QR Decompositions](#qr-decompositions) -- [Singular Value Decomposition](#singular-value-decomposition) -- [A note on other norms](#a-note-on-other-norms) -- [A note on regularization](#a-note-on-regularization) -- [A note on solving multiple targets concurrently](#a-note-on-solving-multiple-targets-concurrently) -- [Polynomial regression](#polynomial-regression) -- [What can go wrong?](#what-can-go-wrong) - -## Least Squares Solution - -Recall that the Euclidean distance between two vectors $x = (x_1,\dots,x_n) ,y = (y_1,\dots,y_n) \in \mathbb{R}^n$ is given by - -$$ ||x - y||_2 = \sqrt{\sum_{i=1}^n |x_i - y_i|^2}. $$ - -We will often work with the square of the $L^2$ norm to simplify things (the square function is increasing, so minimizing the square of a non-negative function will also minimize the function itself). - -> **Definition**: Let $A$ be an $m \times n$ matrix and $b \in \mathbb{R}^n$. A **least-squares solution** of $Ax = b$ is a vector $x_0 \in \mathbb{R}^n$ such that -> -> $$ \|b - Ax_0\|_2 \leq \|b - Ax\|_2 \text{ for all } x \in \mathbb{R}^n. $$ - -So a least-squares solution to the equation $Ax = b$ is trying to find a vector $x_0 \in \mathbb{R}^n$ which realizes the smallest distance between the vector $b$ and the column space -$$ \text{Col}(A) = \{Ax \mid x \in \mathbb{R}^n\} $$ -of $A$. We know this to be the projection of the vector $b$ onto the column space. - -![projection_of_vector_onto_plane.png](./figures/projection_of_vector_onto_plane.png) - -> **Theorem**: The set of least-squares solutions of $Ax = b$ coincides with solutions of the **normal equations** $A^TAx = A^Tb$. Moreover, the normal equations always have a solution. - -Let us first see why we get a line of best fit. - -> **Example**. Let us show why this describes a line of best fit when we are working with one feature and one target. Suppose that we observe four data points -> $$ X = \begin{bmatrix} 1 \\ 2 \\ 3 \\ 4 \end{bmatrix} \text{ and } y = \begin{bmatrix} 1 \\ 2\\ 2 \\ 4 \end{bmatrix}. $$ -> We want to fit a line $y = \beta_0 + \beta_1x$ to these data points. We will have our augmented matrix be -> $$ \tilde{X} = \begin{bmatrix} 1 & 1 \\ 1 & 2 \\ 1 & 3 \\ 1 & 4 \end{bmatrix}, $$ -> and our parameter be -> $$ \tilde{\beta} = \begin{bmatrix} \beta_0 \\ \beta_1 \end{bmatrix}. $$ -> We have that -> $$ \tilde{X}^T\tilde{X} = \begin{bmatrix} 4 & 10 \\ 10 & 30 \end{bmatrix} \text{ and } \tilde{X}^Ty = \begin{bmatrix} 9 \\ 27 \end{bmatrix}. $$ -> The 2x2 matrix $\tilde{X}^T\tilde{X}$ is easy to invert, and so we get that -> $$ \tilde{\beta} = (\tilde{X}^T\tilde{X})^{-1}\tilde{X}^Ty = \frac{1}{10}\begin{bmatrix} 15 & -5 \\ -5 & 2 \end{bmatrix}\begin{bmatrix} 9 \\ 27 \end{bmatrix} = \begin{bmatrix} 0 \\ \frac{9}{10} \end{bmatrix}. $$ -> So our line of best fit is of them form $y = \frac{9}{10}x$. - -Although the above system was small and we could solve the system of equations explicitly, this isn't always feasible. We will generally use python in order to solve large systems. -- One can find a least-squares solution using `numpy.linalg.lstsq`. -- We can set up the normal equations and solve the system by using `numpy.linalg.solve` -Although the first approach simplifies things greatly, and is more or less what we are doing anyway, we will generally set up our problems as we would by hand, and then use `numpy.linalg.solve` to help us find a solution. However, computing $X^TX$ can cause lots of errors, so later we'll see how to get linear systems from QR decompositions and the SVD, and then apply `numpy.lingalg.solve`. - -Let's see how to use these for the above example, and see the code to generate the scatter plot and line of best fit. -Again, our system is the following. -$$ X = \begin{bmatrix} 1 \\ 2 \\ 3 \\ 4 \end{bmatrix} \text{ and } y = \begin{bmatrix} 1 \\ 2\\ 2 \\ 4 \end{bmatrix}. $$ -We will do what we did above, but use python instead. -```python -import numpy as np - -# Define the matrix X and vector y -X = np.array([[1], [2], [3], [4]]) -y = np.array([[1], [2], [2], [4]]) - -# Augment X with a column of 1's (intercept) -X_aug = np.hstack((np.ones((X.shape[0], 1)), X)) - -# Solve the normal equations -beta = np.linalg.solve(X_aug.T @ X_aug, X_aug.T @ y) -``` -And what is the result? -```python ->>> beta -array([[-1.0658141e-15], - [ 9.0000000e-01]]) -``` -This agrees with our by-hand computation: the intercept is tiny, so it is virtually zero, and we get 9/10 as our slope. Let's plot it. -```python -import matplotlib.pyplot as plt -b, m = beta #beta[0] will be the intercept and beta[1] will be the slope -_ = plt.plot(X, y, 'o', label='Original data', markersize=10) -_ = plt.plot(X, m*X + b, 'r', label='Line of best fit') -_ = plt.legend() -plt.show() +```text +images/ # saved images/visualizations +notebooks/ # jupyter notebooks containing theory, code, visuals +bibliography.md # references for essentially everything +requirements.txt # python requirements +LICENSE # project license ``` -![line_of_best_fit_easy_example.png](./figures/line_of_best_fit_easy_example.png) - -What about `numpy.linalg.lstsq`? Is it any different? -```python -import numpy as np - -# Define the matrix X and vector y -X = np.array([[1], [2], [3], [4]]) -y = np.array([[1], [2], [2], [4]]) - -# Augment X with a column of 1's (intercept) -X_aug = np.hstack((np.ones((X.shape[0], 1)), X)) - -# Solve the least squares equation with matrix X_aug and target y -beta = np.linalg.lstsq(X_aug,y)[0] -``` -We then get -```python ->>> beta -array([[6.16291085e-16], - [9.00000000e-01]]) - -``` -So it is a little different -- and, in fact, closer to our exact answer (the intercept is zero). This makes sense -- `numpy.linalg.lstsq` won't directly compute $X^TX$, which, again, can cause quite a few issues. +Each notebook is self-contained and moves from theory to implementation to visualization. --- -Now going to our initial example. +## Topics -> **Example**: Let us work with the example from above. We augment the matrix with a column of 1's to include an intercept term: -> $$ \tilde{X} = \begin{bmatrix} 1 & 1600 & 3 \\ 1 & 2100 & 4 \\ 1 & 1550 & 2 \end{bmatrix}. $$ -> Let us solve the normal equations -> $$ \tilde{X}^T\tilde{X}\tilde{\beta} = \tilde{X}^Ty. $$ -> We have -> $$ \tilde{X}^T\tilde{X} = \begin{bmatrix} 3 & 5250 & 9 \\ 5250 & 9372500 & 16300 \\ 9 & 16300 & 29\end{bmatrix} \text{ and } \tilde{X}^Ty = \begin{bmatrix} 1625 \\ 2901500 \\ 5050 \end{bmatrix} $$ -> Solving this system of equations yields the parameter vector $\tilde{\beta}$. In this case, we have -> $$ \tilde{\beta} = \begin{bmatrix} \frac{200}{9} \\ \frac{5}{18} \\ \frac{100}{9} \end{bmatrix}. $$ -> When we apply $\tilde{X}$ to $\tilde{\beta}$, we get -> $$ \tilde{X}\tilde{\beta} = \begin{bmatrix} 500 \\ 650 \\ 475 \end{bmatrix}, $$ -> which is our target on the nose. This means that we can expect, based on our data, that the cost of a house will be -> $$ \frac{200}{9} + \frac{5}{18}(\text{square footage}) + \frac{100}{9}(\text{\# of bedrooms})$$ +### 1. Least Squares Regression -In the above, we actually had a consistent system to begin with, so our least-squares solution gave our prediction honestly. What happens if we have an inconsistent system? +* Overdetermined systems +* Normal equations +* Geometric interpretation (projection onto column space) +* Implementation using NumPy -> **Example**: Let us add two more observations, say our data is now the following. -> |House | Square ft | Bedrooms | Price (in $1000s) | -> | --- | --- | --- | --- | -> | 0 | 1600 | 3 | 500 | -> | 1 | 2100 | 4 | 650 | -> | 2 | 1550 | 2 | 475 | -> | 3 | 1600 | 3 | 490 | -> | 4 | 2000 | 4 | 620 | -> -> So setting up our system, we want a least-square solution to the matrix equation -> $$ \begin{bmatrix} 1 & 1600 & 3 \\ 1 & 2100 & 4 \\ 1 & 1550 & 2 \\ 1 & 1600 & 3 \\ 1 & 2000 & 4 \end{bmatrix}\tilde{\beta} = \begin{bmatrix} 500 \\ 650 \\ 475 \\ 490 \\ 620 \end{bmatrix}. $$ -> Note that the system is inconsistent (the 1st and 4th rows agree in $\tilde{X}$, but they have different costs). Writing the normal equations we have -> $$ \tilde{X}^T\tilde{X} = \begin{bmatrix} 5 & 8850 & 16 \\ 8850 & 15932500 & 29100 \\ 16 & 29100 & 54 \end{bmatrix} \text{ and } \tilde{X}y = \begin{bmatrix} 2735 \\ 4 925 250 \\ 9000 \end{bmatrix}. $$ -> Solving this linear system yields -> $$ \tilde{\beta} = \begin{bmatrix} 0 \\ \frac{3}{10} \\ 5 \end{bmatrix}. $$ -> This is a vastly different answer! Applying $\tilde{X}$ to it yields -> $$ \tilde{X}\tilde{\beta} = \begin{bmatrix} 495 \\ 650 \\ 475 \\ 495 \\ 620 \end{bmatrix}. $$ -> Note that the error here is -> $$ y - \tilde{X}\tilde{\beta} = \begin{bmatrix} 5 \\ 0 \\ 0 \\ -5 \\ 0 \end{bmatrix}, $$ -> which has squared $L^2$ norm -> $$ \|y - \tilde{X}\tilde{\beta}\|_2^2 = 25 + 25 = 50. $$ -> So this says that, given our data, we can roughly estimate the cost of a house, within 50k or so, to be -> $$ \approx \frac{3}{10}(\text{square footage}) + 5(\text{\# of bedrooms}). $$ -In practice, our data sets can be gigantic, and so there is absolutely no hope of doing computations by hand. It is nice to know that theoretically we can do things like this though. +### 2. QR Decomposition & SVD -> **Theorem**: Let $A$ be an $m \times n$ matrix and $b \in \mathbb{R}^n$. The following are equivalent. -> -> 1. The equation $Ax = b$ has a unique least-squares solution for each $b \in \mathbb{R}^n$. -> 2. The columns of $A$ are linearly independent. -> 3. The matrix $A^TA$ is invertible. +* Numerical stability vs. normal equations +* Orthogonal bases and conditioning +* Solving linear systems without forming $X^T X$ -In this case, the unique solution to the normal equations $A^TAx = A^Tb$ is +### 3. Some Notes & What Can Go Wrong -$$ x_0 = (A^TA)^{-1}A^Tb. $$ +* Other vector norms ($L^1, L^\infty$), as well as matrix norms (Frobenius, Operator) +* What can go wrong? -Computing $\tilde{X}^T\tilde{X}$ or taking inverses are very computationally intensive tasks, and it is best to avoid doing these. Moreover, as we'll see in an example later, if we do a numerical calculation we can get close to zero and then divide where we shouldn't be, blowing up our final result. One way to get around this is to use QR decompositions of matrices. +### 4. Principal Component Analysis (PCA) -Now let's use python to visualize the above data and then solve for the least-squares solution. We'll use `pandas` in order to think about this data. We note that `pandas` incorporates `matplotlib` under the hood already, so there are some simplifications that can be made. -```python -import numpy as np -import pandas as pd -import matplotlib.pyplot as plt +* Dimensionality reduction via spectral methods +* Relationship between covariance matrices and eigenvectors +* Handling correlated features -# First let us make a dictionary incorporating our data. -# Each entry corresponds to a column (feature of our data) -data = { - 'Square ft': [1600, 2100, 1550, 1600, 2000], - 'Bedrooms': [3, 4, 2, 3, 4], - 'Price': [500, 650, 475, 490, 620] -} +### 5. Project: Spectral Image Denoising via Truncated SVD -# Create a pandas DataFrame -df = pd.DataFrame(data) -``` -Let's see how python formats this `DataFrame`. It will turn it into essentially the table we had at the beginning. -```python ->>> df - Square ft Bedrooms Price -0 1600 3 500 -1 2100 4 650 -2 1550 2 475 -3 1600 3 490 -4 2000 4 620 -``` -So what can we do with DataFrames? First let's use `pandas.DataFrame.describe` to see some basic statistics about our data. -```python ->>> df.describe() - Square ft Bedrooms Price -count 5.000000 5.00000 5.000000 -mean 1770.000000 3.20000 547.000000 -std 258.843582 0.83666 81.516869 -min 1550.000000 2.00000 475.000000 -25% 1600.000000 3.00000 490.000000 -50% 1600.000000 3.00000 500.000000 -75% 2000.000000 4.00000 620.000000 -max 2100.000000 4.00000 650.000000 -``` -This gives use the mean, the standard deviation, the min, the max, as well as some other things. We get an immediate sense of scale from our data. We can also examine the pairwise correlation of all the columns by using `pandas.DataFrame.corr`. -```python ->>> df[["Square ft", "Bedrooms", "Price"]].corr() - Square ft Bedrooms Price -Square ft 1.000000 0.900426 0.998810 -Bedrooms 0.900426 1.000000 0.909066 -Price 0.998810 0.909066 1.000000 -``` -It is clear that each of the three are correlated. This makes sense, as the number of bedrooms should be increasing with the square feet. Same with the price. We'll discuss in the next section when we look at Principal Component Analysis. - -We can also graph our data; for example, we could create some scatter plots, one for `Square ft` vs `Price` and on for `Bedrooms` vs `Price`. We can also do a grouped bar chart. Let's start with the scatter plots. - -```python -# Scatter plot for Price vs Square ft -df.plot( - kind="scatter", - x="Square ft", - y="Price", - title="House Price vs Square footage" -) -plt.show() -``` -```python -# Scatter plot for Price vs Bedrooms -df.plot( - kind="scatter", - x="Bedrooms", - y="Price", - title="House Price vs Bedrooms" -) -plt.show() -``` - -![house_price_vs_square_ft.png](./figures/house_price_vs_square_ft.png) - -![house_price_vs_bedrooms.png](./figures/house_price_vs_bedrooms.png) - -We can even do square footage vs bedrooms. -```python -# Scatter plot for Bedrooms vs Square ft -df.plot( - kind="scatter", - x="Square ft", - y="Bedrooms", - title="Bedrooms vs Square footage" -) -plt.show() -``` - -![bedrooms_vs_square_footage.png](./figures/bedrooms_vs_square_footage.png) - -Of course, these figures are somewhat meaningless due to how unpopulated our data is. - -Now let's get our matrices and linear systems set up with `pandas.DataFrame.to_numpy`. - -```python -# Create our matrix X and our target y -X = df[["Square ft", "Bedrooms"]].to_numpy() -y = df[["Price"]].to_numpy() - -# Augment X with a column of 1's (intercept) -X_aug = np.hstack((np.ones((X.shape[0], 1)), X)) - -# Solve the least-squares problem -beta = np.linalg.lstsq(X_aug,y)[0] -``` -This yields -```python ->>> beta -array([[4.0098513e-13], - [3.0000000e-01], - [5.0000000e+00]]) - -``` -As the first parameter is basically 0, we are left with the second being 3/10 and the third being 5, just like our exact solution. Next, we will look at matrix decompositions and how they can help us find least-squares solutions. - -## QR Decompositions - -QR decompositions are a powerful tool in linear algebra and data science for several reasons. They provide a way to decompose a matrix into an orthogonal matrix $Q$ aand an upper triangular matrix $R$, which can simplify many computations and analyses. - -> **Theorem**: Let $A$ is an $m \times n$ matrix with linearly independent columns ($m \geq n$ in this case), then $A$ can be decomposed as $A = QR$ where $Q$ is an $m \times n$ matrix whose columns form an orthonormal basis for Col($A$) and $R$ is an $n \times n$ upper-triangular invertible matrix with positive entries on the diagonal. - -In the literature, sometimes the QR decomposition is phrased as follows: any $m \times n$ matrix $A$ can also be written as $A = QR$ where $Q$ is an $m \times m$ orthogonal matrix ($Q^T = Q^{-1}$), and $R$ is an $m \times n$ upper-triangular matrix. One follows from the other by playing around with some matrix equations. Indeed, suppose that $A = Q_1R_1$ is a decomposition as above (that is, $Q_1$ is $m \times n$ and $R_1$ is $n \times n$). Use can use the Gram-Schmidt procedure to extend the columns of $Q_1$ to an orthonormal basis for all of $\mathbb{R}^m$, and put the remaining vectors in a $(m - n) \times n$ matrix $Q_2$. Then - -$$ A = Q_1R_1 = \begin{bmatrix} Q_1 & Q_2 \end{bmatrix}\begin{bmatrix} R_1 \\ 0 \end{bmatrix}. $$ - -The left matrix is an $m \times m$ orthogonal matrix and the right matrix is $m \times n$ upper triangular. Moreover, the decomposition provides orthonormal bases for both the column space of $A$ and the perp of the column space of $A$; $Q_1$ will consist of an orthonormal basis for the column space of $A$ and $Q_2$ will consist of an orthonormal basis for the perp of the column space of $A$. - -However, we will often want to use the decomposition when $Q$ is $m \times n$, $R$ is $n \times n$, and the columns of $Q$ form an orthonormal basis for the column space of $A$. For example, the python function `numpy.linalg.qr` give QR decompositions this way (again, assuming that the columns of $A$ are linearly independent, so $m \geq n$). - -> **Key take-away**. The QR decomposition provides an orthonormal basis for the column space of $A$. If $A$ has rank $k$, then the first $k$ columns of $Q$ will form a basis for the column space of $A$. - -For small matrices, one can find $Q$ and $R$ by hand, assuming that $A = [ a_1\ \cdots\ a_n ]$ has full column rank. Let $e_1,\dots,e_n$ be the unnormalized vectors we get when we apply Gram-Schmidt to $c_1,\dots,c_n$, and let $u_1,\dots,u_n$ be their normalizations. Let -$$ r_j = \begin{bmatrix} \langle e_1,c_j \rangle \\ \vdots \\ \langle e_n, c_j \rangle \end{bmatrix}, $$ -and note that $\langle e_i,c_j \rangle = 0$ whenever $i > j$. Thus -$$ Q = \begin{bmatrix} u_1 & \cdots & u_n \end{bmatrix} \text{ and } R = \begin{bmatrix} r_1 & \cdots & r_n \end{bmatrix} $$ -give rise to a $A = QR$, where the columns of $Q$ form an orthonormal basis for $\text{Col}(A)$ and $R$ is upper-triangular. We can also compute $R$ directly from $Q$ and $Q$. Indeed, note that $Q^TQ = I$, so -$$ Q^TA = Q^T(QR) = IR = R. $$ - -> **Example**. Find a QR decomposition for the matrix -> $$ A = \begin{bmatrix} 1 & 1 & 1 \\ 0 & 1 & 1 \\ 0 & 0 & 1 \\ 0 & 0 & 0 \end{bmatrix}. $$ -> Note that one trivially see (or by applying the Gram-Schmidt procedure) that -> $$ \begin{bmatrix} 1 \\ 0 \\ 0 \\ 0 \end{bmatrix}, \begin{bmatrix} 0 \\ 1 \\ 0 \\ 0 \end{bmatrix}, \begin{bmatrix} 0 \\ 0 \\ 1 \\ 0 \end{bmatrix} $$ -> forms an orthonormal basis for the column space of $A$. So with -> $$ Q = \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \\ 0 & 0 & 0 \end{bmatrix} \text{ and }R = \begin{bmatrix} 1 & 1 & 1\\ 0 & 1 & 1 \\ 0 & 0 & 1 \end{bmatrix}, $$ -> we have $A = QR$. - -Let's do a more involved example. -> **Example**. Consider the matrix -> $$ A = \begin{bmatrix} 1 & 0 & 0 \\ 1 & 1 & 0 \\ 1 & 1 & 1 \\ 1 & 1 & 1 \end{bmatrix}. $$ -> One can apply the Gram-Schmidt procedure to the columns of $A$ to find that -> $$ \begin{bmatrix} 1 \\ 1 \\ 1 \\ 1 \end{bmatrix}, \begin{bmatrix} -3 \\ 1 \\ 1 \\ 1 \end{bmatrix}, \begin{bmatrix} 0 \\ -\frac{2}{3} \\ \frac{1}{3} \\ \frac{1}{3}\end{bmatrix} $$ -> forms an orthogonal basis for the column space of $A$. Normalizing, we get that -> $$ Q = \begin{bmatrix} \frac{1}{2} & -\frac{3}{\sqrt{12}} & 0 \\ \frac{1}{2} & \frac{1}{\sqrt{12}} & -\frac{2}{\sqrt{6}} \\ \frac{1}{2} & \frac{1}{\sqrt{12}} & \frac{1}{\sqrt{6}} \\ \frac{1}{2} & \frac{1}{\sqrt{12}} & \frac{1}{\sqrt{6}} \end{bmatrix} $$ -> is an appropriate $Q$. Thus -> $$ \begin{split} R = Q^TA &= \begin{bmatrix} \frac{1}{2} & \frac{1}{2} & \frac{1}{2} & \frac{1}{2} \\ -\frac{3}{\sqrt{12}} & \frac{1}{\sqrt{12}} & \frac{1}{\sqrt{12}} & \frac{1}{\sqrt{12}} \\ 0 & -\frac{2}{\sqrt{6}} & \frac{1}{\sqrt{6}} & \frac{1}{\sqrt{6}} \end{bmatrix}\begin{bmatrix} 1 & 0 & 0 \\ 1 & 1 & 0 \\ 1 & 1 & 1 \\ 1 & 1 & 1 \end{bmatrix} \\ &= \begin{bmatrix} 2 & \frac{3}{2} & 1 \\ 0 & \frac{3}{\sqrt{12}} & \frac{2}{\sqrt{12}} \\ 0 & 0 & \frac{2}{\sqrt{6}} \end{bmatrix}. \end{split} $$ -> So all together, -> $$A = \begin{bmatrix} \frac{1}{2} & -\frac{3}{\sqrt{12}} & 0 \\ \frac{1}{2} & \frac{1}{\sqrt{12}} & -\frac{2}{\sqrt{6}} \\ \frac{1}{2} & \frac{1}{\sqrt{12}} & \frac{1}{\sqrt{6}} \\ \frac{1}{2} & \frac{1}{\sqrt{12}} & \frac{1}{\sqrt{6}} \end{bmatrix}\begin{bmatrix} 2 & \frac{3}{2} & 1 \\ 0 & \frac{3}{\sqrt{12}} & \frac{2}{\sqrt{12}} \\ 0 & 0 & \frac{2}{\sqrt{6}} \end{bmatrix}. $$ - -To do this numerically, we can use `numpy.linalg.qr`. - -```python -# Define our matrices -A = np.array([[1,1,1],[0,1,1],[0,0,1],[0,0,0]]) -B = np.array([[1,0,0],[1,1,0],[1,1,1],[1,1,1]]) - -# Take QR decompositions -QA, RA = np.linalg.qr(A) -QB, RB = np.linalg.qr(B) -``` -Our resulting matrices are: -```python ->>> QA -array([[ 1., 0., 0.], - [-0., 1., 0.], - [-0., -0., 1.], - [-0., -0., -0.]]) ->>> RA -array([[1., 1., 1.], - [0., 1., 1.], - [0., 0., 1.]]) ->>> QB -array([[-0.5 , 0.8660254 , 0. ], - [-0.5 , -0.28867513, 0.81649658], - [-0.5 , -0.28867513, -0.40824829], - [-0.5 , -0.28867513, -0.40824829]]) ->>> RB -array([[-2. , -1.5 , -1. ], - [ 0. , -0.8660254 , -0.57735027], - [ 0. , 0. , -0.81649658]]) - -``` - -### How to use QR decompositions - -One of the primary uses of QR decompositions is to solve least squares problems, as introduced above. Assuming that $A$ has full column rank, we can write $A = QR$ as a QR decomposition, and then we can find a least-squares solution to $Ax = b$ by solving the upper-triangular system. - -> **Theorem**. Let $A$ be an $m \times n$ matrix with full column rank, and let $A = QR$ be a QR factorization of $A$. Then, for each $b \in \mathbb{R}^m$, the equation $Ax = b$ has a unique least-squares solution, arising from the system -> $$ Rx = Q^Tb. $$ - -Normal equations can be *ill-conditioned*, i.e., small errors in calculating $A^TA$ give large errors when trying to solve the least-squares problem. When $A$ has full column rank, a QR factorization will allow one to compute a solution to the least-squares problem more reliably. - -> **Example**. Let -> $$ A = \begin{bmatrix} 1 & 0 & 0 \\ 1 & 1 & 0 \\ 1 & 1 & 1 \\ 1 & 1 & 1 \end{bmatrix} \text{ and } b = \begin{bmatrix} 1 \\ 1 \\ 1 \\ 0 \end{bmatrix}. $$ -> We can find the least-squares solution $Ax = b$ by using the QR decomposition. Let us use the QR decomposition from above, and solve the system -> $$ Rx = Q^Tb. $$ -> As -> $$ \begin{bmatrix} \frac{1}{2} & -\frac{3}{\sqrt{12}} & 0 \\ \frac{1}{2} & \frac{1}{\sqrt{12}} & -\frac{2}{\sqrt{6}} \\ \frac{1}{2} & \frac{1}{\sqrt{12}} & \frac{1}{\sqrt{6}} \\ \frac{1}{2} & \frac{1}{\sqrt{12}} & \frac{1}{\sqrt{6}} \end{bmatrix}^T\begin{bmatrix} 1 \\ 1 \\ 1 \\ 0 \end{bmatrix} = \begin{bmatrix} \frac{3}{2} \\ -\frac{1}{2\sqrt{3}} \\ -\frac{1}{\sqrt{6}}, \end{bmatrix} $$ -> we are looking at the system -> $$ \begin{bmatrix} 2 & \frac{3}{2} & 1 \\ 0 & \frac{3}{\sqrt{12}} & \frac{2}{\sqrt{12}} \\ 0 & 0 & \frac{2}{\sqrt{6}} \end{bmatrix}x =\begin{bmatrix} \frac{3}{2} \\ -\frac{1}{2\sqrt{3}} \\ -\frac{1}{\sqrt{6}} \end{bmatrix}. $$ -> Solving this system yields that -> $$ x_0 = \begin{bmatrix} 1 \\ 0 \\ -\frac{1}{2} \end{bmatrix} $$ -> is a least-squares solution to $Ax = b$. - -Let us set this system up in python and use `numpy.linalg.solve`. - -```python -import numpy as np - -# Define matrix and vector -A = np.array([[1,0,0],[1,1,0],[1,1,1],[1,1,1]]) -b = np.array([[1],[1],[1],[0]]) - -# Take the QR decomposition of A -Q, R = np.linalg.qr(A) - -# Solve the linear system Rx = Q.T b -beta = np.linalg.solve(R,Q.T @ b) -``` -This yields -```python ->>> beta -array([[ 1.00000000e+00], - [ 6.40987562e-17], - [-5.00000000e-01]]) - -``` -which agrees with our exact least-squares solution. -Note that `numpy.linalg.lstsq` still gives a **ever so slightly** different result. -```python ->>> np.linalg.lstsq(A,b)[0] -array([[ 1.00000000e+00], - [ 2.22044605e-16], - [-5.00000000e-01]]) -``` +* Low-rank approximation of images +* Noise removal using singular value truncation +* RGB images (channel-wise SVD) +* Quantitative evaluation (MSE, PSNR) --- -Let's go back to the house example. While we're at it, let's get used to using pandas to make a dataframe. -```python -import numpy as np -import pandas as pd +## Example: Image Denoising via SVD -# First let us make a dictionary incorporating our data. -# Each entry corresponds to a column (feature of our data) -data = { - 'Square ft': [1600, 2100, 1550, 1600, 2000], - 'Bedrooms': [3, 4, 2, 3, 4], - 'Price': [500, 650, 475, 490, 620] -} +Given an image matrix $A$ (for simplicity, let's go with greyscale), we compute its singular value decomposition: -# Create a pandas DataFrame -df = pd.DataFrame(data) +$$ +A = U \Sigma V^T +$$ -# Create our matrix X and our target y -X = df[["Square ft", "Bedrooms"]].to_numpy() -y = df[["Price"]].to_numpy() +We approximate the image using only the top $k$ singular values: -# Augment X with a column of 1's (intercept) -X_aug = np.hstack((np.ones((X.shape[0], 1)), X)) +$$ +A_k = U_k \Sigma_k V_k^T +$$ -# Perform QR decomposition -Q, R = np.linalg.qr(X_aug) +This produces: -# Solve the upper triangular system Rx = Q^Ty -beta = np.linalg.solve(R, Q.T @ y) -``` -Let's look at the output. -```python ->>> Q -array([[-0.4472136 , 0.32838365, 0.40496317], - [-0.4472136 , -0.63745061, -0.22042299], - [-0.4472136 , 0.42496708, -0.7689174 ], - [-0.4472136 , 0.32838365, 0.40496317], - [-0.4472136 , -0.44428376, 0.17941406]]) ->>> R -array([[-2.23606798e+00, -3.95784032e+03, -7.15541753e+00], - [ 0.00000000e+00, -5.17687164e+02, -1.50670145e+00], - [ 0.00000000e+00, 0.00000000e+00, 7.27908474e-01]]) ->>> beta -array([-3.05053797e-13, 3.00000000e-01, 5.00000000e+00]) -``` -As we can see, the least-squares solution agrees with what we got by hand and by other python methods (if we agree that the tiny first component is essentially zero). +* **Noise reduction** +* **Compression** +* A direct application of the **Eckart–Young–Mirsky theorem** + +For color images, this is applied independently to each channel (R, G, B). --- -The QR decomposition of a matrix is also useful for computing orthogonal projections. -> **Theorem**. Let $A$ be an $m \times n$ matrix with full column rank. If $A = QR$ is a QR decomposition, then $QQ^T$ is the projection onto the column space of $A$, i.e., $QQ^Tb = \text{Proj}_{\text{Col}(A)}b$ for all $b \in \mathbb{R}^m$. +## Dependencies -Let's see what our range projections are for the matrices above. Note that the first example above will have the orthogonal projection just being -$$ \begin{bmatrix} 1 \\ & 1 \\ & & 1\\ & & & 0 \end{bmatrix}. $$ -Let's look at the other matrix. +* **Python 3** +* **NumPy** -- linear algebra +* **Pandas** -- data handling +* **Matplotlib** -- visualization +* **Pillow** -- imaging library -> **Example**. Working with the matrix -> $$ A = \begin{bmatrix} 1 & 0 & 0 \\ 1 & 1 & 0 \\ 1 & 1 & 1 \\ 1 & 1 & 1 \end{bmatrix}, $$ -> the projection onto the column space if given by -> $$ QQ^T = \begin{bmatrix} 1 \\ & 1 \\ & & \frac{1}{2} & \frac{1}{2} \\ & & \frac{1}{2} & \frac{1}{2} \end{bmatrix}. $$ -> This is a well-understood projection: it is the direct sum of the identity on $\mathbb{R}^2$ and the projection onto the line $y = x$ in $\mathbb{R}^2$. +--- -Now let's use python to implement the projection. +## Key Takeaways -```python -import numpy as np +* Data science problems can be framed as: -# Create our matrix A -A = np.array([[1,0,0],[1,1,0],[1,1,1],[1,1,1]]) + > *approximate solutions to linear systems* -# Take the QR decomposition -Q, R = np.linalg.qr(A) +* Numerical linear algebra is necessary; it determines: -# Create the range projection -P = Q @ Q.T -``` -The output gives -```python -array([[1.00000000e+00, 2.89687929e-17, 2.89687929e-17, 2.89687929e-17], - [2.89687929e-17, 1.00000000e+00, 7.07349921e-17, 7.07349921e-17], - [2.89687929e-17, 7.07349921e-17, 5.00000000e-01, 5.00000000e-01], - [2.89687929e-17, 7.07349921e-17, 5.00000000e-01, 5.00000000e-01]]) + * stability + * performance + * model reliability -``` -As we can see, the two off-diagonal blocks are all tiny, hence we treat them as zero. Note that if they were not actually zero, then this wouldn't actually be a projection. This can cause some problems. So let's fix this by introducing some tolerances. +* Spectral methods (SVD, PCA) provide: -Let's write a function to implement this, assuming that columns of A are linearly independent. + * structure + * compression + * interpretability -```python -import numpy as np +--- -def proj_onto_col_space(A): - # Take the QR decomposition - Q,R = np.linalg.qr(A) - # The projection is just Q @ Q.T - P = Q @ Q.T +## How to Run - return P -``` -We'll come back to this later. We should really be incorporating some sort of error tolerance so that things are **super super** tiny can actually just be sent to zero. +```bash +git clone +cd data-science-linear-algebraist -> **Remark**. Another way to get the projection onto the column space of an $n \times p$ matrix $A$ of full column rank is to take -> $$ P = A(A^TA)^{-1}A^T. $$ -> Indeed, let $b \in \mathbb{R}^n$ and let $x_0 \in \mathbb{R}^p$ be a solution to the normal equations -> $$ A^TAx_0 = A^Tb. $$ -> Then $x_0 = (A^TA)^{-1}A^Tb$ and so $Ax_0 = A(A^TA^{-1})A^Tb$ is the (unique!) vector in the column space of $A$ which is closest to $b$, i.e., the projection of $b$ onto the column space of $A$. -> However, taking transposes, multiplying, and inverting is not what we would like to do numerically. +pip install requirements.txt -## Singular Value Decomposition - -The SVD is a very important matrix decomposition in both data science and linear algebra. - -> **Theorem**. For any matrix $n \times p$ matrix $X$, there exist an orthogonal $n \times n$ matrix $U$, an orthogonal $p \times p$ matrix $V$, and a diagonal $n \times p$ matrix $\Sigma$ with non-negative entries such that -> $$ X = U\Sigma V^T. $$ -> - The columns of $U$ are left **left singular vectors**. -> - The columns of $V$ are the **right singular vectors**. -> - $\Sigma$ has **singular values** $\sigma_1 \geq \sigma_2 \geq \cdots \geq \sigma_r > 0$ on its diagonal, where $r$ is the rank of $X$. - -> **Remark**. The SVD is clearly a generalization of matrix diagonalization, but it also generalizes the **polar decomposition** of a matrix. Recall that every $n \times n$ matrix $A$ can be written as $A = UP$ where $U$ is orthogonal (or unitary) and $P$ is a positive matrix. This is because if -> $$ A = U_0\Sigma V^T $$ -> is the SVD for $A$, then $\Sigma$ is an $n \times n$ diagonal matrix with non-negative entries, hence any orthogonal conjugate of it is positive, and so -> $$ A = (U_0V^T)(V\Sigma V^T). $$ -> Take $U = U_0V^T$ and $P = V\Sigma V^T$. - -By hand, the algorithm for computing an SVD is as follows. -1. Both $AA^T$ and $A^TA$ are symmetric (they are positive in fact), and so they can be orthogonally diagonalized; one can form an orthogonal basis of eigenvectors. Let $v_1,\dots,v_p$ be an orthonormal basis of eigenvectors for $\mathbb{R}^p$ which correspond to eigenvectors of $A^TA$ in decreasing order. Suppose that $A^TA$ has $r$ non-zero eigenvalues. Let $V$ be the matrix whose columns contain the $v_i$'s. This gives our right singular vectors and our singular values. -2. Let $u_i = \frac{1}{\sigma_i}Av_i$ for $i = 1,\dots,r$, and extend this collection of vectors to an orthonormal basis for $\mathbb{R}^n$ if necessary. Let $U$ be the corresponding matrix. -3. Let $\Sigma$ be the $n \times p$ matrix whose diagonal entries are $\sigma_1 \geq \sigma_2 \geq \cdots \geq \sigma_r$, and then zeroes if necessary. - -> **Example**. Let us compute the SVD of -> $$ A = \begin{bmatrix} 3 & 2 & 2 \\ 2 & 3 & -2 \end{bmatrix}. $$ -> First we note that -> $$ A^TA = \begin{bmatrix} 13 & 12 & 2 \\ 12 & 13 & -2 \\ 2 & -2 & 8 \end{bmatrix}, $$ -> which has eigenvalues $25,9,0$ with corresponding eigenvectors -> $$ \begin{bmatrix} 1 \\ 1 \\ 0 \end{bmatrix}, \begin{bmatrix} 1 \\ -1 \\ 4 \end{bmatrix}, \begin{bmatrix} -2 \\ 2 \\ 1 \end{bmatrix}. $$ -> Normalizing, we get -> $$ V = \begin{bmatrix} \frac{1}{\sqrt{2}} & \frac{1}{3\sqrt{2}} & -\frac{2}{3} \\ \frac{1}{\sqrt{2}} & -\frac{1}{3\sqrt{2}} & \frac{2}{3} \\ 0 & \frac{4}{3\sqrt{2}} & \frac{1}{3} \end{bmatrix}. $$ -> Now we set $u_1 = \frac{1}{5}Av_1$ and $u_2 = \frac{1}{3}Av_2$ to get -> $$ U = \begin{bmatrix} \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} \\ \frac{1}{\sqrt{2}} & -\frac{1}{\sqrt{2}} \end{bmatrix}. $$ -> So -> $$ A = \begin{bmatrix} \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} \\ \frac{1}{\sqrt{2}} & -\frac{1}{\sqrt{2}} \end{bmatrix} \begin{bmatrix} 5 & 0 & 0 \\ 0 & 3 & 0 \end{bmatrix} \begin{bmatrix} \frac{1}{\sqrt{2}} & \frac{1}{3\sqrt{2}} & -\frac{2}{3} \\ \frac{1}{\sqrt{2}} & -\frac{1}{3\sqrt{2}} & \frac{2}{3} \\ 0 & \frac{4}{3\sqrt{2}} & \frac{1}{3} \end{bmatrix}^T $$ -> is our SVD decomposition. - -We note that in practice, we avoid the computation of $X^TX$ because if the entries of $X$ have errors, then these errors will be squared in $X^TX$. There are better computational tools to get singular values and singular vectors which are more accurate. This is what our python tools will use. - -Let's use `numpy.linalg.svd` for the above matrix. - -```python -import numpy as np - -#Define our matrix -A = np.array([[3,2,2],[2,3,-2]]) - -# Take the SVD -U, S, Vh = np.linalg.svd(A) -``` -Our SVD matrices are -```python ->>> U -array([[-0.70710678, -0.70710678], - [-0.70710678, 0.70710678]]) ->>> S -array([5., 3.]) -# Note that Vh already gives the transpose of the matrix V we get -# in our SVD. So we'll take the transpose again to get -# the appropriate rows ->>> Vh.T -array([[-7.07106781e-01, -2.35702260e-01, -6.66666667e-01], - [-7.07106781e-01, 2.35702260e-01, 6.66666667e-01], - [-6.47932334e-17, -9.42809042e-01, 3.33333333e-01]]) +jupyter notebook ``` +Open any notebook inside the `notebooks/` folder. -Because the eigenvalues of the hermitian squares of -$$ \begin{bmatrix} 1 & 1 & 1\\ 0 & 1 & 1 \\ 0 & 0 & 1 \\ 0 & 0 & 0 \end{bmatrix} \text{ and } \begin{bmatrix} 1 & 0 & 0 \\ 1 & 1 & 0 \\ 1 & 1 & 1 \\ 1 & 1 & 1 \end{bmatrix} $$ -are quite atrocious, an exact SVD decomposition is difficult to compute by hand. However, we can of course use python. +--- -```python -import numpy as np +## Purpose -# Define our matrices -A = np.array([[1,1,1],[0,1,1],[0,0,1],[0,0,0]]) -B = np.array([[1,0,0],[1,1,0],[1,1,1],[1,1,1]]) +This project is part of a broader effort to translate a background in pure mathematics into practical data science and machine learning skills. -# SVD decomposition -U_A, S_A, Vh_A = np.linalg.svd(A) -U_B, S_B, Vh_B = np.linalg.svd(B) -``` -The resulting matrices are -```python ->>> U_A -array([[ 0.73697623, 0.59100905, 0.32798528, 0. ], - [ 0.59100905, -0.32798528, -0.73697623, 0. ], - [ 0.32798528, -0.73697623, 0.59100905, 0. ], - [ 0. , 0. , 0. , 1. ]]) ->>> S_A -array([2.2469796 , 0.80193774, 0.55495813]) ->>> Vh_A.T -array([[ 0.32798528, 0.73697623, 0.59100905], - [ 0.59100905, 0.32798528, -0.73697623], - [ 0.73697623, -0.59100905, 0.32798528]]) ->>> U_B -array([[-2.41816250e-01, 7.12015746e-01, -6.59210496e-01, - 0.00000000e+00], - [-4.52990541e-01, 5.17957311e-01, 7.25616837e-01, - 6.71536163e-17], - [-6.06763739e-01, -3.35226641e-01, -1.39502200e-01, - -7.07106781e-01], - [-6.06763739e-01, -3.35226641e-01, -1.39502200e-01, - 7.07106781e-01]]) ->>> S_B -array([2.8092118 , 0.88646771, 0.56789441]) ->>> Vh_B.T -array([[-0.67931306, 0.63117897, -0.37436195], - [-0.59323331, -0.17202654, 0.7864357 ], - [-0.43198148, -0.75632002, -0.49129626]]) -``` +--- -Another final note is that the **operator norm** of a matrix $A$ agrees with its largest singular value. +## Future Work -### Pseudoinverses and using the SVD -The SVD can be used to determine a least-squares solution for a given system. Recall that if $v_1,\dots,v_p$ is an orthonormal basis for $\mathbb{R}^p$ consisting of eigenvectors of $A^TA$, arranged so that they correspond to eigenvalues $\sigma_1 \geq \sigma_2 \geq \cdots \geq \sigma_r$, then $\{Av_1,\dots,Av_r\}$ is an orthogonal basis for the column space of $A$. In essence, this means that when we have our left singular vectors $u_1,\dots,u_n$ (constructed based on our algorithm as above), we have that the first $r$ vectors form an orthonormal basis for the column space of $A$, and that the remaining $n - r$ vectors form an orthonormal basis for the perp of the column space of $A$ (which is also equal to the nullspace of $A^T$). - -> **Definition**. Let $A$ be an $n \times p$ matrix and suppose that the rank of $A$ is $r \leq \min\{n,p\}$. Suppose that $A = U\Sigma V^T$ is the SVD, where the singular values are decreasing. Partition -> $$ U = \begin{bmatrix} U_r & U_{n-r} \end{bmatrix} \text{ and } V = \begin{bmatrix} V_r & V_{p-r} \end{bmatrix} $$ -> into submatrices, where $U_r$ and $V_r$ are the matrices whose columns are the first $r$ columns of $U$ and $V$ respectively. So $U_r$ is $n \times r$ and $V_r$ is $p \times r$. Let $D$ be the diagonal $r \times r$ matrices whose diagonal entries are $\sigma_1,\dots, \sigma_r$, so that ->$$ \Sigma = \begin{bmatrix} D & 0 \\ 0 & 0 \end{bmatrix} $$ -> and note that -> $$ A = U_rDV_r^T. $$ -> We call this the reduced singular value decomposition of $A$. Note that $D$ is invertible, and its inverse is simply -> $$ D = \begin{bmatrix} \sigma_1^{-1} \\ & \sigma_2^{-1} \\ & & \ddots \\ & & & \sigma_r^{-1} \end{bmatrix}. $$ -> The **pseudoinverse** (or **Moore-Penrose inverse**) of $A$ is the matrix -> $$ A^+ = V_rD^{-1}U_r^T. $$ - -We note that the pseudoinverse $A^+$ is a $p \times n$ matrix. - -With the pseudoinverse, we can actually find least-squares solutions quite easily. Indeed, if we are looking for the least-squares solution to the system $Ax = b$, define -$$ x_0 = A^+b. $$ -Then -$$ \begin{split} Ax_0 &= (U_rDV_r^T)(V_rD^{-1}U_r^Tb) \\ &= U_rDD^{-1}U_r^Tb \\ &= U_rU_r^Tb \end{split} $$ -As mentioned before, the columns of $U_r$ form an orthonormal basis for the column space of $A$ and so $U_rU_r^T$ is the orthogonal projection onto the range of $A$. That is, $Ax_0$ is precisely the projection of $b$ onto the column space of $A$, meaning that this yields a least-squares solution. This gives the following. - -> **Theorem**. Let $A$ be an $n \times p$ matrix and $b \in \mathbb{R}^n$. Then -> $$ x_0 = A^+b$$ -> is a least-squares solution to $Ax = b$. - -Taking pseudoinverses is quite involved. We'll do one example by hand, and then use python -- and we'll see something go wrong! There is a function `numpy.linalg.pinv` in numpy that will take a pseudoinverse. We can also just use `numpy.linalg.svd` and do the process above. - -> **Example**. We have the following SVD $A = U\Sigma V^T$. -> $$ \begin{bmatrix} 1 & 1 & 2\\ 0 & 1 & 1 \\ 1 & 0 & 1 \\ 0 & 0 & 0 \end{bmatrix} = \begin{bmatrix} \sqrt{\frac{2}{3}} & 0 & 0 & -\frac{1}{\sqrt{3}} \\ \frac{1}{\sqrt{6}} & \frac{1}{\sqrt{2}} & 0 & \frac{1}{\sqrt{3}} \\ \frac{1}{\sqrt{6}} & -\frac{1}{\sqrt{2}} & 0 & \frac{1}{\sqrt{3}} \\ 0 & 0 & 1 & 0 \end{bmatrix} \begin{bmatrix} 3 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 0 \\ 0 & 0 & 0 \end{bmatrix}\begin{bmatrix} \frac{1}{\sqrt{6}} & -\frac{1}{\sqrt{2}} & -\frac{1}{\sqrt{3}} \\ \frac{1}{\sqrt{6}} & \frac{1}{\sqrt{2}} & -\frac{1}{\sqrt{3}} \\ \sqrt{\frac{2}{3}} & 0 & \frac{1}{\sqrt{3}} \end{bmatrix}^T. $$ -> Can we find a least-squares solution to $Ax = b$, where -> $$ b = \begin{bmatrix} 1 \\ 1 \\ 1 \\ 1 \end{bmatrix}? $$ -> The pseudoinverse of $A$ is -> $$ \begin{split} A^+ &= \begin{bmatrix} \frac{1}{\sqrt{6}} & -\frac{1}{\sqrt{2}} \\ \frac{1}{\sqrt{6}} & \frac{1}{\sqrt{2}} \\ \sqrt{\frac{2}{3}} & 0 \end{bmatrix} \begin{bmatrix} 3 \\ & 1 \end{bmatrix} \begin{bmatrix} \sqrt{\frac{2}{3}} & 0 \\ \frac{1}{\sqrt{6}} & \frac{1}{\sqrt{2}} \\ \frac{1}{\sqrt{6}} & -\frac{1}{\sqrt{2}} \\ 0 & 0 \end{bmatrix}^T \\ &= \begin{bmatrix} \frac{1}{9} & -\frac{4}{9} & \frac{5}{9} & 0 \\ \frac{1}{9} & \frac{5}{9} & -\frac{4}{9} & 0 \\ \frac{2}{9} & \frac{1}{9} & \frac{1}{9} & 0\end{bmatrix}, \end{split} $$ -> and so a least-squares solution is given by -> $$ \begin{split} x_0 &= A^+b \\ &= \begin{bmatrix} \frac{1}{9} & -\frac{4}{9} & \frac{5}{9} & 0 \\ \frac{1}{9} & \frac{5}{9} & -\frac{4}{9} & 0 \\ \frac{2}{9} & \frac{1}{9} & \frac{1}{9} & 0\end{bmatrix}\begin{bmatrix} 1 \\ 1 \\ 1 \\ 1 \end{bmatrix} \\ &= \begin{bmatrix} \frac{2}{9} \\ \frac{2}{9} \\ \frac{4}{9} \end{bmatrix}. \end{split} $$ - -Now let's do this with python, and see an example of how things can go wrong. We'll try to take the pseudoinverse manually first. - -```python -import numpy as np - -# Create our matrix A and our target b -A = np.array([[1,1,2],[0,1,1],[1,0,1],[0,0,0]]) -b = np.array([[1],[1],[1],[1]]) - -# Take the SVD decomposition -U, S, Vh = np.linalg.svd(A) - -# Prepare the pseudoinverse -# Recall that we invert the non-zero diagonal entries of the diagonal matrix. -# So we first build S_inv to be the appropriate size -S_inv = np.zeros((Vh.shape[0], U.shape[0])) -# We then fill in the appropriate values on the diagonal -S_inv[:len(S), :len(S)] = np.diag(1/S) - -# Build the pseudoinverse -A_pinv = Vh.T @ S_inv @ U.T - -# Compute the least-squares solution -beta = A_pinv @ b -``` -What is the result? -```python ->>> beta -array([[ 2.74080345e+15], - [ 2.74080345e+15], - [-2.74080345e+15]]) - -``` -This is **WAY** off the mark. So what happened? Well, when we look at our singular values, we have -```python ->>> S -array([3.00000000e+00, 1.00000000e+00, 1.21618839e-16]) -``` -As we got this matrix numerically, the last entry is actually non-zero, but tiny. This isn't exactly what's going on since we know that the rank of A is 2. So when we invert the singular values and throw them on the diagonal, have `1/1.21618839e-16` which is a very large value. This value then messes up the rest of the computation. So how do we fix this? One can set tolerances in numpy, but we'll get to that later. Let's just note that `numpy.linalg.pinv` will already incorporate this. Let's see what we get. - -```python -import numpy as np - -# Create our matrix A and our target b -A = np.array([[1,1,2],[0,1,1],[1,0,1],[0,0,0]]) -b = np.array([[1],[1],[1],[1]]) - -# Build the pseudoinverse -A_pinv = np.linalg.pinv(A) - -# Compute the least-squares solution -beta = A_pinv @ b -``` -```python ->>> A_pinv -array([[ 0.11111111, -0.44444444, 0.55555556, 0. ], - [ 0.11111111, 0.55555556, -0.44444444, 0. ], - [ 0.22222222, 0.11111111, 0.11111111, 0. ]]) ->>> beta -array([[0.22222222], - [0.22222222], - [0.44444444]]) -``` - -### The Condition Number -Numerical calculations involving matrix equations are quite reliable if we use the SVD. This is because the orthogonal matrices $U$ and $V$ preserve lengths and angles, leaving the stability of the problem to be governed by the singular values of the matrix $X$. Recall that if $X = U\Sigma V^T$, then solving the least-squares problem involves dividing by the non-zero singular values $\sigma_i$ of $X$. If these values are very small, their inverses become very large, and this will amplify any numerical errors. - -> **Definition**. Let $X$ be an $n \times p$ matrix and let $\sigma_1 \geq \cdots \geq \sigma_r$ be the non-zero singular values of $X$. The **condition number** of $X$ is the quotient -> $$ \kappa(X) = \frac{\sigma_1}{\sigma_r} $$ -> of the largest and smallest non-zero singular values. - -A condition number close to 1 indicates a well-conditioned problem, while a large condition number indicates that small perturbations in data may lead to large changes in computation. Geometrically, $\kappa(X)$ measures how much $X$ distorts space. - -> **Example**. Consider the matrices -> $$ A = \begin{bmatrix} 1 \\ & 1 \end{bmatrix} \text{ and } B = \begin{bmatrix} 1 \\ & \frac{1}{10^6} \end{bmatrix}. $$ -> The condition numbers are -> $$ \kappa(A) = 1 \text{ and } \kappa(B) = 10^6. $$ -> Inverting $X_2$ includes dividing by $\frac{1}{10^6}$, which will amplify errors by $10^6$. - -Let's look our main example in python by using `numpy.linalg.cond`. - -```python -import numpy as np -import pandas as pd - -# First let us make a dictionary incorporating our data. -# Each entry corresponds to a column (feature of our data) -data = { - 'Square ft': [1600, 2100, 1550, 1600, 2000], - 'Bedrooms': [3, 4, 2, 3, 4], - 'Price': [500, 650, 475, 490, 620] -} - -# Create a pandas DataFrame -df = pd.DataFrame(data) - -# Create out matrix X -X = df[['Square ft', 'Bedrooms']].to_numpy() - -# Check the condition number -cond_X = np.linalg.cond(X) -``` -Let's see what we got. -```python ->>> cond_X -np.float64(4329.082589067693) -``` -so this is quite a high condition number! This should be unsurprising, as clearly the number of bedrooms is correlated to the size of a house (especially so in our small toy example). -## A note on other norms - -There are other canonical choices of norms for vectors and matrices. While $L^2$ leads naturally to least-squares problems with closed-form solutions, other norms induce different geometries and different optimal solutions. From the linear algebra perspective, changing the norm affects: -- the shape of the unit ball, -- the geometry of approximation, -- the numerical behaviour of optimization problems. - -### $L^1$ norm (Manhattan distance) -The $L^1$ norm of a vector $x = (x_1,\dots,x_p) \in \mathbb{R}^p$ is defined as -$$ \|x\|_1 = \sum |x_i|. $$ -Minimizing the $L^1$ norm is less sensitive to outliers. Geometrically, the $L^1$ unit ball in $\mathbb{R}^2$ is a diamond (a rotated square), rather than a circle. - -![L1_unit_ball.png](./figures/L1_unit_ball.png)) - -Consequently, optimization problems involving $L^1$ tend to produce solutions which live on the corners of this polytope. -Solutions often require linear programming or iterative reweighted least squares. - -$L^1$ based methods (such as LASSO) tend to set coefficients to be exactly zero. Unlike with $L^2$, the minimization problem for $L^1$ does not admit a closed form solution. Algorithms include: -- linear programming formulations, -- iterative reweighted least squares, -- coordinate descent methods. - -### $L^{\infty}$ norm (max/supremum norm) -The supremum norm defined as -$$ \|x\|_{\infty} = \max |x_i| $$ -seeks to control the worst-case error rather than the average error. Minimizing this norm is related to Chebyshev approximation by polynomials. - -Geometrically, the unit ball of $\mathbb{R}^2$ with respect to the $L^{\infty}$ norm looks like a square. - -![Linf_unit_ball.png](./figures/Linf_unit_ball.png) - -Problems involving the $L^{\infty}$ norm are often formulated as linear programs, and are useful when worst-case guarantees are more important than optimizing average performance. - -### Matrix norms - -There are also various norms on matrices, each highlighting a different aspect of the associated linear transformation. -- **Frobenius norm**. This is an important norm, essentially the analogue of the $L^2$ norm for matrices. It is the Euclidean norm if you think of your matrix as a vector, forgetting its rectangular shape. For $A = (a_{ij})$ a matrix, the Frobenius norm - $$ \|A\|_F = \sqrt{\sum a_{ij}^2} $$ - is the square root of the sum of squares of all the entries. This treats a matrix as a long vector and is invariant under orthogonal transformations. As we'll see, it plays a central role in: - - least-squares problems, - - low-rank approximation, - - principal component analysis. - - In particular, the truncated SVD yields a best low-rank approximation of a matrix with respect to the Frobenius norm. - - We also that that the Frobenius norm can be written in terms of tracial data. We have that - $$ \|A\|_F^2 = \text{Tr}(A^TA) = \text{Tr}(AA^T). $$ -- **Operator norm** (spectral norm). This is just the norm as an operator $A: \mathbb{R}^p \to \mathbb{R}^n$, where $\mathbb{R}^p$ and $\mathbb{R}^n$ are thought of as Hilbert spaces: - $$ \|A\| = \max_{\|x\|_2 = 1}\|Ax\|_2. $$ - This norm measures how big of an amplification $A$ can apply, and is equal to the largest singular value of $A$. This norm is related to stability properties, and is the analogue of the $L^{\infty}$ norm. -- **Nuclear norm**. The nuclear norm, defined as - $$ \|A\|_* = \sum \sigma_i, $$ - is the sum of the singular values. When $A$ is square, this is precisely the trace-class norm, and is the analogue of the $L^1$ norm. This norm acts as a generalization of the concept of rank. - -## A note on regularization - -Regularization introduces additional constraints or penalties to stabilize ill-posed problems. From the linear algebra point of view, regularization modifies the singular value structure of a problem. -- **Ridge regression**: add a positive multiple $\lambda\cdot I$ of the identity to $X^TX$ which will artificially inflate small singular values. -- This dampens unstable directions while leaving well-conditioned directions largely unaffected. - -Geometrically, regularization reshapes the solution space to suppress directions that are poorly supported by the data. -## A note on solving multiple targets concurrently - -Suppose now that we were interested in solving several problems concurrently; that is, given some data points, we would like to make $k$ predictions. Say we have our $n \times p$ data matrix $X$, and we want to make $k$ predictions $y_1,\dots,y_k$. We can then set the problem up as finding a best solution to the matrix equation -$$ XB = Y $$ -where $B$ will be a $p \times k$ matrix of parameters and $Y$ will be the $p \times k$ matrix whose columns are $y_1,\dots,y_k$. - -## Polynomial Regression - -Sometimes fitting a line to a set of $n$ data points clearly isn't the right thing to do. To emphasize the limitations of linear models, we generate data from a purely quadratic relationship. In this setting, the space of linear functions is not rich enough to capture the underlying structure, and the linear least-squares solution exhibits systematic error. Expanding the feature space to include quadratic terms resolves this issue. - -For example, suppose our data looked like the following. - -![quadratic_data.png](./figures/quadratic_data.png) - -If we try to find a line of best fit, we get something that doesn't really describe or approximate our data at all... - -![quadratic_line_of_best_fit.png](./figures/quadratic_line_of_best_fit.png) - -This is an example of **underfitting** data, and we can do better. The same linear regression ideas work for fitting a degree $d$ polynomial model to a set of $n$ data points. Before, when trying to fit a line to points $(x_1,y_1),\dots,(x_n,y_n)$, we had the following matrices -$$ \tilde{X} = \begin{bmatrix} 1 & x_1 \\ \vdots & \vdots \\ 1 & x_n \end{bmatrix}, y = \begin{bmatrix} y_1 \\ \vdots \\ y_n \end{bmatrix}, \tilde{\beta} = \begin{bmatrix} \beta_0 \\ \beta_1 \end{bmatrix} $$ -in the matrix equation -$$ \tilde{X}\tilde{\beta} = y, $$ -and we were trying to find a vector $\tilde{\beta}$ which gave a best possible solution. This would give us a line $y = \beta_0 + \beta_1x$ which best approximates the data. To fit a polynomial $y = \beta_0 + \beta_1x + \beta_2x^2 + \cdots + \beta_d^dx^d$ to the data, we have a similar set up. - -> **Definition**. The **Vandermonde matrix** is the $n \times (d+1)$ matrix -> $$ V = \begin{bmatrix} 1 & x_1 & x_1^2 & \cdots & x_1^d \\ 1 & x_2 & x_2^2 & \cdots & x_2^d \\ \vdots & \vdots & \ddots & \vdots \\ 1 & x_n & x_n^2 & \cdots & x_n^d \end{bmatrix}. $$ - -With the Vandermonde matrix, to find a polynomial function of best fit, one just needs to find a least-squares solution to the matrix equation -$$ V\tilde{\beta} = y. $$ - -With the generated data above, we get the following curve. - -![quadratic_poly_of_best_fit.png](./figures/quadratic_poly_of_best_fit.png) - -Solving these problems can be done with python. One can use `numpy.polyfit` and `numpy.poly1d`. - -> **Example**. Consider the following data. -> |House | Square ft | Bedrooms | Price (in $1000s) | -> | --- | --- | --- | --- | -> | 0 | 1600 | 3 | 500 | -> | 1 | 2100 | 4 | 650 | -> | 2 | 1550 | 2 | 475 | -> | 3 | 1600 | 3 | 490 | -> | 4 | 2000 | 4 | 620 | -> -> Suppose we wanted to predict the price of a house based on the square footage and we thought the relationship was cubic (it clearly isn't, but hey, for the sake of argument). So really we are looking at the subset of data -> |House | Square ft | Price (in $1000s) | -> | --- | --- | --- | -> | 0 | 1600 | 500 | -> | 1 | 2100 | 650 | -> | 2 | 1550 | 475 | -> | 3 | 1600 | 490 | -> | 4 | 2000 | 620 | -> -> Our Vandermonde matrix will be -> $$ V = \begin{bmatrix} 1 & 1600 & 1600^2 & 1600^3 \\ 1 & 2100 & 2100^2 & 2100^3 \\ 1 & 1550 & 1550^2 & 1550^3 \\ 1 & 1600 & 1600^2 & 1600^3 \\ 1 & 2000 & 2000^2 & 2000^3 \end{bmatrix} $$ -> and our target vector will be -> $$ y = \begin{bmatrix} 500 \\ 650 \\ 475 \\ 490 \\ 620 \end{bmatrix}. $$ -> As we can see, the entries of the Vandermonde matrix get very very large very fast. One can, if they are so inclined, compute a least-squares solution to $V\tilde{\beta} = y$ by hand. Let's not, but let us find, using python, a "best" cubic approximation of the relationship between the square footage and price. - -We will use `numpy.polyfit`, `numpy.pold1d` and `numpy.linspace`. -```python -import numpy as np -import pandas as pd -import matplotlib as plt - -# First let us make a dictionary incorporating our data. -# Each entry corresponds to a column (feature of our data) -data = { - 'Square ft': [1600, 2100, 1550, 1600, 2000], - 'Bedrooms': [3, 4, 2, 3, 4], - 'Price': [500, 650, 475, 490, 620] -} - -# Create a pandas DataFrame -df = pd.DataFrame(data) - -# Extract x (square footage) and y (price) -x = df["Square ft"].to_numpy(dtype=float) -y = df["Price"].to_numpy(dtype=float) - -# Degree of polynomial -degree = 3 # cubic - -# Polyfit directly on x -cubic = np.poly1d(np.polyfit(x,y, degree)) - -# Add fitted polynomial line and scatter plot -polyline = np.linspace(x.min(),x.max()) -plt.scatter(x,y, label="Observed data") -plt.plot(polyline, cubic(polyline), 'r', label="Cubic best fit") -plt.xlabel("Square ft") -plt.ylabel("Price (in $1000s)") -plt.title("Cubic polynomial regression: Price vs Square Footage") -plt.show() -``` - -So we get a cubic of best fit. - -![house_price_vs_sqft_cubic.png](./figures/house_price_vs_sqft_cubic.png) - -Here `numpy.polyfit` computes the least-squares solution in the polynomial basis $1, x, x^2, x^3$, i.e., it solves the Vandermonde least-squares problem. So what is our cubic polynomial? - -```python ->>> cubic -poly1d([ 3.08080808e-07, -1.78106061e-03, 3.71744949e+00, -2.15530303e+03]) -``` -The first term is the degree 3 term, the second the degree 2 term, the third the degree 1 term, and the fourth is the constant term. - -## What can go wrong? - -We are often dealing with imperfect data, so there is plenty that could go wrong. Here are some basic cases of where things can break down. - -- **Perfect multicolinearity**: non-invertible $\tilde{X}^T\tilde{X}$. This happens when one feature is a perfect combination of the others. This means that the columns of the matrix $\tilde{X}$ are linearly dependent, and so infinitely many solutions will exist to the least-squares problem. - - For example, if you are looking at characteristics of people and you have height in both inches and centimeters. -- **Almost multicolinearity**: this happens when one features is **almost** a perfect combination of the others. From the linear algebra perspective, the columns of $\tilde{X}$ might not be dependent, but they will be be **almost** linearly dependent. This will cause problems in calculation, as the condition number will become large and amplify numerical errors. The inverse will blow up small spectral components. -- **More features than observations**: this means that our matrix $\tilde{X}$ will be wider than it is high. Necessarily, this means that the columns are linearly dependent. Regularization or dimensionality reduction becomes essential. -- **Redundant or constant features**: this is when there is a characteristic that is satisfied by each observation. In terms of the linear algebraic data, this means that one of the columns of $X$ is constant. - - e.g., if you are looking at characteristics of penguins, and you have "# of legs". This will always be two, and doesn't add anything to the analysis. -- **Underfitting**: the model lacks sufficient expressivity to capture the underlying structure. For example, see the section on polynomial regression -- sometimes one might want a curve vs. a straight line. - -![quadratic_line_of_best_fit.png](./figures/quadratic_line_of_best_fit.png) -- **Overfitting**: the model captures noise rather than structure. Often due to model complexity relative to data size. Polynomial regression can give a nice visualization of overfitting. For example, if we worked with the same generated quadratic data from the polynomial regression section, and we tried to approximation it by a degree 11 polynomial, we get the following. - -![quadratic_degree_11_best_fit.png](./figures/quadratic_degree_11_best_fit.png) -- **Outliers**: large deviations can dominate the $L^2$ norm. This is where normalization might be key. -- **Heteroscedasticity**: this is when the variance of noise changes across observations. Certain least-squares assumptions will break down. -- **Condition number**: a large condition number indicates numerical instability and sensitivity to perturbation, even when formal solutions exist. -- **Insufficient tolerance**: in numerical algorithms, thresholds used to determine rank or invertibility must be chosen carefully. Poor choices can lead to misleading results. - -The point is that many failures in data science are not conceptual, but they happen geometrically and numerically. Poor choices lead to poor results. - -# Principal Component Analysis - -Principal Component Analysis (PCA) addresses the issues of multicollinearity and dimensionality mentioned at the end of the previous section by transforming the data into a new coordinate system. The new axes -- called principal components -- are chosen to capture the maximum variance in the data. In linear algebra terms, we are finding a subspace of potentially smaller dimension that best approximates our data. - -> **Example**: Let us return to our house example. Suppose we decide to list the square footage in both square feet and square meters. Let's add this feature to our dataset. -> |House | Square ft | Square m | Bedrooms | Price (in $1000s) | -> | --- | --- | --- | --- | --- | -> | 0 | 1600 | 148 | 3 | 500 | -> | 1 | 2100 | 195 | 4 | 650 | -> | 2 | 1550 | 144 | 2 | 475 | -> | 3 | 1600 | 148 | 3 | 490 | -> | 4 | 2000 | 185 | 4 | 620 | -> -> In this case, our associated matrix is: -> $$ X = \begin{bmatrix} 1600 & 148 & 3 & 500 \\ 2100 & 195 & 4 & 650 \\ 1550 & 144 & 2 & 475 \\ 1600 & 148 & 3 & 490 \\ 2000 & 185 & 4 & 620 \end{bmatrix} $$ - -There are a few problems with the above data and the associated matrix $X$ (this time, we're not looking to make predictions, so we don't omit the last column). -- **Redundancy**: Square feet and square meters give the same information. It's just a matter of if you're from a civilized country or from an uncivilized country. -- **Numerical instability**: The columns of $X$ are nearly linearly dependent. Indeed, the second column is almost a multiple of the first. Moreover, one can make a safe bet that the number of bedrooms increases as the square footage does, so that the first and third columns are correlated. -- **Interpretation difficulty**: We used the square footage and bedrooms *together* in the previous section to predict the price of a house. However, because of their correlation, this obfuscates the true relationship, say, between the square footage and the price of a house, or the number of bedrooms and the price of a house. - -So the question becomes: what do we do about this? We will try to get a smaller matrix (less columns) that contains the same, or a close enough, amount of information. The point is that the data is *effectively* lower-dimensional. - -Let's do a little analysis on our dataset before progressing. Let's use `pandas.DataFrame.describe`, `pandas.DataFrame.corr` and `numpy.linalg.cond`. First, let's set up our data. - -```python -import numpy as np -import pandas as pd - -# First let us make a dictionary incorporating our data. -# Each entry corresponds to a column (feature of our data) -data = { - 'Square ft': [1600, 2100, 1550, 1600, 2000], - 'Square m': [148, 195, 144, 148, 185], - 'Bedrooms': [3, 4, 2, 3, 4], - 'Price': [500, 650, 475, 490, 620] -} - -# Create a pandas DataFrame -df = pd.DataFrame(data) - -# Create out matrix X -X = df.to_numpy() -``` - -Now let's see what it has to offer. - -```python -# Describe the data ->>> df.describe() - Square ft Square m Bedrooms Price -count 5.000000 5.000000 5.00000 5.000000 -mean 1770.000000 164.000000 3.20000 547.000000 -std 258.843582 24.052027 0.83666 81.516869 -min 1550.000000 144.000000 2.00000 475.000000 -25% 1600.000000 148.000000 3.00000 490.000000 -50% 1600.000000 148.000000 3.00000 500.000000 -75% 2000.000000 185.000000 4.00000 620.000000 -max 2100.000000 195.000000 4.00000 650.000000 -# View correlations ->>> df.corr() - Square ft Square m Bedrooms Price -Square ft 1.000000 0.999886 0.900426 0.998810 -Square m 0.999886 1.000000 0.894482 0.998395 -Bedrooms 0.900426 0.894482 1.000000 0.909066 -Price 0.998810 0.998395 0.909066 1.000000 -# Check the condition number ->>> np.linalg.cond(X) -np.float64(8222.19067218415) - -``` - -As we can see, everything is basically correlated, and we clearly have some redundancies. - -This section is structured as follows. -- [Low-rank approximation via SVD](#low-rank-approximation-via-svd) -- [Centering data](#centering-data) - - -## Low-rank approximation via SVD - -Let $A$ be an $n \times p$ matrix and let $A = U\Sigma V^T$ be a SVD. Let $u_1,\dots,u_n$ be the columns of $U$, $v_1,\dots,v_p$ be the column of $V$, and $\sigma_1 \geq \cdots \sigma_r > 0$ be the singular values, where $r \leq \min\{n,p\}$ is the rank of $A$. Then we have the **reduced singular value decomposition** (see [Pseudoinverses and using the svd](#pseudoinverses-and-using-the-svd)) -$$ A = \sum_{i=1}^r \sigma_i u_iv_i^T $$ -(note that $u_i$ is a $n \times 1$ matrix and $v_i$ is a $p \times 1$ matrix, so $u_iv_i^T$ is some $n \times p$ matrix). -The key idea is that if the rank of $A$ is higher, say $s$, but the latter singular values are small, then we should still have an approximation like this. Say $\sigma_{r+1},\dots,\sigma_{s}$ are tiny. Then -$$ \begin{split} A &= \sum_{i=1}^s \sigma_i u_i v_i^T \\ &= \sum_{i=1}^r \sigma_i u_iv_i^T + \sum_{i=r+1}^{s} \sigma_i u_iv_i^T \\ &\approx \sum_{i=1}^r \sigma_iu_i v_i^T \end{split}. $$ -So defining $A_r := \sum_{i=1}^r \sigma_i u_iv_i^T$, we are approximating $A$ by $A_r$. - -In what sense is this a good approximation though? Recall that the Frobenius norm of a matrix $A$ is defined as the sqrt root of the sum of the squares of all the entries: -$$ \|A\|_F = \sqrt{\sum_{i,j} a_{ij}^2}. $$ -The Frobenius norm acts as a very nice generalization of the $L^2$ norm for vectors, and is an indispensable tool in both linear algebra and data science. The point is that this "approximation" above actually works in the Frobenius norm, and this reduced singular value decomposition in fact minimizes the error. - -> **Theorem** (Eckart–Young–Mirsky). Let $A$ be an $n \times p$ matrix of rank $r$. For $k \leq r$, -> $$ \min_{B \text{ such that rank}(B) \leq k} \|A - B\|_F = \|A - A_k\|_F. $$ -> The (at most) rank $k$ matrix $A_k$ also realizes the minimum when optimizing for the operator norm. - -> **Example**. Recall that we have the following SVD: -> $$ \begin{bmatrix} 3 & 2 & 2 \\ 2 & 3 & -2 \end{bmatrix} = \begin{bmatrix} \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} \\ \frac{1}{\sqrt{2}} & -\frac{1}{\sqrt{2}} \end{bmatrix} \begin{bmatrix} 5 & 0 & 0 \\ 0 & 3 & 0 \end{bmatrix} \begin{bmatrix} \frac{1}{\sqrt{2}} & \frac{1}{3\sqrt{2}} & -\frac{2}{3} \\ \frac{1}{\sqrt{2}} & -\frac{1}{3\sqrt{2}} & \frac{2}{3} \\ 0 & \frac{4}{3\sqrt{2}} & \frac{1}{3} \end{bmatrix}^T. $$ -> So if we want a rank-one approximation for the matrix, we'll do the reduced SVD. We have -> $$ \begin{split} A_1 &= \sigma_1u_1v_1^T \\ &= 5\begin{bmatrix} \frac{1}{\sqrt{2}} \\ \frac{1}{\sqrt{2}} \end{bmatrix}\begin{bmatrix} \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} & 0 \end{bmatrix} \\ &= \begin{bmatrix} \frac{5}{2} & \frac{5}{2} & 0 \\ \frac{5}{2} & \frac{5}{2} & 0 \end{bmatrix} \end{split}$$ -> Now let's compute the (square of the) Frobenius norm of the difference $A - A_1$. We have -> $$ \begin{split} \|A - A_1\|_F^2 &= \left\| \begin{bmatrix} \frac{1}{2} & -\frac{1}{2} & 2 \\ -\frac{1}{2} & \frac{1}{2} & -2 \end{bmatrix}\right\|_F^2 \\ &= 4(\frac{1}{2})^2 + 2(2^2) = 9. \end{split} $$ -> So the Frobenius distance between $A$ and $A_1$ is 3, and we know by Eckart-Young-Mirsky that this is the smallest we can get when looking at the difference between $A$ and a (at most) rank one $2 \times 3$ matrix. As mentioned, the operator norm $\|A - A_1\|$ also minimizes the distance (in operator norm). We know this to be the largest singular value. As $A - A_1$ has SVD -> $$ \begin{bmatrix} \frac{1}{2} & -\frac{1}{2} & 2 \\ -\frac{1}{2} & \frac{1}{2} & -2 \end{bmatrix} = \begin{bmatrix} -\frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} \\ \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} \end{bmatrix}\begin{bmatrix} 3 & 0 & 0 \\ 0 & 0 & 0 \end{bmatrix} \begin{bmatrix} -\frac{1}{3\sqrt{2}} & -\frac{4}{\sqrt{17}} & \frac{1}{3\sqrt{34}} \\ \frac{1}{3\sqrt{2}} & 0 & \frac{1}{3}\sqrt{\frac{17}{2}} \\ -\frac{2\sqrt{2}}{3} & \frac{1}{\sqrt{17}} & \frac{2}{3}\sqrt{\frac{2}{17}} \end{bmatrix}, $$ -> the operator norm is also 3. - -Now let's do this in python. We'll set up our matrix as usual, take the SVD, do the truncated construction of $A_1$, and use `numpy.linalg.norm` to look at the norms. -```python -import numpy as np - -# Create our matrix A -A = np.array([[3,2,2],[2,3,-2]]) - -# Take the SVD -U, S, Vh = np.linalg.svd(A) - -# Create our rank-1 approximation -sigma1 = S[0] -u1 = U[:, [0]] #shape (2,2) -v1T = Vh[[0], :] #shape (3,3) -A1 = sigma1 * (u1 @ v1T) - -# Take norms and view errors -frobenius_error = np.linalg.norm(A - A1, ord="fro") #Frobenius norm -operator_error = np.linalg.norm(A - A1, ord=2) #operator norm -``` -Let's see if we get what we expect. -```python ->>> sigma1 -np.float64(4.999999999999999) ->>> u1 -array([[-0.70710678], - [-0.70710678]]) ->>> v1T -array([[-7.07106781e-01, -7.07106781e-01, -6.47932334e-17]]) ->>> A1 -array([[2.50000000e+00, 2.50000000e+00, 2.29078674e-16], - [2.50000000e+00, 2.50000000e+00, 2.29078674e-16]]) ->>> frobenius_error -np.float64(3.0) ->>> operator_error -np.float64(3.0) -``` -So this numerically confirms the EYM theorem. - -## Centering data -In data science, we rarely apply low-rank approximation to raw values directly, because translation and units can dominate the geometry. Instead, we apply these methods to centered (and often standardized) data so that low-rank structure reflects relationships among features rather than the absolute location or measurement scale. Centering converts the problem from approximating an affine cloud to approximating a linear one, in direct analogy with including an intercept term in linear regression. Therefore, before we can analyze the variance structure, we must ensure our data is centered, i.e., that each feature has a mean of 0. We achieve this by subtracting the mean of each column from every entry in that column. -Suppose $X$ is our $n \times p$ data matrix, and let -$$ \mu = \frac{1}{n}\mathbb{1}^T X. $$ -Then -$$ \hat{X} = X - \mu \mathbb{1} $$ -will be centered data matrix. - -> **Example**. Going back to our housing example, the means of the columns are 1770, 164, 3.2, and 547, respectively. So our centered matrix is -> $$ \hat{X} = \begin{bmatrix} -170 & -16 & -0.2 & -47 \\ 330 & 31 & 0.8 & 103 \\ -220 & -20 & -1.2 & -72 \\ -170 & -16 & -0.2 & -57 \\ 230 & 21 & 0.8 & 73 \end{bmatrix}. $$ - -Let's do this in python. - -```python -import numpy as np -import pandas as pd - -# First let us make a dictionary incorporating our data. -# Each entry corresponds to a column (feature of our data) -data = { - 'Square ft': [1600, 2100, 1550, 1600, 2000], - 'Square m': [148, 195, 144, 148, 185], - 'Bedrooms': [3, 4, 2, 3, 4], - 'Price': [500, 650, 475, 490, 620] -} - -# Create a pandas DataFrame -df = pd.DataFrame(data) - -# Create out matrix X -X = df.to_numpy() - -# Get our vector of means -X_means = np.mean(X, axis=0) - -# Create our centered matrix -X_centered = X - X_means - -# Get the SVD for X_centered -U, S, Vh = np.linalg.svd(X_centered) -``` -This returns the following. -```python ->>> X_means -array([1770. , 164. , 3.2, 547. ]) ->>> X_centered -array([[-1.70e+02, -1.60e+01, -2.00e-01, -4.70e+01], - [ 3.30e+02, 3.10e+01, 8.00e-01, 1.03e+02], - [-2.20e+02, -2.00e+01, -1.20e+00, -7.20e+01], - [-1.70e+02, -1.60e+01, -2.00e-01, -5.70e+01], - [ 2.30e+02, 2.10e+01, 8.00e-01, 7.30e+01]]) - -``` - -We will apply the low-rank approximations from the previous sections. First let's see what our SVD looks like, and what the condition number is. -```python ->>> U -array([[-0.32486018, -0.81524197, -0.01735449, -0.17188722, 0.4472136 ], - [ 0.63705869, 0.10707263, -0.3450375 , -0.51345964, 0.4472136 ], - [-0.42643013, 0.35553416, -0.61058318, 0.34487822, 0.4472136 ], - [-0.33034709, 0.436448 , 0.61781883, -0.3445052 , 0.4472136 ], - [ 0.44457871, -0.08381281, 0.35515633, 0.68497384, 0.4472136 ]]) ->>> S -array([5.44828440e+02, 7.61035608e+00, 8.91429037e-01, 2.41987799e-01]) ->>> Vh.T -array([[ 0.95017495, 0.29361033, 0.08182661, 0.06530651], - [ 0.08827897, 0.06690917, -0.71081981, -0.69459714], - [ 0.00276797, -0.04366082, 0.69629997, -0.71641638], - [ 0.29894268, -0.95258064, -0.05662119, 0.00417714]]) ->>> np.linalg.cond(X_centered) -np.float64(2251.4707027583063) -``` -Now let's approximate our centered matrix $\hat{X}$ by some lower-rank matrices. First, we'll define a function which will give us a rank $k$ truncated SVD. -```python -# Defining the truncated svd -def reduced_svd_matrix_k(U, S, Vh, k): - Uk = U[:, :k] - Sk = np.diag(S[:k]) - Vhk = Vh[:k, :] - return Uk @ Sk @ Vhk -``` -Now, as $\hat{X}$ has rank 4, we can do a reduced matrix of rank 1,2,3. We will do this in a loop. - -> **Remark**. We'll divide the error by the (Frobenius) norm so that we have a relative error. E.g., if two houses are within 10k of each other, they are similarly priced. The magnitude of error being large doesn't say much if our quantities are large. -> -```python -for k in [1, 2, 3]: - # Define our reduced matrix - Xck = reduced_svd_matrix_k(U, S, Vh, k) - # Compute the relative error - rel_err = np.linalg.norm(X_centered - Xck, ord="fro") / np.linalg.norm(X_centered, ord="fro") - # Print the information - print(Xck, "\n", f"k={k}: relative Frobenius reconstruction error on centered data = {rel_err:.4f}", "\n") -``` -And let's see what we get. -```python -[[-168.1743765 -15.62476472 -0.48991109 -52.91078079] - [ 329.79403078 30.64054254 0.96072753 103.7593243 ] - [-220.7553464 -20.50996365 -0.64308544 -69.45373002] - [-171.01485494 -15.88866823 -0.49818573 -53.80444804] - [ 230.15054706 21.38285405 0.67045472 72.40963456]] - k=1: relative Frobenius reconstruction error on centered data = 0.0141 - -[[-1.69996018e+02 -1.60398881e+01 -2.19027093e-01 -4.70007022e+01] - [ 3.30033282e+02 3.06950642e+01 9.25150039e-01 1.02983104e+02] - [-2.19960913e+02 -2.03289247e+01 -7.61220318e-01 -7.20311670e+01] - [-1.70039621e+02 -1.56664278e+01 -6.43206200e-01 -5.69684681e+01] - [ 2.29963269e+02 2.13401763e+01 6.98303572e-01 7.30172337e+01]] - k=2: relative Frobenius reconstruction error on centered data = 0.0017 - -[[-1.69997284e+02 -1.60288915e+01 -2.29799059e-01 -4.69998263e+01] - [ 3.30008114e+02 3.09136956e+01 7.10984571e-01 1.03000519e+02] - [-2.20005450e+02 -1.99420315e+01 -1.14021052e+00 -7.20003486e+01] - [-1.69994556e+02 -1.60579058e+01 -2.59724807e-01 -5.69996518e+01] - [ 2.29989175e+02 2.11151332e+01 9.18749820e-01 7.29993076e+01]] - k=3: relative Frobenius reconstruction error on centered data = 0.0004 -``` - -This seems to check out -- it says that one rank (or one feature) should be roughly enough to describe this data. This should make sense because clearly the square meterage, # of bedrooms, and price depend on the square footage. - -# Project: Spectral Image Denoising via Truncated SVD - -In this project, we will use Truncated Singular Value Decomposition (SVD) to denoise a grayscale image. -The idea is based on the Eckart-Young-Mirsky theorem: the best low-rank approximation of a matrix (in Frobenius norm) is given by truncating its SVD. - -**Outline**. -1. Convert an image of my sweet, sweet dog, Bella to a grayscale image. -2. Load the grayscale image. -3. Add synthetic Gaussian noise to the image. -4. Treat the image as a matrix and compute its SVD. -5. Truncate the SVD to keep only the top $k$ singular values. -6. Reconstruct the image from the truncated SVD. -7. Compare the original, noisy, and denoised images visually and quantitatively. - -### The Setup: Images as Matrices - -Suppose we have a digital image of my dog, Bella. For simplicity, let's assume it is a grayscale image. From the perspective of a computer, this image is simply a large $n \times p$ matrix $A$, where $n$ is the height in pixels and $p$ is the width. The entry $A_{ij}$ represents the brightness (intensity) of the pixel at row $i$ and column $j$, typically taking values between 0 (black) and 255 (white) (or 0 and 1 if we normalize). This matrix representation allows us to leverage linear algebra techniques for image manipulation and analysis. - -> **Remark**. Color images, by contrast, consist of multiple channels (e.g., RGB), and are therefore naturally represented as collections of matrices. To avoid introducing additional structure unrelated to the core linear algebraic ideas, we will restrict ourselves to grayscale images. That is, we will convert a chosen image into grayscale and apply the SVD directly. - -### Experimental Setup - -We will perform the following steps. -1. **Load an preprocess the image**. Convert the image to grayscale to simplify the analysis. -2. **Add artificial Gaussian noise**. Introduce synthetic Gaussian noise to simulate real-world noise. -3. **Compute the SVD**. Decompose the noisy matrix into its singular values and vectors. -4. **Truncating the SVD**. Retain only the top $k$ singular values to create a low-rank approximation. -5. **Reconstructing the Image**. Use the truncated SVD to reconstruct the denoised image. -6. **Comparing results**. Visually and quantitatively compare the original, noisy, and denoised images. - -### Loading and Preprocessing the Image -Let's start with this picture of my beautiful dog Bella. Here it is! - -![bella.jpg](./pictures/bella.jpg) - -Let's first convert it to grayscale. - -```python -import numpy as np -import matplotlib.pyplot as plt -from PIL import Image - -# Load image and convert to grayscale -img = Image.open("bella.jpg").convert("L") -A = np.array(img, dtype=float) - -plt.imshow(A, cmap="gray") -plt.title("Original Grayscale Image") -plt.axis("off") -plt.show() -``` - -Here is the result. - -![bella_grayscale.jpg](./pictures/bella_grayscale.jpg) - -### Adding Noise - -Noise is added to the image to simulate real-world conditions. The noise level can be adjusted to see how the denoising algorithm performs under the difference noise conditions. The noisy image matrix $A_{\text{noisy}}$ is created by adding Gaussian noise to the original matrix $A$. - -```python -rng = np.random.default_rng(0) - -noise_level = 25 -A_noisy = A + noise_level * rng.standard_normal(A.shape) - -plt.imshow(A_noisy, cmap="gray") -plt.title("Noisy Image") -plt.axis("off") -``` - -This gives the following image. - -![bella_grayscale_noisy.jpg](./pictures/bella_grayscale_noisy.jpg) - - - -### SVD - -Recall that the SVD of $A$ is given by $A = U\Sigma V^T$ where $U$ is an $n \times n$ orthogonal matrix, $V$ is a $p \times p$ orthogonal matrix, and $\Sigma$ is an $n \times p$ diagonal matrix with the singular values on the diagonal, in decreasing order. The left singular vectors correspond to the principal components of the image columns, while the right singular vectors correspond to the principal components of the image rows. - -The truncated SVD is given by $A_k = U_k\Sigma_kV_k^T$, where $U_k,V_k, \Sigma_k$ are the truncated versions of $U,V, \Sigma$, respectively. This truncated SVD gives a *best approximation* of our matrix by a lower rank matrix, in terms of the Frobenius norm. Truncating the SVD is equivalent to projecting the image onto the top $k$ principal components. - -The larger singular values correspond to the most important features of the image, while the smaller singular values often contain noise. By truncating the smaller singular values, we can remove the noise while preserving the essential information. - -```python -# Take the SVD -U, S, Vh = np.linalg.svd(A_noisy) - -# Define the truncated SVD -def truncated_svd(U, S, Vh, k): - return U[:, :k] @ np.diag(S[:k]) @ Vh[:k, :] -``` - -If you run the code, you'll see that it takes a bit. This is because computing the SVD of a large image is computationally expensive. There are other methods (e.g., randomized SVD) that exist for scalability. - -#### Singular Value Decay - -As mentioned, the singular values of an image typically decay rapidly, with the largest singular values capturing most of the important information. The smaller singular values often contain components with noise. We plot the singular values on a log scale, we can determine an appropriate truncation point $k$. - -```python -plt.semilogy(S) -plt.title("Singular Value Decay") -plt.xlabel("Index") -plt.ylabel("Singular value (log scale)") -plt.show() -``` - - -![bella_singular_value_decay.jpeg](./figures/bella_singular_value_decay.jpeg) - -### Reconstructing the image - -We reconstruct our image precisely from the truncated SVD $A_k = U_k\Sigma_k V_k^T$. -```python -import math - -# Choose values of $k$ -ks = [5, 20, 50, 100] - -n_images = len(ks) # total number of reconstructions -n_cols = 2 # number of columns in the grid -n_rows = math.ceil(n_images / n_cols) - -# Create the grid of subplots -fig, axes = plt.subplots( - n_rows, - n_cols, - figsize=(4 * n_cols, 4 * n_rows) -) - -# axes is a 2D grid; flatten it so we can iterate over it with a for loop -axes = axes.ravel() - -# Generate and display reconstructed image for each k -for ax, k in zip(axes, ks): - # Reconstruct the rank-k approximation - A_k = truncated_svd(U, S, Vh, k) - - # Display the image - ax.imshow(A_k, cmap="gray") - - # Label each subplot with the truncation rank - ax.set_title(f"k = {k}") - - # Remove axis ticks for a cleaner visualization - ax.axis("off") - -# Hide the extras -for ax in axes[n_images:]: - ax.axis("off") - -# adjust space to not overlap -plt.tight_layout() - -# show the plot -plt.show() - - - -for ax, k in zip(axes, ks): - # Reconstruct the rank-k approximation - A_k = truncated_svd(U, S, Vh, k) - - # Display the image - ax.imshow(A_k, cmap="gray") - - # Label each subplot with the truncation rank - ax.set_title(f"k = {k}") - - # Remove axis ticks for a cleaner visualization - ax.axis("off") - - - -fig, axes = plt.subplots(1, len(ks), figsize=(15,4)) - -# Generate an image for each value of $k$ -for ax, k in zip(axes, ks): - A_k = truncated_svd(U, S, Vh, k) - ax.imshow(A_k, cmap="gray") - ax.set_title(f"k = {k}") - ax.axis("off") - -plt.show() -``` - -![bella_grayscale_svd.jpg](./pictures/bella_grayscale_svd.jpg) - -We can see that as $k$ increases, more image detail is recovered, but noise also begins to reappear. - -### Quantitative Evaluation -We can quantify the quality of the denoised image using the **mean squared error (MSE)** and **peak signal-to-noise ratio (PSNR)**: -$$ \text{MSE} = \frac{1}{np} \sum_{i,j} (A_{ij} - A_k^{ij})^2, \quad \text{PSNR} = 10 \log_{10} \left( \frac{255^2}{\text{MSE}} \right) $$ -MSE quantifies the difference between two images, while higher PSNR values indicate better image quality and less distortion. - -Let's compute the MSE and PSNR for $k=5,20,50,100$. - -```python -def mse(A, B): - return np.mean((A - B) ** 2) - -def psnr(A, B, max_val=255.0): - error = mse(A, B) - if error == 0: - return np.inf - return 10 * np.log10((max_val ** 2) / error) - -results = [] - -for k in ks: - A_k = truncated_svd(U, S, Vh, k) - mse_val = mse(A, A_k) - psnr_val = psnr(A, A_k) - results.append((k, mse_val, psnr_val)) - -# Display results -for k, m, p in results: - print(f"k = {k:3d} | MSE = {m:10.2f} | PSNR = {p:6.2f} dB") - -``` - -We get -```python -k = 5 | MSE = 275.48 | PSNR = 23.73 dB -k = 20 | MSE = 91.05 | PSNR = 28.54 dB -k = 50 | MSE = 56.81 | PSNR = 30.59 dB -k = 100 | MSE = 64.08 | PSNR = 30.06 dB - -``` - -Let's put this into a table. -| $k$ | MSE | PSNR (dB)| Visual Quality| -|------|--------|----------|---------------| -| 5 | 275.48 | 23.73 | Very blurry | -| 20 | 91.05 | 28.54 | Some detail | -| 50 | 56.81 | 30.59 | Good balance | -| 100 | 64.08 | 30.06 | Noise returns | - -We can even see further values of MSE and PSNR. Although truncated SVD minimizes the reconstruction error relative to the noisy image, our quantitative evaluation measures error relative to the original clean image. As $k$ increases, the approximation increasingly fits noise-dominated singular components. Consequently, the mean squared error initially decreases as signal structure is recovered, but eventually increases once noise begins to dominate. This behavior reflects the bias–variance trade off inherent in spectral denoising and explains why the MSE is not monotone in $k$. - -| $k$ | MSE | PSNR (dB)| Visual Quality | -|-------|--------|----------|----------------------------| -| 200 | 107.84 | 27.80 | more noise | -| 500 | 229.03 | 24.54 | even more noise | -| 1000 | 380.20 | 22.33 | even more noise | -| 3000 | 616.74 | 20.23 | recovering our noisy image | - -![bella_grayscale_svd_200_500_1000_3000.jpeg](./pictures/bella_grayscale_svd_200_500_1000_3000.jpg) - -Note that the MSE between the original matrix A and the noisy matrix is 624.67. -```python ->>> mse(A,A_noisy) -np.float64(624.6700890361011) -``` -So as the $k$ goes to the maximum it can be (in this case, 3456, as the image is 5184 x 3456), we should expect the MSE to go towards this value -- i.e., as $k$ gets higher, we are just approximating our noisy image better and better. -# Appendix - -## Figures - -### Line of best fit -#### Line of best fit for generated scatter plot -The first figure is a line of best fit for scattered points. Here is the python code that will produce the image. - -```python -import numpy as np -import matplotlib.pyplot as plt - -# 1. Generate some synthetic data -# We set a random seed for reproducibility -np.random.seed(3) - -# Create 50 random x values between 0 and 10 -x = np.random.uniform(0, 10, 50) - -# Create y values with a linear relationship plus some random noise -# True relationship: y = 2.5x + 5 + noise -noise = np.random.normal(0, 2, 50) -y = 2.5 * x + 5 + noise - -# 2. Calculate the line of best fit -# np.polyfit(x, y, deg) returns the coefficients for the polynomial -# deg=1 specifies a linear fit (first degree polynomial) -slope, intercept = np.polyfit(x, y, 1) - -# Create a polynomial function from the coefficients -# This allows us to pass x values directly to get predicted y values -fit_function = np.poly1d((slope, intercept)) - -# Generate x values for plotting the line (smoothly across the range) -x_line = np.linspace(x.min(), x.max(), 100) -y_line = fit_function(x_line) - -# 3. Plot the data and the line of best fit -plt.figure(figsize=(10, 6)) - -# Plot the scatter points -plt.scatter(x, y, color='purple', label='Data Points', alpha=0.7) - -# Plot the line of best fit -plt.plot(x_line, y_line, color='steelblue', linestyle='--', linewidth=2, label='Line of Best Fit') - -# Add labels and title -plt.xlabel('X Axis') -plt.ylabel('Y Axis') -plt.title('Scatter Plot with Line of Best Fit') - -# Add the equation to the plot -# The f-string formats the slope and intercept to 2 decimal places -plt.text(1, 25, f'y = {slope:.2f}x + {intercept:.2f}', fontsize=12, bbox=dict(facecolor='white', alpha=0.8)) - -# Display legend and grid -plt.legend() -plt.grid(True, linestyle=':', alpha=0.6) - -# Show the plot -plt.show() -``` - -Alternatively, we can do the following using `matplotlib.pyplot.axline`. - -```python -import numpy as np -import matplotlib.pyplot as plt - -# Generate data (same as above) -np.random.seed(3) -x = np.random.uniform(0, 10, 50) -y = 2.5 * x + 5 + np.random.normal(0, 2, 50) - -# Calculate slope and intercept -slope, intercept = np.polyfit(x, y, 1) - -plt.figure(figsize=(10, 6)) -plt.scatter(x, y, color='purple', label='Data Points', alpha=0.7) - -# Plot the line using axline -# xy1=(0, intercept) is the y-intercept point -# slope=slope defines the steepness -plt.axline(xy1=(0, intercept), slope=slope, color='steelblue', linestyle='--', linewidth=2, label='Line of Best Fit') - -# Add the equation to the plot -# The f-string formats the slope and intercept to 2 decimal places -plt.text(1, 25, f'y = {slope:.2f}x + {intercept:.2f}', fontsize=12, bbox=dict(facecolor='white', alpha=0.8)) - - -plt.xlabel('X Axis') -plt.ylabel('Y Axis') -plt.title('Scatter Plot with Line of Best Fit') -plt.legend() -plt.grid(True, linestyle=':', alpha=0.6) -plt.show() -``` - -See -- https://stackoverflow.com/questions/37234163/how-to-add-a-line-of-best-fit-to-scatter-plot -- https://www.statology.org/line-of-best-fit-python/ -- https://stackoverflow.com/questions/6148207/linear-regression-with-matplotlib-numpy - -### Projection of vector onto subspace - -Here is the code to generate the image of the projection of $\text{Proj}(v)$ of a vector $v$ onto a plane in $\mathbb{R}^3$. - -```python -import numpy as np -import matplotlib.pyplot as plt - -# Linear algebra helper functions -def proj_onto_subspace(A, v): - """ - Project vector v onto Col(A) where A is (3 x k) with columns spanning the subspace. - Uses the formula: P = A (A^T A)^(-1) A^T (for full column rank A). - """ - AtA = A.T @ A - return A @ np.linalg.solve(AtA, A.T @ v) - -def make_plane_grid(a, b, u_range=(-1.5, 1.5), v_range=(-1.5, 1.5), n=15): - """ - Plane through origin spanned by vectors a and b. - Returns meshgrid points X,Y,Z for surface plotting. - """ - uu = np.linspace(*u_range, n) - vv = np.linspace(*v_range, n) - U, V = np.meshgrid(uu, vv) - P = U[..., None] * a + V[..., None] * b # shape (n,n,3) - return P[..., 0], P[..., 1], P[..., 2] - -# Choose a plan and a vector -# Plane basis vectors (span a 2D subspace in R^3) -a = np.array([1.0, 0.2, 0.0]) -b = np.array([0.2, 1.0, 0.3]) -# Create the associated matrix -# 3x2 matrix of full column rank -# the column space will be a plane -A = np.column_stack([a, b]) - -# Vector to project -v = np.array([0.8, 0.6, 1.2]) - -# Projection and residual -p = proj_onto_subspace(A, v) -r = v - p - -# Plot -fig = plt.figure(figsize=(9, 7)) -# 1 row, 1 column, 1 subplot -# axis lives in R^3 -ax = fig.add_subplot(111, projection="3d") - -# Plane surface -X, Y, Z = make_plane_grid(a, b) -# Here is a rectangular grid of points in 3D; draw a surface through them. -ax.plot_surface(X, Y, Z, alpha=0.25) - -origin = np.zeros(3) - -# v, p, and residual r -ax.quiver(*origin, *v, arrow_length_ratio=0.08, linewidth=2) -ax.quiver(*origin, *p, arrow_length_ratio=0.08, linewidth=2) -ax.quiver(*p, *r, arrow_length_ratio=0.08, linewidth=2) - -# Drop line from v to its projection on the plane -ax.plot([v[0], p[0]], - [v[1], p[1]], - [v[2], p[2]], - linestyle="--", linewidth=2) - -# Points for emphasis -ax.scatter(*v, s=60) -ax.scatter(*p, s=60) - -# Labels (simple text) -ax.text(*v, " v") -ax.text(*p, " Proj(v)") - -# Make axes look nice -ax.set_xlabel("x") -ax.set_ylabel("y") -ax.set_zlabel("z") -ax.set_title("Projection of a vector onto a plane") - -# Set symmetric limits so the picture isn't squished -all_pts = np.vstack([origin, v, p]) -m = np.max(np.abs(all_pts)) * 1.3 + 0.2 -ax.set_xlim(-m, m) -ax.set_ylim(-m, m) -ax.set_zlim(-m, m) - -# Adjust spacing so labels, titles, and axes don’t overlap or get cut off. -plt.tight_layout() - -plt.show() -``` - -### $L^1$ and $L^{\infty}$ unit balls - -To generate the matplotlib image of the $L^1$ unit ball, let's use the following code. - -```python -import numpy as np -import matplotlib.pyplot as plt - -# Grid -xx = np.linspace(-1.2, 1.2, 400) -yy = np.linspace(-1.2, 1.2, 400) -X, Y = np.meshgrid(xx, yy) - -# Take the $L^1$ norm -Z = np.abs(X) + np.abs(Y) - -plt.figure(figsize=(6,6)) -plt.contour(X, Y, Z, levels=[1]) -plt.contourf(X, Y, Z, levels=[0,1], alpha=0.3) - -plt.axhline(0) -plt.axvline(0) -plt.gca().set_aspect("equal", adjustable="box") -plt.title(r"$L^1$ unit ball: $|x|+|y|\leq 1$") -plt.tight_layout() -plt.show() -``` - -For the $L^{\infty}$ unit ball: - -```python -import numpy as np -import matplotlib.pyplot as plt - -# Grid -xx = np.linspace(-1.2, 1.2, 400) -yy = np.linspace(-1.2, 1.2, 400) -X, Y = np.meshgrid(xx, yy) - -# Take the $L^{\infty}$ norm -Z = np.maximum(np.abs(X), np.abs(Y)) - -plt.figure(figsize=(6,6)) -plt.contour(X, Y, Z, levels=[1]) -plt.contourf(X, Y, Z, levels=[0,1], alpha=0.3) - -plt.axhline(0) -plt.axvline(0) -plt.gca().set_aspect("equal", adjustable="box") -plt.title(r"$L^{\infty}$ unit ball: $\max\{|x|,|y|\} \leq 1$") -plt.tight_layout() -plt.show() -``` - -### Polynomial of best fit - -First let us generate the data and show it in a simple scatter plot. -```python -import numpy as np -import matplotlib.pyplot as plt - -# 1) Generate quadratic data -np.random.seed(3) - -n = 50 -x = np.random.uniform(-5, 5, n) # symmetric, wider range - -# True relationship: y = ax^2 + c + noise -a_true = 2.0 -c_true = 5.0 -noise = np.random.normal(0, 3, n) - -y = a_true * x**2 + c_true + noise -``` - -Now to generate the scatter plot. - -```python -# add the scatter points to the plot -plt.scatter(x,y) - -# plot it -plt.show() -``` - -As for a *line of best fit*, the following will generate the scatter plot vs. the line. - -```python -# find a line of best fit -a,b = np.polyfit(x, y, 1) - -# add scatter points to plot -plt.scatter(x,y) - -# add line of best fit to plot -plt.plot(x, a*x + b, 'r', linewidth=1) - -# plot it -plt.show() -``` - -Now let us do the quadratic of best fit on top of the scatter plot. - -```python -# polynomial fit with degree = 2 -poly = np.polyfit(x,y,2) -model = np.poly1d(poly) - -# add scatter points to plot -plt.scatter(x,y) - -# add the quadratic to the plot -polyline=np.linspace(x.min(), x.max()) -plt.plot(polyline, model(polyline), 'r', linewidth=1) - -# plot it -plt.show() -``` - -# Bibliography - -## Mathematics - -- Gene H. Golub and Charles F. Van Loan, *Matrix Computations*. John Hopkins University Press, 2013. -- Mark H. Holmes, *Introduction to scientific computing and data analysis*. Vol. 13. Springer Nature, 2023. -- David C. Lay, Steven R. Lay, and Judith J. McDonald, *Linear Algebra and Its Applications*, Pearson, 2021. ISBN 013588280X. -- https://ubcmath.github.io/MATH307/index.html -- https://eecs16b.org/notes/fa23/note16.pdf -- https://en.wikipedia.org/wiki/Low-rank_approximation -- https://www-labs.iro.umontreal.ca/~grabus/courses/ift6760_W20_files/lecture-5.pdf -- https://www.statology.org/polynomial-regression-python/ -- https://en.wikipedia.org/wiki/Mean_squared_error -- https://en.wikipedia.org/wiki/Peak_signal-to-noise_ratio - -## Python -### Numpy (https://numpy.org/doc/stable/index.html) -- numpy basics: https://numpy.org/doc/stable/user/absolute_beginners.html -- numpy.array: https://numpy.org/doc/stable/reference/generated/numpy.array.html -- numpy.hstack: https://numpy.org/doc/stable/reference/generated/numpy.hstack.html (Stack arrays in sequence horizontally (column wise).) -- numpy.column_stack: https://numpy.org/doc/stable/reference/generated/numpy.column_stack.html (Stack 1-D arrays as columns into a 2-D array.) -- numpy.shape: https://numpy.org/doc/stable/reference/generated/numpy.shape.html (Return the shape of an array.) -- numpy.polyfit: https://numpy.org/doc/stable/reference/generated/numpy.polyfit.html (Least squares polynomial fit.) -- numpy.mean: https://numpy.org/doc/stable/reference/generated/numpy.mean.html (Compute the arithmetic mean along the specified axis.) -- numyp.poly1d: https://numpy.org/doc/stable/reference/generated/numpy.poly1d.html (A one-dimensional polynomial class.) -- numpy.set_printoptions: https://numpy.org/doc/stable/reference/generated/numpy.set_printoptions.html (These options determine the way floating point numbers, arrays and other NumPy objects are displayed.) -- numpy.finfo: https://numpy.org/doc/stable/reference/generated/numpy.finfo.html (Machine limits for floating point types.) -- numpy.logspace: https://numpy.org/doc/stable/reference/generated/numpy.logspace.html (Return numbers spaced evenly on a log scale.) -- numpy.sum: https://numpy.org/doc/stable/reference/generated/numpy.sum.html (Sum of array elements over a given axis.) -- numpy.abs: https://numpy.org/doc/stable/reference/generated/numpy.absolute.html (Calculate the absolute value element-wise.) -- numpy.ndarray.T: https://numpy.org/doc/stable/reference/generated/numpy.ndarray.T.html (View of the transposed array.) -- numpy.ones: https://numpy.org/doc/stable/reference/generated/numpy.ones.html (Return a new array of given shape and type, filled with ones.) -- numpy.zeros: https://numpy.org/doc/stable/reference/generated/numpy.zeros.html (Return a new array of given shape and type, filled with zeros.) -- numpy.diag: https://numpy.org/doc/stable/reference/generated/numpy.diag.html (Extract a diagonal or construct a diagonal array.) -- numpy.cumsum: https://numpy.org/doc/stable/reference/generated/numpy.cumsum.html (Return the cumulative sum of the elements along a given axis.) -- numpy.meshgrid: https://numpy.org/doc/stable/reference/generated/numpy.meshgrid.html (Return a tuple of coordinate matrices from coordinate vectors.) -- numpy.linspace: https://numpy.org/doc/stable/reference/generated/numpy.linspace.html (Return evenly spaced numbers over a specified interval.) -- numpy.ravel: https://numpy.org/doc/stable/reference/generated/numpy.ravel.html (Return a contiguous flattened array.) -- numpy.vstack: https://numpy.org/doc/stable/reference/generated/numpy.vstack.html (Stack arrays in sequence vertically (row wise).) - -#### numpy.random (https://numpy.org/doc/stable/reference/random/index.html) -- numpy.random.seed: https://numpy.org/doc/stable/reference/random/generated/numpy.random.seed.html (Reseed the singleton RandomState instance.) -- numpy.random.normal: https://numpy.org/doc/stable/reference/random/generated/numpy.random.normal.html (Draw random samples from a normal (Gaussian) distribution.) -- numpy.random.default_rng: https://numpy.org/doc/stable/reference/random/generator.html (Construct a new Generator with the default BitGenerator (PCG64).) -- numpy.random.uniform: https://numpy.org/doc/stable/reference/random/generated/numpy.random.uniform.html (Draw samples from a uniform distribution.) - -#### numpy.linalg (https://numpy.org/doc/stable/reference/routines.linalg.html) -- numpy.linalg.qr: https://numpy.org/doc/stable/reference/generated/numpy.linalg.qr.html (Compute the qr factorization of a matrix. -- numpy.linalg.svd: https://numpy.org/doc/stable/reference/generated/numpy.linalg.svd.html (Singular Value Decomposition.) -- numpy.linalg.solve: https://numpy.org/doc/stable/reference/generated/numpy.linalg.solve.html (Solve a linear matrix equation, or system of linear scalar equations.) -- numpy.linalg.lstsq: https://numpy.org/doc/stable/reference/generated/numpy.linalg.lstsq.html (Return the least-squares solution to a linear matrix equation.) -- numpy.linalg.norm: https://numpy.org/doc/stable/reference/generated/numpy.linalg.norm.html (Matrix or vector norm.) -- numpy.linalg.pinv: https://numpy.org/doc/stable/reference/generated/numpy.linalg.pinv.html (Compute the (Moore-Penrose) pseudo-inverse of a matrix.) -- numpy.linalg.cond: https://numpy.org/doc/stable/reference/generated/numpy.linalg.cond.html (Compute the condition number of a matrix.) - -### Matplotlib (https://matplotlib.org/stable/users/getting_started/) -- matplotlib.pyplot: https://matplotlib.org/stable/api/pyplot_summary.html -- matplotlib.figure: https://matplotlib.org/stable/api/figure_api.html (Implements the following classes: `Figure` and `SubFigure`) -- mpl_toolkits.mplot3d.axes3d.Axes3D.plot_surface: https://matplotlib.org/stable/api/_as_gen/mpl_toolkits.mplot3d.axes3d.Axes3D.plot_surface.html#mpl_toolkits.mplot3d.axes3d.Axes3D.plot_surface (Create a surface plot.) - -#### matplotlib.pyplot -- matplotlib.pyplot.plot: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.plot.html (Plot y versus x as lines and/or markers.) -- matplotlib.pyplot.quiver: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.quiver.html (Plot a 2D field of arrows.) -- matplotlib.pyplot.tight_layout: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.tight_layout.html (Adjust the padding between and around subplots.) -- matplotlib.pyplot.legend: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.legend.html (Place a legend on the Axes.) -- matplotlib.pyplot.show: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.show.html (Display all open figures.) -- matplotlib.pyplot.xlabel: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.xlabel.html (Set the label for the x-axis.) -- matplotlib.pyplot.ylabel: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.ylabel.html (Set the label for the y-axis.) -- matplotlib.pyplot.title: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.title.html (Set a title for the Axes.) -- matplotlib.pyplot.scatter: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.scatter.html (A scatter plot of y vs. x with varying marker size and/or color.) -- matplotlib.pyplot.imshow: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.imshow.html (Display data as an image, i.e., on a 2D regular raster.) -- matplotlib.pyplot.axis: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.axis.html (Convenience method to get or set some axis properties.) -- matplotlib.pyplot.semilogy: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.semilogy.html (Make a plot with log scaling on the y-axis.) -- matplotlib.pyplot.subplots: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.subplots.html (Create a figure and a set of subplots.) -- matplotlib.pyplot.contour: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.contour.html (Plot contour lines.) -- matplotlib.pyplot.contourf: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.contourf.html (Plot filled contours.) -- matplotlib.pyplot.axhline: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.axhline.html (Add a horizontal line spanning the whole or fraction of the Axes.) -- matplotlib.pyplot.axvline: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.axvline.html (Add a vertical line spanning the whole or fraction of the Axes.) -- matplotlib.pyplot.gca: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.gca.html (Get the current Axes.) - -#### matplotlib.figure -- matplotlib.figure.Figure.add_subplot : https://matplotlib.org/stable/api/_as_gen/matplotlib.figure.Figure.add_subplot.html (Add an `Axes` to the figure as part of a subplot arrangement.)] - -#### matplotlib.axes -- matplotlib.axes.Axes.set_title: https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_title.html (Set a title for the Axes.) -- matplotlib.axes.Axes.imshow: https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.imshow.html (Display data as an image, i.e., on a 2D regular raster.) -- matplotlib.axes.Axes.axis: https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.axis.html (Convenience method to get or set some axis properties.) -- matplotlib.axes.Axes.text: https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.text.html (Add text to the Axes.) -- matplotlib.axes.Axes.set_xlabel: https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_xlabel.html (Set the label for the x-axis.) -- matplotlib.axes.Axes.set_ylabel: https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_ylabel.html (Set the label for the y-axis.) -- matplotlib.axes.Axes.set_xlim: https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_xlim.html (Set the x-axis view limits.) -- matplotlib.axes.Axes.set_aspect: https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_aspect.html (Set the aspect ratio of the Axes scaling, i.e. y/x-scale.) - -#### Scatter plots with line of best fit -- https://stackoverflow.com/questions/37234163/how-to-add-a-line-of-best-fit-to-scatter-plot -- https://www.statology.org/line-of-best-fit-python/ -- https://stackoverflow.com/questions/6148207/linear-regression-with-matplotlib-numpy - -### Pandas -- pandas basics: https://pandas.pydata.org/docs/user_guide/index.html -- pandas.DataFrame: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html (Two-dimensional, size-mutable, potentially heterogeneous tabular data.) -#### pandas.DataFrame -- pandas.DataFrame.describe: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.describe.html (Generate descriptive statistics.) -- pandas.DataFrame.corr: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.corr.html (Compute pairwise correlation of columns, excluding NA/null values.) -- pandas.DataFrame.to_numpy: https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.to_numpy.html (Convert the DataFrame to a NumPy array.) -- pandas.DataFrame.plot: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.plot.html (Make plots of Series or DataFrame.) - -### Pillow -- PIL basics: https://pillow.readthedocs.io/en/stable/ -- PIL.Image: https://pillow.readthedocs.io/en/stable/reference/Image.html - -### Math -- Math basics: https://docs.python.org/3/library/math.html -- math.ceil: https://docs.python.org/3/library/math.html#math.ceil (Return the ceiling of x, the smallest integer greater than or equal to x) +* [ ] Add regularization (Ridge, Lasso) +* [ ] Extend PCA to real datasets +* [ ] Compare SVD vs. autoencoders for compression +* [ ] Add performance benchmarks (QR vs SVD vs normal equations) +--- # License This project is licensed under the MIT License. -See the [`LICENSE`](./LICENSE) file for details. - - +See the [`LICENSE`](./LICENSE) file for details. \ No newline at end of file diff --git a/bibliography.md b/bibliography.md new file mode 100644 index 0000000..beced6e --- /dev/null +++ b/bibliography.md @@ -0,0 +1,114 @@ +# Bibliography + +## Mathematics + +- Gene H. Golub and Charles F. Van Loan, *Matrix Computations*. John Hopkins University Press, 2013. +- Mark H. Holmes, *Introduction to scientific computing and data analysis*. Vol. 13. Springer Nature, 2023. +- David C. Lay, Steven R. Lay, and Judith J. McDonald, *Linear Algebra and Its Applications*, Pearson, 2021. ISBN 013588280X. +- https://ubcmath.github.io/MATH307/index.html +- https://eecs16b.org/notes/fa23/note16.pdf +- https://en.wikipedia.org/wiki/Low-rank_approximation +- https://www-labs.iro.umontreal.ca/~grabus/courses/ift6760_W20_files/lecture-5.pdf +- https://www.statology.org/polynomial-regression-python/ +- https://en.wikipedia.org/wiki/Mean_squared_error +- https://en.wikipedia.org/wiki/Peak_signal-to-noise_ratio + +## Python +### Numpy (https://numpy.org/doc/stable/index.html) +- numpy basics: https://numpy.org/doc/stable/user/absolute_beginners.html +- numpy.array: https://numpy.org/doc/stable/reference/generated/numpy.array.html +- numpy.hstack: https://numpy.org/doc/stable/reference/generated/numpy.hstack.html (Stack arrays in sequence horizontally (column wise).) +- numpy.column_stack: https://numpy.org/doc/stable/reference/generated/numpy.column_stack.html (Stack 1-D arrays as columns into a 2-D array.) +- numpy.shape: https://numpy.org/doc/stable/reference/generated/numpy.shape.html (Return the shape of an array.) +- numpy.polyfit: https://numpy.org/doc/stable/reference/generated/numpy.polyfit.html (Least squares polynomial fit.) +- numpy.mean: https://numpy.org/doc/stable/reference/generated/numpy.mean.html (Compute the arithmetic mean along the specified axis.) +- numyp.poly1d: https://numpy.org/doc/stable/reference/generated/numpy.poly1d.html (A one-dimensional polynomial class.) +- numpy.set_printoptions: https://numpy.org/doc/stable/reference/generated/numpy.set_printoptions.html (These options determine the way floating point numbers, arrays and other NumPy objects are displayed.) +- numpy.finfo: https://numpy.org/doc/stable/reference/generated/numpy.finfo.html (Machine limits for floating point types.) +- numpy.logspace: https://numpy.org/doc/stable/reference/generated/numpy.logspace.html (Return numbers spaced evenly on a log scale.) +- numpy.sum: https://numpy.org/doc/stable/reference/generated/numpy.sum.html (Sum of array elements over a given axis.) +- numpy.abs: https://numpy.org/doc/stable/reference/generated/numpy.absolute.html (Calculate the absolute value element-wise.) +- numpy.ndarray.T: https://numpy.org/doc/stable/reference/generated/numpy.ndarray.T.html (View of the transposed array.) +- numpy.ones: https://numpy.org/doc/stable/reference/generated/numpy.ones.html (Return a new array of given shape and type, filled with ones.) +- numpy.zeros: https://numpy.org/doc/stable/reference/generated/numpy.zeros.html (Return a new array of given shape and type, filled with zeros.) +- numpy.diag: https://numpy.org/doc/stable/reference/generated/numpy.diag.html (Extract a diagonal or construct a diagonal array.) +- numpy.cumsum: https://numpy.org/doc/stable/reference/generated/numpy.cumsum.html (Return the cumulative sum of the elements along a given axis.) +- numpy.meshgrid: https://numpy.org/doc/stable/reference/generated/numpy.meshgrid.html (Return a tuple of coordinate matrices from coordinate vectors.) +- numpy.linspace: https://numpy.org/doc/stable/reference/generated/numpy.linspace.html (Return evenly spaced numbers over a specified interval.) +- numpy.ravel: https://numpy.org/doc/stable/reference/generated/numpy.ravel.html (Return a contiguous flattened array.) +- numpy.vstack: https://numpy.org/doc/stable/reference/generated/numpy.vstack.html (Stack arrays in sequence vertically (row wise).) + +#### numpy.random (https://numpy.org/doc/stable/reference/random/index.html) +- numpy.random.seed: https://numpy.org/doc/stable/reference/random/generated/numpy.random.seed.html (Reseed the singleton RandomState instance.) +- numpy.random.normal: https://numpy.org/doc/stable/reference/random/generated/numpy.random.normal.html (Draw random samples from a normal (Gaussian) distribution.) +- numpy.random.default_rng: https://numpy.org/doc/stable/reference/random/generator.html (Construct a new Generator with the default BitGenerator (PCG64).) +- numpy.random.uniform: https://numpy.org/doc/stable/reference/random/generated/numpy.random.uniform.html (Draw samples from a uniform distribution.) + +#### numpy.linalg (https://numpy.org/doc/stable/reference/routines.linalg.html) +- numpy.linalg.qr: https://numpy.org/doc/stable/reference/generated/numpy.linalg.qr.html (Compute the qr factorization of a matrix. +- numpy.linalg.svd: https://numpy.org/doc/stable/reference/generated/numpy.linalg.svd.html (Singular Value Decomposition.) +- numpy.linalg.solve: https://numpy.org/doc/stable/reference/generated/numpy.linalg.solve.html (Solve a linear matrix equation, or system of linear scalar equations.) +- numpy.linalg.lstsq: https://numpy.org/doc/stable/reference/generated/numpy.linalg.lstsq.html (Return the least-squares solution to a linear matrix equation.) +- numpy.linalg.norm: https://numpy.org/doc/stable/reference/generated/numpy.linalg.norm.html (Matrix or vector norm.) +- numpy.linalg.pinv: https://numpy.org/doc/stable/reference/generated/numpy.linalg.pinv.html (Compute the (Moore-Penrose) pseudo-inverse of a matrix.) +- numpy.linalg.cond: https://numpy.org/doc/stable/reference/generated/numpy.linalg.cond.html (Compute the condition number of a matrix.) + +### Matplotlib (https://matplotlib.org/stable/users/getting_started/) +- matplotlib.pyplot: https://matplotlib.org/stable/api/pyplot_summary.html +- matplotlib.figure: https://matplotlib.org/stable/api/figure_api.html (Implements the following classes: `Figure` and `SubFigure`) +- mpl_toolkits.mplot3d.axes3d.Axes3D.plot_surface: https://matplotlib.org/stable/api/_as_gen/mpl_toolkits.mplot3d.axes3d.Axes3D.plot_surface.html#mpl_toolkits.mplot3d.axes3d.Axes3D.plot_surface (Create a surface plot.) + +#### matplotlib.pyplot +- matplotlib.pyplot.plot: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.plot.html (Plot y versus x as lines and/or markers.) +- matplotlib.pyplot.quiver: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.quiver.html (Plot a 2D field of arrows.) +- matplotlib.pyplot.tight_layout: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.tight_layout.html (Adjust the padding between and around subplots.) +- matplotlib.pyplot.legend: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.legend.html (Place a legend on the Axes.) +- matplotlib.pyplot.show: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.show.html (Display all open figures.) +- matplotlib.pyplot.xlabel: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.xlabel.html (Set the label for the x-axis.) +- matplotlib.pyplot.ylabel: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.ylabel.html (Set the label for the y-axis.) +- matplotlib.pyplot.title: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.title.html (Set a title for the Axes.) +- matplotlib.pyplot.scatter: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.scatter.html (A scatter plot of y vs. x with varying marker size and/or color.) +- matplotlib.pyplot.imshow: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.imshow.html (Display data as an image, i.e., on a 2D regular raster.) +- matplotlib.pyplot.axis: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.axis.html (Convenience method to get or set some axis properties.) +- matplotlib.pyplot.semilogy: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.semilogy.html (Make a plot with log scaling on the y-axis.) +- matplotlib.pyplot.subplots: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.subplots.html (Create a figure and a set of subplots.) +- matplotlib.pyplot.contour: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.contour.html (Plot contour lines.) +- matplotlib.pyplot.contourf: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.contourf.html (Plot filled contours.) +- matplotlib.pyplot.axhline: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.axhline.html (Add a horizontal line spanning the whole or fraction of the Axes.) +- matplotlib.pyplot.axvline: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.axvline.html (Add a vertical line spanning the whole or fraction of the Axes.) +- matplotlib.pyplot.gca: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.gca.html (Get the current Axes.) + +#### matplotlib.figure +- matplotlib.figure.Figure.add_subplot : https://matplotlib.org/stable/api/_as_gen/matplotlib.figure.Figure.add_subplot.html (Add an `Axes` to the figure as part of a subplot arrangement.)] + +#### matplotlib.axes +- matplotlib.axes.Axes.set_title: https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_title.html (Set a title for the Axes.) +- matplotlib.axes.Axes.imshow: https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.imshow.html (Display data as an image, i.e., on a 2D regular raster.) +- matplotlib.axes.Axes.axis: https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.axis.html (Convenience method to get or set some axis properties.) +- matplotlib.axes.Axes.text: https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.text.html (Add text to the Axes.) +- matplotlib.axes.Axes.set_xlabel: https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_xlabel.html (Set the label for the x-axis.) +- matplotlib.axes.Axes.set_ylabel: https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_ylabel.html (Set the label for the y-axis.) +- matplotlib.axes.Axes.set_xlim: https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_xlim.html (Set the x-axis view limits.) +- matplotlib.axes.Axes.set_aspect: https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_aspect.html (Set the aspect ratio of the Axes scaling, i.e. y/x-scale.) + +#### Scatter plots with line of best fit +- https://stackoverflow.com/questions/37234163/how-to-add-a-line-of-best-fit-to-scatter-plot +- https://www.statology.org/line-of-best-fit-python/ +- https://stackoverflow.com/questions/6148207/linear-regression-with-matplotlib-numpy + +### Pandas +- pandas basics: https://pandas.pydata.org/docs/user_guide/index.html +- pandas.DataFrame: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html (Two-dimensional, size-mutable, potentially heterogeneous tabular data.) +#### pandas.DataFrame +- pandas.DataFrame.describe: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.describe.html (Generate descriptive statistics.) +- pandas.DataFrame.corr: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.corr.html (Compute pairwise correlation of columns, excluding NA/null values.) +- pandas.DataFrame.to_numpy: https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.to_numpy.html (Convert the DataFrame to a NumPy array.) +- pandas.DataFrame.plot: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.plot.html (Make plots of Series or DataFrame.) + +### Pillow +- PIL basics: https://pillow.readthedocs.io/en/stable/ +- PIL.Image: https://pillow.readthedocs.io/en/stable/reference/Image.html + +### Math +- Math basics: https://docs.python.org/3/library/math.html +- math.ceil: https://docs.python.org/3/library/math.html#math.ceil (Return the ceiling of x, the smallest integer greater than or equal to x) diff --git a/figures/bella_reconstruction_error_vs_rank.jpeg b/figures/bella_reconstruction_error_vs_rank.jpeg deleted file mode 100644 index a0a1987ca590556d517f498c189bb086bb337598..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19673 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 diff --git a/figures/projection_of_vector_onto_plane.png b/figures/projection_of_vector_onto_plane.png deleted file mode 100644 index 567866f5148cbc80f85b316c56fdb081f39a405a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 144052 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

^zM^1^_X2K}|$vE9kaBY^JYJ5os{s!@BFo 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 N>^9KK)UY}Ke*v$qCiegU diff --git a/figures/quadratic_degree_11_best_fit.png b/figures/quadratic_degree_11_best_fit.png deleted file mode 100644 index ccb1bc080dc2c6c2062005f299468f71809d0544..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20719 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 diff --git a/figures/quadratic_poly_of_best_fit.png b/figures/quadratic_poly_of_best_fit.png deleted file mode 100644 index e73ca08c94c948d1b4fd2700e2f5659a056493b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20650 zcmeFZWmr^S-!{Al5Req5q!9r@0VSnTBnG6rL8Vi=83R<1kd#JghLmm)5v3UzI;Et$ z>s_P&>$>B)-}iXl=kxP{V}QN)nzdK_;ylmadZ(%^M@&FN06`EjT>g0vxE-A>d72H}xEuq{hkOD`rDY+7+7|lu^XC2eb(z(%38O)-eFMB5ws8e_bZl#LI<&LK zE^!Gcxe#&%7~NH3Rwuf3>1y{zIQE?%_K0|4J{RMjwx&pf7>XrdoUi_z;waa3HAoIu;WIA-b+WFbJ{>g76{8ln+M=Tu)?%u)sq^uq)sZ zi~sw`|MrMI7Dp0pS_TFNiufKDfBpJ(&gp(WHy#94HQgnepPS3E?$071__C-=4J#%g zVU)vJ}FRN$@bs67dr_0drGU(B=LKKht#&S-N^iF z>dj2cd7IUCBmLA!3q5<#mkTn;ud~)9Ybgb7qIsC0wrlwWWlTX%LtzYFN0lBcjZ`l+ zGV3|gJvYzJQeL5>9lbyB*fAC~jfD^El_MvoQFuJMvb}d*xSHD#tXx$F@LxNXt~-?r zMVxA8pBM_jsN!&ArG@AGd~5vp^~hE5Xqq5CLgF(Ui}z*hU%&Cda<&PDezRcSi|vMH zYe{#!-y`1kb==F&@``T^A2EXAQ)S1IVkD!RQ~ip#4_7z*PI~NmM8AC8pTawIr=cLK zaH)6TGXV^eN@IeKBf!h+3+6|KCA&0`Bry~)*G@$R51w){4#J0AP3K4`RF6K zZTZ^bfXax6ZPQC(8~6U|<$)!-!BZGym!8(!3*OUwZjO_)bNuj!UvE9=@vZwmK4~9> z#!+?-wkAeqa7PtzUxuI}T`)l3GV0Cs(_0_C<}{O{vz?xJ%VBEbHmHZ1ZbrHE#EcPP zK~hX$%(F^vdvI{w*2$iyAIeZU|HKz&$svAQ=c&#*3QQtWk%$^c%0$q+tjsaB%sL7k z13}Yjt?W-INWF;0PfFPAyo`tm&Tn~f-?J_v$P?kA;AVl2zf9I=R@ir`fl9Y&z#v35?=w0FF472OmWp8Wx3A1MWaFc_cB$!Ek~ReaQ`@b zfE3wBZi@_nDIA*cuRU74U8HLS-jG4#_)-2CX!KKYX*AtfZu^R=4``~*;tGTyCQp4! z5$j<%6i^Q@G8xthe9+8VBpU3F?GYMUR@N=`0NTa#n6h`kg)3LoT!kR9&xeolR}TF1 zd!vqyEl(s^izqyx$JAHkB&CFyp<`^pSHQ%jO#;@!94Y7J34~AhrkDrakyp|Lq9ENVesSKT7pin3U1{1$Mt)I3# z3tjy$FACjuP7K9izseu|32KB z)i1Y+L7VHWcJhsYRf2EW76wP^B=Q+IH*@=9E#FAPp01qoM`kG{ataD+S5A5({SRmG z;OaIud8qz=bfx1|q^O=BQ@}Et(KXctr+<^J-x$M+11tcr!B?Ljt&iX zclY==I(y5k$v%aLPEKgd&I$**4=SS zq@;WXac|9Ifrk$tk~1(EFU+`Erf^JnrVA4r>i$04AcYX3nc0ba22a0#; zwvO#-jvfRlpM~q5Hqy#1LQvf&?N?-QIBIW5QPf@DsK&EETXADb;)ZE90(-Le6EBUB z_VQ}r{MXcs$i=Hs`@Hl-&}I(k8BMLTPW&c2d`Yhw{2DiyouPI5t|Lw{S=2}1wD}RV zt7B$%>@}V0HnH!a)i@naz;o|rrun>$k4@H42R1Y;4ICmcxdM#u<&|P4eZmKMD1q@P zsTU&Z(`yURYV^}eHIDocWiY=2jQ!yLK&LZHK&F-m_13tHx@VQ^NV9gB?$6)?iTT>)6L6kVSQ@MF^)!P-|%@3IjlF_Ei`nXk*EH_ zg#T#zj{k_sx|>`d)_7sbhu8r;2;aAmgg3gn@bD4x-cvCh>OAloPn#c*7zyrioAXPg zkKZ!g;+}pDd#>f!j0dHW{NwIoCagK>-h;KfJYgVm;p-UlP6KpoJeAufcXft^-?K+f zglog|=T7%qRsAMlKe>Su0*$EWHotj7K_a_4!eT%A?RRSHZ){yWiGI1?*{RRU90~>+ zyZUsn-&76yUV|VZ=W5dF*OyVWj`DaU^29W{>d2n)My^LtK6dIctY%AgDbX<_n!H;b z2h#mK8YSiIoMF+`dF62UX)Jn4|JE6t%D5}f0|}`Q&VZJ zesrm*?gqVN_ihoXDY0o<)waS?-A+cPVgay^h;1Ti{W{&68QfeMLL{<89LqG#>3*lf zvSTAxrk3*@2?S{$O=G*{qF!It*1^IuMO2@;yF6GUg(aoxVuek?0M&|QzShRv6*ZS+YeE7JIg7goO>aR}=jZvg$&jRm@XAbxb2WWaKKFtDSp}n#4)n(i)*fGf`RxU;?6Hx zD7o_<6CteL?MBp6^vKK*V&n z%B>zKQbUM?JNh?`++tkMkF<4ODuA~%s`p;N8rMQvUB-qs>*z%@dL+{KLc&>~(dJ~2 zgg1_o7j>Ag! zM#OniP#K{K6~YWo%Jb8zGT&-28)g1m*f>(6 z@%Pn^=dM`~aU(&Hi<6*Z5)($xw;{0U1+HDcD`kTY2H_6Ehk{apkV-*loGIC_0*!9E z1g>&8TrTx4k4|xL6Mzs>C1$U7yM%y!28)Y|3|d<#tj##y>k6y^k$%h9K=o{8lzE(< z(PhI&P+4NXijapTml0?3eYF|Z|8A>$H@$)Nlq~Tm+C4u(nOxZHCk2}1Sh~TAo9Yh~ zLZ}qMCJ1FPTFCrQc6afw-BmvO_4LjyN@%*Dk~{jzlMKm=5wIe$-$SE)BbJJ3T6W=sq^ zromUQdlPE1oL^K_jFoSBqiC68?Iw`JjFo02Ot)}r`VFH(t;cPa?CnjR1mqA5!Wx&n z;K4s>A9WO*pu_mu*xD!E_*XddA7> zyvu8X<}k5+jQz9+`5Nvz4eiqW4HzVmeW=^lc#a0cp@<_@ODmv2K&-WiVpX6vJ*V`r z!M}5U-%Kj$<*VOYI8epGfQEXl`vN}G=~Y&Y4QH$tCs`y zO4pD`Ea))7#Q%e_H$359i(?Dp<)CmH%u?d3qc|pXq zc^(^+qotPNnQrn7mz3PFNsJljtUBB9S)Obsx$OnNT+ zb0^5mYUXQTg0M>#E-6F);h|@NZpp*8aK@oLE##d75C}J;{0`ubb3dv z!OyIn9C`aiB91FWC+S~TSii4tyB71O3h_y z*)aYgcd?@kjK%SNVJ5$`s95i#XjB81|M*SQv8KBHQQOgS+c@{tVYT)0-Cb9>I*3~1 z7t_;&is3gFwc>cK`n`BF>8QVY16nzjxOv>8co(&Ya| zZ?wV4dyyX5@rw4+Gf2#HGi|;8z}SAc7{nN#VvHA^qU{~*sAa1c6%zR@!>(StHldGH zp^-FB5FN53I{U$bafX{O|J$}NUq5T3aBIG#esLZgULd^dg6Pjl3raoO5<2>}f3>qs*d)W3YiYxV>DL zP%_eQNYLvOwQl<(mK{s3HnZPDSyQ7@Q;X*2p6&haOGg#af(h8%+~f^M>twZGC`u({;C^~C0fDfvU z;8ASW`>P{1V-*FX752!HQcI*-x-1Rvv$rx@Cm&^|nw5L!KxC*-Ehdeul}Ei8q8FK`)5rSgl7N_@W=Ub97SqR- zu^@7%AS3&fpP%29OwzEgztjX<>fq74fI%>;l><4qv7NDYv7!4LRTbQ{xkDnm=+)bD z@JQ_`H+U1U*}u+>LJ@}8_(BOHS_<$FlRiBdH_Ol~AgB(o7tXWW=LHvjCd3y%(27Qd zap_hD|;}p48zsaeFFmVh&&4yMs1MZV)0^P^VhaP#8IEq zGucx>Gy);mse||}!*;VJ;mIO;M#N(8A^f4&K?+f9a7Z!E|H&i*;0) z8&ddKu0Ozl3HoforpzxCc*oERW3@cu`Q(;+AJi<+01Fd$1ybWvO8BVJ3>

80Zd^ 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 diff --git a/figures/L1_unit_ball.png b/images/L1_unit_ball.png similarity index 100% rename from figures/L1_unit_ball.png rename to images/L1_unit_ball.png diff --git a/figures/Linf_unit_ball.png b/images/Linf_unit_ball.png similarity index 100% rename from figures/Linf_unit_ball.png rename to images/Linf_unit_ball.png diff --git a/figures/bedrooms_vs_square_footage.png b/images/bedrooms_vs_square_ft.png similarity index 99% rename from figures/bedrooms_vs_square_footage.png rename to images/bedrooms_vs_square_ft.png index 667d00ee78f4139a2964b1c93836dbf9c2cc2190..0678c3d63f67754a8ff29d369e4c98f06460438c 100644 GIT binary patch delta 43 zcmew{h4IG}#tEKs7CH(UB_##LR{Hw6i6sR&`6W4-NqYH3>G}twOV4dg7xV%EcAyau delta 43 zcmew{h4IG}#tEKsW;zNPB_##LR{Hw6i6sR&`6W4-NqYH3>H4eJv>x7=F6adScnlFv diff --git a/pictures/bella.jpg b/images/bella.jpg similarity index 100% rename from pictures/bella.jpg rename to images/bella.jpg diff --git a/figures/house_price_vs_bedrooms.png b/images/house_price_vs_bedrooms.png similarity index 99% rename from figures/house_price_vs_bedrooms.png rename to images/house_price_vs_bedrooms.png index 8891d0a858abdf3fbfb1eff14fc37898fca5f6de..b6b1cea9832a0f863a69454406e8bdc0fc12461d 100644 GIT binary patch delta 43 ycmdnq&A7drae}9ug^of-Nl8JmmA-y%Vo5;i}Cm@#tEKs7CH(UB_##LR{Hw6i6sR&`6W4-NqYH3>G}twOV4dgf8YZEYC{o= delta 43 zcmX>;i}Cm@#tEKsW;zNPB_##LR{Hw6i6sR&`6W4-NqYH3>H4eJv>x7={=f$SYp)T> diff --git a/figures/line_of_best_fit_generated1.png b/images/line_of_best_fit_generated_1.png similarity index 100% rename from figures/line_of_best_fit_generated1.png rename to images/line_of_best_fit_generated_1.png diff --git a/images/projection_of_vector_onto_plane.png b/images/projection_of_vector_onto_plane.png new file mode 100644 index 0000000000000000000000000000000000000000..8b20b8406b61b5937e8c9cabd2d6b75285da3425 GIT binary patch literal 144069 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

YM-~$&i9%)5tq`#10afbLQNr82WE@Rf+Uf47o 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 literal 0 HcmV?d00001 diff --git a/figures/quadratic_data.png b/images/quadratic_data_generated_1.png similarity index 100% rename from figures/quadratic_data.png rename to images/quadratic_data_generated_1.png diff --git a/images/quadratic_data_line_of_best_fit.png b/images/quadratic_data_line_of_best_fit.png new file mode 100644 index 0000000000000000000000000000000000000000..321525ea49bb2c1fc36cd364a87b63d2c001bfe0 GIT binary patch literal 12474 zcmeHtWmuG5+wMKI5+X{2poB`NbSN!hP!5t3(m90W7=VP75<@E8NW+kd0t(V04bnA8 zH|#a~Jn#FwwfFb!{p0(yISvk(S@&A^s_VMW^SrL0yBbQQXX(yD5Jak?EPo$@aF7rL znAtL=T52WCoXj}wHy0ZLlt(!V4lsbE@m)%Njy#G@ft5)q@+~2!1VUVk4IT;;AqYe1vceo zXTKb8QJ06*Zl;e^R#nA8L=dtqPSU%rJ^!Q*k`02C&*2z{EiDmemzNqn?Q-1GM-|=uM%u5Zt2t+B2QJOn0#3)x&RTE9 z1aVK(k14G9a!uAN3);Fyjm5(dggiVCxwH%N5+Y8gdDRaSrPe0~I(%Qf8tFB}1=oun z$Czw!iP&=Uso}RbtF|gnyWWS9Bz9T=dufy-LW(`I9o4aU?Dui-92x0VM@sOm7G5KR zliB3a8-71QxRzF2wv?&5Q+T;Mtqs7tyg)BA19jA} z2+!*Y>Jdi$InKUa5gzbB#_Tx=N)IcTbZ$q-3-oIr4&l;3#`(og35Ui3U@~`olQV|d zh?975A!PpYug#OOuqqQUdKXWhON*PLh=75X#IAnoyQWHOZ(N<8zcUeb+se)3oqS+t z_{;RdLRMZ1kJ)EOx)dZG(Fq+L2a;KqJ&#?NYQF-cZ>J?PGY%*nJ&YWU{nW}4r4 zomb_~%1~O%B`-Cm;{~PdF1d3#g@qbL^#{4Z!NCli%hq~>UOP&jt3k>V@TEdxh`Dos-M#sc7d#hVnOMI>bZz6VRF2}}bmOSD8`11g9~c-U%zU>;ny1`iZB?=!e&}p+S1};_fmh}biLxun@@v7LQKiP%qrJy zseg*puag3wvw&VM?46u^i(Q?6lZnqPrx7?}YisMCLW3GDZS9QQTn=!!s>D=WT>+%@ zi9Ax*O{Xh>Q4UUay{Doy80QG=?}0&$2uXVAbh+U~)#zj+)^%qEZs4_Aj-HKqh}ipS zV&HeY9hGi3QnA>Rp*mdqq?AX$>aBL3&f?^U=Y{&X@AG)y0xy7ntEtn{4Pq%1VxBNHoyEbbtmfCUo0!`60GYpSWC)AxShbm z`^-Z5EV%Qfdel%OgOFm?1<*(k_#?2vtPtGlLNJ@FIB!FMJ5*bCg`jrISLZSE5TY0u z5yvJa$M_M4%_9i&^=lNDE&;@c|3~YQq$==^J?Zd<^N}s!KeZ2pkQvGE#%f?F))Q4~ zzD6q!I=)7iRU08lAgr0l{Sjm1#hD)QTU_;LAV-R22u%#*!}kVO>XGu0j-|@a%Y#!C z+!cfUCo$HsTnID?E0Q0yLIIbtwoem)HF9Gb9AmOzkfJUMhe?OzVx2DsR?au|f%dP_`m&%g%;JYn+-8I`jE0sY^* z^9t*croUP*L$~4=cI;MHVx_*h{C11<_dHxsw_L3uV4_oa8v<$!D{t8E(BM84-w|4_b@kCiQxpX zX;BfhU6<*+?;=+&bbg0DMAF_q+d@hff+Ug9%j~}$rL9QOgl_iEtF{M(07HcvU$*@8 zKvy#pZ7n156im$oPgX55<#CSNms?qF;ACiTQS<%%nE0R=&F4~?*D-yf@Sx9Lol8m@Fm3A-f4 z0bBqYElx^GDyG8;mU+WN9ID^!kU$?|YPO#<9mz5sO%kTf+l>qW=UeVFuQBF2Xpoze zgLO~an3}bv#;3Sp10>*%StXMpA6D3Q&r9!$`OFEX1c}M;@x3+X%RV?bSg3yX45t8I zsu)Pd==>JoXXMKIiU8jo$@LeWUS6(S3*FZ{fsa+WZ)F8$*wb@AN%DyR#s+vROEWXp z15pODta1woN))WVJ25QCKN9H*9xoUp{rClOa`kVf9?3Z!IY*83Z?@gfe%AX;Q4 zCto_AmN`iS|5MxThm_$dl8}*USWzb0wuCXB^}p3Uy|vg&ds>5C?7zQkmj%JpPFFfl z)QW01g2NaksHAlAAH1tstA7ZF=na%PGTA@&b#-@FYOp{cw4|h@^y)laM+ZS%x$ETQ z)DCV|0)RMR#{YOztD?b-LxO{~G&L`{V6Z;_qd#%ld_sJDnav=NwzhUoZtm?Gx7D6! z_{3!%$cRtm+xTieE;7s6>cyL=-HM$SKV6u3x(cs$A=oR@hw@#N#hQamu6>*XiKM+To-<5nW%uH z@9nk;vp=C$X(uZ*Llm$Y7eXbQ{(185(a+d+R|whu=zG`@5mGq>xH_vkG7xu2Mqn^< ztKyOpc@Wz^KV117zo7Hr*Iq)9ZhYH&Mvn`i9qSYRaYLD*87N>C_?9v_@E^dT%ubEwx*W*}KY>9bh!rnQBrMYKfv1w=w{6k?b+*m#83nuXf${$j zhY$dtc6Qvj4bWPjKY!-n;nA_PEAU+pF_KTIw0j6{Ee9{};L-kOx!bB9qm1upcRWD) zB_B#*j_W@@AM8{%6i^#_+~lqO`OLoI*loJ4XDy~jKl-iIpfPIe zD`(L{yiMUf0PSwr4X0mC@xI^R-+z|ic~p8&Pfy&ks;X*Qr}|?vGx;e;(K)~)FZ_FZ zcz*aq96DJ{ImrROEwd@`TwZbUJ)`}vx_uK9Og`f!j}p4t%Q6x6DIl&wwJZ<-FpYlUuyl+1y4-%d|!V*TU$wAUthXGjT_ee0xvvV zZWBwz_24Zj{S8qAaj4NTB=~Hvr@<#%gSG+rL1*C4P|cU-hoHTIhYpL$UYL8#HaWG#&t@HA?b7PWB{I>v+mi#~ax3Q@I@h30WVSP!rN0#&O_`0INL)ED}q z(t-Fm(snh&_7_;OB82ZX^`b1e_Qq5$299FAabH5T_|Jg2M9W$_>3jpU=DfEZaoZWB zp(YM&+SvC7p&K{_H=v)$#w$?i*Ka7&20bXNsJ^i4fJVZgIGtQ#9^7gyM{X3FE149S zyn*#@nURI~u}}5ou`iwWYE2+}+c-q9*R9AB1yOI{p2%Xt;7?h5qL z38ioGv>*|J;(}F}ThE}tpuaysFB2n!%&ESAJp&5v5EaSprvCVW&u1YiOXk!dlus}`OtO^8A&?AHVza8Zy#e3UTq=3p)gMhASb z**Ew?@&6HZ>q!9A%?<~4uR$G2>d*4ImWsssN&kPlCj3nUZM0hd5FleU=p zz1_$#+BMIW3P#~=to8Osw- z9`8;R#Txm-!(~qP-pq5g1wXOH;_vfzc6Pw%y3+ujGzBUTWEMP+JBfQv@@>lL(fq+I zuV2pR5Nf5)!((5o`>MvDCMPG~=zMtjSGl4JE6r_f+CpV^4|ga08hm$3Qx=CFr)Zm- zo40R9M@MfQ9xq`qVafE2jM{hZgzFR;O0C*ZUA&lGRfP>-kRyF(7;Ln}JcNuv^les( zubzT}LU)XGN@o_3pxSg{0UDu_AmT9KPfT5A-Os@&>2Vhf9@dAYK%~w2xN&Fl zS%5D(bUfYpNdw#nr1ncmGo}GELe!N$&LE~v&nt`?_tE{@8CzIAcgzyL0;HBGIjCKM zn)mjg;WC19T*$9p>mg@RBk+mE-mB3=F2t zGy@$iHnPZ-LTl<}=e(Tgdfif!yVTk;>3Nv2go1d`TX?K;yU6(eTj;i_wuhyL$ z%ucUXCKZx7>L~b^InN%pd=pXCHCjbzBW;{c*`drA=ORQxUyY!*ryf%hk={A1W&5(m z+2>F(fhojHMxI~ny1Y0q)8JjZ9?(k(>p18N9B10NcaMLSkGxqo;pw3WjE~J5Svv*X z#MUemL-IDdrNK7@1m^bJ>a8a4BKk%+rB06yTdG|&bn(+$j`r`vQDx?Bvoc1m{e9E8 zOmQdPwWfv`b&<)FZ>;39&*ge6kJ!8zB|GL{+t;jaJlzs=$2fDknk}@^)Bs=_GsCw5)xufl40`F zuOdI(8?A1eI$&Xn9Dg#uk>XIJ?ztvqg%B#9KIi9g+R4IF9DYG6)8%kAHuk36@Od!c zABqkQ-2h^hIFcU;!ZSlQ85H#<*1h`k@ce5I&ZI&Dv4HMEK0~1E&IMRoU0G45!fL0h zg=d(7G=zkRlz|}rPoQ0G+4?JmXHv1#LqIFCvcl_f=I3fuQO@9%JK=za#PM z@iXbaM3IxYSu>zegTSsKDhp^YDHrZ*oXkj;RM6TSHh$fdh^5{wX6zORw;De27*dB9eSw#B7s`Anl_(up*B8Q${RG^AVZp)VbQ!W#H05TN4 zED+B1c&p2cL+=~-pvE(JvdpAExLKv>cc=*<(Wmf6*?2WWWpNsG`swCcL%)AW+6pfT z)G7v^d$qC2)z1UJrV{U`T~8cNyDl20|mBlBf)xfETCJb0cL5GSFaf2n9fb zfUR>S__rEFVPK2@$Q(@p4W;G3Vc#hZg+PpOjrrPuAl!^zex!nuB)r|@8!#%3JW+vXha#_Kk@0cfG;>TrLarSgM`ZHPm%q2;1>k7*dQF{2!)_=hU)bX1%SQ#)hBs#L&b4; zIA-@!MTG3VTeVBo4fV9NM5hNkKLfJCt_q_C%6*CD4OVSz=`s9{>~#xNPk9No9#2fIlo@)}tmI9QvPiN=h;HJi~tJ?;@#A;(Y zZSykx)50mIW~d4V537MSLT2oF6JL2PL*csf=m@r9A7lAa)*iJylks=;%>Dg@E=|&` zbg%GfnF-4G|wQh4jmF0LAYq9v^3`7J|7yET4YQy1n1badr2V;@gtV(f$3 zS6ny2Gp0io-y{!Mi%~*R{7=r$7@gSPy~8LWxI8%OH$vevUCPweX5kd@OL*0sk*GTR6JO+Y z$r1dcJfq{=Kr;m3B-R}6xs;RjDEZ$~?P5=pOnC=eR4uH-{7DQVXtZzbH%YiWbq*?N zFNOUC$;yM7t1>x0hdb(rN0_mi^2eQ*R!1uDD1~2&o>&h>={KKWf!9>S4%5j|yUsTDjLEc2_;SrQ8l7S{tlc9 z-@cW#8OZN`Cl|<2Kstw&S=NAb<>zGE2o(LL!wau@A0&THQ2S1g8c=5z0r@9K_7BE) zqqOw&=v?Z{%CxTDNe(@9Wnp0fx+|e3Ha42zmx|-L?l(8NTIUj_+FAG&Zuv#M zWVVvI;pp;xml=!I&l$3{^&-v{(lt<&sTs6&c-$keY78GbltB^@5@wa1)u=FSA+sAp z3uATFJb==g`ag2cdCHkRiD|1H4xX9)BEnu~k7NIMhNkiB*V}&xmYuJ{!g2w?&C@Lk zJ9GsC1fW!5Vo3RRH@Ut~q)r=q*J2*4*oEpBhD&X3%+Oy2ub*oMym75|Gt3ZVbrz;U z9u0szH8wUjG)ThzXXdOYQhObRk>;%=XS))u!zxlnr^r5mC)d<_!dMW*;~}C^&wpG> zT=n$vL&(Tu3V#gItBzjGOkh=cSZUv{E;5$ha6Hlw%?gr8>fi^PM8ayY0MBb;#bTgH zG(|UsL{(q*toFZl{!7J`YIBQ%*j>dNzX!#g1T5Yh0NLr{mP@bM*^y;sW!K1wEIm9P z0J#<@-%e;-4=n)^`QF&aD(pg6d;2lztuyouygQpyyOe0ps27VV292b^NJwU)%+QBw zM#*fbu9ap~dA0aHJ7uPy8%*St!v-%@2O3)wi2#=M0q#)TIWFL?&Repj55eQ!>!ZM!ZA z7UvIwt4mC)blvIUqI6QjUSL&GWT66Tj4v;qKL~Org^@QVvXx9Xt4%qSXi=HF$-NIA zB)w#H{WyzMWbwH!^$Y@uKPd%Bw@XY%k`M*_%@edvJ?3OG^aBTVGc|jO$og@3L;9Dx z57ku0Fsuj)hC{zr{L-(x`0;c1i(Q%I4n%?X$qyXT1`%mfYJ|<>hNax&u!_uY1NS*p zbjk4BGa%x|8W0bSJ1EAocHc=@r-m1K8#?XCBy(ZpU;li0aya&>nOgihD(3!$tF2J0 zG!8RTEM%oO5B_m1g}1Kuv>2rEA1&-sb_{n()eM+SM5iHt0QZmr>H^pe^%5AD!4>X|^&R%)SG}+smqgU+VSIvM{B$-t%*JNE z81Ht}?L8HQw@Idg-fen-YYd7-oUSC2z3)ZY=?I!q!`wl3OZN7aDNGps=>x!NGwpg5 zN~W%Mulu`1+r~al&)E8E{}XjPB=j9ZywUJ_B>Y>b0p93SDp^R(ssf{_8s+eTP)n58 z=!4@C&jLcZyv+q2(*xpp`K)XaLZQt#6USDZwdBN9oNAXK;t4ngF{?~WuQJ!cj)4fP zaJ?f>Pyei#fry9K_=@Q@7nRhpjcReX^Noi<)p6EIy`V18Km4XO#yuxrByI(dR;&!) z5c`Oz+j&_ou*}4m+se1KZ=fY#qnM}rxJKpCvo0nZq{tzl*~oUZ^~t{;nt2rac=U7e zRdjmI0S@iqcu?VKoDEpGngWD}6m>3W6Qs77YEI}+Z2d6~ITHdonp~;S^~u~hC2ku(sgy=J-4L#ilsHH>E8}`csfhkGlss|z?4!ejpt_Tjy zgc=TvFGN4iBZByTQcz;pZX~=4>hXt&j1^r_9>~3(ZD|2wYFTkU0`kUCXR9Ai6EZe^ z%&2&fTA;S3{bdm0VkG8QpZh?UK+-A^pa9h-t^GlS_QYD%2huovU^|d`D6|42l>Q84 zd-XX>%7>$gxd{JSU&9;==2AuRun#7?0d`0~h63StQa2&ZcD|Ji> zgpgVwGtk)oJLTZeCt6kAj+kQcSMOczd%SEU zVL$=3zohMg?wcc^qc3-SQ!_K!S4XQgdF!^Kq_=bKSb;zfSnQkL44ABbByHEacy&S0 zP@`cojFeeek+4z9Yi9vKl-&BA@}k9Qrqik&%vfG<@Y(XpN(lox=#%*YcD8~yps=v8 zrO(txT0TBL?fVA@o{ZuM%i$uRciaZgR$dq zk=5^r9K(T!M4?2%c6idzLo6T_Ntl5x*icycUMvTq(kpDl2ZdLy94C+t zpK?qG5gVJES!FvQ5ef2)q1Qkf@aD~%U^r}1h-nLC=-RK1-4t|9jcJFwySvTyQh!)K zJ~jc_Tmjwg87O$@+9|bb354?8f`b0EaOqslEDfvPOm&S|0<4e$_JS8=Ld4xMiS^qB z4%f+vvNJOkJ0&+m3mZ;6vFSdjl?K>?8}Yx`0))hKJiXyT0%$5S2V9Z=a&17GI}U7; z^slual-3|q4%k~(8xArN*z~0Jzog>y0ObYH3Ua0d)~%oSo43aOysGk{>pkFl{r%LA z`8S|ebLQZSQ`T!|aY<}&c&Mn@sX~Gf$%(ztJ%Au->YcEcvVj^AaREo^JXaW! z9^@OVdj3qj8B<^{Gay581Ith&D|W!LzogvaNNY<4%?}`FjH-nKK9F6$m-no;o1IrC)#BQN0xyLkMz%LkIl645n>;X{d*#R5O{M? zMfHDCGP!~mg)>sYrZVODeG%l)WuINyU2XLll?R1>B&4J&Q5+l`i9FzPw0C!PMR-f6 z^qPx)EKv_@xK78!G>EMd)Y4*Y+t_K|oN{~sG79282W6npCyA$prgp7ks?MEktxizQ za{}c0LI1C9ZPBrh=PX6_AkB!_*esygNf;>VP*PKSoe;|L{P4j(?&7hQWb*aU-nz}` z1*(`DEXx?I_7~5Ni~uQrVG)tMw{II4?}vUo#4wC|&Ho&ic)mNv1so^@N<^_)h5t}- zqCDK%`qI93T@fCWVcHTVW)L=ie6rgxsM~O$t*xVDjjeMiF$;=MNDvkmUqVje5jXK zy`gt+uj*t!UVjqdBpLo+>E^eOYC` z$DT>zu3r~>Bn$qN6r9?dK|8z9o#wgKtyGR!yq~3dGoYA+Bx)nX=;#&}z+%Dc;)RsG z7lxjTY-1kNuQX!K6W6@wC9EAB2I(DYrx4eZi-GXS{jfp}Xq4S9Os9J-uJcLmzyW;g z9#-4f8F8@bPF29xb7jdKTV=KJe*~*eGjEGoj8wYREq6{T9Sn2NYZv2+<}xGVM#hy^ zj(e&aogNHs^PX<->b*C9+B-|beerBgditkD0ZCI(slZ#mm%6mPY}zq6IJn&PPA;t9 zJQb@jd)Jp*w#9HCjLu7Eb$ZVUYQ#R{iUY|@N9vIZ*R{G`Yv79XiXZv=o*qs}7(^9o zB#ORU^I7vcIBYoe%2HhqEq&Z+ZELHRk&(ea4^mc?Bm|6kZ9)}xHXyTy-X3_Ut*JSU z5L5K{5p=b0WF#+5DO}v(Y{?5MP__e#3eDgHp)JI`wQsRwo(*goE;bG9W%E)@T{|`d zg|ppg*X6BPzx~*Q;lcX32djqWaGiEjAmJp+&5in<9((T3#%}LThf5d)pV#=KpoEc; zk%J3VN->z7F@-Lxmw6{jdAT*)oXp%gkvBT%iR~L2qID5upr_aL^{vO$AKI@@G{_M5 zd#a|c`OFY*0y9I5*i~Bf=W2Vd6t}#IZCP_#6c88B1p@N|IFFqApZ>h^oiclq&&AzV z;ygV)845b_&Po16CVMVjKVH&pxNmNr0rr0?Co8#!y8b8r?EJh^=c`w*K&=lbO|$~_ zFmqxaxG-`T=cT^u{!LR0(}IsX7D`i&^G~*oPC>0)K@Z^6j0K&``kjoS^h~fvt8?iC- zCC<9_c-3~`}_OD17!Bzv-VzVU)On_*LkhCD#|iMmnknp5JV&=`&bo%u;35` zn!Lo9Goq<+jQOf!Bs9f%0732AQEHDKUl70juiwwMaw;Ypze{pG2^YL z?uPE#If7r#;0dDOvf_OH{PizRr3Op8s8Q8llbQy|;@Rjz*S_;0%e?0wWAm(pd+ypO zgca#+NK^3lD!i*Kx`kkqwT30a+fitd)>qSb2_O0Smk)gI|61U4fj>nZJI(Gj`7{fK zbS#j9(cEQhUB?1H=bz(9fgkS~An-r!D=_d`s|f)d{OQIc2nT{nZ(`9y5c~@%1Oq1p zLj(|H#QXoB@_+rrvfobN9+yW&UEP>#G5qxDQ~89gc|0}*CC@vG#H6K_{Qhl;i=*vw zHx&9#aCWq%b#}PX#|1tYXq|2H9xc`vtLWjug_V*$eDnx`G)ylo<*DcaGok#or$-GO z+q1Q(`53Z&U2Zi8KEh0uL}zzTP2s&AA}~?L|F0%WdeES-_VcI8-j42X+$vLpMhBsn zw2a_xNt$43jMGD2c~vXV<(0pwXxcwGad~!V#KiR3T1qb_uL=xkuJd{+g_r-CUzkBN zLiIR0Yke9k?0NGOo8bz@0x*_i39R&ZPk-;Y&X(q?$#H7L1#`}e+}h92HUz<1b7O$K zBEi)u8%*9?_qY?wJ+H%+@43JJ4GGpB9r*C=kEssZ{8y_jA!=Go-bPuu#r)gZ(!%S_Rak;o^e&OkVZq0)S}b%%2RcQ8{Poq6L#{LZME~#uXXjLDS*j#vRg*9Tj5AKjMbEklx6NuyO?WXL2z9S zQL>(e!NH=fwaf}HcCo^$otP}}jR-SZp&Av*2hhH`P?GD>406grp#^R24raMl>C3gU z`i+Z-{<8y?rm>|}osvf#WKh%08!}ZX`2KFsp9@c^-zT&AT3t116ESGPt8ddpOe6#C zyBF!m1>#dBJ&>30Ee4^vhEfzUYx8Ehddh2 zd8*~=TA3*9Q0#YpYPH;-Qst*K{N1*bbv|DM8GvoBg$=>IeGWhBpeuFbB~LyWw5;70 zcXOd=@*970YSK;qT9RUK3SyO8PV;XrFE8(=6LVi@^|#xct^?Ohy>VANT`5V3jgL?D z{Om}}&#yU8aNP3PF;DK=3L?I@7%bW&?M7|UWoldlr#i2fmWZ{6({TlGD$*qS;(Q5lf7k|$x16q0m~0Re*CDko!~p)>7vsqGYOh7)8f9bSHB}| zwW2B%2p0KMQ#>Z=|EIji)m0eC7 zz)X`r8yoLr%K3&vXDG#VzXSICsFq<-3;LjBbtEskxN%p$>1ftFD$A@VF4oXg%<9d= zf}^@;amGZ2MUQ<=yyRq!!&c|TE9)3Lyyq3t-9MykA$Z#H_9N3^n|(_##4BKkEH*3Ue5XETO*-iH4!rQo zX^6|PY7pj2-06^sc4zyen~&JJoDy_ygQViQfXl`zODWX5E`JvR5?5^xcMB>**S_uv zJ_)TlSU;{qPbjPwJHtd5L;3H>MYB8|D>Lm9a9`IxKb&${9W96-E7Hvw98{@LDA6r3 zP+jitH2(m@uKXLfy1O}9Tkdqz7G}NHrnJC23~hhPxOqvmc4!Pa!w!xSIlOeOj_Yo*3|gM__qt0yJ!Bw;r%ek<6$5k zqpE7wT5)vqiS+91jA>P(*TvygKQY|(qhR7#MpjwL-b6ztlpMQ1*FC1d6(bPEij)SB z2}`={L6UOa{hWi~*Gi$L;C}M=6bj;A9s;N~DQI8Ay}`Mds&K6t9iMnTE%)$h$UlMZ z(8CjgY*@LRSnn}qq65h!&+qtd2b2}l(1M6%d`tL>+ULlQcXL%`V{6X4gx0<^5Ih(} zdp)zCB^i|XjH&(xmx*HSn|a{urN z>DCoN1#<*1y_v!hc?cyL$0Z60A~Z|t{FB}Q_+xND=sK)~thPhGoRfoH0r2#GNq@AI--W*DhJaP~^_5Q{ ziUq?3n{&)NQ2YqnXsZgri2e zUk&xV^2!npCoK9vu!QH!%ZGZ8%(tn&$eI|{riBd}VnVf%{JXMZfO8ynxBL|vURIoR zD3C(u-v&QPYaM)f|L4T+R8Q&EF{S$7w?V>$4GvV=vV~Ezaq6>^JEEwdRt3~{pws5o z@lIzbxguBq!lqsFA;fYH%~tMA5OnhfSBy^8k7+}005F7?lNrBsRoudX=4rxdV-0+s z)$b|idAd{-JYd60m!uR{mRE=tvg2#G3c*J?4Y`(vF; zNQcOgFvEk>;WUsE$-!u!8Kn!DhwgV$A=?5mNvAY_Kq4ABY<2!42%NeaE*9!<=+U+= z4?&s-z5K|!WqB<r~3Ja|tz2f^S`);V3dtTBG280_|HYcHYW) z)p(SONu-6p>Xx%UkgkmBf`>9n51m#Ja>sZb3Ixx?pzWCUhgRRNE;_yfA)w#^X2AA8 z97n!;E@9}SOQP-q4Od6t(C@88 zLH^l*rqlc#`zsLiQeJ_dcCjl-|C03ssPfgb%upI_g}4O$OHk{a_+IGH{z;+@NQ71N zkj{ew%}%aDi?rBx?=V1NzT|LAn3y4fr%faVGI$SJl3!zyfBw9)T@Qk$7bYwa^Ya%p z(oo40sPf%+ZPN#v(N8HY__3gQd4CiGr@`GB&zu)EN%};qQcz`-_f~ARZDcbFiFt(R zU!z)xIsf?0x~_Hkc^s_t*w0;57JU6_4w&ioS5-CXXC>e7$95UqufI!te zdtwyi)-RJ)$fG$bex>b8I8p_-B&M~K%8UXqPZ;$D45BN-z^7~?wp9*%Xf@RSoA4O5 zr|Rcd6@NWm1QWA$D(uplCw*nVFxgVVpb?`p_rbt6+n3j@*ZqvSk{t+xE-EY|N3!0!j_aFiz4E#Zjt1#rYj%m#7|BPXb?co>rMwoQpchEACn9*CaVf+dMf3KbQ~U9&=Y ztW=GURD8JvkhI1yo}ccD{XB?)v|LxAdAG5Wc=ye$oeC00NM}a>rJPbC>vr82Ostdd zFnD4{$HMfPod-_)6f*LBD#7Nqa{FMz#+}KM9xHtm3|GK8tJ3ikUb0*M4WhMdS??vQ zSy}H=@Vhjf6a?R&dD%JSAmDds1(^5)!-#(+xAyk-Uap)4zvBl0%USK1tZX)D=>1U9 z`DMKHlOoqHmv^J*D;*>i<&>x{|89TyscMC}xz;efpUZ_kjxtt&>)3Oo;RU-my4JOe z=JJ&*>RZG`y~UTIc{^g-7z58Ir(KdhLa4UZ>pWLT?$d8fG8H{H#Vl2aDvz?At=wl| zVx(_F?SmCLWeG1g^-R4bA&49^4>x3MX4ye}a2K?^qkz+jK~UxuY`nZ>sCywDpH_x* zI7CHt`jUjTTKvu{U6z&A)&yp-Nn{QEIemA6Fble|kE2BP-aVx6(MSDDdaYa7^Vv#C zl`pKYJO6wWOiYuHP>5e0xx9Q`l$y9NP10~UTWL7`LEv=?iX4Fd zRw5+PgYU>W6pJR*VX!};J|@x_!$=&;ysFBSeY&q#a0I+Rc7v#e?URd}4t4ZBmttd6 z2YP$e-QBByEH3t>5njHmI@j!5W!!;xjs4(u&GhXQ_rx7#5(o-;YPb!-L)5464=dEIhM8B+kNUVsxPHdN90Ar$6miPHK&<)sdCHQCl##aS z|3bAK_wG#~s=N>lTXE+7F{xhN9^+v3djtL*lN|M_aQfBmG9bNPM@=##*)A4Vt&rMU zpv}qB_3dAMNwLw2g z*RMFq!_Aqs!;2eguY=?=WvI?mQBE<}AeC>E`*#87|3m-P+|e0Itqa0-SGe3iK|c&bn*ld<2!61dW*X1q|~0T`&{k+Jg*>O%+?xP8GUaucW|D zoyEdU!!GA_Ui=co1`#jc+s>9_~qa9$w0`_B)& z-{?oh#E=%WLgoReOEA)^iixam(Lgd_tCIO0yX(OF#X zn=Apx3t!XBHs`9gdxUr#%UY#OWwsM|k^UDPDK6m?+84J`ab@NXD=N^LKh_$7sGDR9SdU7Ctsts4aI6c&EMY}z`;j=On^=l&b$ z&8f|B=XcWGUVc@3``GyR3e>08M+`+1)lUsKB(i>7^$Np=YfaXvc`eget*Yl;Dheoi z9W6!KhD`Z@g6K0tt0no&t+b$ax+^$R0@FXg zAst%e6yoy%sRK!0LpWLQP|sN&Z@3Mb=QJOPyM0^z{;p8mhBoOnv}J9=O{?!b0H0K{ zp&c}&(d^E$fE{8|-N7#(IfzHgJbQn&;B>P&#Pv*#O1s+h0T`H5wsLHF`Sr#h8aZ48 z00Z0s1mQ(LHTmSzq4aCZ6}DX&1aQmba2iBgpxb77khQ8$Mt{##FrIhTT}X<^@8n5% zya95LVm94WsQ|5HJ`pZR3JrM-XR{s0i`O6I5aq8x47w|o4*{_vp}>c7Uu^1;hg1%> z@BOf8%=%GIbIgK8Pr3DqFslXiBwDD2F)1@kp5X482pfZD04$mJ5|sU|KQ4}Iv{-j@ za47wQD7VE#_yx$Qg4s%HJ-u}M?vJZ)Z^Y(YzrE3>BTz_1_zu=;`}978piMTap-a^5 zUXMG9q5-}@Nuht|{A6JDw7cTeWbX#zd_M`W#}T2CghR8RB#@%}c6y~{q<~XKy&-94 zZq-M?TXU;@f$zEr2b0|B11#1RQFG^oWjqVj@WrxvjGjy zYv)VhyE|2ehefZK1ISc)Pgd5Q#R$Oe#88JxPJU+zysB$sQCTpjXP6=PxZi!pW>g#A z$K02|aInTw^qi51+S2_A1brj$?}|`3nloHk0mrV=QRM+?7F_ry2y!Y)kDL-*iO?tu z)1q%FJzRD@>vPx4~UdTE$nE_;D zq`&t|4i^_0NCHA!BPeZbIt@KR3XaPT=kQ-9fXqc)WfLV00oi(IBE!wj2(|l0MI*La z;{QhNRxes_MRvBxzj1;Ai+(x>gogUH&@mnsWq|1+?XCc9>9u(8&B)10-Udn!%po?X zu2$n*09s2~^O#t66yf~B0e6aH43nnO{O;24{Du=Vgwg9y| zCIEv32^cYDA5H7|xVwiRa|z$68U;X;8{3F4^EFWZImQ8;^p$L7rwhZpeGFBjTz`E; zevJedqzv9d*a?epj~`|Je0sQ9QK`E&uj(ZvXVe}fa~ zUMb`^Ze)Xs%)#c2E}hTzga3n2oIPfHkAa~x_`|qie6_tG=3&q{G#aC3lEvb;L-2N{ zpzojr)c28JX3l3Xtoh^@mA=y#@_O{?TF;}|={grdhuQm_+NDxJno|V`>hx%<1cmac zP^gIm4;YZ?F+kN;HMK1Te45c-D?fmafhWV_Zanzj8ZQ!Z0ceMP;w)-A+f@=8ywtvg!(_ zv7RVLyn6LYz-!;KNT*7^tgNiNzd!EIlgE$M>m_dA&OlYIUcYgJotwJ^iOpqHA?NZ- z*2?NnU?GA$f-se)3LgbeP^M~V@soM*B&eSEwgIM8RYcOzM;x)O2}@y_L*sC z=+GN7#+b;+XXyHktVrgNj%Q1C@5~2MIU8mS(3W$}O}c9}F+JSz#r56V~_RvV4nxGXjYd2zVcb6cbSirk_q$p`0 zsesgf`4NPd1ZK`XM?|EgT>a5|a&}9k;=sXa0d-WlGa&%6+D&4W`A6fDp4QK!04V^> zb`)Nlt0PH)ZYz<2p8j$aQPpH~=m#`F_V2AA~ zws~xPV$0+0h3@X|D4-%^$}{d8ItN>GhEW2ZyDwwg{_H<_Y$@t5AMFFwilACjW_i?Y#-5_HS--ZLx3>hJr zh?!;+P=G~GY^HOem>#*DhR1Z6PnR=pv@I=^G>dtrr0^AQjqv%9Fv7!H#R!B&z0`rU zkoS~srKkp@j@{q-d}-ws;mZ6hS|XDzD64)m4P zfCACoVfe^>7Z2}yOpH-7y|Z&82L>>Wm2_ZGqeqExM;5Jk77*6{*7feQNE!m2B6Li9 zra=pcwql<6pPyI_mD<0n)JpwTBvN(dVz~xjBz!EaEYH2H9mc%b8oUd6?}EdX9u za*#kTke86A5kRPGq*RLo@`eP2Hg!18K>@WBUP{z{oKL zgnH&w7L&kwu+BE>e3wnkbKx?M)Nybr&tmetmSHSL`K5$zsLciU5bf^v07YE-8VWw? zFtGmfiRlnQJ(=a572_{oRL6^@Z=z5x-#Qy~q0R9R!953Y@hmC6)gvt}LkF#LUzmv9 zcZHxolcj)#9hTx`=x0?J34?@fEIXFGynm8q9vKSS8Ct7VN7tA{TejW;gNWlOi9zpD zn8xb`xD=5>=?s)pjuTc5FBSHdsT%yIs%)mmv63G{ueUr=PNu@!s1uM?TO&qu7MwHh zZ^N&X8KVe201#`=F_p1e*R~qFyV42+Pi8(xZ`83)GtK9Ak&fBE7||uG<8j#PTZmvT zCgzTy)$Q}S3(O;yTsjQyF|#xDI*PMzt}`~o2BI2$qjb~c-Pa)s037ZOD9rgRe&d5_ zzn-GvlDufF^lcbA3@XOk=9z32z?%B1pYy=(hH~%m#v-z>7|eRRzg{72`kTUFTd@qf`^AnZ zp3YBO)Lk)Ad`d6~>)RdJzJYJQ&2tNB{UP|qNu5f28_#_J5;0jVRC?{H=u|OH<&tc#; zfj~KQ)qDlHn{7>SizE)uLz7y+Ro&+A{6v$I!U2bo81?S3ElTx05Z>g4G~<76vVqOr+|5(926?; z7Yr77i#P8K9w|r3&AwIL8c+pEznTrF3SfA_{c=0qwf`QnH30dZd(0!|no&Dx+ zQ8NZh4#e|H0A2epr&v(83A`)@Quxx-VQ_^Wz{8sM!kwm*o{Yz}36ny`L~7YLA8hxF zA+E7xc?tMu%Lza^U@bWP=&Bl*7oK_HE+|z*051(T?+axvOcGXjD#RNMbbrKZ{W&G>lHj>wS9z8DvZYRHLJ5Q$_rX<4m9$VFpM^=li1Z zo6kCLp077}*;gOawMwT)d>|2Zek^+7lPNi0?-ms%0f#78em~1oV_DfBMnp(vZ@ed& zM{_!{3l<{G6jnf0sh~tibU)(er@svHxm~m+lshbmW-v3m<-mT)f13xWnamV(5MyrBqm{SJOpSLxFf{+_EprCuR z=>o#=13{o>Q;$|UBVwXV0HXC7VvLXlR*|OdS0k@42_E0TqA#@hN($Ec_cB$3RDkEU znWk!}EW#v@)5~Bu+ra;(9p7iZzjnGIyci(@i7bA;WV%{oDuZ@!wE$1Z&LWwiFOi8; zkJT4lhdCP;lnLx+*qe?shF;KaKfsZ~6lZ?CN02dQ0kjUHV;_)HKzTD%iB8-br1e1~ z94UGp6|WOBHWr!sEeXsaMe_1l4VzIwocYKPV7%pZ0HP`^2F8LY401um9l%vh0CYx< z=KKv;DE~)Ye%Lzrt*Gks*$tXB$0rN{s?A(Ddt9SqzRkQN-36)_-}c;nh~{ zBTsMc2 zF+tep^Qj1cTH}(EIOHyqki_5lKX45zxAqs$o=Mvz_@mXl&fPE%l_)AYtl7V$N%}Z& zuJkeFDngwoU=_tx_w(wPFJI)MfG34X4iKW);;=VwSp7F%1O){FGeW^WobGgLE=$** z*B$?2_dS?mp5b^yc@X;;N_B<7h4nhG!W>b@JCn`64F)CVkGtHF*V8%{a(DGU{@Z|3 zooHMR>Yh(#Yv#C~o5te6qnDNyK(R&NHL?s%vd!p62eBw7qyz7WR+`W5+sP^$Ewm5d zdFsY@N)?rrm1Cc^@%=X|N-=HrB@*Gp#$rPU#Y@(~x+f0UAb zjkBK1G`^^vu6J+W=Iwg{H_vTG#wuW4+FgG4?p+L+ehJ@G^)o>L^8ts_T!Bftk7^)+ z4tsv2(BO_C7f*F6q=6`Eh4um3Jy?v6_rPKV>t%R%si(^1%jF=TzXP%diXWox>j~xdrR~WK{n+%~ zKMtLw1fPz@-o; zn<*{F#)dRRgK*$@ZF3H%ReFKq>%+^02!p09)2^((Bt#r1SZnZt^X))PMh79tWdJ;i z={ILJbR{qxJ$6=EojTRYnt|UW1g$N}A`C=y_5y+aKQ4i9m=1>sL<&r0GMRcoA*?43 z^9Z%Pj*U&3r|>B^W0k4mH$(l}Fn~*(z;B6yX0nDHQ>PSF@!XF_IKO{8xQgi1+!) z`BpolOcp57gDR7d{ZCt!)_5}u1^s&26fp%lA9`H8M18XR@H1hxR=7GP8W;ps*-&z- z|H~_Q;azT~U@AU;G^Y^F?Afdh6+hFv3k*8AII=zQ*U(06AQl>cq5moPvNrxH_>#w~ z*Jij_EWU;V<-2BfS3M8XvjR9lPy@Vnr{`_XAoVn2tegK5eiypAfnRLKBNLO9BP8ov zRG{L$g%D|%qg(u0&AwofZHr*h-{od$`L(UJ<|dR>>6$l^9}DCxAcuKh#+lc7{v0{@ z2^p(JsWb~C1W;!e6oG|Nq75_JB(-)_U7umi^MLKd>4qNo^~6)HT|k6Cgz4hO`I+^A zl~u#vtMUcM4AC?{bK@x?SEEWIf0rfg*{t{GU2-W?pmzGA@2#PYJTZ4`1Xlu(NY(0l zLGJou*6Z)x=g?F4ttKQ$t&GyLEvO&OCNP2N(*x;_<&XT&kMMgKA*?7c75~L!!Yc7? z0H=vPgEYI$qYeC?htC@=5m6Vu6gFE0H6QjZYCNOV^RqBF|MN2i|BD7N%h`)}NYh8) zwX6pbVTI>+KIjzoNfg&y%lh#7b@K9EKo(OX2?G ziJ48)8k3zgmQ*7-pewp}VUSKkX0cL4_(RbA3mIE|q9_H}gQ_rw3YA^HM9*E{Nqc z78HyH_}0VJ)fiU{b%SksTk%KlowdlHI?A2w38r#iX%!5o6Arh!@2;rRq;vTaZ^P}@ zHBu-*I=?7#e{8sa^wD{j<@ah5*WsEAF8}7vy&#x?0dO%G2kswEsh%AIHPM3!i+)hH zN-!!eE0#hJv7}!-7JBf0#BI)>z3JEbz0Xi`c9oN#1Bwq9{J z_N9&Y&wDzJUU8GuCv&-J70aa9j_u273X7d`z#Q~)#>`z1u4PK$$XNQGfQ1A2$T;^( z%UvR@etFNW)MP$cvO$9rmDqZiS1G(-2T$`U6tzD(0BpnZ5_WBSs<>(dEs)%te(GX` zPaN(}3h_Mi}-o)K6XETkH8ai00sX>*JZ-jTS+p4V&yS{A1jZM}T->e8Pe@A}iRAS6Koe zd-d~^_HkJfT;Kpy09Xf@FwNsH9T&^c#m;&>^4e1ZngV7K0Y2Hq9;^;`iDa*yZGlL;%?Y?-*iGZcxAMvW zi?=R=280S6T)C}A#wXJ9z!g9vV&wh=?(n^=#1!X&4q1`173(eQ?<CUL9k|)7kwn*T{^g7Z9rYgjHZuc#J2t|uw z_^^nAm0t-dy6G*f%5*al$`-RP(?*(`1UyRRG_Z)&fRDskUOINpLC!e_uMwn)d(`2g zB`b7PR>^TL7w4Uq=p0&H1*Lk1>43ame3m%^Eouy+~nl9bByMLxV$xK0%amT?Z&C$IYg`4o<1T4J!tb5~`%KGE=W*@F! zHK`0)nKOJB5ifDBzB=-4L(uCXf@bhfI<+r6c%|iHK5h@ndzdO{imu9rDt=NH@a9kx zhY$gn0wKxQo;7*tw2zt``yT7|IUMY90+$R&i5Yh2GFa8>+mM)G6 z|6$jqnKggeb)w(Q$*95b+46?YX}{ve22wZPjV`lEhU4hV{gX48C1}B!hnXcwCcAB0 zE?h{69H?8(h~{ZNl7TR{)A#X{jyzWRl}4zRYA` z&s2l@%f2A*;e#Jj{4xH<4l|M4FUf_hR!5GoRs0oU*t9C+zapYFp3978hYekXTA?{ z8sAs6w6GWg(G4RPy86Zsk2E|gunzPEX|{=EW6bR6ik8vQW_ik|XkFPFokng?R= z8e3kWdv2>QY`v_9+MDJ`;2>b!&$P98;ma&kv3FUpzTVA=M)W3Q01ybIQTEgYK0?6Y&I7Pfl%5&jpt`Hr*&y3KTOdGHQ| zj8yWMb7Ag?>ZKO{sCOH#s&#%$3a7qTUgb-N%vG0{-Z#Kt`aY&KDJwh`9xF?APb}*= zk5L1P7Nl5vXgMH3tDz@@`p*xsO(E<~P0@4uTyT{K(W(m!y^-xGhvf3$A2 zrPjNKHwu^(LocVgC^y-#+YC7G(gl{Y{_3VG=I?vG&_p@&*}DU8<&WQ#$Gy77egoX9 zdf=I`oe>nlF?EYgu7Q}^X}7|rrB99n*}uSZ@0V5ED_qe05Dgg5Xp6u9((6(u>S&=Z1lH}0XKKxXnBluQC&0JifurNp*yD0a|$EyV; zW1s;+f5QeegzPO3j8|F>3s?@)%OT6ndajd^eIn=3v>eHOMq7MCll-R9aPor`0k4xd z%94-bxzT%!FWeh=>-juN%lfUCyFNnk4W8Q&G~a zvv!mt{@xRHYWwqt2}Y>>rFedyNzNvid9{F!1M@G7oL}q z%lZn<9glE*2mFW1US-E3&8GK2t!lGyHrBv>^(6&->Ny`IEiEmNU<`Qn?BWbNCOTTp zOuaNCPb~+y;N+I*mY0_De9sQ;i*KManvMIJ7#|BI3E0HBZq|V!n_PqYt@qmnD^0(O zHlCy0!jcW`o4@tO;1S0#@~d65_kFykqp_jCvX_|zPb>XN+4`?)+Q5ISrhzi%Uz#nF zSl(VdHnWNpe!4S7)(Wa+zeDK!ST96Chsad5otlS7t+M2~D@JGm#y8Qk^$Iue z>e+zbFJHPe^nu}#Vi6TOk73xCi;kiG*o2K!NnZ8?=w5LrAh|g|y_}fN%b4EGW363% z!Yo#kK6xRnyK=p8+@aY?Bou*rjfHYqwL~v3?T9+MvZ(**LEey3>%j2_!MyOCPiC=x zL%z*;aa0!Y66S$lyncTQ`O`R}2`YS@;WP!b;$EPH>Z?;@p8{GOm5Qm+xeUhroQ#kC zPotf#kDJBcvNHh|k=g+7Pr>2v)9!wq77?ntTv-iU)38vb_>ltp5(ajdpsG~&Yy!<|K>I`(Z@{}8}GPQDU9KIub*G%%laf!(?Q(zO>yC$!LQ8?r=PDCB{^7E znY|yfD9@EW-B&Y}dw^Sc1FJD@E*!#|&H6O#YY(3NIWTe80&g0qUI^LSPLI2M3J$$} zvf8iXFy*6GAUykltM2i;Hy@f$vgMCC7Kg#o!sWpt@Q{7vy;0};`ZvhiR3{%8I>XK* zWwP*TKVbFx`hWlM?9Nzf-Lq$rz;uSO%K(myM7X7{tVM&5_BaZo3<~eHpuR&BnhV;h>63LigB7S%Lmfd%*qZ;N~>Lr7Epb{e(O38Pw zO+p;94=n8_86(9hPK_YLn`_|;P#!sqL0BRafW_NjHMk3&;wY!uDqaXaG)>|gw+N%Q z8PNMV|G;XH9(bd}gmHAMNzssG`=6=|mS0iU<3!=7iJ}^yNdpKCK$DMhpn{O6!W_KGvASwywF>IOSR=N zx22}^ai(u-fO!mbu>dO<=uaSnF3ug=>E^pEv9Z(bL8!;|0evpVJILprfNsN{W-;h4JmXUzwMKfp@J!__eNnobo$b+DBQ%0o};^H-16FE^&wsc)=TdtIE z-(>ZHy$Ftcr%XA6Pkt92bq7J_)?Yt%*iX?%CtB~j1H(>c&742lv~cAP3Kj=oqKbpr z@_xQR?}j*&Dxh<@ugzrSlq}{&0R)o6<*{BndaoM_36Qg8RM3@p#|U z{GxzliYXa15`Jw!paCeS{olq0il-88@{_v0K64%Wh zLPW(Z5`O90$VI?6`JReVo6JD|;T$(BOUNa*JQA7M&s?mKiM5_8js#^35RigGsEAS= z8k8q}z6#gjjpbFjTnK;*W%R{YmuFqWR! zJx1XNUgTlj_7PX1GJepRnsHk5^<;?xNIHz$6C21FHlX~fzQ1vR+8oWS6Gp)>Mm?B- zYS{Art3^GOd=`HT(DMg8A<-JP6VHX={Qj083*uC$WwGRXn%9@PTuSQKW$nuIX z=6=w_$G{*xpTyI)5;=By46L&=<*ueF9HAM4`-DlOp4$ z@N&@Cs9DGZx(4jnMT(mI8jatCPy5vXU+3cCK{zPt8vf^sa6)QHt|9|YPHlSM!;ie; z_q{5I3X1J?zkS~GYhvEEowa@4OwIw6YS(lJ|Gs-oC1aK1hD-j5CJ8k$#Y?9y6{y8fdsn;sm%UwK=)q<`)28_6_IZl=3$iMKbev$)Jiw`4(9|6d1 zs^c*yu`(osNT#;>OkjG4M`AXCtKZqM_1?z{u}J+f2gh-)Ou0RfQj2sIfbB8{vPhATP%&^c4s97L13X&7;yr%dc)+Q7%b@lcW~dOqH=< zDkRy{`H())@FW20&&iS!)xBEs_XYO*W*4X!&ff2Tq=$He4ocScM zi$?Mf@-F`>Ycs`55jPoV?wJ(6KigNs#PD$ge(4dwAI5q$t_0->HZsY@GH%H~89SIW zP@zZUDCkz-OcDXjX4MYy@7~=>Qo^51%_Daj|D9REHPYttV}J0#$qh{{F2O|9>hMn@ zVE6fPTw>Z4`k~4xlZ-&vJ_aaXz|$rzdhTj!D(4pQ`?shJ5l5I`wPki{&iCsHF0GcI z^>!j-&2U;$#KNQ~Z?b;rl%J_zX~-q^vUK>sH~IOurHbsyxclMqS1!F)!T;oS?En_9 zg*qk8I5NDK>pbm7Ut|nsFNz5XcpjPzXGzuiG+?#Ky>iCZNo9|M>GY$D6~0k&&@)GZW|zj*Q66EGM0u>Yj*to z0}sWK111OIJIr{@+XQs$`iDb>fe=A!j^`ILH)!5e8=IijA~xlnlXKwGf8QXZ@fLV@ zo`OznOfT^yzf(`@pUoF8^(4dQUw~~qB=RI=fWZjZl(Dwu{JbC2Kps$%6m)ziJeU7? zlGqZO1$LxXmROpiIE=C-Dy3@`Xyz}W6Gk%#Q3BI8B=K!krl1U)Qpyx4smFHhGbn&Jz6-ox18*J7t63=)pr-*Jf?g{v#eX1Ph41j}{4|7iB=u0VV%lkce ztr;1&?PeRF1M_HXYD7fDcrX!F{&_N}7Xy>7h8G0CRalQr3AfR9zxK5)5MM)2uMo3) z0H)=NRZOg5a^T}XG*X=b8tH#0mJX{8Hp4c$l~lA#C;!LJiK(KF0*=xx+5dN6l^Fv@ zXymi?e+~tmJ>)lUYMcFM1Avc!apU6RdgeX^n~WTlu2Z%Gw_=|6(I%*v`y!UdOAJdu z4K+cN0&HK>@Z23oC5l-o5eVQR1u_w|t1}HXad)3*h6Z_(5D1fngVDYKPO071@P{5(3I}t0$j%C?)Si! zJ(s3iI2-XWoA=~{nft%qyeAa#6bm*_hcT=EXBQG8P4Fh*;(hPsB7_=mU>2qB|5#Z3 zs6z#LZ~!cDT=X5ubze#d`l!9(0_(2PKDM z*6ZI!E3L>!s+#rzKv4Fs$dJz%Mi-$3y2xSoaAV}55%?WrN>RZE z@Bg;dUt3aCv=o$1i#Zxo<^wiazJ@E%_AP+c{y*-H#1bIzs$=299k5bA>R*N+N7V`6 zhII-1C!oaqbzmSKG_20eu7ho-q{M+31-7P0(hp{{CFbawlV)dQ8$zF-kyBE#C-t?E zqz?RDnpH2i41f>eqkg#Awu>-{r1#!-g>Xo$-zHF=PEJlR8+1s)1+_YOvAz?)U@+_P z;*<$94`Ap`n7c6EmPSqYbqvhjN3Hi6$EG!C$e_Em`42(kyEf=C_`CO$qr8gBhp4Ei z>({TpaA%8aADF=$4Njs)O&0|z(PNfZ2Lbr;f7lf&qYVf|qX-3x30ooH_UQY6nmOB_ zrp_>o7p7ax;$V(#5jvVJPF7p$n8G2jwr-+Hi{K2>j*?R8q+kQJBS3kpWZH?wRANRs z$jc}TjcChiV8yNoEyHXemXN=oZRQWpXYjh z*X1c*a{}7ik^ES{KQ1l~0Fv*MN`6&>(*$&o%iN~9EWNm$&*w+r@fvU;x|c0n%AfG5tFAKwbb-zKw?<`b_$T;f$}>UE179hp`}p}J$>YK@qIl1Y zN%;|N)%8MJ(_RMP!@Xnljp`zYA(Lw;iR&YeRsdoDUBUP}SWb!n{Tab<1(CyWV*Hx} z4=t?{XGJ8OLxCeN5*D$%e@A2Br*07cGW=?(`)=CHZ&Id)!sr?b*H91y-V)u6T9u!9DeRhF|0#yWd|h|$+$R90pD4|e56xSlftHNCi@rypjCqR5^K!&#ZHUbV zC3I&`>KC=3R4{;qoXqR73#HY|W~6fAa(+FEUID$WiQ7FVUdiWS^&WrBgmaWXkQC2YM=BjFf z%WYU}3XnbdLTOM0N|<5IJ38H8C5hz?w9s#htZMddY~Vr_kZULj2`sosr#A1K9iA5# z{2<%H(Fql_^`{xF(iOV^J-!_pK)}D)MxsjY7u|sUmSwu0n9+Fl&kRjSN`K3#z#|1s z1lEZiSAnya(UJSG^nlNOW%4kc3odE>sdb;tYXfmSt;^hY2+De>HjG^tO`QS^+<_^3-p>sTfL8@Bh zfu9M2Y$iIc;Wn`C3iO@pmH6kq>c5Y=|6#P9zlNo}AwIP C(vpe* literal 0 HcmV?d00001 diff --git a/notebooks/01_least_squares.ipynb b/notebooks/01_least_squares.ipynb new file mode 100644 index 0000000..7070fe6 --- /dev/null +++ b/notebooks/01_least_squares.ipynb @@ -0,0 +1,1377 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Least Squares Regression: A Linear Algebra Perspective\n", + "\n", + "## Introduction\n", + "\n", + "This is meant to be a not entirely comprehensive introduction to Data Science for the Linear Algebraist. There are of course many other complicated topics, but this is just to get the essence of data science (and the tools involved) from the perspective of someone with a strong linear algebra background.\n", + "\n", + "One of the most fundamental questions of data science is the following. \n", + "\n", + "> **Question**: Given observed data, how can we predict certain targets?\n", + "\n", + "The answer of course boils down to linear algebra, and we will begin by translating data science terms and concepts into linear algebraic ones. But first, as should be common practice for the linear algebraist, an example.\n", + "\n", + "> **Example**. Suppose that we observe $n=3$ houses, and for each house we record\n", + "> - the square footage,\n", + "> - the number of bedrooms,\n", + "> - and additionally the sale price.\n", + "> \n", + "> So we have a table as follows.\n", + ">\n", + "> |House | Square ft | Bedrooms | Price (in $1000s) |\n", + "> | --- | --- | --- | --- |\n", + "> | 0 | 1600 | 3 | 500 |\n", + "> | 1 | 2100 | 4 | 650 |\n", + "> | 2 | 1550 | 2 | 475 |\n", + ">\n", + "> So, for example, the first house is 1600 square feet, has 3 bedrooms, and costs $500,000, and so on. Our goal will be to understand the cost of a house in terms of the number of bedrooms as well as the square footage.\n", + "> Concretely this gives us a matrix and a vector:\n", + "> $$ X = \\begin{bmatrix} 1600 & 3 \\\\ 2100 & 4 \\\\ 1550 & 2 \\end{bmatrix} \\text{ and } y =\\begin{bmatrix} 500 \\\\ 650 \\\\ 475 \\end{bmatrix} $$\n", + "> So translating to linear algebra, the goal is to understand how $y$ depends on the columns of $X$.\n", + "\n", + "\n", + "## Translation from Data Science to Linear Algebra\n", + "\n", + "| Data Science (DS) Term | Linear Algebra (LA) Equivalent | Explanation |\n", + "| --- | --- | --- |\n", + "| Dataset (with n observations and p features) | A matrix $X \\in \\mathbb{R}^{n \\times p}$ | The dataset is just a matrix. Each row is an observation (a vector of features). Each column is a feature (a vector of its values across all observations). |\n", + "| Features | Columns of $X$ | Each feature is a column in your data matrix. |\n", + "| Observation | Rows of $X$ | Each data point corresponds to a row. |\n", + "| Targets | A vector $y \\in \\mathbb{R}^{n \\times 1}$ | The list of all target values is a column vector. |\n", + "| Model parameters | A vector $\\beta \\in \\mathbb{R}^{p \\times 1}$ | These are the unknown coefficients. |\n", + "| Model | Matrix–vector equation | The relationship becomes an equation involving matrices and vectors. |\n", + "| Prediction Error / Residuals | A residual vector $e \\in \\mathbb{R}^{n \\times 1}$ | Difference between actual targets and predictions. |\n", + "| Training / \"best fit\" | Optimization: minimizing the norm of the residual vector | To find the \"best\" model by finding a model which makes the norm of the residual vector as small as possible. |\n", + "\n", + "So our matrix $X$ will represent our data set, our vector $y$ is the target, and $\\beta$ is our vector of parameters. We will often be interested in understanding data with \"intercepts\", i.e., when there is a base value given in our data. So we will augment a column of 1's (denoted by $\\mathbb{1}$) to $X$ and append a parameter $\\beta_0$ to the top of $\\beta$, yielding\n", + "\n", + "$$ \\tilde{X} = \\begin{bmatrix} \\mathbb{1} & X \\end{bmatrix} \\text{ and } \\tilde{\\beta} = \\begin{bmatrix} \\beta_0 \\\\ \\beta_1 \\\\ \\beta_2 \\\\ \\vdots \\\\ \\beta_p \\end{bmatrix}. $$\n", + "\n", + "So the answer to the Data Science problem becomes\n", + "\n", + "> **Answer**: Solve, or best approximate a solution to, the matrix equation $\\tilde{X}\\tilde{\\beta} = y$.\n", + "\n", + "To be explicit, given $\\tilde{X}$ and $y$, we want to find a $\\tilde{\\beta}$ that does a good job of roughly giving $\\tilde{X}\\tilde{\\beta} = y$. There of course ways to solve (or approximate) such small systems by hand. However, one will often be dealing with enormous data sets with plenty to be desired. One view to take is that modern data science is applying numerical linear algebra techniques to imperfect information, all to get as good a solution as possible.\n", + "\n", + "# Solving the problem: Least Squares Regression and Matrix Decompositions\n", + "\n", + "If the system $\\tilde{X}\\tilde{\\beta} = y$ is consistent, then we can find a solution. However, we are often dealing with overdetermined systems, in the sense that there are often more observations than features (i.e., more rows than columns in $\\tilde{X}$, or more equations than unknowns), and therefore inconsistent systems. However, it is possible to find a **best fit** solution, in the sense that the difference\n", + "\n", + "$$ e = y - \\tilde{X}\\tilde{\\beta} $$\n", + "\n", + "is small. By small, we often mean that $e$ is small in $L^2$ norm; i.e., we are minimizing the the sums of the squares of the differences between the components of $y$ and the components of $\\tilde{X}\\tilde{\\beta}$. This is known as a **least squares solution**. Assuming that our data points live in the Euclidean plane, this precisely describes finding a line of best fit.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "bdee8009", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA0oAAAIhCAYAAABwnkrAAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAyptJREFUeJzs3Xl4U1X+BvD3Jt1Smm7QJdBCoey17FQoyqooLgOojDugozMq6KiD4zY6OM64IDo6grgDog5uoP50RFQoyqIF2UrLUgqFIulG9zZpm9zz+wMaGlrapD3N1vfzPH1Ib9Kbc5u3l3xzzj1HEUIIEBERERERkY3G3Q0gIiIiIiLyNCyUiIiIiIiIzsFCiYiIiIiI6BwslIiIiIiIiM7BQomIiIiIiOgcLJSIiIiIiIjOwUKJiIiIiIjoHCyUiIiIiIiIzsFCiYiIiIiI6BwslIjIp/3yyy+YOXMmevbsicDAQMTExGDs2LH4y1/+0mHPuXXrVixcuBBlZWVN7nvttdewYsWKDnvu5kycOBGKoti+dDodhg4dipdffhmqqtoeN3fuXCQkJLTpOVxxXGlpaVAUBWlpabZt//vf/7Bw4cJmH68oCubPn9+m58rNzYWiKFi8eHGLj0tISMDcuXPb9ByukpubiyuvvBKRkZFQFAX333//eR+bkJBgl5WgoCD07dsXDz74IIqLizusjS29js2ZO3euXTsbf3311VdYsWIFFEVBbm6u7Wc+/PBDvPzyyx10BETki/zc3QAioo7y9ddf43e/+x0mTpyIRYsWwWAwwGg0YseOHVi9ejVefPHFDnnerVu34qmnnsLcuXMRHh5ud99rr72Gbt26ufzNdZ8+ffDBBx8AAAoLC/H666/jgQcegNFoxPPPP9/u/bviuEaMGIFt27Zh8ODBtm3/+9//sHTpUqfeZMu0du1ahIaGuuW5HfXAAw/gl19+wbvvvovY2FgYDIYWHz9u3DhbgWgymbBjxw4sXLgQP/74I3bs2NEhbWzL66jT6bBhw4Ym2wcOHIj6+nps27bN7lg//PBD7Nu3r8VCkYioMRZKROSzFi1ahN69e+Pbb7+Fn9/Z090NN9yARYsWubVtMgkhYDabodPpzvsYnU6HMWPG2L6fNm0aBg4ciCVLluCf//wn/P39XdTatgsNDbU7Bk8wfPhwdzehVfv27UNKSgpmzJjh0OPDw8Ptfs+TJk1CZWUlnn76aRw6dAj9+/fvwNY6TqPRtJiHqKgol7aHiHwPh94Rkc86deoUunXrZlckNdBomp7+PvzwQ4wdOxYhISEICQnBsGHD8M4779ju/+677zB9+nTExcXZhiT96U9/shuStHDhQjz00EMAgN69e9uGA6WlpSEhIQGZmZnYtGmTbXvjoW4VFRVYsGABevfujYCAAPTo0QP3338/qqur7drZMKTs9ddfx6BBgxAYGIiVK1c69bvx9/fHyJEjUVNTg6KiovM+zmw249FHH7Vr07x58+yGFbZ2XOeaNWsWkpKS7LZdffXVUBQFn3zyiW3bzp07oSgK/u///g9oZujd3LlzsXTpUtvvpOGr8XArAFi1ahUGDRqE4OBgDB06FF999ZVTv6uWnDv0rqGN//3vf/H444+je/fuCA0NxSWXXIKDBw82+fnvv/8eU6ZMQWhoKIKDgzFu3Dj88MMPDj338ePHccsttyA6OhqBgYEYNGgQXnzxRdtwyoa2HD58GN988815fz+OCAsLA87kprEdO3bgd7/7HSIjIxEUFIThw4fj448/tntMTU2NLddBQUGIjIzEqFGj8N///hdw4nV0xrlD7yZOnIivv/4ax44ds3sOIqKWsEeJiHzW2LFj8fbbb+O+++7DzTffjBEjRpy35+TJJ5/E008/jWuuuQZ/+ctfEBYWhn379uHYsWO2x+Tk5GDs2LG44447EBYWhtzcXLz00ku46KKLkJGRAX9/f9xxxx0oKSnBq6++ijVr1tiG/gwePBhr167Fddddh7CwMLz22msAgMDAQODMm8kJEybgxIkTeOyxxzBkyBBkZmbiySefREZGBr7//nu7N3aff/45fvrpJzz55JOIjY1FdHS007+fnJwc+Pn5ISIiotn7hRCYMWMGfvjhBzz66KO4+OKLsXfvXvz973/Htm3bsG3bNgQGBrZ4XM255JJL8Omnn8JoNMJgMMBisWDTpk3Q6XT47rvvMGvWLOBMEeHn54eJEyc2u58nnngC1dXV+PTTT7Ft2zbb9sbDrb7++mts374d//jHPxASEoJFixZh5syZOHjwIPr06eP078xRjz32GMaNG4e3334bFRUVePjhh3H11Vdj//790Gq1AID3338fs2fPxvTp07Fy5Ur4+/vjjTfewGWXXYZvv/0WU6ZMOe/+i4qKkJqairq6Ojz99NNISEjAV199hQULFiAnJwevvfaabajizJkzkZiYaBtO19rQOyEELBYLcKZQ3r59O15++WWMGzcOvXv3tj1u48aNuPzyy3HhhRfi9ddfR1hYGFavXo3rr78eNTU1tgLywQcfxKpVq/DPf/4Tw4cPR3V1Nfbt24dTp04BDr6O59PQzgaKoth+v4299tpr+OMf/4icnBysXbu21f0SEQGnT4hERD6puLhYXHTRRQKAACD8/f1FamqqePbZZ0VlZaXtcUeOHBFarVbcfPPNDu9bVVVRX18vjh07JgCIL774wnbfCy+8IACIo0ePNvm5pKQkMWHChCbbn332WaHRaMT27dvttn/66acCgPjf//5n2wZAhIWFiZKSEofaOmHCBJGUlCTq6+tFfX29OHnypHjkkUcEADFr1izb4+bMmSN69epl+37dunUCgFi0aJHd/j766CMBQLz55putHldzDh8+LACI9957TwghxObNmwUA8de//lX07t3b9rhLL71UpKam2r7fuHGjACA2btxo2zZv3jxxvv/KAIiYmBhRUVFh25afny80Go149tlnW2zj0aNHBQDxwgsvtPi4Xr16iTlz5jRp4xVXXGH3uI8//lgAENu2bRNCCFFdXS0iIyPF1Vdfbfc4q9Uqhg4dKlJSUlp83obX75dffrHbfvfddwtFUcTBgwft2njllVe2uL/Gj234e2n8lZKSIoxGo91jBw4cKIYPHy7q6+vttl911VXCYDAIq9UqhBDiggsuEDNmzGjxeVt6HZszZ86cZts5btw4IYQQy5cvb/I3eOWVV9rlm4ioNRx6R0Q+q2vXrvjpp5+wfft2PPfcc5g+fToOHTqERx99FMnJybYhc9999x2sVivmzZvX4v4KCwtx1113IT4+Hn5+fvD390evXr0AAPv3729XW7/66itccMEFGDZsGCwWi+3rsssuazLTGwBMnjz5vD1BzcnMzIS/vz/8/f3RvXt3vPjii7j55pvx1ltvnfdnGi6UP3eChlmzZqFLly4ODxE7V2JiIhISEvD9998DZ37/ycnJuOWWW3D06FHk5OSgtrYWmzdvxiWXXNKm52gwadIk6PV62/cxMTGIjo626ynsCL/73e/svh8yZAgA2J5369atKCkpwZw5c+xeb1VVcfnll2P79u1Nhlw2tmHDBgwePBgpKSl22+fOnQshRLOTHDjqoosuwvbt27F9+3Zs2bIF77zzDoqKijB58mTb38zhw4dx4MAB3HzzzcCZnp2GryuuuAJGo9E21DAlJQXffPMNHnnkEaSlpcFkMrW5bY3pdDpbOxu+Gg+VJSJqLw69IyKfN2rUKIwaNQoAUF9fj4cffhj//ve/sWjRIixatMh2jU5cXNx596GqKqZOnYqTJ0/iiSeeQHJyMrp06QJVVTFmzJh2v/krKCjA4cOHzzs08NypmR0ZltRYYmIiVq9ebZvyuXfv3ggODm7xZ06dOgU/P78mF8UrioLY2Fjb0Km2mDJlCtatWwecGWJ36aWXIjk5GTExMfj+++/Rr18/mEymdhdKXbt2bbItMDBQ2pt1R5+3YShiw/MWFBQAAK677rrz7qOkpARdunRp9r5Tp041ex1Y9+7dbfe3VVhYmO3vBQBSU1MxePBgjB07Fi+++CKeffZZW/sXLFiABQsWNLufhsz+5z//QVxcHD766CM8//zzCAoKwmWXXYYXXngB/fr1a3M7NRqNXTuJiGRjoUREnYq/vz/+/ve/49///jf27dsHNJod68SJE4iPj2/25/bt24c9e/ZgxYoVmDNnjm374cOHpbSrW7du0Ol0ePfdd897f2POXogeFBTk9JvKrl27wmKxoKioyK5YEkIgPz8fo0ePdmp/jU2ZMgXvvPMO0tPT8csvv+Bvf/sbcKan7LvvvsOxY8cQEhLicbPcydLwer766qvnPcaYmJjz/nzXrl1hNBqbbD958qTd/mVp6BHbs2eP3f4fffRRXHPNNc3+zIABAwAAXbp0wVNPPYWnnnoKBQUFtt6lq6++GgcOHJDaTiIimVgoEZHPapgs4FwNw+QaPn2fOnUqtFotli1bhrFjxza7r4bC5NxJCt54440mjz239+Dc+5rbftVVV+GZZ55B165d7S6Yd6cpU6Zg0aJFeP/99/HAAw/Ytn/22Weorq62m2zA2V6aKVOmQFEUPPHEE9BoNBg/fjxwZqKHhx56CMeOHcP48eNbnba88e+6penRPc24ceMQHh6OrKysNi2KO2XKFDz77LPYuXMnRowYYdv+3nvvQVEUTJo0SWp7d+/eDQC2SUMGDBiAfv36Yc+ePXjmmWcc3k9MTAzmzp2LPXv24OWXX0ZNTQ2Cg4Nd8jq6oieRiHwLCyUi8lmXXXYZ4uLicPXVV2PgwIFQVRW7d+/Giy++iJCQEPz5z38Gzkzx/Nhjj+Hpp5+GyWTCjTfeiLCwMGRlZaG4uBhPPfUUBg4ciMTERDzyyCMQQiAyMhL/93//h++++67J8yYnJwMAXnnlFcyZMwf+/v4YMGAA9Ho9kpOTsXr1anz00Ufo06cPgoKCkJycjPvvvx+fffYZxo8fjwceeABDhgyBqqo4fvw41q9fj7/85S+48MILXfr7u/TSS3HZZZfh4YcfRkVFBcaNG2eb9W748OG49dZb7Y65ueM6n+joaFxwwQVYv349Jk2aZBsGeMkll6CkpAQlJSV46aWXWm1jw3M8//zzmDZtGrRaLYYMGYKAgAApv4OMjAx8+umnTbaPHj3adn1aW4SEhODVV1/FnDlzUFJSguuuuw7R0dEoKirCnj17UFRUhGXLlp335x944AG89957uPLKK/GPf/wDvXr1wtdff43XXnsNd999d7vWOiorK8PPP/8MnBmqun//fjzzzDMIDAy0u47vjTfewLRp03DZZZdh7ty56NGjB0pKSrB//37s3LnTNtX7hRdeiKuuugpDhgxBREQE9u/fj1WrVmHs2LG2172jX8eG51izZg2WLVuGkSNHcugeEbXO3bNJEBF1lI8++kjcdNNNol+/fiIkJET4+/uLnj17iltvvVVkZWU1efx7770nRo8eLYKCgkRISIgYPny4WL58ue3+rKwscemllwq9Xi8iIiLErFmzxPHjxwUA8fe//91uX48++qjo3r270Gg0djO15ebmiqlTpwq9Xi8A2M3CVVVVJf72t7+JAQMGiICAABEWFiaSk5PFAw88IPLz822PAyDmzZvn8O+hYda71pw7650QQphMJvHwww+LXr16CX9/f2EwGMTdd98tSktL7R7X0nGdzwMPPCAAiH/961922/v16ycAiL1799ptb27Wu9raWnHHHXeIqKgooSiK3Uxn5/s9nTtTXXMaZr0731dDLs43690nn3zS7P4a50kIITZt2iSuvPJKERkZKfz9/UWPHj3ElVde2eTnm3Ps2DFx0003ia5duwp/f38xYMAA8cILL9hmm2t8vG2d9U6r1YqePXuK6667TuzatavJ4/fs2SN+//vfi+joaOHv7y9iY2PF5MmTxeuvv257zCOPPCJGjRolIiIiRGBgoOjTp4944IEHRHFxse0xLb2OzZkzZ47o0qXLee9v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3LhxqKqqavXnHTV48GDs3bu3yT43b94MADh16pS05+qMeH4imZgnkqk9edqdW4wHlm/FU5/8iuPFp///aK5XiToPV5+feI2Sg7RarcMzgRFw44034uGHH8bSpUvx1ltvAQBeffVVREVF4frrr2/xZ7t37+7w0LwBAwY41a5vvvkG8+bNw3XXXYd777231cenp6fj5Zdfxrp161qd4ODWW2+1+37SpEmYNGkSxo4di0WLFuGVV16x3detWzd8/PHHmDBhAlJTU5GQkIDXX3/doWOYMmVKswVi37597b6fM2cOVqxY0eK+HnjgAbvvL730UgwfPhzXXXcd3nrrrSb3t9X8+fPxxRdfYPbs2Vi8eDG6dOmCJUuWYOvWrYATQ/ioeTw/kUzME8nUljxlG8uxfMMB/HrEfnbZwXERuH3yAK6H1Im5+vzk1kLp2WefxZo1a3DgwAHodDqkpqbi+eeft3vzO3fuXKxcudLu5y688EL8/PPPLm2rEALl5eUICwvjLEAOCAwMxJ/+9Ce8+OKLeOGFF1BfX4+PP/4YDz74YKuTJwQEBDi86rIzY1S//fZbXHPNNbj00kvxwQcfOPQ63n777bjmmmswatQolJWVAY3WP6qoqEBgYCD0ev15fz4lJQX9+/dvklchBEaOHImkpCTs2bMHd999N7p06eLQcbzxxhuorKy0ff/rr7/irrvuwpdffgmDwWDb7siEEs2ZOXMmunTpIvVvbMqUKVi+fDn+8pe/IDExETjTy/T000/jscces7t2iZzH8xPJxDyRTM7kKa+4CivTDuGn/Ua77b2iQnD75IG4sF80M9nJufr85NZCadOmTZg3b55t2ubHH38cU6dORVZWlt2bxssvvxzLly+3fR8QEODytqqqiqKiIuj1el7g6qC7774bzz33HN59912YzWZYLBbcddddrf5cbm4uevfu7dBzbNy4ERMnTmz1cd9++y1mzJiBCRMm4LPPPnM4Q5mZmcjMzMQnn3zS5L7ExEQMHTrUbnhhc4QQzfaY/P3vf0dGRgZGjhyJJ598EldddRX69OnTapvO7UVrGM6WnJzcplnvnGlze8yZMwc333wzsrOz4e/vj759++LZZ5+Foii4+OKLpT5XZ8PzE8nEPJFMjuZJFQJPrN4OY2mNbVtMuA6zJ/THpAt6QKthgUSuPz+5tVBat26d3ffLly9HdHQ0fv31V4wfP962PTAwELGxsW5o4VlarRb9+vVzaxu8jcFgwKxZs/Daa6+hrq4OV199NXr27Nnqz8keerd+/XrMmDEDF110ET7//HOHpwPHmULsXCtWrMDKlSvx+eeft9oT8vPPPyM7Oxv33Xef3fbvv/8eL7zwAv72t7/h/vvvx7Bhw3D99ddjy5YtbvkgoLFPP/0UNTU1bZ4yvCV+fn4YNGgQAKC8vBxvvvkmpk+fjl69ekl/rs6E5yeSiXkimRzNk0ZRcPPF/bD4yz0I7xKAmy7uh2nD4xHgx2KdznL1+cmjrlEqLy8HAERGRtptT0tLQ3R0NMLDwzFhwgT861//Ou9sZbW1taitrbV9X1FRAZypQBv/q9FoznvbarVCURTbbY1GAyEETp06hcjISGi1Wtt2RVGavd3wXI1va7Va20Kjjt5WVRVCCNvt1truzDGdr+2OHFPj2UYabiuK0uT2fffdZ3vD/e6777b6eJzpMRw5cmSLj2l8u6V9/vTTT5gxYwZiY2Px6KOPYteuXXaPGTx4MEJDQ4EzU5f/4Q9/wLvvvmu73mjixIlN9t1QPKWmptqGtwkhMGzYMNxyyy0YOHAggoKCsH37drzwwguIjY3FX//6V9t+8vPzccstt2D8+PF48sknodFosHr1akyYMAEPPfQQXn75ZYeOu+F2w/eNb5+ruZ87duwYbr75Zlx//fXo27cvNBoN0tLS8MorryApKQl/+MMfIISwPd7f3x8TJkzA999/b9tPbm4utm/fDkVRkJOTA5wptIQQSEhIwOjRoyGEQGFhIV566SWkpqZCr9fj4MGDWLRoETQaDZYuXdrqsQohmuTQl/6e2ntMVqsVFRUVCAsLg0aj8Ylj8sXXyVuOSVEUlJSUICwsDP7+/j5xTL74OnnLMTV+/9Swz1qLis/TczFuQDR6RYfZ2js5uQdqausxJbk7QnSBtnO/px2TL75O3nJM9fX1KC8vR2RkpG30S3vew7bGY66gFkLgwQcfxEUXXYQLLrjAtn3atGn44IMPsGHDBrz44ovYvn07Jk+ebFcMNfbss88iLCzM9hUfHw8AtlnHjEYjjMbTY19PnDiBwsJCAMDx48dRXHz6osHc3FyUlpYCAI4cOYLy8nIIIZCdnW27NuTAgQOoqTndPZyVlWW7biUjIwP19fVQVRUZGRlQVRX19fW2tXHMZjOysrIAADU1NThw4AAAoLKyEtnZ2cCZgvHIkSMAgNLSUtsU0sXFxbappgsLC3HixIl2HROAdh1TXV2d7bUzmU7PQKOqqu3nVFXFkCFDkJCQgEGDBuGiiy4CzszO1vD6WSwW234a366vr0d9fT1wZmppi8XS5HZtba1txrfGt81ms+0PbN26dTCZTMjNzcWUKVOQmpqKsWPHIjU1Fampqdi5c6et7VarFVar1faHfb5janj+xsdhtVoxYMAAvPnmm7jxxhtx5ZVX4s0338Tvf/97bNmyBQaDAfX19TCbzbjxxhuhKAreeecdaDQa1NXVYdSoUXjmmWfwn//8B2vWrGnxmBrfNplMtj94s9lsu93Q9sbHce4xBQQEICYmBv/+979x3XXXYfr06VizZg3uuecebNmyBUFBQXavU8Pvp/Hr9P333+P3v/89Zs2aZeshnjVrFn7/+9/j1VdftR2HoijYvXs37rzzTlx++eV47rnnMG3aNGzduhXdu3dv9Zg6w99Te4+prKzM547JF18nbzgmIQSKiopw8OBBnzkmX3ydvOWYhBDYv38/6urqUFtvwRtfbsPtS9OwMu0QXv3yV7tj0moUXJIUjWNHDnv0Mfni6+RNx5Sfn9/u9+WOUoSHLJQwb948fP3119i8eTPi4uLO+zij0YhevXph9erVuOaaa5rc31yPUnx8PEpLSxEeHs5qXNIxHThwALfeeivef/992/C35noD9u7di2HDhmHJkiW45557nOopccXt5nhCu3hMp2/v378ft956K1atWoX+/fv77N8Tj4nHxGPiMfnyMdXVW/Dj/nys2nQI+WVnp/bWahSsmD8JUaFBXndMvvg6dZZjqqioQHh4OMrLy22jis7HI4be3Xvvvfjyyy/x448/tlgk4cx1L7169bJVrucKDAxs9hqUhl9Sw78t3dY2ujis4baqqjh16hS6desGRVGafYwjtxv/rCO3HWlvW4+pPbeVRjONNHc7JycHx44dw2OPPQaDwYDbbrvNdl9rP+vq281xxXNaLBb4+fn5zDF15O3z/c35yt9Te49JVVUUFhaiW7duTp3rPPmYnGk7j0nuMamqiuLiYtvQYl84Jkdv85jkHpMQAtsO5uOd77OQV2K/9tHFgwyYM7G/bapvTzgmoQoU7CuAudSMoIggRCdFd4rXyZuOSVEUFBUVoVu3blLe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GoXk5GSP9+ZdXV0oKCgYlPfmHFG6glWrVuG+++7DjBkzMHv2bGzevBmVlZX44Q9/6O+mkc6sWLECO3bswDvvvIPo6Gj3SGVsbCzMZrO/m0c6Ex0dfcH1bZGRkRg2bBiveyOf/du//Rvy8vKwdu1afPe730VRURE2b96MzZs3+7tppEOLFi3CL3/5S2RkZCAnJwcHDx7ECy+8gAceeMDfTSMdaG9vR3l5ufvrkydPori4GPHx8cjIyMDKlSuxdu1aZGdnIzs7G2vXrkVERATuvfde4W3h8uBeeOmll/Dcc8+htrYWkyZNwm9+8xsu50w+u9Tc2VdffRXLly/XvD0UfObPn8/lwanf3nvvPfz0pz9FWVkZRo0ahVWrVuGhhx7yd7NIh2w2G5566im89dZbsFqtSE1NxT333IOnn34aJpPJ382jALd7924sWLDgguPLli3D1q1boaoq/vM//xMvv/wympubMWvWLGzcuHFQPiRkoURERERERNQHr1EiIiIiIiLqg4USERERERFRHyyUiIiIiIiI+mChRERERERE1AcLJSIiIiIioj5YKBEREREREfXBQomIiIiIiKgPFkpERERERER9sFAiIiLqo6KiApIkobi42N9NISIiP2GhREREAUeWZeTl5eHOO+/0ON7a2or09HQ8+eSTV3yOHTt2wGg04oc//KHPPz89PR21tbWYNGmSz99LRETBQVJVVfV3I4iIiPoqKyvDlClTsHnzZixevBgAsHTpUnz99dfYt28fTCbTZb//hhtuwMyZM7Fp0ybU1NQgIiJCo5YTEVEw4IgSEREFpOzsbKxbtw6PPfYYampq8M4772Dnzp3Ytm3bFYukiooKFBYWYs2aNRg/fjz+8pe/eNz/wAMP4KqrroLT6QQAdHd3Y/r06e6CrO/Uu+bmZixevBgJCQkwm83Izs7Gq6++Omh9JyIi/2OhREREAeuxxx7D1VdfjaVLl+IHP/gBnn76aUyZMuWK37dlyxbccsstiI2NxZIlS/DKK6943P+73/0OHR0dWLNmDQDgqaeeQmNjI1566aWLPt9TTz2F0tJSvP/++zh8+DA2bdqE4cOHC+olEREFohB/N4CIiOhSJEnCpk2bMGHCBEyePNld2FyOoijYunUrfv/73wMA7r77bqxatQrl5eUYM2YMACAqKgrbt2/HvHnzEB0djeeffx4fffQRYmNjL/qclZWVmDp1KmbMmAEAyMzMFNpPIiIKPBxRIiKigLZlyxZERETg5MmTqK6uvuLj8/Pz0dHRgZtvvhkAMHz4cCxcuBBbtmzxeNzs2bOxevVq/Nd//Rf+/d//HXPnzr3kc/7oRz/Czp07MWXKFDz++OMoLCwU0DMiIgpkLJSIiChgff755/jNb36Dd955B7Nnz8b3v/99XGkNoi1btqCpqQkREREICQlBSEgI/vGPf2Dbtm2QZdn9OEVR8Nlnn8FoNKKsrOyyz3nzzTfj1KlTWLlyJWpqanD99ddj9erVwvpJRESBh4USEREFJLvdjmXLluHhhx/GDTfcgD/96U/Yt28fXn755Ut+z5kzZ9yLPhQXF3v8a29vx/vvv+9+7K9+9SscPnwYBQUF+PDDD6+4OENCQgKWL1+O7du348UXX8TmzZuF9peIiAILr1EiIqKAtGbNGiiKgvXr1wMAMjIy8Pzzz2PVqlW46aabLnqd0Ouvv45hw4bhrrvugsHg+VngrbfeildeeQW33noriouL8fTTT+Mvf/kL5syZg9/+9rf48Y9/jHnz5mH06NEXPO/TTz+N6dOnIycnB06nE++99x4mTJgwiL0nIiJ/44gSEREFnIKCAmzcuBFbt25FZGSk+/hDDz2EvLy8S07B27JlC26//fYLiiQAuPPOO/Hee+/h1KlTWLx4MZYvX45FixYBAL7//e/jhhtuwH333ecxPa+HyWTCT3/6U1x11VWYO3cujEYjdu7cKbzfREQUOLjhLBERERERUR8cUSIiIiIiIuqDhRIREREREVEfLJSIiIiIiIj6YKFERERERETUBwslIiIiIiKiPlgoERERERER9cFCiYiIiIiIqA8WSkRERERERH2wUCIiIiIiIuqDhRIREREREVEfLJSIiIiIiIj6+P+ZzibScFU7rAAAAABJRU5ErkJggg==", + "text/plain": [ + "

" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# 1. Generate some synthetic data\n", + "# We set a random seed for reproducibility\n", + "np.random.seed(3)\n", + "\n", + "# Create 50 random x values between 0 and 10\n", + "x = np.random.uniform(0, 10, 50)\n", + "\n", + "# Create y values with a linear relationship plus some random noise\n", + "# True relationship: y = 2.5x + 5 + noise\n", + "noise = np.random.normal(0, 2, 50)\n", + "y = 2.5 * x + 5 + noise\n", + "\n", + "# 2. Calculate the line of best fit\n", + "# np.polyfit(x, y, deg) returns the coefficients for the polynomial\n", + "# deg=1 specifies a linear fit (first degree polynomial)\n", + "slope, intercept = np.polyfit(x, y, 1)\n", + "\n", + "# Create a polynomial function from the coefficients\n", + "# This allows us to pass x values directly to get predicted y values\n", + "fit_function = np.poly1d((slope, intercept))\n", + "\n", + "# Generate x values for plotting the line (smoothly across the range)\n", + "x_line = np.linspace(x.min(), x.max(), 100)\n", + "y_line = fit_function(x_line)\n", + "\n", + "# 3. Plot the data and the line of best fit\n", + "plt.figure(figsize=(10, 6))\n", + "\n", + "# Plot the scatter points\n", + "plt.scatter(x, y, color='purple', label='Data Points', alpha=0.7)\n", + "\n", + "# Plot the line of best fit\n", + "plt.plot(x_line, y_line, color='steelblue', linestyle='--', linewidth=2, label='Line of Best Fit')\n", + "\n", + "# Add labels and title\n", + "plt.xlabel('X Axis')\n", + "plt.ylabel('Y Axis')\n", + "plt.title('Scatter Plot with Line of Best Fit')\n", + "\n", + "# Add the equation to the plot\n", + "# The f-string formats the slope and intercept to 2 decimal places\n", + "plt.text(1, 25, f'y = {slope:.2f}x + {intercept:.2f}', fontsize=12, bbox=dict(facecolor='white', alpha=0.8))\n", + "\n", + "# Display legend and grid\n", + "plt.legend()\n", + "plt.grid(True, linestyle=':', alpha=0.6)\n", + "\n", + "# Show the plot\n", + "plt.savefig('../images/line_of_best_fit_generated_1.png')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "1c25ccb0", + "metadata": {}, + "source": [ + "The structure of this sections is as follows.\n", + "- [Least Squares Solution](#least-squares-solution)\n", + "- [QR Decompositions](#qr-decompositions)\n", + "- [Singular Value Decomposition](#singular-value-decomposition)\n", + "- [A note on other norms](#a-note-on-other-norms)\n", + "- [A note on regularization](#a-note-on-regularization)\n", + "- [A note on solving multiple targets concurrently](#a-note-on-solving-multiple-targets-concurrently)\n", + "- [Polynomial regression](#polynomial-regression)\n", + "- [What can go wrong?](#what-can-go-wrong)\n", + "\n", + "## Least Squares Solution\n", + "\n", + "Recall that the Euclidean distance between two vectors $x = (x_1,\\dots,x_n) ,y = (y_1,\\dots,y_n) \\in \\mathbb{R}^n$ is given by\n", + "\n", + "$$ ||x - y||_2 = \\sqrt{\\sum_{i=1}^n |x_i - y_i|^2}. $$\n", + "\n", + "We will often work with the square of the $L^2$ norm to simplify things (the square function is increasing, so minimizing the square of a non-negative function will also minimize the function itself).\n", + "\n", + "> **Definition**: Let $A$ be an $m \\times n$ matrix and $b \\in \\mathbb{R}^n$. A **least-squares solution** of $Ax = b$ is a vector $x_0 \\in \\mathbb{R}^n$ such that\n", + "> \n", + "> $$ \\|b - Ax_0\\|_2 \\leq \\|b - Ax\\|_2 \\text{ for all } x \\in \\mathbb{R}^n. $$\n", + "\n", + "So a least-squares solution to the equation $Ax = b$ is trying to find a vector $x_0 \\in \\mathbb{R}^n$ which realizes the smallest distance between the vector $b$ and the column space\n", + "$$ \\text{Col}(A) = \\{Ax \\mid x \\in \\mathbb{R}^n\\} $$\n", + "of $A$. We know this to be the projection of the vector $b$ onto the column space. " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "f44a6feb", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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dozC4TDW19fjRCkhBCsrK7j22mvjXi83Cpvt2Kvx+VLyPZ++/e1vw2Aw4Ec/+lGcKP7+978vexvC4TA2NzfjBOPKygqQRkRSHnvsMezbtw/f+c534o5tYkOiXOrq6sTIcLqMxr59+3J6bwaj0mERUgYjD2666Sa43e6km+c3vvEN8ffpuO2223Dx4kU0NDTgxIkTSf/RLvlbbrkFAJIEWCLSSE0mLBYLTp48ie9+97txrxcEAY899hg6OjpU8QA9dOgQ2tvb8a1vfSuuW9rj8eDxxx8XO++VwnFckkgcHByM69zPxt13343f/va3eO655/DDH/4Qd955J3Q6nfj72267DYQQLC4upvxsrrjiCgBAX18fampq8LWvfS1jR3i6iDI9Px577LG4nz/++OPweDwZz59MnD59GiaTKel9FxYW8PTTT+f0vun2Id/ziQ6kkB5/n8+Hb37zm4q279/+7d/i/v2tb30LyOKZynEcqqqq4sToyspKyi57OZjNZtx44404d+4crrzyypTnTiaBzGBcyrAIKYORB29/+9vx1a9+FXfeeSdmZmZwxRVX4LnnnsPnPvc53HrrrXjVq16V9m8/8IEP4PHHH8crXvEKfPCDH8SVV14JQRAwNzeHJ598Eh/+8Idx8uRJvPzlL8cdd9yBz3zmM1hdXcVtt90Go9GIc+fOwWw24/3vfz8A4IorrsC3v/1tfOc730FPTw+qq6tF4ZTI/fffj1e/+tW48cYb8ZGPfARVVVV48MEHMTw8jH//93/PqR4yEZ7n8bd/+7f44z/+Y9x22234sz/7MwQCAXzhC1/A9vY2/uZv/ian973tttvw6U9/Gvfddx+uv/56jI2N4a//+q+xb98+hMNhWe9x++2340Mf+hBuv/12BAKBpFrLM2fO4E//9E9x991344UXXsArXvEKWCwWLC8v47nnnsMVV1yB97znPbBarfi7v/s7vPOd78SrXvUqvOtd70JzczMmJycxMDCAr3zlK0DsswGAz3/+87jlllug0+lw5ZVX4tWvfjVe85rX4C//8i/hdDpx5swZDA4O4r777sOxY8dwxx135HSMamtr8YlPfAL/3//3/+Htb387br/9dmxubuJTn/oUqqurcd999yl+T5vNhq6uLvzgBz/ATTfdhPr6euzZswfd3d15nU+/93u/hy9+8Yt461vfij/90z/F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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# Linear algebra helper functions\n", + "def proj_onto_subspace(A, v):\n", + " \"\"\"\n", + " Project vector v onto Col(A) where A is (3 x k) with columns spanning the subspace.\n", + " Uses the formula: P = A (A^T A)^(-1) A^T (for full column rank A).\n", + " \"\"\"\n", + " AtA = A.T @ A\n", + " return A @ np.linalg.solve(AtA, A.T @ v)\n", + "\n", + "def make_plane_grid(a, b, u_range=(-1.5, 1.5), v_range=(-1.5, 1.5), n=15):\n", + " \"\"\"\n", + " Plane through origin spanned by vectors a and b.\n", + " Returns meshgrid points X,Y,Z for surface plotting.\n", + " \"\"\"\n", + " uu = np.linspace(*u_range, n)\n", + " vv = np.linspace(*v_range, n)\n", + " U, V = np.meshgrid(uu, vv)\n", + " P = U[..., None] * a + V[..., None] * b # shape (n,n,3)\n", + " return P[..., 0], P[..., 1], P[..., 2]\n", + "\n", + "# Choose a plan and a vector\n", + "# Plane basis vectors (span a 2D subspace in R^3)\n", + "a = np.array([1.0, 0.2, 0.0])\n", + "b = np.array([0.2, 1.0, 0.3])\n", + "# Create the associated matrix\n", + "# 3x2 matrix of full column rank\n", + "# the column space will be a plane\n", + "A = np.column_stack([a, b]) \n", + "\n", + "# Vector to project\n", + "v = np.array([0.8, 0.6, 1.2])\n", + "\n", + "# Projection and residual\n", + "p = proj_onto_subspace(A, v)\n", + "r = v - p\n", + "\n", + "# Plot\n", + "fig = plt.figure(figsize=(9, 7))\n", + "# 1 row, 1 column, 1 subplot\n", + "# axis lives in R^3\n", + "ax = fig.add_subplot(111, projection=\"3d\")\n", + "\n", + "# Plane surface\n", + "X, Y, Z = make_plane_grid(a, b)\n", + "# Here is a rectangular grid of points in 3D; draw a surface through them.\n", + "ax.plot_surface(X, Y, Z, alpha=0.25)\n", + "\n", + "origin = np.zeros(3)\n", + "\n", + "# v, p, and residual r\n", + "ax.quiver(*origin, *v, arrow_length_ratio=0.08, linewidth=2)\n", + "ax.quiver(*origin, *p, arrow_length_ratio=0.08, linewidth=2)\n", + "ax.quiver(*p, *r, arrow_length_ratio=0.08, linewidth=2)\n", + "\n", + "# Drop line from v to its projection on the plane\n", + "ax.plot([v[0], p[0]],\n", + "\t\t[v[1], p[1]],\n", + "\t\t[v[2], p[2]],\n", + "\t\tlinestyle=\"--\", linewidth=2)\n", + "\n", + "# Points for emphasis\n", + "ax.scatter(*v, s=60)\n", + "ax.scatter(*p, s=60)\n", + "\n", + "# Labels (simple text)\n", + "ax.text(*v, \" v\")\n", + "ax.text(*p, \" Proj(v)\")\n", + "\n", + "# Make axes look nice\n", + "ax.set_xlabel(\"x\")\n", + "ax.set_ylabel(\"y\")\n", + "ax.set_zlabel(\"z\")\n", + "ax.set_title(\"Projection of a vector onto a plane\")\n", + "\n", + "# Set symmetric limits so the picture isn't squished\n", + "all_pts = np.vstack([origin, v, p])\n", + "m = np.max(np.abs(all_pts)) * 1.3 + 0.2\n", + "ax.set_xlim(-m, m)\n", + "ax.set_ylim(-m, m)\n", + "ax.set_zlim(-m, m)\n", + "\n", + "# Adjust spacing so labels, titles, and axes don’t overlap or get cut off.\n", + "plt.tight_layout()\n", + "plt.savefig('../images/projection_of_vector_onto_plane.png')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "c8a1fe20", + "metadata": {}, + "source": [ + "> **Theorem**: The set of least-squares solutions of $Ax = b$ coincides with solutions of the **normal equations** $A^TAx = A^Tb$. Moreover, the normal equations always have a solution.\n", + "\n", + "Let us first see why we get a line of best fit. \n", + "\n", + "> **Example**. Let us show why this describes a line of best fit when we are working with one feature and one target. Suppose that we observe four data points\n", + "> $$ X = \\begin{bmatrix} 1 \\\\ 2 \\\\ 3 \\\\ 4 \\end{bmatrix} \\text{ and } y = \\begin{bmatrix} 1 \\\\ 2\\\\ 2 \\\\ 4 \\end{bmatrix}. $$\n", + "> We want to fit a line $y = \\beta_0 + \\beta_1x$ to these data points. We will have our augmented matrix be\n", + "> $$ \\tilde{X} = \\begin{bmatrix} 1 & 1 \\\\ 1 & 2 \\\\ 1 & 3 \\\\ 1 & 4 \\end{bmatrix}, $$\n", + "> and our parameter be\n", + "> $$ \\tilde{\\beta} = \\begin{bmatrix} \\beta_0 \\\\ \\beta_1 \\end{bmatrix}. $$\n", + "> We have that\n", + "> $$ \\tilde{X}^T\\tilde{X} = \\begin{bmatrix} 4 & 10 \\\\ 10 & 30 \\end{bmatrix} \\text{ and } \\tilde{X}^Ty = \\begin{bmatrix} 9 \\\\ 27 \\end{bmatrix}. $$\n", + "> The 2x2 matrix $\\tilde{X}^T\\tilde{X}$ is easy to invert, and so we get that\n", + "> $$ \\tilde{\\beta} = (\\tilde{X}^T\\tilde{X})^{-1}\\tilde{X}^Ty = \\frac{1}{10}\\begin{bmatrix} 15 & -5 \\\\ -5 & 2 \\end{bmatrix}\\begin{bmatrix} 9 \\\\ 27 \\end{bmatrix} = \\begin{bmatrix} 0 \\\\ \\frac{9}{10} \\end{bmatrix}. $$\n", + "> So our line of best fit is of them form $y = \\frac{9}{10}x$.\n", + "\n", + "Although the above system was small and we could solve the system of equations explicitly, this isn't always feasible. We will generally use python in order to solve large systems. \n", + "- One can find a least-squares solution using `numpy.linalg.lstsq`.\n", + "- We can set up the normal equations and solve the system by using `numpy.linalg.solve`\n", + "Although the first approach simplifies things greatly, and is more or less what we are doing anyway, we will generally set up our problems as we would by hand, and then use `numpy.linalg.solve` to help us find a solution. However, computing $X^TX$ can cause lots of errors, so later we'll see how to get linear systems from QR decompositions and the SVD, and then apply `numpy.lingalg.solve`. \n", + "\n", + "Let's see how to use these for the above example, and see the code to generate the scatter plot and line of best fit. \n", + "Again, our system is the following.\n", + "$$ X = \\begin{bmatrix} 1 \\\\ 2 \\\\ 3 \\\\ 4 \\end{bmatrix} \\text{ and } y = \\begin{bmatrix} 1 \\\\ 2\\\\ 2 \\\\ 4 \\end{bmatrix}. $$\n", + "We will do what we did above, but use python instead.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "# Define the matrix X and vector y\n", + "X = np.array([[1], [2], [3], [4]])\n", + "y = np.array([[1], [2], [2], [4]])\n", + "\n", + "# Augment X with a column of 1's (intercept)\n", + "X_aug = np.hstack((np.ones((X.shape[0], 1)), X))\n", + "\n", + "# Solve the normal equations\n", + "beta = np.linalg.solve(X_aug.T @ X_aug, X_aug.T @ y)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "And what is the result?\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "1c42a900", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[-1.0658141e-15],\n", + " [ 9.0000000e-01]])" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "beta" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "This agrees with our by-hand computation: the intercept is tiny, so it is virtually zero, and we get 9/10 as our slope. Let's plot it. \n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiMAAAGdCAYAAADAAnMpAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAASZdJREFUeJzt3Xl4VOUd9vHvQFYgCYsEggkEEJFFtiASZNMIFHx5oaVvbauyKQKCoJSqaLW2aEFBRVxYBEEExUpAEQRBIUHZJBD2VVnFREAwISFmPe8fj0kJJJDJdmYy9+e65qrPzDkzv4yn19z+znOe47Asy0JERETEJpXsLkBEREQ8m8KIiIiI2EphRERERGylMCIiIiK2UhgRERERWymMiIiIiK0URkRERMRWCiMiIiJiKy+7CyiKnJwcfvzxRwICAnA4HHaXIyIiIkVgWRYXL16kXr16VKpUeP/DLcLIjz/+SFhYmN1liIiISDGcOnWK0NDQQl93izASEBAAv/0xgYGBdpcjIiIiRZCcnExYWFje73hh3CKM5J6aCQwMVBgRERFxM9ebYqEJrCIiImIrhRERERGxlcKIiIiI2Mot5owUhWVZZGVlkZ2dbXcp4uYqV66Ml5eXLiMXESknFSKMZGRkkJCQwKVLl+wuRSqIKlWqEBISgo+Pj92liIhUeG4fRnJycjh27BiVK1emXr16+Pj46L9opdgsyyIjI4OzZ89y7NgxmjRpcs2FekRE3JllWVy4lElqehZVfb2oUcXblt9Qtw8jGRkZ5OTkEBYWRpUqVewuRyoAf39/vL29OXHiBBkZGfj5+dldkohIqUpKyyR6+w+8t+k4J87/76xCg5pVGNQpnAERoQT5e5dbPW4fRnKV9L9eXSUdimtQN0REKqrYw2cZuXA7aRlXz7E8ef4SE1fsZ+qaQ8y4P4JuN9cul5oqTBgpLldLhyIiImUl9vBZhsz7FguwCng997m0zGyGzPuWeUM6lEsgKdF//k2aNAmHw8Fjjz12ze1iY2OJiIjAz8+PRo0aMXPmzJJ8bKmJPXyWyElfMXHFfk6ezz/5NTcdRk76itjDZ22rsTDHjx/H4XCwc+fOIu8zf/58qlevbnsdAOHh4UybNq1UaxERkcIlpWUycuF2E0QKSiKXsSwTTEYu3E5SWmaZ11bsMLJt2zZmz55Nq1atrrndsWPH6NOnD126dCE+Pp6nn36aMWPGEB0dXdyPLhW56TAtM7vAhJj7XG46LItAcurUKR588MG8ibcNGjRg7Nix/Pzzz9fdNywsjISEBFq2bFnkz7v33ns5fPhwCau2R1kEKRERTxK9/QfSMrKvG0RyWRakZWSzdMcPZV1a8cJISkoK9913H++88w41atS45rYzZ86kfv36TJs2jWbNmvHQQw8xdOhQpk6dWtyaS8wV0uHRo0dp3749hw8f5sMPP+S7775j5syZfPXVV0RGRnL+/PlC983IyKBy5crUrVsXL6+in2nz9/cnODi4lP4CERFxF5Zl8d6m48Xad/7G41hFTTDFVKwwMmrUKO655x7uvvvu6267efNmevbsme+5Xr16ERcXR2ZmwT/u6enpJCcn53uUJldIh6NGjcLHx4c1a9bQrVs36tevT+/evfnyyy85ffo0zzzzTN624eHhvPDCCwwePJigoCCGDRtW4OmR5cuX06RJE/z9/bnzzjt57733cDgc/PLLL1BAd+H555+nTZs2vP/++4SHhxMUFMSf//xnLl68mLfN6tWr6dy5M9WrV6dWrVr8n//zf/j++++d+lvPnDlD37598ff3p2HDhixatOiqbV599VVuvfVWqlatSlhYGI888ggpKSkAxMTEMGTIEJKSknA4HDgcDp5//nkAFi5cSPv27QkICKBu3br89a9/5cyZM07VJyJS0V24lMmJ85cKnCdyLRZw4vwlfrlUtqdqnA4jixcvZseOHUyaNKlI2ycmJlKnTp18z9WpU4esrCzOnTtX4D6TJk0iKCgo7xEWFuZsmYVyhXR4/vx5vvjiCx555BH8/f3zvVa3bl3uu+8+Pvroo3yfNWXKFFq2bMn27dt59tlnr3rP48eP88c//pH+/fuzc+dOhg8fni/QFOb777/nk08+YcWKFaxYsYLY2FgmT56c93pqairjxo1j27ZtfPXVV1SqVInf//735OTkFPnvHTx4MMePH2fdunUsWbKEt99++6rAUKlSJaZPn87evXt57733WLduHU888QQAnTp1Ytq0aQQGBpKQkEBCQgLjx4+H37pEEydOZNeuXXzyySccO3aMwYMHF7k2ERFPkJqeVaL9U0q4//U4dTXNqVOnGDt2LGvWrHFq7YUrL5HN/ZEt7NLZCRMmMG7cuLxxcnJyqQWS3HTorMvTYY2qJVuV88iR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AXz2mYKIiIhIOfPcMOJwwKxZ8Ne/mqXc//IX3dhORETEBh57mgaA9u1h0SK7qxAREfFontsZEREREZegMCIiIiK2UhgRERERWymMiIiIiK0URkRERMRWCiMiIiJiK4URERERsZXCiIiIiNhKYURERERspTAiIiIitlIYEREREVspjIiIiIitFEZERETEVm5x117LsgBITk62uxQREREpotzf7dzf8cK4RRi5ePEiAGFhYXaXIiIiIk66ePEiQUFBhb7usK4XV1xATk4OP/74IwEBATgcjlJ73+TkZMLCwjh16hSBgYGl9r4Vlb6votN3VXT6ropO31XR6bsqurL8rizL4uLFi9SrV49KlQqfGeIWnZFKlSoRGhpaZu8fGBiog9UJ+r6KTt9V0em7Kjp9V0Wn76royuq7ulZHJJcmsIqIiIitFEZERETEVh4dRnx9ffnnP/+Jr6+v3aW4BX1fRafvquj0XRWdvqui03dVdK7wXbnFBFYRERGpuDy6MyIiIiL2UxgRERERWymMiIiIiK0URkRERMRWFTqMbNiwgb59+1KvXj0cDgeffPLJdfeJjY0lIiICPz8/GjVqxMyZM8ulVrs5+13FxMTgcDiuehw8eLDcarbLpEmTuO222wgICCA4OJj+/ftz6NCh6+7nicdWcb4rTz22ZsyYQatWrfIWnoqMjGTVqlXX3McTjymK8V156jFVkEmTJuFwOHjssceuuV15H1sVOoykpqbSunVr3nzzzSJtf+zYMfr06UOXLl2Ij4/n6aefZsyYMURHR5d5rXZz9rvKdejQIRISEvIeTZo0KbMaXUVsbCyjRo1iy5YtrF27lqysLHr27Elqamqh+3jqsVWc7yqXpx1boaGhTJ48mbi4OOLi4rjrrrvo168f+/btK3B7Tz2mKMZ3lcvTjqkrbdu2jdmzZ9OqVatrbmfLsWV5CMBatmzZNbd54oknrFtuuSXfc8OHD7c6duxYxtW5lqJ8V+vXr7cA68KFC+VWl6s6c+aMBVixsbGFbqNjyyjKd6Vj639q1KhhzZkzp8DXdEzld63vSseUZV28eNFq0qSJtXbtWqtbt27W2LFjC93WjmOrQndGnLV582Z69uyZ77levXoRFxdHZmambXW5srZt2xISEkJUVBTr16+3uxxbJCUlAVCzZs1Ct9GxZRTlu8rlycdWdnY2ixcvJjU1lcjIyAK30TFlFOW7yuXJx9SoUaO45557uPvuu6+7rR3HllvcKK+8JCYmUqdOnXzP1alTh6ysLM6dO0dISIhttbmakJAQZs+eTUREBOnp6bz//vtERUURExND165d7S6v3FiWxbhx4+jcuTMtW7YsdDsdW0X/rjz52NqzZw+RkZH8+uuvVKtWjWXLltG8efMCt/X0Y8qZ78qTjymAxYsXs2PHDrZt21ak7e04thRGruBwOPKNcxeovfJ5T9e0aVOaNm2aN46MjOTUqVNMnTrVI/7PnWv06NHs3r2bb7755rrbevqxVdTvypOPraZNm7Jz505++eUXoqOjGTRoELGxsYX+yHryMeXMd+XJx9SpU6cYO3Ysa9aswc/Pr8j7lfexpdM0l6lbty6JiYn5njtz5gxeXl7UqlXLtrrcRceOHTly5IjdZZSbRx99lOXLl7N+/XpCQ0Ovua2nH1vOfFcF8ZRjy8fHh5tuuon27dszadIkWrduzeuvv17gtp5+TDnzXRXEU46p7du3c+bMGSIiIvDy8sLLy4vY2FimT5+Ol5cX2dnZV+1jx7GlzshlIiMj+eyzz/I9t2bNGtq3b4+3t7dtdbmL+Pj4Ct8a5rf/Qnj00UdZtmwZMTExNGzY8Lr7eOqxVZzvqiCecmxdybIs0tPTC3zNU4+pwlzruyqIpxxTUVFR7NmzJ99zQ4YM4ZZbbuHJJ5+kcuXKV+1jy7FVZlNjXcDFixet+Ph4Kz4+3gKsV1991YqPj7dOnDhhWZZlPfXUU9YDDzyQt/3Ro0etKlWqWI8//ri1f/9+a+7cuZa3t7e1ZMkSG/+K8uHsd/Xaa69Zy5Ytsw4fPmzt3bvXeuqppyzAio6OtvGvKB8jR460goKCrJiYGCshISHvcenSpbxtdGwZxfmuPPXYmjBhgrVhwwbr2LFj1u7du62nn37aqlSpkrVmzRrL0jGVj7PflaceU4W58moaVzi2KnQYyb2c68rHoEGDLMuyrEGDBlndunXLt09MTIzVtm1by8fHxwoPD7dmzJhhU/Xly9nv6qWXXrIaN25s+fn5WTVq1LA6d+5srVy50sa/oPwU9D0B1rx58/K20bFlFOe78tRja+jQoVaDBg0sHx8fq3bt2lZUVFTej6ulYyofZ78rTz2mCnNlGHGFY8th5c5KEREREbGBJrCKiIiIrRRGRERExFYKIyIiImIrhRERERGxlcKIiIiI2EphRERERGylMCIiIiK2UhgRERERWymMiIiIiK0URkRERMRWCiMiIiJiK4URERERsdX/B8wtIh2/IrjwAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "b, m = beta #beta[0] will be the intercept and beta[1] will be the slope\n", + "_ = plt.plot(X, y, 'o', label='Original data', markersize=10)\n", + "_ = plt.plot(X, m*X + b, 'r', label='Line of best fit')\n", + "_ = plt.legend()\n", + "plt.savefig('../images/line_of_best_fit_easy_example.png')\n", + "plt.show()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "What about `numpy.linalg.lstsq`? Is it any different?\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "# Define the matrix X and vector y\n", + "X = np.array([[1], [2], [3], [4]])\n", + "y = np.array([[1], [2], [2], [4]])\n", + "\n", + "# Augment X with a column of 1's (intercept)\n", + "X_aug = np.hstack((np.ones((X.shape[0], 1)), X))\n", + "\n", + "# Solve the least squares equation with matrix X_aug and target y\n", + "beta = np.linalg.lstsq(X_aug,y)[0]\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "We then get\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "35e8c88d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[6.16291085e-16],\n", + " [9.00000000e-01]])" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "beta" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "So it is a little different -- and, in fact, closer to our exact answer (the intercept is zero). This makes sense -- `numpy.linalg.lstsq` won't directly compute $X^TX$, which, again, can cause quite a few issues. \n", + "\n", + "---\n", + "\n", + "Now going to our initial example. \n", + "\n", + "> **Example**: Let us work with the example from above. We augment the matrix with a column of 1's to include an intercept term:\n", + "> $$ \\tilde{X} = \\begin{bmatrix} 1 & 1600 & 3 \\\\ 1 & 2100 & 4 \\\\ 1 & 1550 & 2 \\end{bmatrix}. $$\n", + "> Let us solve the normal equations\n", + "> $$ \\tilde{X}^T\\tilde{X}\\tilde{\\beta} = \\tilde{X}^Ty. $$\n", + "> We have\n", + "> $$ \\tilde{X}^T\\tilde{X} = \\begin{bmatrix} 3 & 5250 & 9 \\\\ 5250 & 9372500 & 16300 \\\\ 9 & 16300 & 29\\end{bmatrix} \\text{ and } \\tilde{X}^Ty = \\begin{bmatrix} 1625 \\\\ 2901500 \\\\ 5050 \\end{bmatrix} $$\n", + "> Solving this system of equations yields the parameter vector $\\tilde{\\beta}$. In this case, we have\n", + "> $$ \\tilde{\\beta} = \\begin{bmatrix} \\frac{200}{9} \\\\ \\frac{5}{18} \\\\ \\frac{100}{9} \\end{bmatrix}. $$\n", + "> When we apply $\\tilde{X}$ to $\\tilde{\\beta}$, we get\n", + "> $$ \\tilde{X}\\tilde{\\beta} = \\begin{bmatrix} 500 \\\\ 650 \\\\ 475 \\end{bmatrix}, $$\n", + "> which is our target on the nose. This means that we can expect, based on our data, that the cost of a house will be\n", + "> $$ \\frac{200}{9} + \\frac{5}{18}(\\text{square footage}) + \\frac{100}{9}(\\text{\\# of bedrooms})$$\n", + "\n", + "In the above, we actually had a consistent system to begin with, so our least-squares solution gave our prediction honestly. What happens if we have an inconsistent system?\n", + "\n", + "> **Example**: Let us add two more observations, say our data is now the following. \n", + "> |House | Square ft | Bedrooms | Price (in $1000s) |\n", + "> | --- | --- | --- | --- |\n", + "> | 0 | 1600 | 3 | 500 |\n", + "> | 1 | 2100 | 4 | 650 |\n", + "> | 2 | 1550 | 2 | 475 |\n", + "> | 3 | 1600 | 3 | 490 |\n", + "> | 4 | 2000 | 4 | 620 |\n", + "> \n", + "> So setting up our system, we want a least-square solution to the matrix equation\n", + "> $$ \\begin{bmatrix} 1 & 1600 & 3 \\\\ 1 & 2100 & 4 \\\\ 1 & 1550 & 2 \\\\ 1 & 1600 & 3 \\\\ 1 & 2000 & 4 \\end{bmatrix}\\tilde{\\beta} = \\begin{bmatrix} 500 \\\\ 650 \\\\ 475 \\\\ 490 \\\\ 620 \\end{bmatrix}. $$\n", + "> Note that the system is inconsistent (the 1st and 4th rows agree in $\\tilde{X}$, but they have different costs). Writing the normal equations we have\n", + "> $$ \\tilde{X}^T\\tilde{X} = \\begin{bmatrix} 5 & 8850 & 16 \\\\ 8850 & 15932500 & 29100 \\\\ 16 & 29100 & 54 \\end{bmatrix} \\text{ and } \\tilde{X}y = \\begin{bmatrix} 2735 \\\\ 4 925 250 \\\\ 9000 \\end{bmatrix}. $$\n", + "> Solving this linear system yields\n", + "> $$ \\tilde{\\beta} = \\begin{bmatrix} 0 \\\\ \\frac{3}{10} \\\\ 5 \\end{bmatrix}. $$\n", + "> This is a vastly different answer! Applying $\\tilde{X}$ to it yields\n", + "> $$ \\tilde{X}\\tilde{\\beta} = \\begin{bmatrix} 495 \\\\ 650 \\\\ 475 \\\\ 495 \\\\ 620 \\end{bmatrix}. $$\n", + "> Note that the error here is\n", + "> $$ y - \\tilde{X}\\tilde{\\beta} = \\begin{bmatrix} 5 \\\\ 0 \\\\ 0 \\\\ -5 \\\\ 0 \\end{bmatrix}, $$\n", + "> which has squared $L^2$ norm\n", + "> $$ \\|y - \\tilde{X}\\tilde{\\beta}\\|_2^2 = 25 + 25 = 50. $$\n", + "> So this says that, given our data, we can roughly estimate the cost of a house, within 50k or so, to be\n", + "> $$ \\approx \\frac{3}{10}(\\text{square footage}) + 5(\\text{\\# of bedrooms}). $$\n", + "In practice, our data sets can be gigantic, and so there is absolutely no hope of doing computations by hand. It is nice to know that theoretically we can do things like this though. \n", + "\n", + "> **Theorem**: Let $A$ be an $m \\times n$ matrix and $b \\in \\mathbb{R}^n$. The following are equivalent.\n", + "> \n", + "> 1. The equation $Ax = b$ has a unique least-squares solution for each $b \\in \\mathbb{R}^n$.\n", + "> 2. The columns of $A$ are linearly independent. \n", + "> 3. The matrix $A^TA$ is invertible.\n", + "\n", + "In this case, the unique solution to the normal equations $A^TAx = A^Tb$ is\n", + "\n", + "$$ x_0 = (A^TA)^{-1}A^Tb. $$\n", + "\n", + "Computing $\\tilde{X}^T\\tilde{X}$ or taking inverses are very computationally intensive tasks, and it is best to avoid doing these. Moreover, as we'll see in an example later, if we do a numerical calculation we can get close to zero and then divide where we shouldn't be, blowing up our final result. One way to get around this is to use QR decompositions of matrices. \n", + "\n", + "Now let's use python to visualize the above data and then solve for the least-squares solution. We'll use `pandas` in order to think about this data. We note that `pandas` incorporates `matplotlib` under the hood already, so there are some simplifications that can be made.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# First let us make a dictionary incorporating our data.\n", + "# Each entry corresponds to a column (feature of our data)\n", + "data = {\n", + "\t'Square ft': [1600, 2100, 1550, 1600, 2000],\n", + "\t'Bedrooms': [3, 4, 2, 3, 4],\n", + "\t'Price': [500, 650, 475, 490, 620]\n", + "}\n", + "\n", + "# Create a pandas DataFrame\n", + "df = pd.DataFrame(data)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "Let's see how python formats this `DataFrame`. It will turn it into essentially the table we had at the beginning. \n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "9dd3046d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Square ftBedroomsPrice
016003500
121004650
215502475
316003490
420004620
\n", + "
" + ], + "text/plain": [ + " Square ft Bedrooms Price\n", + "0 1600 3 500\n", + "1 2100 4 650\n", + "2 1550 2 475\n", + "3 1600 3 490\n", + "4 2000 4 620" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "So what can we do with DataFrames? First let's use `pandas.DataFrame.describe` to see some basic statistics about our data.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "a28d2558", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Square ftBedroomsPrice
count5.0000005.000005.000000
mean1770.0000003.20000547.000000
std258.8435820.8366681.516869
min1550.0000002.00000475.000000
25%1600.0000003.00000490.000000
50%1600.0000003.00000500.000000
75%2000.0000004.00000620.000000
max2100.0000004.00000650.000000
\n", + "
" + ], + "text/plain": [ + " Square ft Bedrooms Price\n", + "count 5.000000 5.00000 5.000000\n", + "mean 1770.000000 3.20000 547.000000\n", + "std 258.843582 0.83666 81.516869\n", + "min 1550.000000 2.00000 475.000000\n", + "25% 1600.000000 3.00000 490.000000\n", + "50% 1600.000000 3.00000 500.000000\n", + "75% 2000.000000 4.00000 620.000000\n", + "max 2100.000000 4.00000 650.000000" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.describe()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "This gives use the mean, the standard deviation, the min, the max, as well as some other things. We get an immediate sense of scale from our data. We can also examine the pairwise correlation of all the columns by using `pandas.DataFrame.corr`.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "7850890b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Square ftBedroomsPrice
Square ft1.0000000.9004260.998810
Bedrooms0.9004261.0000000.909066
Price0.9988100.9090661.000000
\n", + "
" + ], + "text/plain": [ + " Square ft Bedrooms Price\n", + "Square ft 1.000000 0.900426 0.998810\n", + "Bedrooms 0.900426 1.000000 0.909066\n", + "Price 0.998810 0.909066 1.000000" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df[[\"Square ft\", \"Bedrooms\", \"Price\"]].corr()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "It is clear that each of the three are correlated. This makes sense, as the number of bedrooms should be increasing with the square feet. Same with the price. We'll discuss in the next section when we look at Principal Component Analysis. \n", + "\n", + "We can also graph our data; for example, we could create some scatter plots, one for `Square ft` vs `Price` and on for `Bedrooms` vs `Price`. We can also do a grouped bar chart. Let's start with the scatter plots. \n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjsAAAHFCAYAAAAUpjivAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAARRVJREFUeJzt3Xl8Tfe+//H3biYS7MqcEJESNWtQNGmFoqGG9tAqNba4HanptNV7Wuo4tByd9JRy1VBKr0erderUPLZoiaGmElNDJUhEIqFJJN/fH7f2z5aEVBM7ltfz8ViP2t/1Xd/1XZ+k9tsa9rYZY4wAAAAs6g5XTwAAAKA0EXYAAIClEXYAAIClEXYAAIClEXYAAIClEXYAAIClEXYAAIClEXYAAIClEXYAAIClEXZw25g9e7ZsNpu2bdtW6PpOnTqpevXqN31eJc1mszktdrtdrVq10tKlS4u1/bp162Sz2bRu3bpSn+vNlJqaqlGjRqlu3bry8fGR3W5X7dq11adPH/3000+unl6p27Fjh2JjY2W322Wz2fTee++V+D4uXLigMWPGWO53B7c+d1dPAEDJe+yxxzRixAjl5+fryJEjGjdunDp37qx///vf6tix4zW3bdy4sTZv3qy6devetPmWtszMTLVo0UKZmZn661//qkaNGunixYs6ePCgvvzyS+3cuVMNGzZ09TRL1dNPP62srCwtXLhQlStXLpVgf+HCBb355puSpFatWpX4+MCNIuwAFhQUFKQWLVpIkqKjo3XfffepZs2aeu+994oMO7m5ubLZbKpUqZJjW6tYtGiRDh06pDVr1qh169ZO64YPH678/HyXze16Lv9c3N3/3F/Xe/bs0aBBg9ShQ4cSmxtwq+AyFnANv/32m0aNGqWIiAh5enqqSpUqeuGFF3Tu3DmnfjabTWPGjCmwffXq1dW/f3/H6wsXLmjkyJGKiIhQuXLl5Ovrq6ZNm2rBggVO223btk1dunSRr6+vypUrp6ioKP3v//7vDR9HjRo1FBAQoF9++UW64lLVp59+qhEjRqhKlSry8vLSoUOHiryM9cMPP6hz587y8/NTuXLlVKNGDQ0dOtSpT0JCgp588kkFBgbKy8tLderU0b/+9a/rzi8qKkoPPPBAgfa8vDxVqVJFXbt2dbRNnTpVjRo1UoUKFVSxYkXVrl1br7322jXHT01NlSSFhIQUuv6OO5z/Kly6dKnuueceeXl5KSIiQv/85z81ZswY2Ww2R59jx47JZrNp9uzZBca7+vfh0KFDeuqppxQZGSlvb29VqVJFnTt31u7du522u9bPRZJWrVqlNm3aqFKlSvL29lZMTIxWr159zWO/fPn20qVLmjp1quPy5mV79uzRI488osqVK6tcuXK65557NGfOnALjJCYmqnfv3k4/28mTJzuC4rFjxxQQECBJevPNNx37ufz7X9waSNLevXv10EMPydvbWwEBAXrhhRe0dOnSQn8vb6QmuP1wZge3nby8PF26dKlAuzGmwOtHH31Uq1ev1qhRo/TAAw/op59+0ujRo7V582Zt3rxZXl5ef2jfw4cP16effqpx48YpKipKWVlZ2rNnj+PNWJLWrl2r9u3bq3nz5po2bZrsdrsWLlyoJ554QhcuXHAKT8WVlpam1NRURUZGOrWPGjVK9913n6ZNm6Y77rhDgYGBSk5OLrD98uXL1blzZ9WpU0fvvPOOqlWrpmPHjmnFihWOPvv27VN0dLSqVaumyZMnKzg4WMuXL9eQIUOUkpKi0aNHFzm/p556Si+99JISEhKc5rhixQqdPHlSTz31lCRp4cKFev755zV48GD985//1B133KFDhw5p37591zz+++67T5LUt29fvfbaa3rggQfk5+dXaN/Vq1frkUce0X333aeFCxcqLy9PEydO1KlTp665j2s5efKk/Pz89NZbbykgIEBnz57VnDlz1Lx5c+3YsUN33323U//Cfi7z5s1T37599cgjj2jOnDny8PDQxx9/rLi4OC1fvlxt2rQpdN8dO3bU5s2bdd999zkub1524MABRUdHKzAwUB988IH8/Pw0b9489e/fX6dOndLLL78sSTpz5oyio6OVk5Ojv//976pevbq++eYbjRw5UocPH9ZHH32kkJAQLVu2TO3bt9eAAQM0cOBASXIEoOLWICkpSbGxsfLx8dHUqVMVGBioBQsW6MUXXyxwbDdaE9yGDHCbmDVrlpF0zSU8PNzRf9myZUaSmThxotM4n3/+uZFkpk+f7miTZEaPHl1gn+Hh4aZfv36O1/Xr1zePPvroNedZu3ZtExUVZXJzc53aO3XqZEJCQkxeXt41t5dknn/+eZObm2tycnLM/v37TYcOHYwk869//csYY8zatWuNJNOyZcsC219et3btWkdbjRo1TI0aNczFixeL3G9cXJypWrWqSU9Pd2p/8cUXTbly5czZs2eL3DYlJcV4enqa1157zam9e/fuJigoyFGLF1980dx5553XPP6ijB071nh6ejp+1hEREebZZ581u3btcurXvHlzExoa6nSsGRkZxtfX11z5V+bRo0eNJDNr1qwC+yrq9+GyS5cumZycHBMZGWmGDRvmaC/q55KVlWV8fX1N586dndrz8vJMo0aNTLNmza57/JLMCy+84NTWo0cP4+XlZRITE53aO3ToYLy9vc25c+eMMca8+uqrRpL54YcfnPo999xzxmazmQMHDhhjjDlz5sx1j/16NfjrX/9qbDab2bt3r1P/uLg4p9/LkqgJbh9cxsJtZ+7cudq6dWuB5f7773fqt2bNGkkqcCbl8ccfl4+Pzw2dKm/WrJm+/fZbvfrqq1q3bp0uXrzotP7QoUP6+eef1atXL0nSpUuXHMvDDz+spKQkHThw4Lr7+eijj+Th4SFPT0/VqVNHmzZt0tixY/X888879evWrdt1xzp48KAOHz6sAQMGqFy5coX2+e2337R69Wr95S9/kbe3d4F5//bbb9qyZUuR+/Dz81Pnzp01Z84cx2WRtLQ0ff311+rbt6/jfpVmzZrp3Llz6tmzp77++mulpKRcd/6Xvf7660pMTNQnn3yiZ555RhUqVNC0adPUpEkTx2XErKwsbd26VV27dnU61ooVK6pz587F3tfVLl26pPHjx6tu3bry9PSUu7u7PD09lZCQoP379xfof/XPZdOmTTp79qz69evnVNv8/Hy1b99eW7duVVZW1h+e15o1a9SmTRuFhYU5tffv318XLlzQ5s2bHf3q1q2rZs2aFehnjHH8v1ISNVi/fr3q169f4Ab5nj173pSawJq4jIXbTp06ddS0adMC7Xa7XcePH3e8Tk1Nlbu7u+M0/GU2m03BwcFOl56K64MPPlDVqlX1+eef6+2331a5cuUUFxenSZMmKTIy0nGpZOTIkRo5cmShYxTnDb579+7661//KpvNpooVK6pGjRpyc3Mr0K+oe1iudObMGUlS1apVi+yTmpqqS5cuacqUKZoyZcoNzfvpp5/WF198oZUrVyouLk4LFixQdna2U9js06ePLl26pBkzZqhbt27Kz8/Xvffeq3Hjxqldu3bXPZagoCA99dRTjstiGzZsUIcOHfTSSy+pZ8+eSktLU35+voKDgwtsW1hbcQ0fPlz/+te/9Morryg2NlaVK1fWHXfcoYEDBxYIvCrk53L59+Kxxx4rch9nz56Vj4/PH5pXampqob8DoaGhjvWX/1vY01tX97uW4tYgNTVVERERBbYPCgpyel1aNYE1EXaAIvj5+enSpUs6c+aMU+Axxig5OVn33nuvo83Ly0vZ2dkFxrj6TcDHx0dvvvmm3nzzTZ06dcpxlqdz5876+eef5e/vL/1+z8aVN+Ve6er7OwoTEBBQaKC72pU3ql5rLEk6ceJEkX0qV64sNzc39enTRy+88EKhfQp7A7tSXFycQkNDNWvWLMXFxWnWrFlq3rx5gX/hXw4rWVlZ2rBhg0aPHq1OnTrp4MGDCg8Pv+7xXKlly5Z66KGH9NVXX+n06dOqXLmybDZbofctXd12+czP1T/3wt74L99bMn78eKf2lJQU3XnnnQX6X/1zufx7MWXKlCKflLs6DBSHn5+fkpKSCrSfPHnSab/F7Xctxa2Bn59fofdHXV3/0qoJrImwAxShTZs2mjhxoubNm6dhw4Y52r/44gtlZWU53fxYvXr1Ah9Mt2bNGmVmZhY5flBQkPr3769du3bpvffe04ULF3T33XcrMjJSu3btKvCm4Cq1atVSjRo19Mknn2j48OGF3pTt7e2t1q1ba8eOHWrYsKE8PT3/8H4uh6X33ntPGzdu1LZt2/Txxx8X2d/Hx0cdOnRQTk6OHn30Ue3du7fIsHPq1CkFBAQUeOoqLy9PCQkJ8vb21p133ilPT081a9ZMX375pSZNmuQINOfPn9e///1vp22DgoJUrly5Aj/3r7/+usD+bTZbgbotXbpUv/76q2rWrHnd2sTExOjOO+/Uvn37Cr1R90a1adNGixcv1smTJx1nafT7pV5vb29HiGjTpo0mTJig7du3q3Hjxk79bDab43H+y8dY2Nmq4tYgNjZW//znP7Vv3z6noLtw4UKnbUurJrAmwg5QhHbt2ikuLk6vvPKKMjIyFBMT43gaKyoqSn369HH07dOnj15//XW98cYbio2N1b59+/Thhx/Kbrc7jdm8eXN16tRJDRs2VOXKlbV//359+umnuu++++Tt7S1J+vjjj9WhQwfFxcWpf//+qlKlis6ePav9+/dr+/btWrRo0U2vxb/+9S917txZLVq00LBhw1StWjUlJiZq+fLlmj9/viTp/fff1/33368HHnhAzz33nKpXr67z58/r0KFD+ve//12s+zqefvppvf3223ryySdVvnx5PfHEE07rBw0apPLlyysmJkYhISFKTk7WhAkTZLfbnc60Xe3TTz/Vxx9/rCeffFL33nuv7Ha7Tpw4of/5n//R3r179cYbbzgC2t///ne1b99e7dq104gRI5SXl6e3335bPj4+Onv2rGNMm82m3r1765NPPlGNGjXUqFEj/fjjj/rss88K7L9Tp06aPXu2ateurYYNGyo+Pl6TJk265qXBK1WoUEFTpkxRv379dPbsWT322GMKDAzUmTNntGvXLp05c0ZTp04t1lhXGj16tL755hu1bt1ab7zxhnx9fTV//nwtXbpUEydOdPz+Dhs2THPnzlXHjh01duxYhYeHa+nSpfroo4/03HPPqVatWtLv9zaFh4fr66+/Vps2beTr6yt/f39Vr1692DUYOnSoPvnkE3Xo0EFjx45VUFCQPvvsM/3888/SFR8TUFo1gUW5+g5p4Ga5/DTW1q1bC13fsWNHp6exjDHm4sWL5pVXXjHh4eHGw8PDhISEmOeee86kpaU59cvOzjYvv/yyCQsLM+XLlzexsbFm586dBZ7GevXVV03Tpk1N5cqVjZeXl7nrrrvMsGHDTEpKitN4u3btMt27dzeBgYHGw8PDBAcHmwcffNBMmzbtusdZ2FM3V7v81M+iRYuKXHfl01jGGLN582bToUMHY7fbjZeXl6lRo4bTUzTm9yeUnn76aVOlShXj4eFhAgICTHR0tBk3btx1531ZdHS0kWR69epVYN2cOXNM69atTVBQkPH09DShoaGme/fu5qeffrrmmPv27TMjRowwTZs2NQEBAcbd3d1UrlzZxMbGmk8//bRA/yVLlpiGDRsaT09PU61aNfPWW2+Z0aNHm6v/ykxPTzcDBw40QUFBxsfHx3Tu3NkcO3aswBNJaWlpZsCAASYwMNB4e3ub+++/32zcuNHExsaa2NhYR79r/VyMMWb9+vWmY8eOxtfX13h4eJgqVaqYjh07Ftn/SkX9Xuzevdt07tzZ2O124+npaRo1alToE2a//PKLefLJJ42fn5/x8PAwd999t5k0aVKBpwNXrVploqKijJeXl5Hk+P0vbg2MMWbPnj2mbdu2ply5csbX19cMGDDAzJkzx0gq8PTcn6kJbh82c/WH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s9mcluDgYMf6/v37F1jfokULpzGys7M1ePBg+fv7y8fHR126dNGJEydccDQAAKAscvmZnXr16ikpKcmx7N6922l9+/btndb/5z//cVo/dOhQLV68WAsXLtR3332nzMxMderUiW9lBwAA0o1+N1aJTsDd3elsztW8vLyKXJ+enq6ZM2fq008/Vdu2bSVJ8+bNU1hYmFatWqW4uLhSmzcAALg1uPzMTkJCgkJDQxUREaEePXroyJEjTuvXrVunwMBA1apVS4MGDdLp06cd6+Lj45Wbm6uHHnrI0RYaGqr69etr06ZNRe4zOztbGRkZTgsAALAml4ad5s2ba+7cuVq+fLlmzJih5ORkRUdHKzU1VZLUoUMHzZ8/X2vWrNHkyZO1detWPfjgg8rOzpYkJScny9PTU5UrV3YaNygoSMnJyUXud8KECbLb7Y4lLCyslI8UAAC4is0YY1w9icuysrJUo0YNvfzyyxo+fHiB9UlJSQoPD9fChQvVtWtXffbZZ3rqqacc4eeydu3aqUaNGpo2bVqh+8nOznbaJiMjQ2FhYUpPT1elSpVK4cgAAEBJy8jIkN1uv+77t8svY13Jx8dHDRo0UEJCQqHrQ0JCFB4e7lgfHBysnJwcpaWlOfU7ffq0goKCityPl5eXKlWq5LQAAABrKlNhJzs7W/v371dISEih61NTU3X8+HHH+iZNmsjDw0MrV6509ElKStKePXsUHR190+YNAADKLpeGnZEjR2r9+vU6evSofvjhBz322GPKyMhQv379lJmZqZEjR2rz5s06duyY1q1bp86dO8vf319/+ctfJEl2u10DBgzQiBEjtHr1au3YsUO9e/dWgwYNHE9nAQCA25tLHz0/ceKEevbsqZSUFAUEBKhFixbasmWLwsPDdfHiRe3evVtz587VuXPnFBISotatW+vzzz9XxYoVHWO8++67cnd3V/fu3XXx4kW1adNGs2fPlpubmysPDQAAlBFl6gZlVynuDU4AAKDsuCVvUAYAAChphB0AAGBphB0AAGBphB0AAGBphB0AAGBphB0AAGBphB0AAGBphB0AAGBphB0AAGBphB0AAGBphB0AAGBphB0AAGBphB0AAGBphB0AAGBphB0AAGBphB0AAGBphB0AAGBphB0AAGBphB0AAGBphB0AAGBphB0AAGBphB0AAGBphB0AAGBphB0AAGBp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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Scatter plot for Price vs Square ft\n", + "df.plot(\n", + "\tkind=\"scatter\",\n", + "\tx=\"Square ft\",\n", + "\ty=\"Price\",\n", + "\ttitle=\"House Price vs Square footage\"\n", + ")\n", + "plt.savefig('../images/house_price_vs_square_ft.png')\n", + "plt.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjsAAAHFCAYAAAAUpjivAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAQ5pJREFUeJzt3Xl4VNXh//HPkA0SkpFsJIEQAoTKbiCyRVkMCAioRUQiCijlZ11AhBTFfluQ8oBoqQu1WPhSFtksVaqVIvuiggphkU0MO2jCTiYLDCGc3x9fmYchCyEmTHJ5v57nPjLnnHvuOXO5zMe7zNiMMUYAAAAWVcXTAwAAAChPhB0AAGBphB0AAGBphB0AAGBphB0AAGBphB0AAGBphB0AAGBphB0AAGBphB0AAGBphB3gF5o9e7ZsNpu2bNlSaH2vXr1Ut27dWz6usmaz2dwWu92uTp06aenSpSVaf926dbLZbFq3bl25j/VWuv59CQgIUKNGjfTaa68pJyenTLc1btw42Wy2Mu0TuB0QdgCUWN++fbVp0yZ99dVXeu+995SRkaHevXuXKPC0bNlSmzZtUsuWLW/JWG+lq+/Lpk2b9Mknn6hv374aP368Bg4c6OmhAZDk7ekBAKg8atasqbZt20qS2rdvr3bt2qlBgwZ6++231bNnz0LXycvLk81mU1BQkGtdq7n2fZGkLl266MiRI5o/f74uXryoqlWr3rKxGGN08eJFVatW7ZZtE6joOLMDeMDFixc1ZswYxcbGytfXV7Vq1dLzzz+v8+fPu7Wz2WwaN25cgfXr1q2rwYMHu17n5uYqJSVFsbGxqlq1qoKDg5WQkKCFCxe6rbdlyxY9+OCDCg4OVtWqVRUfH69//vOfpZ5H/fr1FRYWpiNHjkjXXKr64IMPNGrUKNWqVUt+fn7av39/kZexvvnmG/Xu3VshISGqWrWq6tevrxEjRri1SUtL0+OPP67w8HD5+fmpUaNGeu+99244vvj4eN17770FyvPz81WrVi316dPHVTZt2jS1aNFC1atXV2BgoO688069+uqrpX5v7Ha7bDabvLy83MpXrVqlpKQkBQUFyd/fX4mJiVq9enWB9ZcuXaq77rpLfn5+io2N1Z///OdCt2Oz2fTCCy/o/fffV6NGjeTn56c5c+ZIkr788kslJSUpMDBQ/v7+at++faFn4Xbt2qWHHnpINWrUUNWqVXXXXXe5+rjq6v5bsGCBXn75ZUVGRqp69erq3bu3Tpw4oaysLP2///f/FBoaqtDQUD311FPKzs5262Px4sVq06aN7Ha7/P39Va9ePT399NOlen+Bm8GZHaCM5Ofn6/LlywXKjTEFXj/88MNavXq1xowZo3vvvVffffedxo4d67oU4ufnd1PbHjlypD744ANNmDBB8fHxysnJ0a5du3TmzBlXm7Vr16p79+5q06aN3n//fdntdi1atEiPPfaYcnNz3cJTSZ07d05nzpxRXFycW/mYMWPUrl07vf/++6pSpYrCw8OVkZFRYP3ly5erd+/eatSokf7yl7+oTp06Onz4sFasWOFqs2fPHrVv31516tTRlClTFBERoeXLl2v48OE6ffq0xo4dW+T4nnrqKb344otKS0tzG+OKFSv0008/6amnnpIkLVq0SM8995yGDRumP//5z6pSpYr279+vPXv2lOh9MMa49n12drbWr1+vOXPmqH///vLx8XG1mzdvngYOHKiHHnpIc+bMkY+Pj/7+97+rW7duWr58uZKSkiRJq1ev1kMPPaR27dpp0aJFys/P1xtvvKETJ04Uuv1///vf+uKLL/THP/5RERERCg8P1/r169W1a1c1b95cM2fOlJ+fn/72t7+pd+/eWrhwoR577DFJ0r59+9S+fXuFh4fr3XffVUhIiObNm6fBgwfrxIkTGj16tNu2Xn31VXXu3FmzZ8/W4cOHlZKSouTkZHl7e6tFixZauHChtm3bpldffVWBgYF69913JUmbNm3SY489pscee0zjxo1T1apVdeTIEa1Zs6ZE7zHwixgAv8isWbOMpGKXmJgYV/vPP//cSDJvvPGGWz8ffvihkWSmT5/uKpNkxo4dW2CbMTExZtCgQa7XTZs2NQ8//HCx47zzzjtNfHy8ycvLcyvv1auXiYyMNPn5+cWuL8k899xzJi8vz1y6dMns3bvX9OjRw0gy7733njHGmLVr1xpJpkOHDgXWv1q3du1aV1n9+vVN/fr1zYULF4rcbrdu3Uzt2rVNZmamW/kLL7xgqlatas6ePVvkuqdPnza+vr7m1VdfdSvv16+fqVmzpuu9eOGFF8wdd9xR7PyLUtQ+79Gjh8nOzna1y8nJMcHBwaZ3795u6+fn55sWLVqY1q1bu8ratGljoqKi3N4Xh8NhgoODzfX/bEsydru9wPvQtm1bEx4ebrKyslxlly9fNk2bNjW1a9c2V65cMcYY079/f+Pn52eOHj3qtn6PHj2Mv7+/OX/+vDHX7L/rxz9ixAgjyQwfPtyt/OGHHzbBwcGu13/+85+NJFd/wK3EZSygjMydO1ebN28usNxzzz1u7a7+n+z1Z1IeffRRBQQEFHpJ40Zat26tZcuW6ZVXXtG6det04cIFt/r9+/fr+++/14ABAyRJly9fdi0PPPCA0tPTtW/fvhtu529/+5t8fHzk6+urRo0aaePGjRo/fryee+45t3aPPPLIDfv64YcfdODAAQ0ZMqTIe1ouXryo1atX69e//rX8/f0LjPvixYv6+uuvi9xGSEiIevfurTlz5ujKlSvSz2ejPvnkEw0cOFDe3t6u9+/8+fNKTk7WJ598otOnT99w/Nfq16+fa39v2LBB7777rrZs2aLu3bvL6XRKkjZu3KizZ89q0KBBbvO4cuWKunfvrs2bNysnJ0c5OTnavHmz+vTp4/a+BAYGqnfv3oVu/7777lONGjVcr3NycvTNN9+ob9++ql69uqvcy8tLTz75pI4fP+7a32vWrFFSUpKio6Pd+hw8eLByc3O1adMmt/JevXq5vW7UqJEkFbhnq1GjRjp79qzrUtbdd9/teq/++c9/6scff7yp9xj4JbiMBZSRRo0aKSEhoUC53W7XsWPHXK/PnDkjb29vhYWFubWz2WyKiIhwu/RUUu+++65q166tDz/8UJMnT1bVqlXVrVs3vfnmm4qLi3Nd/khJSVFKSkqhfZTkA75fv3763e9+J5vNpsDAQNWvX7/APSmSFBkZecO+Tp06JUmqXbt2kW3OnDmjy5cva+rUqZo6dWqpxv3000/ro48+0sqVK9WtWzctXLhQTqfTLWw++eSTunz5smbMmKFHHnlEV65c0d13360JEyaoa9euN5xLWFiY276/9957FRYWpuTkZM2ePVvPPPOMax/07du3yH7Onj0rm82mK1euKCIiokB9YWUq5P0+d+6cjDGF7oeoqCjp5/f26n9L0u6q4OBgt9e+vr7Fll+8eFHVq1dXhw4d9O9//1vvvvuuBg4cKKfTqSZNmuj3v/+9kpOTC50XUFYIO8AtFhISosuXL+vUqVNugccYo4yMDNf/AUuSn5+f68zAta7/AAoICNBrr72m1157TSdOnHCd5endu7e+//57hYaGSj/fS3PtTbnX+tWvfnXDsV//oV6UknwXzNW5Hz9+vMg2NWrUcJ2NeP755wttExsbW+x2unXrpqioKM2aNUvdunXTrFmz1KZNGzVu3Nit3VNPPaWnnnpKOTk52rBhg8aOHatevXrphx9+UExMzA3nc73mzZtLknbs2CFJrn0wderUIp9Kq1mzpuvptcLucSqsTIW83zVq1FCVKlWUnp5eoO1PP/3kNp6QkJAStSsLDz30kB566CE5nU59/fXXmjRpkh5//HHVrVtX7dq1K7PtANfjMhZwi129CXXevHlu5R999JFycnJc9fr5qavvvvvOrd2aNWsKPOVyrZo1a2rw4MFKTk7Wvn37lJubq1/96leKi4vTjh07lJCQUOgSGBhY5nMtTsOGDVW/fn394x//KDTQSZK/v786d+6sbdu2qXnz5oWOOyQkpNjtXA1LV2/i3bJlS7FPAAUEBKhHjx76/e9/r0uXLmn37t2lmt/27dslSeHh4ZKkxMRE3XHHHdqzZ0+R+8DX11cBAQFq3bq1Pv74Y128eNHVX1ZWlv7zn/+UaNsBAQFq06aNPv74Y7dLmleuXNG8efNUu3ZtNWzYUPr57+OaNWtc4eaquXPnyt/fv1y+LsDPz08dO3bU5MmTJUnbtm0r820A1+LMDnCLde3aVd26ddPLL78sh8OhxMRE19NY8fHxevLJJ11tn3zySf3hD3/QH//4R3Xs2FF79uzRX//6V9ntdrc+27Rpo169eql58+aqUaOG9u7dqw8++EDt2rWTv7+/JOnvf/+7evTooW7dumnw4MGqVauWzp49q71792rr1q1avHjxLX8v3nvvPfXu3Vtt27bVSy+9pDp16ujo0aNavny55s+fL0l65513dM899+jee+/Vs88+q7p16yorK0v79+/Xf/7znxI9zfP0009r8uTJevzxx1WtWjXXk0hXDR06VNWqVVNiYqIiIyOVkZGhSZMmyW63u51pK8qJEydc9w5dvHhR27dv14QJE3THHXe4nviqXr26pk6dqkGDBuns2bPq27evwsPDderUKe3YsUOnTp3StGnTJEl/+tOf1L17d3Xt2lWjRo1Sfn6+Jk+erICAAJ09e7ZE7+2kSZPUtWtXde7cWSkpKfL19dXf/vY37dq1SwsXLnSdDRo7dqw+++wzde7cWX/84x8VHBys+fPna+nS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WBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWJrHw86PP/6oJ554QiEhIfL399ddd92l1NRUSVJeXp5efvllNWvWTAEBAYqKitLAgQP1008/ufXRqVMn2Ww2t6V///4emhEAAKhIvD258XPnzikxMVGdO3fWsmXLFB4ergMHDuiOO+6QJOXm5mrr1q36wx/+oBYtWujcuXMaMWKEHnzwQW3ZssWtr6FDh2r8+PGu19WqVbvl8wEAABWPR8PO5MmTFR0drVmzZrnK6tat6/qz3W7XypUr3daZOnWqWrduraNHj6pOnTqucn9/f0VERNyikQMAgMrCo5exPv30UyUkJOjRRx9VeHi44uPjNWPGjGLXyczMlM1mc539uWr+/PkKDQ1VkyZNlJKSoqysrCL7cDqdcjgcbgsAALAmj4adgwcPatq0aYqLi9Py5cv129/+VsOHD9fcuXMLbX/x4kW98sorevzxxxUUFOQqHzBggBYuXKh169bpD3/4gz766CP16dOnyO1OmjRJdrvdtURHR5fL/AAAgOfZjDHGUxv39fVVQkKCNm7c6CobPny4Nm/erE2bNrm1zcvL06OPPqqjR49q3bp1bmHneqmpqUpISFBqaqpatmxZoN7pdMrpdLpeOxwORUdHKzMzs9h+AQBAxeFwOGS322/4+e3RMzuRkZFq3LixW1mjRo109OhRt7K8vDz169dPhw4d0sqVK28YSFq2bCkfHx+lpaUVWu/n56egoCC3BQAAWJNHb1BOTEzUvn373Mp++OEHxcTEuF5fDTppaWlau3atQkJCbtjv7t27lZeXp8jIyHIZNwAAqDw8GnZeeukltW/fXhMnTlS/fv307bffavr06Zo+fbok6fLly+rbt6+2bt2qzz77TPn5+crIyJAkBQcHy9fXVwcOHND8+fP1wAMPKDQ0VHv27NGoUaMUHx+vxMRET04PAABUAB69Z0eSPvvsM40ZM0ZpaWmKjY3VyJEjNXToUEnS4cOHFRsbW+h6a9euVadOnXTs2DE98cQT2rVrl7KzsxUdHa2ePXtq7NixCg4OLtEYSnrNDwAAVBwl/fz2eNipCAg7AACU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GVKi7XhqHxY2FqfTWWhdZTr+ilPcHFXJjsHC3Gh+16uox19xSjLHynIMJiUlaefOndq+fbtrSUhI0IABA7R9+3Z5eXkVWKdCHItlcn7oNvDss88au91u1q1b5/boX25urqvNK6+8Yp588knX66uP27300ktmz549ZubMmQUet/vqq6+Ml5eXef31183evXvN66+/7pHHJkszvwULFhhvb2/z3nvvua1z/vx5V5tx48aZzz//3Bw4cMBs27bNPPXUU8bb29t88803t3R+pZ3jW2+9ZZYsWWJ++OEHs2vXLvPKK68YSeajjz5ytanM+/CqJ554wrRp06bQfivKPhwzZozZsGGDOXTokPnuu+/Mq6++aqpUqWJWrFhhTCU//ko7x8p2DN7s/CrT8VfaOV5VGY7Bolx/GasiHouEnRKSVOgya9YsV5tBgwaZjh07uq23bt06Ex8fb3x9fU3dunXNtGnTCvS9ePFi86tf/cr4+PiYO++80+1AvlVKM7+OHTsWus6gQYNcbUaMGGHq1KljfH19TVhYmLn//vvNxo0bb/n8TCnnOHnyZFO/fn1TtWpVU6NGDXPPPfeYpUuXFui7su5D8/P3fFSrVs1Mnz690H4ryj58+umnTUxMjGscSUlJrg8QU8mPv6tudo6V7Ri82flVpuPvqtL8Pa0sx2BRrg87FfFYtJn/+0cSAADAkrhnBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphB0ClM3jwYD388MOeHgaASoKwA6DcDB48WDabzbWEhISoe/fu+u677zw9NAC3EcIOgHLVvXt3paenKz09XatXr5a3t7d69epVrtu8dOlSufYPoHIh7AAoV35+foqIiFBERITuuusuvfzyyzp27JhOnTolSfrxxx/12GOPqUaNGgoJCdFDDz2kw4cPu9bPz8/XyJEjdccddygkJESjR4/W9b9y06lTJ73wwgsaOXKkQkND1bVrV+nnX5Ju3bq1/Pz8FBkZqVdeeUWXL192red0OjV8+HCFh4eratWquueee7R582ZX/bp162Sz2bR8+XLFx8erWrVquu+++3Ty5EktW7ZMjRo1UlBQkJKTk5Wbm+ta71//+peaNWumatWqKSQkRF26dFFOTk65vs8AikbYAXDLZGdna/78+WrQoIFCQkKUm5urzp07q3r16tqwYYO+/PJLVa9eXd27d3ednZkyZYr+8Y9/aObMmfryyy919uxZLVmypEDfc+bMkbe3t7766iv9/e9/148//qgHHnhAd999t3bs2KFp06Zp5syZmjBhgmud0aNH66OPPtKcOXO0detWNWjQQN26ddPZs2fd+h43bpz++te/auPGjTp27Jj69eunt99+WwsWLNDSpUu1cuVKTZ06VZKUnp6u5ORkPf3009q7d6/WrVunPn36FAhoAG6hMvtJUQC4zqBBg4yXl5cJCAgwAQEBRpKJjIw0qampxhhjZs6caX71q1+ZK1euuNZxOp2mWrVqZvny5cYYYyIjI83rr7/uqs/LyzO1a9c2Dz30kKusY8eO5q677nLb9quvvlqg7/fee89Ur17d5Ofnm+zsbOPj42Pmz5/vqr906ZKJiooyb7zxhjHGmLVr1xpJZtWqVa42kyZNMpLMgQMHXGXPPPOM6datmzHGmNTUVCPJHD58uIzeRQC/FGd2AJSrzp07a/v27dq+fbu++eYb3X///erRo4eOHDmi1NRU7d+/X4GBgapevbqqV6+u4OBgXbx4UQcOHFBmZqbS09PVrl07V3/e3t5KSEgosJ3ry/bu3at27drJZrO5yhITE5Wdna3jx4/rwIEDysvLU2Jioqvex8dHrVu31t69e936at68uevPNWvWlL+/v+rVq+dWdvLkSUlSixYtlJSUpGbNmunRRx/VjBkzdO7cuV/8PgIoPW9PDwCAtQUEBKhBgwau161atZLdbteMGTN05coVtWrVSvPnzy+wXlhY2E1v51rGGLegc7VMkmw2m9ufb7Sej4+P6882m83t9dWyK1euSJK8vLy0cuVKbdy4UStWrNDUqVP1+9//Xt98841iY2Nvak4AygZndgDcUjabTVWqVNGFCxfUsmVLpaWlKTw8XA0aNHBb7Ha77Ha7IiMj9fXXX7vWv3z5slJTU2+4ncaNG2vjxo1u98ps3LhRgYGBqlWrlho0aCBfX199+eWXrvq8vDxt2bJFjRo1+sVzTExM1GuvvaZt27bJ19e30PuMANwahB0A5crpdCojI0MZGRnau3evhg0bpuzsbPXu3VsDBgxQaGioHnroIX3xxRc6dOiQ1q9frxdffFHHjx+XJL344ot6/fXXtWTJEn3//fd67rnndP78+Rtu97nnntOxY8c0bNgwff/99/rkk080duxYjRw5UlWqVFFAQICeffZZ/e53v9Pnn3+uPXv2aOjQocrNzdWQIUNKPd9vvvlGEydO1JYtW3T06FF9/PHHOnXq1C8OUABKj8tYAMrV559/rsjISElSYGCg7rzzTi1evFidOnWSJG3YsEEvv/yy+vTpo6ysLNWqVUtJSUkKCgqSJI0aNUrp6ekaPHiwqlSpoqefflq//vWvlZmZWex2a9Wqpf/+97/63e9+pxYtWig4OFhDhgzR//zP/7javP7667py5YqefPJJZWVlKSEhQcuXL1eNGjVKPd+goCBt2LBBb7/9thwOh2JiYjRlyhT16NGj1H0C+GVshuchAQCAhXEZCwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWBphBwAAWNr/B1QiInF73ygoAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Scatter plot for Price vs Bedrooms\n", + "df.plot(\n", + "\tkind=\"scatter\",\n", + "\tx=\"Bedrooms\",\n", + "\ty=\"Price\",\n", + "\ttitle=\"House Price vs Bedrooms\"\n", + ")\n", + "plt.savefig('../images/house_price_vs_bedrooms.png')\n", + "plt.show()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can even do square footage vs bedrooms. \n" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkAAAAHFCAYAAAAaD0bAAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAASDZJREFUeJzt3XtcVXW+//H3VmGDCntEQVBILQ1F0zS8oOalvGU6mM3RsfJSWjmhY1qnxqZynKkwy0qzUZtM81eh0+CFk0liCWZiaYJdxtCmC6TgHbaXRIHv74+j+7gFFAjY4Ho9H4/1eMz6rs9a+7u+7HG/W1ebMcYIAADAQup4ugMAAADVjQAEAAAshwAEAAAshwAEAAAshwAEAAAshwAEAAAshwAEAAAshwAEAAAshwAEAAAshwAElGL58uWy2WxuU2BgoPr166f333+/0j+vZcuWmjBhQqVv1+o+++wz3XHHHbrmmmtkt9vVtGlTRUVF6ZFHHvF016rFq6++qtatW8vb21s2m025ubmV/hnbtm3TX/7ylyrZNlBVCEDAFSxbtkypqanatm2bXn/9ddWtW1fDhw/X//zP/3i6a7iC9evXq2fPnnI6nZo7d642btyo+fPnq1evXlq1apWnu1fl0tPT9cc//lH9+/fXxx9/rNTUVPn5+VX652zbtk2zZ88mAKFWqefpDgA1XYcOHRQZGemaHzJkiBo1aqS4uDgNHz68Wvvyyy+/yMfHRzabrVo/t7aaO3euWrVqpQ8//FD16v3fP3e///3vNXfuXI/27UpOnz6t+vXr/6ptfPPNN5Kk+++/X926daukngFXB44AAeXk4+Mjb29veXl5ubWfPXtWzzzzjNq2bSu73a7AwEDde++9Onz4sFvduXPn9Nhjjyk4OFj169dX79699fnnnxf7nAun4DZu3Kj77rtPgYGBql+/vvLz81VUVKS5c+e6PisoKEjjxo3Tzz//XGw7b775pjp16iQfHx8FBATojjvu0J49e9xqJkyYoIYNG+rbb7/V4MGD1aBBA4WEhGjOnDmSpO3bt6t3795q0KCBrr/+er311ltu658+fVqPPvqoWrVq5fqcyMhIxcXFlTqOu3fvls1m09KlS4st27Bhg2w2mxISEiRJhw8f1gMPPKCwsDDX2Pbq1UubNm0qdfuSdPToUTVp0sQt/FxQp477P3+l/V0uPTX5l7/8pcQAeuHv9eOPP7raVq1apUGDBikkJES+vr5q166d/vSnP+nUqVNu614Y/6+++kqDBg2Sn5+fbr31Vqkc36tL9evXT/fcc48kqXv37rLZbG77UZbvhSQlJCQoKipK9evXl5+fnwYOHKjU1FS38fjv//5vSVKrVq1cp4uTk5PLNQaS9I9//EPXX3+97Ha7IiIi9O6772rChAlq2bKlW11FxwRwYwCUaNmyZUaS2b59uzl37pw5e/asycrKMn/84x9NnTp1TGJioqu2sLDQDBkyxDRo0MDMnj3bJCUlmTfeeMM0b97cREREmNOnT7tqx48fb2w2m/nv//5vs3HjRvPSSy+Z5s2bG39/fzN+/Phin9+8eXPzwAMPmA0bNph//etfpqCgwDzwwANGkpkyZYpJTEw0ixcvNoGBgSYsLMwcPnzYtY3nnnvOSDJjxowx69evNytWrDDXXnutcTgcZu/evW598vb2Nu3atTPz5883SUlJ5t577zWSzMyZM831119vli5daj788EMzbNgwI8ns3LnTtf6DDz5o6tevb1566SWzefNm8/7775s5c+aYV1999bJj3LlzZ9OrV69i7aNGjTJBQUHm3LlzxhhjBg8ebAIDA83rr79ukpOTzdq1a83TTz9tVq5cedntT5o0yUgyU6dONdu3bzdnz54ttbasf5dZs2aZkv7pvPD3+uGHH1xtf/vb38zLL79s1q9fb5KTk83ixYtNq1atTP/+/Yt9tpeXl2nZsqWJjY01H330kfnwww/L9b261DfffGOefPJJI8ksW7bMpKammu+++86Ycnwv3nnnHSPJDBo0yKxdu9asWrXK3HTTTcbb29t88sknxhhjsrKyzNSpU40ks3r1apOammpSU1NNXl5eucZgyZIlRpK58847zfvvv2/eeecdc/3115sWLVqYFi1auOp+zZgAFyMAAaW48IN26WS3283f//53t9q4uDgjycTHx7u179ixw0hy1e/Zs8dIMtOnT3eru/BDU1IAGjdunFvthW089NBDbu2fffaZkWSeeOIJY4wxx48fN76+vmbo0KFudZmZmcZut5u77rrL1TZ+/Phi/T937pwJDAw0ksyuXbtc7UePHjV169Y1M2bMcLV16NDBjBgxokzjerEFCxYYSSYjI8PVduzYMWO3280jjzziamvYsKF5+OGHy739I0eO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4403mpdeesmcOXPGrf7cuXPmxRdfNJ06dTI+Pj6mYcOGpm3btubBBx80+/btc9Xl5+ebRx55xAQFBRkfHx/To0cPk5qaalq0aFHiXWAX38FzQWFhoXn++efN9ddfb7y8vEyTJk3MPffcY7KysorVvvHGG6Zjx47G29vbOBwOEx0dbb755hu3mvHjx5sGDRoUW7dv376mffv2xdpbtGhhbr/9dtf8n/70JxMZGWkaNWpk7Ha7ufbaa8306dPNkSNHyjTWe/fudY1xUlKS27IzZ86YyZMnm44dOxp/f3/j6+trwsPDzaxZs8ypU6cuu91Vq1aZu+66y7Rp08Y0bNjQeHl5mWuuucaMHTvW/Pvf/3arLevfxRhjPv/8c9OzZ0/ToEED07x5czNr1izzxhtvFLsTatu2bSYqKsrUr1/fBAYGmkmTJpldu3a5bk2/oLTxN+X4XpXkct+hsnwvjDFm7dq1pnv37sbHx8c0aNDA3HrrrebTTz8tVjdz5kzTrFkzU6dOHSPJbN68uVxjYIwxr7/+umndurXx9vY2119/vXnzzTdNdHS06dy5c6WNCXCBzVx8bBMA4KZly5bq16+f251qqB65ubm6/vrrNWLECL3++uue7g6uMpwCAwB4XE5Ojp599ln1799fjRs31k8//aSXX35ZJ06ccJ2qBCoTAQgA4HF2u10//vijHnroIR07dkz169dXjx49tHjxYrdHIgCVhVNgAADAcrgNHgAAWA4BCAAAWA4BCAAAWA4XQZegqKhIBw4ckJ+fX4mPpwcAADWPMUYnTpxQs2bN3B6gWRICUAkOHDigsLAwT3cDAABUQFZWVrF3JV6KAFSCCy/Ty8rKKvPrCQAAgGc5nU6FhYWV6aW4BKASXDjt5e/vTwACAKCWKcvlK1wEDQAALIcABAAALIcABAAALIcABAAALIcABAAALIcABAAALIcABAAALIcABAAALIcABAAALIcABAAALKfGBKDY2FjZbDY9/PDDl61LSUnRTTfdJB8fH1177bVavHhxsZr4+HhFRETIbrcrIiJCa9asqcKeAwCs4vvDJ7U545B+OHLK012p1WrCONaId4Ht2LFDr7/+ujp27HjZuh9++EFDhw7V/fffr7fffluffvqpHnroIQUGBurOO++UJKWmpmr06NH629/+pjvuuENr1qzRqFGjtHXrVnXv3r2a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QO1Tnt/vCl0D1KxZM6WnpysuLk67du1SUVGRJk6cqLvvvtvtomgAAICaqEKnwI4ePSpfX1/dd999euyxx9SkSRNlZGRo586dld9DAACASlauAPTVV1+pZcuWCgoKUtu2bZWenq5u3brp5Zdf1uuvv67+/ftr7dq1VddbAACASlCuAPTYY4/phhtuUEpKivr166dhw4Zp6NChysvL0/Hjx/Xggw9qzpw5VddbAACASlCui6CbNGmijz/+WB07dtTJkyfl7++vzz//XJGRkZKkb7/9Vj169FBubm5V9rnKcRE0AAC1T5W9C+zYsWMKDg6WJDVs2FANGjRQQECAa3mjRo104sSJivYbAACgWpT7IugLLz4tbR4AAKCmK/dt8BMmTJDdbpcknTlzRpMnT1aDBg0kSfn5+ZXfQwAAgEpWrgA0fvx4t/l77rmnWM24ceN+fa8AAACqULkC0LJly6quJwAAANWkQg9CBAAAqM08GoBiY2PVtWtX+fn5KSgoSCNGjFBGRsZl15kwYYJsNluxqX379q6a5cuXl1hz5syZatgrAABQ03k0AKWkpCgmJkbbt29XUlKSCgoKNGjQIJ06darUdebPn6/s7GzXlJWVpYCAAP3Xf/2XW52/v79bXXZ2tnx8fKphrwAAQE1XoZehVpbExES3+WXLlikoKEhffPGF+vTpU+I6DodDDofDNb927VodP35c9957r1udzWZzPbMIAADgYjXqGqC8vDxJcnu44pUsXbpUAwYMUIsWLdzaT548qRYtWig0NFTDhg1TWlpaqdvIz8+X0+l0mwAAwNWrxgQgY4xmzJih3r17q0OHDmVaJzs7Wxs2bNCkSZPc2tu2bavly5crISFBcXFx8vHxUa9evbRv374StxMbG+s6suRwOBQWFlYp+wQAAGqmcr0LrCrFxMRo/fr12rp1q0JDQ8u0TmxsrObNm6cDBw7I29u71LqioiJ16dJFffr00YIFC4otz8/Pd3uIo9PpVFhYGO8CAwCgFinPu8A8eg3QBVOnTlVCQoK2bNlS5vBjjNGbb76psWPHXjb8SFKdOnXUtWvXUo8A2e1219OtAQDA1c+jp8CMMZoyZYpWr16tjz/+WK1atSrzuikpKfruu+80ceLEMn1Oenq6QkJCfmWPAQDA1cCjR4BiYmL07rvvat26dfLz81NOTo50/k4vX19fSdLMmTO1f/9+rVixwm3dpUuXqnv37iVeLzR79mz16NFDbdq0kdPp1IIFC5Senq7XXnutmvYMAADUZB4NQIsWLZIk9evXz6192bJlmjBhgnT+QufMzEy35Xl5eYqPj9f8+fNL3G5ubq4eeOAB5eTkyOFwqHPnztqyZYu6detWZfsCAABqjxpzEXRNUp6LqAAAQM1Qnt/vGnMbPAAAQHUhAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMvxaACKjY1V165d5efnp6CgII0YMUIZGRmXXSc5OVk2m63Y9O2337rVxcfHKyIiQna7XREREVqzZk0V7w0AAKgtPBqAUlJSFBMTo+3btyspKUkFBQUaNGiQTp06dcV1MzIylJ2d7ZratGnjWpaamqrRo0dr7Nix2r17t8aOHatRo0bps88+q+I9AgAAtYHNGGM83YkLDh8+rKCgIKWkpKhPnz4l1iQnJ6t///46fvy4fvOb35RYM3r0aDmdTm3YsMHVNmTIEDVq1EhxcXFX7IfT6ZTD4VBeXp78/f1/xR4BAIDqUp7f7xp1DVBeXp4kKSAg4Iq1nTt3VkhIiG699VZt3rzZbVlqaqoGDRrk1jZ48GBt27atxG3l5+fL6XS6TQAA4OpVYwKQMUYzZsxQ79691aFDh1LrQkJC9Prrrys+Pl6rV69WeHi4br31Vm3ZssVVk5OTo6ZNm7qt17RpU+Xk5JS4zdjYWDkcDtcUFhZWiXsGAABqmnqe7sAFU6ZM0ZdffqmtW7deti48PFzh4eGu+aioKGVlZenFF190O21ms9nc1jPGFGu7YObMmZoxY4Zr3ul0EoIAALiK1YgjQFOnTlVCQoI2b96s0NDQcq/fo0cP7du3zzUfHBxc7GjPoUOHih0VusBut8vf399tAgAAVy+PBiBjjKZMmaLVq1fr448/VqtWrSq0nbS0NIWEhLjmo6KilJSU5FazceNG9ezZ81f3GQAA1H4ePQUWExOjd999V+vWrZOfn5/rqI3D4ZCvr690/vTU/v37tWLFCknSK6+8opYtW6p9+/Y6e/as3n77bcXHxys+Pt613WnTpqlPnz56/vnnFR0drXXr1mnTpk1XPL0GAACswaMBaNGiRZKkfv36ubUvW7ZMEyZMkCRlZ2crMzPTtezs2bN69NFHtX//fvn6+qp9+/Zav369hg4d6qrp2bOnVq5cqSeffFJPPfWUrrvuOq1atUrdu3evtn0DAAA1V416DlBNwXOAAACofWrtc4AAAACqAwEIAABYDgEIAABYDgEIAABYDgEIAABYDgEIAABYDgEIAABYDgEIAABYDgEIAABYDgEIAABYDgEIAABYDgEIAABYDgEIAABYDgEIAABYDgEIAABYDgEIAABYDgEIAABYDgEIAABYDgEIAABYDgEIAABYDgEIAABYDgEIAABYDgEIAABYDgEIAABYDgEIAABYDgEIAABYDgEIAABYDgEIAABYDgEIAABYDgEIAABYDgEIAABYjkcDUGxsrLp27So/Pz8FBQVpxIgRysjIuOw6q1ev1sCBAxUYGCh/f39FRUXpww8/dKtZvny5bDZbsenMmTNVvEcAAKA28GgASklJUUxMjLZv366kpCQVFBRo0KBBOnXqVKnrbNmyRQMHDtQHH3ygL774Qv3799fw4cOVlpbmVufv76/s7Gy3ycfHpxr2CgAA1HQ2Y4zxdCcuOHz4sIKCgpSSkqI+ffqUeb327dtr9OjRevrpp6XzR4Aefvhh5ebmVqgfTqdTDodDeXl58vf3r9A2AABA9SrP73eNugYoLy9PkhQQEFDmdYqKinTixIli65w8eVItWrRQaGiohg0bVuwI0cXy8/PldDrdJgAAcPWqMQHIGKMZM2aod+/e6tChQ5nXmzdvnk6dOqVRo0a52tq2bavly5crISFBcXFx8vHxUa9evbRv374StxEbGyuHw+GawsLCKmWfAABAzVRjToHFxMRo/fr12rp1q0JDQ8u0TlxcnCZNmqR169ZpwIABpdYVFRWpS5cu6tOnjxYsWFBseX5+vvLz813zTqdTYWFhnAIDAKAWKc8psHrV1qvLmDp1qhISErRly5Yyh59Vq1Zp4sSJeu+99y4bfiSpTp066tq1a6lHgOx2u+x2e4X6DgAAah+PngIzxmjKlClavXq1Pv74Y7Vq1apM68XFxWnChAl69913dfvt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eaaoqMi1DcbxyuM4f/58Exoaary8vMw111xjnnzySZOfn++2DauPY0njJ8ksW7bMVVNUVGRmzZplgoODjd1uN3369DFfffWV23YYxyuP47Jly0qsmTVrlqvGk+NoO78jAAAAlsE1QAAAwHIIQAAAwHIIQAAAwHIIQAAAwHIIQAAAwHIIQAAAwHIIQAAAwHIIQABQidauXavWrVurbt26evjhhz3dHQClIAAB8IhDhw7pwQcf1DXXXCO73a7g4GANHjxYqampnu7ar/Lggw/qd7/7nbKysvS3v/1NEyZM0IgRIzzdLQCXqOfpDgCwpjvvvFPnzp3TW2+9pWuvvVYHDx7URx99pGPHjnm6azp79qy8vb3Lvd7Jkyd16NAhDR48WM2aNauSvgGoJL/6ZRoAUE7Hjx83kkxycvJl6/bu3WtuvvlmY7fbTbt27czGjRuNJLNmzRpjLno31sXvBbrwotAffvjBGGPMkSNHzO9//3vTvHlz4+vrazp06GDeffddt8/p27eviYmJMdOnTzeNGzc2ffr0McYY880335jbbrvNNGjQwAQFBZl77rnHHD58uMS+lvSerr59+xZr27x5868ePwC/HqfAAFS7hg0bqmHDhlq7dq3y8/NLrCkqKtLIkSNVt25dbd++XYsXL9bjjz9e7s86c+aMbrrpJr3//vv6+uuv9cADD2js2LH67LPP3Oreeust1atXT59++qmWLFmi7Oxs9e3bVzfeeKN27typxMREHTx4UKNGjSrxc3r27KmMjAxJUnx8vLKzs5WQkKBRo0ZpyJAhys7OVnZ2tnr27FnufQBQ+TgFBqDa1atXT8uXL9f999+vxYsXq0uXLurbt69+//vfq2PHjpKkTZs2ac+ePfrxxx8VGhoqSXruued02223leuzmjdvrkcffdQ1P3XqVCUmJuq9995T9+7dXe2tW7fW3LlzXfNPP/20unTpoueee87V9uabbyosLEx79+7V9ddf7/Y53t7eCgoKkiQFBAQoODhYkuTr66v8/HzXPICagSNAADzizjvv1IEDB5SQkKDBgwcrOTlZXbp00fLlyyVJe/bs0TXXXOMKP5IUFRVV7s8pLCzUs88+q44dO6px48Zq2LChNm7cqMzMTLe6yMhIt/kvvvhCmzdvdh2tatiwodq2bStJ+s9//lPBvQZQU3AECIDH+Pj4aODAgRo4cKCefvppTZo0SbNmzdKECRNkjClWb7PZ3Obr1Pnf/4a7uPbcuXNuNfPmzdPLL7+sV155RTfccIMaNGighx9+WGfPnnWra9Cggdt8UVGRhg8frueff75YP0JCQiq4xwBqCgIQgBojIiJCa9eudf3vzMxMHThwwHVH1aW3yAcGBkqSsrOz1ahRI0lSenq6W80nn3yi6Oho3XPPPdL5YLNv3z61a9fusn3p0qWL4uPj1bJlS9WrV/F/Kr29vVVYWFjh9QFUDU6BAah2R48e1S233KK3335bX375pX744Qe99957mjt3rqKjoyVJAwYMUHh4uMaNG6fdu3frk08+0Z///Ge37bRu3VphYWH6y1/+or1792r9+vWaN29esZqkpCRt27ZNe/bs0YMPPqicnJwr9jEmJkbHjh3TmDFj9Pnnn+v777/Xxo0bdd9995Ur0LRs2VJffvmlMjIydOTIkWJHqAB4BgEIQLVr2LChunfvrpdffll9+vRRhw4d9NRTT+n+++/XwoULpfOnt9asWaP8/Hx169ZNkyZN0rPPPuu2HS8vL8XFxenbb79Vp06d9Pzzz+uZZ55xq3nqqafUpUsXDR48WP369VNwcHCZHkzYrFkzffrppyosLNTgwYPVoUMHTZs2TQ6Hw3XqrSzuv/9+hYeHKzIyUoGBgfr000/LvC6AqmMzJZ1oB4Aaymazac2aNTxdGcCvwhEgAABgOQQgAABgOdwFBqBW4aw9gMrAESAAAGA5BCAAAGA5BCAAAGA5BCAAAGA5BCAAAGA5BCAAAGA5BCAAAGA5BCAAAGA5BCAAAGA5/x99Ub49JHtviAAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Scatter plot for Bedrooms vs Square ft\n", + "df.plot(\n", + "\tkind=\"scatter\",\n", + "\tx=\"Square ft\",\n", + "\ty=\"Bedrooms\",\n", + "\ttitle=\"Bedrooms vs Square footage\"\n", + ")\n", + "plt.savefig('../images/bedrooms_vs_square_ft.png')\n", + "plt.show()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "Of course, these figures are somewhat meaningless due to how unpopulated our data is.\n", + "\n", + "Now let's get our matrices and linear systems set up with `pandas.DataFrame.to_numpy`.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "# Create our matrix X and our target y\n", + "X = df[[\"Square ft\", \"Bedrooms\"]].to_numpy()\n", + "y = df[[\"Price\"]].to_numpy()\n", + "\n", + "# Augment X with a column of 1's (intercept)\n", + "X_aug = np.hstack((np.ones((X.shape[0], 1)), X))\n", + "\n", + "# Solve the least-squares problem\n", + "beta = np.linalg.lstsq(X_aug,y)[0]\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "This yields\n" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "0d08c091", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[4.0098513e-13],\n", + " [3.0000000e-01],\n", + " [5.0000000e+00]])" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "beta" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "As the first parameter is basically 0, we are left with the second being 3/10 and the third being 5, just like our exact solution. Next, we will look at matrix decompositions and how they can help us find least-squares solutions. " + ] + }, + { + "cell_type": "markdown", + "id": "a1f82fae", + "metadata": {}, + "source": [ + "# Polynomial Regression\n", + "\n", + "Sometimes fitting a line to a set of $n$ data points clearly isn't the right thing to do. To emphasize the limitations of linear models, we generate data from a purely quadratic relationship. In this setting, the space of linear functions is not rich enough to capture the underlying structure, and the linear least-squares solution exhibits systematic error. Expanding the feature space to include quadratic terms resolves this issue.\n", + "\n", + "For example, suppose our data looked like the following. \n" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "52a5c824", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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7wzed+fw3jsnV9570zQ1PDys0tJS5eXNX9Xhup6PvLw8rVq1yulm2KqwsNDTH0g34713Bu+7c3jvnZML7/1CPR4xFJwCAABbET4AAICtCB8OKigoUGNjowoKCpxuSs7hvXcG77tzeO+dw3s/k+sKTgEAgLfR8wEAAGxF+AAAALYifAAAAFsRPgAAgK0IHy4zOjqqG2+8UYZhqLe31+nmeN5rr72mr371qyovL9fSpUu1evVqNTY2amxszOmmedKRI0dUXl4un8+ndevW6Ze//KXTTfK8lpYWfexjH5Pf79fKlSt122236de//rXTzco5LS0tMgxDDQ0NTjfFFQgfLrNnzx6VlpY63Yyc8e///u+amJjQ9773PZ05c0b/8A//oO9+97t68MEHnW6a5zzxxBNqaGjQvn379OKLL+oTn/iEtm7dqnPnzjndNE/r6urSrl279Nxzz6mzs1Pvvvuu6urqdOXKFaebljO6u7v1yCOPaM2aNU43xTWYausiP//5z7V792795Cc/0Uc+8hG9+OKLuvHGG51uVs751re+pdbWVv3mN79xuimeUl1drbVr16q1tTV+7MMf/rBuu+02tbS0ONq2XPLWW29p5cqV6urq0ic/+Umnm+N5b7/9ttauXasjR47ooYce0o033qhDhw453SzH0fPhEm+++aa+/vWv60c/+pGWLVvmdHNyWiQSUVFRkdPN8JSxsTG98MILqqurSzheV1enkydPOtauXBSJRCSJz7hNdu3apc9//vO65ZZbnG6Kq7huY7lcZJqm7rrrLt1zzz1av369XnvtNaeblLPOnj2r73znO/r7v/97p5viKRcvXtT4+LiKi4sTjhcXFyscDjvWrlxjmqZ2796tm2++WVVVVU43x/Mef/xx9fT0qLu72+mmuA49Hxbav3+/DMOY9/H888/rO9/5jqLRqPbu3et0kz0j2fd+qgsXLmjLli368z//c33ta19zrO1eZhhGws+mac44Buvce++9eumll/TYY4853RTPO3/+vO6//361tbXJ5/M53RzXoebDQhcvXtTFixfnPedDH/qQvvSlL6m9vT3hS3h8fFz5+fm64447dPToURta6y3JvvexL4ULFy7oU5/6lKqrq/WDH/xAeXnk8kwaGxvTsmXL9OMf/1hf+MIX4sfvv/9+9fb2qqury9H25YL77rtPTz31lJ599lmVl5c73RzPe+qpp/SFL3xB+fn58WPj4+MyDEN5eXkaHR1NeC7XED5c4Ny5c4pGo/GfL1y4oM9+9rP6p3/6J1VXV2vVqlWOts/r3njjDX3qU5/SunXr1NbWltNfCFaqrq7WunXrdOTIkfixyspK3XrrrRScWsg0Td1333168skn9Ytf/EIVFRVONyknDA8P6/XXX0849hd/8Rf60z/9Uz3wwAM5P+xFzYcLXHfddQk/X3vttZKk1atXEzwsduHCBdXU1Oi6667T3/3d3+mtt96KPxcMBh1tm9fs3r1bd955p9avX6+NGzfqkUce0blz53TPPfc43TRP27Vrl44dO6bjx4/L7/fHa2wCgYCWLl3qdPM8y+/3zwgYy5cv14oVK3I+eIjwgVx34sQJvfrqq3r11VdnBD06BTPri1/8oi5duqRvfOMbCoVCqqqq0tNPP63rr7/e6aZ5Wmxqc01NTcLx73//+7rrrrscahVyHcMuAADAVlTVAQAAWxE+AACArQgfAADAVoQPAABgK8IHAACwFeEDAADYivABAABsRfgAAAC2InwAAABbET4AAICtCB8AAMBWhA8AAGCr/w+aD+LZyFjp3gAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "## Generate data\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# 1) Generate quadratic data\n", + "np.random.seed(3)\n", + "\n", + "n = 50\n", + "x = np.random.uniform(-5, 5, n) # symmetric, wider range\n", + "\n", + "# True relationship: y = ax^2 + c + noise\n", + "a_true = 2.0\n", + "c_true = 5.0\n", + "noise = np.random.normal(0, 3, n)\n", + "\n", + "y = a_true * x**2 + c_true + noise\n", + "\n", + "## Generate scatter plot\n", + "plt.scatter(x,y)\n", + "\n", + "# plot it\n", + "plt.savefig('../images/quadratic_data_generated_1.png')\n", + "plt.show()\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "1221e35e", + "metadata": {}, + "source": [ + "\n", + "If we try to find a line of best fit, we get something that doesn't really describe or approximate our data at all...\n" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "bb6cd90d", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# find a line of best fit\n", + "a,b = np.polyfit(x, y, 1)\n", + "\n", + "# add scatter points to plot\n", + "plt.scatter(x,y)\n", + "\n", + "# add line of best fit to plot\n", + "plt.plot(x, a*x + b, 'r', linewidth=1)\n", + "\n", + "# plot it\n", + "plt.savefig('../images/quadratic_data_line_of_best_fit.png')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "a2d5bb71", + "metadata": {}, + "source": [ + "\n", + "This is an example of **underfitting** data, and we can do better. The same linear regression ideas work for fitting a degree $d$ polynomial model to a set of $n$ data points. Before, when trying to fit a line to points $(x_1,y_1),\\dots,(x_n,y_n)$, we had the following matrices\n", + "$$ \\tilde{X} = \\begin{bmatrix} 1 & x_1 \\\\ \\vdots & \\vdots \\\\ 1 & x_n \\end{bmatrix}, y = \\begin{bmatrix} y_1 \\\\ \\vdots \\\\ y_n \\end{bmatrix}, \\tilde{\\beta} = \\begin{bmatrix} \\beta_0 \\\\ \\beta_1 \\end{bmatrix} $$\n", + "in the matrix equation\n", + "$$ \\tilde{X}\\tilde{\\beta} = y, $$\n", + "and we were trying to find a vector $\\tilde{\\beta}$ which gave a best possible solution. This would give us a line $y = \\beta_0 + \\beta_1x$ which best approximates the data. To fit a polynomial $y = \\beta_0 + \\beta_1x + \\beta_2x^2 + \\cdots + \\beta_d^dx^d$ to the data, we have a similar set up.\n", + "\n", + "> **Definition**. The **Vandermonde matrix** is the $n \\times (d+1)$ matrix\n", + "> $$ V = \\begin{bmatrix} 1 & x_1 & x_1^2 & \\cdots & x_1^d \\\\ 1 & x_2 & x_2^2 & \\cdots & x_2^d \\\\ \\vdots & \\vdots & \\ddots & \\vdots \\\\ 1 & x_n & x_n^2 & \\cdots & x_n^d \\end{bmatrix}. $$\n", + "\n", + "With the Vandermonde matrix, to find a polynomial function of best fit, one just needs to find a least-squares solution to the matrix equation\n", + "$$ V\\tilde{\\beta} = y. $$\n", + "\n", + "With the generated data above, we get the following curve. " + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "8c569b38", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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19i4cSMbNmywOhSfo5EPD5owYQI2m63Cx1dffcW0adPIyclh3LhxVoccMKr6uy9u165d9OzZk5tuuom7777bstgDmc1mK/G10+ksdUw8Z+TIkXz33Xe8+uqrVocS8Hbs2MGoUaNYtGgR4eHhVofjc7Tmw4P27dvHvn37KjznzDPP5JZbbmH58uUlPoQdDgehoaH079+fF1980QvRBpaq/u4LPxR27drFZZddRseOHVm4cCEhIcrL3eno0aPUq1ePJUuWcN111xUdHzVqFJs2bSItLc3S+ILBvffeyzvvvMPq1auJjY21OpyA984773DdddcRGhpadMzhcGCz2QgJCSE/P7/Ec8FGyYcP+O2338jJySn6eteuXVx55ZW8+eabdOzYkaZNm1oaX6DbuXMnl112Ge3atWPRokVB/YHgSR07dqRdu3bMnDmz6FhcXBx9+vTRglMPcjqd3HvvvSxdupRPP/2Uli1bWh1SUMjNzeXXX38tceyOO+7gH//4B2PHjg36aS+t+fABZ5xxRomvTznlFABatGihxMPDdu3aRbdu3TjjjDN4+umn2bt3b9Fzdrvd0tgCzejRoxk4cCDt27enc+fOzJ07l99++42hQ4daHVpAGzFiBIsXL2bZsmVEREQUrbGJioqibt26VocXsCIiIkolGPXr16dRo0ZBn3ig5EOC3cqVK/n555/5+eefSyV6GhR0r5tvvpn9+/fz6KOPkpmZSXx8PO+//z7Nmze3OrSAVri1uVu3biWOv/DCCwwaNMiiqCTYadpFREREvEqr6kRERMSrlHyIiIiIVyn5EBEREa9S8iEiIiJepeRDREREvErJh4iIiHiVkg8RERHxKiUfIiIi4lVKPkRERMSrlHyIiIiIVyn5EBEREa9S8iEiIiJe9f9PV2iW1Xi0nAAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# polynomial fit with degree = 2\n", + "poly = np.polyfit(x,y,2)\n", + "model = np.poly1d(poly)\n", + "\n", + "# add scatter points to plot\n", + "plt.scatter(x,y)\n", + "\n", + "# add the quadratic to the plot\n", + "polyline=np.linspace(x.min(), x.max())\n", + "plt.plot(polyline, model(polyline), 'r', linewidth=1)\n", + "\n", + "\n", + "# plot it\n", + "plt.savefig('../images/quadratic_data_quadratic_of_best_fit')\n", + "plt.show()\n" + ] + }, + { + "cell_type": "markdown", + "id": "b567fe95", + "metadata": {}, + "source": [ + "\n", + "Solving these problems can be done with python. One can use `numpy.polyfit` and `numpy.poly1d`. \n", + "\n", + "> **Example**. Consider the following data.\n", + "> |House | Square ft | Bedrooms | Price (in $1000s) |\n", + "> | --- | --- | --- | --- |\n", + "> | 0 | 1600 | 3 | 500 |\n", + "> | 1 | 2100 | 4 | 650 |\n", + "> | 2 | 1550 | 2 | 475 |\n", + "> | 3 | 1600 | 3 | 490 |\n", + "> | 4 | 2000 | 4 | 620 |\n", + ">\n", + "> Suppose we wanted to predict the price of a house based on the square footage and we thought the relationship was cubic (it clearly isn't, but hey, for the sake of argument). So really we are looking at the subset of data\n", + "> |House | Square ft | Price (in $1000s) |\n", + "> | --- | --- | --- |\n", + "> | 0 | 1600 | 500 |\n", + "> | 1 | 2100 | 650 |\n", + "> | 2 | 1550 | 475 |\n", + "> | 3 | 1600 | 490 |\n", + "> | 4 | 2000 | 620 |\n", + ">\n", + "> Our Vandermonde matrix will be\n", + "> $$ V = \\begin{bmatrix} 1 & 1600 & 1600^2 & 1600^3 \\\\ 1 & 2100 & 2100^2 & 2100^3 \\\\ 1 & 1550 & 1550^2 & 1550^3 \\\\ 1 & 1600 & 1600^2 & 1600^3 \\\\ 1 & 2000 & 2000^2 & 2000^3 \\end{bmatrix} $$\n", + "> and our target vector will be\n", + "> $$ y = \\begin{bmatrix} 500 \\\\ 650 \\\\ 475 \\\\ 490 \\\\ 620 \\end{bmatrix}. $$\n", + "> As we can see, the entries of the Vandermonde matrix get very very large very fast. One can, if they are so inclined, compute a least-squares solution to $V\\tilde{\\beta} = y$ by hand. Let's not, but let us find, using python, a \"best\" cubic approximation of the relationship between the square footage and price.\n", + "\n", + "We will use `numpy.polyfit`, `numpy.pold1d` and `numpy.linspace`.\n", + "\n", + "Let's get a cubic of best fit.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "9bdf7560", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# First let us make a dictionary incorporating our data.\n", + "# Each entry corresponds to a column (feature of our data)\n", + "data = {\n", + " 'Square ft': [1600, 2100, 1550, 1600, 2000],\n", + " 'Bedrooms': [3, 4, 2, 3, 4],\n", + " 'Price': [500, 650, 475, 490, 620]\n", + "}\n", + "\n", + "# Create a pandas DataFrame\n", + "df = pd.DataFrame(data)\n", + "\n", + "# Extract x (square footage) and y (price)\n", + "x = df[\"Square ft\"].to_numpy(dtype=float)\n", + "y = df[\"Price\"].to_numpy(dtype=float)\n", + "\n", + "# Degree of polynomial\n", + "degree = 3 # cubic\n", + "\n", + "# Polyfit directly on x\n", + "cubic = np.poly1d(np.polyfit(x,y, degree))\n", + "\n", + "# Add fitted polynomial line and scatter plot\n", + "polyline = np.linspace(x.min(),x.max())\n", + "plt.scatter(x,y, label=\"Observed data\")\n", + "plt.plot(polyline, cubic(polyline), 'r', label=\"Cubic best fit\")\n", + "plt.xlabel(\"Square ft\")\n", + "plt.ylabel(\"Price (in $1000s)\")\n", + "plt.title(\"Cubic polynomial regression: Price vs Square Footage\")\n", + "plt.show()\n" + ] + }, + { + "cell_type": "markdown", + "id": "67efb4de", + "metadata": {}, + "source": [ + "Here `numpy.polyfit` computes the least-squares solution in the polynomial basis $1, x, x^2, x^3$, i.e., it solves the Vandermonde least-squares problem. So what is our cubic polynomial?" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "eaba0d42", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "poly1d([ 3.08080808e-07, -1.78106061e-03, 3.71744949e+00, -2.15530303e+03])" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cubic" + ] + }, + { + "cell_type": "markdown", + "id": "db109cf4", + "metadata": {}, + "source": [ + "The first term is the degree 3 term, the second the degree 2 term, the third the degree 1 term, and the fourth is the constant term. " + ] + }, + { + "cell_type": "markdown", + "id": "3f40d45e", + "metadata": {}, + "source": [ + "\n", + "\n", + "# Additional visualization: line of best fit\n", + "## Generated scatter plot example\n", + "The first figure is a line of best fit for scattered points. Here is some alternate code that will produce an image. We can do the following using `matplotlib.pyplot.axline`." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "a4bb276b", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA0oAAAIhCAYAAABwnkrAAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAznxJREFUeJzs3Xl8E2X+B/DPJGmatE0v6BFooVjKVcpNuZRbFI8FFNcb0NVdXXB/6rK6q6viuuuB6OoKousBgrq4KqCrgqhQFEGLnKXlKIXSAr0gvZu0zcz8/oCGhh6kmTaTpJ/369UX6WSaPE/zYZpvnmeeEWRZlkFEREREREQOGrUbQERERERE5G1YKBEREREREV2EhRIREREREdFFWCgRERERERFdhIUSERERERHRRVgoERERERERXYSFEhERERER0UVYKBEREREREV2EhRIREREREdFFWCgRkV/7+eefMWvWLPTo0QOBgYGIiYnBmDFj8Mc//rHDnnP79u1YtGgRysrKmtz3+uuvY+XKlR323M2ZOHEiBEFwfBmNRgwePBivvPIKJEly7Ddv3jwkJCS49Rye6FdaWhoEQUBaWppj21dffYVFixY1u78gCFiwYIFbz5WbmwtBELBkyZJW90tISMC8efPceg5Pyc3NxbXXXovIyEgIgoAHH3ywxX0TEhKcsmIwGNC7d288/PDDOHPmTIe1sbXXsTnz5s1zamfjry+++AIrV66EIAjIzc11/MyHH36IV155pYN6QET+SKd2A4iIOsqXX36JX/3qV5g4cSIWL14Ms9mMgoIC/PLLL1izZg1eeumlDnne7du34+mnn8a8efMQHh7udN/rr7+Orl27evzN9WWXXYYPPvgAAFBcXIw33ngDDz30EAoKCvDCCy8ofnxP9GvYsGHYsWMHBgwY4Nj21VdfYdmyZW16k92e1q1bh9DQUFWe21UPPfQQfv75Z7z77ruIjY2F2Wxudf9x48Y5CkSr1YpffvkFixYtwvfff49ffvmlQ9rozutoNBqxefPmJtv79euH+vp67Nixw6mvH374IQ4cONBqoUhE1BgLJSLyW4sXL0avXr3w9ddfQ6e7cLi75ZZbsHjxYlXb1p5kWYbNZoPRaGxxH6PRiNGjRzu+nz59Ovr164elS5fi73//OwICAjzUWveFhoY69cEbDB06VO0mXNKBAweQmpqKmTNnurR/eHi40+950qRJqKysxDPPPIMjR46gT58+Hdha12k0mlbzEBUV5dH2EJH/4dQ7IvJbZ8+eRdeuXZ2KpAYaTdPD34cffogxY8YgJCQEISEhGDJkCN555x3H/d988w1mzJiBuLg4x5Sk3/3ud05TkhYtWoQ//elPAIBevXo5pgOlpaUhISEBmZmZ2Lp1q2N746luFRUVWLhwIXr16gW9Xo/u3bvjwQcfRHV1tVM7G6aUvfHGG+jfvz8CAwPx3nvvtel3ExAQgOHDh6OmpgYlJSUt7mez2fCXv/zFqU3z5893mlZ4qX5d7KabbkJycrLTtuuvvx6CIODjjz92bNu9ezcEQcD//vc/oJmpd/PmzcOyZcscv5OGr8bTrQBg9erV6N+/P4KCgjB48GB88cUXbfpdtebiqXcNbfzPf/6Dxx9/HN26dUNoaCimTp2Kw4cPN/n5b7/9FlOmTEFoaCiCgoIwbtw4fPfddy49d15eHu644w5ER0cjMDAQ/fv3x0svveSYTtnQlqNHj2LDhg0t/n5cERYWBpzPTWO//PILfvWrXyEyMhIGgwFDhw7Ff//7X6d9ampqHLk2GAyIjIzEiBEj8J///Adow+vYFhdPvZs4cSK+/PJLnDhxwuk5iIhawxElIvJbY8aMwdtvv40//OEPuP322zFs2LAWR06efPJJPPPMM7jhhhvwxz/+EWFhYThw4ABOnDjh2CcnJwdjxozBPffcg7CwMOTm5uLll1/G5ZdfjoyMDAQEBOCee+6BxWLBa6+9hrVr1zqm/gwYMADr1q3D7NmzERYWhtdffx0AEBgYCJx/MzlhwgScPHkSjz32GAYNGoTMzEw8+eSTyMjIwLfffuv0xm79+vX44Ycf8OSTTyI2NhbR0dFt/v3k5ORAp9MhIiKi2ftlWcbMmTPx3Xff4S9/+QuuuOIK7N+/H0899RR27NiBHTt2IDAwsNV+NWfq1Kn45JNPUFBQALPZDLvdjq1bt8JoNOKbb77BTTfdBJwvInQ6HSZOnNjs4zzxxBOorq7GJ598gh07dji2N55u9eWXX2Lnzp3429/+hpCQECxevBizZs3C4cOHcdlll7X5d+aqxx57DOPGjcPbb7+NiooKPProo7j++utx8OBBaLVaAMD777+POXPmYMaMGXjvvfcQEBCAN998E1dddRW+/vprTJkypcXHLykpwdixY1FXV4dnnnkGCQkJ+OKLL7Bw4ULk5OTg9ddfd0xVnDVrFhITEx3T6S419U6WZdjtduB8obxz50688sorGDduHHr16uXYb8uWLbj66qsxatQovPHGGwgLC8OaNWtw8803o6amxlFAPvzww1i9ejX+/ve/Y+jQoaiursaBAwdw9uxZwMXXsSUN7WwgCILj99vY66+/jt/+9rfIycnBunXrLvm4RETAuQMiEZFfOnPmjHz55ZfLAGQAckBAgDx27Fj5ueeekysrKx37HTt2TNZqtfLtt9/u8mNLkiTX19fLJ06ckAHIn332meO+F198UQYgHz9+vMnPJScnyxMmTGiy/bnnnpM1Go28c+dOp+2ffPKJDED+6quvHNsAyGFhYbLFYnGprRMmTJCTk5Pl+vp6ub6+Xj59+rT85z//WQYg33TTTY795s6dK/fs2dPx/caNG2UA8uLFi50e76OPPpIByP/+978v2a/mHD16VAYgr1q1SpZlWd62bZsMQH7kkUfkXr16Ofa78sor5bFjxzq+37JliwxA3rJli2Pb/Pnz5Zb+lAGQY2Ji5IqKCse2wsJCWaPRyM8991yrbTx+/LgMQH7xxRdb3a9nz57y3Llzm7Txmmuucdrvv//9rwxA3rFjhyzLslxdXS1HRkbK119/vdN+oijKgwcPllNTU1t93obX7+eff3bafv/998uCIMiHDx92auO1117b6uM13rfh/0vjr9TUVLmgoMBp3379+slDhw6V6+vrnbZfd911stlslkVRlGVZlgcOHCjPnDmz1edt7XVszty5c5tt57hx42RZluUVK1Y0+T947bXXOuWbiOhSOPWOiPxWly5d8MMPP2Dnzp14/vnnMWPGDBw5cgR/+ctfkJKS4pgy980330AURcyfP7/VxysuLsZ9992H+Ph46HQ6BAQEoGfPngCAgwcPKmrrF198gYEDB2LIkCGw2+2Or6uuuqrJSm8AMHny5BZHgpqTmZmJgIAABAQEoFu3bnjppZdw++2346233mrxZxpOlL94gYabbroJwcHBLk8Ru1hiYiISEhLw7bffAud//ykpKbjjjjtw/Phx5OTkoLa2Ftu2bcPUqVPdeo4GkyZNgslkcnwfExOD6Ohop5HCjvCrX/3K6ftBgwYBgON5t2/fDovFgrlz5zq93pIk4eqrr8bOnTubTLlsbPPmzRgwYABSU1Odts+bNw+yLDe7yIGrLr/8cuzcuRM7d+7Ejz/+iHfeeQclJSWYPHmy4//M0aNHcejQIdx+++3A+ZGdhq9rrrkGBQUFjqmGqamp2LBhA/785z8jLS0NVqvV7bY1ZjQaHe1s+Go8VZaISClOvSMivzdixAiMGDECAFBfX49HH30U//znP7F48WIsXrzYcY5OXFxci48hSRKmTZuG06dP44knnkBKSgqCg4MhSRJGjx6t+M1fUVERjh492uLUwIuXZnZlWlJjiYmJWLNmjWPJ5169eiEoKKjVnzl79ix0Ol2Tk+IFQUBsbKxj6pQ7pkyZgo0bNwLnp9hdeeWVSElJQUxMDL799lskJSXBarUqLpS6dOnSZFtgYGC7vVl39XkbpiI2PG9RUREAYPbs2S0+hsViQXBwcLP3nT17ttnzwLp16+a4311hYWGO/y8AMHbsWAwYMABjxozBSy+9hOeee87R/oULF2LhwoXNPk5DZv/1r38hLi4OH330EV544QUYDAZcddVVePHFF5GUlOR2OzUajVM7iYjaGwslIupUAgIC8NRTT+Gf//wnDhw4ADRaHevkyZOIj49v9ucOHDiAffv2YeXKlZg7d65j+9GjR9ulXV27doXRaMS7777b4v2NtfVEdIPB0OY3lV26dIHdbkdJSYlTsSTLMgoLCzFy5Mg2PV5jU6ZMwTvvvIP09HT8/PPP+Otf/wqcHyn75ptvcOLECYSEhHjdKnftpeH1fO2111rsY0xMTIs/36VLFxQUFDTZfvr0aafHby8NI2L79u1zevy//OUvuOGGG5r9mb59+wIAgoOD8fTTT+Ppp59GUVGRY3Tp+uuvx6FDh9q1nURE7YmFEhH5rYbFAi7WME2u4dP3adOmQavVYvny5RgzZkyzj9VQmFy8SMGbb77ZZN+LRw8uvq+57ddddx2effZZdOnSxemEeTVNmTIFixcvxvvvv4+HHnrIsf3TTz9FdXW102IDbR2lmTJlCgRBwBNPPAGNRoPx48cD5xd6+NOf/oQTJ05g/Pjxl1y2vPHvurXl0b3NuHHjEB4ejqysLLcuijtlyhQ899xz2L17N4YNG+bYvmrVKgiCgEmTJrVre/fu3QsAjkVD+vbti6SkJOzbtw/PPvusy48TExODefPmYd++fXjllVdQU1ODoKAgj7yOnhhJJCL/wkKJiPzWVVddhbi4OFx//fXo168fJEnC3r178dJLLyEkJAT/93//B5xf4vmxxx7DM888A6vViltvvRVhYWHIysrCmTNn8PTTT6Nfv35ITEzEn//8Z8iyjMjISPzvf//DN9980+R5U1JSAACvvvoq5s6di4CAAPTt2xcmkwkpKSlYs2YNPvroI1x22WUwGAxISUnBgw8+iE8//RTjx4/HQw89hEGDBkGSJOTl5WHTpk344x//iFGjRnn093fllVfiqquuwqOPPoqKigqMGzfOserd0KFDceeddzr1ubl+tSQ6OhoDBw7Epk2bMGnSJMc0wKlTp8JiscBiseDll1++ZBsbnuOFF17A9OnTodVqMWjQIOj1+nb5HWRkZOCTTz5psn3kyJGO89PcERISgtdeew1z586FxWLB7NmzER0djZKSEuzbtw8lJSVYvnx5iz//0EMPYdWqVbj22mvxt7/9DT179sSXX36J119/Hffff7+iax2VlZXhp59+As5PVT148CCeffZZBAYGOp3H9+abb2L69Om46qqrMG/ePHTv3h0WiwUHDx7E7t27HUu9jxo1Ctdddx0GDRqEiIgIHDx4EKtXr8aYMWMcr3tHv44Nz7F27VosX74cw4cP59Q9Iro0tVeTICLqKB999JF82223yUlJSXJISIgcEBAg9+jRQ77zzjvlrKysJvuvWrVKHjlypGwwGOSQkBB56NCh8ooVKxz3Z2VlyVdeeaVsMpnkiIgI+aabbpLz8vJkAPJTTz3l9Fh/+ctf5G7duskajcZppbbc3Fx52rRpsslkkgE4rcJVVVUl//Wvf5X79u0r6/V6OSwsTE5JSZEfeughubCw0LEfAHn+/Pku/x4aVr27lItXvZNlWbZarfKjjz4q9+zZUw4ICJDNZrN8//33y6WlpU77tdavljz00EMyAPkf//iH0/akpCQZgLx//36n7c2teldbWyvfc889clRUlCwIgtNKZy39ni5eqa45DavetfTVkIuWVr37+OOPm328xnmSZVneunWrfO2118qRkZFyQECA3L17d/naa69t8vPNOXHihHzbbbfJXbp0kQMCAuS+ffvKL774omO1ucb9dXfVO61WK/fo0UOePXu2vGfPnib779u3T/71r38tR0dHywEBAXJsbKw8efJk+Y033nDs8+c//1keMWKEHBERIQcGBsqXXXaZ/NBDD8lnzpxx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R5TcVJxZjJKDJTCZTU3OORIEAaZYE0qySlCceWG6WntOvWuJLMtO7dmyZQuuvPJKdO/eHSaTCXPmzMHZs2dRXV3d6uPs2bMHM2bMQM+ePWEymTBx4kTgfBHSmtdffx0hISEwGAz41a9+hTvuuANPPfUUDh48CJ1Oh1GjRjn27dKlC/r27YuDBw+2+HgJCQmOIgkAzGbzJacA3n///VizZg2GDBmCRx55BNu3b291f18iyzIqKio4bYHcwvyQEswPKcUMqePiD/f1IXpotBrHh/vWUivSl6V7/TQ8NfLDQslNtlIbxFoROmPzg3I6ow5irQhbqfMqdx059Q4ADh48iF69egEATpw4gWuuuQYDBw7Ep59+il27dmHZsmUA0Op0t+rqakybNg0hISF4//33sXPnTqxbt86l9t9+++3Yu3cvcnJyYLVa8c477yAoKKjFUF9c2F0sICDA6XtBEC455Dp9+nScOHECDz74IE6fPo0pU6Y4phT6OkmScPr0aU5bILcwP6QE80NKMUPqcOfDfW+kRn5YKLnJEGGANlALu7X5FebsVju0gVoYIgyObQ1T79pj1bvmbN68GRkZGbjxxhsBAL/88gvsdjteeukljB49Gn369MHp06edfkav1zdZvvvQoUM4c+YMnn/+eVxxxRXo16+fSws5AEBYWBh69+6N+Ph4p1VJBgwYALvdjp9//tmx7ezZszhy5Aj69+/vdp+baz8AREVFYd68eXj//ffxyiuv4N///rfbz+FNtFot+vXrxxWDyC3MDynB/JBSzJA63P1w39uokR8WSm6KTo5GVP8oVBZWNhktkWUZlYWViBoQhejkaKftdru9XYYMa2trUVhYiFOnTmH37t149tlnMWPGDFx33XWYM2cOACAxMRF2ux2vvfYajh07htWrV+ONN95wepyEhARUVVXhu+++w5kzZ1BTU4MePXpAr9c7fu7zzz/HM888o6i9SUlJmDFjBu69915s27YN+/btwx133IHu3btjxowZbj9uQkICfv75Z+Tm5uLMmTOQJAlPPvkkPvvsMxw9ehSZmZn44osvFBVj3kSWZZSVlXHaArmF+SElmB9SihlShzsf7nsjNfLDQslNgkZA6oJUGCOMsORYUFdVB0mUUFdVB0uOBcYII1LnpzoWcmjQXtc42rhxI8xmMxISEnD11Vdjy5Yt+Ne//oXP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8+YZ1i7yDpqmYf369XjnnXdw4MABjBw50ugmkRe59dZbkZ6ejrS0NNefGTNmYNWqVUhLS2ORRDc0f/78LlsSnD9/HsOHDzesTeQ9GhsbIcvubzctFguXB6c+GTlyJGJiYtzeUzc3N+Pw4cP98p6aI0o62bhxI771rW9hxowZmDt3LrZv346CggI8/vjjRjeNTG7dunV466238N577yE0NNQ1MhkWFgar1Wp088jkQkNDu1zPFhISgqFDh/I6N+qR//zP/8S8efOwadMm3HvvvUhNTcX27duxfft2o5tGXuDuu+/GL3/5SyQkJCA5ORmnT5/GSy+9hIcfftjoppFJ1dfXIycnx/X1xYsXkZaWhoiICCQkJGDDhg3YtGkTEhMTkZiYiE2bNiE4OBgPPPCAx9vC5cF19Oqrr+L5559HSUkJJk6ciF//+tdc3plu6Fpzbnfu3Ik1a9bo3h7yfosWLeLy4NQr77//Pn784x8jOzsbI0eOxMaNG/Hoo48a3SzyAnV1dXj66afx7rvvwm63IzY2Fvfffz+eeeYZBAQEGN08MqFDhw5h8eLFXY6vXr0au3btgqZp+PnPf47XXnsNVVVVmD17NrZu3dovH/6xUCIiIiIiIuqE1ygRERERERF1wkKJiIiIiIioExZKREREREREnbBQIiIiIiIi6oSFEhERERERUScslIiIiIiIiDphoURERERERNQJCyUiIiIiIqJOWCgRERF1kpeXB0mSkJaWZnRTiIjIICyUiIjIdBRFwbx587By5Uq34zU1NYiPj8dPf/rTGz7HW2+9BYvFgscff7zXPz8+Ph4lJSWYOHFir7+XiIh8g6RpmmZ0I4iIiDrLzs7G1KlTsX37dqxatQoA8NBDD+GLL77AiRMnEBAQcN3vX7p0KWbOnIlt27ahuLgYwcHBOrWciIh8AUeUiIjIlBITE7F582Y88cQTKC4uxnvvvYe9e/di9+7dNyyS8vLycOzYMTz11FMYP3483n77bbf7H374YUyePBlOpxMA0NLSgunTp7sKss5T76qqqrBq1SpERkbCarUiMTERO3fu7Le+ExGR8VgoERGRaT3xxBOYMmUKHnroIXz729/GM888g6lTp97w+3bs2IE777wTYWFhePDBB/H666+73f/b3/4WDQ0NeOqppwAATz/9NCoqKvDqq692+3xPP/00MjMz8eGHH+Ls2bPYtm0bhg0b5qFeEhGRGfkZ3QAiIqJrkSQJ27ZtQ1JSEiZNmuQqbK5HVVXs2rULr7zyCgDgvvvuw8aNG5GTk4MxY8YAAAYNGoQ9e/Zg4cKFCA0NxYsvvoiPP/4YYWFh3T5nQUEBpk2bhhkzZgAARowY4dF+EhGR+XBEiYiITG3Hjh0IDg7GxYsXUVRUdMPH79u3Dw0NDVi+fDkAYNiwYVi2bBl27Njh9ri5c+fiySefxP/+7//iBz/4ARYsWHDN5/zOd76DvXv3YurUqfjhD3+IY8eOeaBnRERkZiyUiIjItD777DP8+te/xnvvvYe5c+fikUcewY3WINqxYwcqKysRHBwMPz8/+Pn54YMPPsDu3buhKIrrcaqq4tNPP4XFYkF2dvZ1n3P58uXIz8/Hhg0bUFxcjFtvvRVPPvmkx/pJRETmw0KJiIhMyeFwYPXq1XjsscewdOlS/OEPf8CJEyfw2muvXfN7Ll++7Fr0IS0tze1PfX09PvzwQ9djX3jhBZw9exaHDx/GRx99dMPFGSIjI7FmzRrs2bMHL7/8MrZv3+7R/hIRkbnwGiUiIjKlp556Cqqq4rnnngMAJCQk4MUXX8TGjRtx++23d3ud0JtvvomhQ4fim9/8JmTZ/bPAu+66C6+//jruuusupKWl4ZlnnsHbb7+N+fPn4ze/+Q2+//3vY+HChRg1alSX533mmWcwffp0JCcnw+l04v3330dSUlI/9p6IiIzGESUiIjKdw4cPY+vWrdi1axdCQkJcxx999FHMmzfvmlPwduzYga9//etdiiQAWLlyJd5//33k5+dj1apVWLNmDe6++24AwCOPPIKlS5fiW9/6ltv0vHYBAQH48Y9/jMmTJ2PBggWwWCzYu3evx/tNRETmwQ1niYiIiIiIOuGIEhERERERUScslIiIiIiIiDphoURERERERNQJCyUiIiIiIqJOWCgRERERERF1wkKJiIiIiIioExZKREREREREnbBQIiIiIiIi6oSFEhERERERUScslIiIiIiIiDphoURERERERNTJ/w/YE0nmUZe6zgAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# Generate data (same as above)\n", + "np.random.seed(3)\n", + "x = np.random.uniform(0, 10, 50)\n", + "y = 2.5 * x + 5 + np.random.normal(0, 2, 50)\n", + "\n", + "# Calculate slope and intercept\n", + "slope, intercept = np.polyfit(x, y, 1)\n", + "\n", + "plt.figure(figsize=(10, 6))\n", + "plt.scatter(x, y, color='purple', label='Data Points', alpha=0.7)\n", + "# Plot the line using axline\n", + "# xy1=(0, intercept) is the y-intercept point\n", + "\n", + "# slope=slope defines the steepness\n", + "plt.axline(xy1=(0, intercept), slope=slope, color='steelblue', linestyle='--', linewidth=2, label='Line of Best Fit')\n", + "\n", + "# Add the equation to the plot\n", + "# The f-string formats the slope and intercept to 2 decimal places\n", + "plt.text(1, 25, f'y = {slope:.2f}x + {intercept:.2f}', fontsize=12, bbox=dict(facecolor='white', alpha=0.8))\n", + "\n", + "\n", + "plt.xlabel('X Axis')\n", + "plt.ylabel('Y Axis')\n", + "plt.title('Scatter Plot with Line of Best Fit')\n", + "plt.legend()\n", + "plt.grid(True, linestyle=':', alpha=0.6)\n", + "plt.show()\n" + ] + }, + { + "cell_type": "markdown", + "id": "c17fbdaf", + "metadata": {}, + "source": [ + "\n", + "\n", + "See\n", + "- https://stackoverflow.com/questions/37234163/how-to-add-a-line-of-best-fit-to-scatter-plot\n", + "- https://www.statology.org/line-of-best-fit-python/\n", + "- https://stackoverflow.com/questions/6148207/linear-regression-with-matplotlib-numpy\n" + ] + } + ], + "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.14.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/02_qr_svd.ipynb b/notebooks/02_qr_svd.ipynb new file mode 100644 index 0000000..87f950c --- /dev/null +++ b/notebooks/02_qr_svd.ipynb @@ -0,0 +1,914 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# QR Decompositions\n", + "\n", + "QR decompositions are a powerful tool in linear algebra and data science for several reasons. They provide a way to decompose a matrix into an orthogonal matrix $Q$ aand an upper triangular matrix $R$, which can simplify many computations and analyses.\n", + "\n", + "> **Theorem**: Let $A$ is an $m \\times n$ matrix with linearly independent columns ($m \\geq n$ in this case), then $A$ can be decomposed as $A = QR$ where $Q$ is an $m \\times n$ matrix whose columns form an orthonormal basis for Col($A$) and $R$ is an $n \\times n$ upper-triangular invertible matrix with positive entries on the diagonal.\n", + "\n", + "In the literature, sometimes the QR decomposition is phrased as follows: any $m \\times n$ matrix $A$ can also be written as $A = QR$ where $Q$ is an $m \\times m$ orthogonal matrix ($Q^T = Q^{-1}$), and $R$ is an $m \\times n$ upper-triangular matrix. One follows from the other by playing around with some matrix equations. Indeed, suppose that $A = Q_1R_1$ is a decomposition as above (that is, $Q_1$ is $m \\times n$ and $R_1$ is $n \\times n$). Use can use the Gram-Schmidt procedure to extend the columns of $Q_1$ to an orthonormal basis for all of $\\mathbb{R}^m$, and put the remaining vectors in a $(m - n) \\times n$ matrix $Q_2$. Then\n", + "\n", + "$$ A = Q_1R_1 = \\begin{bmatrix} Q_1 & Q_2 \\end{bmatrix}\\begin{bmatrix} R_1 \\\\ 0 \\end{bmatrix}. $$\n", + "\n", + "The left matrix is an $m \\times m$ orthogonal matrix and the right matrix is $m \\times n$ upper triangular. Moreover, the decomposition provides orthonormal bases for both the column space of $A$ and the perp of the column space of $A$; $Q_1$ will consist of an orthonormal basis for the column space of $A$ and $Q_2$ will consist of an orthonormal basis for the perp of the column space of $A$. \n", + "\n", + "However, we will often want to use the decomposition when $Q$ is $m \\times n$, $R$ is $n \\times n$, and the columns of $Q$ form an orthonormal basis for the column space of $A$. For example, the python function `numpy.linalg.qr` give QR decompositions this way (again, assuming that the columns of $A$ are linearly independent, so $m \\geq n$).\n", + "\n", + "> **Key take-away**. The QR decomposition provides an orthonormal basis for the column space of $A$. If $A$ has rank $k$, then the first $k$ columns of $Q$ will form a basis for the column space of $A$. \n", + "\n", + "For small matrices, one can find $Q$ and $R$ by hand, assuming that $A = [ a_1\\ \\cdots\\ a_n ]$ has full column rank. Let $e_1,\\dots,e_n$ be the unnormalized vectors we get when we apply Gram-Schmidt to $c_1,\\dots,c_n$, and let $u_1,\\dots,u_n$ be their normalizations. Let\n", + "$$ r_j = \\begin{bmatrix} \\langle e_1,c_j \\rangle \\\\ \\vdots \\\\ \\langle e_n, c_j \\rangle \\end{bmatrix}, $$\n", + "and note that $\\langle e_i,c_j \\rangle = 0$ whenever $i > j$. Thus\n", + "$$ Q = \\begin{bmatrix} u_1 & \\cdots & u_n \\end{bmatrix} \\text{ and } R = \\begin{bmatrix} r_1 & \\cdots & r_n \\end{bmatrix} $$\n", + "give rise to a $A = QR$, where the columns of $Q$ form an orthonormal basis for $\\text{Col}(A)$ and $R$ is upper-triangular. We can also compute $R$ directly from $Q$ and $Q$. Indeed, note that $Q^TQ = I$, so\n", + "$$ Q^TA = Q^T(QR) = IR = R. $$\n", + "\n", + "> **Example**. Find a QR decomposition for the matrix\n", + "> $$ A = \\begin{bmatrix} 1 & 1 & 1 \\\\ 0 & 1 & 1 \\\\ 0 & 0 & 1 \\\\ 0 & 0 & 0 \\end{bmatrix}. $$\n", + "> Note that one trivially see (or by applying the Gram-Schmidt procedure) that\n", + "> $$ \\begin{bmatrix} 1 \\\\ 0 \\\\ 0 \\\\ 0 \\end{bmatrix}, \\begin{bmatrix} 0 \\\\ 1 \\\\ 0 \\\\ 0 \\end{bmatrix}, \\begin{bmatrix} 0 \\\\ 0 \\\\ 1 \\\\ 0 \\end{bmatrix} $$\n", + "> forms an orthonormal basis for the column space of $A$. So with\n", + "> $$ Q = \\begin{bmatrix} 1 & 0 & 0 \\\\ 0 & 1 & 0 \\\\ 0 & 0 & 1 \\\\ 0 & 0 & 0 \\end{bmatrix} \\text{ and }R = \\begin{bmatrix} 1 & 1 & 1\\\\ 0 & 1 & 1 \\\\ 0 & 0 & 1 \\end{bmatrix}, $$\n", + "> we have $A = QR$.\n", + "\n", + "Let's do a more involved example.\n", + "> **Example**. Consider the matrix\n", + "> $$ A = \\begin{bmatrix} 1 & 0 & 0 \\\\ 1 & 1 & 0 \\\\ 1 & 1 & 1 \\\\ 1 & 1 & 1 \\end{bmatrix}. $$\n", + "> One can apply the Gram-Schmidt procedure to the columns of $A$ to find that\n", + "> $$ \\begin{bmatrix} 1 \\\\ 1 \\\\ 1 \\\\ 1 \\end{bmatrix}, \\begin{bmatrix} -3 \\\\ 1 \\\\ 1 \\\\ 1 \\end{bmatrix}, \\begin{bmatrix} 0 \\\\ -\\frac{2}{3} \\\\ \\frac{1}{3} \\\\ \\frac{1}{3}\\end{bmatrix} $$\n", + "> forms an orthogonal basis for the column space of $A$. Normalizing, we get that\n", + "> $$ Q = \\begin{bmatrix} \\frac{1}{2} & -\\frac{3}{\\sqrt{12}} & 0 \\\\ \\frac{1}{2} & \\frac{1}{\\sqrt{12}} & -\\frac{2}{\\sqrt{6}} \\\\ \\frac{1}{2} & \\frac{1}{\\sqrt{12}} & \\frac{1}{\\sqrt{6}} \\\\ \\frac{1}{2} & \\frac{1}{\\sqrt{12}} & \\frac{1}{\\sqrt{6}} \\end{bmatrix} $$\n", + "> is an appropriate $Q$. Thus\n", + "> $$ \\begin{split} R = Q^TA &= \\begin{bmatrix} \\frac{1}{2} & \\frac{1}{2} & \\frac{1}{2} & \\frac{1}{2} \\\\ -\\frac{3}{\\sqrt{12}} & \\frac{1}{\\sqrt{12}} & \\frac{1}{\\sqrt{12}} & \\frac{1}{\\sqrt{12}} \\\\ 0 & -\\frac{2}{\\sqrt{6}} & \\frac{1}{\\sqrt{6}} & \\frac{1}{\\sqrt{6}} \\end{bmatrix}\\begin{bmatrix} 1 & 0 & 0 \\\\ 1 & 1 & 0 \\\\ 1 & 1 & 1 \\\\ 1 & 1 & 1 \\end{bmatrix} \\\\ &= \\begin{bmatrix} 2 & \\frac{3}{2} & 1 \\\\ 0 & \\frac{3}{\\sqrt{12}} & \\frac{2}{\\sqrt{12}} \\\\ 0 & 0 & \\frac{2}{\\sqrt{6}} \\end{bmatrix}. \\end{split} $$\n", + "> So all together,\n", + "> $$A = \\begin{bmatrix} \\frac{1}{2} & -\\frac{3}{\\sqrt{12}} & 0 \\\\ \\frac{1}{2} & \\frac{1}{\\sqrt{12}} & -\\frac{2}{\\sqrt{6}} \\\\ \\frac{1}{2} & \\frac{1}{\\sqrt{12}} & \\frac{1}{\\sqrt{6}} \\\\ \\frac{1}{2} & \\frac{1}{\\sqrt{12}} & \\frac{1}{\\sqrt{6}} \\end{bmatrix}\\begin{bmatrix} 2 & \\frac{3}{2} & 1 \\\\ 0 & \\frac{3}{\\sqrt{12}} & \\frac{2}{\\sqrt{12}} \\\\ 0 & 0 & \\frac{2}{\\sqrt{6}} \\end{bmatrix}. $$\n", + "\n", + "To do this numerically, we can use `numpy.linalg.qr`.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "# Define our matrices\n", + "A = np.array([[1,1,1],[0,1,1],[0,0,1],[0,0,0]])\n", + "B = np.array([[1,0,0],[1,1,0],[1,1,1],[1,1,1]])\n", + "\n", + "# Take QR decompositions\n", + "QA, RA = np.linalg.qr(A)\n", + "QB, RB = np.linalg.qr(B)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "Our resulting matrices are:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "b48e6d97", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "QA = [[ 1. 0. 0.]\n", + " [-0. 1. 0.]\n", + " [-0. -0. 1.]\n", + " [-0. -0. -0.]]\n", + "\n", + "RA = [[1. 1. 1.]\n", + " [0. 1. 1.]\n", + " [0. 0. 1.]]\n", + "\n", + "QB = [[-0.5 0.8660254 0. ]\n", + " [-0.5 -0.28867513 0.81649658]\n", + " [-0.5 -0.28867513 -0.40824829]\n", + " [-0.5 -0.28867513 -0.40824829]]\n", + "\n", + "RB = [[-2. -1.5 -1. ]\n", + " [ 0. -0.8660254 -0.57735027]\n", + " [ 0. 0. -0.81649658]]\n" + ] + } + ], + "source": [ + "print(f\"QA = {QA}\\n\")\n", + "print(f\"RA = {RA}\\n\")\n", + "print(f\"QB = {QB}\\n\")\n", + "print(f\"RB = {RB}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## How to use QR decompositions\n", + "\n", + "One of the primary uses of QR decompositions is to solve least squares problems, as introduced above. Assuming that $A$ has full column rank, we can write $A = QR$ as a QR decomposition, and then we can find a least-squares solution to $Ax = b$ by solving the upper-triangular system.\n", + "\n", + "> **Theorem**. Let $A$ be an $m \\times n$ matrix with full column rank, and let $A = QR$ be a QR factorization of $A$. Then, for each $b \\in \\mathbb{R}^m$, the equation $Ax = b$ has a unique least-squares solution, arising from the system\n", + "> $$ Rx = Q^Tb. $$\n", + "\n", + "Normal equations can be *ill-conditioned*, i.e., small errors in calculating $A^TA$ give large errors when trying to solve the least-squares problem. When $A$ has full column rank, a QR factorization will allow one to compute a solution to the least-squares problem more reliably. \n", + "\n", + "> **Example**. Let\n", + "> $$ A = \\begin{bmatrix} 1 & 0 & 0 \\\\ 1 & 1 & 0 \\\\ 1 & 1 & 1 \\\\ 1 & 1 & 1 \\end{bmatrix} \\text{ and } b = \\begin{bmatrix} 1 \\\\ 1 \\\\ 1 \\\\ 0 \\end{bmatrix}. $$\n", + "> We can find the least-squares solution $Ax = b$ by using the QR decomposition. Let us use the QR decomposition from above, and solve the system\n", + "> $$ Rx = Q^Tb. $$\n", + "> As\n", + "> $$ \\begin{bmatrix} \\frac{1}{2} & -\\frac{3}{\\sqrt{12}} & 0 \\\\ \\frac{1}{2} & \\frac{1}{\\sqrt{12}} & -\\frac{2}{\\sqrt{6}} \\\\ \\frac{1}{2} & \\frac{1}{\\sqrt{12}} & \\frac{1}{\\sqrt{6}} \\\\ \\frac{1}{2} & \\frac{1}{\\sqrt{12}} & \\frac{1}{\\sqrt{6}} \\end{bmatrix}^T\\begin{bmatrix} 1 \\\\ 1 \\\\ 1 \\\\ 0 \\end{bmatrix} = \\begin{bmatrix} \\frac{3}{2} \\\\ -\\frac{1}{2\\sqrt{3}} \\\\ -\\frac{1}{\\sqrt{6}}, \\end{bmatrix} $$\n", + "> we are looking at the system\n", + "> $$ \\begin{bmatrix} 2 & \\frac{3}{2} & 1 \\\\ 0 & \\frac{3}{\\sqrt{12}} & \\frac{2}{\\sqrt{12}} \\\\ 0 & 0 & \\frac{2}{\\sqrt{6}} \\end{bmatrix}x =\\begin{bmatrix} \\frac{3}{2} \\\\ -\\frac{1}{2\\sqrt{3}} \\\\ -\\frac{1}{\\sqrt{6}} \\end{bmatrix}. $$\n", + "> Solving this system yields that\n", + "> $$ x_0 = \\begin{bmatrix} 1 \\\\ 0 \\\\ -\\frac{1}{2} \\end{bmatrix} $$\n", + "> is a least-squares solution to $Ax = b$.\n", + "\n", + "Let us set this system up in python and use `numpy.linalg.solve`. \n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "# Define matrix and vector\n", + "A = np.array([[1,0,0],[1,1,0],[1,1,1],[1,1,1]])\n", + "b = np.array([[1],[1],[1],[0]])\n", + "\n", + "# Take the QR decomposition of A\n", + "Q, R = np.linalg.qr(A)\n", + "\n", + "# Solve the linear system Rx = Q.T b\n", + "beta = np.linalg.solve(R,Q.T @ b)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "This yields\n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "3f71de8a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 1.00000000e+00],\n", + " [ 6.40987562e-17],\n", + " [-5.00000000e-01]])" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "beta" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "which (basically) agrees with our exact least-squares solution.\n", + "Note that `numpy.linalg.lstsq` still gives a **ever so slightly** different result. \n" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "dcda7f8d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 1.00000000e+00],\n", + " [ 2.22044605e-16],\n", + " [-5.00000000e-01]])" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.linalg.lstsq(A,b)[0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "---\n", + "\n", + "Let's go back to the house example. While we're at it, let's get used to using pandas to make a dataframe. \n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "\n", + "# First let us make a dictionary incorporating our data.\n", + "# Each entry corresponds to a column (feature of our data)\n", + "data = {\n", + " 'Square ft': [1600, 2100, 1550, 1600, 2000],\n", + " 'Bedrooms': [3, 4, 2, 3, 4],\n", + " 'Price': [500, 650, 475, 490, 620]\n", + "}\n", + "\n", + "# Create a pandas DataFrame\n", + "df = pd.DataFrame(data)\n", + "\n", + "# Create our matrix X and our target y\n", + "X = df[[\"Square ft\", \"Bedrooms\"]].to_numpy()\n", + "y = df[[\"Price\"]].to_numpy()\n", + "\n", + "# Augment X with a column of 1's (intercept)\n", + "X_aug = np.hstack((np.ones((X.shape[0], 1)), X))\n", + "\n", + "# Perform QR decomposition\n", + "Q, R = np.linalg.qr(X_aug)\n", + "\n", + "# Solve the upper triangular system Rx = Q^Ty\n", + "beta = np.linalg.solve(R, Q.T @ y)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "Let's look at the output.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "3d1e5bab", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Q = [[-0.4472136 0.32838365 0.40496317]\n", + " [-0.4472136 -0.63745061 -0.22042299]\n", + " [-0.4472136 0.42496708 -0.7689174 ]\n", + " [-0.4472136 0.32838365 0.40496317]\n", + " [-0.4472136 -0.44428376 0.17941406]] \n", + "\n", + "R = [[-2.23606798e+00 -3.95784032e+03 -7.15541753e+00]\n", + " [ 0.00000000e+00 -5.17687164e+02 -1.50670145e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 7.27908474e-01]] \n", + "\n", + "beta = [[-3.05053797e-13]\n", + " [ 3.00000000e-01]\n", + " [ 5.00000000e+00]]\n" + ] + } + ], + "source": [ + "print(f\"Q = {Q} \\n\\nR = {R} \\n\\nbeta = {beta}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "As we can see, the least-squares solution agrees with what we got by hand and by other python methods (if we agree that the tiny first component is essentially zero).\n", + "\n", + "---\n", + "\n", + "The QR decomposition of a matrix is also useful for computing orthogonal projections.\n", + "> **Theorem**. Let $A$ be an $m \\times n$ matrix with full column rank. If $A = QR$ is a QR decomposition, then $QQ^T$ is the projection onto the column space of $A$, i.e., $QQ^Tb = \\text{Proj}_{\\text{Col}(A)}b$ for all $b \\in \\mathbb{R}^m$.\n", + "\n", + "Let's see what our range projections are for the matrices above. Note that the first example above will have the orthogonal projection just being\n", + "$$ \\begin{bmatrix} 1 \\\\ & 1 \\\\ & & 1\\\\ & & & 0 \\end{bmatrix}. $$\n", + "Let's look at the other matrix. \n", + "\n", + "> **Example**. Working with the matrix\n", + "> $$ A = \\begin{bmatrix} 1 & 0 & 0 \\\\ 1 & 1 & 0 \\\\ 1 & 1 & 1 \\\\ 1 & 1 & 1 \\end{bmatrix}, $$\n", + "> the projection onto the column space if given by\n", + "> $$ QQ^T = \\begin{bmatrix} 1 \\\\ & 1 \\\\ & & \\frac{1}{2} & \\frac{1}{2} \\\\ & & \\frac{1}{2} & \\frac{1}{2} \\end{bmatrix}. $$\n", + "> This is a well-understood projection: it is the direct sum of the identity on $\\mathbb{R}^2$ and the projection onto the line $y = x$ in $\\mathbb{R}^2$.\n", + "\n", + "Now let's use python to implement the projection.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "# Create our matrix A\n", + "A = np.array([[1,0,0],[1,1,0],[1,1,1],[1,1,1]])\n", + "\n", + "# Take the QR decomposition\n", + "Q, R = np.linalg.qr(A)\n", + "\n", + "# Create the range projection\n", + "P = Q @ Q.T\n" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "5bfd7362", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[1.00000000e+00, 2.89687929e-17, 2.89687929e-17, 2.89687929e-17],\n", + " [2.89687929e-17, 1.00000000e+00, 7.07349921e-17, 7.07349921e-17],\n", + " [2.89687929e-17, 7.07349921e-17, 5.00000000e-01, 5.00000000e-01],\n", + " [2.89687929e-17, 7.07349921e-17, 5.00000000e-01, 5.00000000e-01]])" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "P" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "The output gives\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d26b49a6", + "metadata": {}, + "outputs": [], + "source": [ + "array([[1.00000000e+00, 2.89687929e-17, 2.89687929e-17, 2.89687929e-17],\n", + " [2.89687929e-17, 1.00000000e+00, 7.07349921e-17, 7.07349921e-17],\n", + " [2.89687929e-17, 7.07349921e-17, 5.00000000e-01, 5.00000000e-01],\n", + " [2.89687929e-17, 7.07349921e-17, 5.00000000e-01, 5.00000000e-01]])\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "As we can see, the two off-diagonal blocks are all tiny, hence we treat them as zero. Note that if they were not actually zero, then this wouldn't actually be a projection. This can cause some problems.\n", + "\n", + "Let's write a function to implement this, assuming that columns of A are linearly independent. \n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "def proj_onto_col_space(A):\n", + "\t# Take the QR decomposition\n", + "\tQ,R = np.linalg.qr(A)\n", + "\t# The projection is just Q @ Q.T\n", + "\tP = Q @ Q.T\n", + "\n", + "\treturn P\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "We'll come back to this later. We should really be incorporating some sort of error tolerance so that things are **super super** tiny can actually just be sent to zero. \n", + "\n", + "> **Remark**. Another way to get the projection onto the column space of an $n \\times p$ matrix $A$ of full column rank is to take\n", + "> $$ P = A(A^TA)^{-1}A^T. $$\n", + "> Indeed, let $b \\in \\mathbb{R}^n$ and let $x_0 \\in \\mathbb{R}^p$ be a solution to the normal equations\n", + "> $$ A^TAx_0 = A^Tb. $$\n", + "> Then $x_0 = (A^TA)^{-1}A^Tb$ and so $Ax_0 = A(A^TA^{-1})A^Tb$ is the (unique!) vector in the column space of $A$ which is closest to $b$, i.e., the projection of $b$ onto the column space of $A$.\n", + "> However, taking transposes, multiplying, and inverting is not what we would like to do numerically. " + ] + }, + { + "cell_type": "markdown", + "id": "4ae21758", + "metadata": {}, + "source": [ + "# Singular Value Decomposition\n", + "\n", + "The SVD is a very important matrix decomposition in both data science and linear algebra.\n", + "\n", + "> **Theorem**. For any matrix $n \\times p$ matrix $X$, there exist an orthogonal $n \\times n$ matrix $U$, an orthogonal $p \\times p$ matrix $V$, and a diagonal $n \\times p$ matrix $\\Sigma$ with non-negative entries such that\n", + "> $$ X = U\\Sigma V^T. $$\n", + "> - The columns of $U$ are left **left singular vectors**.\n", + "> - The columns of $V$ are the **right singular vectors**.\n", + "> - $\\Sigma$ has **singular values** $\\sigma_1 \\geq \\sigma_2 \\geq \\cdots \\geq \\sigma_r > 0$ on its diagonal, where $r$ is the rank of $X$.\n", + "\n", + "> **Remark**. The SVD is clearly a generalization of matrix diagonalization, but it also generalizes the **polar decomposition** of a matrix. Recall that every $n \\times n$ matrix $A$ can be written as $A = UP$ where $U$ is orthogonal (or unitary) and $P$ is a positive matrix. This is because if\n", + "> $$ A = U_0\\Sigma V^T $$\n", + "> is the SVD for $A$, then $\\Sigma$ is an $n \\times n$ diagonal matrix with non-negative entries, hence any orthogonal conjugate of it is positive, and so\n", + "> $$ A = (U_0V^T)(V\\Sigma V^T). $$\n", + "> Take $U = U_0V^T$ and $P = V\\Sigma V^T$. \n", + "\n", + "By hand, the algorithm for computing an SVD is as follows.\n", + "1. Both $AA^T$ and $A^TA$ are symmetric (they are positive in fact), and so they can be orthogonally diagonalized; one can form an orthogonal basis of eigenvectors. Let $v_1,\\dots,v_p$ be an orthonormal basis of eigenvectors for $\\mathbb{R}^p$ which correspond to eigenvectors of $A^TA$ in decreasing order. Suppose that $A^TA$ has $r$ non-zero eigenvalues. Let $V$ be the matrix whose columns contain the $v_i$'s. This gives our right singular vectors and our singular values. \n", + "2. Let $u_i = \\frac{1}{\\sigma_i}Av_i$ for $i = 1,\\dots,r$, and extend this collection of vectors to an orthonormal basis for $\\mathbb{R}^n$ if necessary. Let $U$ be the corresponding matrix.\n", + "3. Let $\\Sigma$ be the $n \\times p$ matrix whose diagonal entries are $\\sigma_1 \\geq \\sigma_2 \\geq \\cdots \\geq \\sigma_r$, and then zeroes if necessary. \n", + "\n", + "> **Example**. Let us compute the SVD of\n", + "> $$ A = \\begin{bmatrix} 3 & 2 & 2 \\\\ 2 & 3 & -2 \\end{bmatrix}. $$\n", + "> First we note that\n", + "> $$ A^TA = \\begin{bmatrix} 13 & 12 & 2 \\\\ 12 & 13 & -2 \\\\ 2 & -2 & 8 \\end{bmatrix}, $$\n", + "> which has eigenvalues $25,9,0$ with corresponding eigenvectors\n", + "> $$ \\begin{bmatrix} 1 \\\\ 1 \\\\ 0 \\end{bmatrix}, \\begin{bmatrix} 1 \\\\ -1 \\\\ 4 \\end{bmatrix}, \\begin{bmatrix} -2 \\\\ 2 \\\\ 1 \\end{bmatrix}. $$\n", + "> Normalizing, we get\n", + "> $$ V = \\begin{bmatrix} \\frac{1}{\\sqrt{2}} & \\frac{1}{3\\sqrt{2}} & -\\frac{2}{3} \\\\ \\frac{1}{\\sqrt{2}} & -\\frac{1}{3\\sqrt{2}} & \\frac{2}{3} \\\\ 0 & \\frac{4}{3\\sqrt{2}} & \\frac{1}{3} \\end{bmatrix}. $$\n", + "> Now we set $u_1 = \\frac{1}{5}Av_1$ and $u_2 = \\frac{1}{3}Av_2$ to get\n", + "> $$ U = \\begin{bmatrix} \\frac{1}{\\sqrt{2}} & \\frac{1}{\\sqrt{2}} \\\\ \\frac{1}{\\sqrt{2}} & -\\frac{1}{\\sqrt{2}} \\end{bmatrix}. $$\n", + "> So\n", + "> $$ A = \\begin{bmatrix} \\frac{1}{\\sqrt{2}} & \\frac{1}{\\sqrt{2}} \\\\ \\frac{1}{\\sqrt{2}} & -\\frac{1}{\\sqrt{2}} \\end{bmatrix} \\begin{bmatrix} 5 & 0 & 0 \\\\ 0 & 3 & 0 \\end{bmatrix} \\begin{bmatrix} \\frac{1}{\\sqrt{2}} & \\frac{1}{3\\sqrt{2}} & -\\frac{2}{3} \\\\ \\frac{1}{\\sqrt{2}} & -\\frac{1}{3\\sqrt{2}} & \\frac{2}{3} \\\\ 0 & \\frac{4}{3\\sqrt{2}} & \\frac{1}{3} \\end{bmatrix}^T $$\n", + "> is our SVD decomposition.\n", + "\n", + "We note that in practice, we avoid the computation of $X^TX$ because if the entries of $X$ have errors, then these errors will be squared in $X^TX$. There are better computational tools to get singular values and singular vectors which are more accurate. This is what our python tools will use. \n", + "\n", + "Let's use `numpy.linalg.svd` for the above matrix." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "#Define our matrix\n", + "A = np.array([[3,2,2],[2,3,-2]])\n", + "\n", + "# Take the SVD\n", + "U, S, Vh = np.linalg.svd(A)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "Our SVD matrices are\n" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "5336313f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "U = [[-0.70710678 -0.70710678]\n", + " [-0.70710678 0.70710678]]\n", + "\n", + "S = [5. 3.]\n", + "\n", + "Vh.T = [[-7.07106781e-01 -2.35702260e-01 -6.66666667e-01]\n", + " [-7.07106781e-01 2.35702260e-01 6.66666667e-01]\n", + " [-6.47932334e-17 -9.42809042e-01 3.33333333e-01]]\n" + ] + } + ], + "source": [ + "print(f\"U = {U}\\n\\nS = {S}\\n\\nVh.T = {Vh.T}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "\n", + "Because the eigenvalues of the hermitian squares of\n", + "$$ \\begin{bmatrix} 1 & 1 & 1\\\\ 0 & 1 & 1 \\\\ 0 & 0 & 1 \\\\ 0 & 0 & 0 \\end{bmatrix} \\text{ and } \\begin{bmatrix} 1 & 0 & 0 \\\\ 1 & 1 & 0 \\\\ 1 & 1 & 1 \\\\ 1 & 1 & 1 \\end{bmatrix} $$\n", + "are quite atrocious, an exact SVD decomposition is difficult to compute by hand. However, we can of course use python.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "# Define our matrices\n", + "A = np.array([[1,1,1],[0,1,1],[0,0,1],[0,0,0]])\n", + "B = np.array([[1,0,0],[1,1,0],[1,1,1],[1,1,1]])\n", + "\n", + "# SVD decomposition\n", + "U_A, S_A, Vh_A = np.linalg.svd(A)\n", + "U_B, S_B, Vh_B = np.linalg.svd(B)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "The resulting matrices are\n" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "a13a3391", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "U_A = [[ 0.73697623 0.59100905 0.32798528 0. ]\n", + " [ 0.59100905 -0.32798528 -0.73697623 0. ]\n", + " [ 0.32798528 -0.73697623 0.59100905 0. ]\n", + " [ 0. 0. 0. 1. ]]\n", + "\n", + "S_A = [2.2469796 0.80193774 0.55495813]\n", + "\n", + "Vh_A.T = [[ 0.32798528 0.73697623 0.59100905]\n", + " [ 0.59100905 0.32798528 -0.73697623]\n", + " [ 0.73697623 -0.59100905 0.32798528]]\n", + "\n", + "U_B = [[-2.41816250e-01 7.12015746e-01 -6.59210496e-01 0.00000000e+00]\n", + " [-4.52990541e-01 5.17957311e-01 7.25616837e-01 6.71536163e-17]\n", + " [-6.06763739e-01 -3.35226641e-01 -1.39502200e-01 -7.07106781e-01]\n", + " [-6.06763739e-01 -3.35226641e-01 -1.39502200e-01 7.07106781e-01]]\n", + "\n", + "S_B = [2.8092118 0.88646771 0.56789441]\n", + "\n", + "Vh_B.T = [[-0.67931306 0.63117897 -0.37436195]\n", + " [-0.59323331 -0.17202654 0.7864357 ]\n", + " [-0.43198148 -0.75632002 -0.49129626]]\n" + ] + } + ], + "source": [ + "print(f\"U_A = {U_A}\\n\\nS_A = {S_A}\\n\\nVh_A.T = {Vh_A.T}\\n\\nU_B = {U_B}\\n\\nS_B = {S_B}\\n\\nVh_B.T = {Vh_B.T}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Another final note is that the **operator norm** of a matrix $A$ agrees with its largest singular value. " + ] + }, + { + "cell_type": "markdown", + "id": "7c8396ff", + "metadata": {}, + "source": [ + "## Pseudoinverses and using the SVD\n", + "The SVD can be used to determine a least-squares solution for a given system. Recall that if $v_1,\\dots,v_p$ is an orthonormal basis for $\\mathbb{R}^p$ consisting of eigenvectors of $A^TA$, arranged so that they correspond to eigenvalues $\\sigma_1 \\geq \\sigma_2 \\geq \\cdots \\geq \\sigma_r$, then $\\{Av_1,\\dots,Av_r\\}$ is an orthogonal basis for the column space of $A$. In essence, this means that when we have our left singular vectors $u_1,\\dots,u_n$ (constructed based on our algorithm as above), we have that the first $r$ vectors form an orthonormal basis for the column space of $A$, and that the remaining $n - r$ vectors form an orthonormal basis for the perp of the column space of $A$ (which is also equal to the nullspace of $A^T$). \n", + "\n", + "> **Definition**. Let $A$ be an $n \\times p$ matrix and suppose that the rank of $A$ is $r \\leq \\min\\{n,p\\}$. Suppose that $A = U\\Sigma V^T$ is the SVD, where the singular values are decreasing. Partition\n", + "> $$ U = \\begin{bmatrix} U_r & U_{n-r} \\end{bmatrix} \\text{ and } V = \\begin{bmatrix} V_r & V_{p-r} \\end{bmatrix} $$\n", + "> into submatrices, where $U_r$ and $V_r$ are the matrices whose columns are the first $r$ columns of $U$ and $V$ respectively. So $U_r$ is $n \\times r$ and $V_r$ is $p \\times r$. Let $D$ be the diagonal $r \\times r$ matrices whose diagonal entries are $\\sigma_1,\\dots, \\sigma_r$, so that\n", + ">$$ \\Sigma = \\begin{bmatrix} D & 0 \\\\ 0 & 0 \\end{bmatrix} $$\n", + "> and note that\n", + "> $$ A = U_rDV_r^T. $$\n", + "> We call this the reduced singular value decomposition of $A$. Note that $D$ is invertible, and its inverse is simply\n", + "> $$ D = \\begin{bmatrix} \\sigma_1^{-1} \\\\ & \\sigma_2^{-1} \\\\ & & \\ddots \\\\ & & & \\sigma_r^{-1} \\end{bmatrix}. $$\n", + "> The **pseudoinverse** (or **Moore-Penrose inverse**) of $A$ is the matrix\n", + "> $$ A^+ = V_rD^{-1}U_r^T. $$\n", + "\n", + "We note that the pseudoinverse $A^+$ is a $p \\times n$ matrix. \n", + "\n", + "With the pseudoinverse, we can actually find least-squares solutions quite easily. Indeed, if we are looking for the least-squares solution to the system $Ax = b$, define\n", + "$$ x_0 = A^+b. $$\n", + "Then \n", + "$$ \\begin{split} Ax_0 &= (U_rDV_r^T)(V_rD^{-1}U_r^Tb) \\\\ &= U_rDD^{-1}U_r^Tb \\\\ &= U_rU_r^Tb \\end{split} $$\n", + "As mentioned before, the columns of $U_r$ form an orthonormal basis for the column space of $A$ and so $U_rU_r^T$ is the orthogonal projection onto the range of $A$. That is, $Ax_0$ is precisely the projection of $b$ onto the column space of $A$, meaning that this yields a least-squares solution. This gives the following.\n", + "\n", + "> **Theorem**. Let $A$ be an $n \\times p$ matrix and $b \\in \\mathbb{R}^n$. Then\n", + "> $$ x_0 = A^+b$$\n", + "> is a least-squares solution to $Ax = b$. \n", + "\n", + "Taking pseudoinverses is quite involved. We'll do one example by hand, and then use python -- and we'll see something go wrong! There is a function `numpy.linalg.pinv` in numpy that will take a pseudoinverse. We can also just use `numpy.linalg.svd` and do the process above.\n", + "\n", + "> **Example**. We have the following SVD $A = U\\Sigma V^T$. \n", + "> $$ \\begin{bmatrix} 1 & 1 & 2\\\\ 0 & 1 & 1 \\\\ 1 & 0 & 1 \\\\ 0 & 0 & 0 \\end{bmatrix} = \\begin{bmatrix} \\sqrt{\\frac{2}{3}} & 0 & 0 & -\\frac{1}{\\sqrt{3}} \\\\ \\frac{1}{\\sqrt{6}} & \\frac{1}{\\sqrt{2}} & 0 & \\frac{1}{\\sqrt{3}} \\\\ \\frac{1}{\\sqrt{6}} & -\\frac{1}{\\sqrt{2}} & 0 & \\frac{1}{\\sqrt{3}} \\\\ 0 & 0 & 1 & 0 \\end{bmatrix} \\begin{bmatrix} 3 & 0 & 0 \\\\ 0 & 1 & 0 \\\\ 0 & 0 & 0 \\\\ 0 & 0 & 0 \\end{bmatrix}\\begin{bmatrix} \\frac{1}{\\sqrt{6}} & -\\frac{1}{\\sqrt{2}} & -\\frac{1}{\\sqrt{3}} \\\\ \\frac{1}{\\sqrt{6}} & \\frac{1}{\\sqrt{2}} & -\\frac{1}{\\sqrt{3}} \\\\ \\sqrt{\\frac{2}{3}} & 0 & \\frac{1}{\\sqrt{3}} \\end{bmatrix}^T. $$\n", + "> Can we find a least-squares solution to $Ax = b$, where\n", + "> $$ b = \\begin{bmatrix} 1 \\\\ 1 \\\\ 1 \\\\ 1 \\end{bmatrix}? $$\n", + "> The pseudoinverse of $A$ is\n", + "> $$ \\begin{split} A^+ &= \\begin{bmatrix} \\frac{1}{\\sqrt{6}} & -\\frac{1}{\\sqrt{2}} \\\\ \\frac{1}{\\sqrt{6}} & \\frac{1}{\\sqrt{2}} \\\\ \\sqrt{\\frac{2}{3}} & 0 \\end{bmatrix} \\begin{bmatrix} 3 \\\\ & 1 \\end{bmatrix} \\begin{bmatrix} \\sqrt{\\frac{2}{3}} & 0 \\\\ \\frac{1}{\\sqrt{6}} & \\frac{1}{\\sqrt{2}} \\\\ \\frac{1}{\\sqrt{6}} & -\\frac{1}{\\sqrt{2}} \\\\ 0 & 0 \\end{bmatrix}^T \\\\ &= \\begin{bmatrix} \\frac{1}{9} & -\\frac{4}{9} & \\frac{5}{9} & 0 \\\\ \\frac{1}{9} & \\frac{5}{9} & -\\frac{4}{9} & 0 \\\\ \\frac{2}{9} & \\frac{1}{9} & \\frac{1}{9} & 0\\end{bmatrix}, \\end{split} $$\n", + "> and so a least-squares solution is given by\n", + "> $$ \\begin{split} x_0 &= A^+b \\\\ &= \\begin{bmatrix} \\frac{1}{9} & -\\frac{4}{9} & \\frac{5}{9} & 0 \\\\ \\frac{1}{9} & \\frac{5}{9} & -\\frac{4}{9} & 0 \\\\ \\frac{2}{9} & \\frac{1}{9} & \\frac{1}{9} & 0\\end{bmatrix}\\begin{bmatrix} 1 \\\\ 1 \\\\ 1 \\\\ 1 \\end{bmatrix} \\\\ &= \\begin{bmatrix} \\frac{2}{9} \\\\ \\frac{2}{9} \\\\ \\frac{4}{9} \\end{bmatrix}. \\end{split} $$\n", + "\n", + "Now let's do this with python, and see an example of how things can go wrong. We'll try to take the pseudoinverse manually first.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "# Create our matrix A and our target b\n", + "A = np.array([[1,1,2],[0,1,1],[1,0,1],[0,0,0]])\n", + "b = np.array([[1],[1],[1],[1]])\n", + "\n", + "# Take the SVD decomposition\n", + "U, S, Vh = np.linalg.svd(A)\n", + "\n", + "# Prepare the pseudoinverse\n", + "# Recall that we invert the non-zero diagonal entries of the diagonal matrix.\n", + "# So we first build S_inv to be the appropriate size\n", + "S_inv = np.zeros((Vh.shape[0], U.shape[0])) \n", + "# We then fill in the appropriate values on the diagonal\n", + "S_inv[:len(S), :len(S)] = np.diag(1/S)\n", + "\n", + "# Build the pseudoinverse\n", + "A_pinv = Vh.T @ S_inv @ U.T\n", + "\n", + "# Compute the least-squares solution\n", + "beta = A_pinv @ b\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "What is the result?\t\n" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "862ed810", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 2.74080345e+15],\n", + " [ 2.74080345e+15],\n", + " [-2.74080345e+15]])" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "beta" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "This is **WAY** off the mark. So what happened? Well, when we look at our singular values, we have\n" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "2d3df55d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([3.00000000e+00, 1.00000000e+00, 1.21618839e-16])" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "S" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "As we got this matrix numerically, the last entry is actually non-zero, but tiny. This isn't exactly what's going on since we know that the rank of A is 2. So when we invert the singular values and throw them on the diagonal, have `1/1.21618839e-16` which is a very large value. This value then messes up the rest of the computation. So how do we fix this? One can set tolerances in numpy, but we'll get to that later. Let's just note that `numpy.linalg.pinv` will already incorporate this. Let's see what we get.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "# Create our matrix A and our target b\n", + "A = np.array([[1,1,2],[0,1,1],[1,0,1],[0,0,0]])\n", + "b = np.array([[1],[1],[1],[1]])\n", + "\n", + "# Build the pseudoinverse\n", + "A_pinv = np.linalg.pinv(A)\n", + "\n", + "# Compute the least-squares solution\n", + "beta = A_pinv @ b\n" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "2657ea4b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "A_pinv=[[ 0.11111111 -0.44444444 0.55555556 0. ]\n", + " [ 0.11111111 0.55555556 -0.44444444 0. ]\n", + " [ 0.22222222 0.11111111 0.11111111 0. ]]\n", + "\n", + "beta=[[0.22222222]\n", + " [0.22222222]\n", + " [0.44444444]]\n" + ] + } + ], + "source": [ + "print(f\"A_pinv={A_pinv}\\n\\nbeta={beta}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## The Condition Number\n", + "Numerical calculations involving matrix equations are quite reliable if we use the SVD. This is because the orthogonal matrices $U$ and $V$ preserve lengths and angles, leaving the stability of the problem to be governed by the singular values of the matrix $X$. Recall that if $X = U\\Sigma V^T$, then solving the least-squares problem involves dividing by the non-zero singular values $\\sigma_i$ of $X$. If these values are very small, their inverses become very large, and this will amplify any numerical errors.\n", + "\n", + "> **Definition**. Let $X$ be an $n \\times p$ matrix and let $\\sigma_1 \\geq \\cdots \\geq \\sigma_r$ be the non-zero singular values of $X$. The **condition number** of $X$ is the quotient\n", + "> $$ \\kappa(X) = \\frac{\\sigma_1}{\\sigma_r} $$\n", + "> of the largest and smallest non-zero singular values.\n", + "\n", + "A condition number close to 1 indicates a well-conditioned problem, while a large condition number indicates that small perturbations in data may lead to large changes in computation. Geometrically, $\\kappa(X)$ measures how much $X$ distorts space. \n", + "\n", + "> **Example**. Consider the matrices\n", + "> $$ A = \\begin{bmatrix} 1 \\\\ & 1 \\end{bmatrix} \\text{ and } B = \\begin{bmatrix} 1 \\\\ & \\frac{1}{10^6} \\end{bmatrix}. $$\n", + "> The condition numbers are\n", + "> $$ \\kappa(A) = 1 \\text{ and } \\kappa(B) = 10^6. $$\n", + "> Inverting $X_2$ includes dividing by $\\frac{1}{10^6}$, which will amplify errors by $10^6$.\n", + "\n", + "Let's look our main example in python by using `numpy.linalg.cond`. \n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "\n", + "# First let us make a dictionary incorporating our data.\n", + "# Each entry corresponds to a column (feature of our data)\n", + "data = {\n", + " 'Square ft': [1600, 2100, 1550, 1600, 2000],\n", + " 'Bedrooms': [3, 4, 2, 3, 4],\n", + " 'Price': [500, 650, 475, 490, 620]\n", + "}\n", + "\n", + "# Create a pandas DataFrame\n", + "df = pd.DataFrame(data)\n", + "\n", + "# Create out matrix X\n", + "X = df[['Square ft', 'Bedrooms']].to_numpy()\n", + "\n", + "# Check the condition number\n", + "cond_X = np.linalg.cond(X)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "Let's see what we got.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "8aa6bca9", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "np.float64(4329.082589067693)" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cond_X" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "so this is quite a high condition number! This should be unsurprising, as clearly the number of bedrooms is correlated to the size of a house (especially so in our small toy example). " + ] + } + ], + "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.14.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/03_some_notes_and_what_goes_wrong.ipynb b/notebooks/03_some_notes_and_what_goes_wrong.ipynb new file mode 100644 index 0000000..ff57e8e --- /dev/null +++ b/notebooks/03_some_notes_and_what_goes_wrong.ipynb @@ -0,0 +1,433 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f385cc40", + "metadata": {}, + "source": [ + "\n", + "# A note on other norms\n", + "\n", + "There are other canonical choices of norms for vectors and matrices. While $L^2$ leads naturally to least-squares problems with closed-form solutions, other norms induce different geometries and different optimal solutions. From the linear algebra perspective, changing the norm affects:\n", + "- the shape of the unit ball,\n", + "- the geometry of approximation,\n", + "- the numerical behaviour of optimization problems. " + ] + }, + { + "cell_type": "markdown", + "id": "ca50a202", + "metadata": {}, + "source": [ + "\n", + "## $L^1$ norm (Manhattan distance)\n", + "The $L^1$ norm of a vector $x = (x_1,\\dots,x_p) \\in \\mathbb{R}^p$ is defined as\n", + "$$ \\|x\\|_1 = \\sum |x_i|. $$\n", + "Minimizing the $L^1$ norm is less sensitive to outliers. Geometrically, the $L^1$ unit ball in $\\mathbb{R}^2$ is a diamond (a rotated square), rather than a circle.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "77e7c0b3", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkgAAAJNCAYAAADK04ocAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAANz1JREFUeJzt3X90VPWd//HXQH4ASkZLJAkaA24lqPgDYYHQ8qNVo1GpovUn5YetnoJrWaGIIqsGW0VdpeBRtAqoXXH9BdhuQZRtCXhKUNCkIiDQUyRZTQzw1QREAyH3+wfOmLkzJDPJ3Lm/no9zck5zuZN84jT49N73vTdgGIYhAAAAhHWyewEAAABOQyABAACYEEgAAAAmBBIAAIAJgQQAAGBCIAEAAJgQSAAAACYEEgAAgAmBBAAAYEIgAQAAmBBIAAAAJgQS4CBPPfWUzj//fKWnp6u0tNTu5QCAbxFIgIPk5eVp9uzZuvLKK+1eCgD4WprdCwDwnVAY/fGPf7R7KQDgaxxBAlLkT3/6kwKBgF566SW7l9Km559/XoFAQJ988kl42/r161VaWqovv/wyrq9RWlqqQCCgvXv3WramWNsS1bt373afzuzIa1P5fVKxzv3792vGjBkqLi7WSSedpEAgwGliuBqBBKTIBx98IEkaMGCA3Utp02WXXaby8nLl5eWFt61fv16zZ8+OO5DgL/v27dMzzzyjxsZGThHDEzjFBqTIBx98oOOOO06FhYV2L6VNJ510kk466SS7l+FJo0aNUu/evfX888/bvZS4NTc367333tObb76pm266Sb17947ap6CgQF988UX4qOHChQttWSuQLBxBAlLkgw8+0LnnnqtOnZL7azdx4sSY/8IKneKKtW3Lli264YYbFAwGlZOTo5///Oeqr68P72c+dVVaWqo77rhDktSnTx8FAgEFAgGVlZW1ub7q6mpdddVVysrKUjAY1M9+9jPt2bMn/Of/+Mc/dNNNN+n0009Xt27ddPLJJ2v06NHavHlzh/65tFdNTY2OP/54XX/99RHb//znPys9PV2zZs2yZV1mV111lU455ZSo7U1NTTrvvPN00UUXdejr79mzRy+++KLGjh2rnj17qqioSE8++aSamppi7h/6/wTgFQQSkAJ79uzRp59+qvPPP7/V/ZqamvTNN9/oyJEjEf872a6++mr17dtXS5cu1V133aWXXnpJU6dOPeb+N998s371q19JkpYtW6by8nKVl5e3+fNI0pgxY/T9739fr7/+ukpLS/XGG2/o4osv1uHDhyVJn332mXr06KGHHnpIq1at0pNPPqm0tDQNGTJE27dvb9fPFwgENGrUqHa9Ni8vTzNmzNCrr76q999/X5JUVlama665RpMnT9YDDzzQrq+bbCNGjNCnn36q3bt3R2yfO3euPv74Yy1YsCChr9fc3Kx3331XpaWlGjx4sHJycjR+/Hht375dkydP1vr161VXV6fvf//7Sf5JAGfiFBuQAqF/0bY1f/Tb3/5Ws2fPDn/+wAMP6LnnntPEiROTup5f/OIX4SNCF154of7xj39o8eLFWrRoUcyjAKeccopOPfXU8M8Q64jVsVx11VV65JFHJEnFxcXKycnR2LFj9eqrr2rs2LEaMWKERowYEd7/yJEjuuyyy3TWWWfp97//vebOnZvwz9e5c2d17tw54deFTJ8+Xb///e915513as6cOfrJT36iG264QfPnz0/o6xiGERW4hmHIMIyoIzFpaYn9dRz6Z7Z+/XoVFBRIknbt2qXZs2dr1qxZOv300+P+WpWVlbrwwgu1b98+nXDCCSouLtatt96qkpIS5eTkJLQuwCs4ggSkQGhAu60jLqWlpeF/gYY+kh1HkvSTn/wk4vNzzjlH33zzjerq6pL+vcaOHRvx+bXXXqu0tDStWbNG+vao2YMPPqgzzzxTGRkZSktLU0ZGhnbu3Klt27a163s2NTXpL3/5S7vX3K1bN/32t7/VX/7yF/3oRz9SSUmJnn322YRPIa1du1bp6ekRH+vWrdMf/vCHqO2JXol33nnnKSsrS3/729/C2yZPnqz8/HzdeeedCX2tzp07q1u3blKLo5ihD8CvOIIEpMAHH3ygzMxMnXXWWXYvRZLUo0ePiM8zMzMlSV9//XXSv1dubm7E52lpaerRo4f27dsnSZo2bZqefPJJ3XnnnRo5cqROPPFEderUSTfffLMl64lX3759pW9P1z3//PPtOiI1cOBAbdy4MWLbL3/5S/Xq1Uv33XdfxPZevXol9LU7deqkYcOGaf369ZKkJUuW6K233tKaNWuUkZGR0Nc6++yzVVVVpY8++khvvvmmVq5cqSlTpujw4cM688wzVVJSopKSEg0fPjzhrw24FYEEpMAHH3yg/v37Kz09Pelfu0uXLmpsbIzanqz7D3VUbW2tTj755PDnTU1N2rdvXzjSXnzxRY0fP14PPvhgxOv27t2rE044IeXr1bennC6//HL94Ac/0N/+9jctXrxY//Zv/5bw1+nevbsGDRoUta1Hjx5R29tjxIgRuueee1RVVaVp06ZpwoQJ7Z69kqT+/furf//+uuOOO7R//3797//+r95880298soreuyxx3T88cfr/fffD8cj4GWcYgMs9uWXX2rXrl1xDTS3R+/evVVXV6fPP/88vO3QoUN66623kvp92nuUacmSJRGfv/rqq2pqagr/izwQCIS/dsiKFSv06aefdnjN7bF9+3ZdfPHFKioq0po1a3TFFVeotLQ04io/pxgxYoSOHDmiyy+/XEeOHNGjjz6atK/dvXt3jRkzRs8884yqq6v14Ycf6p577lGXLl2S9j0AJ+MIEmCx0PzRkSNH9MYbb0T9+fDhw6NOeSXiuuuu07333qvrr79ed9xxh7755hs9/vjjSb/67eyzz5YkzZ8/XxMmTFB6eroKCwvVvXv3Vl+3bNkypaWl6aKLLtKWLVt0zz336Nxzz9W1114rSbr88sv1/PPPq1+/fjrnnHP0/vvv6z//8z9jXsIer7S0NI0cOTLhOaRPPvlEF154oQoLC7V06VKlp6froYceUv/+/fXggw/q4YcfbvearPCv//qv6tq1qzZv3qzFixcrOzu7XV+npqZGK1asaHO/733vezr++OOP+edvvvmmvvrqK+3fv1+StHXrVr3++uuSpEsvvTQ85wS4AYEEWKyiokKStHjxYi1evDjqz6uqqjoUSH369NEf//hH3X333frpT3+qvLw8TZs2TXv27Im4Iq6jRo0apZkzZ+qFF17Qs88+q+bmZq1Zs6bNUzrLli1TaWmpnnrqKQUCAY0ePVrz5s0Lz7LMnz9f6enpmjNnjg4cOKDzzz9fy5Yt03/8x3+0e61HjhxJOBBramp04YUXqmfPnvrzn/+srl27SpL69eunn//855o/f74mT56c0BV8VuvUqZNOPPFEDRo0qEPD/Nu3b9ctt9wS176DBg3S9773vZh/Nnny5IjbDrz22mt67bXXpG+vsHPSPzugLQHDMAy7FwEAdundu7cmTpzYrueGdeS1yfg+jz76qGbNmqXKykqdccYZtq8T8BKOIAGAixw8eFB///vftXHjRs2a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QY0bN05ffvllq6+ZOHGiAoFAxMfQoUNTtma/WbBggfr06aMuXbpo4MCBeuedd1rdf+3atRo4cKC6dOmi0047TU8//XTK1orE3q+ysrKo36VAIKCPP/44pWv2q3Xr1mn06NHq1auXAoGA3njjjTZf45XfLwIpxQ4dOqRrrrlGkydPjvs1jzzyiObOnasnnnhCGzduVG5uri666CLt37/f0rXiqBtvvFGVlZVatWqVVq1apcrKSo0bN67N111yySWqqakJf6xcuTIl6/WbV155RbfffrtmzZqliooKDR8+XCUlJaqqqoq5/65du3TppZdq+PDhqqio0N13360pU6Zo6dKlKV+7HyX6foVs37494vfp9NNPT9ma/eyrr77SueeeqyeeeCKu/T31+2XAFs8995wRDAbb3K+5udnIzc01HnroofC2b775xggGg8bTTz9t8SqxdetWQ5KxYcOG8Lby8nJDkvHxxx8f83UTJkwwrrjiihSt0t8GDx5sTJo0KWJbv379jLvuuivm/jNmzDD69esXse2Xv/ylMXToUEvXiaMSfb/WrFljSDK++OKLFK0QxyLJWL58eav7eOn3iyNIDrdr1y7V1taquLg4vC0zM1MjR47U+vXrbV2bH5SXlysYDGrIkCHhbUOHDlUwGGzzn39ZWZl69uypvn376pZbblFdXV0KVuwvhw4d0vvvvx/x+yFJxcXFx3x/ysvLo/a/+OKLtWnTJh0+fNjS9fpde96vkAEDBigvL08XXHCB1qxZY/FK0V5e+v0ikByutrZWkpSTkxOxPScnJ/xnsE5tba169uwZtb1nz56t/vMvKSnRkiVL9Ne//lWPPfaYNm7cqB//+MdqbGy0eMX+snfvXh05ciSh34/a2tqY+zc1NWnv3r2Wrtfv2vN+5eXl6ZlnntHSpUu1bNkyFRYW6oILLtC6detStGokwku/X2l2L8ALSktLNXv27Fb32bhxowYNGtTu7xEIBCI+NwwjahviF+97phj/7BXHP//rrrsu/L/79++vQYMGqaCgQCtWrNBVV13VobUjWqK/H7H2j7Ud1kjk/SosLFRhYWH486KiIlVXV+vRRx/ViBEjLF8rEueV3y8CKQluu+02XX/99a3u07t373Z97dzcXOnbKs/Lywtvr6uri6p0xC/e9+zDDz/U559/HvVne/bsSeiff15engoKCrRz5852rRexZWdnq3PnzlFHH1r7/cjNzY25f1pamnr06GHpev2uPe9XLEOHDtWLL75owQrRUV76/SKQkiA7O1vZ2dmWfO0+ffooNzdXq1ev1oABA6Rvz+OvXbtWDz/8sCXf0w/ifc+KiopUX1+v9957T4MHD5Ykvfvuu6qvr9ewYcPi/n779u1TdXV1ROSi4zIyMjRw4ECtXr1aY8aMCW9fvXq1rrjiipivKSoq0v/8z/9EbHv77bc1aNAgpaenW75mP2vP+xVLRUUFv0sO5anfL7unxP1m9+7dRkVFhTF79mzj+OOPNyoqKoyKigpj//794X0KCwuNZcuWhT9/6KGHjGAwaCxbtszYvHmzccMNNxh5eXlGQ0ODTT+Fv1xyySXGOeecY5SXlxvl5eXG2WefbVx++eUR+7R8z/bv32/8+te/NtavX2/s2rXLWLNmjVFUVGScfPLJvGcWePnll4309HRj0aJFxtatW43bb7/dOO6444xPPvnEMAzDuOuuu4xx48aF9//nP/9pdOvWzZg6daqxdetWY9GiRUZ6errx+uuv2/hT+Eei79fvfvc7Y/ny5caOHTuMjz76yLjrrrsMScbSpUtt/Cn8Y//+/eF/T0ky5s6da1RUVBi7d+82DI//fhFIKTZhwgRDUtTHmjVrwvtIMp577rnw583NzcZ9991n5ObmGpmZmcaIESOMzZs32/QT+M++ffuMsWPHGt27dze6d+9ujB07NuqS45bv2cGDB43i4mLjpJNOMtLT041TTz3VmDBhglFVVWXTT+B9Tz75pFFQUGBkZGQY559/vrF27drwn02YMMEYOXJkxP5lZWXGgAEDjIyMDKN3797GU089ZcOq/SuR9+vhhx82/uVf/sXo0qWLceKJJxo//OEPjRUrVti0cv8J3WbB/DFhwgTD8PjvV8AITU8BAABA4jJ/AACAaAQSAACACYEEAABgQiABAACYEEgAAAAmBBIAAIAJgQQAAGBCIAEAAJgQSAAAACYEEgAAgAmBBAAAYPL/ARtY0M3OqNo2AAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# Grid\n", + "xx = np.linspace(-1.2, 1.2, 400)\n", + "yy = np.linspace(-1.2, 1.2, 400)\n", + "X, Y = np.meshgrid(xx, yy)\n", + "\n", + "# Take the $L^1$ norm\n", + "Z = np.abs(X) + np.abs(Y)\n", + "\n", + "plt.figure(figsize=(6,6))\n", + "plt.contour(X, Y, Z, levels=[1])\n", + "plt.contourf(X, Y, Z, levels=[0,1], alpha=0.3)\n", + "\n", + "plt.axhline(0)\n", + "plt.axvline(0)\n", + "plt.gca().set_aspect(\"equal\", adjustable=\"box\")\n", + "plt.title(r\"$L^1$ unit ball: $|x|+|y|\\leq 1$\")\n", + "plt.tight_layout()\n", + "plt.savefig('../images/L1_unit_ball.png')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "ce59565a", + "metadata": {}, + "source": [ + "\n", + "Consequently, optimization problems involving $L^1$ tend to produce solutions which live on the corners of this polytope.\n", + "Solutions often require linear programming or iterative reweighted least squares.\n", + "\n", + "$L^1$ based methods (such as LASSO) tend to set coefficients to be exactly zero. Unlike with $L^2$, the minimization problem for $L^1$ does not admit a closed form solution. Algorithms include:\n", + "- linear programming formulations,\n", + "- iterative reweighted least squares,\n", + "- coordinate descent methods.\n" + ] + }, + { + "cell_type": "markdown", + "id": "d9c50d8e", + "metadata": {}, + "source": [ + "## $L^{\\infty}$ norm (max/supremum norm)\n", + "The supremum norm defined as\n", + "$$ \\|x\\|_{\\infty} = \\max |x_i| $$\n", + "seeks to control the worst-case error rather than the average error. Minimizing this norm is related to Chebyshev approximation by polynomials. \n", + "\n", + "Geometrically, the unit ball of $\\mathbb{R}^2$ with respect to the $L^{\\infty}$ norm looks like a square.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "2724a3bc", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkoAAAJOCAYAAABIsiiPAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAALdxJREFUeJzt3Xl01fWd+P9XIBCkhbggSbAIWAUZUaswCvTL0qpBXKrYUawWsS6teBwGKOLCqNBTRa1F9OdCrSiO2hmtoK1LFcaCekpcgcG6UDtFoUJkqRLcAoHP749CxjR5Q4JcouHxOCfneD95f+593Vxv8uRzP7nJy7IsCwAAamnW2AMAAHxRCSUAgAShBACQIJQAABKEEgBAglACAEgQSgAACUIJACBBKAEAJAglAIAEoQQAkCCU4DN++9vfRl5eXvzqV79Krnn//ffj+9//fpx66qlRXl4ejz32WBx99NFx3XXX7dRZP2v69OmRl5cXb7/9dkREzJs3LyZMmBAffPBBvfafMGFC5OXlxerVq3M20z9ebmquueaa2H///aOgoCBGjx5d6/OdO3eOCRMmbNd1f9H27dKlS7Rp0yZ69+4df/jDH7brurfHunXrYty4cVFaWhp777135OXlbfd9g/oSSvAZ8+fPj4iIww47LLnm+uuvj9GjR8fIkSNj6NChceONN8a9994bmzZtimeeeWYnTvt/jj/++CgrK4uSkpKIzaE0ceLEeocSn8+iRYti/PjxccABB8Rjjz0Wo0aNauyRcmrGjBkxffr0WL58eVx00UU77XbXrFkTd9xxR1RWVsbJJ5+8026XXVt+Yw8AXyTz58+Pr3zlK9GtW7fkmg8//DB69uwZsflf3Mcff3yUlJTEkCFD4ve//30MGDBgJ078d3vvvXfsvffeO/12+bvXXnstIiLGjRsX3/rWtxp7nJw7/PDD4/DDD48//OEPceutt37u69u0aVO8+OKL8bvf/S5+8IMfROfOnetc16lTp3j//ferj37eeeedn/u2YVscUYLPmD9/fhx66KHRrFn6qfHVr341Xn755Vi0aFEsX748br755li1alX85je/iYMOOmir13/22WfX+UNgy0tfdW177bXX4nvf+14UFhZGUVFRnHPOObF27doaaz/7staECRPi4osvjtj8EkleXl7k5eXF3Llzt3n/ly1bFqecckq0bds2CgsL4/vf/36sWrWqxpo///nP8YMf/CAOOOCAaN26deyzzz5x4oknxquvvrrN6/88tnw9Fi1aFKeeemoUFhbGnnvuGWPGjImqqqpYvHhxHHvssdGmTZvo3LlzXH/99Q2e+9NPP43DDjss9t9//xpf4/Ly8iguLo6BAwfGxo0ba81WWVkZERFt2rSp9/1ZsWJFfPWrX43TTz+9xvbHHnssWrRoEePHj2/Q16e+TjnllPja175Wa3tVVVV84xvfiGOOOabe19W2bdtYv379ds2xatWquO++++LMM8+M9u3bR58+feLWW2+Nqqqq5D5b/l+GnUkowWarVq2Kd999Nw4//PCtrhs3blzccsstceWVV8Ydd9wRV111VZx22mnxySef5ORo0ne/+93o2rVrzJgxIy699NL41a9+Vec5MFucd9558a//+q8RETFz5swoKyuLsrKybd6viIghQ4bE/vvvHw899FBMmDAhHnnkkRg0aFBs2LChes3y5ctjr732imuvvTaefPLJuPXWWyM/Pz+OPPLIWLx4cYPvX15eXgwcOLDe60877bQ49NBDY8aMGXH++efHjTfeGKNHj46TTz45jj/++Hj44Yfj29/+dlxyySUxc+bMBs3dqlWrePDBB2PlypVxzjnnRGw+2nHmmWdGlmXxn//5n9G8efMG38e6lJSUxLhx4+LBBx+MV155JSIi5s6dG6eeemqMGDEirr766h1yO/+of//+8e6778Y777xTY/vkyZPjzTffjNtuuy0nt7tp06Z44YUXYsKECXHEEUdEUVFRnHXWWbF48eIYMWJEzJs3L1auXBn7779/Tm4ftpeX3mCzLT+stnZ+UkTEHnvsEdOnT6++3KVLlwb9K7yhzj333OojREcffXT8+c9/jrvuuiumTZtW57+uv/a1r8W+++4bsfm+pF7GqMspp5xSfSSmtLQ0ioqK4swzz4wHH3wwzjzzzIjNP2j79+9fvc/GjRvj+OOPj4MOOih+8YtfxOTJkxt0/5o3b96g+PjhD38YY8aMidj89Zg1a1bccsstMXPmzBgyZEhERAwcODAee+yxuP/+++OUU05p0NwHHHBA3HnnnTF06NC46aab4m9/+1vMnTs3nnzyyepzwP7R3/72t4jNRxsbYuzYsfGLX/wiLrnkkpg0aVJ85zvfie9973tx0003Neh6GmLL12DevHnRqVOniIhYsmRJTJw4sfo8q/pq3bp1xOZfcNhjjz2S6xYuXBhHH310rFmzJnbfffcoLS2NCy+8MAYPHhxFRUWf+z5BLjmiBJttOZG7PkdedqbvfOc7NS4fcsgh8emnn8bKlSt3+G1tiaEtTjvttMjPz485c+ZUb6uqqoprrrkm/umf/ilatmwZ+fn50bJly3jrrbfijTfeaPBtVlVVxdNPP13v9SeccEKNy927d4+8vLwYPHhw9bb8/PzYf//9axw1acjcp512WowYMSIuvvji+OlPfxqXX355nTG8YcOGePPNN+Oee+6JoqKi2G+//Rp031u3bh0//elP4+mnn45vfetbMXjw4PjlL3+Z05eXvvGNb0Tbtm1r/LbaiBEjomPHjnHJJZc06LqOOOKIiM2/8bd69erYtGlTneuaN29eHVVVVVXx6aefVn/AF51Qgs3mz58fBQUF2zzPaGfba6+9alwuKCiIiIhPPvlkh99WcXFxjcv5+fmx1157xZo1a6q3jRkzJq644oo4+eST49FHH40XXnghXnrppTj00ENzMtM/2nPPPWtcbtmyZbRu3TpatWpVa/tnfxA3dO5zzjknNmzYEPn5+TFy5Mg6ZznggAOie/fu8d5778Wjjz4aLVu2bPD96dq1a8TmlyCnT5++w17aS2nWrFn07ds35s2bFxER999/fzz11FMxderUBs8/cODAuPbaa+PnP/957L333tVH+v7RwQcfHEuXLo1XX301rrzyyqioqIiRI0dG586d46CDDoqxY8fG008/vd3nO0EuCSXYbP78+dGjR49o0aJFzm6jVatW1Sf+ftaOfP+iz6O8vLzG5aqqqlizZk2NWLvvvvvirLPOimuuuSYGDRoURxxxRPTq1esLcx9SGjL3Rx99FMOGDYuuXbvGbrvtFuedd16d1/nII4/E/fffH82aNYsf/vCHkWVZg2ZauHBhnHDCCfHNb34zPvzww7jrrru2+/41RP/+/WPRokWxdOnSGDNmTAwfPrxB54lt8dprr8VVV10Vxx9/fMyaNSt+/OMfb3V9jx494uKLL445c+bEmjVrYubMmfHNb34zHnjggTj66KNjr732ij/96U+f457BjieUICI++OCDWLJkSc5fduvcuXOsXLky3nvvvept69evj6eeemqH3s72HnW6//77a1x+8MEHo6qqqsYP0by8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TZoUEydO3Cmz5cIvx90bkWWx34BuUbjPHo09DjQ5VXl58b+b//vQ0/458v2jBHa4jRuq4o8Pz4+n73su/mXMibH/N7o09kg7zBcqlIqLi6O8vLzGtpUrV0Z+fn7stddede5z2WWXxZgxY6ovV1RURMeOHXM+647yccUnERFROvGk2P1rezb2ONDkVG7YFDPv/lNERBz97ydGQQvvigK58O78pbHmf1fGR2s/buxRdqgvVCj16dMnHn300RrbZs2aFb169Uqen1RQUBAFBQU7aUIAYFeS039affjhh7Fw4cJYuHBhxOZf/1+4cGEsXbo0YvPRoLPOOqt6/QUXXBDvvPNOjBkzJt5444246667Ytq0aTF27NhcjgkAUKecHlF6+eWX41vf+lb15S0vkQ0fPjymT58eK1asqI6miIguXbrEE088EaNHj45bb701OnToEDfffLO3BgAAGkVOQ2ngwIHVJ2PXZfr06bW2DRgwIObPn5/LsQAA6sVZjQAACUIJACBBKAEAJAglAIAEoQQAkCCUAAAShBIAQIJQAgBIEEoAAAlCCQAgQSgBACQIJQCABKEEAJAglAAAEoQSAECCUAIASBBKAAAJQgkAIEEoAQAkCCUAgAShBACQIJQAABKEEgBAglACAEgQSgAACUIJACBBKAEAJAglAIAEoQQAkCCUAAAShBIAQIJQAgBIEEoAAAlCCQAgQSgBACQIJQCABKEEAJAglAAAEoQSAECCUAIASBBKAAAJQgkAIEEoAQAkCCUAgAShBACQIJQAABKEEgBAglACAEgQSgAACUIJACBBKAEAJAglAIAEoQQAkCCUAAAShBIAQIJQAgBIEEoAAAlCCQAgQSgBACQIJQCABKEEAJAglAAAEoQSAECCUAIASBBKAAAJQgkAIEEoAQAkCCUAgAShBACQIJQAABKEEgBAglACAEgQSgAACUIJACBBKAEAJAglAIAEoQQAkCCUAAAShBIAQIJQAgBIEEoAAAlCCQAgQSgBACQIJQCABKEEAJAglAAAEoQSAECCUAIASBBKAAAJQgkAIEEoAQAkCCUAgAShBACQIJQAABKEEgBAglACAEgQSgAACUIJACAh56F02223RZcuXaJVq1bRs2fPeO6555Jr586dG3l5ebU+3nzzzVyPCQBQS05D6YEHHohRo0bF+PHjY8GCBdGvX78YPHhwLF26dKv7LV68OFasWFH9ccABB+RyTACAOuU0lCZPnhznnntunHfeedG9e/eYMmVKdOzYMW6//fat7te+ffsoLi6u/mjevHkuxwQAqFPOQmn9+vXxyiuvRGlpaY3tpaWlMW/evK3ue9hhh0VJSUkcddRRMWfOnFyNCACwVfm5uuLVq1fHxo0bo6ioqMb2oqKiKC8vr3OfkpKSuOOOO6Jnz55RWVkZ9957bxx11FExd+7c6N+/f537VFZWRmVlZfXlioqKHXxPAIBdVc5CaYu8vLwal7Msq7Vti27dukW3bt2qL/fp0yeWLVsWN9xwQzKUJk2aFBMnTtzBUwMA5PClt3bt2kXz5s1rHT1auXJlraNMW9O7d+946623kp+/7LLLYu3atdUfy5Yt+1xzAwBskbNQatmyZfTs2TNmz55dY/vs2bOjb9++9b6eBQsWRElJSfLzBQUF0bZt2xofAAA7Qk5fehszZkwMGzYsevXqFX369Ik77rgjli5dGhdccEHE5qNB7777bvzHf/xHRERMmTIlOnfuHAcddFCsX78+7rvvvpgxY0bMmDEjl2MCANQpp6E0dOjQWLNmTfzkJz+JFStWRI8ePeKJJ56ITp06RUTEihUraryn0vr162Ps2LHx7rvvxm677RYHHXRQPP7443HcccflckwAgDrl/GTuCy+8MC688MI6Pzd9+vQal8eNGxfjxo3L9UgAAPXib70BACQIJQCABKEEAJAglAAAEoQSAECCUAIASBBKAAAJQgkAIEEoAQAkCCUAgAShBACQIJQAABKEEgBAglACAEgQSgAACUIJACBBKAEAJAglAIAEoQQAkCCUAAAShBIAQIJQAgBIEEoAAAlCCQAgQSgBACQIJQCABKEEAJAglAAAEoQSAECCUAIASBBKAAAJQgkAIEEoAQAkCCUAgAShBACQIJQAABKEEgBAglACAEgQSgAACUIJACBBKAEAJAglAIAEoQQAkCCUAAAShBIAQIJQAgBIEEoAAAlCCQAgQSgBACQIJQCABKEEAJAglAAAEoQSAECCUAIASBBKAAAJQgkAIEEoAQAkCCUAgAShBACQIJQAABKEEgBAglACAEgQSgAACUIJACBBKAEAJAglAIAEoQQAkCCUAAAShBIAQIJQAgBIEEoAAAlCCQAgQSgBACQIJQCABKEEAJAglAAAEoQSAECCUAIA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Fi2K9957r9bnVq1aFUVFRfW+vZKSkujUqVO89dZbdX7+sssuizFjxlRfrqioEEsAwA7R4FBq165dtGvXbpvr+vTpE2vXro0XX3wxjjjiiIiIeOGFF2Lt2rXRt2/fet/emjVrYtmyZVFSUlLn5wsKCup8SQ4A4PPK2cnc3bt3j2OPPTbOP//8eP755+P555+P888/P0444YQav/F24IEHxsMPPxwRER9++GGMHTs2ysrK4u233465c+fGiSeeGO3atYshQ4bkalQAgDrl9A0n77///jj44IOjtLQ0SktL45BDDol77723xprFixfH2rVrIyKiefPm8eqrr8ZJJ50UXbt2jeHDh0fXrl2jrKws2rRpk8tRAQBqyekbTu65555x3333bXVNlmXV/73bbrvFU089lcuRAADqzd96AwBIEEoAAAlCCQAgQSgBACQIJQCABKEEAJAglAAAEoQSAECCUAIASBBKAAAJQgkAIEEoAQAkCCUAgAShBACQIJQAABKEEgBAglACAEgQSgAACUIJACBBKAEAJAglAIAEoQQAkCCUAAAShBIAQIJQAgBIEEoAAAlCCQAgQSgBACQIJQCABKEEAJAglAAAEoQSAECCUAIASBBKAAAJQgkAIEEoAQAkCCUAgAShBACQIJQAABKEEgBAglACAEgQSgAACUIJACBBKAEAJAglAIAEoQQAkCCUAAAShBIAQIJQAgBIEEoAAAlCCQAgQSgBACQIJQCABKEEAJAglAAAEoQSAECCUAIASBBKAAAJQgkAIEEoAQAkCCUAgAShBACQIJQAABKEEgBAglACAEgQSgAACUIJACBBKAEAJAglAIAEoQQAkCCUAAAShBIAQIJQAgBIEEoAAAlCCQAgQSgBACQIJQCABKEEAJAglAAAEoQSAECCUAIASBBKAAAJQgkAIEEoAQAkCCUAgAShBACQIJQAABKEEgBAglACAEgQSgAACUIJACBBKAEAJAglAIAEoQQAkCCUAAAShBIAQIJQAgBIEEoAAAk5DaWrr746+vbtG61bt47dd9+9XvtkWRYTJkyIDh06xG677RYDBw6M1157LZdjAgDUKaehtH79+jj11FNjxIgR9d7n+uuvj8mTJ8ctt9wSL730UhQXF8cxxxwT69aty+WoAAC15DSUJk6cGKNHj46DDz64XuuzLIspU6bE+PHj45RTToke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P/95vPTSS/Htb387KisrczzxrmX16tWxcePGBj0/ysvL61xfVVUVq1evzum8bN9jVlJSEnfccUfMmDEjZs6cGd26dYujjjoqnn322Z00NQ3VVJ5n+Y09QFMxYcKEmDhx4lbXvPTSS9GrV6/tvo28vLwal7Msq7WN+qvvYxZ1fO2jHl//oUOHVv93jx49olevXtGpU6d4/PHH45RTTvlcs1NbQ58fda2vazu505DHrFu3btGtW7fqy3369Illy5bFDTfcEP3798/5rGyfpvA8E0o7yEUXXRSnn376Vtd07tx5u667uLg4YnOdl5SUVG9fuXJlrVqn/ur7mC1atCjee++9Wp9btWpVg77+JSUl0alTp3jrrbe2a17q1q5du2jevHmtIxFbe34UFxfXuT4/Pz/22muvnM7L9j1mdendu3fcd999OZiQHaGpPM+E0g7Srl27aNeuXU6uu0uXLlFcXByzZ8+Oww47LGLza/zPPPNMXHfddTm5zV1BfR+zPn36xNq1a+PFF1+MI444IiIiXnjhhVi7dm307du33re3Zs2aWLZsWY3Y5fNr2bJl9OzZM2bPnh1Dhgyp3j579uw46aST6tynT58+8eijj9bYNmvWrOjVq1e0aNEi5zPv6rbnMavLggULPJ++wJrM86yxzybfFb3zzjvZggULsokTJ2Zf/epXswULFmQLFizI1q1bV72mW7du2cyZM6svX3vttVlhYWE2c+bM7NVXX82+973vZSUlJVlFRUUj3Ytdy7HHHpsdcsghWVlZWVZWVpYdfPDB2QknnFBjzWcfs3Xr1mU//vGPs3nz5mVLlizJ5syZk/Xp0yfbZ599PGY58F//9V9ZixYtsmnTpmWvv/56NmrUqOwrX/lK9vbbb2dZlmWXXnppNmzYsOr1f/nLX7LWrVtno0ePzl5//fVs2rRpWYsWLbKHHnqoEe/FrqWhj9mNN96YPfzww9mf/vSn7I9//GN26aWXZhGRzZgxoxHvxa5l3bp11T+vIiKbPHlytmDBguydd97Jsib8PBNKjWD48OFZRNT6mDNnTvWaiMjuvvvu6subNm3Krrrqqqy4uDgrKCjI+vfvn7366quNdA92PWvWrMnOPPPMrE2bNlmbNm2yM888s9avKX/2Mfv444+z0tLSbO+9985atGiR7bvvvtnw4cOzpUuXNtI9aPpuvfXWrFOnTlnLli2zww8/PHvmmWeqPzd8+PBswIABNdbPnTs3O+yww7KWLVtmnTt3zm6//fZGmHrX1pDH7Lrrrsu+/vWvZ61atcr22GOP7P/9v/+XPf744400+a5py1s0/OPH8OHDs6wJP8/ysi1nVgEAUIO3BwAASBBKAAAJQgkAIEEoAQAkCCUAgAShBACQIJQAABKEEgBAglACAEgQSgAACUIJACBBKAEAJPz/9l9Qm5pf7sYAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# Grid\n", + "xx = np.linspace(-1.2, 1.2, 400)\n", + "yy = np.linspace(-1.2, 1.2, 400)\n", + "X, Y = np.meshgrid(xx, yy)\n", + "\n", + "# Take the $L^{\\infty}$ norm\n", + "Z = np.maximum(np.abs(X), np.abs(Y))\n", + "\n", + "plt.figure(figsize=(6,6))\n", + "plt.contour(X, Y, Z, levels=[1])\n", + "plt.contourf(X, Y, Z, levels=[0,1], alpha=0.3)\n", + "\n", + "plt.axhline(0)\n", + "plt.axvline(0)\n", + "plt.gca().set_aspect(\"equal\", adjustable=\"box\")\n", + "plt.title(r\"$L^{\\infty}$ unit ball: $\\max\\{|x|,|y|\\} \\leq 1$\")\n", + "plt.tight_layout()\n", + "plt.savefig('../images/Linf_unit_ball.png')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "55c4ce17", + "metadata": {}, + "source": [ + "\n", + "Problems involving the $L^{\\infty}$ norm are often formulated as linear programs, and are useful when worst-case guarantees are more important than optimizing average performance. " + ] + }, + { + "cell_type": "markdown", + "id": "d393c069", + "metadata": {}, + "source": [ + "\n", + "## Matrix norms\n", + "\n", + "There are also various norms on matrices, each highlighting a different aspect of the associated linear transformation.\n", + "- **Frobenius norm**. This is an important norm, essentially the analogue of the $L^2$ norm for matrices. It is the Euclidean norm if you think of your matrix as a vector, forgetting its rectangular shape. For $A = (a_{ij})$ a matrix, the Frobenius norm \n", + " $$ \\|A\\|_F = \\sqrt{\\sum a_{ij}^2} $$\n", + " is the square root of the sum of squares of all the entries. This treats a matrix as a long vector and is invariant under orthogonal transformations. As we'll see, it plays a central role in:\n", + " - least-squares problems,\n", + " - low-rank approximation,\n", + " - principal component analysis.\n", + "\n", + " In particular, the truncated SVD yields a best low-rank approximation of a matrix with respect to the Frobenius norm.\n", + "\n", + " We also that that the Frobenius norm can be written in terms of tracial data. We have that\n", + " $$ \\|A\\|_F^2 = \\text{Tr}(A^TA) = \\text{Tr}(AA^T). $$\n", + "- **Operator norm** (spectral norm). This is just the norm as an operator $A: \\mathbb{R}^p \\to \\mathbb{R}^n$, where $\\mathbb{R}^p$ and $\\mathbb{R}^n$ are thought of as Hilbert spaces:\n", + " $$ \\|A\\| = \\max_{\\|x\\|_2 = 1}\\|Ax\\|_2. $$\n", + " This norm measures how big of an amplification $A$ can apply, and is equal to the largest singular value of $A$. This norm is related to stability properties, and is the analogue of the $L^{\\infty}$ norm.\n", + "- **Nuclear norm**. The nuclear norm, defined as\n", + " $$ \\|A\\|_* = \\sum \\sigma_i, $$\n", + " is the sum of the singular values. When $A$ is square, this is precisely the trace-class norm, and is the analogue of the $L^1$ norm. This norm acts as a generalization of the concept of rank. " + ] + }, + { + "cell_type": "markdown", + "id": "4ee62ee0", + "metadata": {}, + "source": [ + "\n", + "# A note on regularization\n", + "\n", + "Regularization introduces additional constraints or penalties to stabilize ill-posed problems. From the linear algebra point of view, regularization modifies the singular value structure of a problem. \n", + "- **Ridge regression**: add a positive multiple $\\lambda\\cdot I$ of the identity to $X^TX$ which will artificially inflate small singular values.\n", + "- This dampens unstable directions while leaving well-conditioned directions largely unaffected.\n", + " \n", + "Geometrically, regularization reshapes the solution space to suppress directions that are poorly supported by the data." + ] + }, + { + "cell_type": "markdown", + "id": "be3b8c1e", + "metadata": {}, + "source": [ + "\n", + "# A note on solving multiple targets concurrently\n", + "\n", + "Suppose now that we were interested in solving several problems concurrently; that is, given some data points, we would like to make $k$ predictions. Say we have our $n \\times p$ data matrix $X$, and we want to make $k$ predictions $y_1,\\dots,y_k$. We can then set the problem up as finding a best solution to the matrix equation\n", + "$$ XB = Y $$\n", + "where $B$ will be a $p \\times k$ matrix of parameters and $Y$ will be the $p \\times k$ matrix whose columns are $y_1,\\dots,y_k$. " + ] + }, + { + "cell_type": "markdown", + "id": "908cd528", + "metadata": {}, + "source": [ + "\n", + "# What can go wrong?\n", + "\n", + "We are often dealing with imperfect data, so there is plenty that could go wrong. Here are some basic cases of where things can break down.\n", + "\n", + "- **Perfect multicolinearity**: non-invertible $\\tilde{X}^T\\tilde{X}$. This happens when one feature is a perfect combination of the others. This means that the columns of the matrix $\\tilde{X}$ are linearly dependent, and so infinitely many solutions will exist to the least-squares problem. \n", + " - For example, if you are looking at characteristics of people and you have height in both inches and centimeters.\n" + ] + }, + { + "cell_type": "markdown", + "id": "a1d9e0ed", + "metadata": {}, + "source": [ + "- **Almost multicolinearity**: this happens when one features is **almost** a perfect combination of the others. From the linear algebra perspective, the columns of $\\tilde{X}$ might not be dependent, but they will be be **almost** linearly dependent. This will cause problems in calculation, as the condition number will become large and amplify numerical errors. The inverse will blow up small spectral components. \n" + ] + }, + { + "cell_type": "markdown", + "id": "fa57c3a4", + "metadata": {}, + "source": [ + "\n", + "- **More features than observations**: this means that our matrix $\\tilde{X}$ will be wider than it is high. Necessarily, this means that the columns are linearly dependent. Regularization or dimensionality reduction becomes essential.\n" + ] + }, + { + "cell_type": "markdown", + "id": "f5fff0b5", + "metadata": {}, + "source": [ + "\n", + "- **Redundant or constant features**: this is when there is a characteristic that is satisfied by each observation. In terms of the linear algebraic data, this means that one of the columns of $X$ is constant.\n", + " - e.g., if you are looking at characteristics of penguins, and you have \"# of legs\". This will always be two, and doesn't add anything to the analysis.\n" + ] + }, + { + "cell_type": "markdown", + "id": "ed7d745d", + "metadata": {}, + "source": [ + "\n", + "- **Underfitting**: the model lacks sufficient expressivity to capture the underlying structure. For example, see the section on polynomial regression -- sometimes one might want a curve vs. a straight line." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "2de2ed0c", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "## Generate data\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# 1) Generate quadratic data\n", + "np.random.seed(3)\n", + "\n", + "n = 50\n", + "x = np.random.uniform(-5, 5, n) # symmetric, wider range\n", + "\n", + "# True relationship: y = ax^2 + c + noise\n", + "a_true = 2.0\n", + "c_true = 5.0\n", + "noise = np.random.normal(0, 3, n)\n", + "\n", + "y = a_true * x**2 + c_true + noise\n", + "\n", + "# find a line of best fit\n", + "a,b = np.polyfit(x, y, 1)\n", + "\n", + "# add scatter points to plot\n", + "plt.scatter(x,y)\n", + "\n", + "# add line of best fit to plot\n", + "plt.plot(x, a*x + b, 'r', linewidth=1)\n", + "\n", + "# plot it\n", + "plt.show()\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "dbb01960", + "metadata": {}, + "source": [ + "- **Overfitting**: the model captures noise rather than structure. Often due to model complexity relative to data size. Polynomial regression can give a nice visualization of overfitting. For example, if we worked with the same generated quadratic data from the polynomial regression section, and we tried to approximation it by a degree 11 polynomial, we get the following.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "43ab6a3f", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAh8AAAGxCAYAAADCo9TSAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAaDxJREFUeJzt3Xd4U2X/x/F3WmhLoRTLaMuuKEItG0EQBUEQFERxb5wIOBBRRB4FHCwVERFUVOCR4WSIIj9RoC4QEKosfQSLrJYy2zLaQnt+f5wmaWgLnTkZn9d15eI+J3dOvok1+eaeNsMwDERERETcJMDqAERERMS/KPkQERERt1LyISIiIm6l5ENERETcSsmHiIiIuJWSDxEREXErJR8iIiLiVko+RERExK2UfIiIiIhbKfkQnzRr1ixsNpvjFhISQlRUFFdeeSXjxo0jJSXF6hDdYs+ePQwZMoTOnTtTrVo1bDYbs2bNKrDuV199xT333EOzZs2oWLEiNputWM+V9/222WyEh4fTpUsXvv7662LHbf/vt3PnzmI/1hM1bNiQ/v37l+tjGzZsmO+/gf127Ngx+vfvT8OGDV0eM3bsWBYtWlSiuERKQ8mH+LSZM2eyevVqli9fzttvv03Lli2ZMGECTZs25bvvvrM6vHK3fft25s6dS1BQENdcc81Z6y5cuJA1a9YQGxtLixYtSvR8N910E6tXr+bnn3/m7bffJjk5mT59+pQoAfElCxcu5Pnnny/357nssstYvXp1vltoaCjPP/88CxcudKmv5EOsUsHqAETKU1xcHG3btnUc33jjjTz55JN06tSJfv368ffffxMZGenWmE6ePEmlSpXc8lxXXHEFBw4cAGD9+vXMnz+/0LozZswgIMD8PfLoo4/y22+/Ffv5IiMjufTSSwHo2LEjHTp04IILLmDy5Mlce+21JX4d3q5Vq1ZueZ5q1ao53v8zNWrUyC0xiBSFWj7E79SvX5/XX3+d9PR03n33XZf71q9fz3XXXUdERAQhISG0atWKTz/9NN81fvrpJzp06EBISAh16tTh+eef5/3338/XVdCwYUN69+7NggULaNWqFSEhIYwZMwaA5ORkBgwYQN26dQkKCiImJoYxY8Zw+vRpl+fKysri5ZdfpkmTJgQHB1OzZk3uu+8+R1JxNvZkoiiKU7eoGjVqRM2aNfn3338d57788ks6dOhAaGgoYWFhdO/endWrV5/1Oi+99BIVKlRg9+7d+e67//77qV69OhkZGZDnPV+2bBmtW7emUqVKNGnShA8//DDfYzdv3kzfvn0577zzCAkJoWXLlsyePdulzqpVq7DZbMybN4/hw4cTHR1NlSpV6NOnD/v37yc9PZ2HH36YGjVqUKNGDe677z6OHTvmco0zu04yMjJ46qmnaNmyJeHh4URERNChQwcWL15cjHe3eM7sdrHZbBw/fpzZs2c7ume6dOlSbs8vkpdaPsQvXXPNNQQGBvLDDz84zq1cuZKePXvSvn173nnnHcLDw/n444+59dZbOXHihOPL448//qB79+40btyY2bNnExoayjvvvMOcOXMKfK4NGzawbds2/vOf/xATE0PlypVJTk6mXbt2BAQE8MILL9CoUSNWr17Nyy+/zM6dO5k5cyYAOTk59O3blx9//JFnnnmGjh078u+//zJq1Ci6dOnC+vXr3daKUhJHjhzh0KFDXHjhhQDMmzePO++8kx49ejB//nwyMzOZOHEiXbp04fvvv6dTp04FXmfAgAG88sorvPvuu7z88suO84cPH+bjjz/m0UcfJSQkxHH+999/56mnnuLZZ58lMjKS999/nwceeIALLriAK664AoC//vqLjh07UqtWLaZMmUL16tWZM2cO/fv3Z//+/TzzzDMuMTz33HNceeWVzJo1i507dzJs2DBuv/12KlSoQIsWLZg/fz4bN27kueeeIywsjClTphT6vmRmZnL48GGGDRtGnTp1yMrK4rvvvqNfv37MnDmTe+65p0Tvt2EY+ZLXgICAAhPL1atX07VrV6688kpHl1DVqlVL9LwixWaI+KCZM2cagLFu3bpC60RGRhpNmzZ1HDdp0sRo1aqVcerUKZd6vXv3NqKjo43s7GzDMAzj5ptvNipXrmwcOHDAUSc7O9uIjY01ACMxMdFxvkGDBkZgYKDx119/uVxzwIABRpUqVYx///3X5fxrr71mAMaWLVsMwzCM+fPnG4DxxRdfuNRbt26dARjTpk0r8ntif8zMmTPPWXfw4MFGcT8eAGPQoEHGqVOnjKysLGPbtm1Gr169DMB4++23jezsbKN27dpGs2bNHO+lYRhGenq6UatWLaNjx46Oc/b/fnnfy3vvvdeoVauWkZmZ6Tg3YcIEIyAgIN97HhIS4vLenjx50oiIiDAGDBjgOHfbbbcZwcHBxq5du1xeR69evYzQ0FDj6NGjhmEYxsqVKw3A6NOnj0u9IUOGGIDx+OOPu5y//vrrjYiICJdzDRo0MO69995C37vTp08bp06dMh544AGjVatWxXps3npAvtvIkSMNI/f9a9CggctjKleuXKRri5Q1dbuI3zK/L03bt2/nzz//5M477wTg9OnTjts111xDUlISf/31FwDx8fF07dqVGjVqOB4fEBDALbfcUuDzNG/enMaNG7uc++qrr7jyyiupXbu2y3P16tXL8Rz2etWqVaNPnz4u9Vq2bElUVBSrVq0qh3em5KZNm0bFihUJCgqiadOm/PLLL7z44osMGjSIv/76i3379nH33Xe7/BKvUqUKN954I2vWrOHEiROFXvuJJ54gJSWFzz77DHJbhaZPn861116bbxZHy5YtqV+/vuM4JCSExo0bu3T/rFixgm7dulGvXj2Xx/bv358TJ07k6wrq3bu3y3HTpk0B8o1ladq0KYcPH87X9XKmzz77jMsuu4wqVapQoUIFKlasyAcffMC2bdvO+riz6dSpE+vWrXO5DRo0qMTXEykv6nYRv3T8+HEOHTpEs2bNANi/fz8Aw4YNY9iwYQU+5uDBgwAcOnSowEGqhQ1cjY6Ozndu//79LFmyhIoVK571ufbv38/Ro0cJCgo6az1Pccstt/D0009js9kICwujUaNGBAYGQu77RiHvR+3atcnJyeHIkSOEhoYWeO1WrVpx+eWX8/bbb3PnnXfy1VdfsXPnznzjdgCqV6+e71xwcDAnT550HB86dKjQWPLGaxcREeFybP9vUtj5jIwMqlSpUuBrWbBgAbfccgs333wzTz/9NFFRUVSoUIHp06cXODalqMLDw10GWIt4KiUf4pe+/vprsrOzHQPs7K0YI0aMoF+/fgU+5qKLLoLcLzZ7spJXcnJygY8raL2MGjVq0Lx5c1555ZUCH2P/AqxRowbVq1dn2bJlBdYLCwsr5BVao2bNmoV++dkTgqSkpHz37du3j4CAAM4777yzXv/xxx/n5ptvZsOGDUydOpXGjRvTvXv3EsVavXr1QmMhz99EeZgzZw4xMTF88sknLn8fmZmZ5facIp5EyYf4nV27djFs2DDCw8MZMGAA5CYWF154Ib///jtjx4496+M7d+7M0qVLOXjwoOMLKicnx9EdUBS9e/dm6dKlNGrU6KxfuL179+bjjz8mOzub9u3bF/n6nuiiiy6iTp06zJs3j2HDhjm+dI8fP84XX3zhmAFzNjfccAP169fnqaeeIj4+njfeeKPYi6HZdevWjYULF7Jv3z5Hsgfw3//+l9DQ0EKnrJYFm81GUFCQS+zJycnlOtulIGe2Bom4i5IP8WmbN292jJNISUnhxx9/ZObMmQQGBrJw4UJq1qzpqPvuu+/Sq1cvrr76avr370+dOnU4fPgw27ZtY8OGDY7kYuTIkSxZsoRu3boxcuRIKlWqxDvvvMPx48ehiFNWX3zxRZYvX07Hjh15/PHHueiii8jIyGDnzp0sXbqUd955h7p163Lbbbcxd+5crrnmGp544gnatWtHxYoV2bNnDytXrqRv377ccMMNZ32uzz//HIB//vkHcqcT27sDbrrpJke9f//9l3Xr1gGwY8cOl8c2bNiw1M35AQEBTJw4kTvvvJPevXszYMAAMjMzefXVVzl69Cjjx48/5zUCAwMZPHgww4cPp3LlyiVeNRRg1KhRjrE3L7zwAhEREcydO5evv/6aiRMnEh4eXuJrn4t9+vWgQYO46aab2L17Ny+99BLR0dH8/fff5fa8Z2rWrBmrVq1iyZIlREdHExYW5mjhEylXVo94FSkP9tkS9ltQUJBRq1Yto3PnzsbYsWONlJSUAh/3+++/G7fccotRq1Yto2LFikZUVJTRtWtX45133nGp9+OPPxrt27c3goODjaioKOPpp582JkyYYACOWRJG7gyEa6+9tsDnOnDggPH4448bMTExRsWKFY2IiAijTZs2xsiRI41jx4456p06dcp47bXXjBYtWhghISFGlSpVjCZNmhgDBgww/v7773O+FwXNgLDfzvae5b0VZUYEYAwePPic9RYtWmS0b9/eCAkJMSpXrmx069bN+PnnnwuMJe8sFrudO3cagPHII48UeP3C3vPOnTsbnTt3djm3adMmo0+fPkZ4eLgRFBRktGjRIt9sIPtsl88++6zAGM+cUTVq1CgDcJkNVdCMlfHjxxsNGzY0goODjaZNmxozZsxwPPbM11PU2S6F/a0Zhcx2SUhIMC677DIjNDTUAPK9PyLlxWbkHfIvIiXWo0cPdu7cyf/+9z+rQ/Fpb731Fo8//jibN2/m4osvtjocESkBdbuIlMDQoUNp1aoV9erV4/Dhw8ydO5fly5fzwQcfWB2az9q4cSOJiYm8+OKL9O3bV4mHiBdT8iFSAtnZ2bzwwgskJydjs9mIjY3lo48+4q677rI6NJ91ww03kJyczOWXX84777xjdTgiUgrqdhERERG30gqnIiIi4lZKPkRERMStlHyIiIiIW3ncgNOcnBz27dtHWFhYiVcuFBEREfcyDIP09HRq1659zsUWPS752LdvX75dJkVERMQ77N69m7p16561jsclH/aNsnbv3k3VqlWtDkdERESKIC0tjXr16hVpw0uPSz7sXS1Vq1ZV8iEiIuJlijJkQgNORURExK2UfIiIiIhbKfkQERERt1LyISIiIm6l5ENERETcSsmHiIiIuJWSDxEREXErJR8iIiLiVko+RERExK2UfIiIiIhbKfkQERERt1LyISIiIm6l5ENERMSXJCfDgAEQFwf9+sGmTVZHlI/H7WorIiIiJbRvH3TuDNu3m8dbtsDKlfDzzxAba3V0Dmr5EBER8QWGAfff70w87I4ehXvvNe/3EEo+REREfMEXX8D//Z9ZrlPH7G6xt3asXw9ff21peHkp+RAREfF2hgEvvug8njrVHPMxdqzz3OTJloRWECUfIiIi3m7ZMufA0vbtoW9fs3zddXD++WZ55UpISbEuxjz8MvnIzjFYveMQixP2snrHIbJzPKcfTEREpNjee89ZHj4cbDazbLPBLbeY5Zwcs2vGA9gMw4NGoABpaWmEh4eTmppK1apVy+y62TkGm7+OJ/2/c3m82U0cPnHacV90eAij+sTSMy66zJ5PRETELZKToW5dyM6G6GjYtQsq5JnMunEjtG5tlnv3hiVLyiWM4nx/+0XLx7LNSXx6xc20uO5KOn3+Pk23rne5Pzk1g4FzNrBsc5JlMYqIiJTI55+biQdA//6uiQdAy5ZQo4ZZ/uEHZ10L+XzysWxzEgPnbODn6o0c5wat+dSljr3pZ8ySreqCERER77JwobN8223577fZoEsXs5yWBgkJ7outED6dfGTnGIxZshUDWHrRZSSeZ3arXPbvH7TY95dLXQNISs1gbeJhi6IVEREppkOHID7eLJ9/PjRrVnA9e/IBsGqVe2I7C59OPtYmHiYpNQOAnIBA3m13o+O+QWs+K/AxKekZbotPRESkVL76ytmN0q+fc6DpmTp1cpbXry+4jhv5dPJxZiKxIK4byVUiALj67zVccHBX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06VLF4YMGVLmr0lERMqPkg836tmzJ0lJSezcuZNvvvmGK6+8kieeeILevXtz+vTpcn3urKyscrv28ePHadGiBVOnTj1rncsuu4zx48cX+bo7duwAoG/fvkRFRREcHEx4eDjVqlUrk7hFRMQaSj7cKDg4mKioKOrUqUPr1q157rnnWLx4Md98843Lr/nU1FQefvhhatWqRdWqVenatSu///67y7VefvllatWqRVhYGA8++CDPPvssLVu2dNxv754YN24ctWvXpnHjxgDs3buXW2+9lfPOO4/q1avTt29fdu7c6XLtmTNn0rRpU0JCQmjSpAnTpk076+vq1asXL7/8Mv369Su0zt13380LL7zAVVddVaT3avTo0fTp0weAgIAAx75Aebtd+vfvT3x8PG+++aajVenM1yIiIp5HyYfFunbtSosWLViwYAHkbsB37bXXkpyczNKlS/ntt99o3bo13bp14/DhwwDMnTuXV155hQkTJvDbb79Rv359pk+fnu/a33//Pdu2bWP58uV89dVXnDhxgiuvvJIqVarwww8/8NNPP1GlShV69uzpaBmZMWMGI0eO5JVXXmHbtm2MHTuW559/ntmzZ7v1fRk2bBgzZ84EICkpiaSkpHx13nzzTTp06MBDDz3kqFPemxL6k+wcg9U7DrE4YS+rdxwiO6dMN8AWET9WbouMuVXbtnDGRnZuERUF69eX+jJNmjThjz/+AGDlypVs2rSJlJQUx4Z7r732GosWLeLzzz/n4Ycf5q233uKBBx7gvvvuA+CFF17g22+/5dixYy7XrVy5Mu+//z5BQUEAfPjhhwQEBPD+++87WhJmzpxJtWrVWLVqFT169OCll17i9ddfd7RixMTEsHXrVt59913uvffeUr/WoqpSpYqjeyUqKqrAOuHh4QQFBREaGlpoHSmZZZuTGLNkK0mpGY5z0eEhjOoTS8+4aEtjExHv5xvJR3Iy7N1rdRQlZhiGIxn47bffOHbsGNWru+64e/LkSccYiL/++ivf6rHt2rVjxYoVLueaNWvmSDzs196+fTthYWEu9TIyMtixYwcHDhxg9+7dPPDAAzz00EOO+0+fPk14eHgZvmLxZMs2JzFwzgbObOdITs1g4JwNTL+rtRIQESkV30g+rPrVW0bPu23bNmJiYgDIyckhOjqaVatW5auXd6ClPVmxM4z8TeKVK1d2Oc7JyaFNmzbMnTs3X92aNWuSkWH+yp0xYwbt27d3uT8wMLDYr0u8T3aOwZglW/MlHgAGYAPGLNlK99goAgNsBdQSETk330g+yqDrwyorVqxg06ZNPPnkkwC0bt2a5ORkKlSoQMOGDQt8zEUXXcTatWu5++67HefWF+E9aN26NZ988oljIOuZwsPDqVOnDv/88w933nlnqV6XuwQFBZGdnW11GD5jbeJhl66WMxlAUmoGaxMP06FR9ULriYicjW8kH14iMzOT5ORksrOz2b9/P8uWLWPcuHH07t2be+65B4CrrrqKDh06cP311zNhwgQuuugi9u3bx9KlS7n++utp27Ytjz32GA899BBt27alY8eOfPLJJ/zxxx+cf/75Z33+O++8k1dffZW+ffvy4osvUrduXXbt2sWCBQt4+umnqVu3LqNHj+bxxx+natWq9OrVi8zMTNavX8+RI0cYOnRogdc9duwY27dvdxwnJiaSkJBAREQE9evXB+Dw4cPs2rWLffv2QW7XEbnjOUozXqNhw4b8+uuv7Ny5kypVqhAREUFAgMZRl1RKeuGJR0nqiYgURJ/SbrRs2TKio6Np2LAhPXv2ZOXKlUyZMoXFixc7ujVsNhtLly7liiuu4P7776dx48bcdttt7Ny5k8jISMhNIkaMGMGwYcNo3bo1iYmJ9O/fn5CQkLM+f2hoKD/88AP169enX79+NG3alPvvv5+TJ086WkIefPBB3n//fWbNmkWzZs3o3Lkzs2bNcnQLFWT9+vW0atWKVq1aATB06FBatWrFCy+84Kjz5Zdf0qpVK6699loAbrvtNlq1asU777xTqvd02LBhBAYGEhsbS82aNdm1a1eprufvaoWd/W+ouPVERApiMwoaLGChtLQ0wsPDSU1Nzdc1kJGRQWJiIjExMef8ovU33bt3Jyoqio8++sjqUDyO/m6KLjvHoNOEFSSnZhQ47sMGRIWH8NPwrhrzISIuzvb9fSZ1u3ihEydO8M4773D11VcTGBjI/Pnz+e6771i+fLnVoYmXCwywMapPLAPnbMCWO8bDzp5qjOoTq8RDREpF3S5eyN41c/nll9OmTRuWLFnCF198UeTVQ0XOpmdcNNPvak1UuGsrUVR4iKbZikiZUMuHF6pUqRLfffed1WGID+sZF0332CjWJh4mJT2DWmEhtIuJUIuHiJQJJR8iUqDAAJum04pIuVC3i4iIiLiVVyYfOTk5VocgXkR/LyIinsWrul2CgoIICAhg37591KxZk6CgoHzLjIvYGYZBVlYWBw4cICAgwGWfGxERsY5XJR8BAQHExMSQlJTkWClT5FxCQ0OpX7++Vj4VEfEQXpV8kNv6Ub9+fU6fPq09PeScAgMDqVChglrIREQ8iNclH+Suc1GxYkUqVqxodSgiIiJSTGqHFhEREbdS8iEiIiJupeRDRERE3MrjxnzYN9lNS0uzOhQREREpIvv3tv17/Gw8LvlIT08HoF69elaHIiIiIsWUnp5OeHj4WevYjKKkKG6Uk5PDvn37CAsL8/npkWlpadSrV4/du3dTtWpVq8PxK3rvraH33Tp6763jL++9YRikp6dTu3btc66r5HEtHwEBAdStW9fqMNyqatWqPv0H6cn03ltD77t19N5bxx/e+3O1eNhpwKmIiIi4lZIPERERcSslHxYKDg5m1KhRBAcHWx2K39F7bw2979bRe28dvff5edyAUxEREfFtavkQERERt1LyISIiIm6l5ENERETcSsmHiIiIuJWSDxEREXErJR8eJjMzk5YtW2Kz2UhISLA6HJ+3c+dOHnjgAWJiYqhUqRKNGjVi1KhRZGVlWR2aT5o2bRoxMTGEhITQpk0bfvzxR6tD8nnjxo3jkksuISwsjFq1anH99dfz119/WR2W3xk3bhw2m40hQ4ZYHYpHUPLhYZ555hlq165tdRh+488//yQnJ4d3332XLVu28MYbb/DOO+/w3HPPWR2az/nkk08YMmQII0eOZOPGjVx++eX06tWLXbt2WR2aT4uPj2fw4MGsWbOG5cuXc/r0aXr06MHx48etDs1vrFu3jvfee4/mzZtbHYrH0DofHuSbb75h6NChfPHFF1x88cVs3LiRli1bWh2W33n11VeZPn06//zzj9Wh+JT27dvTunVrpk+f7jjXtGlTrr/+esaNG2dpbP7kwIED1KpVi/j4eK644gqrw/F5x44do3Xr1kybNo2XX36Zli1bMnnyZKvDspxaPjzE/v37eeihh/joo48IDQ21Ohy/lpqaSkREhNVh+JSsrCx+++03evTo4XK+R48e/PLLL5bF5Y9SU1MB9DfuJoMHD+baa6/lqquusjoUj+Jxu9r6I8Mw6N+/P4888ght27Zl586dVofkt3bs2MFbb73F66+/bnUoPuXgwYNkZ2cTGRnpcj4yMpLk5GTL4vI3hmEwdOhQOnXqRFxcnNXh+LyPP/6YDRs2sG7dOqtD8Thq+ShHo0ePxmaznfW2fv163nrrLdLS0hgxYoTVIfuMor73ee3bt4+ePXty88038+CDD1oWuy+z2Wwux4Zh5Dsn5efRRx/ljz/+YP78+VaH4vN2797NE088wZw5cwgJCbE6HI+jMR/l6ODBgxw8ePCsdRo2bMhtt93GkiVLXD6Es7OzCQwM5M4772T27NluiNa3FPW9t38o7Nu3jyuvvJL27dsza9YsAgKUl5elrKwsQkND+eyzz7jhhhsc55944gkSEhKIj4+3ND5/8Nhjj7Fo0SJ++OEHYmJirA7H5y1atIgbbriBwMBAx7ns7GxsNhsBAQFkZma63OdvlHx4gF27dpGWluY43rdvH1dffTWff/457du3p27dupbG5+v27t3LlVdeSZs2bZgzZ45ffyCUp/bt29OmTRumTZvmOBcbG0vfvn014LQcGYbBY489xsKFC1m1ahUXXnih1SH5hfT0dP7991+Xc/fddx9NmjRh+PDhft/tpTEfHqB+/foux1WqVAGgUaNGSjzK2b59++jSpQv169fntdde48CBA477oqKiLI3N1wwdOpS7776btm3b0qFDB9577z127drFI488YnVoPm3w4MHMmzePxYsXExYW5hhjEx4eTqVKlawOz2eFhYXlSzAqV65M9erV/T7xQMmH+Ltvv/2W7du3s3379nyJnhoFy9att97KoUOHePHFF0lKSiIuLo6lS5fSoEEDq0PzafapzV26dHE5P3PmTPr3729RVOLv1O0iIiIibqVRdSIiIuJWSj5ERETErZR8iIiIiFsp+RARERG3UvIhIiIibqXkQ0RERNxKyYeIiIi4lZIPERERcSslHyIiIuJWSj5ERETErZR8iIiIiFv9PyazBuvdi4E5AAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# 1) Generate quadratic data\n", + "np.random.seed(3)\n", + "\n", + "n = 50\n", + "x = np.random.uniform(-5, 5, n)\n", + "\n", + "a_true = 2.0\n", + "c_true = 5.0\n", + "noise = np.random.normal(0, 3, n)\n", + "\n", + "y = a_true * x**2 + c_true + noise\n", + "\n", + "# 2) Fit degree 11 polynomial\n", + "coeffs = np.polyfit(x, y, 11)\n", + "\n", + "# Create polynomial function\n", + "p = np.poly1d(coeffs)\n", + "\n", + "# 3) Sort x for smooth plotting\n", + "x_sorted = np.linspace(min(x), max(x), 500)\n", + "\n", + "# 4) Plot\n", + "plt.scatter(x, y, label=\"Data\")\n", + "plt.plot(x_sorted, p(x_sorted), 'r', linewidth=2, label=\"Degree 11 fit\")\n", + "\n", + "plt.legend()\n", + "plt.title(\"Degree 11 Polynomial Fit\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "3aa62d78", + "metadata": {}, + "source": [ + "\n", + "- **Outliers**: large deviations can dominate the $L^2$ norm. This is where normalization might be key.\n" + ] + }, + { + "cell_type": "markdown", + "id": "86606942", + "metadata": {}, + "source": [ + "\n", + "- **Heteroscedasticity**: this is when the variance of noise changes across observations. Certain least-squares assumptions will break down." + ] + }, + { + "cell_type": "markdown", + "id": "04e122fb", + "metadata": {}, + "source": [ + "\n", + "- **Condition number**: a large condition number indicates numerical instability and sensitivity to perturbation, even when formal solutions exist." + ] + }, + { + "cell_type": "markdown", + "id": "b5e424fd", + "metadata": {}, + "source": [ + "\n", + "- **Insufficient tolerance**: in numerical algorithms, thresholds used to determine rank or invertibility must be chosen carefully. Poor choices can lead to misleading results." + ] + }, + { + "cell_type": "markdown", + "id": "8d1dd798", + "metadata": {}, + "source": [ + "\n", + "\n", + "The point is that many failures in data science are not conceptual, but they happen geometrically and numerically. Poor choices lead to poor results. \n", + "\n" + ] + } + ], + "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.14.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/04_pca.ipynb b/notebooks/04_pca.ipynb new file mode 100644 index 0000000..272ed2a --- /dev/null +++ b/notebooks/04_pca.ipynb @@ -0,0 +1,751 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Principal Component Analysis\n", + "\n", + "Principal Component Analysis (PCA) addresses the issues of multicollinearity and dimensionality mentioned at the end of the previous section by transforming the data into a new coordinate system. The new axes -- called principal components -- are chosen to capture the maximum variance in the data. In linear algebra terms, we are finding a subspace of potentially smaller dimension that best approximates our data.\n", + "\n", + "> **Example**: Let us return to our house example. Suppose we decide to list the square footage in both square feet and square meters. Let's add this feature to our dataset.\n", + "> |House | Square ft | Square m | Bedrooms | Price (in $1000s) |\n", + "> | --- | --- | --- | --- | --- |\n", + "> | 0 | 1600 | 148 | 3 | 500 |\n", + "> | 1 | 2100 | 195 | 4 | 650 |\n", + "> | 2 | 1550 | 144 | 2 | 475 |\n", + "> | 3 | 1600 | 148 | 3 | 490 |\n", + "> | 4 | 2000 | 185 | 4 | 620 |\n", + "> \n", + "> In this case, our associated matrix is:\n", + "> $$ X = \\begin{bmatrix} 1600 & 148 & 3 & 500 \\\\ 2100 & 195 & 4 & 650 \\\\ 1550 & 144 & 2 & 475 \\\\ 1600 & 148 & 3 & 490 \\\\ 2000 & 185 & 4 & 620 \\end{bmatrix} $$\n", + "\n", + "There are a few problems with the above data and the associated matrix $X$ (this time, we're not looking to make predictions, so we don't omit the last column).\n", + "- **Redundancy**: Square feet and square meters give the same information. It's just a matter of if you're from a civilized country or from an uncivilized country.\n", + "- **Numerical instability**: The columns of $X$ are nearly linearly dependent. Indeed, the second column is almost a multiple of the first. Moreover, one can make a safe bet that the number of bedrooms increases as the square footage does, so that the first and third columns are correlated.\n", + "- **Interpretation difficulty**: We used the square footage and bedrooms *together* in the previous section to predict the price of a house. However, because of their correlation, this obfuscates the true relationship, say, between the square footage and the price of a house, or the number of bedrooms and the price of a house. \n", + "\n", + "So the question becomes: what do we do about this? We will try to get a smaller matrix (less columns) that contains the same, or a close enough, amount of information. The point is that the data is *effectively* lower-dimensional. \n", + "\n", + "Let's do a little analysis on our dataset before progressing. Let's use `pandas.DataFrame.describe`, `pandas.DataFrame.corr` and `numpy.linalg.cond`. First, let's set up our data.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "\n", + "# First let us make a dictionary incorporating our data.\n", + "# Each entry corresponds to a column (feature of our data)\n", + "data = {\n", + " 'Square ft': [1600, 2100, 1550, 1600, 2000],\n", + "\t'Square m': [148, 195, 144, 148, 185],\n", + " 'Bedrooms': [3, 4, 2, 3, 4],\n", + " 'Price': [500, 650, 475, 490, 620]\n", + "}\n", + "\n", + "# Create a pandas DataFrame\n", + "df = pd.DataFrame(data)\n", + "\n", + "# Create out matrix X\n", + "X = df.to_numpy()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "Now let's see what it has to offer. \n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "8514ed8b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Square ftSquare mBedroomsPrice
count5.0000005.0000005.000005.000000
mean1770.000000164.0000003.20000547.000000
std258.84358224.0520270.8366681.516869
min1550.000000144.0000002.00000475.000000
25%1600.000000148.0000003.00000490.000000
50%1600.000000148.0000003.00000500.000000
75%2000.000000185.0000004.00000620.000000
max2100.000000195.0000004.00000650.000000
\n", + "
" + ], + "text/plain": [ + " Square ft Square m Bedrooms Price\n", + "count 5.000000 5.000000 5.00000 5.000000\n", + "mean 1770.000000 164.000000 3.20000 547.000000\n", + "std 258.843582 24.052027 0.83666 81.516869\n", + "min 1550.000000 144.000000 2.00000 475.000000\n", + "25% 1600.000000 148.000000 3.00000 490.000000\n", + "50% 1600.000000 148.000000 3.00000 500.000000\n", + "75% 2000.000000 185.000000 4.00000 620.000000\n", + "max 2100.000000 195.000000 4.00000 650.000000" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.describe()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "0eb032aa", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Square ftSquare mBedroomsPrice
Square ft1.0000000.9998860.9004260.998810
Square m0.9998861.0000000.8944820.998395
Bedrooms0.9004260.8944821.0000000.909066
Price0.9988100.9983950.9090661.000000
\n", + "
" + ], + "text/plain": [ + " Square ft Square m Bedrooms Price\n", + "Square ft 1.000000 0.999886 0.900426 0.998810\n", + "Square m 0.999886 1.000000 0.894482 0.998395\n", + "Bedrooms 0.900426 0.894482 1.000000 0.909066\n", + "Price 0.998810 0.998395 0.909066 1.000000" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.corr()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "6a166792", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "np.float64(8222.19067218415)" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.linalg.cond(X)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "As we can see, everything is basically correlated, and we clearly have some redundancies. \n", + "\n", + "This section is structured as follows. \n", + "- [Low-rank approximation via SVD](#low-rank-approximation-via-svd)\n", + "- [Centering data](#centering-data)\n", + "\n", + "\n", + "## Low-rank approximation via SVD\n", + "\n", + "Let $A$ be an $n \\times p$ matrix and let $A = U\\Sigma V^T$ be a SVD. Let $u_1,\\dots,u_n$ be the columns of $U$, $v_1,\\dots,v_p$ be the column of $V$, and $\\sigma_1 \\geq \\cdots \\sigma_r > 0$ be the singular values, where $r \\leq \\min\\{n,p\\}$ is the rank of $A$. Then we have the **reduced singular value decomposition** (see [Pseudoinverses and using the svd](#pseudoinverses-and-using-the-svd))\n", + "$$ A = \\sum_{i=1}^r \\sigma_i u_iv_i^T $$\n", + "(note that $u_i$ is a $n \\times 1$ matrix and $v_i$ is a $p \\times 1$ matrix, so $u_iv_i^T$ is some $n \\times p$ matrix).\n", + "The key idea is that if the rank of $A$ is higher, say $s$, but the latter singular values are small, then we should still have an approximation like this. Say $\\sigma_{r+1},\\dots,\\sigma_{s}$ are tiny. Then\n", + "$$ \\begin{split} A &= \\sum_{i=1}^s \\sigma_i u_i v_i^T \\\\ &= \\sum_{i=1}^r \\sigma_i u_iv_i^T + \\sum_{i=r+1}^{s} \\sigma_i u_iv_i^T \\\\ &\\approx \\sum_{i=1}^r \\sigma_iu_i v_i^T \\end{split}. $$\n", + "So defining $A_r := \\sum_{i=1}^r \\sigma_i u_iv_i^T$, we are approximating $A$ by $A_r$.\n", + "\n", + "In what sense is this a good approximation though? Recall that the Frobenius norm of a matrix $A$ is defined as the sqrt root of the sum of the squares of all the entries:\n", + "$$ \\|A\\|_F = \\sqrt{\\sum_{i,j} a_{ij}^2}. $$\n", + "The Frobenius norm acts as a very nice generalization of the $L^2$ norm for vectors, and is an indispensable tool in both linear algebra and data science. The point is that this \"approximation\" above actually works in the Frobenius norm, and this reduced singular value decomposition in fact minimizes the error.\n", + "\n", + "> **Theorem** (Eckart–Young–Mirsky). Let $A$ be an $n \\times p$ matrix of rank $r$. For $k \\leq r$,\n", + "> $$ \\min_{B \\text{ such that rank}(B) \\leq k} \\|A - B\\|_F = \\|A - A_k\\|_F. $$\n", + "> The (at most) rank $k$ matrix $A_k$ also realizes the minimum when optimizing for the operator norm.\n", + "\n", + "> **Example**. Recall that we have the following SVD:\n", + "> $$ \\begin{bmatrix} 3 & 2 & 2 \\\\ 2 & 3 & -2 \\end{bmatrix} = \\begin{bmatrix} \\frac{1}{\\sqrt{2}} & \\frac{1}{\\sqrt{2}} \\\\ \\frac{1}{\\sqrt{2}} & -\\frac{1}{\\sqrt{2}} \\end{bmatrix} \\begin{bmatrix} 5 & 0 & 0 \\\\ 0 & 3 & 0 \\end{bmatrix} \\begin{bmatrix} \\frac{1}{\\sqrt{2}} & \\frac{1}{3\\sqrt{2}} & -\\frac{2}{3} \\\\ \\frac{1}{\\sqrt{2}} & -\\frac{1}{3\\sqrt{2}} & \\frac{2}{3} \\\\ 0 & \\frac{4}{3\\sqrt{2}} & \\frac{1}{3} \\end{bmatrix}^T. $$\n", + "> So if we want a rank-one approximation for the matrix, we'll do the reduced SVD. We have\n", + "> $$ \\begin{split} A_1 &= \\sigma_1u_1v_1^T \\\\ &= 5\\begin{bmatrix} \\frac{1}{\\sqrt{2}} \\\\ \\frac{1}{\\sqrt{2}} \\end{bmatrix}\\begin{bmatrix} \\frac{1}{\\sqrt{2}} & \\frac{1}{\\sqrt{2}} & 0 \\end{bmatrix} \\\\ &= \\begin{bmatrix} \\frac{5}{2} & \\frac{5}{2} & 0 \\\\ \\frac{5}{2} & \\frac{5}{2} & 0 \\end{bmatrix} \\end{split}$$\n", + "> Now let's compute the (square of the) Frobenius norm of the difference $A - A_1$. We have\n", + "> $$ \\begin{split} \\|A - A_1\\|_F^2 &= \\left\\| \\begin{bmatrix} \\frac{1}{2} & -\\frac{1}{2} & 2 \\\\ -\\frac{1}{2} & \\frac{1}{2} & -2 \\end{bmatrix}\\right\\|_F^2 \\\\ &= 4(\\frac{1}{2})^2 + 2(2^2) = 9. \\end{split} $$\n", + "> So the Frobenius distance between $A$ and $A_1$ is 3, and we know by Eckart-Young-Mirsky that this is the smallest we can get when looking at the difference between $A$ and a (at most) rank one $2 \\times 3$ matrix. As mentioned, the operator norm $\\|A - A_1\\|$ also minimizes the distance (in operator norm). We know this to be the largest singular value. As $A - A_1$ has SVD\n", + "> $$ \\begin{bmatrix} \\frac{1}{2} & -\\frac{1}{2} & 2 \\\\ -\\frac{1}{2} & \\frac{1}{2} & -2 \\end{bmatrix} = \\begin{bmatrix} -\\frac{1}{\\sqrt{2}} & \\frac{1}{\\sqrt{2}} \\\\ \\frac{1}{\\sqrt{2}} & \\frac{1}{\\sqrt{2}} \\end{bmatrix}\\begin{bmatrix} 3 & 0 & 0 \\\\ 0 & 0 & 0 \\end{bmatrix} \\begin{bmatrix} -\\frac{1}{3\\sqrt{2}} & -\\frac{4}{\\sqrt{17}} & \\frac{1}{3\\sqrt{34}} \\\\ \\frac{1}{3\\sqrt{2}} & 0 & \\frac{1}{3}\\sqrt{\\frac{17}{2}} \\\\ -\\frac{2\\sqrt{2}}{3} & \\frac{1}{\\sqrt{17}} & \\frac{2}{3}\\sqrt{\\frac{2}{17}} \\end{bmatrix}, $$\n", + "> the operator norm is also 3. \n", + "\n", + "Now let's do this in python. We'll set up our matrix as usual, take the SVD, do the truncated construction of $A_1$, and use `numpy.linalg.norm` to look at the norms. \n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "# Create our matrix A\n", + "A = np.array([[3,2,2],[2,3,-2]])\n", + "\n", + "# Take the SVD\n", + "U, S, Vh = np.linalg.svd(A)\n", + "\n", + "# Create our rank-1 approximation\n", + "sigma1 = S[0]\n", + "u1 = U[:, [0]]\t\t#shape (2,2)\n", + "v1T = Vh[[0], :]\t\t#shape (3,3)\n", + "A1 = sigma1 * (u1 @ v1T)\n", + "\n", + "# Take norms and view errors\n", + "frobenius_error = np.linalg.norm(A - A1, ord=\"fro\")\t#Frobenius norm\n", + "operator_error = np.linalg.norm(A - A1, ord=2)\t\t#operator norm\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "Let's see if we get what we expect.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "799ea5da", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "np.float64(4.999999999999999)" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sigma1" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "e17ad031", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[-0.70710678],\n", + " [-0.70710678]])" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "u1" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "b75d1b41", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[-7.07106781e-01, -7.07106781e-01, -6.47932334e-17]])" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "v1T" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "cda3bc1a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[2.50000000e+00, 2.50000000e+00, 2.29078674e-16],\n", + " [2.50000000e+00, 2.50000000e+00, 2.29078674e-16]])" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A1" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "5741dc92", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "np.float64(3.0)" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "frobenius_error" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "b1171244", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "np.float64(3.0)" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "operator_error" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "So this numerically confirms the EYM theorem. \n", + "\n", + "## Centering data \n", + "In data science, we rarely apply low-rank approximation to raw values directly, because translation and units can dominate the geometry. Instead, we apply these methods to centered (and often standardized) data so that low-rank structure reflects relationships among features rather than the absolute location or measurement scale. Centering converts the problem from approximating an affine cloud to approximating a linear one, in direct analogy with including an intercept term in linear regression. Therefore, before we can analyze the variance structure, we must ensure our data is centered, i.e., that each feature has a mean of 0. We achieve this by subtracting the mean of each column from every entry in that column.\n", + "Suppose $X$ is our $n \\times p$ data matrix, and let\n", + "$$ \\mu = \\frac{1}{n}\\mathbb{1}^T X. $$\n", + "Then\n", + "$$ \\hat{X} = X - \\mu \\mathbb{1} $$\n", + "will be centered data matrix.\n", + "\n", + "> **Example**. Going back to our housing example, the means of the columns are 1770, 164, 3.2, and 547, respectively. So our centered matrix is\n", + "> $$ \\hat{X} = \\begin{bmatrix} -170 & -16 & -0.2 & -47 \\\\ 330 & 31 & 0.8 & 103 \\\\ -220 & -20 & -1.2 & -72 \\\\ -170 & -16 & -0.2 & -57 \\\\ 230 & 21 & 0.8 & 73 \\end{bmatrix}. $$\n", + "\n", + "Let's do this in python.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "\n", + "# First let us make a dictionary incorporating our data.\n", + "# Each entry corresponds to a column (feature of our data)\n", + "data = {\n", + " 'Square ft': [1600, 2100, 1550, 1600, 2000],\n", + "\t'Square m': [148, 195, 144, 148, 185],\n", + " 'Bedrooms': [3, 4, 2, 3, 4],\n", + " 'Price': [500, 650, 475, 490, 620]\n", + "}\n", + "\n", + "# Create a pandas DataFrame\n", + "df = pd.DataFrame(data)\n", + "\n", + "# Create out matrix X\n", + "X = df.to_numpy()\n", + "\n", + "# Get our vector of means\n", + "X_means = np.mean(X, axis=0)\n", + "\n", + "# Create our centered matrix\n", + "X_centered = X - X_means\n", + "\n", + "# Get the SVD for X_centered\n", + "U, S, Vh = np.linalg.svd(X_centered)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "This returns the following.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "4288abb2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([1770. , 164. , 3.2, 547. ])" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_means" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "31c2ebf2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[-1.70e+02, -1.60e+01, -2.00e-01, -4.70e+01],\n", + " [ 3.30e+02, 3.10e+01, 8.00e-01, 1.03e+02],\n", + " [-2.20e+02, -2.00e+01, -1.20e+00, -7.20e+01],\n", + " [-1.70e+02, -1.60e+01, -2.00e-01, -5.70e+01],\n", + " [ 2.30e+02, 2.10e+01, 8.00e-01, 7.30e+01]])" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_centered" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "We will apply the low-rank approximations from the previous sections. First let's see what our SVD looks like, and what the condition number is.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "d944d257", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "U = [[-0.32486018 -0.81524197 -0.01735449 -0.17188722 0.4472136 ]\n", + " [ 0.63705869 0.10707263 -0.3450375 -0.51345964 0.4472136 ]\n", + " [-0.42643013 0.35553416 -0.61058318 0.34487822 0.4472136 ]\n", + " [-0.33034709 0.436448 0.61781883 -0.3445052 0.4472136 ]\n", + " [ 0.44457871 -0.08381281 0.35515633 0.68497384 0.4472136 ]]\n", + "\n", + "S = [5.44828440e+02 7.61035608e+00 8.91429037e-01 2.41987799e-01]\n", + "\n", + "Vh.T = [[ 0.95017495 0.29361033 0.08182661 0.06530651]\n", + " [ 0.08827897 0.06690917 -0.71081981 -0.69459714]\n", + " [ 0.00276797 -0.04366082 0.69629997 -0.71641638]\n", + " [ 0.29894268 -0.95258064 -0.05662119 0.00417714]]\n", + "\n", + "Condition number of X_centered = 2251.4707027583063\n" + ] + } + ], + "source": [ + "print(f\"U = {U}\\n\\nS = {S}\\n\\nVh.T = {Vh.T}\\n\")\n", + "print(\"Condition number of X_centered = \", np.linalg.cond(X_centered))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "Now let's approximate our centered matrix $\\hat{X}$ by some lower-rank matrices. First, we'll define a function which will give us a rank $k$ truncated SVD. \n" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "# Defining the truncated svd\n", + "def reduced_svd_matrix_k(U, S, Vh, k):\n", + "\tUk = U[:, :k]\n", + "\tSk = np.diag(S[:k])\n", + "\tVhk = Vh[:k, :]\n", + "\treturn Uk @ Sk @ Vhk\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "Now, as $\\hat{X}$ has rank 4, we can do a reduced matrix of rank 1,2,3. We will do this in a loop.\n", + "\n", + "> **Remark**. We'll divide the error by the (Frobenius) norm so that we have a relative error. E.g., if two houses are within 10k of each other, they are similarly priced. The magnitude of error being large doesn't say much if our quantities are large.\n", + "> \n" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[-168.1743765 -15.62476472 -0.48991109 -52.91078079]\n", + " [ 329.79403078 30.64054254 0.96072753 103.7593243 ]\n", + " [-220.7553464 -20.50996365 -0.64308544 -69.45373002]\n", + " [-171.01485494 -15.88866823 -0.49818573 -53.80444804]\n", + " [ 230.15054706 21.38285405 0.67045472 72.40963456]] \n", + " k=1: relative Frobenius reconstruction error on centered data = 0.0141 \n", + "\n", + "[[-1.69996018e+02 -1.60398881e+01 -2.19027093e-01 -4.70007022e+01]\n", + " [ 3.30033282e+02 3.06950642e+01 9.25150039e-01 1.02983104e+02]\n", + " [-2.19960913e+02 -2.03289247e+01 -7.61220318e-01 -7.20311670e+01]\n", + " [-1.70039621e+02 -1.56664278e+01 -6.43206200e-01 -5.69684681e+01]\n", + " [ 2.29963269e+02 2.13401763e+01 6.98303572e-01 7.30172337e+01]] \n", + " k=2: relative Frobenius reconstruction error on centered data = 0.0017 \n", + "\n", + "[[-1.69997284e+02 -1.60288915e+01 -2.29799059e-01 -4.69998263e+01]\n", + " [ 3.30008114e+02 3.09136956e+01 7.10984571e-01 1.03000519e+02]\n", + " [-2.20005450e+02 -1.99420315e+01 -1.14021052e+00 -7.20003486e+01]\n", + " [-1.69994556e+02 -1.60579058e+01 -2.59724807e-01 -5.69996518e+01]\n", + " [ 2.29989175e+02 2.11151332e+01 9.18749820e-01 7.29993076e+01]] \n", + " k=3: relative Frobenius reconstruction error on centered data = 0.0004 \n", + "\n" + ] + } + ], + "source": [ + "for k in [1, 2, 3]:\n", + "\t# Define our reduced matrix\n", + " Xck = reduced_svd_matrix_k(U, S, Vh, k)\n", + "\t# Compute the relative error\n", + " rel_err = np.linalg.norm(X_centered - Xck, ord=\"fro\") / np.linalg.norm(X_centered, ord=\"fro\")\n", + "\t# Print the information\n", + " print(Xck, \"\\n\", f\"k={k}: relative Frobenius reconstruction error on centered data = {rel_err:.4f}\", \"\\n\")\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "This seems to check out -- it says that one rank (or one feature) should be roughly enough to describe this data. This should make sense because clearly the square meterage, # of bedrooms, and price depend on the square footage. \n", + "\n" + ] + } + ], + "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.14.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/05_svd_image_denoising.ipynb b/notebooks/05_svd_image_denoising.ipynb new file mode 100644 index 0000000..c1dc5ab --- /dev/null +++ b/notebooks/05_svd_image_denoising.ipynb @@ -0,0 +1,473 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "6ae6c7f8", + "metadata": {}, + "source": [ + "# Spectral Image Denoising via Truncated SVD\n", + "\n", + "This notebook extracts the image denoising project into a standalone workflow and extends it from **grayscale images** to **actual color images**.\n", + "\n", + "The core idea is the same as in the original write-up: if an image matrix has singular value decomposition\n", + "$$\n", + "A = U \\Sigma V^T,\n", + "$$\n", + "then the best rank-$k$ approximation to $A$ in Frobenius norm is obtained by truncating the SVD. This is the **Eckart–Young–Mirsky theorem**.\n", + "\n", + "For a grayscale image, the image is a single matrix. For an RGB image, we treat the image as **three matrices**, one for each channel, and apply truncated SVD to each channel separately." + ] + }, + { + "cell_type": "markdown", + "id": "31a665c9", + "metadata": {}, + "source": [ + "## Outline\n", + "\n", + "1. Load an image from disk\n", + "2. Convert it to grayscale or keep it in RGB\n", + "3. Add synthetic Gaussian noise\n", + "4. Compute a truncated SVD reconstruction\n", + "5. Compare the original, noisy, and denoised images\n", + "6. Measure quality using MSE and PSNR\n", + "\n", + "This notebook is written so that you can use **your own image files** directly." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "88584c56", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from PIL import Image\n", + "from pathlib import Path" + ] + }, + { + "cell_type": "markdown", + "id": "30e96441", + "metadata": {}, + "source": [ + "## A note on color images\n", + "\n", + "For a grayscale image, SVD applies directly to a single matrix. For a color image $A \\in \\mathbb{R}^{n \\times p \\times 3}$, we write\n", + "$$\n", + "A = (A_R, A_G, A_B),\n", + "$$\n", + "where each channel is an $n \\times p$ matrix. We then compute a rank-$k$ approximation for each channel:\n", + "$$\n", + "A_R \\approx (A_R)_k,\\qquad\n", + "A_G \\approx (A_G)_k,\\qquad\n", + "A_B \\approx (A_B)_k,\n", + "$$\n", + "and stack them back together.\n", + "\n", + "This is the most direct extension of the grayscale method, and it works well as a first linear-algebraic treatment of color denoising." + ] + }, + { + "cell_type": "markdown", + "id": "f275cbc9", + "metadata": {}, + "source": [ + "## Helper functions\n", + "\n", + "We begin with some utilities for:\n", + "- loading images,\n", + "- adding Gaussian noise,\n", + "- reconstructing rank-$k$ approximations,\n", + "- computing image-quality metrics." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "21adfcaf", + "metadata": {}, + "outputs": [], + "source": [ + "def load_image(path, mode=\"rgb\"):\n", + " \"\"\"\n", + " Load an image from disk.\n", + "\n", + " Parameters\n", + " ----------\n", + " path : str or Path\n", + " Path to the image file.\n", + " mode : {\"rgb\", \"gray\"}\n", + " Whether to load the image as RGB or grayscale.\n", + "\n", + " Returns\n", + " -------\n", + " np.ndarray\n", + " Float image array scaled to [0, 255].\n", + " Shape is (H, W, 3) for RGB and (H, W) for grayscale.\n", + " \"\"\"\n", + " path = Path(path)\n", + " img = Image.open(path)\n", + "\n", + " if mode.lower() in {\"gray\", \"grayscale\", \"l\"}:\n", + " img = img.convert(\"L\")\n", + " else:\n", + " img = img.convert(\"RGB\")\n", + "\n", + " return np.asarray(img, dtype=np.float64)\n", + "\n", + "\n", + "def show_image(img, title=None):\n", + " \"\"\"Display a grayscale or RGB image.\"\"\"\n", + " plt.figure(figsize=(6, 6))\n", + " if img.ndim == 2:\n", + " plt.imshow(np.clip(img, 0, 255), cmap=\"gray\", vmin=0, vmax=255)\n", + " else:\n", + " plt.imshow(np.clip(img, 0, 255).astype(np.uint8))\n", + " if title is not None:\n", + " plt.title(title)\n", + " plt.axis(\"off\")\n", + " plt.show()\n", + "\n", + "\n", + "def add_gaussian_noise(img, sigma=25, seed=0):\n", + " \"\"\"\n", + " Add Gaussian noise to an image.\n", + "\n", + " Parameters\n", + " ----------\n", + " img : np.ndarray\n", + " Image array in [0, 255].\n", + " sigma : float\n", + " Standard deviation of the noise.\n", + " seed : int\n", + " Random seed for reproducibility.\n", + "\n", + " Returns\n", + " -------\n", + " np.ndarray\n", + " Noisy image clipped to [0, 255].\n", + " \"\"\"\n", + " rng = np.random.default_rng(seed)\n", + " noisy = img + rng.normal(loc=0.0, scale=sigma, size=img.shape)\n", + " return np.clip(noisy, 0, 255)\n", + "\n", + "\n", + "def truncated_svd_matrix(A, k):\n", + " \"\"\"\n", + " Return the rank-k truncated SVD approximation of a 2D matrix A.\n", + " \"\"\"\n", + " U, s, Vt = np.linalg.svd(A, full_matrices=False)\n", + " k = min(k, len(s))\n", + " return (U[:, :k] * s[:k]) @ Vt[:k, :]\n", + "\n", + "\n", + "def truncated_svd_image(img, k):\n", + " \"\"\"\n", + " Apply truncated SVD to a grayscale or RGB image.\n", + "\n", + " For RGB images, truncated SVD is applied channel-by-channel.\n", + "\n", + " Parameters\n", + " ----------\n", + " img : np.ndarray\n", + " Shape (H, W) for grayscale or (H, W, 3) for RGB.\n", + " k : int\n", + " Truncation rank.\n", + "\n", + " Returns\n", + " -------\n", + " np.ndarray\n", + " Reconstructed image clipped to [0, 255].\n", + " \"\"\"\n", + " if img.ndim == 2:\n", + " recon = truncated_svd_matrix(img, k)\n", + " return np.clip(recon, 0, 255)\n", + "\n", + " if img.ndim == 3:\n", + " channels = []\n", + " for c in range(img.shape[2]):\n", + " channel_recon = truncated_svd_matrix(img[:, :, c], k)\n", + " channels.append(channel_recon)\n", + " recon = np.stack(channels, axis=2)\n", + " return np.clip(recon, 0, 255)\n", + "\n", + " raise ValueError(\"Image must be either 2D (grayscale) or 3D (RGB).\")\n", + "\n", + "\n", + "def mse(A, B):\n", + " \"\"\"Mean squared error between two images.\"\"\"\n", + " return np.mean((A.astype(np.float64) - B.astype(np.float64)) ** 2)\n", + "\n", + "\n", + "def psnr(A, B, max_val=255.0):\n", + " \"\"\"Peak signal-to-noise ratio in decibels.\"\"\"\n", + " err = mse(A, B)\n", + " if err == 0:\n", + " return np.inf\n", + " return 10 * np.log10((max_val ** 2) / err)" + ] + }, + { + "cell_type": "markdown", + "id": "fe1d4932", + "metadata": {}, + "source": [ + "## Choose an image" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "42bafca5", + "metadata": {}, + "outputs": [], + "source": [ + "IMAGE_PATH = \"../images/bella.jpg\" \n", + "MODE = \"rgb\" # use \"gray\" for grayscale, \"rgb\" for color\n", + "\n", + "img = load_image(IMAGE_PATH, mode=MODE)\n", + "print(\"Image shape:\", img.shape)\n", + "show_image(img, title=f\"Original image ({MODE})\")" + ] + }, + { + "cell_type": "markdown", + "id": "05e52222", + "metadata": {}, + "source": [ + "## Add synthetic Gaussian noise\n", + "\n", + "We add noise so that the denoising effect is visible and measurable." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "528e69b3", + "metadata": {}, + "outputs": [], + "source": [ + "sigma = 25\n", + "seed = 0\n", + "\n", + "img_noisy = add_gaussian_noise(img, sigma=sigma, seed=seed)\n", + "\n", + "img_noisy.save('../images/bella_noisy.jpg')\n", + "\n", + "show_image(img_noisy, title=f\"Noisy image (sigma={sigma})\")" + ] + }, + { + "cell_type": "markdown", + "id": "1bbcc1d8", + "metadata": {}, + "source": [ + "## Visualizing rank-$k$ reconstructions\n", + "\n", + "For small $k$, the reconstruction captures only coarse structure.\n", + "As $k$ increases, more detail returns. For denoising, there is often a useful middle ground:\n", + "enough singular values to preserve structure, but not so many that we reintroduce noise." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "563df53a", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import math\n", + "\n", + "ks = [5, 20, 50, 100]\n", + "\n", + "# Collect all images + titles\n", + "images = []\n", + "titles = []\n", + "\n", + "# Original\n", + "images.append(img)\n", + "titles.append(\"Original\")\n", + "\n", + "# Noisy\n", + "images.append(img_noisy)\n", + "titles.append(\"Noisy\")\n", + "\n", + "# Reconstructions\n", + "for k in ks:\n", + " recon = truncated_svd_image(img_noisy, k)\n", + " images.append(recon)\n", + " titles.append(f\"k = {k}\")\n", + "\n", + "# Grid setup\n", + "ncols = 2\n", + "nrows = math.ceil(len(images) / ncols)\n", + "\n", + "fig, axes = plt.subplots(nrows, ncols, figsize=(6 * ncols, 4 * nrows))\n", + "axes = axes.flatten() # easier indexing\n", + "\n", + "# Plot everything\n", + "for i, (ax, im, title) in enumerate(zip(axes, images, titles)):\n", + " if im.ndim == 2:\n", + " ax.imshow(im, cmap=\"gray\", vmin=0, vmax=255)\n", + " else:\n", + " ax.imshow(np.clip(im, 0, 255).astype(np.uint8))\n", + " \n", + " ax.set_title(title)\n", + " ax.axis(\"off\")\n", + "\n", + "# Hide any unused axes\n", + "for j in range(len(images), len(axes)):\n", + " axes[j].axis(\"off\")\n", + "\n", + "plt.tight_layout()\n", + "plt.savefig('../images/bella_truncated_svd_multiplie_ks.png')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "309579fa", + "metadata": {}, + "source": [ + "## Quantitative evaluation\n", + "\n", + "We compare each reconstruction against the **clean original image**, not against the noisy one.\n", + "A good denoising rank should typically:\n", + "- reduce MSE relative to the noisy image,\n", + "- increase PSNR relative to the noisy image." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "56ce07ee", + "metadata": {}, + "outputs": [], + "source": [ + "baseline_mse = mse(img, img_noisy)\n", + "baseline_psnr = psnr(img, img_noisy)\n", + "\n", + "print(f\"Noisy image baseline -> MSE: {baseline_mse:.2f}, PSNR: {baseline_psnr:.2f} dB\")\n", + "\n", + "results = []\n", + "for k in ks:\n", + " recon = truncated_svd_image(img_noisy, k)\n", + " results.append((k, mse(img, recon), psnr(img, recon)))\n", + "\n", + "print(\"\\nRank-k reconstructions:\")\n", + "for k, m, p in results:\n", + " print(f\"k = {k:3d} | MSE = {m:10.2f} | PSNR = {p:6.2f} dB\")" + ] + }, + { + "cell_type": "markdown", + "id": "de9c3f3c", + "metadata": {}, + "source": [ + "## Automatic search over many values of $k$\n", + "\n", + "This is often useful because the best denoising rank is image-dependent." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e097dcf4", + "metadata": {}, + "outputs": [], + "source": [ + "candidate_ks = list(range(1, 151, 5))\n", + "\n", + "scores = []\n", + "for k in candidate_ks:\n", + " recon = truncated_svd_image(img_noisy, k)\n", + " scores.append((k, mse(img, recon), psnr(img, recon)))\n", + "\n", + "best_by_mse = min(scores, key=lambda x: x[1])\n", + "best_by_psnr = max(scores, key=lambda x: x[2])\n", + "\n", + "print(\"Best by MSE :\", best_by_mse)\n", + "print(\"Best by PSNR:\", best_by_psnr)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4b9dc5c7", + "metadata": {}, + "outputs": [], + "source": [ + "best_k = best_by_psnr[0]\n", + "best_recon = truncated_svd_image(img_noisy, best_k)\n", + "\n", + "fig, axes = plt.subplots(1, 3, figsize=(15, 5))\n", + "\n", + "if img.ndim == 2:\n", + " axes[0].imshow(img, cmap=\"gray\", vmin=0, vmax=255)\n", + " axes[1].imshow(img_noisy, cmap=\"gray\", vmin=0, vmax=255)\n", + " axes[2].imshow(best_recon, cmap=\"gray\", vmin=0, vmax=255)\n", + "else:\n", + " axes[0].imshow(np.clip(img, 0, 255).astype(np.uint8))\n", + " axes[1].imshow(np.clip(img_noisy, 0, 255).astype(np.uint8))\n", + " axes[2].imshow(np.clip(best_recon, 0, 255).astype(np.uint8))\n", + "\n", + "axes[0].set_title(\"Original\")\n", + "axes[1].set_title(\"Noisy\")\n", + "axes[2].set_title(f\"Best reconstruction (k={best_k})\")\n", + "\n", + "for ax in axes:\n", + " ax.axis(\"off\")\n", + "\n", + "plt.tight_layout()\n", + "plt.savefig('../images/bella_best_truncated.png')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "1a3acfe5", + "metadata": {}, + "source": [ + "## Remarks and possible extensions\n", + "\n", + "- The same rank $k$ was used for every color channel. You could instead choose different ranks per channel.\n", + "- You can test this on photographs, scanned documents, or screenshots.\n", + "- Truncated SVD is excellent for illustrating low-rank structure, but it is not the only denoising method.\n", + "- A more advanced next step would be to compare SVD denoising against:\n", + " - Gaussian blur,\n", + " - median filtering,\n", + " - wavelet denoising,\n", + " - non-local means,\n", + " - autoencoder-based denoising.\n", + "\n", + "For this notebook, though, the point is to keep the method squarely grounded in linear algebra." + ] + } + ], + "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.14.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/data_science_for_linear_algebraist.ipynb b/notebooks/data_science_for_linear_algebraist.ipynb new file mode 100644 index 0000000..0c114b9 --- /dev/null +++ b/notebooks/data_science_for_linear_algebraist.ipynb @@ -0,0 +1,2861 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "85d077c8", + "metadata": {}, + "source": [ + "The LaTeX does not seem to render properly on GitLab/Github. This repo is mirrored on my gitea server here, where the LaTeX seems to render properly. \n", + "\n", + "# Data Science for the Linear Algebraist. \n", + " \n", + "## Project Overview\n", + "A not-so comprehensive guide bridging linear algebra theory with practical data science implementation. Meant for someone to learn data science by using their strong linear algebra background. \n", + "This project demonstrates how fundamental linear algebra concepts power modern machine learning algorithms, with hands-on Python implementations.\n", + "\n", + "## Main Dependencies\n", + "- **Python 3**\n", + "- **NumPy** - Matrix operations and linear algebra\n", + "- **Pandas** - Data manipulation\n", + "- **Matplotlib** - Visualization\n", + "\n", + "## Key Demonstrations\n", + "1. **Least Squares Regression** - From theory to implementation\n", + "2. **QR Decomposition and SVD** - Numerical stability in solving systems\n", + "3. **PCA** - Dimensionality reduction\n", + "4. **Project** - Applying low-rank approximation (via truncated SVD) to an image of my beautiful dog\n", + "\n", + "## To do\n", + "- [ ] Upload Jupyter notebook\n", + "\n", + "January 2026\n", + "\n", + "---\n", + "\n", + "## Table of Contents\n", + "\n", + "1. [Introduction: The Basic Data Science Problem](#introduction)\n", + "2. [Solving the Problem: Least Squares and Matrix Decompositions](#solving-the-problem-least-squares-regression-and-matrix-decompositions)\n", + "3. [Principal Component Analysis](#principal-component-analysis)\n", + "4. [Project: Spectral Image Denoising via Truncated SVD](#project-spectral-image-denoising-via-truncated-svd)\n", + "5. [Appendix](#appendix)\n", + "6. [Bibliography](#bibliography)\n", + "\n", + "## Introduction\n", + "\n", + "This is meant to be a not entirely comprehensive introduction to Data Science for the Linear Algebraist. There are of course many other complicated topics, but this is just to get the essence of data science (and the tools involved) from the perspective of someone with a strong linear algebra background.\n", + "\n", + "One of the most fundamental questions of data science is the following. \n", + "\n", + "> **Question**: Given observed data, how can we predict certain targets?\n", + "\n", + "The answer of course boils down to linear algebra, and we will begin by translating data science terms and concepts into linear algebraic ones. But first, as should be common practice for the linear algebraist, an example.\n", + "\n", + "> **Example**. Suppose that we observe $n=3$ houses, and for each house we record\n", + "> - the square footage,\n", + "> - the number of bedrooms,\n", + "> - and additionally the sale price.\n", + "> \n", + "> So we have a table as follows.\n", + ">\n", + "> |House | Square ft | Bedrooms | Price (in $1000s) |\n", + "> | --- | --- | --- | --- |\n", + "> | 0 | 1600 | 3 | 500 |\n", + "> | 1 | 2100 | 4 | 650 |\n", + "> | 2 | 1550 | 2 | 475 |\n", + ">\n", + "> So, for example, the first house is 1600 square feet, has 3 bedrooms, and costs $500,000, and so on. Our goal will be to understand the cost of a house in terms of the number of bedrooms as well as the square footage.\n", + "> Concretely this gives us a matrix and a vector:\n", + "> $$ X = \\begin{bmatrix} 1600 & 3 \\\\ 2100 & 4 \\\\ 1550 & 2 \\end{bmatrix} \\text{ and } y =\\begin{bmatrix} 500 \\\\ 650 \\\\ 475 \\end{bmatrix} $$\n", + "> So translating to linear algebra, the goal is to understand how $y$ depends on the columns of $X$.\n", + "\n", + "\n", + "## Translation from Data Science to Linear Algebra\n", + "\n", + "| Data Science (DS) Term | Linear Algebra (LA) Equivalent | Explanation |\n", + "| --- | --- | --- |\n", + "| Dataset (with (n) observations and (p) features) | A matrix $X \\in \\mathbb{R}^{n \\times p}$ | The dataset is just a matrix. Each row is an observation (a vector of features). Each column is a feature (a vector of its values across all observations). |\n", + "| Features | Columns of $X$ | Each feature is a column in your data matrix. |\n", + "| Observation | Rows of $X$ | Each data point corresponds to a row. |\n", + "| Targets | A vector $y \\in \\mathbb{R}^{n \\times 1}$ | The list of all target values is a column vector. |\n", + "| Model parameters | A vector $\\beta \\in \\mathbb{R}^{p \\times 1}$ | These are the unknown coefficients. |\n", + "| Model | Matrix–vector equation | The relationship becomes an equation involving matrices and vectors. |\n", + "| Prediction Error / Residuals | A residual vector $e \\in \\mathbb{R}^{n \\times 1}$ | Difference between actual targets and predictions. |\n", + "| Training / \"best fit\" | Optimization: minimizing the norm of the residual vector | To find the \"best\" model by finding a model which makes the norm of the residual vector as small as possible. |\n", + "\n", + "So our matrix $X$ will represent our data set, our vector $y$ is the target, and $\\beta$ is our vector of parameters. We will often be interested in understanding data with \"intercepts\", i.e., when there is a base value given in our data. So we will augment a column of 1's (denoted by $\\mathbb{1}$) to $X$ and append a parameter $\\beta_0$ to the top of $\\beta$, yielding\n", + "\n", + "$$ \\tilde{X} = \\begin{bmatrix} \\mathbb{1} & X \\end{bmatrix} \\text{ and } \\tilde{\\beta} = \\begin{bmatrix} \\beta_0 \\\\ \\beta_1 \\\\ \\beta_2 \\\\ \\vdots \\\\ \\beta_p \\end{bmatrix}. $$\n", + "\n", + "So the answer to the Data Science problem becomes\n", + "\n", + "> **Answer**: Solve, or best approximate a solution to, the matrix equation $\\tilde{X}\\tilde{\\beta} = y$.\n", + "\n", + "To be explicit, given $\\tilde{X}$ and $y$, we want to find a $\\tilde{\\beta}$ that does a good job of roughly giving $\\tilde{X}\\tilde{\\beta} = y$. There of course ways to solve (or approximate) such small systems by hand. However, one will often be dealing with enormous data sets with plenty to be desired. One view to take is that modern data science is applying numerical linear algebra techniques to imperfect information, all to get as good a solution as possible.\n", + "\n", + "# Solving the problem: Least Squares Regression and Matrix Decompositions\n", + "\n", + "If the system $\\tilde{X}\\tilde{\\beta} = y$ is consistent, then we can find a solution. However, we are often dealing with overdetermined systems, in the sense that there are often more observations than features (i.e., more rows than columns in $\\tilde{X}$, or more equations than unknowns), and therefore inconsistent systems. However, it is possible to find a **best fit** solution, in the sense that the difference\n", + "\n", + "$$ e = y - \\tilde{X}\\tilde{\\beta} $$\n", + "\n", + "is small. By small, we often mean that $e$ is small in $L^2$ norm; i.e., we are minimizing the the sums of the squares of the differences between the components of $y$ and the components of $\\tilde{X}\\tilde{\\beta}$. This is known as a **least squares solution**. Assuming that our data points live in the Euclidean plane, this precisely describes finding a line of best fit.\n", + "\n", + "![line_of_best_fit_generated1.png](./figures/line_of_best_fit_generated1.png)\n", + "\n", + "The structure of this sections is as follows.\n", + "- [Least Squares Solution](#least-squares-solution)\n", + "- [QR Decompositions](#qr-decompositions)\n", + "- [Singular Value Decomposition](#singular-value-decomposition)\n", + "- [A note on other norms](#a-note-on-other-norms)\n", + "- [A note on regularization](#a-note-on-regularization)\n", + "- [A note on solving multiple targets concurrently](#a-note-on-solving-multiple-targets-concurrently)\n", + "- [Polynomial regression](#polynomial-regression)\n", + "- [What can go wrong?](#what-can-go-wrong)\n", + "\n", + "## Least Squares Solution\n", + "\n", + "Recall that the Euclidean distance between two vectors $x = (x_1,\\dots,x_n) ,y = (y_1,\\dots,y_n) \\in \\mathbb{R}^n$ is given by\n", + "\n", + "$$ ||x - y||_2 = \\sqrt{\\sum_{i=1}^n |x_i - y_i|^2}. $$\n", + "\n", + "We will often work with the square of the $L^2$ norm to simplify things (the square function is increasing, so minimizing the square of a non-negative function will also minimize the function itself).\n", + "\n", + "> **Definition**: Let $A$ be an $m \\times n$ matrix and $b \\in \\mathbb{R}^n$. A **least-squares solution** of $Ax = b$ is a vector $x_0 \\in \\mathbb{R}^n$ such that\n", + "> \n", + "> $$ \\|b - Ax_0\\|_2 \\leq \\|b - Ax\\|_2 \\text{ for all } x \\in \\mathbb{R}^n. $$\n", + "\n", + "So a least-squares solution to the equation $Ax = b$ is trying to find a vector $x_0 \\in \\mathbb{R}^n$ which realizes the smallest distance between the vector $b$ and the column space\n", + "$$ \\text{Col}(A) = \\{Ax \\mid x \\in \\mathbb{R}^n\\} $$\n", + "of $A$. We know this to be the projection of the vector $b$ onto the column space. \n", + "\n", + "![projection_of_vector_onto_plane.png](./figures/projection_of_vector_onto_plane.png)\n", + "\n", + "> **Theorem**: The set of least-squares solutions of $Ax = b$ coincides with solutions of the **normal equations** $A^TAx = A^Tb$. Moreover, the normal equations always have a solution.\n", + "\n", + "Let us first see why we get a line of best fit. \n", + "\n", + "> **Example**. Let us show why this describes a line of best fit when we are working with one feature and one target. Suppose that we observe four data points\n", + "> $$ X = \\begin{bmatrix} 1 \\\\ 2 \\\\ 3 \\\\ 4 \\end{bmatrix} \\text{ and } y = \\begin{bmatrix} 1 \\\\ 2\\\\ 2 \\\\ 4 \\end{bmatrix}. $$\n", + "> We want to fit a line $y = \\beta_0 + \\beta_1x$ to these data points. We will have our augmented matrix be\n", + "> $$ \\tilde{X} = \\begin{bmatrix} 1 & 1 \\\\ 1 & 2 \\\\ 1 & 3 \\\\ 1 & 4 \\end{bmatrix}, $$\n", + "> and our parameter be\n", + "> $$ \\tilde{\\beta} = \\begin{bmatrix} \\beta_0 \\\\ \\beta_1 \\end{bmatrix}. $$\n", + "> We have that\n", + "> $$ \\tilde{X}^T\\tilde{X} = \\begin{bmatrix} 4 & 10 \\\\ 10 & 30 \\end{bmatrix} \\text{ and } \\tilde{X}^Ty = \\begin{bmatrix} 9 \\\\ 27 \\end{bmatrix}. $$\n", + "> The 2x2 matrix $\\tilde{X}^T\\tilde{X}$ is easy to invert, and so we get that\n", + "> $$ \\tilde{\\beta} = (\\tilde{X}^T\\tilde{X})^{-1}\\tilde{X}^Ty = \\frac{1}{10}\\begin{bmatrix} 15 & -5 \\\\ -5 & 2 \\end{bmatrix}\\begin{bmatrix} 9 \\\\ 27 \\end{bmatrix} = \\begin{bmatrix} 0 \\\\ \\frac{9}{10} \\end{bmatrix}. $$\n", + "> So our line of best fit is of them form $y = \\frac{9}{10}x$.\n", + "\n", + "Although the above system was small and we could solve the system of equations explicitly, this isn't always feasible. We will generally use python in order to solve large systems. \n", + "- One can find a least-squares solution using `numpy.linalg.lstsq`.\n", + "- We can set up the normal equations and solve the system by using `numpy.linalg.solve`\n", + "Although the first approach simplifies things greatly, and is more or less what we are doing anyway, we will generally set up our problems as we would by hand, and then use `numpy.linalg.solve` to help us find a solution. However, computing $X^TX$ can cause lots of errors, so later we'll see how to get linear systems from QR decompositions and the SVD, and then apply `numpy.lingalg.solve`. \n", + "\n", + "Let's see how to use these for the above example, and see the code to generate the scatter plot and line of best fit. \n", + "Again, our system is the following.\n", + "$$ X = \\begin{bmatrix} 1 \\\\ 2 \\\\ 3 \\\\ 4 \\end{bmatrix} \\text{ and } y = \\begin{bmatrix} 1 \\\\ 2\\\\ 2 \\\\ 4 \\end{bmatrix}. $$\n", + "We will do what we did above, but use python instead." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2939b6d1", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "# Define the matrix X and vector y\n", + "X = np.array([[1], [2], [3], [4]])\n", + "y = np.array([[1], [2], [2], [4]])\n", + "\n", + "# Augment X with a column of 1's (intercept)\n", + "X_aug = np.hstack((np.ones((X.shape[0], 1)), X))\n", + "\n", + "# Solve the normal equations\n", + "beta = np.linalg.solve(X_aug.T @ X_aug, X_aug.T @ y)" + ] + }, + { + "cell_type": "markdown", + "id": "9b843368", + "metadata": {}, + "source": [ + "And what is the result?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "53f67eaa", + "metadata": {}, + "outputs": [], + "source": [ + ">>> beta\n", + "array([[-1.0658141e-15],\n", + " [ 9.0000000e-01]])" + ] + }, + { + "cell_type": "markdown", + "id": "a8e4f004", + "metadata": {}, + "source": [ + "This agrees with our by-hand computation: the intercept is tiny, so it is virtually zero, and we get 9/10 as our slope. Let's plot it. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1508fb3d", + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "b, m = beta #beta[0] will be the intercept and beta[1] will be the slope\n", + "_ = plt.plot(X, y, 'o', label='Original data', markersize=10)\n", + "_ = plt.plot(X, m*X + b, 'r', label='Line of best fit')\n", + "_ = plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "283f1dbd", + "metadata": {}, + "source": [ + "![line_of_best_fit_easy_example.png](./figures/line_of_best_fit_easy_example.png)\n", + "\n", + "What about `numpy.linalg.lstsq`? Is it any different?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "87b9e3e7", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "# Define the matrix X and vector y\n", + "X = np.array([[1], [2], [3], [4]])\n", + "y = np.array([[1], [2], [2], [4]])\n", + "\n", + "# Augment X with a column of 1's (intercept)\n", + "X_aug = np.hstack((np.ones((X.shape[0], 1)), X))\n", + "\n", + "# Solve the least squares equation with matrix X_aug and target y\n", + "beta = np.linalg.lstsq(X_aug,y)[0]" + ] + }, + { + "cell_type": "markdown", + "id": "7825e278", + "metadata": {}, + "source": [ + "We then get" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "094f7720", + "metadata": {}, + "outputs": [], + "source": [ + ">>> beta\n", + "array([[6.16291085e-16],\n", + " [9.00000000e-01]])" + ] + }, + { + "cell_type": "markdown", + "id": "23e433e7", + "metadata": {}, + "source": [ + "So it is a little different -- and, in fact, closer to our exact answer (the intercept is zero). This makes sense -- `numpy.linalg.lstsq` won't directly compute $X^TX$, which, again, can cause quite a few issues. \n", + "\n", + "---\n", + "\n", + "Now going to our initial example. \n", + "\n", + "> **Example**: Let us work with the example from above. We augment the matrix with a column of 1's to include an intercept term:\n", + "> $$ \\tilde{X} = \\begin{bmatrix} 1 & 1600 & 3 \\\\ 1 & 2100 & 4 \\\\ 1 & 1550 & 2 \\end{bmatrix}. $$\n", + "> Let us solve the normal equations\n", + "> $$ \\tilde{X}^T\\tilde{X}\\tilde{\\beta} = \\tilde{X}^Ty. $$\n", + "> We have\n", + "> $$ \\tilde{X}^T\\tilde{X} = \\begin{bmatrix} 3 & 5250 & 9 \\\\ 5250 & 9372500 & 16300 \\\\ 9 & 16300 & 29\\end{bmatrix} \\text{ and } \\tilde{X}^Ty = \\begin{bmatrix} 1625 \\\\ 2901500 \\\\ 5050 \\end{bmatrix} $$\n", + "> Solving this system of equations yields the parameter vector $\\tilde{\\beta}$. In this case, we have\n", + "> $$ \\tilde{\\beta} = \\begin{bmatrix} \\frac{200}{9} \\\\ \\frac{5}{18} \\\\ \\frac{100}{9} \\end{bmatrix}. $$\n", + "> When we apply $\\tilde{X}$ to $\\tilde{\\beta}$, we get\n", + "> $$ \\tilde{X}\\tilde{\\beta} = \\begin{bmatrix} 500 \\\\ 650 \\\\ 475 \\end{bmatrix}, $$\n", + "> which is our target on the nose. This means that we can expect, based on our data, that the cost of a house will be\n", + "> $$ \\frac{200}{9} + \\frac{5}{18}(\\text{square footage}) + \\frac{100}{9}(\\text{\\# of bedrooms})$$\n", + "\n", + "In the above, we actually had a consistent system to begin with, so our least-squares solution gave our prediction honestly. What happens if we have an inconsistent system?\n", + "\n", + "> **Example**: Let us add two more observations, say our data is now the following. \n", + "> |House | Square ft | Bedrooms | Price (in $1000s) |\n", + "> | --- | --- | --- | --- |\n", + "> | 0 | 1600 | 3 | 500 |\n", + "> | 1 | 2100 | 4 | 650 |\n", + "> | 2 | 1550 | 2 | 475 |\n", + "> | 3 | 1600 | 3 | 490 |\n", + "> | 4 | 2000 | 4 | 620 |\n", + "> \n", + "> So setting up our system, we want a least-square solution to the matrix equation\n", + "> $$ \\begin{bmatrix} 1 & 1600 & 3 \\\\ 1 & 2100 & 4 \\\\ 1 & 1550 & 2 \\\\ 1 & 1600 & 3 \\\\ 1 & 2000 & 4 \\end{bmatrix}\\tilde{\\beta} = \\begin{bmatrix} 500 \\\\ 650 \\\\ 475 \\\\ 490 \\\\ 620 \\end{bmatrix}. $$\n", + "> Note that the system is inconsistent (the 1st and 4th rows agree in $\\tilde{X}$, but they have different costs). Writing the normal equations we have\n", + "> $$ \\tilde{X}^T\\tilde{X} = \\begin{bmatrix} 5 & 8850 & 16 \\\\ 8850 & 15932500 & 29100 \\\\ 16 & 29100 & 54 \\end{bmatrix} \\text{ and } \\tilde{X}y = \\begin{bmatrix} 2735 \\\\ 4 925 250 \\\\ 9000 \\end{bmatrix}. $$\n", + "> Solving this linear system yields\n", + "> $$ \\tilde{\\beta} = \\begin{bmatrix} 0 \\\\ \\frac{3}{10} \\\\ 5 \\end{bmatrix}. $$\n", + "> This is a vastly different answer! Applying $\\tilde{X}$ to it yields\n", + "> $$ \\tilde{X}\\tilde{\\beta} = \\begin{bmatrix} 495 \\\\ 650 \\\\ 475 \\\\ 495 \\\\ 620 \\end{bmatrix}. $$\n", + "> Note that the error here is\n", + "> $$ y - \\tilde{X}\\tilde{\\beta} = \\begin{bmatrix} 5 \\\\ 0 \\\\ 0 \\\\ -5 \\\\ 0 \\end{bmatrix}, $$\n", + "> which has squared $L^2$ norm\n", + "> $$ \\|y - \\tilde{X}\\tilde{\\beta}\\|_2^2 = 25 + 25 = 50. $$\n", + "> So this says that, given our data, we can roughly estimate the cost of a house, within 50k or so, to be\n", + "> $$ \\approx \\frac{3}{10}(\\text{square footage}) + 5(\\text{\\# of bedrooms}). $$\n", + "In practice, our data sets can be gigantic, and so there is absolutely no hope of doing computations by hand. It is nice to know that theoretically we can do things like this though. \n", + "\n", + "> **Theorem**: Let $A$ be an $m \\times n$ matrix and $b \\in \\mathbb{R}^n$. The following are equivalent.\n", + "> \n", + "> 1. The equation $Ax = b$ has a unique least-squares solution for each $b \\in \\mathbb{R}^n$.\n", + "> 2. The columns of $A$ are linearly independent. \n", + "> 3. The matrix $A^TA$ is invertible.\n", + "\n", + "In this case, the unique solution to the normal equations $A^TAx = A^Tb$ is\n", + "\n", + "$$ x_0 = (A^TA)^{-1}A^Tb. $$\n", + "\n", + "Computing $\\tilde{X}^T\\tilde{X}$ or taking inverses are very computationally intensive tasks, and it is best to avoid doing these. Moreover, as we'll see in an example later, if we do a numerical calculation we can get close to zero and then divide where we shouldn't be, blowing up our final result. One way to get around this is to use QR decompositions of matrices. \n", + "\n", + "Now let's use python to visualize the above data and then solve for the least-squares solution. We'll use `pandas` in order to think about this data. We note that `pandas` incorporates `matplotlib` under the hood already, so there are some simplifications that can be made." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bd12ae6f", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# First let us make a dictionary incorporating our data.\n", + "# Each entry corresponds to a column (feature of our data)\n", + "data = {\n", + "\t'Square ft': [1600, 2100, 1550, 1600, 2000],\n", + "\t'Bedrooms': [3, 4, 2, 3, 4],\n", + "\t'Price': [500, 650, 475, 490, 620]\n", + "}\n", + "\n", + "# Create a pandas DataFrame\n", + "df = pd.DataFrame(data)" + ] + }, + { + "cell_type": "markdown", + "id": "c22de4b1", + "metadata": {}, + "source": [ + "Let's see how python formats this `DataFrame`. It will turn it into essentially the table we had at the beginning. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "943be5aa", + "metadata": {}, + "outputs": [], + "source": [ + ">>> df\n", + " Square ft Bedrooms Price\n", + "0 1600 3 500\n", + "1 2100 4 650\n", + "2 1550 2 475\n", + "3 1600 3 490\n", + "4 2000 4 620" + ] + }, + { + "cell_type": "markdown", + "id": "cb634d2a", + "metadata": {}, + "source": [ + "So what can we do with DataFrames? First let's use `pandas.DataFrame.describe` to see some basic statistics about our data." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a9c48b50", + "metadata": {}, + "outputs": [], + "source": [ + ">>> df.describe()\n", + " Square ft Bedrooms Price\n", + "count 5.000000 5.00000 5.000000\n", + "mean 1770.000000 3.20000 547.000000\n", + "std 258.843582 0.83666 81.516869\n", + "min 1550.000000 2.00000 475.000000\n", + "25% 1600.000000 3.00000 490.000000\n", + "50% 1600.000000 3.00000 500.000000\n", + "75% 2000.000000 4.00000 620.000000\n", + "max 2100.000000 4.00000 650.000000" + ] + }, + { + "cell_type": "markdown", + "id": "1df2ae92", + "metadata": {}, + "source": [ + "This gives use the mean, the standard deviation, the min, the max, as well as some other things. We get an immediate sense of scale from our data. We can also examine the pairwise correlation of all the columns by using `pandas.DataFrame.corr`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "74871f2f", + "metadata": {}, + "outputs": [], + "source": [ + ">>> df[[\"Square ft\", \"Bedrooms\", \"Price\"]].corr()\n", + " Square ft Bedrooms Price\n", + "Square ft 1.000000 0.900426 0.998810\n", + "Bedrooms 0.900426 1.000000 0.909066\n", + "Price 0.998810 0.909066 1.000000" + ] + }, + { + "cell_type": "markdown", + "id": "119e7cbd", + "metadata": {}, + "source": [ + "It is clear that each of the three are correlated. This makes sense, as the number of bedrooms should be increasing with the square feet. Same with the price. We'll discuss in the next section when we look at Principal Component Analysis. \n", + "\n", + "We can also graph our data; for example, we could create some scatter plots, one for `Square ft` vs `Price` and on for `Bedrooms` vs `Price`. We can also do a grouped bar chart. Let's start with the scatter plots. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "763bb12f", + "metadata": {}, + "outputs": [], + "source": [ + "# Scatter plot for Price vs Square ft\n", + "df.plot(\n", + "\tkind=\"scatter\",\n", + "\tx=\"Square ft\",\n", + "\ty=\"Price\",\n", + "\ttitle=\"House Price vs Square footage\"\n", + ")\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "37646296", + "metadata": {}, + "outputs": [], + "source": [ + "# Scatter plot for Price vs Bedrooms\n", + "df.plot(\n", + "\tkind=\"scatter\",\n", + "\tx=\"Bedrooms\",\n", + "\ty=\"Price\",\n", + "\ttitle=\"House Price vs Bedrooms\"\n", + ")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "194ce553", + "metadata": {}, + "source": [ + "![house_price_vs_square_ft.png](./figures/house_price_vs_square_ft.png)\n", + "\n", + "![house_price_vs_bedrooms.png](./figures/house_price_vs_bedrooms.png)\n", + "\n", + "We can even do square footage vs bedrooms. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "db5cb9ea", + "metadata": {}, + "outputs": [], + "source": [ + "# Scatter plot for Bedrooms vs Square ft\n", + "df.plot(\n", + "\tkind=\"scatter\",\n", + "\tx=\"Square ft\",\n", + "\ty=\"Bedrooms\",\n", + "\ttitle=\"Bedrooms vs Square footage\"\n", + ")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "33f03059", + "metadata": {}, + "source": [ + "![bedrooms_vs_square_footage.png](./figures/bedrooms_vs_square_footage.png)\n", + "\n", + "Of course, these figures are somewhat meaningless due to how unpopulated our data is.\n", + "\n", + "Now let's get our matrices and linear systems set up with `pandas.DataFrame.to_numpy`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "53f89be5", + "metadata": {}, + "outputs": [], + "source": [ + "# Create our matrix X and our target y\n", + "X = df[[\"Square ft\", \"Bedrooms\"]].to_numpy()\n", + "y = df[[\"Price\"]].to_numpy()\n", + "\n", + "# Augment X with a column of 1's (intercept)\n", + "X_aug = np.hstack((np.ones((X.shape[0], 1)), X))\n", + "\n", + "# Solve the least-squares problem\n", + "beta = np.linalg.lstsq(X_aug,y)[0]" + ] + }, + { + "cell_type": "markdown", + "id": "952ef02b", + "metadata": {}, + "source": [ + "This yields" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "79f4edfa", + "metadata": {}, + "outputs": [], + "source": [ + ">>> beta\n", + "array([[4.0098513e-13],\n", + " [3.0000000e-01],\n", + " [5.0000000e+00]])" + ] + }, + { + "cell_type": "markdown", + "id": "0bed0cea", + "metadata": {}, + "source": [ + "As the first parameter is basically 0, we are left with the second being 3/10 and the third being 5, just like our exact solution. Next, we will look at matrix decompositions and how they can help us find least-squares solutions. \n", + "\n", + "## QR Decompositions\n", + "\n", + "QR decompositions are a powerful tool in linear algebra and data science for several reasons. They provide a way to decompose a matrix into an orthogonal matrix $Q$ aand an upper triangular matrix $R$, which can simplify many computations and analyses.\n", + "\n", + "> **Theorem**: Let $A$ is an $m \\times n$ matrix with linearly independent columns ($m \\geq n$ in this case), then $A$ can be decomposed as $A = QR$ where $Q$ is an $m \\times n$ matrix whose columns form an orthonormal basis for Col($A$) and $R$ is an $n \\times n$ upper-triangular invertible matrix with positive entries on the diagonal.\n", + "\n", + "In the literature, sometimes the QR decomposition is phrased as follows: any $m \\times n$ matrix $A$ can also be written as $A = QR$ where $Q$ is an $m \\times m$ orthogonal matrix ($Q^T = Q^{-1}$), and $R$ is an $m \\times n$ upper-triangular matrix. One follows from the other by playing around with some matrix equations. Indeed, suppose that $A = Q_1R_1$ is a decomposition as above (that is, $Q_1$ is $m \\times n$ and $R_1$ is $n \\times n$). Use can use the Gram-Schmidt procedure to extend the columns of $Q_1$ to an orthonormal basis for all of $\\mathbb{R}^m$, and put the remaining vectors in a $(m - n) \\times n$ matrix $Q_2$. Then\n", + "\n", + "$$ A = Q_1R_1 = \\begin{bmatrix} Q_1 & Q_2 \\end{bmatrix}\\begin{bmatrix} R_1 \\\\ 0 \\end{bmatrix}. $$\n", + "\n", + "The left matrix is an $m \\times m$ orthogonal matrix and the right matrix is $m \\times n$ upper triangular. Moreover, the decomposition provides orthonormal bases for both the column space of $A$ and the perp of the column space of $A$; $Q_1$ will consist of an orthonormal basis for the column space of $A$ and $Q_2$ will consist of an orthonormal basis for the perp of the column space of $A$. \n", + "\n", + "However, we will often want to use the decomposition when $Q$ is $m \\times n$, $R$ is $n \\times n$, and the columns of $Q$ form an orthonormal basis for the column space of $A$. For example, the python function `numpy.linalg.qr` give QR decompositions this way (again, assuming that the columns of $A$ are linearly independent, so $m \\geq n$).\n", + "\n", + "> **Key take-away**. The QR decomposition provides an orthonormal basis for the column space of $A$. If $A$ has rank $k$, then the first $k$ columns of $Q$ will form a basis for the column space of $A$. \n", + "\n", + "For small matrices, one can find $Q$ and $R$ by hand, assuming that $A = [ a_1\\ \\cdots\\ a_n ]$ has full column rank. Let $e_1,\\dots,e_n$ be the unnormalized vectors we get when we apply Gram-Schmidt to $c_1,\\dots,c_n$, and let $u_1,\\dots,u_n$ be their normalizations. Let\n", + "$$ r_j = \\begin{bmatrix} \\langle e_1,c_j \\rangle \\\\ \\vdots \\\\ \\langle e_n, c_j \\rangle \\end{bmatrix}, $$\n", + "and note that $\\langle e_i,c_j \\rangle = 0$ whenever $i > j$. Thus\n", + "$$ Q = \\begin{bmatrix} u_1 & \\cdots & u_n \\end{bmatrix} \\text{ and } R = \\begin{bmatrix} r_1 & \\cdots & r_n \\end{bmatrix} $$\n", + "give rise to a $A = QR$, where the columns of $Q$ form an orthonormal basis for $\\text{Col}(A)$ and $R$ is upper-triangular. We can also compute $R$ directly from $Q$ and $Q$. Indeed, note that $Q^TQ = I$, so\n", + "$$ Q^TA = Q^T(QR) = IR = R. $$\n", + "\n", + "> **Example**. Find a QR decomposition for the matrix\n", + "> $$ A = \\begin{bmatrix} 1 & 1 & 1 \\\\ 0 & 1 & 1 \\\\ 0 & 0 & 1 \\\\ 0 & 0 & 0 \\end{bmatrix}. $$\n", + "> Note that one trivially see (or by applying the Gram-Schmidt procedure) that\n", + "> $$ \\begin{bmatrix} 1 \\\\ 0 \\\\ 0 \\\\ 0 \\end{bmatrix}, \\begin{bmatrix} 0 \\\\ 1 \\\\ 0 \\\\ 0 \\end{bmatrix}, \\begin{bmatrix} 0 \\\\ 0 \\\\ 1 \\\\ 0 \\end{bmatrix} $$\n", + "> forms an orthonormal basis for the column space of $A$. So with\n", + "> $$ Q = \\begin{bmatrix} 1 & 0 & 0 \\\\ 0 & 1 & 0 \\\\ 0 & 0 & 1 \\\\ 0 & 0 & 0 \\end{bmatrix} \\text{ and }R = \\begin{bmatrix} 1 & 1 & 1\\\\ 0 & 1 & 1 \\\\ 0 & 0 & 1 \\end{bmatrix}, $$\n", + "> we have $A = QR$.\n", + "\n", + "Let's do a more involved example.\n", + "> **Example**. Consider the matrix\n", + "> $$ A = \\begin{bmatrix} 1 & 0 & 0 \\\\ 1 & 1 & 0 \\\\ 1 & 1 & 1 \\\\ 1 & 1 & 1 \\end{bmatrix}. $$\n", + "> One can apply the Gram-Schmidt procedure to the columns of $A$ to find that\n", + "> $$ \\begin{bmatrix} 1 \\\\ 1 \\\\ 1 \\\\ 1 \\end{bmatrix}, \\begin{bmatrix} -3 \\\\ 1 \\\\ 1 \\\\ 1 \\end{bmatrix}, \\begin{bmatrix} 0 \\\\ -\\frac{2}{3} \\\\ \\frac{1}{3} \\\\ \\frac{1}{3}\\end{bmatrix} $$\n", + "> forms an orthogonal basis for the column space of $A$. Normalizing, we get that\n", + "> $$ Q = \\begin{bmatrix} \\frac{1}{2} & -\\frac{3}{\\sqrt{12}} & 0 \\\\ \\frac{1}{2} & \\frac{1}{\\sqrt{12}} & -\\frac{2}{\\sqrt{6}} \\\\ \\frac{1}{2} & \\frac{1}{\\sqrt{12}} & \\frac{1}{\\sqrt{6}} \\\\ \\frac{1}{2} & \\frac{1}{\\sqrt{12}} & \\frac{1}{\\sqrt{6}} \\end{bmatrix} $$\n", + "> is an appropriate $Q$. Thus\n", + "> $$ \\begin{split} R = Q^TA &= \\begin{bmatrix} \\frac{1}{2} & \\frac{1}{2} & \\frac{1}{2} & \\frac{1}{2} \\\\ -\\frac{3}{\\sqrt{12}} & \\frac{1}{\\sqrt{12}} & \\frac{1}{\\sqrt{12}} & \\frac{1}{\\sqrt{12}} \\\\ 0 & -\\frac{2}{\\sqrt{6}} & \\frac{1}{\\sqrt{6}} & \\frac{1}{\\sqrt{6}} \\end{bmatrix}\\begin{bmatrix} 1 & 0 & 0 \\\\ 1 & 1 & 0 \\\\ 1 & 1 & 1 \\\\ 1 & 1 & 1 \\end{bmatrix} \\\\ &= \\begin{bmatrix} 2 & \\frac{3}{2} & 1 \\\\ 0 & \\frac{3}{\\sqrt{12}} & \\frac{2}{\\sqrt{12}} \\\\ 0 & 0 & \\frac{2}{\\sqrt{6}} \\end{bmatrix}. \\end{split} $$\n", + "> So all together,\n", + "> $$A = \\begin{bmatrix} \\frac{1}{2} & -\\frac{3}{\\sqrt{12}} & 0 \\\\ \\frac{1}{2} & \\frac{1}{\\sqrt{12}} & -\\frac{2}{\\sqrt{6}} \\\\ \\frac{1}{2} & \\frac{1}{\\sqrt{12}} & \\frac{1}{\\sqrt{6}} \\\\ \\frac{1}{2} & \\frac{1}{\\sqrt{12}} & \\frac{1}{\\sqrt{6}} \\end{bmatrix}\\begin{bmatrix} 2 & \\frac{3}{2} & 1 \\\\ 0 & \\frac{3}{\\sqrt{12}} & \\frac{2}{\\sqrt{12}} \\\\ 0 & 0 & \\frac{2}{\\sqrt{6}} \\end{bmatrix}. $$\n", + "\n", + "To do this numerically, we can use `numpy.linalg.qr`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b8a19959", + "metadata": {}, + "outputs": [], + "source": [ + "# Define our matrices\n", + "A = np.array([[1,1,1],[0,1,1],[0,0,1],[0,0,0]])\n", + "B = np.array([[1,0,0],[1,1,0],[1,1,1],[1,1,1]])\n", + "\n", + "# Take QR decompositions\n", + "QA, RA = np.linalg.qr(A)\n", + "QB, RB = np.linalg.qr(B)" + ] + }, + { + "cell_type": "markdown", + "id": "1851b7cf", + "metadata": {}, + "source": [ + "Our resulting matrices are:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "438e7303", + "metadata": {}, + "outputs": [], + "source": [ + ">>> QA\n", + "array([[ 1., 0., 0.],\n", + " [-0., 1., 0.],\n", + " [-0., -0., 1.],\n", + " [-0., -0., -0.]])\n", + ">>> RA\n", + "array([[1., 1., 1.],\n", + " [0., 1., 1.],\n", + " [0., 0., 1.]])\n", + ">>> QB\n", + "array([[-0.5 , 0.8660254 , 0. ],\n", + " [-0.5 , -0.28867513, 0.81649658],\n", + " [-0.5 , -0.28867513, -0.40824829],\n", + " [-0.5 , -0.28867513, -0.40824829]])\n", + ">>> RB\n", + "array([[-2. , -1.5 , -1. ],\n", + " [ 0. , -0.8660254 , -0.57735027],\n", + " [ 0. , 0. , -0.81649658]])" + ] + }, + { + "cell_type": "markdown", + "id": "058acaec", + "metadata": {}, + "source": [ + "### How to use QR decompositions\n", + "\n", + "One of the primary uses of QR decompositions is to solve least squares problems, as introduced above. Assuming that $A$ has full column rank, we can write $A = QR$ as a QR decomposition, and then we can find a least-squares solution to $Ax = b$ by solving the upper-triangular system.\n", + "\n", + "> **Theorem**. Let $A$ be an $m \\times n$ matrix with full column rank, and let $A = QR$ be a QR factorization of $A$. Then, for each $b \\in \\mathbb{R}^m$, the equation $Ax = b$ has a unique least-squares solution, arising from the system\n", + "> $$ Rx = Q^Tb. $$\n", + "\n", + "Normal equations can be *ill-conditioned*, i.e., small errors in calculating $A^TA$ give large errors when trying to solve the least-squares problem. When $A$ has full column rank, a QR factorization will allow one to compute a solution to the least-squares problem more reliably. \n", + "\n", + "> **Example**. Let\n", + "> $$ A = \\begin{bmatrix} 1 & 0 & 0 \\\\ 1 & 1 & 0 \\\\ 1 & 1 & 1 \\\\ 1 & 1 & 1 \\end{bmatrix} \\text{ and } b = \\begin{bmatrix} 1 \\\\ 1 \\\\ 1 \\\\ 0 \\end{bmatrix}. $$\n", + "> We can find the least-squares solution $Ax = b$ by using the QR decomposition. Let us use the QR decomposition from above, and solve the system\n", + "> $$ Rx = Q^Tb. $$\n", + "> As\n", + "> $$ \\begin{bmatrix} \\frac{1}{2} & -\\frac{3}{\\sqrt{12}} & 0 \\\\ \\frac{1}{2} & \\frac{1}{\\sqrt{12}} & -\\frac{2}{\\sqrt{6}} \\\\ \\frac{1}{2} & \\frac{1}{\\sqrt{12}} & \\frac{1}{\\sqrt{6}} \\\\ \\frac{1}{2} & \\frac{1}{\\sqrt{12}} & \\frac{1}{\\sqrt{6}} \\end{bmatrix}^T\\begin{bmatrix} 1 \\\\ 1 \\\\ 1 \\\\ 0 \\end{bmatrix} = \\begin{bmatrix} \\frac{3}{2} \\\\ -\\frac{1}{2\\sqrt{3}} \\\\ -\\frac{1}{\\sqrt{6}}, \\end{bmatrix} $$\n", + "> we are looking at the system\n", + "> $$ \\begin{bmatrix} 2 & \\frac{3}{2} & 1 \\\\ 0 & \\frac{3}{\\sqrt{12}} & \\frac{2}{\\sqrt{12}} \\\\ 0 & 0 & \\frac{2}{\\sqrt{6}} \\end{bmatrix}x =\\begin{bmatrix} \\frac{3}{2} \\\\ -\\frac{1}{2\\sqrt{3}} \\\\ -\\frac{1}{\\sqrt{6}} \\end{bmatrix}. $$\n", + "> Solving this system yields that\n", + "> $$ x_0 = \\begin{bmatrix} 1 \\\\ 0 \\\\ -\\frac{1}{2} \\end{bmatrix} $$\n", + "> is a least-squares solution to $Ax = b$.\n", + "\n", + "Let us set this system up in python and use `numpy.linalg.solve`. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "956044d9", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "# Define matrix and vector\n", + "A = np.array([[1,0,0],[1,1,0],[1,1,1],[1,1,1]])\n", + "b = np.array([[1],[1],[1],[0]])\n", + "\n", + "# Take the QR decomposition of A\n", + "Q, R = np.linalg.qr(A)\n", + "\n", + "# Solve the linear system Rx = Q.T b\n", + "beta = np.linalg.solve(R,Q.T @ b)" + ] + }, + { + "cell_type": "markdown", + "id": "c1315693", + "metadata": {}, + "source": [ + "This yields" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5a9f4dd8", + "metadata": {}, + "outputs": [], + "source": [ + ">>> beta\n", + "array([[ 1.00000000e+00],\n", + " [ 6.40987562e-17],\n", + " [-5.00000000e-01]])" + ] + }, + { + "cell_type": "markdown", + "id": "8d250fe6", + "metadata": {}, + "source": [ + "which agrees with our exact least-squares solution.\n", + "Note that `numpy.linalg.lstsq` still gives a **ever so slightly** different result. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "41d6bc9d", + "metadata": {}, + "outputs": [], + "source": [ + ">>> np.linalg.lstsq(A,b)[0]\n", + "array([[ 1.00000000e+00],\n", + " [ 2.22044605e-16],\n", + " [-5.00000000e-01]])" + ] + }, + { + "cell_type": "markdown", + "id": "eb61abb4", + "metadata": {}, + "source": [ + "---\n", + "\n", + "Let's go back to the house example. While we're at it, let's get used to using pandas to make a dataframe. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cef058ec", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "\n", + "# First let us make a dictionary incorporating our data.\n", + "# Each entry corresponds to a column (feature of our data)\n", + "data = {\n", + " 'Square ft': [1600, 2100, 1550, 1600, 2000],\n", + " 'Bedrooms': [3, 4, 2, 3, 4],\n", + " 'Price': [500, 650, 475, 490, 620]\n", + "}\n", + "\n", + "# Create a pandas DataFrame\n", + "df = pd.DataFrame(data)\n", + "\n", + "# Create our matrix X and our target y\n", + "X = df[[\"Square ft\", \"Bedrooms\"]].to_numpy()\n", + "y = df[[\"Price\"]].to_numpy()\n", + "\n", + "# Augment X with a column of 1's (intercept)\n", + "X_aug = np.hstack((np.ones((X.shape[0], 1)), X))\n", + "\n", + "# Perform QR decomposition\n", + "Q, R = np.linalg.qr(X_aug)\n", + "\n", + "# Solve the upper triangular system Rx = Q^Ty\n", + "beta = np.linalg.solve(R, Q.T @ y)" + ] + }, + { + "cell_type": "markdown", + "id": "83fe3ba5", + "metadata": {}, + "source": [ + "Let's look at the output." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2fde0621", + "metadata": {}, + "outputs": [], + "source": [ + ">>> Q\n", + "array([[-0.4472136 , 0.32838365, 0.40496317],\n", + " [-0.4472136 , -0.63745061, -0.22042299],\n", + " [-0.4472136 , 0.42496708, -0.7689174 ],\n", + " [-0.4472136 , 0.32838365, 0.40496317],\n", + " [-0.4472136 , -0.44428376, 0.17941406]])\n", + ">>> R\n", + "array([[-2.23606798e+00, -3.95784032e+03, -7.15541753e+00],\n", + " [ 0.00000000e+00, -5.17687164e+02, -1.50670145e+00],\n", + " [ 0.00000000e+00, 0.00000000e+00, 7.27908474e-01]])\n", + ">>> beta\n", + "array([-3.05053797e-13, 3.00000000e-01, 5.00000000e+00])" + ] + }, + { + "cell_type": "markdown", + "id": "0e1d5e34", + "metadata": {}, + "source": [ + "As we can see, the least-squares solution agrees with what we got by hand and by other python methods (if we agree that the tiny first component is essentially zero).\n", + "\n", + "---\n", + "\n", + "The QR decomposition of a matrix is also useful for computing orthogonal projections.\n", + "> **Theorem**. Let $A$ be an $m \\times n$ matrix with full column rank. If $A = QR$ is a QR decomposition, then $QQ^T$ is the projection onto the column space of $A$, i.e., $QQ^Tb = \\text{Proj}_{\\text{Col}(A)}b$ for all $b \\in \\mathbb{R}^m$.\n", + "\n", + "Let's see what our range projections are for the matrices above. Note that the first example above will have the orthogonal projection just being\n", + "$$ \\begin{bmatrix} 1 \\\\ & 1 \\\\ & & 1\\\\ & & & 0 \\end{bmatrix}. $$\n", + "Let's look at the other matrix. \n", + "\n", + "> **Example**. Working with the matrix\n", + "> $$ A = \\begin{bmatrix} 1 & 0 & 0 \\\\ 1 & 1 & 0 \\\\ 1 & 1 & 1 \\\\ 1 & 1 & 1 \\end{bmatrix}, $$\n", + "> the projection onto the column space if given by\n", + "> $$ QQ^T = \\begin{bmatrix} 1 \\\\ & 1 \\\\ & & \\frac{1}{2} & \\frac{1}{2} \\\\ & & \\frac{1}{2} & \\frac{1}{2} \\end{bmatrix}. $$\n", + "> This is a well-understood projection: it is the direct sum of the identity on $\\mathbb{R}^2$ and the projection onto the line $y = x$ in $\\mathbb{R}^2$.\n", + "\n", + "Now let's use python to implement the projection." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7e180a5a", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "# Create our matrix A\n", + "A = np.array([[1,0,0],[1,1,0],[1,1,1],[1,1,1]])\n", + "\n", + "# Take the QR decomposition\n", + "Q, R = np.linalg.qr(A)\n", + "\n", + "# Create the range projection\n", + "P = Q @ Q.T" + ] + }, + { + "cell_type": "markdown", + "id": "1d1649c1", + "metadata": {}, + "source": [ + "The output gives" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a51a6368", + "metadata": {}, + "outputs": [], + "source": [ + "array([[1.00000000e+00, 2.89687929e-17, 2.89687929e-17, 2.89687929e-17],\n", + " [2.89687929e-17, 1.00000000e+00, 7.07349921e-17, 7.07349921e-17],\n", + " [2.89687929e-17, 7.07349921e-17, 5.00000000e-01, 5.00000000e-01],\n", + " [2.89687929e-17, 7.07349921e-17, 5.00000000e-01, 5.00000000e-01]])" + ] + }, + { + "cell_type": "markdown", + "id": "b7bc736b", + "metadata": {}, + "source": [ + "As we can see, the two off-diagonal blocks are all tiny, hence we treat them as zero. Note that if they were not actually zero, then this wouldn't actually be a projection. This can cause some problems. So let's fix this by introducing some tolerances. \n", + "\n", + "Let's write a function to implement this, assuming that columns of A are linearly independent. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "30c47538", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "def proj_onto_col_space(A):\n", + "\t# Take the QR decomposition\n", + "\tQ,R = np.linalg.qr(A)\n", + "\t# The projection is just Q @ Q.T\n", + "\tP = Q @ Q.T\n", + "\n", + "\treturn P" + ] + }, + { + "cell_type": "markdown", + "id": "0ae04d83", + "metadata": {}, + "source": [ + "We'll come back to this later. We should really be incorporating some sort of error tolerance so that things are **super super** tiny can actually just be sent to zero. \n", + "\n", + "> **Remark**. Another way to get the projection onto the column space of an $n \\times p$ matrix $A$ of full column rank is to take\n", + "> $$ P = A(A^TA)^{-1}A^T. $$\n", + "> Indeed, let $b \\in \\mathbb{R}^n$ and let $x_0 \\in \\mathbb{R}^p$ be a solution to the normal equations\n", + "> $$ A^TAx_0 = A^Tb. $$\n", + "> Then $x_0 = (A^TA)^{-1}A^Tb$ and so $Ax_0 = A(A^TA^{-1})A^Tb$ is the (unique!) vector in the column space of $A$ which is closest to $b$, i.e., the projection of $b$ onto the column space of $A$.\n", + "> However, taking transposes, multiplying, and inverting is not what we would like to do numerically. \n", + "\n", + "## Singular Value Decomposition\n", + "\n", + "The SVD is a very important matrix decomposition in both data science and linear algebra.\n", + "\n", + "> **Theorem**. For any matrix $n \\times p$ matrix $X$, there exist an orthogonal $n \\times n$ matrix $U$, an orthogonal $p \\times p$ matrix $V$, and a diagonal $n \\times p$ matrix $\\Sigma$ with non-negative entries such that\n", + "> $$ X = U\\Sigma V^T. $$\n", + "> - The columns of $U$ are left **left singular vectors**.\n", + "> - The columns of $V$ are the **right singular vectors**.\n", + "> - $\\Sigma$ has **singular values** $\\sigma_1 \\geq \\sigma_2 \\geq \\cdots \\geq \\sigma_r > 0$ on its diagonal, where $r$ is the rank of $X$.\n", + "\n", + "> **Remark**. The SVD is clearly a generalization of matrix diagonalization, but it also generalizes the **polar decomposition** of a matrix. Recall that every $n \\times n$ matrix $A$ can be written as $A = UP$ where $U$ is orthogonal (or unitary) and $P$ is a positive matrix. This is because if\n", + "> $$ A = U_0\\Sigma V^T $$\n", + "> is the SVD for $A$, then $\\Sigma$ is an $n \\times n$ diagonal matrix with non-negative entries, hence any orthogonal conjugate of it is positive, and so\n", + "> $$ A = (U_0V^T)(V\\Sigma V^T). $$\n", + "> Take $U = U_0V^T$ and $P = V\\Sigma V^T$. \n", + "\n", + "By hand, the algorithm for computing an SVD is as follows.\n", + "1. Both $AA^T$ and $A^TA$ are symmetric (they are positive in fact), and so they can be orthogonally diagonalized; one can form an orthogonal basis of eigenvectors. Let $v_1,\\dots,v_p$ be an orthonormal basis of eigenvectors for $\\mathbb{R}^p$ which correspond to eigenvectors of $A^TA$ in decreasing order. Suppose that $A^TA$ has $r$ non-zero eigenvalues. Let $V$ be the matrix whose columns contain the $v_i$'s. This gives our right singular vectors and our singular values. \n", + "2. Let $u_i = \\frac{1}{\\sigma_i}Av_i$ for $i = 1,\\dots,r$, and extend this collection of vectors to an orthonormal basis for $\\mathbb{R}^n$ if necessary. Let $U$ be the corresponding matrix.\n", + "3. Let $\\Sigma$ be the $n \\times p$ matrix whose diagonal entries are $\\sigma_1 \\geq \\sigma_2 \\geq \\cdots \\geq \\sigma_r$, and then zeroes if necessary. \n", + "\n", + "> **Example**. Let us compute the SVD of\n", + "> $$ A = \\begin{bmatrix} 3 & 2 & 2 \\\\ 2 & 3 & -2 \\end{bmatrix}. $$\n", + "> First we note that\n", + "> $$ A^TA = \\begin{bmatrix} 13 & 12 & 2 \\\\ 12 & 13 & -2 \\\\ 2 & -2 & 8 \\end{bmatrix}, $$\n", + "> which has eigenvalues $25,9,0$ with corresponding eigenvectors\n", + "> $$ \\begin{bmatrix} 1 \\\\ 1 \\\\ 0 \\end{bmatrix}, \\begin{bmatrix} 1 \\\\ -1 \\\\ 4 \\end{bmatrix}, \\begin{bmatrix} -2 \\\\ 2 \\\\ 1 \\end{bmatrix}. $$\n", + "> Normalizing, we get\n", + "> $$ V = \\begin{bmatrix} \\frac{1}{\\sqrt{2}} & \\frac{1}{3\\sqrt{2}} & -\\frac{2}{3} \\\\ \\frac{1}{\\sqrt{2}} & -\\frac{1}{3\\sqrt{2}} & \\frac{2}{3} \\\\ 0 & \\frac{4}{3\\sqrt{2}} & \\frac{1}{3} \\end{bmatrix}. $$\n", + "> Now we set $u_1 = \\frac{1}{5}Av_1$ and $u_2 = \\frac{1}{3}Av_2$ to get\n", + "> $$ U = \\begin{bmatrix} \\frac{1}{\\sqrt{2}} & \\frac{1}{\\sqrt{2}} \\\\ \\frac{1}{\\sqrt{2}} & -\\frac{1}{\\sqrt{2}} \\end{bmatrix}. $$\n", + "> So\n", + "> $$ A = \\begin{bmatrix} \\frac{1}{\\sqrt{2}} & \\frac{1}{\\sqrt{2}} \\\\ \\frac{1}{\\sqrt{2}} & -\\frac{1}{\\sqrt{2}} \\end{bmatrix} \\begin{bmatrix} 5 & 0 & 0 \\\\ 0 & 3 & 0 \\end{bmatrix} \\begin{bmatrix} \\frac{1}{\\sqrt{2}} & \\frac{1}{3\\sqrt{2}} & -\\frac{2}{3} \\\\ \\frac{1}{\\sqrt{2}} & -\\frac{1}{3\\sqrt{2}} & \\frac{2}{3} \\\\ 0 & \\frac{4}{3\\sqrt{2}} & \\frac{1}{3} \\end{bmatrix}^T $$\n", + "> is our SVD decomposition.\n", + "\n", + "We note that in practice, we avoid the computation of $X^TX$ because if the entries of $X$ have errors, then these errors will be squared in $X^TX$. There are better computational tools to get singular values and singular vectors which are more accurate. This is what our python tools will use. \n", + "\n", + "Let's use `numpy.linalg.svd` for the above matrix." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "00df55c1", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "#Define our matrix\n", + "A = np.array([[3,2,2],[2,3,-2]])\n", + "\n", + "# Take the SVD\n", + "U, S, Vh = np.linalg.svd(A)" + ] + }, + { + "cell_type": "markdown", + "id": "40e569b6", + "metadata": {}, + "source": [ + "Our SVD matrices are" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1969cc0f", + "metadata": {}, + "outputs": [], + "source": [ + ">>> U\n", + "array([[-0.70710678, -0.70710678],\n", + " [-0.70710678, 0.70710678]])\n", + ">>> S\n", + "array([5., 3.])\n", + "# Note that Vh already gives the transpose of the matrix V we get\n", + "# in our SVD. So we'll take the transpose again to get\n", + "# the appropriate rows\n", + ">>> Vh.T\n", + "array([[-7.07106781e-01, -2.35702260e-01, -6.66666667e-01],\n", + " [-7.07106781e-01, 2.35702260e-01, 6.66666667e-01],\n", + " [-6.47932334e-17, -9.42809042e-01, 3.33333333e-01]])" + ] + }, + { + "cell_type": "markdown", + "id": "24094032", + "metadata": {}, + "source": [ + "Because the eigenvalues of the hermitian squares of\n", + "$$ \\begin{bmatrix} 1 & 1 & 1\\\\ 0 & 1 & 1 \\\\ 0 & 0 & 1 \\\\ 0 & 0 & 0 \\end{bmatrix} \\text{ and } \\begin{bmatrix} 1 & 0 & 0 \\\\ 1 & 1 & 0 \\\\ 1 & 1 & 1 \\\\ 1 & 1 & 1 \\end{bmatrix} $$\n", + "are quite atrocious, an exact SVD decomposition is difficult to compute by hand. However, we can of course use python." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "36eb3006", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "# Define our matrices\n", + "A = np.array([[1,1,1],[0,1,1],[0,0,1],[0,0,0]])\n", + "B = np.array([[1,0,0],[1,1,0],[1,1,1],[1,1,1]])\n", + "\n", + "# SVD decomposition\n", + "U_A, S_A, Vh_A = np.linalg.svd(A)\n", + "U_B, S_B, Vh_B = np.linalg.svd(B)" + ] + }, + { + "cell_type": "markdown", + "id": "d045dc4b", + "metadata": {}, + "source": [ + "The resulting matrices are" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "30a4eb28", + "metadata": {}, + "outputs": [], + "source": [ + ">>> U_A\n", + "array([[ 0.73697623, 0.59100905, 0.32798528, 0. ],\n", + " [ 0.59100905, -0.32798528, -0.73697623, 0. ],\n", + " [ 0.32798528, -0.73697623, 0.59100905, 0. ],\n", + " [ 0. , 0. , 0. , 1. ]])\n", + ">>> S_A\n", + "array([2.2469796 , 0.80193774, 0.55495813])\n", + ">>> Vh_A.T\n", + "array([[ 0.32798528, 0.73697623, 0.59100905],\n", + " [ 0.59100905, 0.32798528, -0.73697623],\n", + " [ 0.73697623, -0.59100905, 0.32798528]])\n", + ">>> U_B\n", + "array([[-2.41816250e-01, 7.12015746e-01, -6.59210496e-01,\n", + " 0.00000000e+00],\n", + " [-4.52990541e-01, 5.17957311e-01, 7.25616837e-01,\n", + " 6.71536163e-17],\n", + " [-6.06763739e-01, -3.35226641e-01, -1.39502200e-01,\n", + " -7.07106781e-01],\n", + " [-6.06763739e-01, -3.35226641e-01, -1.39502200e-01,\n", + " 7.07106781e-01]])\n", + ">>> S_B\n", + "array([2.8092118 , 0.88646771, 0.56789441])\n", + ">>> Vh_B.T\n", + "array([[-0.67931306, 0.63117897, -0.37436195],\n", + " [-0.59323331, -0.17202654, 0.7864357 ],\n", + " [-0.43198148, -0.75632002, -0.49129626]])" + ] + }, + { + "cell_type": "markdown", + "id": "7f65d7ba", + "metadata": {}, + "source": [ + "Another final note is that the **operator norm** of a matrix $A$ agrees with its largest singular value. \n", + "\n", + "### Pseudoinverses and using the SVD\n", + "The SVD can be used to determine a least-squares solution for a given system. Recall that if $v_1,\\dots,v_p$ is an orthonormal basis for $\\mathbb{R}^p$ consisting of eigenvectors of $A^TA$, arranged so that they correspond to eigenvalues $\\sigma_1 \\geq \\sigma_2 \\geq \\cdots \\geq \\sigma_r$, then $\\{Av_1,\\dots,Av_r\\}$ is an orthogonal basis for the column space of $A$. In essence, this means that when we have our left singular vectors $u_1,\\dots,u_n$ (constructed based on our algorithm as above), we have that the first $r$ vectors form an orthonormal basis for the column space of $A$, and that the remaining $n - r$ vectors form an orthonormal basis for the perp of the column space of $A$ (which is also equal to the nullspace of $A^T$). \n", + "\n", + "> **Definition**. Let $A$ be an $n \\times p$ matrix and suppose that the rank of $A$ is $r \\leq \\min\\{n,p\\}$. Suppose that $A = U\\Sigma V^T$ is the SVD, where the singular values are decreasing. Partition\n", + "> $$ U = \\begin{bmatrix} U_r & U_{n-r} \\end{bmatrix} \\text{ and } V = \\begin{bmatrix} V_r & V_{p-r} \\end{bmatrix} $$\n", + "> into submatrices, where $U_r$ and $V_r$ are the matrices whose columns are the first $r$ columns of $U$ and $V$ respectively. So $U_r$ is $n \\times r$ and $V_r$ is $p \\times r$. Let $D$ be the diagonal $r \\times r$ matrices whose diagonal entries are $\\sigma_1,\\dots, \\sigma_r$, so that\n", + ">$$ \\Sigma = \\begin{bmatrix} D & 0 \\\\ 0 & 0 \\end{bmatrix} $$\n", + "> and note that\n", + "> $$ A = U_rDV_r^T. $$\n", + "> We call this the reduced singular value decomposition of $A$. Note that $D$ is invertible, and its inverse is simply\n", + "> $$ D = \\begin{bmatrix} \\sigma_1^{-1} \\\\ & \\sigma_2^{-1} \\\\ & & \\ddots \\\\ & & & \\sigma_r^{-1} \\end{bmatrix}. $$\n", + "> The **pseudoinverse** (or **Moore-Penrose inverse**) of $A$ is the matrix\n", + "> $$ A^+ = V_rD^{-1}U_r^T. $$\n", + "\n", + "We note that the pseudoinverse $A^+$ is a $p \\times n$ matrix. \n", + "\n", + "With the pseudoinverse, we can actually find least-squares solutions quite easily. Indeed, if we are looking for the least-squares solution to the system $Ax = b$, define\n", + "$$ x_0 = A^+b. $$\n", + "Then \n", + "$$ \\begin{split} Ax_0 &= (U_rDV_r^T)(V_rD^{-1}U_r^Tb) \\\\ &= U_rDD^{-1}U_r^Tb \\\\ &= U_rU_r^Tb \\end{split} $$\n", + "As mentioned before, the columns of $U_r$ form an orthonormal basis for the column space of $A$ and so $U_rU_r^T$ is the orthogonal projection onto the range of $A$. That is, $Ax_0$ is precisely the projection of $b$ onto the column space of $A$, meaning that this yields a least-squares solution. This gives the following.\n", + "\n", + "> **Theorem**. Let $A$ be an $n \\times p$ matrix and $b \\in \\mathbb{R}^n$. Then\n", + "> $$ x_0 = A^+b$$\n", + "> is a least-squares solution to $Ax = b$. \n", + "\n", + "Taking pseudoinverses is quite involved. We'll do one example by hand, and then use python -- and we'll see something go wrong! There is a function `numpy.linalg.pinv` in numpy that will take a pseudoinverse. We can also just use `numpy.linalg.svd` and do the process above.\n", + "\n", + "> **Example**. We have the following SVD $A = U\\Sigma V^T$. \n", + "> $$ \\begin{bmatrix} 1 & 1 & 2\\\\ 0 & 1 & 1 \\\\ 1 & 0 & 1 \\\\ 0 & 0 & 0 \\end{bmatrix} = \\begin{bmatrix} \\sqrt{\\frac{2}{3}} & 0 & 0 & -\\frac{1}{\\sqrt{3}} \\\\ \\frac{1}{\\sqrt{6}} & \\frac{1}{\\sqrt{2}} & 0 & \\frac{1}{\\sqrt{3}} \\\\ \\frac{1}{\\sqrt{6}} & -\\frac{1}{\\sqrt{2}} & 0 & \\frac{1}{\\sqrt{3}} \\\\ 0 & 0 & 1 & 0 \\end{bmatrix} \\begin{bmatrix} 3 & 0 & 0 \\\\ 0 & 1 & 0 \\\\ 0 & 0 & 0 \\\\ 0 & 0 & 0 \\end{bmatrix}\\begin{bmatrix} \\frac{1}{\\sqrt{6}} & -\\frac{1}{\\sqrt{2}} & -\\frac{1}{\\sqrt{3}} \\\\ \\frac{1}{\\sqrt{6}} & \\frac{1}{\\sqrt{2}} & -\\frac{1}{\\sqrt{3}} \\\\ \\sqrt{\\frac{2}{3}} & 0 & \\frac{1}{\\sqrt{3}} \\end{bmatrix}^T. $$\n", + "> Can we find a least-squares solution to $Ax = b$, where\n", + "> $$ b = \\begin{bmatrix} 1 \\\\ 1 \\\\ 1 \\\\ 1 \\end{bmatrix}? $$\n", + "> The pseudoinverse of $A$ is\n", + "> $$ \\begin{split} A^+ &= \\begin{bmatrix} \\frac{1}{\\sqrt{6}} & -\\frac{1}{\\sqrt{2}} \\\\ \\frac{1}{\\sqrt{6}} & \\frac{1}{\\sqrt{2}} \\\\ \\sqrt{\\frac{2}{3}} & 0 \\end{bmatrix} \\begin{bmatrix} 3 \\\\ & 1 \\end{bmatrix} \\begin{bmatrix} \\sqrt{\\frac{2}{3}} & 0 \\\\ \\frac{1}{\\sqrt{6}} & \\frac{1}{\\sqrt{2}} \\\\ \\frac{1}{\\sqrt{6}} & -\\frac{1}{\\sqrt{2}} \\\\ 0 & 0 \\end{bmatrix}^T \\\\ &= \\begin{bmatrix} \\frac{1}{9} & -\\frac{4}{9} & \\frac{5}{9} & 0 \\\\ \\frac{1}{9} & \\frac{5}{9} & -\\frac{4}{9} & 0 \\\\ \\frac{2}{9} & \\frac{1}{9} & \\frac{1}{9} & 0\\end{bmatrix}, \\end{split} $$\n", + "> and so a least-squares solution is given by\n", + "> $$ \\begin{split} x_0 &= A^+b \\\\ &= \\begin{bmatrix} \\frac{1}{9} & -\\frac{4}{9} & \\frac{5}{9} & 0 \\\\ \\frac{1}{9} & \\frac{5}{9} & -\\frac{4}{9} & 0 \\\\ \\frac{2}{9} & \\frac{1}{9} & \\frac{1}{9} & 0\\end{bmatrix}\\begin{bmatrix} 1 \\\\ 1 \\\\ 1 \\\\ 1 \\end{bmatrix} \\\\ &= \\begin{bmatrix} \\frac{2}{9} \\\\ \\frac{2}{9} \\\\ \\frac{4}{9} \\end{bmatrix}. \\end{split} $$\n", + "\n", + "Now let's do this with python, and see an example of how things can go wrong. We'll try to take the pseudoinverse manually first." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ead7caa8", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "# Create our matrix A and our target b\n", + "A = np.array([[1,1,2],[0,1,1],[1,0,1],[0,0,0]])\n", + "b = np.array([[1],[1],[1],[1]])\n", + "\n", + "# Take the SVD decomposition\n", + "U, S, Vh = np.linalg.svd(A)\n", + "\n", + "# Prepare the pseudoinverse\n", + "# Recall that we invert the non-zero diagonal entries of the diagonal matrix.\n", + "# So we first build S_inv to be the appropriate size\n", + "S_inv = np.zeros((Vh.shape[0], U.shape[0])) \n", + "# We then fill in the appropriate values on the diagonal\n", + "S_inv[:len(S), :len(S)] = np.diag(1/S)\n", + "\n", + "# Build the pseudoinverse\n", + "A_pinv = Vh.T @ S_inv @ U.T\n", + "\n", + "# Compute the least-squares solution\n", + "beta = A_pinv @ b" + ] + }, + { + "cell_type": "markdown", + "id": "c9c1cb3a", + "metadata": {}, + "source": [ + "What is the result?\t" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cf5d2cca", + "metadata": {}, + "outputs": [], + "source": [ + ">>> beta\n", + "array([[ 2.74080345e+15],\n", + " [ 2.74080345e+15],\n", + " [-2.74080345e+15]])" + ] + }, + { + "cell_type": "markdown", + "id": "2eb5622d", + "metadata": {}, + "source": [ + "This is **WAY** off the mark. So what happened? Well, when we look at our singular values, we have" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ce0af2d3", + "metadata": {}, + "outputs": [], + "source": [ + ">>> S\n", + "array([3.00000000e+00, 1.00000000e+00, 1.21618839e-16])" + ] + }, + { + "cell_type": "markdown", + "id": "b8ddaf8f", + "metadata": {}, + "source": [ + "As we got this matrix numerically, the last entry is actually non-zero, but tiny. This isn't exactly what's going on since we know that the rank of A is 2. So when we invert the singular values and throw them on the diagonal, have `1/1.21618839e-16` which is a very large value. This value then messes up the rest of the computation. So how do we fix this? One can set tolerances in numpy, but we'll get to that later. Let's just note that `numpy.linalg.pinv` will already incorporate this. Let's see what we get." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c6fa652e", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "# Create our matrix A and our target b\n", + "A = np.array([[1,1,2],[0,1,1],[1,0,1],[0,0,0]])\n", + "b = np.array([[1],[1],[1],[1]])\n", + "\n", + "# Build the pseudoinverse\n", + "A_pinv = np.linalg.pinv(A)\n", + "\n", + "# Compute the least-squares solution\n", + "beta = A_pinv @ b" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "faef6206", + "metadata": {}, + "outputs": [], + "source": [ + ">>> A_pinv\n", + "array([[ 0.11111111, -0.44444444, 0.55555556, 0. ],\n", + " [ 0.11111111, 0.55555556, -0.44444444, 0. ],\n", + " [ 0.22222222, 0.11111111, 0.11111111, 0. ]])\n", + ">>> beta\n", + "array([[0.22222222],\n", + " [0.22222222],\n", + " [0.44444444]])" + ] + }, + { + "cell_type": "markdown", + "id": "45f09b1b", + "metadata": {}, + "source": [ + "### The Condition Number\n", + "Numerical calculations involving matrix equations are quite reliable if we use the SVD. This is because the orthogonal matrices $U$ and $V$ preserve lengths and angles, leaving the stability of the problem to be governed by the singular values of the matrix $X$. Recall that if $X = U\\Sigma V^T$, then solving the least-squares problem involves dividing by the non-zero singular values $\\sigma_i$ of $X$. If these values are very small, their inverses become very large, and this will amplify any numerical errors.\n", + "\n", + "> **Definition**. Let $X$ be an $n \\times p$ matrix and let $\\sigma_1 \\geq \\cdots \\geq \\sigma_r$ be the non-zero singular values of $X$. The **condition number** of $X$ is the quotient\n", + "> $$ \\kappa(X) = \\frac{\\sigma_1}{\\sigma_r} $$\n", + "> of the largest and smallest non-zero singular values.\n", + "\n", + "A condition number close to 1 indicates a well-conditioned problem, while a large condition number indicates that small perturbations in data may lead to large changes in computation. Geometrically, $\\kappa(X)$ measures how much $X$ distorts space. \n", + "\n", + "> **Example**. Consider the matrices\n", + "> $$ A = \\begin{bmatrix} 1 \\\\ & 1 \\end{bmatrix} \\text{ and } B = \\begin{bmatrix} 1 \\\\ & \\frac{1}{10^6} \\end{bmatrix}. $$\n", + "> The condition numbers are\n", + "> $$ \\kappa(A) = 1 \\text{ and } \\kappa(B) = 10^6. $$\n", + "> Inverting $X_2$ includes dividing by $\\frac{1}{10^6}$, which will amplify errors by $10^6$.\n", + "\n", + "Let's look our main example in python by using `numpy.linalg.cond`. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8d7df474", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "\n", + "# First let us make a dictionary incorporating our data.\n", + "# Each entry corresponds to a column (feature of our data)\n", + "data = {\n", + " 'Square ft': [1600, 2100, 1550, 1600, 2000],\n", + " 'Bedrooms': [3, 4, 2, 3, 4],\n", + " 'Price': [500, 650, 475, 490, 620]\n", + "}\n", + "\n", + "# Create a pandas DataFrame\n", + "df = pd.DataFrame(data)\n", + "\n", + "# Create out matrix X\n", + "X = df[['Square ft', 'Bedrooms']].to_numpy()\n", + "\n", + "# Check the condition number\n", + "cond_X = np.linalg.cond(X)" + ] + }, + { + "cell_type": "markdown", + "id": "04a8299e", + "metadata": {}, + "source": [ + "Let's see what we got." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "974bcc22", + "metadata": {}, + "outputs": [], + "source": [ + ">>> cond_X\n", + "np.float64(4329.082589067693)" + ] + }, + { + "cell_type": "markdown", + "id": "add9c860", + "metadata": {}, + "source": [ + "so this is quite a high condition number! This should be unsurprising, as clearly the number of bedrooms is correlated to the size of a house (especially so in our small toy example). \n", + "## A note on other norms\n", + "\n", + "There are other canonical choices of norms for vectors and matrices. While $L^2$ leads naturally to least-squares problems with closed-form solutions, other norms induce different geometries and different optimal solutions. From the linear algebra perspective, changing the norm affects:\n", + "- the shape of the unit ball,\n", + "- the geometry of approximation,\n", + "- the numerical behaviour of optimization problems. \n", + "\n", + "### $L^1$ norm (Manhattan distance)\n", + "The $L^1$ norm of a vector $x = (x_1,\\dots,x_p) \\in \\mathbb{R}^p$ is defined as\n", + "$$ \\|x\\|_1 = \\sum |x_i|. $$\n", + "Minimizing the $L^1$ norm is less sensitive to outliers. Geometrically, the $L^1$ unit ball in $\\mathbb{R}^2$ is a diamond (a rotated square), rather than a circle.\n", + "\n", + "![L1_unit_ball.png](./figures/L1_unit_ball.png))\n", + "\n", + "Consequently, optimization problems involving $L^1$ tend to produce solutions which live on the corners of this polytope.\n", + "Solutions often require linear programming or iterative reweighted least squares.\n", + "\n", + "$L^1$ based methods (such as LASSO) tend to set coefficients to be exactly zero. Unlike with $L^2$, the minimization problem for $L^1$ does not admit a closed form solution. Algorithms include:\n", + "- linear programming formulations,\n", + "- iterative reweighted least squares,\n", + "- coordinate descent methods.\n", + "\n", + "### $L^{\\infty}$ norm (max/supremum norm)\n", + "The supremum norm defined as\n", + "$$ \\|x\\|_{\\infty} = \\max |x_i| $$\n", + "seeks to control the worst-case error rather than the average error. Minimizing this norm is related to Chebyshev approximation by polynomials. \n", + "\n", + "Geometrically, the unit ball of $\\mathbb{R}^2$ with respect to the $L^{\\infty}$ norm looks like a square.\n", + "\n", + "![Linf_unit_ball.png](./figures/Linf_unit_ball.png)\n", + "\n", + "Problems involving the $L^{\\infty}$ norm are often formulated as linear programs, and are useful when worst-case guarantees are more important than optimizing average performance. \n", + "\n", + "### Matrix norms\n", + "\n", + "There are also various norms on matrices, each highlighting a different aspect of the associated linear transformation.\n", + "- **Frobenius norm**. This is an important norm, essentially the analogue of the $L^2$ norm for matrices. It is the Euclidean norm if you think of your matrix as a vector, forgetting its rectangular shape. For $A = (a_{ij})$ a matrix, the Frobenius norm \n", + " $$ \\|A\\|_F = \\sqrt{\\sum a_{ij}^2} $$\n", + " is the square root of the sum of squares of all the entries. This treats a matrix as a long vector and is invariant under orthogonal transformations. As we'll see, it plays a central role in:\n", + " - least-squares problems,\n", + " - low-rank approximation,\n", + " - principal component analysis.\n", + "\n", + " In particular, the truncated SVD yields a best low-rank approximation of a matrix with respect to the Frobenius norm.\n", + "\n", + " We also that that the Frobenius norm can be written in terms of tracial data. We have that\n", + " $$ \\|A\\|_F^2 = \\text{Tr}(A^TA) = \\text{Tr}(AA^T). $$\n", + "- **Operator norm** (spectral norm). This is just the norm as an operator $A: \\mathbb{R}^p \\to \\mathbb{R}^n$, where $\\mathbb{R}^p$ and $\\mathbb{R}^n$ are thought of as Hilbert spaces:\n", + " $$ \\|A\\| = \\max_{\\|x\\|_2 = 1}\\|Ax\\|_2. $$\n", + " This norm measures how big of an amplification $A$ can apply, and is equal to the largest singular value of $A$. This norm is related to stability properties, and is the analogue of the $L^{\\infty}$ norm.\n", + "- **Nuclear norm**. The nuclear norm, defined as\n", + " $$ \\|A\\|_* = \\sum \\sigma_i, $$\n", + " is the sum of the singular values. When $A$ is square, this is precisely the trace-class norm, and is the analogue of the $L^1$ norm. This norm acts as a generalization of the concept of rank. \n", + "\n", + "## A note on regularization\n", + "\n", + "Regularization introduces additional constraints or penalties to stabilize ill-posed problems. From the linear algebra point of view, regularization modifies the singular value structure of a problem. \n", + "- **Ridge regression**: add a positive multiple $\\lambda\\cdot I$ of the identity to $X^TX$ which will artificially inflate small singular values.\n", + "- This dampens unstable directions while leaving well-conditioned directions largely unaffected.\n", + " \n", + "Geometrically, regularization reshapes the solution space to suppress directions that are poorly supported by the data.\n", + "## A note on solving multiple targets concurrently\n", + "\n", + "Suppose now that we were interested in solving several problems concurrently; that is, given some data points, we would like to make $k$ predictions. Say we have our $n \\times p$ data matrix $X$, and we want to make $k$ predictions $y_1,\\dots,y_k$. We can then set the problem up as finding a best solution to the matrix equation\n", + "$$ XB = Y $$\n", + "where $B$ will be a $p \\times k$ matrix of parameters and $Y$ will be the $p \\times k$ matrix whose columns are $y_1,\\dots,y_k$. \n", + "\n", + "## Polynomial Regression\n", + "\n", + "Sometimes fitting a line to a set of $n$ data points clearly isn't the right thing to do. To emphasize the limitations of linear models, we generate data from a purely quadratic relationship. In this setting, the space of linear functions is not rich enough to capture the underlying structure, and the linear least-squares solution exhibits systematic error. Expanding the feature space to include quadratic terms resolves this issue.\n", + "\n", + "For example, suppose our data looked like the following. \n", + "\n", + "![quadratic_data.png](./figures/quadratic_data.png)\n", + "\n", + "If we try to find a line of best fit, we get something that doesn't really describe or approximate our data at all...\n", + "\n", + "![quadratic_line_of_best_fit.png](./figures/quadratic_line_of_best_fit.png)\n", + "\n", + "This is an example of **underfitting** data, and we can do better. The same linear regression ideas work for fitting a degree $d$ polynomial model to a set of $n$ data points. Before, when trying to fit a line to points $(x_1,y_1),\\dots,(x_n,y_n)$, we had the following matrices\n", + "$$ \\tilde{X} = \\begin{bmatrix} 1 & x_1 \\\\ \\vdots & \\vdots \\\\ 1 & x_n \\end{bmatrix}, y = \\begin{bmatrix} y_1 \\\\ \\vdots \\\\ y_n \\end{bmatrix}, \\tilde{\\beta} = \\begin{bmatrix} \\beta_0 \\\\ \\beta_1 \\end{bmatrix} $$\n", + "in the matrix equation\n", + "$$ \\tilde{X}\\tilde{\\beta} = y, $$\n", + "and we were trying to find a vector $\\tilde{\\beta}$ which gave a best possible solution. This would give us a line $y = \\beta_0 + \\beta_1x$ which best approximates the data. To fit a polynomial $y = \\beta_0 + \\beta_1x + \\beta_2x^2 + \\cdots + \\beta_d^dx^d$ to the data, we have a similar set up.\n", + "\n", + "> **Definition**. The **Vandermonde matrix** is the $n \\times (d+1)$ matrix\n", + "> $$ V = \\begin{bmatrix} 1 & x_1 & x_1^2 & \\cdots & x_1^d \\\\ 1 & x_2 & x_2^2 & \\cdots & x_2^d \\\\ \\vdots & \\vdots & \\ddots & \\vdots \\\\ 1 & x_n & x_n^2 & \\cdots & x_n^d \\end{bmatrix}. $$\n", + "\n", + "With the Vandermonde matrix, to find a polynomial function of best fit, one just needs to find a least-squares solution to the matrix equation\n", + "$$ V\\tilde{\\beta} = y. $$\n", + "\n", + "With the generated data above, we get the following curve. \n", + "\n", + "![quadratic_poly_of_best_fit.png](./figures/quadratic_poly_of_best_fit.png)\n", + "\n", + "Solving these problems can be done with python. One can use `numpy.polyfit` and `numpy.poly1d`. \n", + "\n", + "> **Example**. Consider the following data.\n", + "> |House | Square ft | Bedrooms | Price (in $1000s) |\n", + "> | --- | --- | --- | --- |\n", + "> | 0 | 1600 | 3 | 500 |\n", + "> | 1 | 2100 | 4 | 650 |\n", + "> | 2 | 1550 | 2 | 475 |\n", + "> | 3 | 1600 | 3 | 490 |\n", + "> | 4 | 2000 | 4 | 620 |\n", + ">\n", + "> Suppose we wanted to predict the price of a house based on the square footage and we thought the relationship was cubic (it clearly isn't, but hey, for the sake of argument). So really we are looking at the subset of data\n", + "> |House | Square ft | Price (in $1000s) |\n", + "> | --- | --- | --- |\n", + "> | 0 | 1600 | 500 |\n", + "> | 1 | 2100 | 650 |\n", + "> | 2 | 1550 | 475 |\n", + "> | 3 | 1600 | 490 |\n", + "> | 4 | 2000 | 620 |\n", + ">\n", + "> Our Vandermonde matrix will be\n", + "> $$ V = \\begin{bmatrix} 1 & 1600 & 1600^2 & 1600^3 \\\\ 1 & 2100 & 2100^2 & 2100^3 \\\\ 1 & 1550 & 1550^2 & 1550^3 \\\\ 1 & 1600 & 1600^2 & 1600^3 \\\\ 1 & 2000 & 2000^2 & 2000^3 \\end{bmatrix} $$\n", + "> and our target vector will be\n", + "> $$ y = \\begin{bmatrix} 500 \\\\ 650 \\\\ 475 \\\\ 490 \\\\ 620 \\end{bmatrix}. $$\n", + "> As we can see, the entries of the Vandermonde matrix get very very large very fast. One can, if they are so inclined, compute a least-squares solution to $V\\tilde{\\beta} = y$ by hand. Let's not, but let us find, using python, a \"best\" cubic approximation of the relationship between the square footage and price.\n", + "\n", + "We will use `numpy.polyfit`, `numpy.pold1d` and `numpy.linspace`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7e964aef", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import matplotlib as plt\n", + "\n", + "# First let us make a dictionary incorporating our data.\n", + "# Each entry corresponds to a column (feature of our data)\n", + "data = {\n", + " 'Square ft': [1600, 2100, 1550, 1600, 2000],\n", + " 'Bedrooms': [3, 4, 2, 3, 4],\n", + " 'Price': [500, 650, 475, 490, 620]\n", + "}\n", + "\n", + "# Create a pandas DataFrame\n", + "df = pd.DataFrame(data)\n", + "\n", + "# Extract x (square footage) and y (price)\n", + "x = df[\"Square ft\"].to_numpy(dtype=float)\n", + "y = df[\"Price\"].to_numpy(dtype=float)\n", + "\n", + "# Degree of polynomial\n", + "degree = 3 # cubic\n", + "\n", + "# Polyfit directly on x\n", + "cubic = np.poly1d(np.polyfit(x,y, degree))\n", + "\n", + "# Add fitted polynomial line and scatter plot\n", + "polyline = np.linspace(x.min(),x.max())\n", + "plt.scatter(x,y, label=\"Observed data\")\n", + "plt.plot(polyline, cubic(polyline), 'r', label=\"Cubic best fit\")\n", + "plt.xlabel(\"Square ft\")\n", + "plt.ylabel(\"Price (in $1000s)\")\n", + "plt.title(\"Cubic polynomial regression: Price vs Square Footage\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "c85a0f83", + "metadata": {}, + "source": [ + "So we get a cubic of best fit.\n", + "\n", + "![house_price_vs_sqft_cubic.png](./figures/house_price_vs_sqft_cubic.png)\n", + "\n", + "Here `numpy.polyfit` computes the least-squares solution in the polynomial basis $1, x, x^2, x^3$, i.e., it solves the Vandermonde least-squares problem. So what is our cubic polynomial?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7de476a6", + "metadata": {}, + "outputs": [], + "source": [ + ">>> cubic\n", + "poly1d([ 3.08080808e-07, -1.78106061e-03, 3.71744949e+00, -2.15530303e+03])" + ] + }, + { + "cell_type": "markdown", + "id": "2054772f", + "metadata": {}, + "source": [ + "The first term is the degree 3 term, the second the degree 2 term, the third the degree 1 term, and the fourth is the constant term. \n", + "\n", + "## What can go wrong?\n", + "\n", + "We are often dealing with imperfect data, so there is plenty that could go wrong. Here are some basic cases of where things can break down.\n", + "\n", + "- **Perfect multicolinearity**: non-invertible $\\tilde{X}^T\\tilde{X}$. This happens when one feature is a perfect combination of the others. This means that the columns of the matrix $\\tilde{X}$ are linearly dependent, and so infinitely many solutions will exist to the least-squares problem. \n", + " - For example, if you are looking at characteristics of people and you have height in both inches and centimeters.\n", + "- **Almost multicolinearity**: this happens when one features is **almost** a perfect combination of the others. From the linear algebra perspective, the columns of $\\tilde{X}$ might not be dependent, but they will be be **almost** linearly dependent. This will cause problems in calculation, as the condition number will become large and amplify numerical errors. The inverse will blow up small spectral components. \n", + "- **More features than observations**: this means that our matrix $\\tilde{X}$ will be wider than it is high. Necessarily, this means that the columns are linearly dependent. Regularization or dimensionality reduction becomes essential.\n", + "- **Redundant or constant features**: this is when there is a characteristic that is satisfied by each observation. In terms of the linear algebraic data, this means that one of the columns of $X$ is constant.\n", + " - e.g., if you are looking at characteristics of penguins, and you have \"# of legs\". This will always be two, and doesn't add anything to the analysis.\n", + "- **Underfitting**: the model lacks sufficient expressivity to capture the underlying structure. For example, see the section on polynomial regression -- sometimes one might want a curve vs. a straight line.\n", + "\n", + "![quadratic_line_of_best_fit.png](./figures/quadratic_line_of_best_fit.png)\n", + "- **Overfitting**: the model captures noise rather than structure. Often due to model complexity relative to data size. Polynomial regression can give a nice visualization of overfitting. For example, if we worked with the same generated quadratic data from the polynomial regression section, and we tried to approximation it by a degree 11 polynomial, we get the following.\n", + "\n", + "![quadratic_degree_11_best_fit.png](./figures/quadratic_degree_11_best_fit.png)\n", + "- **Outliers**: large deviations can dominate the $L^2$ norm. This is where normalization might be key.\n", + "- **Heteroscedasticity**: this is when the variance of noise changes across observations. Certain least-squares assumptions will break down.\n", + "- **Condition number**: a large condition number indicates numerical instability and sensitivity to perturbation, even when formal solutions exist.\n", + "- **Insufficient tolerance**: in numerical algorithms, thresholds used to determine rank or invertibility must be chosen carefully. Poor choices can lead to misleading results.\n", + "\n", + "The point is that many failures in data science are not conceptual, but they happen geometrically and numerically. Poor choices lead to poor results. \n", + "\n", + "# Principal Component Analysis\n", + "\n", + "Principal Component Analysis (PCA) addresses the issues of multicollinearity and dimensionality mentioned at the end of the previous section by transforming the data into a new coordinate system. The new axes -- called principal components -- are chosen to capture the maximum variance in the data. In linear algebra terms, we are finding a subspace of potentially smaller dimension that best approximates our data.\n", + "\n", + "> **Example**: Let us return to our house example. Suppose we decide to list the square footage in both square feet and square meters. Let's add this feature to our dataset.\n", + "> |House | Square ft | Square m | Bedrooms | Price (in $1000s) |\n", + "> | --- | --- | --- | --- | --- |\n", + "> | 0 | 1600 | 148 | 3 | 500 |\n", + "> | 1 | 2100 | 195 | 4 | 650 |\n", + "> | 2 | 1550 | 144 | 2 | 475 |\n", + "> | 3 | 1600 | 148 | 3 | 490 |\n", + "> | 4 | 2000 | 185 | 4 | 620 |\n", + "> \n", + "> In this case, our associated matrix is:\n", + "> $$ X = \\begin{bmatrix} 1600 & 148 & 3 & 500 \\\\ 2100 & 195 & 4 & 650 \\\\ 1550 & 144 & 2 & 475 \\\\ 1600 & 148 & 3 & 490 \\\\ 2000 & 185 & 4 & 620 \\end{bmatrix} $$\n", + "\n", + "There are a few problems with the above data and the associated matrix $X$ (this time, we're not looking to make predictions, so we don't omit the last column).\n", + "- **Redundancy**: Square feet and square meters give the same information. It's just a matter of if you're from a civilized country or from an uncivilized country.\n", + "- **Numerical instability**: The columns of $X$ are nearly linearly dependent. Indeed, the second column is almost a multiple of the first. Moreover, one can make a safe bet that the number of bedrooms increases as the square footage does, so that the first and third columns are correlated.\n", + "- **Interpretation difficulty**: We used the square footage and bedrooms *together* in the previous section to predict the price of a house. However, because of their correlation, this obfuscates the true relationship, say, between the square footage and the price of a house, or the number of bedrooms and the price of a house. \n", + "\n", + "So the question becomes: what do we do about this? We will try to get a smaller matrix (less columns) that contains the same, or a close enough, amount of information. The point is that the data is *effectively* lower-dimensional. \n", + "\n", + "Let's do a little analysis on our dataset before progressing. Let's use `pandas.DataFrame.describe`, `pandas.DataFrame.corr` and `numpy.linalg.cond`. First, let's set up our data." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e26cb7fe", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "\n", + "# First let us make a dictionary incorporating our data.\n", + "# Each entry corresponds to a column (feature of our data)\n", + "data = {\n", + " 'Square ft': [1600, 2100, 1550, 1600, 2000],\n", + "\t'Square m': [148, 195, 144, 148, 185],\n", + " 'Bedrooms': [3, 4, 2, 3, 4],\n", + " 'Price': [500, 650, 475, 490, 620]\n", + "}\n", + "\n", + "# Create a pandas DataFrame\n", + "df = pd.DataFrame(data)\n", + "\n", + "# Create out matrix X\n", + "X = df.to_numpy()" + ] + }, + { + "cell_type": "markdown", + "id": "82a5f918", + "metadata": {}, + "source": [ + "Now let's see what it has to offer. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a2afbde6", + "metadata": {}, + "outputs": [], + "source": [ + "# Describe the data\n", + ">>> df.describe()\n", + " Square ft Square m Bedrooms Price\n", + "count 5.000000 5.000000 5.00000 5.000000\n", + "mean 1770.000000 164.000000 3.20000 547.000000\n", + "std 258.843582 24.052027 0.83666 81.516869\n", + "min 1550.000000 144.000000 2.00000 475.000000\n", + "25% 1600.000000 148.000000 3.00000 490.000000\n", + "50% 1600.000000 148.000000 3.00000 500.000000\n", + "75% 2000.000000 185.000000 4.00000 620.000000\n", + "max 2100.000000 195.000000 4.00000 650.000000\n", + "# View correlations\n", + ">>> df.corr()\n", + " Square ft Square m Bedrooms Price\n", + "Square ft 1.000000 0.999886 0.900426 0.998810\n", + "Square m 0.999886 1.000000 0.894482 0.998395\n", + "Bedrooms 0.900426 0.894482 1.000000 0.909066\n", + "Price 0.998810 0.998395 0.909066 1.000000\n", + "# Check the condition number\n", + ">>> np.linalg.cond(X)\n", + "np.float64(8222.19067218415)" + ] + }, + { + "cell_type": "markdown", + "id": "20f6983e", + "metadata": {}, + "source": [ + "As we can see, everything is basically correlated, and we clearly have some redundancies. \n", + "\n", + "This section is structured as follows. \n", + "- [Low-rank approximation via SVD](#low-rank-approximation-via-svd)\n", + "- [Centering data](#centering-data)\n", + "\n", + "\n", + "## Low-rank approximation via SVD\n", + "\n", + "Let $A$ be an $n \\times p$ matrix and let $A = U\\Sigma V^T$ be a SVD. Let $u_1,\\dots,u_n$ be the columns of $U$, $v_1,\\dots,v_p$ be the column of $V$, and $\\sigma_1 \\geq \\cdots \\sigma_r > 0$ be the singular values, where $r \\leq \\min\\{n,p\\}$ is the rank of $A$. Then we have the **reduced singular value decomposition** (see [Pseudoinverses and using the svd](#pseudoinverses-and-using-the-svd))\n", + "$$ A = \\sum_{i=1}^r \\sigma_i u_iv_i^T $$\n", + "(note that $u_i$ is a $n \\times 1$ matrix and $v_i$ is a $p \\times 1$ matrix, so $u_iv_i^T$ is some $n \\times p$ matrix).\n", + "The key idea is that if the rank of $A$ is higher, say $s$, but the latter singular values are small, then we should still have an approximation like this. Say $\\sigma_{r+1},\\dots,\\sigma_{s}$ are tiny. Then\n", + "$$ \\begin{split} A &= \\sum_{i=1}^s \\sigma_i u_i v_i^T \\\\ &= \\sum_{i=1}^r \\sigma_i u_iv_i^T + \\sum_{i=r+1}^{s} \\sigma_i u_iv_i^T \\\\ &\\approx \\sum_{i=1}^r \\sigma_iu_i v_i^T \\end{split}. $$\n", + "So defining $A_r := \\sum_{i=1}^r \\sigma_i u_iv_i^T$, we are approximating $A$ by $A_r$.\n", + "\n", + "In what sense is this a good approximation though? Recall that the Frobenius norm of a matrix $A$ is defined as the sqrt root of the sum of the squares of all the entries:\n", + "$$ \\|A\\|_F = \\sqrt{\\sum_{i,j} a_{ij}^2}. $$\n", + "The Frobenius norm acts as a very nice generalization of the $L^2$ norm for vectors, and is an indispensable tool in both linear algebra and data science. The point is that this \"approximation\" above actually works in the Frobenius norm, and this reduced singular value decomposition in fact minimizes the error.\n", + "\n", + "> **Theorem** (Eckart–Young–Mirsky). Let $A$ be an $n \\times p$ matrix of rank $r$. For $k \\leq r$,\n", + "> $$ \\min_{B \\text{ such that rank}(B) \\leq k} \\|A - B\\|_F = \\|A - A_k\\|_F. $$\n", + "> The (at most) rank $k$ matrix $A_k$ also realizes the minimum when optimizing for the operator norm.\n", + "\n", + "> **Example**. Recall that we have the following SVD:\n", + "> $$ \\begin{bmatrix} 3 & 2 & 2 \\\\ 2 & 3 & -2 \\end{bmatrix} = \\begin{bmatrix} \\frac{1}{\\sqrt{2}} & \\frac{1}{\\sqrt{2}} \\\\ \\frac{1}{\\sqrt{2}} & -\\frac{1}{\\sqrt{2}} \\end{bmatrix} \\begin{bmatrix} 5 & 0 & 0 \\\\ 0 & 3 & 0 \\end{bmatrix} \\begin{bmatrix} \\frac{1}{\\sqrt{2}} & \\frac{1}{3\\sqrt{2}} & -\\frac{2}{3} \\\\ \\frac{1}{\\sqrt{2}} & -\\frac{1}{3\\sqrt{2}} & \\frac{2}{3} \\\\ 0 & \\frac{4}{3\\sqrt{2}} & \\frac{1}{3} \\end{bmatrix}^T. $$\n", + "> So if we want a rank-one approximation for the matrix, we'll do the reduced SVD. We have\n", + "> $$ \\begin{split} A_1 &= \\sigma_1u_1v_1^T \\\\ &= 5\\begin{bmatrix} \\frac{1}{\\sqrt{2}} \\\\ \\frac{1}{\\sqrt{2}} \\end{bmatrix}\\begin{bmatrix} \\frac{1}{\\sqrt{2}} & \\frac{1}{\\sqrt{2}} & 0 \\end{bmatrix} \\\\ &= \\begin{bmatrix} \\frac{5}{2} & \\frac{5}{2} & 0 \\\\ \\frac{5}{2} & \\frac{5}{2} & 0 \\end{bmatrix} \\end{split}$$\n", + "> Now let's compute the (square of the) Frobenius norm of the difference $A - A_1$. We have\n", + "> $$ \\begin{split} \\|A - A_1\\|_F^2 &= \\left\\| \\begin{bmatrix} \\frac{1}{2} & -\\frac{1}{2} & 2 \\\\ -\\frac{1}{2} & \\frac{1}{2} & -2 \\end{bmatrix}\\right\\|_F^2 \\\\ &= 4(\\frac{1}{2})^2 + 2(2^2) = 9. \\end{split} $$\n", + "> So the Frobenius distance between $A$ and $A_1$ is 3, and we know by Eckart-Young-Mirsky that this is the smallest we can get when looking at the difference between $A$ and a (at most) rank one $2 \\times 3$ matrix. As mentioned, the operator norm $\\|A - A_1\\|$ also minimizes the distance (in operator norm). We know this to be the largest singular value. As $A - A_1$ has SVD\n", + "> $$ \\begin{bmatrix} \\frac{1}{2} & -\\frac{1}{2} & 2 \\\\ -\\frac{1}{2} & \\frac{1}{2} & -2 \\end{bmatrix} = \\begin{bmatrix} -\\frac{1}{\\sqrt{2}} & \\frac{1}{\\sqrt{2}} \\\\ \\frac{1}{\\sqrt{2}} & \\frac{1}{\\sqrt{2}} \\end{bmatrix}\\begin{bmatrix} 3 & 0 & 0 \\\\ 0 & 0 & 0 \\end{bmatrix} \\begin{bmatrix} -\\frac{1}{3\\sqrt{2}} & -\\frac{4}{\\sqrt{17}} & \\frac{1}{3\\sqrt{34}} \\\\ \\frac{1}{3\\sqrt{2}} & 0 & \\frac{1}{3}\\sqrt{\\frac{17}{2}} \\\\ -\\frac{2\\sqrt{2}}{3} & \\frac{1}{\\sqrt{17}} & \\frac{2}{3}\\sqrt{\\frac{2}{17}} \\end{bmatrix}, $$\n", + "> the operator norm is also 3. \n", + "\n", + "Now let's do this in python. We'll set up our matrix as usual, take the SVD, do the truncated construction of $A_1$, and use `numpy.linalg.norm` to look at the norms. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c2af4a96", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "# Create our matrix A\n", + "A = np.array([[3,2,2],[2,3,-2]])\n", + "\n", + "# Take the SVD\n", + "U, S, Vh = np.linalg.svd(A)\n", + "\n", + "# Create our rank-1 approximation\n", + "sigma1 = S[0]\n", + "u1 = U[:, [0]]\t\t#shape (2,2)\n", + "v1T = Vh[[0], :]\t\t#shape (3,3)\n", + "A1 = sigma1 * (u1 @ v1T)\n", + "\n", + "# Take norms and view errors\n", + "frobenius_error = np.linalg.norm(A - A1, ord=\"fro\")\t#Frobenius norm\n", + "operator_error = np.linalg.norm(A - A1, ord=2)\t\t#operator norm" + ] + }, + { + "cell_type": "markdown", + "id": "9cb14da3", + "metadata": {}, + "source": [ + "Let's see if we get what we expect." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "aceeeb96", + "metadata": {}, + "outputs": [], + "source": [ + ">>> sigma1\n", + "np.float64(4.999999999999999)\n", + ">>> u1\n", + "array([[-0.70710678],\n", + " [-0.70710678]])\n", + ">>> v1T\n", + "array([[-7.07106781e-01, -7.07106781e-01, -6.47932334e-17]])\n", + ">>> A1\n", + "array([[2.50000000e+00, 2.50000000e+00, 2.29078674e-16],\n", + " [2.50000000e+00, 2.50000000e+00, 2.29078674e-16]])\n", + ">>> frobenius_error\n", + "np.float64(3.0)\n", + ">>> operator_error\n", + "np.float64(3.0)" + ] + }, + { + "cell_type": "markdown", + "id": "b5139b3c", + "metadata": {}, + "source": [ + "So this numerically confirms the EYM theorem. \n", + "\n", + "## Centering data \n", + "In data science, we rarely apply low-rank approximation to raw values directly, because translation and units can dominate the geometry. Instead, we apply these methods to centered (and often standardized) data so that low-rank structure reflects relationships among features rather than the absolute location or measurement scale. Centering converts the problem from approximating an affine cloud to approximating a linear one, in direct analogy with including an intercept term in linear regression. Therefore, before we can analyze the variance structure, we must ensure our data is centered, i.e., that each feature has a mean of 0. We achieve this by subtracting the mean of each column from every entry in that column.\n", + "Suppose $X$ is our $n \\times p$ data matrix, and let\n", + "$$ \\mu = \\frac{1}{n}\\mathbb{1}^T X. $$\n", + "Then\n", + "$$ \\hat{X} = X - \\mu \\mathbb{1} $$\n", + "will be centered data matrix.\n", + "\n", + "> **Example**. Going back to our housing example, the means of the columns are 1770, 164, 3.2, and 547, respectively. So our centered matrix is\n", + "> $$ \\hat{X} = \\begin{bmatrix} -170 & -16 & -0.2 & -47 \\\\ 330 & 31 & 0.8 & 103 \\\\ -220 & -20 & -1.2 & -72 \\\\ -170 & -16 & -0.2 & -57 \\\\ 230 & 21 & 0.8 & 73 \\end{bmatrix}. $$\n", + "\n", + "Let's do this in python." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "72c5fff5", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "\n", + "# First let us make a dictionary incorporating our data.\n", + "# Each entry corresponds to a column (feature of our data)\n", + "data = {\n", + " 'Square ft': [1600, 2100, 1550, 1600, 2000],\n", + "\t'Square m': [148, 195, 144, 148, 185],\n", + " 'Bedrooms': [3, 4, 2, 3, 4],\n", + " 'Price': [500, 650, 475, 490, 620]\n", + "}\n", + "\n", + "# Create a pandas DataFrame\n", + "df = pd.DataFrame(data)\n", + "\n", + "# Create out matrix X\n", + "X = df.to_numpy()\n", + "\n", + "# Get our vector of means\n", + "X_means = np.mean(X, axis=0)\n", + "\n", + "# Create our centered matrix\n", + "X_centered = X - X_means\n", + "\n", + "# Get the SVD for X_centered\n", + "U, S, Vh = np.linalg.svd(X_centered)" + ] + }, + { + "cell_type": "markdown", + "id": "ef016708", + "metadata": {}, + "source": [ + "This returns the following." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6c0b2ce1", + "metadata": {}, + "outputs": [], + "source": [ + ">>> X_means\n", + "array([1770. , 164. , 3.2, 547. ])\n", + ">>> X_centered\n", + "array([[-1.70e+02, -1.60e+01, -2.00e-01, -4.70e+01],\n", + " [ 3.30e+02, 3.10e+01, 8.00e-01, 1.03e+02],\n", + " [-2.20e+02, -2.00e+01, -1.20e+00, -7.20e+01],\n", + " [-1.70e+02, -1.60e+01, -2.00e-01, -5.70e+01],\n", + " [ 2.30e+02, 2.10e+01, 8.00e-01, 7.30e+01]])" + ] + }, + { + "cell_type": "markdown", + "id": "ae3bc236", + "metadata": {}, + "source": [ + "We will apply the low-rank approximations from the previous sections. First let's see what our SVD looks like, and what the condition number is." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b7e727e5", + "metadata": {}, + "outputs": [], + "source": [ + ">>> U\n", + "array([[-0.32486018, -0.81524197, -0.01735449, -0.17188722, 0.4472136 ],\n", + " [ 0.63705869, 0.10707263, -0.3450375 , -0.51345964, 0.4472136 ],\n", + " [-0.42643013, 0.35553416, -0.61058318, 0.34487822, 0.4472136 ],\n", + " [-0.33034709, 0.436448 , 0.61781883, -0.3445052 , 0.4472136 ],\n", + " [ 0.44457871, -0.08381281, 0.35515633, 0.68497384, 0.4472136 ]])\n", + ">>> S\n", + "array([5.44828440e+02, 7.61035608e+00, 8.91429037e-01, 2.41987799e-01])\n", + ">>> Vh.T\n", + "array([[ 0.95017495, 0.29361033, 0.08182661, 0.06530651],\n", + " [ 0.08827897, 0.06690917, -0.71081981, -0.69459714],\n", + " [ 0.00276797, -0.04366082, 0.69629997, -0.71641638],\n", + " [ 0.29894268, -0.95258064, -0.05662119, 0.00417714]])\n", + ">>> np.linalg.cond(X_centered)\n", + "np.float64(2251.4707027583063)" + ] + }, + { + "cell_type": "markdown", + "id": "ee9b54b3", + "metadata": {}, + "source": [ + "Now let's approximate our centered matrix $\\hat{X}$ by some lower-rank matrices. First, we'll define a function which will give us a rank $k$ truncated SVD. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c67f205b", + "metadata": {}, + "outputs": [], + "source": [ + "# Defining the truncated svd\n", + "def reduced_svd_matrix_k(U, S, Vh, k):\n", + "\tUk = U[:, :k]\n", + "\tSk = np.diag(S[:k])\n", + "\tVhk = Vh[:k, :]\n", + "\treturn Uk @ Sk @ Vhk" + ] + }, + { + "cell_type": "markdown", + "id": "a5280885", + "metadata": {}, + "source": [ + "Now, as $\\hat{X}$ has rank 4, we can do a reduced matrix of rank 1,2,3. We will do this in a loop.\n", + "\n", + "> **Remark**. We'll divide the error by the (Frobenius) norm so that we have a relative error. E.g., if two houses are within 10k of each other, they are similarly priced. The magnitude of error being large doesn't say much if our quantities are large.\n", + "> " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6abf1b83", + "metadata": {}, + "outputs": [], + "source": [ + "for k in [1, 2, 3]:\n", + "\t# Define our reduced matrix\n", + " Xck = reduced_svd_matrix_k(U, S, Vh, k)\n", + "\t# Compute the relative error\n", + " rel_err = np.linalg.norm(X_centered - Xck, ord=\"fro\") / np.linalg.norm(X_centered, ord=\"fro\")\n", + "\t# Print the information\n", + " print(Xck, \"\\n\", f\"k={k}: relative Frobenius reconstruction error on centered data = {rel_err:.4f}\", \"\\n\")" + ] + }, + { + "cell_type": "markdown", + "id": "2e89ad9e", + "metadata": {}, + "source": [ + "And let's see what we get. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0d5a1c2f", + "metadata": {}, + "outputs": [], + "source": [ + "[[-168.1743765 -15.62476472 -0.48991109 -52.91078079]\n", + " [ 329.79403078 30.64054254 0.96072753 103.7593243 ]\n", + " [-220.7553464 -20.50996365 -0.64308544 -69.45373002]\n", + " [-171.01485494 -15.88866823 -0.49818573 -53.80444804]\n", + " [ 230.15054706 21.38285405 0.67045472 72.40963456]] \n", + " k=1: relative Frobenius reconstruction error on centered data = 0.0141 \n", + "\n", + "[[-1.69996018e+02 -1.60398881e+01 -2.19027093e-01 -4.70007022e+01]\n", + " [ 3.30033282e+02 3.06950642e+01 9.25150039e-01 1.02983104e+02]\n", + " [-2.19960913e+02 -2.03289247e+01 -7.61220318e-01 -7.20311670e+01]\n", + " [-1.70039621e+02 -1.56664278e+01 -6.43206200e-01 -5.69684681e+01]\n", + " [ 2.29963269e+02 2.13401763e+01 6.98303572e-01 7.30172337e+01]] \n", + " k=2: relative Frobenius reconstruction error on centered data = 0.0017 \n", + "\n", + "[[-1.69997284e+02 -1.60288915e+01 -2.29799059e-01 -4.69998263e+01]\n", + " [ 3.30008114e+02 3.09136956e+01 7.10984571e-01 1.03000519e+02]\n", + " [-2.20005450e+02 -1.99420315e+01 -1.14021052e+00 -7.20003486e+01]\n", + " [-1.69994556e+02 -1.60579058e+01 -2.59724807e-01 -5.69996518e+01]\n", + " [ 2.29989175e+02 2.11151332e+01 9.18749820e-01 7.29993076e+01]] \n", + " k=3: relative Frobenius reconstruction error on centered data = 0.0004 " + ] + }, + { + "cell_type": "markdown", + "id": "fa3a60f8", + "metadata": {}, + "source": [ + "This seems to check out -- it says that one rank (or one feature) should be roughly enough to describe this data. This should make sense because clearly the square meterage, # of bedrooms, and price depend on the square footage. \n", + "\n", + "# Project: Spectral Image Denoising via Truncated SVD\n", + "\n", + "In this project, we will use Truncated Singular Value Decomposition (SVD) to denoise a grayscale image.\n", + "The idea is based on the Eckart-Young-Mirsky theorem: the best low-rank approximation of a matrix (in Frobenius norm) is given by truncating its SVD.\n", + "\n", + "**Outline**.\n", + "1. Convert an image of my sweet, sweet dog, Bella to a grayscale image.\n", + "2. Load the grayscale image.\n", + "3. Add synthetic Gaussian noise to the image.\n", + "4. Treat the image as a matrix and compute its SVD.\n", + "5. Truncate the SVD to keep only the top $k$ singular values.\n", + "6. Reconstruct the image from the truncated SVD.\n", + "7. Compare the original, noisy, and denoised images visually and quantitatively. \n", + "\n", + "### The Setup: Images as Matrices\n", + "\n", + "Suppose we have a digital image of my dog, Bella. For simplicity, let's assume it is a grayscale image. From the perspective of a computer, this image is simply a large $n \\times p$ matrix $A$, where $n$ is the height in pixels and $p$ is the width. The entry $A_{ij}$ represents the brightness (intensity) of the pixel at row $i$ and column $j$, typically taking values between 0 (black) and 255 (white) (or 0 and 1 if we normalize). This matrix representation allows us to leverage linear algebra techniques for image manipulation and analysis.\n", + "\n", + "> **Remark**. Color images, by contrast, consist of multiple channels (e.g., RGB), and are therefore naturally represented as collections of matrices. To avoid introducing additional structure unrelated to the core linear algebraic ideas, we will restrict ourselves to grayscale images. That is, we will convert a chosen image into grayscale and apply the SVD directly.\n", + "\n", + "### Experimental Setup\n", + "\n", + "We will perform the following steps.\n", + "1. **Load an preprocess the image**. Convert the image to grayscale to simplify the analysis.\n", + "2. **Add artificial Gaussian noise**. Introduce synthetic Gaussian noise to simulate real-world noise.\n", + "3. **Compute the SVD**. Decompose the noisy matrix into its singular values and vectors.\n", + "4. **Truncating the SVD**. Retain only the top $k$ singular values to create a low-rank approximation.\n", + "5. **Reconstructing the Image**. Use the truncated SVD to reconstruct the denoised image.\n", + "6. **Comparing results**. Visually and quantitatively compare the original, noisy, and denoised images. \n", + "\n", + "### Loading and Preprocessing the Image\n", + "Let's start with this picture of my beautiful dog Bella. Here it is!\n", + "\n", + "![bella.jpg](./pictures/bella.jpg)\n", + "\n", + "Let's first convert it to grayscale." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f6095bb2", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from PIL import Image\n", + "\n", + "# Load image and convert to grayscale\n", + "img = Image.open(\"bella.jpg\").convert(\"L\")\n", + "A = np.array(img, dtype=float)\n", + "\n", + "plt.imshow(A, cmap=\"gray\")\n", + "plt.title(\"Original Grayscale Image\")\n", + "plt.axis(\"off\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "d0abcc56", + "metadata": {}, + "source": [ + "Here is the result.\n", + "\n", + "![bella_grayscale.jpg](./pictures/bella_grayscale.jpg)\n", + "\n", + "### Adding Noise\n", + "\n", + "Noise is added to the image to simulate real-world conditions. The noise level can be adjusted to see how the denoising algorithm performs under the difference noise conditions. The noisy image matrix $A_{\\text{noisy}}$ is created by adding Gaussian noise to the original matrix $A$. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "87e4ae7e", + "metadata": {}, + "outputs": [], + "source": [ + "rng = np.random.default_rng(0)\n", + "\n", + "noise_level = 25\n", + "A_noisy = A + noise_level * rng.standard_normal(A.shape)\n", + "\n", + "plt.imshow(A_noisy, cmap=\"gray\")\n", + "plt.title(\"Noisy Image\")\n", + "plt.axis(\"off\")" + ] + }, + { + "cell_type": "markdown", + "id": "b0394d9d", + "metadata": {}, + "source": [ + "This gives the following image. \n", + "\n", + "![bella_grayscale_noisy.jpg](./pictures/bella_grayscale_noisy.jpg)\n", + "\n", + "\n", + "\n", + "### SVD\n", + "\n", + "Recall that the SVD of $A$ is given by $A = U\\Sigma V^T$ where $U$ is an $n \\times n$ orthogonal matrix, $V$ is a $p \\times p$ orthogonal matrix, and $\\Sigma$ is an $n \\times p$ diagonal matrix with the singular values on the diagonal, in decreasing order. The left singular vectors correspond to the principal components of the image columns, while the right singular vectors correspond to the principal components of the image rows. \n", + "\n", + "The truncated SVD is given by $A_k = U_k\\Sigma_kV_k^T$, where $U_k,V_k, \\Sigma_k$ are the truncated versions of $U,V, \\Sigma$, respectively. This truncated SVD gives a *best approximation* of our matrix by a lower rank matrix, in terms of the Frobenius norm. Truncating the SVD is equivalent to projecting the image onto the top $k$ principal components. \n", + "\n", + "The larger singular values correspond to the most important features of the image, while the smaller singular values often contain noise. By truncating the smaller singular values, we can remove the noise while preserving the essential information." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f9923bd4", + "metadata": {}, + "outputs": [], + "source": [ + "# Take the SVD\n", + "U, S, Vh = np.linalg.svd(A_noisy)\n", + "\n", + "# Define the truncated SVD\n", + "def truncated_svd(U, S, Vh, k):\n", + " return U[:, :k] @ np.diag(S[:k]) @ Vh[:k, :]" + ] + }, + { + "cell_type": "markdown", + "id": "272700a8", + "metadata": {}, + "source": [ + "If you run the code, you'll see that it takes a bit. This is because computing the SVD of a large image is computationally expensive. There are other methods (e.g., randomized SVD) that exist for scalability. \n", + "\n", + "#### Singular Value Decay\n", + "\n", + "As mentioned, the singular values of an image typically decay rapidly, with the largest singular values capturing most of the important information. The smaller singular values often contain components with noise. We plot the singular values on a log scale, we can determine an appropriate truncation point $k$." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5f1bef5e", + "metadata": {}, + "outputs": [], + "source": [ + "plt.semilogy(S)\n", + "plt.title(\"Singular Value Decay\")\n", + "plt.xlabel(\"Index\")\n", + "plt.ylabel(\"Singular value (log scale)\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "bba73e6e", + "metadata": {}, + "source": [ + "![bella_singular_value_decay.jpeg](./figures/bella_singular_value_decay.jpeg)\n", + "\n", + "### Reconstructing the image\n", + "\n", + "We reconstruct our image precisely from the truncated SVD $A_k = U_k\\Sigma_k V_k^T$. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "14b1fe74", + "metadata": {}, + "outputs": [], + "source": [ + "import math\n", + "\n", + "# Choose values of $k$\n", + "ks = [5, 20, 50, 100]\n", + "\n", + "n_images = len(ks) # total number of reconstructions\n", + "n_cols = 2 # number of columns in the grid\n", + "n_rows = math.ceil(n_images / n_cols)\n", + "\n", + "# Create the grid of subplots\n", + "fig, axes = plt.subplots(\n", + " n_rows,\n", + " n_cols,\n", + " figsize=(4 * n_cols, 4 * n_rows)\n", + ")\n", + "\n", + "# axes is a 2D grid; flatten it so we can iterate over it with a for loop\n", + "axes = axes.ravel()\n", + "\n", + "# Generate and display reconstructed image for each k\n", + "for ax, k in zip(axes, ks):\n", + " # Reconstruct the rank-k approximation\n", + " A_k = truncated_svd(U, S, Vh, k)\n", + "\n", + " # Display the image\n", + " ax.imshow(A_k, cmap=\"gray\")\n", + "\n", + " # Label each subplot with the truncation rank\n", + " ax.set_title(f\"k = {k}\")\n", + "\n", + " # Remove axis ticks for a cleaner visualization\n", + " ax.axis(\"off\")\n", + "\n", + "# Hide the extras\n", + "for ax in axes[n_images:]:\n", + " ax.axis(\"off\")\n", + "\n", + "# adjust space to not overlap\n", + "plt.tight_layout()\n", + "\n", + "# show the plot\n", + "plt.show()\n", + "\n", + "\n", + "\n", + "for ax, k in zip(axes, ks):\n", + " # Reconstruct the rank-k approximation\n", + " A_k = truncated_svd(U, S, Vh, k)\n", + "\n", + " # Display the image\n", + " ax.imshow(A_k, cmap=\"gray\")\n", + "\n", + " # Label each subplot with the truncation rank\n", + " ax.set_title(f\"k = {k}\")\n", + "\n", + " # Remove axis ticks for a cleaner visualization\n", + " ax.axis(\"off\")\n", + "\n", + "\n", + "\n", + "fig, axes = plt.subplots(1, len(ks), figsize=(15,4))\n", + "\n", + "# Generate an image for each value of $k$\n", + "for ax, k in zip(axes, ks):\n", + " A_k = truncated_svd(U, S, Vh, k)\n", + " ax.imshow(A_k, cmap=\"gray\")\n", + " ax.set_title(f\"k = {k}\")\n", + " ax.axis(\"off\")\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "9de08509", + "metadata": {}, + "source": [ + "![bella_grayscale_svd.jpg](./pictures/bella_grayscale_svd.jpg)\n", + "\n", + "We can see that as $k$ increases, more image detail is recovered, but noise also begins to reappear.\n", + "\n", + "### Quantitative Evaluation\n", + "We can quantify the quality of the denoised image using the **mean squared error (MSE)** and **peak signal-to-noise ratio (PSNR)**:\n", + "$$ \\text{MSE} = \\frac{1}{np} \\sum_{i,j} (A_{ij} - A_k^{ij})^2, \\quad \\text{PSNR} = 10 \\log_{10} \\left( \\frac{255^2}{\\text{MSE}} \\right) $$\n", + "MSE quantifies the difference between two images, while higher PSNR values indicate better image quality and less distortion.\n", + "\n", + "Let's compute the MSE and PSNR for $k=5,20,50,100$. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b4919cc1", + "metadata": {}, + "outputs": [], + "source": [ + "def mse(A, B):\n", + " return np.mean((A - B) ** 2)\n", + "\n", + "def psnr(A, B, max_val=255.0):\n", + " error = mse(A, B)\n", + " if error == 0:\n", + " return np.inf\n", + " return 10 * np.log10((max_val ** 2) / error)\n", + "\n", + "results = []\n", + "\n", + "for k in ks:\n", + " A_k = truncated_svd(U, S, Vh, k)\n", + " mse_val = mse(A, A_k)\n", + " psnr_val = psnr(A, A_k)\n", + " results.append((k, mse_val, psnr_val))\n", + "\n", + "# Display results\n", + "for k, m, p in results:\n", + " print(f\"k = {k:3d} | MSE = {m:10.2f} | PSNR = {p:6.2f} dB\")" + ] + }, + { + "cell_type": "markdown", + "id": "91b0ea7d", + "metadata": {}, + "source": [ + "We get" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "22c1cdd9", + "metadata": {}, + "outputs": [], + "source": [ + "k = 5 | MSE = 275.48 | PSNR = 23.73 dB\n", + "k = 20 | MSE = 91.05 | PSNR = 28.54 dB\n", + "k = 50 | MSE = 56.81 | PSNR = 30.59 dB\n", + "k = 100 | MSE = 64.08 | PSNR = 30.06 dB" + ] + }, + { + "cell_type": "markdown", + "id": "35cb2249", + "metadata": {}, + "source": [ + "Let's put this into a table. \n", + "| $k$ | MSE | PSNR (dB)| Visual Quality|\n", + "|------|--------|----------|---------------|\n", + "| 5 | 275.48 | 23.73 | Very blurry |\n", + "| 20 | 91.05 | 28.54 | Some detail |\n", + "| 50 | 56.81 | 30.59 | Good balance |\n", + "| 100 | 64.08 | 30.06 | Noise returns |\n", + "\n", + "We can even see further values of MSE and PSNR. Although truncated SVD minimizes the reconstruction error relative to the noisy image, our quantitative evaluation measures error relative to the original clean image. As $k$ increases, the approximation increasingly fits noise-dominated singular components. Consequently, the mean squared error initially decreases as signal structure is recovered, but eventually increases once noise begins to dominate. This behavior reflects the bias–variance trade off inherent in spectral denoising and explains why the MSE is not monotone in $k$.\n", + "\n", + "| $k$ | MSE | PSNR (dB)| Visual Quality |\n", + "|-------|--------|----------|----------------------------|\n", + "| 200 | 107.84 | 27.80 | more noise \t\t\t |\n", + "| 500 | 229.03 | 24.54 | even more noise\t\t\t |\n", + "| 1000 | 380.20 | 22.33 | even more noise\t\t\t |\n", + "| 3000 | 616.74 | 20.23 | recovering our noisy image |\n", + "\n", + "![bella_grayscale_svd_200_500_1000_3000.jpeg](./pictures/bella_grayscale_svd_200_500_1000_3000.jpg)\n", + "\n", + "Note that the MSE between the original matrix A and the noisy matrix is 624.67. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fcf628dc", + "metadata": {}, + "outputs": [], + "source": [ + ">>> mse(A,A_noisy)\n", + "np.float64(624.6700890361011)" + ] + }, + { + "cell_type": "markdown", + "id": "b76cbeed", + "metadata": {}, + "source": [ + "So as the $k$ goes to the maximum it can be (in this case, 3456, as the image is 5184 x 3456), we should expect the MSE to go towards this value -- i.e., as $k$ gets higher, we are just approximating our noisy image better and better. \n", + "# Appendix\n", + "\n", + "## Figures\n", + "\n", + "### Line of best fit\n", + "#### Line of best fit for generated scatter plot\t\n", + "The first figure is a line of best fit for scattered points. Here is the python code that will produce the image. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "99a6df36", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# 1. Generate some synthetic data\n", + "# We set a random seed for reproducibility\n", + "np.random.seed(3)\n", + "\n", + "# Create 50 random x values between 0 and 10\n", + "x = np.random.uniform(0, 10, 50)\n", + "\n", + "# Create y values with a linear relationship plus some random noise\n", + "# True relationship: y = 2.5x + 5 + noise\n", + "noise = np.random.normal(0, 2, 50)\n", + "y = 2.5 * x + 5 + noise\n", + "\n", + "# 2. Calculate the line of best fit\n", + "# np.polyfit(x, y, deg) returns the coefficients for the polynomial\n", + "# deg=1 specifies a linear fit (first degree polynomial)\n", + "slope, intercept = np.polyfit(x, y, 1)\n", + "\n", + "# Create a polynomial function from the coefficients\n", + "# This allows us to pass x values directly to get predicted y values\n", + "fit_function = np.poly1d((slope, intercept))\n", + "\n", + "# Generate x values for plotting the line (smoothly across the range)\n", + "x_line = np.linspace(x.min(), x.max(), 100)\n", + "y_line = fit_function(x_line)\n", + "\n", + "# 3. Plot the data and the line of best fit\n", + "plt.figure(figsize=(10, 6))\n", + "\n", + "# Plot the scatter points\n", + "plt.scatter(x, y, color='purple', label='Data Points', alpha=0.7)\n", + "\n", + "# Plot the line of best fit\n", + "plt.plot(x_line, y_line, color='steelblue', linestyle='--', linewidth=2, label='Line of Best Fit')\n", + "\n", + "# Add labels and title\n", + "plt.xlabel('X Axis')\n", + "plt.ylabel('Y Axis')\n", + "plt.title('Scatter Plot with Line of Best Fit')\n", + "\n", + "# Add the equation to the plot\n", + "# The f-string formats the slope and intercept to 2 decimal places\n", + "plt.text(1, 25, f'y = {slope:.2f}x + {intercept:.2f}', fontsize=12, bbox=dict(facecolor='white', alpha=0.8))\n", + "\n", + "# Display legend and grid\n", + "plt.legend()\n", + "plt.grid(True, linestyle=':', alpha=0.6)\n", + "\n", + "# Show the plot\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "b276c606", + "metadata": {}, + "source": [ + "Alternatively, we can do the following using `matplotlib.pyplot.axline`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "731059b2", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# Generate data (same as above)\n", + "np.random.seed(3)\n", + "x = np.random.uniform(0, 10, 50)\n", + "y = 2.5 * x + 5 + np.random.normal(0, 2, 50)\n", + "\n", + "# Calculate slope and intercept\n", + "slope, intercept = np.polyfit(x, y, 1)\n", + "\n", + "plt.figure(figsize=(10, 6))\n", + "plt.scatter(x, y, color='purple', label='Data Points', alpha=0.7)\n", + "\n", + "# Plot the line using axline\n", + "# xy1=(0, intercept) is the y-intercept point\n", + "# slope=slope defines the steepness\n", + "plt.axline(xy1=(0, intercept), slope=slope, color='steelblue', linestyle='--', linewidth=2, label='Line of Best Fit')\n", + "\n", + "# Add the equation to the plot\n", + "# The f-string formats the slope and intercept to 2 decimal places\n", + "plt.text(1, 25, f'y = {slope:.2f}x + {intercept:.2f}', fontsize=12, bbox=dict(facecolor='white', alpha=0.8))\n", + "\n", + "\n", + "plt.xlabel('X Axis')\n", + "plt.ylabel('Y Axis')\n", + "plt.title('Scatter Plot with Line of Best Fit')\n", + "plt.legend()\n", + "plt.grid(True, linestyle=':', alpha=0.6)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "7b1784d8", + "metadata": {}, + "source": [ + "See\n", + "- https://stackoverflow.com/questions/37234163/how-to-add-a-line-of-best-fit-to-scatter-plot\n", + "- https://www.statology.org/line-of-best-fit-python/\n", + "- https://stackoverflow.com/questions/6148207/linear-regression-with-matplotlib-numpy\n", + "\n", + "### Projection of vector onto subspace\n", + "\n", + "Here is the code to generate the image of the projection of $\\text{Proj}(v)$ of a vector $v$ onto a plane in $\\mathbb{R}^3$. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7930702d", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# Linear algebra helper functions\n", + "def proj_onto_subspace(A, v):\n", + " \"\"\"\n", + " Project vector v onto Col(A) where A is (3 x k) with columns spanning the subspace.\n", + " Uses the formula: P = A (A^T A)^(-1) A^T (for full column rank A).\n", + " \"\"\"\n", + " AtA = A.T @ A\n", + " return A @ np.linalg.solve(AtA, A.T @ v)\n", + "\n", + "def make_plane_grid(a, b, u_range=(-1.5, 1.5), v_range=(-1.5, 1.5), n=15):\n", + " \"\"\"\n", + " Plane through origin spanned by vectors a and b.\n", + " Returns meshgrid points X,Y,Z for surface plotting.\n", + " \"\"\"\n", + " uu = np.linspace(*u_range, n)\n", + " vv = np.linspace(*v_range, n)\n", + " U, V = np.meshgrid(uu, vv)\n", + " P = U[..., None] * a + V[..., None] * b # shape (n,n,3)\n", + " return P[..., 0], P[..., 1], P[..., 2]\n", + "\n", + "# Choose a plan and a vector\n", + "# Plane basis vectors (span a 2D subspace in R^3)\n", + "a = np.array([1.0, 0.2, 0.0])\n", + "b = np.array([0.2, 1.0, 0.3])\n", + "# Create the associated matrix\n", + "# 3x2 matrix of full column rank\n", + "# the column space will be a plane\n", + "A = np.column_stack([a, b]) \n", + "\n", + "# Vector to project\n", + "v = np.array([0.8, 0.6, 1.2])\n", + "\n", + "# Projection and residual\n", + "p = proj_onto_subspace(A, v)\n", + "r = v - p\n", + "\n", + "# Plot\n", + "fig = plt.figure(figsize=(9, 7))\n", + "# 1 row, 1 column, 1 subplot\n", + "# axis lives in R^3\n", + "ax = fig.add_subplot(111, projection=\"3d\")\n", + "\n", + "# Plane surface\n", + "X, Y, Z = make_plane_grid(a, b)\n", + "# Here is a rectangular grid of points in 3D; draw a surface through them.\n", + "ax.plot_surface(X, Y, Z, alpha=0.25)\n", + "\n", + "origin = np.zeros(3)\n", + "\n", + "# v, p, and residual r\n", + "ax.quiver(*origin, *v, arrow_length_ratio=0.08, linewidth=2)\n", + "ax.quiver(*origin, *p, arrow_length_ratio=0.08, linewidth=2)\n", + "ax.quiver(*p, *r, arrow_length_ratio=0.08, linewidth=2)\n", + "\n", + "# Drop line from v to its projection on the plane\n", + "ax.plot([v[0], p[0]],\n", + "\t\t[v[1], p[1]],\n", + "\t\t[v[2], p[2]],\n", + "\t\tlinestyle=\"--\", linewidth=2)\n", + "\n", + "# Points for emphasis\n", + "ax.scatter(*v, s=60)\n", + "ax.scatter(*p, s=60)\n", + "\n", + "# Labels (simple text)\n", + "ax.text(*v, \" v\")\n", + "ax.text(*p, \" Proj(v)\")\n", + "\n", + "# Make axes look nice\n", + "ax.set_xlabel(\"x\")\n", + "ax.set_ylabel(\"y\")\n", + "ax.set_zlabel(\"z\")\n", + "ax.set_title(\"Projection of a vector onto a plane\")\n", + "\n", + "# Set symmetric limits so the picture isn't squished\n", + "all_pts = np.vstack([origin, v, p])\n", + "m = np.max(np.abs(all_pts)) * 1.3 + 0.2\n", + "ax.set_xlim(-m, m)\n", + "ax.set_ylim(-m, m)\n", + "ax.set_zlim(-m, m)\n", + "\n", + "# Adjust spacing so labels, titles, and axes don’t overlap or get cut off.\n", + "plt.tight_layout()\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "f1bd3202", + "metadata": {}, + "source": [ + "### $L^1$ and $L^{\\infty}$ unit balls\n", + "\n", + "To generate the matplotlib image of the $L^1$ unit ball, let's use the following code." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f9b45d61", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# Grid\n", + "xx = np.linspace(-1.2, 1.2, 400)\n", + "yy = np.linspace(-1.2, 1.2, 400)\n", + "X, Y = np.meshgrid(xx, yy)\n", + "\n", + "# Take the $L^1$ norm\n", + "Z = np.abs(X) + np.abs(Y)\n", + "\n", + "plt.figure(figsize=(6,6))\n", + "plt.contour(X, Y, Z, levels=[1])\n", + "plt.contourf(X, Y, Z, levels=[0,1], alpha=0.3)\n", + "\n", + "plt.axhline(0)\n", + "plt.axvline(0)\n", + "plt.gca().set_aspect(\"equal\", adjustable=\"box\")\n", + "plt.title(r\"$L^1$ unit ball: $|x|+|y|\\leq 1$\")\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "f7e97bd8", + "metadata": {}, + "source": [ + "For the $L^{\\infty}$ unit ball:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "443f786d", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# Grid\n", + "xx = np.linspace(-1.2, 1.2, 400)\n", + "yy = np.linspace(-1.2, 1.2, 400)\n", + "X, Y = np.meshgrid(xx, yy)\n", + "\n", + "# Take the $L^{\\infty}$ norm\n", + "Z = np.maximum(np.abs(X), np.abs(Y))\n", + "\n", + "plt.figure(figsize=(6,6))\n", + "plt.contour(X, Y, Z, levels=[1])\n", + "plt.contourf(X, Y, Z, levels=[0,1], alpha=0.3)\n", + "\n", + "plt.axhline(0)\n", + "plt.axvline(0)\n", + "plt.gca().set_aspect(\"equal\", adjustable=\"box\")\n", + "plt.title(r\"$L^{\\infty}$ unit ball: $\\max\\{|x|,|y|\\} \\leq 1$\")\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "6da5a661", + "metadata": {}, + "source": [ + "### Polynomial of best fit\n", + "\n", + "First let us generate the data and show it in a simple scatter plot. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5e1a23e5", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# 1) Generate quadratic data\n", + "np.random.seed(3)\n", + "\n", + "n = 50\n", + "x = np.random.uniform(-5, 5, n) # symmetric, wider range\n", + "\n", + "# True relationship: y = ax^2 + c + noise\n", + "a_true = 2.0\n", + "c_true = 5.0\n", + "noise = np.random.normal(0, 3, n)\n", + "\n", + "y = a_true * x**2 + c_true + noise" + ] + }, + { + "cell_type": "markdown", + "id": "8d9a1312", + "metadata": {}, + "source": [ + "Now to generate the scatter plot." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "49a23ed5", + "metadata": {}, + "outputs": [], + "source": [ + "# add the scatter points to the plot\n", + "plt.scatter(x,y)\n", + "\n", + "# plot it\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "096dd9c7", + "metadata": {}, + "source": [ + "As for a *line of best fit*, the following will generate the scatter plot vs. the line." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f74ce23e", + "metadata": {}, + "outputs": [], + "source": [ + "# find a line of best fit\n", + "a,b = np.polyfit(x, y, 1)\n", + "\n", + "# add scatter points to plot\n", + "plt.scatter(x,y)\n", + "\n", + "# add line of best fit to plot\n", + "plt.plot(x, a*x + b, 'r', linewidth=1)\n", + "\n", + "# plot it\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "74f4c071", + "metadata": {}, + "source": [ + "Now let us do the quadratic of best fit on top of the scatter plot. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "173b5610", + "metadata": {}, + "outputs": [], + "source": [ + "# polynomial fit with degree = 2\n", + "poly = np.polyfit(x,y,2)\n", + "model = np.poly1d(poly)\n", + "\n", + "# add scatter points to plot\n", + "plt.scatter(x,y)\n", + "\n", + "# add the quadratic to the plot\n", + "polyline=np.linspace(x.min(), x.max())\n", + "plt.plot(polyline, model(polyline), 'r', linewidth=1)\n", + "\n", + "# plot it\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "66cacbf7", + "metadata": {}, + "source": [ + "# Bibliography\n", + "\n", + "## Mathematics\n", + "\n", + "- Gene H. Golub and Charles F. Van Loan, *Matrix Computations*. John Hopkins University Press, 2013.\n", + "- Mark H. Holmes, *Introduction to scientific computing and data analysis*. Vol. 13. Springer Nature, 2023. \n", + "- David C. Lay, Steven R. Lay, and Judith J. McDonald, *Linear Algebra and Its Applications*, Pearson, 2021. ISBN 013588280X.\n", + "- https://ubcmath.github.io/MATH307/index.html\n", + "- https://eecs16b.org/notes/fa23/note16.pdf\n", + "- https://en.wikipedia.org/wiki/Low-rank_approximation\n", + "- https://www-labs.iro.umontreal.ca/~grabus/courses/ift6760_W20_files/lecture-5.pdf\n", + "- https://www.statology.org/polynomial-regression-python/\n", + "- https://en.wikipedia.org/wiki/Mean_squared_error\n", + "- https://en.wikipedia.org/wiki/Peak_signal-to-noise_ratio\n", + "\n", + "## Python\n", + "### Numpy (https://numpy.org/doc/stable/index.html)\n", + "- numpy basics: https://numpy.org/doc/stable/user/absolute_beginners.html\n", + "- numpy.array: https://numpy.org/doc/stable/reference/generated/numpy.array.html\n", + "- numpy.hstack: https://numpy.org/doc/stable/reference/generated/numpy.hstack.html (Stack arrays in sequence horizontally (column wise).)\n", + "- numpy.column_stack: https://numpy.org/doc/stable/reference/generated/numpy.column_stack.html (Stack 1-D arrays as columns into a 2-D array.)\n", + "- numpy.shape: https://numpy.org/doc/stable/reference/generated/numpy.shape.html (Return the shape of an array.)\n", + "- numpy.polyfit: https://numpy.org/doc/stable/reference/generated/numpy.polyfit.html (Least squares polynomial fit.)\n", + "- numpy.mean: https://numpy.org/doc/stable/reference/generated/numpy.mean.html (Compute the arithmetic mean along the specified axis.)\n", + "- numyp.poly1d: https://numpy.org/doc/stable/reference/generated/numpy.poly1d.html (A one-dimensional polynomial class.)\n", + "- numpy.set_printoptions: https://numpy.org/doc/stable/reference/generated/numpy.set_printoptions.html (These options determine the way floating point numbers, arrays and other NumPy objects are displayed.)\n", + "- numpy.finfo: https://numpy.org/doc/stable/reference/generated/numpy.finfo.html (Machine limits for floating point types.)\n", + "- numpy.logspace: https://numpy.org/doc/stable/reference/generated/numpy.logspace.html (Return numbers spaced evenly on a log scale.)\n", + "- numpy.sum: https://numpy.org/doc/stable/reference/generated/numpy.sum.html (Sum of array elements over a given axis.)\n", + "- numpy.abs: https://numpy.org/doc/stable/reference/generated/numpy.absolute.html (Calculate the absolute value element-wise.)\n", + "- numpy.ndarray.T: https://numpy.org/doc/stable/reference/generated/numpy.ndarray.T.html (View of the transposed array.)\n", + "- numpy.ones: https://numpy.org/doc/stable/reference/generated/numpy.ones.html (Return a new array of given shape and type, filled with ones.)\n", + "- numpy.zeros: https://numpy.org/doc/stable/reference/generated/numpy.zeros.html (Return a new array of given shape and type, filled with zeros.)\n", + "- numpy.diag: https://numpy.org/doc/stable/reference/generated/numpy.diag.html (Extract a diagonal or construct a diagonal array.)\n", + "- numpy.cumsum: https://numpy.org/doc/stable/reference/generated/numpy.cumsum.html (Return the cumulative sum of the elements along a given axis.)\n", + "- numpy.meshgrid: https://numpy.org/doc/stable/reference/generated/numpy.meshgrid.html (Return a tuple of coordinate matrices from coordinate vectors.)\n", + "- numpy.linspace: https://numpy.org/doc/stable/reference/generated/numpy.linspace.html (Return evenly spaced numbers over a specified interval.)\n", + "- numpy.ravel: https://numpy.org/doc/stable/reference/generated/numpy.ravel.html (Return a contiguous flattened array.)\n", + "- numpy.vstack: https://numpy.org/doc/stable/reference/generated/numpy.vstack.html (Stack arrays in sequence vertically (row wise).)\n", + "\n", + "#### numpy.random (https://numpy.org/doc/stable/reference/random/index.html)\n", + "- numpy.random.seed: https://numpy.org/doc/stable/reference/random/generated/numpy.random.seed.html (Reseed the singleton RandomState instance.)\n", + "- numpy.random.normal: https://numpy.org/doc/stable/reference/random/generated/numpy.random.normal.html (Draw random samples from a normal (Gaussian) distribution.)\n", + "- numpy.random.default_rng: https://numpy.org/doc/stable/reference/random/generator.html (Construct a new Generator with the default BitGenerator (PCG64).)\n", + "- numpy.random.uniform: https://numpy.org/doc/stable/reference/random/generated/numpy.random.uniform.html (Draw samples from a uniform distribution.)\n", + "\n", + "#### numpy.linalg (https://numpy.org/doc/stable/reference/routines.linalg.html)\n", + "- numpy.linalg.qr: https://numpy.org/doc/stable/reference/generated/numpy.linalg.qr.html (Compute the qr factorization of a matrix.\n", + "- numpy.linalg.svd: https://numpy.org/doc/stable/reference/generated/numpy.linalg.svd.html (Singular Value Decomposition.)\n", + "- numpy.linalg.solve: https://numpy.org/doc/stable/reference/generated/numpy.linalg.solve.html (Solve a linear matrix equation, or system of linear scalar equations.)\n", + "- numpy.linalg.lstsq: https://numpy.org/doc/stable/reference/generated/numpy.linalg.lstsq.html (Return the least-squares solution to a linear matrix equation.)\n", + "- numpy.linalg.norm: https://numpy.org/doc/stable/reference/generated/numpy.linalg.norm.html (Matrix or vector norm.)\n", + "- numpy.linalg.pinv: https://numpy.org/doc/stable/reference/generated/numpy.linalg.pinv.html (Compute the (Moore-Penrose) pseudo-inverse of a matrix.)\n", + "- numpy.linalg.cond: https://numpy.org/doc/stable/reference/generated/numpy.linalg.cond.html (Compute the condition number of a matrix.)\n", + "\n", + "### Matplotlib (https://matplotlib.org/stable/users/getting_started/)\n", + "- matplotlib.pyplot: https://matplotlib.org/stable/api/pyplot_summary.html\n", + "- matplotlib.figure: https://matplotlib.org/stable/api/figure_api.html (Implements the following classes: `Figure` and `SubFigure`)\n", + "- mpl_toolkits.mplot3d.axes3d.Axes3D.plot_surface: https://matplotlib.org/stable/api/_as_gen/mpl_toolkits.mplot3d.axes3d.Axes3D.plot_surface.html#mpl_toolkits.mplot3d.axes3d.Axes3D.plot_surface (Create a surface plot.)\n", + "\n", + "#### matplotlib.pyplot\n", + "- matplotlib.pyplot.plot: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.plot.html (Plot y versus x as lines and/or markers.)\n", + "- matplotlib.pyplot.quiver: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.quiver.html (Plot a 2D field of arrows.)\n", + "- matplotlib.pyplot.tight_layout: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.tight_layout.html (Adjust the padding between and around subplots.)\n", + "- matplotlib.pyplot.legend: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.legend.html (Place a legend on the Axes.)\n", + "- matplotlib.pyplot.show: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.show.html (Display all open figures.)\n", + "- matplotlib.pyplot.xlabel: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.xlabel.html (Set the label for the x-axis.)\n", + "- matplotlib.pyplot.ylabel: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.ylabel.html (Set the label for the y-axis.)\n", + "- matplotlib.pyplot.title: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.title.html (Set a title for the Axes.)\n", + "- matplotlib.pyplot.scatter: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.scatter.html (A scatter plot of y vs. x with varying marker size and/or color.)\n", + "- matplotlib.pyplot.imshow: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.imshow.html (Display data as an image, i.e., on a 2D regular raster.)\n", + "- matplotlib.pyplot.axis: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.axis.html (Convenience method to get or set some axis properties.)\n", + "- matplotlib.pyplot.semilogy: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.semilogy.html (Make a plot with log scaling on the y-axis.)\n", + "- matplotlib.pyplot.subplots: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.subplots.html (Create a figure and a set of subplots.)\n", + "- matplotlib.pyplot.contour: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.contour.html (Plot contour lines.)\n", + "- matplotlib.pyplot.contourf: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.contourf.html (Plot filled contours.)\n", + "- matplotlib.pyplot.axhline: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.axhline.html (Add a horizontal line spanning the whole or fraction of the Axes.)\n", + "- matplotlib.pyplot.axvline: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.axvline.html (Add a vertical line spanning the whole or fraction of the Axes.)\n", + "- matplotlib.pyplot.gca: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.gca.html (Get the current Axes.)\n", + "\n", + "#### matplotlib.figure\n", + "- matplotlib.figure.Figure.add_subplot : https://matplotlib.org/stable/api/_as_gen/matplotlib.figure.Figure.add_subplot.html (Add an `Axes` to the figure as part of a subplot arrangement.)]\n", + "\n", + "#### matplotlib.axes\n", + "- matplotlib.axes.Axes.set_title: https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_title.html (Set a title for the Axes.)\n", + "- matplotlib.axes.Axes.imshow: https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.imshow.html (Display data as an image, i.e., on a 2D regular raster.)\n", + "- matplotlib.axes.Axes.axis: https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.axis.html (Convenience method to get or set some axis properties.)\n", + "- matplotlib.axes.Axes.text: https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.text.html (Add text to the Axes.)\n", + "- matplotlib.axes.Axes.set_xlabel: https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_xlabel.html (Set the label for the x-axis.)\n", + "- matplotlib.axes.Axes.set_ylabel: https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_ylabel.html (Set the label for the y-axis.)\n", + "- matplotlib.axes.Axes.set_xlim: https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_xlim.html (Set the x-axis view limits.)\n", + "- matplotlib.axes.Axes.set_aspect: https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_aspect.html (Set the aspect ratio of the Axes scaling, i.e. y/x-scale.)\n", + "\n", + "#### Scatter plots with line of best fit\n", + "- https://stackoverflow.com/questions/37234163/how-to-add-a-line-of-best-fit-to-scatter-plot\n", + "- https://www.statology.org/line-of-best-fit-python/\n", + "- https://stackoverflow.com/questions/6148207/linear-regression-with-matplotlib-numpy\n", + "\n", + "### Pandas\n", + "- pandas basics: https://pandas.pydata.org/docs/user_guide/index.html\n", + "- pandas.DataFrame: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html (Two-dimensional, size-mutable, potentially heterogeneous tabular data.)\n", + "#### pandas.DataFrame\n", + "- pandas.DataFrame.describe: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.describe.html (Generate descriptive statistics.)\n", + "- pandas.DataFrame.corr: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.corr.html (Compute pairwise correlation of columns, excluding NA/null values.)\n", + "- pandas.DataFrame.to_numpy: https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.to_numpy.html (Convert the DataFrame to a NumPy array.)\n", + "- pandas.DataFrame.plot: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.plot.html (Make plots of Series or DataFrame.)\n", + "\n", + "### Pillow\n", + "- PIL basics: https://pillow.readthedocs.io/en/stable/\n", + "- PIL.Image: https://pillow.readthedocs.io/en/stable/reference/Image.html\n", + "\n", + "### Math\n", + "- Math basics: https://docs.python.org/3/library/math.html\n", + "- math.ceil: https://docs.python.org/3/library/math.html#math.ceil (Return the ceiling of x, the smallest integer greater than or equal to x)\n", + "\n", + "\n", + "# License\n", + "\n", + "This project is licensed under the MIT License.\n", + "See the [`LICENSE`](./LICENSE) file for details." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "python", + "version": "3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/html/01_least_squares.html b/notebooks/html/01_least_squares.html new file mode 100644 index 0000000..cebce70 --- /dev/null +++ b/notebooks/html/01_least_squares.html @@ -0,0 +1,9027 @@ + + + + + +01_least_squares + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+ + diff --git a/notebooks/html/02_qr_svd.html b/notebooks/html/02_qr_svd.html new file mode 100644 index 0000000..a7bf886 --- /dev/null +++ b/notebooks/html/02_qr_svd.html @@ -0,0 +1,8586 @@ + + + + + +02_qr_svd + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + diff --git a/notebooks/html/03_some_notes_and_what_goes_wrong.html b/notebooks/html/03_some_notes_and_what_goes_wrong.html new file mode 100644 index 0000000..43603dc --- /dev/null +++ b/notebooks/html/03_some_notes_and_what_goes_wrong.html @@ -0,0 +1,8000 @@ + + + + + +03_some_notes_and_what_goes_wrong + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/notebooks/html/04_pca.html b/notebooks/html/04_pca.html new file mode 100644 index 0000000..db36e7c --- /dev/null +++ b/notebooks/html/04_pca.html @@ -0,0 +1,8332 @@ + + + + + +04_pca + + + + + + + + + + + + +
+ + + + + + + + + + +
+ + diff --git a/notebooks/svd_image_denoising_color.ipynb b/notebooks/svd_image_denoising_color.ipynb new file mode 100644 index 0000000..c9d2122 --- /dev/null +++ b/notebooks/svd_image_denoising_color.ipynb @@ -0,0 +1,455 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "6ae6c7f8", + "metadata": {}, + "source": [ + "# Spectral Image Denoising via Truncated SVD\n", + "\n", + "This notebook extracts the image denoising project into a standalone workflow and extends it from **grayscale images** to **actual color images**.\n", + "\n", + "The core idea is the same as in the original write-up: if an image matrix has singular value decomposition\n", + "\\[\n", + "A = U \\Sigma V^T,\n", + "\\]\n", + "then the best rank-$k$ approximation to \\(A\\) in Frobenius norm is obtained by truncating the SVD. This is the **Eckart–Young–Mirsky theorem**.\n", + "\n", + "For a grayscale image, the image is a single matrix. For an RGB image, we treat the image as **three matrices**, one for each channel, and apply truncated SVD to each channel separately." + ] + }, + { + "cell_type": "markdown", + "id": "31a665c9", + "metadata": {}, + "source": [ + "## Outline\n", + "\n", + "1. Load an image from disk\n", + "2. Convert it to grayscale or keep it in RGB\n", + "3. Add synthetic Gaussian noise\n", + "4. Compute a truncated SVD reconstruction\n", + "5. Compare the original, noisy, and denoised images\n", + "6. Measure quality using MSE and PSNR\n", + "\n", + "This notebook is written so that you can use **your own image files** directly." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "88584c56", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from PIL import Image\n", + "from pathlib import Path" + ] + }, + { + "cell_type": "markdown", + "id": "f275cbc9", + "metadata": {}, + "source": [ + "## Helper functions\n", + "\n", + "We begin with some utilities for:\n", + "- loading images,\n", + "- adding Gaussian noise,\n", + "- reconstructing rank-$k$ approximations,\n", + "- computing image-quality metrics." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "21adfcaf", + "metadata": {}, + "outputs": [], + "source": [ + "def load_image(path, mode=\"rgb\"):\n", + " \"\"\"\n", + " Load an image from disk.\n", + "\n", + " Parameters\n", + " ----------\n", + " path : str or Path\n", + " Path to the image file.\n", + " mode : {\"rgb\", \"gray\"}\n", + " Whether to load the image as RGB or grayscale.\n", + "\n", + " Returns\n", + " -------\n", + " np.ndarray\n", + " Float image array scaled to [0, 255].\n", + " Shape is (H, W, 3) for RGB and (H, W) for grayscale.\n", + " \"\"\"\n", + " path = Path(path)\n", + " img = Image.open(path)\n", + "\n", + " if mode.lower() in {\"gray\", \"grayscale\", \"l\"}:\n", + " img = img.convert(\"L\")\n", + " else:\n", + " img = img.convert(\"RGB\")\n", + "\n", + " return np.asarray(img, dtype=np.float64)\n", + "\n", + "\n", + "def show_image(img, title=None):\n", + " \"\"\"Display a grayscale or RGB image.\"\"\"\n", + " plt.figure(figsize=(6, 6))\n", + " if img.ndim == 2:\n", + " plt.imshow(np.clip(img, 0, 255), cmap=\"gray\", vmin=0, vmax=255)\n", + " else:\n", + " plt.imshow(np.clip(img, 0, 255).astype(np.uint8))\n", + " if title is not None:\n", + " plt.title(title)\n", + " plt.axis(\"off\")\n", + " plt.show()\n", + "\n", + "\n", + "def add_gaussian_noise(img, sigma=25, seed=0):\n", + " \"\"\"\n", + " Add Gaussian noise to an image.\n", + "\n", + " Parameters\n", + " ----------\n", + " img : np.ndarray\n", + " Image array in [0, 255].\n", + " sigma : float\n", + " Standard deviation of the noise.\n", + " seed : int\n", + " Random seed for reproducibility.\n", + "\n", + " Returns\n", + " -------\n", + " np.ndarray\n", + " Noisy image clipped to [0, 255].\n", + " \"\"\"\n", + " rng = np.random.default_rng(seed)\n", + " noisy = img + rng.normal(loc=0.0, scale=sigma, size=img.shape)\n", + " return np.clip(noisy, 0, 255)\n", + "\n", + "\n", + "def truncated_svd_matrix(A, k):\n", + " \"\"\"\n", + " Return the rank-k truncated SVD approximation of a 2D matrix A.\n", + " \"\"\"\n", + " U, s, Vt = np.linalg.svd(A, full_matrices=False)\n", + " k = min(k, len(s))\n", + " return (U[:, :k] * s[:k]) @ Vt[:k, :]\n", + "\n", + "\n", + "def truncated_svd_image(img, k):\n", + " \"\"\"\n", + " Apply truncated SVD to a grayscale or RGB image.\n", + "\n", + " For RGB images, truncated SVD is applied channel-by-channel.\n", + "\n", + " Parameters\n", + " ----------\n", + " img : np.ndarray\n", + " Shape (H, W) for grayscale or (H, W, 3) for RGB.\n", + " k : int\n", + " Truncation rank.\n", + "\n", + " Returns\n", + " -------\n", + " np.ndarray\n", + " Reconstructed image clipped to [0, 255].\n", + " \"\"\"\n", + " if img.ndim == 2:\n", + " recon = truncated_svd_matrix(img, k)\n", + " return np.clip(recon, 0, 255)\n", + "\n", + " if img.ndim == 3:\n", + " channels = []\n", + " for c in range(img.shape[2]):\n", + " channel_recon = truncated_svd_matrix(img[:, :, c], k)\n", + " channels.append(channel_recon)\n", + " recon = np.stack(channels, axis=2)\n", + " return np.clip(recon, 0, 255)\n", + "\n", + " raise ValueError(\"Image must be either 2D (grayscale) or 3D (RGB).\")\n", + "\n", + "\n", + "def mse(A, B):\n", + " \"\"\"Mean squared error between two images.\"\"\"\n", + " return np.mean((A.astype(np.float64) - B.astype(np.float64)) ** 2)\n", + "\n", + "\n", + "def psnr(A, B, max_val=255.0):\n", + " \"\"\"Peak signal-to-noise ratio in decibels.\"\"\"\n", + " err = mse(A, B)\n", + " if err == 0:\n", + " return np.inf\n", + " return 10 * np.log10((max_val ** 2) / err)" + ] + }, + { + "cell_type": "markdown", + "id": "fe1d4932", + "metadata": {}, + "source": [ + "## Choose an image\n", + "\n", + "Set `IMAGE_PATH` to any real image on your machine.\n", + "\n", + "Examples:\n", + "- `\"bella.jpg\"`\n", + "- `\"my_photo.png\"`\n", + "- `\"images/dog.jpeg\"`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "42bafca5", + "metadata": {}, + "outputs": [], + "source": [ + "IMAGE_PATH = \"bella.jpg\" # change this to your actual file\n", + "MODE = \"rgb\" # use \"gray\" for grayscale, \"rgb\" for color\n", + "\n", + "img = load_image(IMAGE_PATH, mode=MODE)\n", + "print(\"Image shape:\", img.shape)\n", + "show_image(img, title=f\"Original image ({MODE})\")" + ] + }, + { + "cell_type": "markdown", + "id": "05e52222", + "metadata": {}, + "source": [ + "## Add synthetic Gaussian noise\n", + "\n", + "We add noise so that the denoising effect is visible and measurable." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "528e69b3", + "metadata": {}, + "outputs": [], + "source": [ + "sigma = 25\n", + "seed = 0\n", + "\n", + "img_noisy = add_gaussian_noise(img, sigma=sigma, seed=seed)\n", + "show_image(img_noisy, title=f\"Noisy image (sigma={sigma})\")" + ] + }, + { + "cell_type": "markdown", + "id": "1bbcc1d8", + "metadata": {}, + "source": [ + "## Visualizing rank-$k$ reconstructions\n", + "\n", + "For small \\(k\\), the reconstruction captures only coarse structure.\n", + "As \\(k\\) increases, more detail returns. For denoising, there is often a useful middle ground:\n", + "enough singular values to preserve structure, but not so many that we reintroduce noise." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "563df53a", + "metadata": {}, + "outputs": [], + "source": [ + "ks = [5, 20, 50, 100]\n", + "\n", + "ncols = len(ks) + 2\n", + "fig, axes = plt.subplots(1, ncols, figsize=(4 * ncols, 4))\n", + "\n", + "# Original\n", + "if img.ndim == 2:\n", + " axes[0].imshow(img, cmap=\"gray\", vmin=0, vmax=255)\n", + "else:\n", + " axes[0].imshow(np.clip(img, 0, 255).astype(np.uint8))\n", + "axes[0].set_title(\"Original\")\n", + "axes[0].axis(\"off\")\n", + "\n", + "# Noisy\n", + "if img_noisy.ndim == 2:\n", + " axes[1].imshow(img_noisy, cmap=\"gray\", vmin=0, vmax=255)\n", + "else:\n", + " axes[1].imshow(np.clip(img_noisy, 0, 255).astype(np.uint8))\n", + "axes[1].set_title(\"Noisy\")\n", + "axes[1].axis(\"off\")\n", + "\n", + "# Reconstructions\n", + "for ax, k in zip(axes[2:], ks):\n", + " recon = truncated_svd_image(img_noisy, k)\n", + " if recon.ndim == 2:\n", + " ax.imshow(recon, cmap=\"gray\", vmin=0, vmax=255)\n", + " else:\n", + " ax.imshow(np.clip(recon, 0, 255).astype(np.uint8))\n", + " ax.set_title(f\"k = {k}\")\n", + " ax.axis(\"off\")\n", + "\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "309579fa", + "metadata": {}, + "source": [ + "## Quantitative evaluation\n", + "\n", + "We compare each reconstruction against the **clean original image**, not against the noisy one.\n", + "A good denoising rank should typically:\n", + "- reduce MSE relative to the noisy image,\n", + "- increase PSNR relative to the noisy image." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "56ce07ee", + "metadata": {}, + "outputs": [], + "source": [ + "baseline_mse = mse(img, img_noisy)\n", + "baseline_psnr = psnr(img, img_noisy)\n", + "\n", + "print(f\"Noisy image baseline -> MSE: {baseline_mse:.2f}, PSNR: {baseline_psnr:.2f} dB\")\n", + "\n", + "results = []\n", + "for k in ks:\n", + " recon = truncated_svd_image(img_noisy, k)\n", + " results.append((k, mse(img, recon), psnr(img, recon)))\n", + "\n", + "print(\"\\nRank-k reconstructions:\")\n", + "for k, m, p in results:\n", + " print(f\"k = {k:3d} | MSE = {m:10.2f} | PSNR = {p:6.2f} dB\")" + ] + }, + { + "cell_type": "markdown", + "id": "de9c3f3c", + "metadata": {}, + "source": [ + "## Automatic search over many values of \\(k\\)\n", + "\n", + "This is often useful because the best denoising rank is image-dependent." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e097dcf4", + "metadata": {}, + "outputs": [], + "source": [ + "candidate_ks = list(range(1, 151, 5))\n", + "\n", + "scores = []\n", + "for k in candidate_ks:\n", + " recon = truncated_svd_image(img_noisy, k)\n", + " scores.append((k, mse(img, recon), psnr(img, recon)))\n", + "\n", + "best_by_mse = min(scores, key=lambda x: x[1])\n", + "best_by_psnr = max(scores, key=lambda x: x[2])\n", + "\n", + "print(\"Best by MSE :\", best_by_mse)\n", + "print(\"Best by PSNR:\", best_by_psnr)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4b9dc5c7", + "metadata": {}, + "outputs": [], + "source": [ + "best_k = best_by_psnr[0]\n", + "best_recon = truncated_svd_image(img_noisy, best_k)\n", + "\n", + "fig, axes = plt.subplots(1, 3, figsize=(15, 5))\n", + "\n", + "if img.ndim == 2:\n", + " axes[0].imshow(img, cmap=\"gray\", vmin=0, vmax=255)\n", + " axes[1].imshow(img_noisy, cmap=\"gray\", vmin=0, vmax=255)\n", + " axes[2].imshow(best_recon, cmap=\"gray\", vmin=0, vmax=255)\n", + "else:\n", + " axes[0].imshow(np.clip(img, 0, 255).astype(np.uint8))\n", + " axes[1].imshow(np.clip(img_noisy, 0, 255).astype(np.uint8))\n", + " axes[2].imshow(np.clip(best_recon, 0, 255).astype(np.uint8))\n", + "\n", + "axes[0].set_title(\"Original\")\n", + "axes[1].set_title(\"Noisy\")\n", + "axes[2].set_title(f\"Best reconstruction (k={best_k})\")\n", + "\n", + "for ax in axes:\n", + " ax.axis(\"off\")\n", + "\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "87d08518", + "metadata": {}, + "source": [ + "## A note on color images\n", + "\n", + "For a grayscale image, SVD applies directly to a single matrix.\n", + "\n", + "For a color image \\(A \\in \\mathbb{R}^{n \\times p \\times 3}\\), we write\n", + "\\[\n", + "A = (A_R, A_G, A_B),\n", + "\\]\n", + "where each channel is an \\(n \\times p\\) matrix. We then compute a rank-\\(k\\) approximation for each channel:\n", + "\\[\n", + "A_R \\approx (A_R)_k,\\qquad\n", + "A_G \\approx (A_G)_k,\\qquad\n", + "A_B \\approx (A_B)_k,\n", + "\\]\n", + "and stack them back together.\n", + "\n", + "This is the most direct extension of the grayscale method, and it works well as a first linear-algebraic treatment of color denoising." + ] + }, + { + "cell_type": "markdown", + "id": "1a3acfe5", + "metadata": {}, + "source": [ + "## Remarks and possible extensions\n", + "\n", + "- The same rank \\(k\\) was used for every color channel. You could instead choose different ranks per channel.\n", + "- You can test this on photographs, scanned documents, or screenshots.\n", + "- Truncated SVD is excellent for illustrating low-rank structure, but it is not the only denoising method.\n", + "- A more advanced next step would be to compare SVD denoising against:\n", + " - Gaussian blur,\n", + " - median filtering,\n", + " - wavelet denoising,\n", + " - non-local means,\n", + " - autoencoder-based denoising.\n", + "\n", + "For this notebook, though, the point is to keep the method squarely grounded in linear algebra." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "python", + "version": "3.x" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/pictures/bella_grayscale.jpg b/pictures/bella_grayscale.jpg deleted file mode 100644 index 492c9659e2fd7194e92a554794c2ba09b20c294e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23792 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 rGSW;1t?$KCkUgFevkbJ3n^Pj diff --git a/pictures/bella_grayscale_noisy.jpg b/pictures/bella_grayscale_noisy.jpg deleted file mode 100644 index 1afc096968c363d74a5702868c6d401726ea8754..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17638 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 K{C61mHTgg9Z>zZg diff --git a/pictures/bella_grayscale_svd_200_500_1000_3000.jpg b/pictures/bella_grayscale_svd_200_500_1000_3000.jpg deleted file mode 100644 index 1ffc61615841bfa35cac8bde8569952d7bfec884..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47280 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