From 15c1ad669bc4001b2e8c844a325990de6d068491 Mon Sep 17 00:00:00 2001 From: Lillian Weng Date: Thu, 18 Apr 2024 13:34:40 -0700 Subject: [PATCH] pca2 edits --- pca_1/images/optimization_takeaways.png | Bin 0 -> 51814 bytes pca_1/pca_1.qmd | 5 +- pca_2/data/rectangle_data.csv | 101 +++++++ pca_2/images/Z.png | Bin 0 -> 13413 bytes {pca_1 => pca_2}/images/diag_matrix.png | Bin {pca_1 => pca_2}/images/orthonormal.png | Bin pca_2/images/s.png | Bin 0 -> 37552 bytes {pca_1 => pca_2}/images/sigma.png | Bin {pca_1 => pca_2}/images/svd.png | Bin {pca_1 => pca_2}/images/svd_geo.png | Bin {pca_1 => pca_2}/images/u.png | Bin {pca_1 => pca_2}/images/v.png | Bin pca_2/pca_2.qmd | 353 ++++++++++++++---------- probability_1/probability_1.qmd | 4 +- 14 files changed, 307 insertions(+), 156 deletions(-) create mode 100644 pca_1/images/optimization_takeaways.png create mode 100644 pca_2/data/rectangle_data.csv create mode 100644 pca_2/images/Z.png rename {pca_1 => pca_2}/images/diag_matrix.png (100%) rename {pca_1 => pca_2}/images/orthonormal.png (100%) create mode 100644 pca_2/images/s.png rename {pca_1 => pca_2}/images/sigma.png (100%) rename {pca_1 => pca_2}/images/svd.png (100%) rename {pca_1 => pca_2}/images/svd_geo.png (100%) rename {pca_1 => pca_2}/images/u.png (100%) rename {pca_1 => pca_2}/images/v.png (100%) diff --git a/pca_1/images/optimization_takeaways.png b/pca_1/images/optimization_takeaways.png new file mode 100644 index 0000000000000000000000000000000000000000..3b3da0ee9819dbbd5b80d9443afd6c43e9e7f765 GIT binary patch literal 51814 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®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 literal 0 HcmV?d00001 diff --git a/pca_1/pca_1.qmd b/pca_1/pca_1.qmd index 18ffcbcc..e622888a 100644 --- a/pca_1/pca_1.qmd +++ b/pca_1/pca_1.qmd @@ -284,10 +284,11 @@ $$\begin{aligned} This result implies that: -* $w$ is a **unitary eigenvector** of the covariance matrix. +* $w$ is a **unitary eigenvector** of the covariance matrix. This means that $||w||^2 = ww^T = 1$ * The error is minimized when $w$ is the eigenvector with the largest eigenvalue $\lambda$. This derivation can inductively be used for the next (second) principal component (not shown). -The final takeaway from this derivation is that the **principal components** are the **eigenvectors** with the **largest eigenvalues** of the **covariance matrix**. These are the **directions** of the **maximum variance** of the data. +The final takeaway from this derivation is that the **principal components** are the **eigenvectors** with the **largest eigenvalues** of the **covariance matrix**. These are the **directions** of the **maximum variance** of the data. We can construct the **latent factors (the Z matrix)** by **projecting** the centered data X onto the principal component vectors: +
diff --git a/pca_2/data/rectangle_data.csv b/pca_2/data/rectangle_data.csv new file mode 100644 index 00000000..8a19d206 --- /dev/null +++ b/pca_2/data/rectangle_data.csv @@ -0,0 +1,101 @@ +width,height,area,perimeter +8,6,48,28 +2,4,8,12 +1,3,3,8 +9,3,27,24 +9,8,72,34 +3,1,3,8 +4,2,8,12 +6,5,30,22 +7,1,7,16 +8,2,16,20 +5,5,25,20 +9,5,45,28 +8,4,32,24 +1,2,2,6 +2,9,18,22 +7,8,56,30 +7,5,35,24 +2,4,8,12 +2,5,10,14 +4,3,12,14 +8,1,8,18 +8,5,40,26 +9,8,72,34 +7,3,21,20 +8,3,24,22 +6,6,36,24 +6,4,24,20 +8,4,32,24 +7,2,14,18 +4,4,16,16 +4,1,4,10 +9,7,63,32 +4,2,8,12 +1,2,2,6 +8,1,8,18 +5,4,20,18 +9,5,45,28 +6,9,54,30 +3,7,21,20 +7,3,21,20 +7,7,49,28 +3,3,9,12 +5,5,25,20 +7,3,21,20 +8,2,16,20 +2,6,12,16 +7,1,7,16 +1,2,2,6 +3,5,15,16 +2,6,12,16 +5,6,30,22 +9,1,9,20 +6,3,18,18 +2,6,12,16 +6,8,48,28 +9,1,9,20 +2,8,16,20 +3,7,21,20 +6,5,30,22 +8,6,48,28 +9,2,18,22 +3,9,27,24 +2,5,10,14 +1,4,4,10 +3,3,9,12 +2,9,18,22 +6,4,24,20 +5,2,10,14 +2,6,12,16 +2,5,10,14 +1,3,3,8 +1,3,3,8 +6,7,42,26 +8,6,48,28 +2,7,14,18 +4,6,24,20 +1,1,1,4 +9,8,72,34 +5,5,25,20 +3,9,27,24 +2,8,16,20 +2,2,4,8 +8,3,24,22 +1,8,8,18 +5,1,5,12 +5,7,35,24 +9,5,45,28 +3,1,3,8 +9,7,63,32 +8,5,40,26 +9,8,72,34 +4,5,20,18 +4,5,20,18 +1,5,5,12 +6,6,36,24 +8,5,40,26 +8,7,56,30 +1,4,4,10 +1,6,6,14 +2,6,12,16 diff --git a/pca_2/images/Z.png b/pca_2/images/Z.png new file mode 100644 index 0000000000000000000000000000000000000000..63b01273067cc255c3aacc26ddb10fd3f1cf27c3 GIT binary patch literal 13413 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 -### $\Sigma$ +### $S$ -* $\Sigma$ is a $d \times d$ matrix: $\Sigma \in \mathbb{R}^{d \times d}$. +* $S$ is a $d \times d$ matrix: $S \in \mathbb{R}^{d \times d}$. * The majority of the matrix is zero * It has $r$ **non-zero** **singular values**, and $r$ is the rank of $X$ -* Diagonal values (**singular values** $\sigma_1, \sigma_2, ... \sigma_r$), are ordered from greatest to least $\sigma_1 > \sigma_2 > ... > \sigma_r$ -* We can think of $\Sigma$ as scaling. +* Diagonal values (**singular values** $s_1, s_2, ... s_r$), are **non-negative** ordered from greatest to least: $s_1 \ge s_2 \ge ... \ge s_r > 0$ +* We can think of $S$ as scaling. -
+
### $V^T$ @@ -95,12 +95,12 @@ Let's break down each of these terms one by one.
-### SVD: Geometric Perspective + ### SVD in `NumPy` For this demo, we'll continue working with our rectangular dataset from before with $n=100$ rows and $d=4$ columns. @@ -122,7 +122,7 @@ rectangle = pd.read_csv("data/rectangle_data.csv") rectangle.head(5) ``` -In `NumPy`, the SVD algorithm is already written and can be called with `np.linalg.svd` ([documentation](https://numpy.org/doc/stable/reference/generated/numpy.linalg.svd.html)). There are multiple versions of SVD; to get the version that we will follow, we need to set the `full_matrices` parameter to `False`. +In `NumPy`, the SVD decomposition function can be called with `np.linalg.svd` ([documentation](https://numpy.org/doc/stable/reference/generated/numpy.linalg.svd.html)). There are multiple versions of SVD; to get the version that we will follow, we need to set the `full_matrices` parameter to `False`. ```{python} #| vscode: {languageId: python} @@ -143,7 +143,7 @@ The first 5 rows of `U` are shown below. pd.DataFrame(U).head(5) ``` -$\Sigma$ is a little different in `NumPy`. Since the only useful values in the diagonal matrix $\Sigma$ are the singular values on the diagonal axis, only those values are returned and they are stored in an array. +$S$ is a little different in `NumPy`. Since the only useful values in the diagonal matrix $S$ are the singular values on the diagonal axis, only those values are returned and they are stored in an array. Our `rectangle_data` has a rank of $3$, so we should have 3 non-zero singular values, **sorted from largest to smallest**. @@ -193,132 +193,80 @@ Principal Component Analysis (PCA) and Singular Value Decomposition (SVD) can be * SVD: a linear algebra algorithm that splits a matrix into 3 component parts. * PCA: a data science procedure used for dimensionality reduction that *uses* SVD as one of the steps. -In order to get the first $k$ principal components from an $n \times d$ matrix $X$, we: - -1. Center $X$ by subtracting the mean from each column. Notice how we specify `axis=0` so that the mean is computed per column. - -```{python} -#| vscode: {languageId: python} -centered_df = rectangle - np.mean(rectangle, axis = 0) -centered_df.head(5) -``` - -2. Get the Singular Value Decomposition of centered $X$: $U$, $Σ$ and $V^T$ - -```{python} -#| vscode: {languageId: python} -U, S, Vt = np.linalg.svd(centered_df, full_matrices = False) -Sm = pd.DataFrame(np.diag(np.round(S, 1))) -``` - -3. Multiply either $UΣ$ or $XV$. Mathematically, these give the same result, but computationally, floating point approximation results in slightly different numbers for very small values (check out the right-most column in the cells below). - -```{python} -#| vscode: {languageId: python} -# UΣ -pd.DataFrame(U @ np.diag(S)).head(5) -``` - -```{python} -#| vscode: {languageId: python} -# XV -pd.DataFrame(centered_df @ Vt.T).head(5) -``` - -4. Take the first $k$ columns of $UΣ$ (or $XV$). These are the first $k$ principal components of $X$. - -```{python} -#| vscode: {languageId: python} -two_PCs = (U @ np.diag(S))[:, :2] # using UΣ -two_PCs = (centered_df @ Vt.T).iloc[:, :2] # using XV -pd.DataFrame(two_PCs).head() -``` - -## (Bonus) PCA vs. Regression -### Regression: Minimizing Horizontal/Verticle Error - -Suppose we know the child mortality rate of a given country. Linear regression tries to predict the fertility rate from the mortality rate; for example, if the mortality is 6, we might guess the fertility is near 4. The regression line tells us the “best” prediction of fertility given all possible mortality values by minimizing the root mean squared error [see vertical red lines, only some shown]. - -
-
-We can also perform a regression in the reverse direction, that is, given the fertility, we try to predict the mortality. In this case, we get a different regression line which minimizes the root mean squared length of the horizontal lines. - -
- -### SVD: Minimizing Perpendicular Error -The rank 1 approximation is close but not the same as the mortality regression line. Instead of minimizing *horizontal* or *vertical* error, our rank 1 approximation minimizes the error *perpendicular* to the subspace onto which we’re projecting. That is, SVD finds the line such that if we project our data onto that line, the error between the projection and our original data is minimized. The similarity of the rank 1 approximation and the fertility was just a coincidence. Looking at adiposity and bicep size from our body measurements dataset, we see the 1D subspace onto which we are projecting is between the two regression lines. - -
- -### Beyond 1D and 2D -In higher dimensions, the idea behind principal components is just the same! Suppose we have 30-dimensional data and decide to use the first 5 principal components. Our procedure minimizes the error between the original 30-dimensional data and the projection of that 30-dimensional data on to the “best” 5-dimensional subspace. See [CS189](https://www.eecs189.org/static/notes/n10.pdf) for more details. - - -## (Bonus) Automatic Factorization - -One key fact to remember is that the decomposition are not arbitrary. The *rank* of a matrix limits how small our inner dimensions can be if we want to perfectly recreate our matrix. The proof for this is out of scope. - -Even if we know we have to factorize our matrix using an inner dimension of R, that still leaves a large space of solutions to traverse. What if we have a procedure to automatically factorize a rank R matrix into an R dimensional representation with some transformation matrix? - -- Lower dimensional representation avoids redundant features. -- Imagine a 1000-dimensional dataset: If the rank is only 5, it’s much easier to do EDA after this mystery procedure. - -What if we wanted a 2D representation? It's valuable to compress all of the data that is relevant onto as few dimensions as possible in order to plot it efficiently. Some 2D matrices yield better approximations than others. How well can we do? - + -*Setup*: Consider the design matrix $X \in \mathbb{R}^{n \times d}$, where the $j$-th column (corresponding to the $j$-th feature) is $x_j \in \mathbb{R}^n$ and the element in row $i$, column $j$ is $x_{ij}$. Further, define $\tilde{X}$ as the **centered** design matrix. The $j$-th column is $\tilde{x}_j \in \mathbb{R}^n$ and the element in row $i$, column $j$ is $\tilde{x}_{ij} = x_{ij} - \bar{x_j}$, where $\bar{x_j}$ is the mean of the $x_j$ column vector from the original $X$. +### Deriving Principal Components From SVD +After centering $X$ so that each column has a mean of 0, we find it's SVD: +$$ X = U S V^T $$ -*Variance*: Construct the **covariance matrix**: $\frac{1}{n} \tilde{X}^T \tilde{X} \in \mathbb{R}^{d \times d}$. The $j$-th element along the diagonal is the **variance** of the $j$-th column of the original design matrix $X$: +Because X is centered, the covariance matrix of X, $\Sigma$, is equal to $X^T X$. Rearranging this equation, we get -$$\left( \frac{1}{n} \tilde{X}^T \tilde{X} \right)_{jj} = \frac{1}{n} \tilde{x}_j ^T \tilde{x}_j = \frac{1}{n} \sum_{i=i}^n (\tilde{x}_{ij} )^2 = \frac{1}{n} \sum_{i=i}^n (x_{ij} - \bar{x_j})^2$$ +$$ +\begin{align} +\Sigma &= X^T X \\ + &= (U S V^T)^T U S V^T \\ + &= V S^T U^T U S V^T & \text{U is orthonormal, so $U^T U = I$} \\ + &= V S^2 V^T +\end{align} +$$ +Multiplying both sides by V, we get +$$ +\begin{align} +\Sigma V &= VS^2 V^T V \\ +&= V S^2 +\end{align} +$$ -*SVD*: Suppose singular value decomposition of the *centered* design matrix $\tilde{X}$ yields $\tilde{X} = U \Sigma V^T$, where $U \in \mathbb{R}^{n \times d}$ and $V \in \mathbb{R}^{d \times d}$ are matrices with orthonormal columns, and $\Sigma \in \mathbb{R}^{d \times d}$ is a diagonal matrix with singular values of $\tilde{X}$. +This shows that The columns of V are the **eigenvectors** of the covariance matrix Σ and therefore the **principal components**. Additionally, the squared singular values $S^2$ are the **eigenvalues** of Σ. -$$\begin{aligned} -\tilde{X}^T \tilde{X} &= (U \Sigma V^T )^T (U \Sigma V^T) \\ -&= V \Sigma U^T U \Sigma V^T & (\Sigma^T = \Sigma) \\ -&= V \Sigma^2 V^T & (U^T U = I) \\ -\frac{1}{n} \tilde{X}^T \tilde{X} &= \frac{1}{n} V \Sigma V^T =V \left( \frac{1}{n} \Sigma \right) V^T \\ -\frac{1}{n} \tilde{X}^T \tilde{X} V &= V \left( \frac{1}{n} \Sigma \right) V^T V = V \left( \frac{1}{n} \Sigma \right) & \text{(right multiply by }V \rightarrow V^T V = I \text{)} \\ -V^T \frac{1}{n} \tilde{X}^T \tilde{X} V &= V^T V \left( \frac{1}{n} \Sigma \right) = \frac{1}{n} \Sigma & \text{(left multiply by }V^T \rightarrow V^T V = I \text{)} \\ -\left( \frac{1}{n} \tilde{X}^T \tilde{X} \right)_{jj} &= \frac{1}{n}\sigma_j^2 & \text{(Define }\sigma_j\text{ as the} j\text{-th singular value)} \\ -\frac{1}{n} \sigma_j^2 &= \frac{1}{n} \sum_{i=i}^n (x_{ij} - \bar{x_j})^2 -\end{aligned}$$ -The last line defines the $j$-th component score. + +We've now shown that the first $k$ columns of $V$ (equivalently, the first $k$ rows of $V^{T}$) are the first k principal components of $X$. We can use them to construct the **latent vector representation** of $X$, $Z$, by projecting $X$ onto the principal components. -## PCA Review + +
slide16
-### PCA with SVD +From this equation $Z = X V$, we can compoute a second way to calculate $Z$: +$$ +\begin{align} +Z &= X V \\ + &= USV^T V \\ + &= U S +\end{align} +$$ -After finding the SVD of $X$: +$$Z = XV = US$$ -
slide15
+In other words, we can construct $X$'s' latent vector representation $Z$ through: +1. projecting $X$ onto the first $k$ columns of $V$, $V[:, :k]$ +2. multiplying the first $k$ columns of U and the first $k$ rows of S -We can derive the principal components of the data. Specifically, the first $n$ rows of $V^{T}$ are directions for the $n$ principal components. +Using $Z$, we can approximately recover the original $X$ matrix by multiplying $Z$ by $V^T$: +$$ Z V^T = XV V^T = USV^T = X$$ -### Columns of V are the Directions +### PCA Visualization
slide16
The elements of each column of $V$ (row of $V^{T}$) rotate the original feature vectors into a principal component. -The first column of V indicates how each feature contributes (e.g. positive, negative, etc.) to principal component 1. +The first column of $V$ indicates how each feature contributes (e.g. positive, negative, etc.) to principal component 1.
slide17
Coupled together, this interpretation also allows us to understand that: -1. The principal components are all **orthogonal** to each other because the columns of U are orthonormal. -2. Principal components are **axis-aligned**. That is, if you plot two PCs on a 2D plane, one will lie on the x-axis, the other on the y-axis. -3. Principal components are **linear combinations** of columns in our data X +* The principal components are all **orthogonal** to each other because the columns of U are orthonormal. +* Principal components are **axis-aligned**. That is, if you plot two PCs on a 2D plane, one will lie on the x-axis, the other on the y-axis. +* Principal components are **linear combinations** of columns in our data X ### Using Principal Components @@ -328,48 +276,65 @@ Let's summarize the steps to obtain Principal Components via SVD: 2. To find the $k$ **principal components**: - a. Compute the SVD of the data matrix ($X = U{\Sigma}V^{T}$) - b. The first $k$ columns of $U{\Sigma}$ (or equivalently, $XV$) contain the $k$ **principal components** of $X$. - -## Data Variance and Centering + a. Compute the SVD of the data matrix ($X = U{S}V^{T}$) + b. The first $k$ columns of $U{S}$ (or equivalently, $XV$) contain the $k$ **principal components** of $X$. -We define the total variance of a data matrix as the sum of variances of attributes. The principal components are a low-dimension representation that capture as much of the original data's total variance as possible. Formally, the $i$-th singular value tells us the **component score**, i.e., how much of the data variance is captured by the $i$-th principal component. Supposing the number of datapoints is $n$: - -$$\text{i-th component score} = \frac{(\text{i-th singular value}^2)}{n}$$ -Summing up the component scores is equivalent to computing the total variance *if we center our data*. - -**Data Centering**: PCA has a data centering step that precedes any singular value decomposition, where if implemented defines the component score as above. +### Code Demo +In order to get the first $k$ principal components from an $n \times d$ matrix $X$, we: -If you want to dive deeper into PCA, [Steve Brunton's SVD Video Series](https://www.youtube.com/playlist?list=PLMrJAkhIeNNSVjnsviglFoY2nXildDCcv) is a great resource. +1. Center $X$ by subtracting the mean from each column. Notice how we specify `axis=0` so that the mean is computed per column. -## Interpreting PCA +```{python} +#| vscode: {languageId: python} +centered_df = rectangle - np.mean(rectangle, axis = 0) +centered_df.head(5) +``` +2. Get the Singular Value Decomposition of centered $X$: $U$, $S$ and $V^T$ -### Case Study: House of Representatives Voting +```{python} +#| vscode: {languageId: python} +U, S, Vt = np.linalg.svd(centered_df, full_matrices = False) +Sm = pd.DataFrame(np.diag(np.round(S, 1))) +``` -Let's examine how the House of Representatives (of the 116th Congress, 1st session) voted in the month of September 2019. +3. Multiply either $UΣ$ or $XV$. Mathematically, these give the same result, but computationally, floating point approximation results in slightly different numbers for very small values (check out the right-most column in the cells below). -Specifically, we’ll look at the records of Roll call votes. From the U.S. Senate ([link](https://www.senate.gov/reference/Index/Votes.htm)): Roll call votes occur when a representative or senator votes "yea" or "nay" so that the names of members voting on each side are recorded. A voice vote is a vote in which those in favor or against a measure say "yea" or "nay," respectively, without the names or tallies of members voting on each side being recorded. +```{python} +#| vscode: {languageId: python} +# US +pd.DataFrame(U @ np.diag(S)).head(5) +``` -**Do legislators' roll call votes show a relationship with their political party?** +```{python} +#| vscode: {languageId: python} +# XV +pd.DataFrame(centered_df @ Vt.T).head(5) +``` -Please visit this [link](https://data100.datahub.berkeley.edu/hub/user-redirect/git-pull?repo=https%3A%2F%2Fgithub.com%2FDS-100%2Ffa23-student&urlpath=lab%2Ftree%2Ffa23-student%2Flecture%2Flec26%2Flec26-votes.ipynb&branch=main) to see the full Jupyter notebook demo. +4. Take the first $k$ columns of $US$ (or $XV$). These are the first $k$ principal components of $X$. -As shown in the demo, the primary goal of PCA is to transform observations from high-dimensional data down to low dimensions through linear transformations. +```{python} +#| vscode: {languageId: python} +two_PCs = (U @ np.diag(S))[:, :2] # using US +two_PCs = (centered_df @ Vt.T).iloc[:, :2] # using XV +pd.DataFrame(two_PCs).head() +``` -A related goal of PCA connects back to the idea that a low-dimension representation of the data should capture the variability of the original data. For example, if the first two singular values are large and the others are relatively small, then two dimensions are probably enough to describe most of what distinguishes one observation from another. However, if this is not the case, then a PCA scatter plot is probably omitting lots of information. +## Data Variance and Centering -We can use the following formulas to quantify the amount each principal component contributes to the total variance: +We define the total variance of a data matrix as the sum of variances of attributes. The principal components are a low-dimension representation that capture as much of the original data's total variance as possible. Formally, the $i$-th singular value tells us the **component score**, i.e., how much of the data variance is captured by the $i$-th principal component. Supposing the number of datapoints is $n$: -$$ \text{component score} = \frac{\sigma_i^{2}}{N}$$ +$$\text{i-th component score} = \frac{(\text{i-th singular value}^2)}{n}$$ -$$ \text{total variance} = \text{sum of all the component scores} = \sum_{i=1}^k \frac{\sigma_i^{2}}{N} $$ +Summing up the component scores is equivalent to computing the total variance *if we center our data*. -$$ \text{variance ratio of principal component i} = \frac{\text{component score i}}{\text{total variance}} = \frac{\sigma_i^{2} / N}{\sum_{i=1}^k \sigma_i^{2} / N}$$ +**Data Centering**: PCA has a data centering step that precedes any singular value decomposition, where if implemented defines the component score as above. -In Python, assuming you had a 1D `NumPy` array of singular values `s` returned by `np.linalg.svd`, you could compute the list of variances ratios with `s**2 / sum(s**2)`. +If you want to dive deeper into PCA, [Steve Brunton's SVD Video Series](https://www.youtube.com/playlist?list=PLMrJAkhIeNNSVjnsviglFoY2nXildDCcv) is a great resource. +## Interpreting PCA ### PCA Plot @@ -383,7 +348,7 @@ PCA plots help us assess similarities between our data points and if there are a ### Scree Plots -A scree plot shows the **variance ratio** captured by each principal component, with the largest variance ratio first. They help us visually determine the number of dimensions needed to describe the data reasonably. The singular values that fall in the region of the plot after a large drop-off correspond to principal components that are **not** needed to describe the data since they explain a relatively low proportion of the total variance of the data. For example, in the below plot, we could use the "elbow method" just described to figure out that the first 2 PCs capture the bulk of the information. +A scree plot shows the **variance ratio** captured by each principal component, with the largest variance ratio first. They help us visually determine the number of dimensions needed to describe the data reasonably. The singular values that fall in the region of the plot after a large drop-off correspond to principal components that are **not** needed to describe the data since they explain a relatively low proportion of the total variance of the data. This point where adding more principal components results in diminishing returns is called the "elbow” and is the point just before the line flattens out. Using this "elbow method", we can see that the elbow is at the second principal component.
scree_plot
@@ -404,25 +369,31 @@ Say we were considering feature 3, and say that was the purple arrow labeled "52 * Here we would infer that $v_1$ (in the $x$/PC1-direction) is positive, meaning that a linear increase in feature 3 would correspond to a linear increase of PC1, meaning feature 3 and PC1 are positively correlated. * $v_2$ (in the $y$/pc2-direction) is negative, meaning a linear increase in feature 3 would result correspond to a linear decrease in PC2, meaning feature 3 and PC2 are negatively correlated. -## Applications of PCA +## Example: House of Representatives Voting -### PCA in Biology +Let's examine how the House of Representatives (of the 116th Congress, 1st session) voted in the month of September 2019. -PCA is commonly used in biomedical contexts, which have many named variables! +Specifically, we’ll look at the records of Roll call votes. From the U.S. Senate ([link](https://www.senate.gov/reference/Index/Votes.htm)): Roll call votes occur when a representative or senator votes "yea" or "nay" so that the names of members voting on each side are recorded. A voice vote is a vote in which those in favor or against a measure say "yea" or "nay," respectively, without the names or tallies of members voting on each side being recorded. -1. To cluster data ([Paper 1](https://bmcbioinformatics.biomedcentral.com/articles/10.1186/s12859-019-2680-1), [Paper 2](https://www.science.org/doi/10.1126/scirobotics.abk2378)) -2. To identify correlated variables ([interpret](https://docs.google.com/presentation/d/1-aDu0ILCkPx3iCcJGB3YXci-L4g90Q6AarXU6wffLB8/edit#slide=id.g62cb86badb_0_1128) rows of $V^{T}$ as linear coefficients) ([Paper 3](https://www.nature.com/articles/s41598-017-05714-1)). Uses [biplots](https://www.google.com/url?q=https://www.geo.fu-berlin.de/en/v/soga/Geodata-analysis/Principal-Component-Analysis/principal-components-basics/Interpretation-and-visualization/index.html%23:~:text%3DThe%2520biplot%2520is%2520a%2520very,in%2520a%2520single%2520biplot%2520display.%26text%3DThe%2520plot%2520shows%2520the%2520observations,principal%2520components%2520(synthetic%2520variables).&sa=D&source=editors&ust=1682131633152964&usg=AOvVaw2H9SOeMP5kUS890Fkhfthx). +**Do legislators' roll call votes show a relationship with their political party?** -### Why Perform PCA -We often perform PCA during the Exploratory Data Analysis (EDA) stage of our data science lifecycle (if we already know what to model, we probably don't need PCA); it helps us with: +Please visit this [link](https://data100.datahub.berkeley.edu/hub/user-redirect/git-pull?repo=https%3A%2F%2Fgithub.com%2FDS-100%2Ffa23-student&urlpath=lab%2Ftree%2Ffa23-student%2Flecture%2Flec26%2Flec26-votes.ipynb&branch=main) to see the full Jupyter notebook demo. -* Visually identifying clusters of similar observations in high dimensions. -* Removing irrelevant dimensions if we suspect that the dataset is inherently low rank. For example, if the columns are collinear: there are many attributes but only a few mostly determine the rest through linear associations. -* Finding a small basis for representing variations in complex things, e.g., images, genes. -* Reducing the number of dimensions to make some computation cheaper. +As shown in the demo, the primary goal of PCA is to transform observations from high-dimensional data down to low dimensions through linear transformations. +A related goal of PCA connects back to the idea that a low-dimension representation of the data should capture the variability of the original data. For example, if the first two singular values are large and the others are relatively small, then two dimensions are probably enough to describe most of what distinguishes one observation from another. However, if this is not the case, then a PCA scatter plot is probably omitting lots of information. + +We can use the following formulas to quantify the amount each principal component contributes to the total variance: + +$$ \text{component score} = \frac{s_i^{2}}{N}$$ -### Image Classification +$$ \text{total variance} = \text{sum of all the component scores} = \sum_{i=1}^k \frac{s_i^{2}}{N} $$ + +$$ \text{variance ratio of principal component i} = \frac{\text{component score i}}{\text{total variance}} = \frac{s_i^{2} / N}{\sum_{i=1}^k s_i^{2} / N}$$ + +In Python, assuming you had a 1D `NumPy` array of singular values `s` returned by `np.linalg.svd`, you could compute the list of variances ratios with `s**2 / sum(s**2)`. + +## Example: Image Classification In machine learning, PCA is often used as a preprocessing step prior to training a supervised model. @@ -436,6 +407,24 @@ The demo shows how we can use PCA during the Exploratory Data Analysis stage of - find a small basis for representing variations in complex things. - reduce the number of dimensions to make some computations cheaper. +## (Bonus) Applications of PCA + +### PCA in Biology + +PCA is commonly used in biomedical contexts, which have many named variables! + +1. To cluster data ([Paper 1](https://bmcbioinformatics.biomedcentral.com/articles/10.1186/s12859-019-2680-1), [Paper 2](https://www.science.org/doi/10.1126/scirobotics.abk2378)) +2. To identify correlated variables ([interpret](https://docs.google.com/presentation/d/1-aDu0ILCkPx3iCcJGB3YXci-L4g90Q6AarXU6wffLB8/edit#slide=id.g62cb86badb_0_1128) rows of $V^{T}$ as linear coefficients) ([Paper 3](https://www.nature.com/articles/s41598-017-05714-1)). Uses [biplots](https://www.google.com/url?q=https://www.geo.fu-berlin.de/en/v/soga/Geodata-analysis/Principal-Component-Analysis/principal-components-basics/Interpretation-and-visualization/index.html%23:~:text%3DThe%2520biplot%2520is%2520a%2520very,in%2520a%2520single%2520biplot%2520display.%26text%3DThe%2520plot%2520shows%2520the%2520observations,principal%2520components%2520(synthetic%2520variables).&sa=D&source=editors&ust=1682131633152964&usg=AOvVaw2H9SOeMP5kUS890Fkhfthx). + +### Why Perform PCA +We often perform PCA during the Exploratory Data Analysis (EDA) stage of our data science lifecycle (if we already know what to model, we probably don't need PCA); it helps us with: + +* Visually identifying clusters of similar observations in high dimensions. +* Removing irrelevant dimensions if we suspect that the dataset is inherently low rank. For example, if the columns are collinear: there are many attributes but only a few mostly determine the rest through linear associations. +* Finding a small basis for representing variations in complex things, e.g., images, genes. +* Reducing the number of dimensions to make some computation cheaper. + + ### Why PCA, then Model? 1. Reduces dimensionality, allowing us to speed up training and reduce the number of features, etc. @@ -443,3 +432,61 @@ The demo shows how we can use PCA during the Exploratory Data Analysis stage of
slide21
+ +## (Bonus) PCA vs. Regression +### Regression: Minimizing Horizontal/Verticle Error + +Suppose we know the child mortality rate of a given country. Linear regression tries to predict the fertility rate from the mortality rate; for example, if the mortality is 6, we might guess the fertility is near 4. The regression line tells us the “best” prediction of fertility given all possible mortality values by minimizing the root mean squared error [see vertical red lines, only some shown]. + +
+
+We can also perform a regression in the reverse direction, that is, given the fertility, we try to predict the mortality. In this case, we get a different regression line which minimizes the root mean squared length of the horizontal lines. + +
+ +### SVD: Minimizing Perpendicular Error +The rank 1 approximation is close but not the same as the mortality regression line. Instead of minimizing *horizontal* or *vertical* error, our rank 1 approximation minimizes the error *perpendicular* to the subspace onto which we’re projecting. That is, SVD finds the line such that if we project our data onto that line, the error between the projection and our original data is minimized. The similarity of the rank 1 approximation and the fertility was just a coincidence. Looking at adiposity and bicep size from our body measurements dataset, we see the 1D subspace onto which we are projecting is between the two regression lines. + +
+ +### Beyond 1D and 2D +In higher dimensions, the idea behind principal components is just the same! Suppose we have 30-dimensional data and decide to use the first 5 principal components. Our procedure minimizes the error between the original 30-dimensional data and the projection of that 30-dimensional data on to the “best” 5-dimensional subspace. See [CS189](https://www.eecs189.org/static/notes/n10.pdf) for more details. + + +## (Bonus) Automatic Factorization + +One key fact to remember is that the decomposition are not arbitrary. The *rank* of a matrix limits how small our inner dimensions can be if we want to perfectly recreate our matrix. The proof for this is out of scope. + +Even if we know we have to factorize our matrix using an inner dimension of R, that still leaves a large space of solutions to traverse. What if we have a procedure to automatically factorize a rank R matrix into an R dimensional representation with some transformation matrix? + +- Lower dimensional representation avoids redundant features. +- Imagine a 1000-dimensional dataset: If the rank is only 5, it’s much easier to do EDA after this mystery procedure. + +What if we wanted a 2D representation? It's valuable to compress all of the data that is relevant onto as few dimensions as possible in order to plot it efficiently. Some 2D matrices yield better approximations than others. How well can we do? + + +## (Bonus) Proof of Component Score + +The proof defining component score is out of scope for this class, but it is included below for your convenience. + +*Setup*: Consider the design matrix $X \in \mathbb{R}^{n \times d}$, where the $j$-th column (corresponding to the $j$-th feature) is $x_j \in \mathbb{R}^n$ and the element in row $i$, column $j$ is $x_{ij}$. Further, define $\tilde{X}$ as the **centered** design matrix. The $j$-th column is $\tilde{x}_j \in \mathbb{R}^n$ and the element in row $i$, column $j$ is $\tilde{x}_{ij} = x_{ij} - \bar{x_j}$, where $\bar{x_j}$ is the mean of the $x_j$ column vector from the original $X$. + +*Variance*: Construct the **covariance matrix**: $\frac{1}{n} \tilde{X}^T \tilde{X} \in \mathbb{R}^{d \times d}$. The $j$-th element along the diagonal is the **variance** of the $j$-th column of the original design matrix $X$: + +$$\left( \frac{1}{n} \tilde{X}^T \tilde{X} \right)_{jj} = \frac{1}{n} \tilde{x}_j ^T \tilde{x}_j = \frac{1}{n} \sum_{i=i}^n (\tilde{x}_{ij} )^2 = \frac{1}{n} \sum_{i=i}^n (x_{ij} - \bar{x_j})^2$$ + + +*SVD*: Suppose singular value decomposition of the *centered* design matrix $\tilde{X}$ yields $\tilde{X} = U S V^T$, where $U \in \mathbb{R}^{n \times d}$ and $V \in \mathbb{R}^{d \times d}$ are matrices with orthonormal columns, and $S \in \mathbb{R}^{d \times d}$ is a diagonal matrix with singular values of $\tilde{X}$. + +$$\begin{aligned} +\tilde{X}^T \tilde{X} &= (U S V^T )^T (U S V^T) \\ +&= V S U^T U S V^T & (S^T = S) \\ +&= V S^2 V^T & (U^T U = I) \\ +\frac{1}{n} \tilde{X}^T \tilde{X} &= \frac{1}{n} V S V^T =V \left( \frac{1}{n} S \right) V^T \\ +\frac{1}{n} \tilde{X}^T \tilde{X} V &= V \left( \frac{1}{n} S \right) V^T V = V \left( \frac{1}{n} S \right) & \text{(right multiply by }V \rightarrow V^T V = I \text{)} \\ +V^T \frac{1}{n} \tilde{X}^T \tilde{X} V &= V^T V \left( \frac{1}{n} S \right) = \frac{1}{n} S & \text{(left multiply by }V^T \rightarrow V^T V = I \text{)} \\ +\left( \frac{1}{n} \tilde{X}^T \tilde{X} \right)_{jj} &= \frac{1}{n}S_j^2 & \text{(Define }S_j\text{ as the} j\text{-th singular value)} \\ +\frac{1}{n} S_j^2 &= \frac{1}{n} \sum_{i=i}^n (x_{ij} - \bar{x_j})^2 +\end{aligned}$$ + +The last line defines the $j$-th component score. diff --git a/probability_1/probability_1.qmd b/probability_1/probability_1.qmd index cb1324a3..cb2e2bef 100644 --- a/probability_1/probability_1.qmd +++ b/probability_1/probability_1.qmd @@ -381,7 +381,9 @@ $$ \begin{align} ::: ### Covariance and Correlation -We define the **covariance** of two random variables as the expected product of deviations from expectation. Put more simply, covariance is a generalization of variance to variance: $\text{Cov}(X, X) = \mathbb{E}[(X - \mathbb{E}[X])^2] = \text{Var}(X)$ +We define the **covariance** of two random variables as the expected product of deviations from expectation. Put more simply, covariance is a generalization of variance to variance: + +$$\text{Cov}(X, X) = \mathbb{E}[(X - \mathbb{E}[X])^2] = \text{Var}(X)$$ $$\text{Cov}(X, Y) = \mathbb{E}[(X - \mathbb{E}[X])(Y - \mathbb{E}[Y])]$$