From 54fc7da531b31f241e6af39bb596fe91539f6d07 Mon Sep 17 00:00:00 2001 From: mhjensen Date: Thu, 26 Dec 2019 11:06:16 +0100 Subject: [PATCH] added pca code --- doc/pub/DimRed/html/._DimRed-bs000.html | 105 +++++----- doc/pub/DimRed/html/._DimRed-bs001.html | 103 ++++++---- doc/pub/DimRed/html/._DimRed-bs002.html | 103 ++++++---- doc/pub/DimRed/html/._DimRed-bs003.html | 103 ++++++---- doc/pub/DimRed/html/._DimRed-bs004.html | 103 ++++++---- doc/pub/DimRed/html/._DimRed-bs005.html | 103 ++++++---- doc/pub/DimRed/html/._DimRed-bs006.html | 103 ++++++---- doc/pub/DimRed/html/._DimRed-bs007.html | 103 ++++++---- doc/pub/DimRed/html/._DimRed-bs008.html | 103 ++++++---- doc/pub/DimRed/html/._DimRed-bs009.html | 103 ++++++---- doc/pub/DimRed/html/._DimRed-bs010.html | 103 ++++++---- doc/pub/DimRed/html/._DimRed-bs011.html | 103 ++++++---- doc/pub/DimRed/html/._DimRed-bs012.html | 103 ++++++---- doc/pub/DimRed/html/._DimRed-bs013.html | 103 ++++++---- doc/pub/DimRed/html/._DimRed-bs014.html | 103 ++++++---- doc/pub/DimRed/html/._DimRed-bs015.html | 103 ++++++---- doc/pub/DimRed/html/._DimRed-bs016.html | 103 ++++++---- doc/pub/DimRed/html/._DimRed-bs017.html | 106 +++++----- doc/pub/DimRed/html/._DimRed-bs018.html | 202 ++++++++++++++----- doc/pub/DimRed/html/._DimRed-bs019.html | 127 ++++++------ doc/pub/DimRed/html/._DimRed-bs020.html | 134 ++++++------ doc/pub/DimRed/html/._DimRed-bs021.html | 168 +++++++-------- doc/pub/DimRed/html/._DimRed-bs022.html | 189 +++++++++-------- doc/pub/DimRed/html/._DimRed-bs023.html | 162 +++++++++------ doc/pub/DimRed/html/._DimRed-bs024.html | 155 +++++++------- doc/pub/DimRed/html/._DimRed-bs025.html | 157 ++++++++------ doc/pub/DimRed/html/._DimRed-bs026.html | 132 +++++++----- doc/pub/DimRed/html/._DimRed-bs027.html | 118 ++++++----- doc/pub/DimRed/html/._DimRed-bs028.html | 126 ++++++------ doc/pub/DimRed/html/._DimRed-bs029.html | 132 +++++++----- doc/pub/DimRed/html/._DimRed-bs030.html | 121 ++++++----- doc/pub/DimRed/html/DimRed-bs.html | 105 +++++----- doc/pub/DimRed/html/DimRed-reveal.html | 134 ++++++++++-- doc/pub/DimRed/html/DimRed-solarized.html | 162 ++++++++++++--- doc/pub/DimRed/html/DimRed.html | 162 ++++++++++++--- doc/pub/DimRed/ipynb/DimRed.ipynb | 168 ++++++++++++++- doc/pub/DimRed/ipynb/ipynb-DimRed-src.tar.gz | Bin 190 -> 190 bytes doc/pub/DimRed/pdf/DimRed-minted.pdf | Bin 253434 -> 259876 bytes doc/src/DimRed/DimRed.do.txt | 88 ++++++++ 39 files changed, 2866 insertions(+), 1735 deletions(-) diff --git a/doc/pub/DimRed/html/._DimRed-bs000.html b/doc/pub/DimRed/html/._DimRed-bs000.html index 57753922e..8da1ff958 100644 --- a/doc/pub/DimRed/html/._DimRed-bs000.html +++ b/doc/pub/DimRed/html/._DimRed-bs000.html @@ -89,19 +89,30 @@ Automatically generated HTML file from DocOnce source '___sec14'), ('Towards the PCA theorem', 2, None, '___sec15'), ('The Algorithm before the Theorem', 2, None, '___sec16'), - ('Classical PCA Theorem', 2, None, '___sec17'), - ('Proof of the PCA Theorem', 2, None, '___sec18'), - ('PCA Proof continued', 2, None, '___sec19'), - ('The final step', 2, None, '___sec20'), - ('Principal Component Analysis', 2, None, '___sec21'), - ('PCA and scikit-learn', 2, None, '___sec22'), - ('Back to the Cancer Data', 2, None, '___sec23'), - ('More on the PCA', 2, None, '___sec24'), - ('Incremental PCA', 2, None, '___sec25'), - ('Randomized PCA', 2, None, '___sec26'), - ('Kernel PCA', 2, None, '___sec27'), - ('LLE', 2, None, '___sec28'), - ('Other techniques', 2, None, '___sec29')]} + ('Writing our own PCA code', 2, None, '___sec17'), + ('Compute the sample mean and center the data', + 3, + None, + '___sec18'), + ('Compute the sample covariance', 3, None, '___sec19'), + ('Diagonalize the sample covariance matrix to obtain the ' + 'principal components', + 3, + None, + '___sec20'), + ('Classical PCA Theorem', 2, None, '___sec21'), + ('Proof of the PCA Theorem', 2, None, '___sec22'), + ('PCA Proof continued', 2, None, '___sec23'), + ('The final step', 2, None, '___sec24'), + ('Principal Component Analysis', 2, None, '___sec25'), + ('PCA and scikit-learn', 2, None, '___sec26'), + ('Back to the Cancer Data', 2, None, '___sec27'), + ('More on the PCA', 2, None, '___sec28'), + ('Incremental PCA', 2, None, '___sec29'), + ('Randomized PCA', 2, None, '___sec30'), + ('Kernel PCA', 2, None, '___sec31'), + ('LLE', 2, None, '___sec32'), + ('Other techniques', 2, None, '___sec33')]} end of tocinfo --> @@ -139,36 +150,40 @@ MathJax.Hub.Config({ @@ -203,7 +218,7 @@ MathJax.Hub.Config({
[2] Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University

-

Oct 25, 2019

+

Dec 26, 2019


@@ -227,7 +242,7 @@ MathJax.Hub.Config({

  • 9
  • 10
  • ...
  • -
  • 31
  • +
  • 32
  • »
  • diff --git a/doc/pub/DimRed/html/._DimRed-bs001.html b/doc/pub/DimRed/html/._DimRed-bs001.html index 5eacb11b3..026609651 100644 --- a/doc/pub/DimRed/html/._DimRed-bs001.html +++ b/doc/pub/DimRed/html/._DimRed-bs001.html @@ -89,19 +89,30 @@ Automatically generated HTML file from DocOnce source '___sec14'), ('Towards the PCA theorem', 2, None, '___sec15'), ('The Algorithm before the Theorem', 2, None, '___sec16'), - ('Classical PCA Theorem', 2, None, '___sec17'), - ('Proof of the PCA Theorem', 2, None, '___sec18'), - ('PCA Proof continued', 2, None, '___sec19'), - ('The final step', 2, None, '___sec20'), - ('Principal Component Analysis', 2, None, '___sec21'), - ('PCA and scikit-learn', 2, None, '___sec22'), - ('Back to the Cancer Data', 2, None, '___sec23'), - ('More on the PCA', 2, None, '___sec24'), - ('Incremental PCA', 2, None, '___sec25'), - ('Randomized PCA', 2, None, '___sec26'), - ('Kernel PCA', 2, None, '___sec27'), - ('LLE', 2, None, '___sec28'), - ('Other techniques', 2, None, '___sec29')]} + ('Writing our own PCA code', 2, None, '___sec17'), + ('Compute the sample mean and center the data', + 3, + None, + '___sec18'), + ('Compute the sample covariance', 3, None, '___sec19'), + ('Diagonalize the sample covariance matrix to obtain the ' + 'principal components', + 3, + None, + '___sec20'), + ('Classical PCA Theorem', 2, None, '___sec21'), + ('Proof of the PCA Theorem', 2, None, '___sec22'), + ('PCA Proof continued', 2, None, '___sec23'), + ('The final step', 2, None, '___sec24'), + ('Principal Component Analysis', 2, None, '___sec25'), + ('PCA and scikit-learn', 2, None, '___sec26'), + ('Back to the Cancer Data', 2, None, '___sec27'), + ('More on the PCA', 2, None, '___sec28'), + ('Incremental PCA', 2, None, '___sec29'), + ('Randomized PCA', 2, None, '___sec30'), + ('Kernel PCA', 2, None, '___sec31'), + ('LLE', 2, None, '___sec32'), + ('Other techniques', 2, None, '___sec33')]} end of tocinfo --> @@ -139,36 +150,40 @@ MathJax.Hub.Config({ @@ -227,7 +242,7 @@ data.
  • 10
  • 11
  • ...
  • -
  • 31
  • +
  • 32
  • »
  • diff --git a/doc/pub/DimRed/html/._DimRed-bs002.html b/doc/pub/DimRed/html/._DimRed-bs002.html index 1a1f68938..f281284d9 100644 --- a/doc/pub/DimRed/html/._DimRed-bs002.html +++ b/doc/pub/DimRed/html/._DimRed-bs002.html @@ -89,19 +89,30 @@ Automatically generated HTML file from DocOnce source '___sec14'), ('Towards the PCA theorem', 2, None, '___sec15'), ('The Algorithm before the Theorem', 2, None, '___sec16'), - ('Classical PCA Theorem', 2, None, '___sec17'), - ('Proof of the PCA Theorem', 2, None, '___sec18'), - ('PCA Proof continued', 2, None, '___sec19'), - ('The final step', 2, None, '___sec20'), - ('Principal Component Analysis', 2, None, '___sec21'), - ('PCA and scikit-learn', 2, None, '___sec22'), - ('Back to the Cancer Data', 2, None, '___sec23'), - ('More on the PCA', 2, None, '___sec24'), - ('Incremental PCA', 2, None, '___sec25'), - ('Randomized PCA', 2, None, '___sec26'), - ('Kernel PCA', 2, None, '___sec27'), - ('LLE', 2, None, '___sec28'), - ('Other techniques', 2, None, '___sec29')]} + ('Writing our own PCA code', 2, None, '___sec17'), + ('Compute the sample mean and center the data', + 3, + None, + '___sec18'), + ('Compute the sample covariance', 3, None, '___sec19'), + ('Diagonalize the sample covariance matrix to obtain the ' + 'principal components', + 3, + None, + '___sec20'), + ('Classical PCA Theorem', 2, None, '___sec21'), + ('Proof of the PCA Theorem', 2, None, '___sec22'), + ('PCA Proof continued', 2, None, '___sec23'), + ('The final step', 2, None, '___sec24'), + ('Principal Component Analysis', 2, None, '___sec25'), + ('PCA and scikit-learn', 2, None, '___sec26'), + ('Back to the Cancer Data', 2, None, '___sec27'), + ('More on the PCA', 2, None, '___sec28'), + ('Incremental PCA', 2, None, '___sec29'), + ('Randomized PCA', 2, None, '___sec30'), + ('Kernel PCA', 2, None, '___sec31'), + ('LLE', 2, None, '___sec32'), + ('Other techniques', 2, None, '___sec33')]} end of tocinfo --> @@ -139,36 +150,40 @@ MathJax.Hub.Config({ @@ -226,7 +241,7 @@ ensures that all features are exactly between \( 0 \) and \( 1 \). The
  • 11
  • 12
  • ...
  • -
  • 31
  • +
  • 32
  • »
  • diff --git a/doc/pub/DimRed/html/._DimRed-bs003.html b/doc/pub/DimRed/html/._DimRed-bs003.html index 2d3bfbf9a..d2bfcf82f 100644 --- a/doc/pub/DimRed/html/._DimRed-bs003.html +++ b/doc/pub/DimRed/html/._DimRed-bs003.html @@ -89,19 +89,30 @@ Automatically generated HTML file from DocOnce source '___sec14'), ('Towards the PCA theorem', 2, None, '___sec15'), ('The Algorithm before the Theorem', 2, None, '___sec16'), - ('Classical PCA Theorem', 2, None, '___sec17'), - ('Proof of the PCA Theorem', 2, None, '___sec18'), - ('PCA Proof continued', 2, None, '___sec19'), - ('The final step', 2, None, '___sec20'), - ('Principal Component Analysis', 2, None, '___sec21'), - ('PCA and scikit-learn', 2, None, '___sec22'), - ('Back to the Cancer Data', 2, None, '___sec23'), - ('More on the PCA', 2, None, '___sec24'), - ('Incremental PCA', 2, None, '___sec25'), - ('Randomized PCA', 2, None, '___sec26'), - ('Kernel PCA', 2, None, '___sec27'), - ('LLE', 2, None, '___sec28'), - ('Other techniques', 2, None, '___sec29')]} + ('Writing our own PCA code', 2, None, '___sec17'), + ('Compute the sample mean and center the data', + 3, + None, + '___sec18'), + ('Compute the sample covariance', 3, None, '___sec19'), + ('Diagonalize the sample covariance matrix to obtain the ' + 'principal components', + 3, + None, + '___sec20'), + ('Classical PCA Theorem', 2, None, '___sec21'), + ('Proof of the PCA Theorem', 2, None, '___sec22'), + ('PCA Proof continued', 2, None, '___sec23'), + ('The final step', 2, None, '___sec24'), + ('Principal Component Analysis', 2, None, '___sec25'), + ('PCA and scikit-learn', 2, None, '___sec26'), + ('Back to the Cancer Data', 2, None, '___sec27'), + ('More on the PCA', 2, None, '___sec28'), + ('Incremental PCA', 2, None, '___sec29'), + ('Randomized PCA', 2, None, '___sec30'), + ('Kernel PCA', 2, None, '___sec31'), + ('LLE', 2, None, '___sec32'), + ('Other techniques', 2, None, '___sec33')]} end of tocinfo --> @@ -139,36 +150,40 @@ MathJax.Hub.Config({ @@ -229,7 +244,7 @@ techniques.
  • 12
  • 13
  • ...
  • -
  • 31
  • +
  • 32
  • »
  • diff --git a/doc/pub/DimRed/html/._DimRed-bs004.html b/doc/pub/DimRed/html/._DimRed-bs004.html index 32a4b3df2..b9946be9a 100644 --- a/doc/pub/DimRed/html/._DimRed-bs004.html +++ b/doc/pub/DimRed/html/._DimRed-bs004.html @@ -89,19 +89,30 @@ Automatically generated HTML file from DocOnce source '___sec14'), ('Towards the PCA theorem', 2, None, '___sec15'), ('The Algorithm before the Theorem', 2, None, '___sec16'), - ('Classical PCA Theorem', 2, None, '___sec17'), - ('Proof of the PCA Theorem', 2, None, '___sec18'), - ('PCA Proof continued', 2, None, '___sec19'), - ('The final step', 2, None, '___sec20'), - ('Principal Component Analysis', 2, None, '___sec21'), - ('PCA and scikit-learn', 2, None, '___sec22'), - ('Back to the Cancer Data', 2, None, '___sec23'), - ('More on the PCA', 2, None, '___sec24'), - ('Incremental PCA', 2, None, '___sec25'), - ('Randomized PCA', 2, None, '___sec26'), - ('Kernel PCA', 2, None, '___sec27'), - ('LLE', 2, None, '___sec28'), - ('Other techniques', 2, None, '___sec29')]} + ('Writing our own PCA code', 2, None, '___sec17'), + ('Compute the sample mean and center the data', + 3, + None, + '___sec18'), + ('Compute the sample covariance', 3, None, '___sec19'), + ('Diagonalize the sample covariance matrix to obtain the ' + 'principal components', + 3, + None, + '___sec20'), + ('Classical PCA Theorem', 2, None, '___sec21'), + ('Proof of the PCA Theorem', 2, None, '___sec22'), + ('PCA Proof continued', 2, None, '___sec23'), + ('The final step', 2, None, '___sec24'), + ('Principal Component Analysis', 2, None, '___sec25'), + ('PCA and scikit-learn', 2, None, '___sec26'), + ('Back to the Cancer Data', 2, None, '___sec27'), + ('More on the PCA', 2, None, '___sec28'), + ('Incremental PCA', 2, None, '___sec29'), + ('Randomized PCA', 2, None, '___sec30'), + ('Kernel PCA', 2, None, '___sec31'), + ('LLE', 2, None, '___sec32'), + ('Other techniques', 2, None, '___sec33')]} end of tocinfo --> @@ -139,36 +150,40 @@ MathJax.Hub.Config({ @@ -304,7 +319,7 @@ svm.fit(X_train_scaled, y_train)
  • 13
  • 14
  • ...
  • -
  • 31
  • +
  • 32
  • »
  • diff --git a/doc/pub/DimRed/html/._DimRed-bs005.html b/doc/pub/DimRed/html/._DimRed-bs005.html index 0f389a6c6..c1f31f395 100644 --- a/doc/pub/DimRed/html/._DimRed-bs005.html +++ b/doc/pub/DimRed/html/._DimRed-bs005.html @@ -89,19 +89,30 @@ Automatically generated HTML file from DocOnce source '___sec14'), ('Towards the PCA theorem', 2, None, '___sec15'), ('The Algorithm before the Theorem', 2, None, '___sec16'), - ('Classical PCA Theorem', 2, None, '___sec17'), - ('Proof of the PCA Theorem', 2, None, '___sec18'), - ('PCA Proof continued', 2, None, '___sec19'), - ('The final step', 2, None, '___sec20'), - ('Principal Component Analysis', 2, None, '___sec21'), - ('PCA and scikit-learn', 2, None, '___sec22'), - ('Back to the Cancer Data', 2, None, '___sec23'), - ('More on the PCA', 2, None, '___sec24'), - ('Incremental PCA', 2, None, '___sec25'), - ('Randomized PCA', 2, None, '___sec26'), - ('Kernel PCA', 2, None, '___sec27'), - ('LLE', 2, None, '___sec28'), - ('Other techniques', 2, None, '___sec29')]} + ('Writing our own PCA code', 2, None, '___sec17'), + ('Compute the sample mean and center the data', + 3, + None, + '___sec18'), + ('Compute the sample covariance', 3, None, '___sec19'), + ('Diagonalize the sample covariance matrix to obtain the ' + 'principal components', + 3, + None, + '___sec20'), + ('Classical PCA Theorem', 2, None, '___sec21'), + ('Proof of the PCA Theorem', 2, None, '___sec22'), + ('PCA Proof continued', 2, None, '___sec23'), + ('The final step', 2, None, '___sec24'), + ('Principal Component Analysis', 2, None, '___sec25'), + ('PCA and scikit-learn', 2, None, '___sec26'), + ('Back to the Cancer Data', 2, None, '___sec27'), + ('More on the PCA', 2, None, '___sec28'), + ('Incremental PCA', 2, None, '___sec29'), + ('Randomized PCA', 2, None, '___sec30'), + ('Kernel PCA', 2, None, '___sec31'), + ('LLE', 2, None, '___sec32'), + ('Other techniques', 2, None, '___sec33')]} end of tocinfo --> @@ -139,36 +150,40 @@ MathJax.Hub.Config({ @@ -254,7 +269,7 @@ svm.fit(X_train_scaled, y_train)
  • 14
  • 15
  • ...
  • -
  • 31
  • +
  • 32
  • »
  • diff --git a/doc/pub/DimRed/html/._DimRed-bs006.html b/doc/pub/DimRed/html/._DimRed-bs006.html index d5e29d62d..2f361bebf 100644 --- a/doc/pub/DimRed/html/._DimRed-bs006.html +++ b/doc/pub/DimRed/html/._DimRed-bs006.html @@ -89,19 +89,30 @@ Automatically generated HTML file from DocOnce source '___sec14'), ('Towards the PCA theorem', 2, None, '___sec15'), ('The Algorithm before the Theorem', 2, None, '___sec16'), - ('Classical PCA Theorem', 2, None, '___sec17'), - ('Proof of the PCA Theorem', 2, None, '___sec18'), - ('PCA Proof continued', 2, None, '___sec19'), - ('The final step', 2, None, '___sec20'), - ('Principal Component Analysis', 2, None, '___sec21'), - ('PCA and scikit-learn', 2, None, '___sec22'), - ('Back to the Cancer Data', 2, None, '___sec23'), - ('More on the PCA', 2, None, '___sec24'), - ('Incremental PCA', 2, None, '___sec25'), - ('Randomized PCA', 2, None, '___sec26'), - ('Kernel PCA', 2, None, '___sec27'), - ('LLE', 2, None, '___sec28'), - ('Other techniques', 2, None, '___sec29')]} + ('Writing our own PCA code', 2, None, '___sec17'), + ('Compute the sample mean and center the data', + 3, + None, + '___sec18'), + ('Compute the sample covariance', 3, None, '___sec19'), + ('Diagonalize the sample covariance matrix to obtain the ' + 'principal components', + 3, + None, + '___sec20'), + ('Classical PCA Theorem', 2, None, '___sec21'), + ('Proof of the PCA Theorem', 2, None, '___sec22'), + ('PCA Proof continued', 2, None, '___sec23'), + ('The final step', 2, None, '___sec24'), + ('Principal Component Analysis', 2, None, '___sec25'), + ('PCA and scikit-learn', 2, None, '___sec26'), + ('Back to the Cancer Data', 2, None, '___sec27'), + ('More on the PCA', 2, None, '___sec28'), + ('Incremental PCA', 2, None, '___sec29'), + ('Randomized PCA', 2, None, '___sec30'), + ('Kernel PCA', 2, None, '___sec31'), + ('LLE', 2, None, '___sec32'), + ('Other techniques', 2, None, '___sec33')]} end of tocinfo --> @@ -139,36 +150,40 @@ MathJax.Hub.Config({ @@ -233,7 +248,7 @@ logreg.fit(X_train_scaled, y_train)
  • 15
  • 16
  • ...
  • -
  • 31
  • +
  • 32
  • »
  • diff --git a/doc/pub/DimRed/html/._DimRed-bs007.html b/doc/pub/DimRed/html/._DimRed-bs007.html index 9a71aec08..1c3b2e6e7 100644 --- a/doc/pub/DimRed/html/._DimRed-bs007.html +++ b/doc/pub/DimRed/html/._DimRed-bs007.html @@ -89,19 +89,30 @@ Automatically generated HTML file from DocOnce source '___sec14'), ('Towards the PCA theorem', 2, None, '___sec15'), ('The Algorithm before the Theorem', 2, None, '___sec16'), - ('Classical PCA Theorem', 2, None, '___sec17'), - ('Proof of the PCA Theorem', 2, None, '___sec18'), - ('PCA Proof continued', 2, None, '___sec19'), - ('The final step', 2, None, '___sec20'), - ('Principal Component Analysis', 2, None, '___sec21'), - ('PCA and scikit-learn', 2, None, '___sec22'), - ('Back to the Cancer Data', 2, None, '___sec23'), - ('More on the PCA', 2, None, '___sec24'), - ('Incremental PCA', 2, None, '___sec25'), - ('Randomized PCA', 2, None, '___sec26'), - ('Kernel PCA', 2, None, '___sec27'), - ('LLE', 2, None, '___sec28'), - ('Other techniques', 2, None, '___sec29')]} + ('Writing our own PCA code', 2, None, '___sec17'), + ('Compute the sample mean and center the data', + 3, + None, + '___sec18'), + ('Compute the sample covariance', 3, None, '___sec19'), + ('Diagonalize the sample covariance matrix to obtain the ' + 'principal components', + 3, + None, + '___sec20'), + ('Classical PCA Theorem', 2, None, '___sec21'), + ('Proof of the PCA Theorem', 2, None, '___sec22'), + ('PCA Proof continued', 2, None, '___sec23'), + ('The final step', 2, None, '___sec24'), + ('Principal Component Analysis', 2, None, '___sec25'), + ('PCA and scikit-learn', 2, None, '___sec26'), + ('Back to the Cancer Data', 2, None, '___sec27'), + ('More on the PCA', 2, None, '___sec28'), + ('Incremental PCA', 2, None, '___sec29'), + ('Randomized PCA', 2, None, '___sec30'), + ('Kernel PCA', 2, None, '___sec31'), + ('LLE', 2, None, '___sec32'), + ('Other techniques', 2, None, '___sec33')]} end of tocinfo --> @@ -139,36 +150,40 @@ MathJax.Hub.Config({ @@ -288,7 +303,7 @@ applications.
  • 16
  • 17
  • ...
  • -
  • 31
  • +
  • 32
  • »
  • diff --git a/doc/pub/DimRed/html/._DimRed-bs008.html b/doc/pub/DimRed/html/._DimRed-bs008.html index c2a86cade..ec4603204 100644 --- a/doc/pub/DimRed/html/._DimRed-bs008.html +++ b/doc/pub/DimRed/html/._DimRed-bs008.html @@ -89,19 +89,30 @@ Automatically generated HTML file from DocOnce source '___sec14'), ('Towards the PCA theorem', 2, None, '___sec15'), ('The Algorithm before the Theorem', 2, None, '___sec16'), - ('Classical PCA Theorem', 2, None, '___sec17'), - ('Proof of the PCA Theorem', 2, None, '___sec18'), - ('PCA Proof continued', 2, None, '___sec19'), - ('The final step', 2, None, '___sec20'), - ('Principal Component Analysis', 2, None, '___sec21'), - ('PCA and scikit-learn', 2, None, '___sec22'), - ('Back to the Cancer Data', 2, None, '___sec23'), - ('More on the PCA', 2, None, '___sec24'), - ('Incremental PCA', 2, None, '___sec25'), - ('Randomized PCA', 2, None, '___sec26'), - ('Kernel PCA', 2, None, '___sec27'), - ('LLE', 2, None, '___sec28'), - ('Other techniques', 2, None, '___sec29')]} + ('Writing our own PCA code', 2, None, '___sec17'), + ('Compute the sample mean and center the data', + 3, + None, + '___sec18'), + ('Compute the sample covariance', 3, None, '___sec19'), + ('Diagonalize the sample covariance matrix to obtain the ' + 'principal components', + 3, + None, + '___sec20'), + ('Classical PCA Theorem', 2, None, '___sec21'), + ('Proof of the PCA Theorem', 2, None, '___sec22'), + ('PCA Proof continued', 2, None, '___sec23'), + ('The final step', 2, None, '___sec24'), + ('Principal Component Analysis', 2, None, '___sec25'), + ('PCA and scikit-learn', 2, None, '___sec26'), + ('Back to the Cancer Data', 2, None, '___sec27'), + ('More on the PCA', 2, None, '___sec28'), + ('Incremental PCA', 2, None, '___sec29'), + ('Randomized PCA', 2, None, '___sec30'), + ('Kernel PCA', 2, None, '___sec31'), + ('LLE', 2, None, '___sec32'), + ('Other techniques', 2, None, '___sec33')]} end of tocinfo --> @@ -139,36 +150,40 @@ MathJax.Hub.Config({ @@ -218,7 +233,7 @@ We have a data set defined by a design/feature matrix \( \boldsymbol{X} \) (see
  • 17
  • 18
  • ...
  • -
  • 31
  • +
  • 32
  • »
  • diff --git a/doc/pub/DimRed/html/._DimRed-bs009.html b/doc/pub/DimRed/html/._DimRed-bs009.html index 710178b2e..05ce56b2b 100644 --- a/doc/pub/DimRed/html/._DimRed-bs009.html +++ b/doc/pub/DimRed/html/._DimRed-bs009.html @@ -89,19 +89,30 @@ Automatically generated HTML file from DocOnce source '___sec14'), ('Towards the PCA theorem', 2, None, '___sec15'), ('The Algorithm before the Theorem', 2, None, '___sec16'), - ('Classical PCA Theorem', 2, None, '___sec17'), - ('Proof of the PCA Theorem', 2, None, '___sec18'), - ('PCA Proof continued', 2, None, '___sec19'), - ('The final step', 2, None, '___sec20'), - ('Principal Component Analysis', 2, None, '___sec21'), - ('PCA and scikit-learn', 2, None, '___sec22'), - ('Back to the Cancer Data', 2, None, '___sec23'), - ('More on the PCA', 2, None, '___sec24'), - ('Incremental PCA', 2, None, '___sec25'), - ('Randomized PCA', 2, None, '___sec26'), - ('Kernel PCA', 2, None, '___sec27'), - ('LLE', 2, None, '___sec28'), - ('Other techniques', 2, None, '___sec29')]} + ('Writing our own PCA code', 2, None, '___sec17'), + ('Compute the sample mean and center the data', + 3, + None, + '___sec18'), + ('Compute the sample covariance', 3, None, '___sec19'), + ('Diagonalize the sample covariance matrix to obtain the ' + 'principal components', + 3, + None, + '___sec20'), + ('Classical PCA Theorem', 2, None, '___sec21'), + ('Proof of the PCA Theorem', 2, None, '___sec22'), + ('PCA Proof continued', 2, None, '___sec23'), + ('The final step', 2, None, '___sec24'), + ('Principal Component Analysis', 2, None, '___sec25'), + ('PCA and scikit-learn', 2, None, '___sec26'), + ('Back to the Cancer Data', 2, None, '___sec27'), + ('More on the PCA', 2, None, '___sec28'), + ('Incremental PCA', 2, None, '___sec29'), + ('Randomized PCA', 2, None, '___sec30'), + ('Kernel PCA', 2, None, '___sec31'), + ('LLE', 2, None, '___sec32'), + ('Other techniques', 2, None, '___sec33')]} end of tocinfo --> @@ -139,36 +150,40 @@ MathJax.Hub.Config({ @@ -267,7 +282,7 @@ In the above example this is the function we constructed using pandas.
  • 18
  • 19
  • ...
  • -
  • 31
  • +
  • 32
  • »
  • diff --git a/doc/pub/DimRed/html/._DimRed-bs010.html b/doc/pub/DimRed/html/._DimRed-bs010.html index be8c93dfd..9fcb9607f 100644 --- a/doc/pub/DimRed/html/._DimRed-bs010.html +++ b/doc/pub/DimRed/html/._DimRed-bs010.html @@ -89,19 +89,30 @@ Automatically generated HTML file from DocOnce source '___sec14'), ('Towards the PCA theorem', 2, None, '___sec15'), ('The Algorithm before the Theorem', 2, None, '___sec16'), - ('Classical PCA Theorem', 2, None, '___sec17'), - ('Proof of the PCA Theorem', 2, None, '___sec18'), - ('PCA Proof continued', 2, None, '___sec19'), - ('The final step', 2, None, '___sec20'), - ('Principal Component Analysis', 2, None, '___sec21'), - ('PCA and scikit-learn', 2, None, '___sec22'), - ('Back to the Cancer Data', 2, None, '___sec23'), - ('More on the PCA', 2, None, '___sec24'), - ('Incremental PCA', 2, None, '___sec25'), - ('Randomized PCA', 2, None, '___sec26'), - ('Kernel PCA', 2, None, '___sec27'), - ('LLE', 2, None, '___sec28'), - ('Other techniques', 2, None, '___sec29')]} + ('Writing our own PCA code', 2, None, '___sec17'), + ('Compute the sample mean and center the data', + 3, + None, + '___sec18'), + ('Compute the sample covariance', 3, None, '___sec19'), + ('Diagonalize the sample covariance matrix to obtain the ' + 'principal components', + 3, + None, + '___sec20'), + ('Classical PCA Theorem', 2, None, '___sec21'), + ('Proof of the PCA Theorem', 2, None, '___sec22'), + ('PCA Proof continued', 2, None, '___sec23'), + ('The final step', 2, None, '___sec24'), + ('Principal Component Analysis', 2, None, '___sec25'), + ('PCA and scikit-learn', 2, None, '___sec26'), + ('Back to the Cancer Data', 2, None, '___sec27'), + ('More on the PCA', 2, None, '___sec28'), + ('Incremental PCA', 2, None, '___sec29'), + ('Randomized PCA', 2, None, '___sec30'), + ('Kernel PCA', 2, None, '___sec31'), + ('LLE', 2, None, '___sec32'), + ('Other techniques', 2, None, '___sec33')]} end of tocinfo --> @@ -139,36 +150,40 @@ MathJax.Hub.Config({ @@ -262,7 +277,7 @@ $$
  • 19
  • 20
  • ...
  • -
  • 31
  • +
  • 32
  • »
  • diff --git a/doc/pub/DimRed/html/._DimRed-bs011.html b/doc/pub/DimRed/html/._DimRed-bs011.html index 0b8212479..77d5296ca 100644 --- a/doc/pub/DimRed/html/._DimRed-bs011.html +++ b/doc/pub/DimRed/html/._DimRed-bs011.html @@ -89,19 +89,30 @@ Automatically generated HTML file from DocOnce source '___sec14'), ('Towards the PCA theorem', 2, None, '___sec15'), ('The Algorithm before the Theorem', 2, None, '___sec16'), - ('Classical PCA Theorem', 2, None, '___sec17'), - ('Proof of the PCA Theorem', 2, None, '___sec18'), - ('PCA Proof continued', 2, None, '___sec19'), - ('The final step', 2, None, '___sec20'), - ('Principal Component Analysis', 2, None, '___sec21'), - ('PCA and scikit-learn', 2, None, '___sec22'), - ('Back to the Cancer Data', 2, None, '___sec23'), - ('More on the PCA', 2, None, '___sec24'), - ('Incremental PCA', 2, None, '___sec25'), - ('Randomized PCA', 2, None, '___sec26'), - ('Kernel PCA', 2, None, '___sec27'), - ('LLE', 2, None, '___sec28'), - ('Other techniques', 2, None, '___sec29')]} + ('Writing our own PCA code', 2, None, '___sec17'), + ('Compute the sample mean and center the data', + 3, + None, + '___sec18'), + ('Compute the sample covariance', 3, None, '___sec19'), + ('Diagonalize the sample covariance matrix to obtain the ' + 'principal components', + 3, + None, + '___sec20'), + ('Classical PCA Theorem', 2, None, '___sec21'), + ('Proof of the PCA Theorem', 2, None, '___sec22'), + ('PCA Proof continued', 2, None, '___sec23'), + ('The final step', 2, None, '___sec24'), + ('Principal Component Analysis', 2, None, '___sec25'), + ('PCA and scikit-learn', 2, None, '___sec26'), + ('Back to the Cancer Data', 2, None, '___sec27'), + ('More on the PCA', 2, None, '___sec28'), + ('Incremental PCA', 2, None, '___sec29'), + ('Randomized PCA', 2, None, '___sec30'), + ('Kernel PCA', 2, None, '___sec31'), + ('LLE', 2, None, '___sec32'), + ('Other techniques', 2, None, '___sec33')]} end of tocinfo --> @@ -139,36 +150,40 @@ MathJax.Hub.Config({ @@ -250,7 +265,7 @@ C = np.c
  • 20
  • 21
  • ...
  • -
  • 31
  • +
  • 32
  • »
  • diff --git a/doc/pub/DimRed/html/._DimRed-bs012.html b/doc/pub/DimRed/html/._DimRed-bs012.html index b8c4a9bf3..7a8763b59 100644 --- a/doc/pub/DimRed/html/._DimRed-bs012.html +++ b/doc/pub/DimRed/html/._DimRed-bs012.html @@ -89,19 +89,30 @@ Automatically generated HTML file from DocOnce source '___sec14'), ('Towards the PCA theorem', 2, None, '___sec15'), ('The Algorithm before the Theorem', 2, None, '___sec16'), - ('Classical PCA Theorem', 2, None, '___sec17'), - ('Proof of the PCA Theorem', 2, None, '___sec18'), - ('PCA Proof continued', 2, None, '___sec19'), - ('The final step', 2, None, '___sec20'), - ('Principal Component Analysis', 2, None, '___sec21'), - ('PCA and scikit-learn', 2, None, '___sec22'), - ('Back to the Cancer Data', 2, None, '___sec23'), - ('More on the PCA', 2, None, '___sec24'), - ('Incremental PCA', 2, None, '___sec25'), - ('Randomized PCA', 2, None, '___sec26'), - ('Kernel PCA', 2, None, '___sec27'), - ('LLE', 2, None, '___sec28'), - ('Other techniques', 2, None, '___sec29')]} + ('Writing our own PCA code', 2, None, '___sec17'), + ('Compute the sample mean and center the data', + 3, + None, + '___sec18'), + ('Compute the sample covariance', 3, None, '___sec19'), + ('Diagonalize the sample covariance matrix to obtain the ' + 'principal components', + 3, + None, + '___sec20'), + ('Classical PCA Theorem', 2, None, '___sec21'), + ('Proof of the PCA Theorem', 2, None, '___sec22'), + ('PCA Proof continued', 2, None, '___sec23'), + ('The final step', 2, None, '___sec24'), + ('Principal Component Analysis', 2, None, '___sec25'), + ('PCA and scikit-learn', 2, None, '___sec26'), + ('Back to the Cancer Data', 2, None, '___sec27'), + ('More on the PCA', 2, None, '___sec28'), + ('Incremental PCA', 2, None, '___sec29'), + ('Randomized PCA', 2, None, '___sec30'), + ('Kernel PCA', 2, None, '___sec31'), + ('LLE', 2, None, '___sec32'), + ('Other techniques', 2, None, '___sec33')]} end of tocinfo --> @@ -139,36 +150,40 @@ MathJax.Hub.Config({ @@ -252,7 +267,7 @@ The above procedure with numpy can be made more compact if we use pand
  • 21
  • 22
  • ...
  • -
  • 31
  • +
  • 32
  • »
  • diff --git a/doc/pub/DimRed/html/._DimRed-bs013.html b/doc/pub/DimRed/html/._DimRed-bs013.html index 3e0982c2d..2ab2ddff5 100644 --- a/doc/pub/DimRed/html/._DimRed-bs013.html +++ b/doc/pub/DimRed/html/._DimRed-bs013.html @@ -89,19 +89,30 @@ Automatically generated HTML file from DocOnce source '___sec14'), ('Towards the PCA theorem', 2, None, '___sec15'), ('The Algorithm before the Theorem', 2, None, '___sec16'), - ('Classical PCA Theorem', 2, None, '___sec17'), - ('Proof of the PCA Theorem', 2, None, '___sec18'), - ('PCA Proof continued', 2, None, '___sec19'), - ('The final step', 2, None, '___sec20'), - ('Principal Component Analysis', 2, None, '___sec21'), - ('PCA and scikit-learn', 2, None, '___sec22'), - ('Back to the Cancer Data', 2, None, '___sec23'), - ('More on the PCA', 2, None, '___sec24'), - ('Incremental PCA', 2, None, '___sec25'), - ('Randomized PCA', 2, None, '___sec26'), - ('Kernel PCA', 2, None, '___sec27'), - ('LLE', 2, None, '___sec28'), - ('Other techniques', 2, None, '___sec29')]} + ('Writing our own PCA code', 2, None, '___sec17'), + ('Compute the sample mean and center the data', + 3, + None, + '___sec18'), + ('Compute the sample covariance', 3, None, '___sec19'), + ('Diagonalize the sample covariance matrix to obtain the ' + 'principal components', + 3, + None, + '___sec20'), + ('Classical PCA Theorem', 2, None, '___sec21'), + ('Proof of the PCA Theorem', 2, None, '___sec22'), + ('PCA Proof continued', 2, None, '___sec23'), + ('The final step', 2, None, '___sec24'), + ('Principal Component Analysis', 2, None, '___sec25'), + ('PCA and scikit-learn', 2, None, '___sec26'), + ('Back to the Cancer Data', 2, None, '___sec27'), + ('More on the PCA', 2, None, '___sec28'), + ('Incremental PCA', 2, None, '___sec29'), + ('Randomized PCA', 2, None, '___sec30'), + ('Kernel PCA', 2, None, '___sec31'), + ('LLE', 2, None, '___sec32'), + ('Other techniques', 2, None, '___sec33')]} end of tocinfo --> @@ -139,36 +150,40 @@ MathJax.Hub.Config({ @@ -234,7 +249,7 @@ We expand this model to the Franke function discussed above.
  • 22
  • 23
  • ...
  • -
  • 31
  • +
  • 32
  • »
  • diff --git a/doc/pub/DimRed/html/._DimRed-bs014.html b/doc/pub/DimRed/html/._DimRed-bs014.html index 77882c670..d7c6c6753 100644 --- a/doc/pub/DimRed/html/._DimRed-bs014.html +++ b/doc/pub/DimRed/html/._DimRed-bs014.html @@ -89,19 +89,30 @@ Automatically generated HTML file from DocOnce source '___sec14'), ('Towards the PCA theorem', 2, None, '___sec15'), ('The Algorithm before the Theorem', 2, None, '___sec16'), - ('Classical PCA Theorem', 2, None, '___sec17'), - ('Proof of the PCA Theorem', 2, None, '___sec18'), - ('PCA Proof continued', 2, None, '___sec19'), - ('The final step', 2, None, '___sec20'), - ('Principal Component Analysis', 2, None, '___sec21'), - ('PCA and scikit-learn', 2, None, '___sec22'), - ('Back to the Cancer Data', 2, None, '___sec23'), - ('More on the PCA', 2, None, '___sec24'), - ('Incremental PCA', 2, None, '___sec25'), - ('Randomized PCA', 2, None, '___sec26'), - ('Kernel PCA', 2, None, '___sec27'), - ('LLE', 2, None, '___sec28'), - ('Other techniques', 2, None, '___sec29')]} + ('Writing our own PCA code', 2, None, '___sec17'), + ('Compute the sample mean and center the data', + 3, + None, + '___sec18'), + ('Compute the sample covariance', 3, None, '___sec19'), + ('Diagonalize the sample covariance matrix to obtain the ' + 'principal components', + 3, + None, + '___sec20'), + ('Classical PCA Theorem', 2, None, '___sec21'), + ('Proof of the PCA Theorem', 2, None, '___sec22'), + ('PCA Proof continued', 2, None, '___sec23'), + ('The final step', 2, None, '___sec24'), + ('Principal Component Analysis', 2, None, '___sec25'), + ('PCA and scikit-learn', 2, None, '___sec26'), + ('Back to the Cancer Data', 2, None, '___sec27'), + ('More on the PCA', 2, None, '___sec28'), + ('Incremental PCA', 2, None, '___sec29'), + ('Randomized PCA', 2, None, '___sec30'), + ('Kernel PCA', 2, None, '___sec31'), + ('LLE', 2, None, '___sec32'), + ('Other techniques', 2, None, '___sec33')]} end of tocinfo --> @@ -139,36 +150,40 @@ MathJax.Hub.Config({ @@ -270,7 +285,7 @@ matrix.
  • 23
  • 24
  • ...
  • -
  • 31
  • +
  • 32
  • »
  • diff --git a/doc/pub/DimRed/html/._DimRed-bs015.html b/doc/pub/DimRed/html/._DimRed-bs015.html index 865870b95..86ccf8390 100644 --- a/doc/pub/DimRed/html/._DimRed-bs015.html +++ b/doc/pub/DimRed/html/._DimRed-bs015.html @@ -89,19 +89,30 @@ Automatically generated HTML file from DocOnce source '___sec14'), ('Towards the PCA theorem', 2, None, '___sec15'), ('The Algorithm before the Theorem', 2, None, '___sec16'), - ('Classical PCA Theorem', 2, None, '___sec17'), - ('Proof of the PCA Theorem', 2, None, '___sec18'), - ('PCA Proof continued', 2, None, '___sec19'), - ('The final step', 2, None, '___sec20'), - ('Principal Component Analysis', 2, None, '___sec21'), - ('PCA and scikit-learn', 2, None, '___sec22'), - ('Back to the Cancer Data', 2, None, '___sec23'), - ('More on the PCA', 2, None, '___sec24'), - ('Incremental PCA', 2, None, '___sec25'), - ('Randomized PCA', 2, None, '___sec26'), - ('Kernel PCA', 2, None, '___sec27'), - ('LLE', 2, None, '___sec28'), - ('Other techniques', 2, None, '___sec29')]} + ('Writing our own PCA code', 2, None, '___sec17'), + ('Compute the sample mean and center the data', + 3, + None, + '___sec18'), + ('Compute the sample covariance', 3, None, '___sec19'), + ('Diagonalize the sample covariance matrix to obtain the ' + 'principal components', + 3, + None, + '___sec20'), + ('Classical PCA Theorem', 2, None, '___sec21'), + ('Proof of the PCA Theorem', 2, None, '___sec22'), + ('PCA Proof continued', 2, None, '___sec23'), + ('The final step', 2, None, '___sec24'), + ('Principal Component Analysis', 2, None, '___sec25'), + ('PCA and scikit-learn', 2, None, '___sec26'), + ('Back to the Cancer Data', 2, None, '___sec27'), + ('More on the PCA', 2, None, '___sec28'), + ('Incremental PCA', 2, None, '___sec29'), + ('Randomized PCA', 2, None, '___sec30'), + ('Kernel PCA', 2, None, '___sec31'), + ('LLE', 2, None, '___sec32'), + ('Other techniques', 2, None, '___sec33')]} end of tocinfo --> @@ -139,36 +150,40 @@ MathJax.Hub.Config({ @@ -250,7 +265,7 @@ It is easy to generalize this to a matrix \( \boldsymbol{X}\in {\mathbb{R}}^{n\t
  • 24
  • 25
  • ...
  • -
  • 31
  • +
  • 32
  • »
  • diff --git a/doc/pub/DimRed/html/._DimRed-bs016.html b/doc/pub/DimRed/html/._DimRed-bs016.html index c1988b0b0..6f742428c 100644 --- a/doc/pub/DimRed/html/._DimRed-bs016.html +++ b/doc/pub/DimRed/html/._DimRed-bs016.html @@ -89,19 +89,30 @@ Automatically generated HTML file from DocOnce source '___sec14'), ('Towards the PCA theorem', 2, None, '___sec15'), ('The Algorithm before the Theorem', 2, None, '___sec16'), - ('Classical PCA Theorem', 2, None, '___sec17'), - ('Proof of the PCA Theorem', 2, None, '___sec18'), - ('PCA Proof continued', 2, None, '___sec19'), - ('The final step', 2, None, '___sec20'), - ('Principal Component Analysis', 2, None, '___sec21'), - ('PCA and scikit-learn', 2, None, '___sec22'), - ('Back to the Cancer Data', 2, None, '___sec23'), - ('More on the PCA', 2, None, '___sec24'), - ('Incremental PCA', 2, None, '___sec25'), - ('Randomized PCA', 2, None, '___sec26'), - ('Kernel PCA', 2, None, '___sec27'), - ('LLE', 2, None, '___sec28'), - ('Other techniques', 2, None, '___sec29')]} + ('Writing our own PCA code', 2, None, '___sec17'), + ('Compute the sample mean and center the data', + 3, + None, + '___sec18'), + ('Compute the sample covariance', 3, None, '___sec19'), + ('Diagonalize the sample covariance matrix to obtain the ' + 'principal components', + 3, + None, + '___sec20'), + ('Classical PCA Theorem', 2, None, '___sec21'), + ('Proof of the PCA Theorem', 2, None, '___sec22'), + ('PCA Proof continued', 2, None, '___sec23'), + ('The final step', 2, None, '___sec24'), + ('Principal Component Analysis', 2, None, '___sec25'), + ('PCA and scikit-learn', 2, None, '___sec26'), + ('Back to the Cancer Data', 2, None, '___sec27'), + ('More on the PCA', 2, None, '___sec28'), + ('Incremental PCA', 2, None, '___sec29'), + ('Randomized PCA', 2, None, '___sec30'), + ('Kernel PCA', 2, None, '___sec31'), + ('LLE', 2, None, '___sec32'), + ('Other techniques', 2, None, '___sec33')]} end of tocinfo --> @@ -139,36 +150,40 @@ MathJax.Hub.Config({ @@ -258,7 +273,7 @@ features/predictors.
  • 25
  • 26
  • ...
  • -
  • 31
  • +
  • 32
  • »
  • diff --git a/doc/pub/DimRed/html/._DimRed-bs017.html b/doc/pub/DimRed/html/._DimRed-bs017.html index 73aecf9a2..3d8d8fdb9 100644 --- a/doc/pub/DimRed/html/._DimRed-bs017.html +++ b/doc/pub/DimRed/html/._DimRed-bs017.html @@ -89,19 +89,30 @@ Automatically generated HTML file from DocOnce source '___sec14'), ('Towards the PCA theorem', 2, None, '___sec15'), ('The Algorithm before the Theorem', 2, None, '___sec16'), - ('Classical PCA Theorem', 2, None, '___sec17'), - ('Proof of the PCA Theorem', 2, None, '___sec18'), - ('PCA Proof continued', 2, None, '___sec19'), - ('The final step', 2, None, '___sec20'), - ('Principal Component Analysis', 2, None, '___sec21'), - ('PCA and scikit-learn', 2, None, '___sec22'), - ('Back to the Cancer Data', 2, None, '___sec23'), - ('More on the PCA', 2, None, '___sec24'), - ('Incremental PCA', 2, None, '___sec25'), - ('Randomized PCA', 2, None, '___sec26'), - ('Kernel PCA', 2, None, '___sec27'), - ('LLE', 2, None, '___sec28'), - ('Other techniques', 2, None, '___sec29')]} + ('Writing our own PCA code', 2, None, '___sec17'), + ('Compute the sample mean and center the data', + 3, + None, + '___sec18'), + ('Compute the sample covariance', 3, None, '___sec19'), + ('Diagonalize the sample covariance matrix to obtain the ' + 'principal components', + 3, + None, + '___sec20'), + ('Classical PCA Theorem', 2, None, '___sec21'), + ('Proof of the PCA Theorem', 2, None, '___sec22'), + ('PCA Proof continued', 2, None, '___sec23'), + ('The final step', 2, None, '___sec24'), + ('Principal Component Analysis', 2, None, '___sec25'), + ('PCA and scikit-learn', 2, None, '___sec26'), + ('Back to the Cancer Data', 2, None, '___sec27'), + ('More on the PCA', 2, None, '___sec28'), + ('Incremental PCA', 2, None, '___sec29'), + ('Randomized PCA', 2, None, '___sec30'), + ('Kernel PCA', 2, None, '___sec31'), + ('LLE', 2, None, '___sec32'), + ('Other techniques', 2, None, '___sec33')]} end of tocinfo --> @@ -139,36 +150,40 @@ MathJax.Hub.Config({ @@ -213,9 +228,6 @@ $$
  • Keep only those \( l \) eigenvalues larger than a selected threshold value, discarding thus \( p-l \) features since we expect small variations in the data here.
  • -After this we ask ourselves how do we prove the link between the maximum variance and the feature reduction. - -

    diff --git a/doc/pub/DimRed/html/._DimRed-bs018.html b/doc/pub/DimRed/html/._DimRed-bs018.html index e0bd197b8..0455b1a78 100644 --- a/doc/pub/DimRed/html/._DimRed-bs018.html +++ b/doc/pub/DimRed/html/._DimRed-bs018.html @@ -89,19 +89,30 @@ Automatically generated HTML file from DocOnce source '___sec14'), ('Towards the PCA theorem', 2, None, '___sec15'), ('The Algorithm before the Theorem', 2, None, '___sec16'), - ('Classical PCA Theorem', 2, None, '___sec17'), - ('Proof of the PCA Theorem', 2, None, '___sec18'), - ('PCA Proof continued', 2, None, '___sec19'), - ('The final step', 2, None, '___sec20'), - ('Principal Component Analysis', 2, None, '___sec21'), - ('PCA and scikit-learn', 2, None, '___sec22'), - ('Back to the Cancer Data', 2, None, '___sec23'), - ('More on the PCA', 2, None, '___sec24'), - ('Incremental PCA', 2, None, '___sec25'), - ('Randomized PCA', 2, None, '___sec26'), - ('Kernel PCA', 2, None, '___sec27'), - ('LLE', 2, None, '___sec28'), - ('Other techniques', 2, None, '___sec29')]} + ('Writing our own PCA code', 2, None, '___sec17'), + ('Compute the sample mean and center the data', + 3, + None, + '___sec18'), + ('Compute the sample covariance', 3, None, '___sec19'), + ('Diagonalize the sample covariance matrix to obtain the ' + 'principal components', + 3, + None, + '___sec20'), + ('Classical PCA Theorem', 2, None, '___sec21'), + ('Proof of the PCA Theorem', 2, None, '___sec22'), + ('PCA Proof continued', 2, None, '___sec23'), + ('The final step', 2, None, '___sec24'), + ('Principal Component Analysis', 2, None, '___sec25'), + ('PCA and scikit-learn', 2, None, '___sec26'), + ('Back to the Cancer Data', 2, None, '___sec27'), + ('More on the PCA', 2, None, '___sec28'), + ('Incremental PCA', 2, None, '___sec29'), + ('Randomized PCA', 2, None, '___sec30'), + ('Kernel PCA', 2, None, '___sec31'), + ('LLE', 2, None, '___sec32'), + ('Other techniques', 2, None, '___sec33')]} end of tocinfo --> @@ -139,36 +150,40 @@ MathJax.Hub.Config({ @@ -184,23 +199,102 @@ MathJax.Hub.Config({ -

    Classical PCA Theorem

    +

    Writing our own PCA code

    -We assume now that we have a design matrix \( \boldsymbol{X} \) which has been centered as discussed above. For the sake of simplicity we skip the overline symbol. The matrix is defined in terms of the various column vectors \( [\boldsymbol{x}_0,\boldsymbol{x}_1,\dots, \boldsymbol{x}_{p-1}] \) -each with dimension \( \boldsymbol{x}\in {\mathbb{R}}^{n} \). - -

    -We assume also that we have an orthogonal transformation \( \boldsymbol{W}\in {\mathbb{R}}^{p\times p} \). We define the reconstruction error (which is similar to the mean squared error we have seen before) as +We will use a simple example first with two-dimensional data +drawn from a multivariate normal distribution with the following mean and covariance matrix: $$ -J(\boldsymbol{W},\boldsymbol{Z}) = \frac{1}{n}\sum_i (\boldsymbol{x}_i - \overline{\boldsymbol{x}}_i)^2, +\mu = (-1,2) \qquad \Sigma = \begin{bmatrix} 4 & 2 \\ +2 & 2 +\end{bmatrix} $$ -with \( \overline{\boldsymbol{x}}_i = \boldsymbol{W}\boldsymbol{z}_i \), where \( \boldsymbol{z}_i \) is a row vector with dimension \( {\mathbb{R}}^{n} \) of the matrix -\( \boldsymbol{Z}\in{\mathbb{R}}^{p\times n} \). When doing PCA we want to reduce this dimensionality. +

    +We will generate \( N = 1000 \) points \( X = \{ x_1, \ldots, x_N \} \) from +this distribution, and store them in the \( 1000 \times 2 \) matrix \( \boldsymbol{X} \).

    -The PCA theorem states that minimizing the above reconstruction error corresponds to setting \( \boldsymbol{W}=\boldsymbol{S} \), the orthogonal matrix which diagonalizes the empirical covariance(correlation) matrix. The optimal low-dimensional encoding of the data is then given by a set of vectors \( \boldsymbol{z}_i \) with at most \( l \) vectors, with \( l < < p \), defined by the orthogonal projection of the data onto the columns spanned by the eigenvectors of the covariance(correlations matrix). +The following Python code aids in setting up the data + +

    + + +

    N = 1000
    +mean = (-1, 2)
    +cov = [[4, 2], [2, 2]]
    +X = np.random.multivariate_normal(mean, cov, N)
    +
    +

    +Make a small Python code which plots the data. + +

    +Now we are going to implement the PCA algorithm. We will break it down into sub-steps and across multiple cells. + +

    Compute the sample mean and center the data

    + +

    +The first step of PCA is to compute the sample mean of the data and use it to center the data. Recall the sample mean is +$$ +\mu_N = \frac{1}{N} \sum_{i=1}^N x_i +$$ + +and the mean-centered data \( \bar{X} = \{ \bar{x}_1, \ldots, \bar{x}_N \} \) takes the form +$$ +\bar{x}_i = x_i - \mu_N +$$ + +When you are done with these steps, print out \( \mu_N \) to verify it is +close to \( \mu \) and plot your mean centered data to verify it is +centered at the origin! Compare your code with the functionality from Scikit-Learn discussed above. + +

    Compute the sample covariance

    + +

    +Now we are going to use the mean centered data to compute the sample covariance of the data. Recall it is given by: +$$ +\begin{equation*} +\Sigma_N = \frac{1}{N-1} \sum_{i=1}^N \bar{x}_i^T \bar{x}_i = \frac{1}{N-1} \sum_{i=1}^N (x_i - \mu_N)^T (x_i - \mu_N) +\end{equation*} +$$ + +where the data points \( x_i \in \mathbb{R}^p \) (here in this example \( p = 2 \)) are column vectors and \( x^T \) is the transpose of \( x \). +Compare the computed covariance with the answer given above. + +

    Diagonalize the sample covariance matrix to obtain the principal components

    + +

    +Now we are ready to solve for the principal components! To do so we +diagonalize the sample covariance matrix \( \Sigma_N \). We can use the +function np.linalg.eig to do so. It will return the eigenvalues and +eigenvectors of \( \Sigma_N \). Once you have these, carry out the +following tasks: + +

    + +$$ +\begin{equation*} +x_i \approx \tilde{x}_i := \mu_N + \langle x_i, v_0 \rangle v_0 +\end{equation*} +$$ + +where \( v_0 \) is the first principal component. What do you observe? + +

    +Finally, collect all these steps and write your own PCA function and +compare this with the functionality included in Scikit-Learn. +Have the input be the data and have the output be the principal components and their associated eigenvalues, sorted in descending order. Can you think of a way to make it more efficient than the algorithm outlined above? + +

    +Finally, try out your own PCA function with other data sets. + +

    +After this we ask ourselves how do we prove the link between the maximum variance and the feature reduction.

    @@ -228,7 +322,7 @@ The PCA theorem states that minimizing the above reconstruction error correspond

  • 27
  • 28
  • ...
  • -
  • 31
  • +
  • 32
  • »
  • diff --git a/doc/pub/DimRed/html/._DimRed-bs019.html b/doc/pub/DimRed/html/._DimRed-bs019.html index a6e981422..cce5ff3ab 100644 --- a/doc/pub/DimRed/html/._DimRed-bs019.html +++ b/doc/pub/DimRed/html/._DimRed-bs019.html @@ -89,19 +89,30 @@ Automatically generated HTML file from DocOnce source '___sec14'), ('Towards the PCA theorem', 2, None, '___sec15'), ('The Algorithm before the Theorem', 2, None, '___sec16'), - ('Classical PCA Theorem', 2, None, '___sec17'), - ('Proof of the PCA Theorem', 2, None, '___sec18'), - ('PCA Proof continued', 2, None, '___sec19'), - ('The final step', 2, None, '___sec20'), - ('Principal Component Analysis', 2, None, '___sec21'), - ('PCA and scikit-learn', 2, None, '___sec22'), - ('Back to the Cancer Data', 2, None, '___sec23'), - ('More on the PCA', 2, None, '___sec24'), - ('Incremental PCA', 2, None, '___sec25'), - ('Randomized PCA', 2, None, '___sec26'), - ('Kernel PCA', 2, None, '___sec27'), - ('LLE', 2, None, '___sec28'), - ('Other techniques', 2, None, '___sec29')]} + ('Writing our own PCA code', 2, None, '___sec17'), + ('Compute the sample mean and center the data', + 3, + None, + '___sec18'), + ('Compute the sample covariance', 3, None, '___sec19'), + ('Diagonalize the sample covariance matrix to obtain the ' + 'principal components', + 3, + None, + '___sec20'), + ('Classical PCA Theorem', 2, None, '___sec21'), + ('Proof of the PCA Theorem', 2, None, '___sec22'), + ('PCA Proof continued', 2, None, '___sec23'), + ('The final step', 2, None, '___sec24'), + ('Principal Component Analysis', 2, None, '___sec25'), + ('PCA and scikit-learn', 2, None, '___sec26'), + ('Back to the Cancer Data', 2, None, '___sec27'), + ('More on the PCA', 2, None, '___sec28'), + ('Incremental PCA', 2, None, '___sec29'), + ('Randomized PCA', 2, None, '___sec30'), + ('Kernel PCA', 2, None, '___sec31'), + ('LLE', 2, None, '___sec32'), + ('Other techniques', 2, None, '___sec33')]} end of tocinfo --> @@ -139,36 +150,40 @@ MathJax.Hub.Config({ @@ -184,25 +199,23 @@ MathJax.Hub.Config({ -

    Proof of the PCA Theorem

    +

    Classical PCA Theorem

    -To show the PCA theorem let us start with the assumption that there is one vector \( \boldsymbol{w}_0 \) which corresponds to a solution which minimized the reconstruction error \( J \). This is an orthogonal vector. It means that we now approximate the reconstruction error in terms of \( \boldsymbol{w}_0 \) and \( \boldsymbol{z}_0 \) as +We assume now that we have a design matrix \( \boldsymbol{X} \) which has been centered as discussed above. For the sake of simplicity we skip the overline symbol. The matrix is defined in terms of the various column vectors \( [\boldsymbol{x}_0,\boldsymbol{x}_1,\dots, \boldsymbol{x}_{p-1}] \) +each with dimension \( \boldsymbol{x}\in {\mathbb{R}}^{n} \). + +

    +We assume also that we have an orthogonal transformation \( \boldsymbol{W}\in {\mathbb{R}}^{p\times p} \). We define the reconstruction error (which is similar to the mean squared error we have seen before) as $$ -J(\boldsymbol{w}_0,\boldsymbol{z}_0)= \frac{1}{n}\sum_i (\boldsymbol{x}_i - z_{i0}\boldsymbol{w}_0)^2=\frac{1}{n}\sum_i (\boldsymbol{x}_i^T\boldsymbol{x}_i - 2z_{i0}\boldsymbol{w}_0^T\boldsymbol{x}_i+z_{i0}^2\boldsymbol{w}_0^T\boldsymbol{w}_0), +J(\boldsymbol{W},\boldsymbol{Z}) = \frac{1}{n}\sum_i (\boldsymbol{x}_i - \overline{\boldsymbol{x}}_i)^2, $$ -which we can rewrite due to the orthogonality of \( \boldsymbol{w}_i \) as -$$ -J(\boldsymbol{w}_0,\boldsymbol{z}_0)=\frac{1}{n}\sum_i (\boldsymbol{x}_i^T\boldsymbol{x}_i - 2z_{i0}\boldsymbol{w}_0^T\boldsymbol{x}_i+z_{i0}^2). -$$ +with \( \overline{\boldsymbol{x}}_i = \boldsymbol{W}\boldsymbol{z}_i \), where \( \boldsymbol{z}_i \) is a row vector with dimension \( {\mathbb{R}}^{n} \) of the matrix +\( \boldsymbol{Z}\in{\mathbb{R}}^{p\times n} \). When doing PCA we want to reduce this dimensionality. -Minimizing \( J \) with respect to the unknown parameters \( z_{0i} \) we obtain that -$$ -z_{i0}=\boldsymbol{w}_0^T\boldsymbol{x}_i, -$$ - -where the vectors on the rhs are known. +

    +The PCA theorem states that minimizing the above reconstruction error corresponds to setting \( \boldsymbol{W}=\boldsymbol{S} \), the orthogonal matrix which diagonalizes the empirical covariance(correlation) matrix. The optimal low-dimensional encoding of the data is then given by a set of vectors \( \boldsymbol{z}_i \) with at most \( l \) vectors, with \( l < < p \), defined by the orthogonal projection of the data onto the columns spanned by the eigenvectors of the covariance(correlations matrix).

    @@ -230,7 +243,7 @@ where the vectors on the rhs are known.

  • 28
  • 29
  • ...
  • -
  • 31
  • +
  • 32
  • »
  • diff --git a/doc/pub/DimRed/html/._DimRed-bs020.html b/doc/pub/DimRed/html/._DimRed-bs020.html index d1e36909d..536339c85 100644 --- a/doc/pub/DimRed/html/._DimRed-bs020.html +++ b/doc/pub/DimRed/html/._DimRed-bs020.html @@ -89,19 +89,30 @@ Automatically generated HTML file from DocOnce source '___sec14'), ('Towards the PCA theorem', 2, None, '___sec15'), ('The Algorithm before the Theorem', 2, None, '___sec16'), - ('Classical PCA Theorem', 2, None, '___sec17'), - ('Proof of the PCA Theorem', 2, None, '___sec18'), - ('PCA Proof continued', 2, None, '___sec19'), - ('The final step', 2, None, '___sec20'), - ('Principal Component Analysis', 2, None, '___sec21'), - ('PCA and scikit-learn', 2, None, '___sec22'), - ('Back to the Cancer Data', 2, None, '___sec23'), - ('More on the PCA', 2, None, '___sec24'), - ('Incremental PCA', 2, None, '___sec25'), - ('Randomized PCA', 2, None, '___sec26'), - ('Kernel PCA', 2, None, '___sec27'), - ('LLE', 2, None, '___sec28'), - ('Other techniques', 2, None, '___sec29')]} + ('Writing our own PCA code', 2, None, '___sec17'), + ('Compute the sample mean and center the data', + 3, + None, + '___sec18'), + ('Compute the sample covariance', 3, None, '___sec19'), + ('Diagonalize the sample covariance matrix to obtain the ' + 'principal components', + 3, + None, + '___sec20'), + ('Classical PCA Theorem', 2, None, '___sec21'), + ('Proof of the PCA Theorem', 2, None, '___sec22'), + ('PCA Proof continued', 2, None, '___sec23'), + ('The final step', 2, None, '___sec24'), + ('Principal Component Analysis', 2, None, '___sec25'), + ('PCA and scikit-learn', 2, None, '___sec26'), + ('Back to the Cancer Data', 2, None, '___sec27'), + ('More on the PCA', 2, None, '___sec28'), + ('Incremental PCA', 2, None, '___sec29'), + ('Randomized PCA', 2, None, '___sec30'), + ('Kernel PCA', 2, None, '___sec31'), + ('LLE', 2, None, '___sec32'), + ('Other techniques', 2, None, '___sec33')]} end of tocinfo --> @@ -139,36 +150,40 @@ MathJax.Hub.Config({ @@ -184,40 +199,25 @@ MathJax.Hub.Config({ -

    PCA Proof continued

    +

    Proof of the PCA Theorem

    -We have now found the unknown parameters \( z_{i0} \). These correspond to the projected coordinates and we can write +To show the PCA theorem let us start with the assumption that there is one vector \( \boldsymbol{w}_0 \) which corresponds to a solution which minimized the reconstruction error \( J \). This is an orthogonal vector. It means that we now approximate the reconstruction error in terms of \( \boldsymbol{w}_0 \) and \( \boldsymbol{z}_0 \) as $$ -J(\boldsymbol{w}_0)= \frac{1}{p}\sum_i (\boldsymbol{x}_i^T\boldsymbol{x}_i - z_{i0}^2)=\mathrm{const}-\frac{1}{n}\sum_i z_{i0}^2. +J(\boldsymbol{w}_0,\boldsymbol{z}_0)= \frac{1}{n}\sum_i (\boldsymbol{x}_i - z_{i0}\boldsymbol{w}_0)^2=\frac{1}{n}\sum_i (\boldsymbol{x}_i^T\boldsymbol{x}_i - 2z_{i0}\boldsymbol{w}_0^T\boldsymbol{x}_i+z_{i0}^2\boldsymbol{w}_0^T\boldsymbol{w}_0), $$ -

    -We can show that the variance of the projected coordinates defined by \( \boldsymbol{w}_0^T\boldsymbol{x}_i \) are given by +which we can rewrite due to the orthogonality of \( \boldsymbol{w}_i \) as $$ -\mathrm{var}[\boldsymbol{w}_0^T\boldsymbol{x}_i] = \frac{1}{n}\sum_i z_{i0}^2, +J(\boldsymbol{w}_0,\boldsymbol{z}_0)=\frac{1}{n}\sum_i (\boldsymbol{x}_i^T\boldsymbol{x}_i - 2z_{i0}\boldsymbol{w}_0^T\boldsymbol{x}_i+z_{i0}^2). $$ -since the expectation value of +Minimizing \( J \) with respect to the unknown parameters \( z_{0i} \) we obtain that $$ -\mathbb{E}[\boldsymbol{w}_0^T\boldsymbol{x}_i] = \mathbb{E}[z_{i0}]= \boldsymbol{w}_0^T\mathbb{E}[\boldsymbol{x}_i]=0, +z_{i0}=\boldsymbol{w}_0^T\boldsymbol{x}_i, $$ -where we have used the fact that our data are centered. - -

    -Recalling our definition of the covariance as -$$ -\boldsymbol{C}[\boldsymbol{x}] = \frac{1}{n}\boldsymbol{X}\boldsymbol{X}^T=\mathbb{E}[\boldsymbol{X}\boldsymbol{X}^T], -$$ - -we have thus that -$$ -\mathrm{var}[\boldsymbol{w}_0^T\boldsymbol{x}_i] = \frac{1}{n}\sum_i z_{i0}^2=\boldsymbol{w}_0^T\boldsymbol{C}[\boldsymbol{x}]\boldsymbol{w}_0. -$$ - -

    -We are almost there, we have obtained a relation between minimizing the reconstruction error and the variance and the covariance matrix. Minimizing the error is equivalent to maximizing the variance of the projected data. +where the vectors on the rhs are known.

    @@ -245,7 +245,7 @@ We are almost there, we have obtained a relation between minimizing the reconstr

  • 29
  • 30
  • ...
  • -
  • 31
  • +
  • 32
  • »
  • diff --git a/doc/pub/DimRed/html/._DimRed-bs021.html b/doc/pub/DimRed/html/._DimRed-bs021.html index ee37e1a02..2ecf2204b 100644 --- a/doc/pub/DimRed/html/._DimRed-bs021.html +++ b/doc/pub/DimRed/html/._DimRed-bs021.html @@ -89,19 +89,30 @@ Automatically generated HTML file from DocOnce source '___sec14'), ('Towards the PCA theorem', 2, None, '___sec15'), ('The Algorithm before the Theorem', 2, None, '___sec16'), - ('Classical PCA Theorem', 2, None, '___sec17'), - ('Proof of the PCA Theorem', 2, None, '___sec18'), - ('PCA Proof continued', 2, None, '___sec19'), - ('The final step', 2, None, '___sec20'), - ('Principal Component Analysis', 2, None, '___sec21'), - ('PCA and scikit-learn', 2, None, '___sec22'), - ('Back to the Cancer Data', 2, None, '___sec23'), - ('More on the PCA', 2, None, '___sec24'), - ('Incremental PCA', 2, None, '___sec25'), - ('Randomized PCA', 2, None, '___sec26'), - ('Kernel PCA', 2, None, '___sec27'), - ('LLE', 2, None, '___sec28'), - ('Other techniques', 2, None, '___sec29')]} + ('Writing our own PCA code', 2, None, '___sec17'), + ('Compute the sample mean and center the data', + 3, + None, + '___sec18'), + ('Compute the sample covariance', 3, None, '___sec19'), + ('Diagonalize the sample covariance matrix to obtain the ' + 'principal components', + 3, + None, + '___sec20'), + ('Classical PCA Theorem', 2, None, '___sec21'), + ('Proof of the PCA Theorem', 2, None, '___sec22'), + ('PCA Proof continued', 2, None, '___sec23'), + ('The final step', 2, None, '___sec24'), + ('Principal Component Analysis', 2, None, '___sec25'), + ('PCA and scikit-learn', 2, None, '___sec26'), + ('Back to the Cancer Data', 2, None, '___sec27'), + ('More on the PCA', 2, None, '___sec28'), + ('Incremental PCA', 2, None, '___sec29'), + ('Randomized PCA', 2, None, '___sec30'), + ('Kernel PCA', 2, None, '___sec31'), + ('LLE', 2, None, '___sec32'), + ('Other techniques', 2, None, '___sec33')]} end of tocinfo --> @@ -139,36 +150,40 @@ MathJax.Hub.Config({ @@ -184,53 +199,40 @@ MathJax.Hub.Config({ -

    The final step

    +

    PCA Proof continued

    -We could trivially maximize the variance of the projection (and -thereby minimize the error in the reconstruction function) by letting -the norm-2 of \( \boldsymbol{w}_0 \) go to infinity. However, this norm since we -want the matrix \( \boldsymbol{W} \) to be an orthogonal matrix, is constrained by -\( \vert\vert \boldsymbol{w}_0 \vert\vert_2^2=1 \). Imposing this condition via a -Lagrange multiplier we can then in turn maximize - +We have now found the unknown parameters \( z_{i0} \). These correspond to the projected coordinates and we can write $$ -J(\boldsymbol{w}_0)= \boldsymbol{w}_0^T\boldsymbol{C}[\boldsymbol{x}]\boldsymbol{w}_0+\lambda_0(1-\boldsymbol{w}_0^T\boldsymbol{w}_0). -$$ - -Taking the derivative with respect to \( \boldsymbol{w}_0 \) we obtain - -$$ -\frac{\partial J(\boldsymbol{w}_0)}{\partial \boldsymbol{w}_0}= 2\boldsymbol{C}[\boldsymbol{x}]\boldsymbol{w}_0-2\lambda_0\boldsymbol{w}_0=0, -$$ - -meaning that -$$ -\boldsymbol{C}[\boldsymbol{x}]\boldsymbol{w}_0=\lambda_0\boldsymbol{w}_0. -$$ - -The direction that maximizes the variance (or minimizes the construction error) is an eigenvector of the covariance matrix! If we left multiply with \( \boldsymbol{w}_0^T \) we have the variance of the projected data is -$$ -\boldsymbol{w}_0^T\boldsymbol{C}[\boldsymbol{x}]\boldsymbol{w}_0=\lambda_0. +J(\boldsymbol{w}_0)= \frac{1}{p}\sum_i (\boldsymbol{x}_i^T\boldsymbol{x}_i - z_{i0}^2)=\mathrm{const}-\frac{1}{n}\sum_i z_{i0}^2. $$

    -If we want to maximize the variance (minimize the construction error) -we simply pick the eigenvector of the covariance matrix with the -largest eigenvalue. This establishes the link between the minimization -of the reconstruction function \( J \) in terms of an orthogonal matrix -and the maximization of the variance and thereby the covariance of our -observations encoded in the design/feature matrix \( \boldsymbol{X} \). +We can show that the variance of the projected coordinates defined by \( \boldsymbol{w}_0^T\boldsymbol{x}_i \) are given by +$$ +\mathrm{var}[\boldsymbol{w}_0^T\boldsymbol{x}_i] = \frac{1}{n}\sum_i z_{i0}^2, +$$ + +since the expectation value of +$$ +\mathbb{E}[\boldsymbol{w}_0^T\boldsymbol{x}_i] = \mathbb{E}[z_{i0}]= \boldsymbol{w}_0^T\mathbb{E}[\boldsymbol{x}_i]=0, +$$ + +where we have used the fact that our data are centered.

    -The proof -for the other eigenvectors \( \boldsymbol{w}_1,\boldsymbol{w}_2,\dots \) can be -established by applying the above arguments and using the fact that -our basis of eigenvectors is orthogonal, see Murphy chapter -12.2. The -discussion in chapter 12.2 of Murphy's text has also a nice link with -the Singular Value Decomposition theorem. For categorical data, see -chapter 12.4 and discussion therein. +Recalling our definition of the covariance as +$$ +\boldsymbol{C}[\boldsymbol{x}] = \frac{1}{n}\boldsymbol{X}\boldsymbol{X}^T=\mathbb{E}[\boldsymbol{X}\boldsymbol{X}^T], +$$ + +we have thus that +$$ +\mathrm{var}[\boldsymbol{w}_0^T\boldsymbol{x}_i] = \frac{1}{n}\sum_i z_{i0}^2=\boldsymbol{w}_0^T\boldsymbol{C}[\boldsymbol{x}]\boldsymbol{w}_0. +$$ + +

    +We are almost there, we have obtained a relation between minimizing the reconstruction error and the variance and the covariance matrix. Minimizing the error is equivalent to maximizing the variance of the projected data.

    @@ -257,6 +259,8 @@ chapter 12.4 and discussion therein.

  • 29
  • 30
  • 31
  • +
  • ...
  • +
  • 32
  • »
  • diff --git a/doc/pub/DimRed/html/._DimRed-bs022.html b/doc/pub/DimRed/html/._DimRed-bs022.html index b4a7a67e2..285b05f8e 100644 --- a/doc/pub/DimRed/html/._DimRed-bs022.html +++ b/doc/pub/DimRed/html/._DimRed-bs022.html @@ -89,19 +89,30 @@ Automatically generated HTML file from DocOnce source '___sec14'), ('Towards the PCA theorem', 2, None, '___sec15'), ('The Algorithm before the Theorem', 2, None, '___sec16'), - ('Classical PCA Theorem', 2, None, '___sec17'), - ('Proof of the PCA Theorem', 2, None, '___sec18'), - ('PCA Proof continued', 2, None, '___sec19'), - ('The final step', 2, None, '___sec20'), - ('Principal Component Analysis', 2, None, '___sec21'), - ('PCA and scikit-learn', 2, None, '___sec22'), - ('Back to the Cancer Data', 2, None, '___sec23'), - ('More on the PCA', 2, None, '___sec24'), - ('Incremental PCA', 2, None, '___sec25'), - ('Randomized PCA', 2, None, '___sec26'), - ('Kernel PCA', 2, None, '___sec27'), - ('LLE', 2, None, '___sec28'), - ('Other techniques', 2, None, '___sec29')]} + ('Writing our own PCA code', 2, None, '___sec17'), + ('Compute the sample mean and center the data', + 3, + None, + '___sec18'), + ('Compute the sample covariance', 3, None, '___sec19'), + ('Diagonalize the sample covariance matrix to obtain the ' + 'principal components', + 3, + None, + '___sec20'), + ('Classical PCA Theorem', 2, None, '___sec21'), + ('Proof of the PCA Theorem', 2, None, '___sec22'), + ('PCA Proof continued', 2, None, '___sec23'), + ('The final step', 2, None, '___sec24'), + ('Principal Component Analysis', 2, None, '___sec25'), + ('PCA and scikit-learn', 2, None, '___sec26'), + ('Back to the Cancer Data', 2, None, '___sec27'), + ('More on the PCA', 2, None, '___sec28'), + ('Incremental PCA', 2, None, '___sec29'), + ('Randomized PCA', 2, None, '___sec30'), + ('Kernel PCA', 2, None, '___sec31'), + ('LLE', 2, None, '___sec32'), + ('Other techniques', 2, None, '___sec33')]} end of tocinfo --> @@ -139,36 +150,40 @@ MathJax.Hub.Config({ @@ -184,59 +199,54 @@ MathJax.Hub.Config({ -

    Principal Component Analysis

    -
    -
    -

    -Principal Component Analysis (PCA) is by far the most popular dimensionality reduction algorithm. -First it identifies the hyperplane that lies closest to the data, and then it projects the data onto it. +

    The final step

    -The following Python code uses NumPy’s svd() function to obtain all the principal components of the -training set, then extracts the first two principal components. First we center the data using either pandas or our own code -

    +We could trivially maximize the variance of the projection (and +thereby minimize the error in the reconstruction function) by letting +the norm-2 of \( \boldsymbol{w}_0 \) go to infinity. However, this norm since we +want the matrix \( \boldsymbol{W} \) to be an orthogonal matrix, is constrained by +\( \vert\vert \boldsymbol{w}_0 \vert\vert_2^2=1 \). Imposing this condition via a +Lagrange multiplier we can then in turn maximize - -

    import numpy as np
    -import pandas as pd
    -from IPython.display import display
    -np.random.seed(100)
    -# setting up a 10 x 5 vanilla matrix 
    -rows = 10
    -cols = 5
    -X = np.random.randn(rows,cols)
    -df = pd.DataFrame(X)
    -# Pandas does the centering for us
    -df = df -df.mean()
    -display(df)
    +$$
    +J(\boldsymbol{w}_0)= \boldsymbol{w}_0^T\boldsymbol{C}[\boldsymbol{x}]\boldsymbol{w}_0+\lambda_0(1-\boldsymbol{w}_0^T\boldsymbol{w}_0).
    +$$
     
    -# we center it ourselves
    -X_centered = X - X.mean(axis=0)
    -# Then check the difference between pandas and our own set up
    -print(X_centered-df)
    -#Now we do an SVD
    -U, s, V = np.linalg.svd(X_centered)
    -c1 = V.T[:, 0]
    -c2 = V.T[:, 1]
    -W2 = V.T[:, :2]
    -X2D = X_centered.dot(W2)
    -print(X2D)
    -
    -

    -PCA assumes that the dataset is centered around the origin. Scikit-Learn’s PCA classes take care of centering -the data for you. However, if you implement PCA yourself (as in the preceding example), or if you use other libraries, don’t -forget to center the data first. +Taking the derivative with respect to \( \boldsymbol{w}_0 \) we obtain + +$$ +\frac{\partial J(\boldsymbol{w}_0)}{\partial \boldsymbol{w}_0}= 2\boldsymbol{C}[\boldsymbol{x}]\boldsymbol{w}_0-2\lambda_0\boldsymbol{w}_0=0, +$$ + +meaning that +$$ +\boldsymbol{C}[\boldsymbol{x}]\boldsymbol{w}_0=\lambda_0\boldsymbol{w}_0. +$$ + +The direction that maximizes the variance (or minimizes the construction error) is an eigenvector of the covariance matrix! If we left multiply with \( \boldsymbol{w}_0^T \) we have the variance of the projected data is +$$ +\boldsymbol{w}_0^T\boldsymbol{C}[\boldsymbol{x}]\boldsymbol{w}_0=\lambda_0. +$$

    -Once you have identified all the principal components, you can reduce the dimensionality of the dataset -down to \( d \) dimensions by projecting it onto the hyperplane defined by the first \( d \) principal components. -Selecting this hyperplane ensures that the projection will preserve as much variance as possible. -

    +If we want to maximize the variance (minimize the construction error) +we simply pick the eigenvector of the covariance matrix with the +largest eigenvalue. This establishes the link between the minimization +of the reconstruction function \( J \) in terms of an orthogonal matrix +and the maximization of the variance and thereby the covariance of our +observations encoded in the design/feature matrix \( \boldsymbol{X} \). + +

    +The proof +for the other eigenvectors \( \boldsymbol{w}_1,\boldsymbol{w}_2,\dots \) can be +established by applying the above arguments and using the fact that +our basis of eigenvectors is orthogonal, see Murphy chapter +12.2. The +discussion in chapter 12.2 of Murphy's text has also a nice link with +the Singular Value Decomposition theorem. For categorical data, see +chapter 12.4 and discussion therein. - -

    W2 = V.T[:, :2]
    -X2D = X_centered.dot(W2)
    -

    @@ -261,6 +271,7 @@ X2D = X_centered29

  • 30
  • 31
  • +
  • 32
  • »
  • diff --git a/doc/pub/DimRed/html/._DimRed-bs023.html b/doc/pub/DimRed/html/._DimRed-bs023.html index dbef737d6..67b68fa28 100644 --- a/doc/pub/DimRed/html/._DimRed-bs023.html +++ b/doc/pub/DimRed/html/._DimRed-bs023.html @@ -89,19 +89,30 @@ Automatically generated HTML file from DocOnce source '___sec14'), ('Towards the PCA theorem', 2, None, '___sec15'), ('The Algorithm before the Theorem', 2, None, '___sec16'), - ('Classical PCA Theorem', 2, None, '___sec17'), - ('Proof of the PCA Theorem', 2, None, '___sec18'), - ('PCA Proof continued', 2, None, '___sec19'), - ('The final step', 2, None, '___sec20'), - ('Principal Component Analysis', 2, None, '___sec21'), - ('PCA and scikit-learn', 2, None, '___sec22'), - ('Back to the Cancer Data', 2, None, '___sec23'), - ('More on the PCA', 2, None, '___sec24'), - ('Incremental PCA', 2, None, '___sec25'), - ('Randomized PCA', 2, None, '___sec26'), - ('Kernel PCA', 2, None, '___sec27'), - ('LLE', 2, None, '___sec28'), - ('Other techniques', 2, None, '___sec29')]} + ('Writing our own PCA code', 2, None, '___sec17'), + ('Compute the sample mean and center the data', + 3, + None, + '___sec18'), + ('Compute the sample covariance', 3, None, '___sec19'), + ('Diagonalize the sample covariance matrix to obtain the ' + 'principal components', + 3, + None, + '___sec20'), + ('Classical PCA Theorem', 2, None, '___sec21'), + ('Proof of the PCA Theorem', 2, None, '___sec22'), + ('PCA Proof continued', 2, None, '___sec23'), + ('The final step', 2, None, '___sec24'), + ('Principal Component Analysis', 2, None, '___sec25'), + ('PCA and scikit-learn', 2, None, '___sec26'), + ('Back to the Cancer Data', 2, None, '___sec27'), + ('More on the PCA', 2, None, '___sec28'), + ('Incremental PCA', 2, None, '___sec29'), + ('Randomized PCA', 2, None, '___sec30'), + ('Kernel PCA', 2, None, '___sec31'), + ('LLE', 2, None, '___sec32'), + ('Other techniques', 2, None, '___sec33')]} end of tocinfo --> @@ -139,36 +150,40 @@ MathJax.Hub.Config({ @@ -182,37 +197,61 @@ MathJax.Hub.Config({

     

     

     

    - + -

    PCA and scikit-learn

    +

    Principal Component Analysis

    +
    +
    +

    +Principal Component Analysis (PCA) is by far the most popular dimensionality reduction algorithm. +First it identifies the hyperplane that lies closest to the data, and then it projects the data onto it.

    -Scikit-Learn’s PCA class implements PCA using SVD decomposition just like we did before. The -following code applies PCA to reduce the dimensionality of the dataset down to two dimensions (note -that it automatically takes care of centering the data): +The following Python code uses NumPy’s svd() function to obtain all the principal components of the +training set, then extracts the first two principal components. First we center the data using either pandas or our own code

    -

    #thereafter we do a PCA with Scikit-learn
    -from sklearn.decomposition import PCA
    -pca = PCA(n_components = 2)
    -X2D = pca.fit_transform(X)
    +
    import numpy as np
    +import pandas as pd
    +from IPython.display import display
    +np.random.seed(100)
    +# setting up a 10 x 5 vanilla matrix 
    +rows = 10
    +cols = 5
    +X = np.random.randn(rows,cols)
    +df = pd.DataFrame(X)
    +# Pandas does the centering for us
    +df = df -df.mean()
    +display(df)
    +
    +# we center it ourselves
    +X_centered = X - X.mean(axis=0)
    +# Then check the difference between pandas and our own set up
    +print(X_centered-df)
    +#Now we do an SVD
    +U, s, V = np.linalg.svd(X_centered)
    +c1 = V.T[:, 0]
    +c2 = V.T[:, 1]
    +W2 = V.T[:, :2]
    +X2D = X_centered.dot(W2)
     print(X2D)
     

    -After fitting the PCA transformer to the dataset, you can access the principal components using the -components variable (note that it contains the PCs as horizontal vectors, so, for example, the first -principal component is equal to +PCA assumes that the dataset is centered around the origin. Scikit-Learn’s PCA classes take care of centering +the data for you. However, if you implement PCA yourself (as in the preceding example), or if you use other libraries, don’t +forget to center the data first. + +

    +Once you have identified all the principal components, you can reduce the dimensionality of the dataset +down to \( d \) dimensions by projecting it onto the hyperplane defined by the first \( d \) principal components. +Selecting this hyperplane ensures that the projection will preserve as much variance as possible.

    -

    pca.components_.T[:, 0].
    +
    W2 = V.T[:, :2]
    +X2D = X_centered.dot(W2)
     
    -

    -Another very useful piece of information is the explained variance ratio of each principal component, -available via the \( explained\_variance\_ratio \) variable. It indicates the proportion of the dataset’s -variance that lies along the axis of each principal component. -

    @@ -236,6 +275,7 @@ variance that lies along the axis of each principal component.

  • 29
  • 30
  • 31
  • +
  • 32
  • »
  • diff --git a/doc/pub/DimRed/html/._DimRed-bs024.html b/doc/pub/DimRed/html/._DimRed-bs024.html index 534db1781..2e151571d 100644 --- a/doc/pub/DimRed/html/._DimRed-bs024.html +++ b/doc/pub/DimRed/html/._DimRed-bs024.html @@ -89,19 +89,30 @@ Automatically generated HTML file from DocOnce source '___sec14'), ('Towards the PCA theorem', 2, None, '___sec15'), ('The Algorithm before the Theorem', 2, None, '___sec16'), - ('Classical PCA Theorem', 2, None, '___sec17'), - ('Proof of the PCA Theorem', 2, None, '___sec18'), - ('PCA Proof continued', 2, None, '___sec19'), - ('The final step', 2, None, '___sec20'), - ('Principal Component Analysis', 2, None, '___sec21'), - ('PCA and scikit-learn', 2, None, '___sec22'), - ('Back to the Cancer Data', 2, None, '___sec23'), - ('More on the PCA', 2, None, '___sec24'), - ('Incremental PCA', 2, None, '___sec25'), - ('Randomized PCA', 2, None, '___sec26'), - ('Kernel PCA', 2, None, '___sec27'), - ('LLE', 2, None, '___sec28'), - ('Other techniques', 2, None, '___sec29')]} + ('Writing our own PCA code', 2, None, '___sec17'), + ('Compute the sample mean and center the data', + 3, + None, + '___sec18'), + ('Compute the sample covariance', 3, None, '___sec19'), + ('Diagonalize the sample covariance matrix to obtain the ' + 'principal components', + 3, + None, + '___sec20'), + ('Classical PCA Theorem', 2, None, '___sec21'), + ('Proof of the PCA Theorem', 2, None, '___sec22'), + ('PCA Proof continued', 2, None, '___sec23'), + ('The final step', 2, None, '___sec24'), + ('Principal Component Analysis', 2, None, '___sec25'), + ('PCA and scikit-learn', 2, None, '___sec26'), + ('Back to the Cancer Data', 2, None, '___sec27'), + ('More on the PCA', 2, None, '___sec28'), + ('Incremental PCA', 2, None, '___sec29'), + ('Randomized PCA', 2, None, '___sec30'), + ('Kernel PCA', 2, None, '___sec31'), + ('LLE', 2, None, '___sec32'), + ('Other techniques', 2, None, '___sec33')]} end of tocinfo --> @@ -139,36 +150,40 @@ MathJax.Hub.Config({ @@ -182,45 +197,36 @@ MathJax.Hub.Config({

     

     

     

    - + -

    Back to the Cancer Data

    -We can now repeat the above but applied to real data, in this case our breast cancer data. -Here we compute performance scores on the training data using logistic regression. +

    PCA and scikit-learn

    + +

    +Scikit-Learn’s PCA class implements PCA using SVD decomposition just like we did before. The +following code applies PCA to reduce the dimensionality of the dataset down to two dimensions (note +that it automatically takes care of centering the data):

    -

    import matplotlib.pyplot as plt
    -import numpy as np
    -from sklearn.model_selection import  train_test_split 
    -from sklearn.datasets import load_breast_cancer
    -from sklearn.linear_model import LogisticRegression
    -cancer = load_breast_cancer()
    -
    -X_train, X_test, y_train, y_test = train_test_split(cancer.data,cancer.target,random_state=0)
    -
    -logreg = LogisticRegression()
    -logreg.fit(X_train, y_train)
    -print("Train set accuracy from Logistic Regression: {:.2f}".format(logreg.score(X_train,y_train)))
    -# We scale the data
    -from sklearn.preprocessing import StandardScaler
    -scaler = StandardScaler()
    -scaler.fit(X_train)
    -X_train_scaled = scaler.transform(X_train)
    -X_test_scaled = scaler.transform(X_test)
    -# Then perform again a log reg fit
    -logreg.fit(X_train_scaled, y_train)
    -print("Train set accuracy scaled data: {:.2f}".format(logreg.score(X_train_scaled,y_train)))
    -#thereafter we do a PCA with Scikit-learn
    +
    #thereafter we do a PCA with Scikit-learn
     from sklearn.decomposition import PCA
     pca = PCA(n_components = 2)
    -X2D_train = pca.fit_transform(X_train_scaled)
    -# and finally compute the log reg fit and the score on the training data	
    -logreg.fit(X2D_train,y_train)
    -print("Train set accuracy scaled and PCA data: {:.2f}".format(logreg.score(X2D_train,y_train)))
    +X2D = pca.fit_transform(X)
    +print(X2D)
     

    -We see that our training data after the PCA decomposition has a performance similar to the non-scaled data. +After fitting the PCA transformer to the dataset, you can access the principal components using the +components variable (note that it contains the PCs as horizontal vectors, so, for example, the first +principal component is equal to +

    + + +

    pca.components_.T[:, 0].
    +
    +

    +Another very useful piece of information is the explained variance ratio of each principal component, +available via the \( explained\_variance\_ratio \) variable. It indicates the proportion of the dataset’s +variance that lies along the axis of each principal component.

    @@ -244,6 +250,7 @@ We see that our training data after the PCA decomposition has a performance simi

  • 29
  • 30
  • 31
  • +
  • 32
  • »
  • diff --git a/doc/pub/DimRed/html/._DimRed-bs025.html b/doc/pub/DimRed/html/._DimRed-bs025.html index 213172eef..a1f2ee2be 100644 --- a/doc/pub/DimRed/html/._DimRed-bs025.html +++ b/doc/pub/DimRed/html/._DimRed-bs025.html @@ -89,19 +89,30 @@ Automatically generated HTML file from DocOnce source '___sec14'), ('Towards the PCA theorem', 2, None, '___sec15'), ('The Algorithm before the Theorem', 2, None, '___sec16'), - ('Classical PCA Theorem', 2, None, '___sec17'), - ('Proof of the PCA Theorem', 2, None, '___sec18'), - ('PCA Proof continued', 2, None, '___sec19'), - ('The final step', 2, None, '___sec20'), - ('Principal Component Analysis', 2, None, '___sec21'), - ('PCA and scikit-learn', 2, None, '___sec22'), - ('Back to the Cancer Data', 2, None, '___sec23'), - ('More on the PCA', 2, None, '___sec24'), - ('Incremental PCA', 2, None, '___sec25'), - ('Randomized PCA', 2, None, '___sec26'), - ('Kernel PCA', 2, None, '___sec27'), - ('LLE', 2, None, '___sec28'), - ('Other techniques', 2, None, '___sec29')]} + ('Writing our own PCA code', 2, None, '___sec17'), + ('Compute the sample mean and center the data', + 3, + None, + '___sec18'), + ('Compute the sample covariance', 3, None, '___sec19'), + ('Diagonalize the sample covariance matrix to obtain the ' + 'principal components', + 3, + None, + '___sec20'), + ('Classical PCA Theorem', 2, None, '___sec21'), + ('Proof of the PCA Theorem', 2, None, '___sec22'), + ('PCA Proof continued', 2, None, '___sec23'), + ('The final step', 2, None, '___sec24'), + ('Principal Component Analysis', 2, None, '___sec25'), + ('PCA and scikit-learn', 2, None, '___sec26'), + ('Back to the Cancer Data', 2, None, '___sec27'), + ('More on the PCA', 2, None, '___sec28'), + ('Incremental PCA', 2, None, '___sec29'), + ('Randomized PCA', 2, None, '___sec30'), + ('Kernel PCA', 2, None, '___sec31'), + ('LLE', 2, None, '___sec32'), + ('Other techniques', 2, None, '___sec33')]} end of tocinfo --> @@ -139,36 +150,40 @@ MathJax.Hub.Config({ @@ -184,33 +199,44 @@ MathJax.Hub.Config({ -

    More on the PCA

    - -

    -Instead of arbitrarily choosing the number of dimensions to reduce down to, it is generally preferable to -choose the number of dimensions that add up to a sufficiently large portion of the variance (e.g., 95%). -Unless, of course, you are reducing dimensionality for data visualization — in that case you will -generally want to reduce the dimensionality down to 2 or 3. -The following code computes PCA without reducing dimensionality, then computes the minimum number -of dimensions required to preserve 95% of the training set’s variance: +

    Back to the Cancer Data

    +We can now repeat the above but applied to real data, in this case our breast cancer data. +Here we compute performance scores on the training data using logistic regression.

    -

    pca = PCA()
    -pca.fit(X)
    -cumsum = np.cumsum(pca.explained_variance_ratio_)
    -d = np.argmax(cumsum >= 0.95) + 1
    -
    -

    -You could then set \( n\_components=d \) and run PCA again. However, there is a much better option: instead -of specifying the number of principal components you want to preserve, you can set \( n\_components \) to be -a float between 0.0 and 1.0, indicating the ratio of variance you wish to preserve: -

    +

    import matplotlib.pyplot as plt
    +import numpy as np
    +from sklearn.model_selection import  train_test_split 
    +from sklearn.datasets import load_breast_cancer
    +from sklearn.linear_model import LogisticRegression
    +cancer = load_breast_cancer()
     
    -
    -
    pca = PCA(n_components=0.95)
    -X_reduced = pca.fit_transform(X)
    +X_train, X_test, y_train, y_test = train_test_split(cancer.data,cancer.target,random_state=0)
    +
    +logreg = LogisticRegression()
    +logreg.fit(X_train, y_train)
    +print("Train set accuracy from Logistic Regression: {:.2f}".format(logreg.score(X_train,y_train)))
    +# We scale the data
    +from sklearn.preprocessing import StandardScaler
    +scaler = StandardScaler()
    +scaler.fit(X_train)
    +X_train_scaled = scaler.transform(X_train)
    +X_test_scaled = scaler.transform(X_test)
    +# Then perform again a log reg fit
    +logreg.fit(X_train_scaled, y_train)
    +print("Train set accuracy scaled data: {:.2f}".format(logreg.score(X_train_scaled,y_train)))
    +#thereafter we do a PCA with Scikit-learn
    +from sklearn.decomposition import PCA
    +pca = PCA(n_components = 2)
    +X2D_train = pca.fit_transform(X_train_scaled)
    +# and finally compute the log reg fit and the score on the training data	
    +logreg.fit(X2D_train,y_train)
    +print("Train set accuracy scaled and PCA data: {:.2f}".format(logreg.score(X2D_train,y_train)))
     
    +

    +We see that our training data after the PCA decomposition has a performance similar to the non-scaled data. +

    @@ -232,6 +258,7 @@ X_reduced = pca

  • 29
  • 30
  • 31
  • +
  • 32
  • »
  • diff --git a/doc/pub/DimRed/html/._DimRed-bs026.html b/doc/pub/DimRed/html/._DimRed-bs026.html index e3a14c74a..99b82253e 100644 --- a/doc/pub/DimRed/html/._DimRed-bs026.html +++ b/doc/pub/DimRed/html/._DimRed-bs026.html @@ -89,19 +89,30 @@ Automatically generated HTML file from DocOnce source '___sec14'), ('Towards the PCA theorem', 2, None, '___sec15'), ('The Algorithm before the Theorem', 2, None, '___sec16'), - ('Classical PCA Theorem', 2, None, '___sec17'), - ('Proof of the PCA Theorem', 2, None, '___sec18'), - ('PCA Proof continued', 2, None, '___sec19'), - ('The final step', 2, None, '___sec20'), - ('Principal Component Analysis', 2, None, '___sec21'), - ('PCA and scikit-learn', 2, None, '___sec22'), - ('Back to the Cancer Data', 2, None, '___sec23'), - ('More on the PCA', 2, None, '___sec24'), - ('Incremental PCA', 2, None, '___sec25'), - ('Randomized PCA', 2, None, '___sec26'), - ('Kernel PCA', 2, None, '___sec27'), - ('LLE', 2, None, '___sec28'), - ('Other techniques', 2, None, '___sec29')]} + ('Writing our own PCA code', 2, None, '___sec17'), + ('Compute the sample mean and center the data', + 3, + None, + '___sec18'), + ('Compute the sample covariance', 3, None, '___sec19'), + ('Diagonalize the sample covariance matrix to obtain the ' + 'principal components', + 3, + None, + '___sec20'), + ('Classical PCA Theorem', 2, None, '___sec21'), + ('Proof of the PCA Theorem', 2, None, '___sec22'), + ('PCA Proof continued', 2, None, '___sec23'), + ('The final step', 2, None, '___sec24'), + ('Principal Component Analysis', 2, None, '___sec25'), + ('PCA and scikit-learn', 2, None, '___sec26'), + ('Back to the Cancer Data', 2, None, '___sec27'), + ('More on the PCA', 2, None, '___sec28'), + ('Incremental PCA', 2, None, '___sec29'), + ('Randomized PCA', 2, None, '___sec30'), + ('Kernel PCA', 2, None, '___sec31'), + ('LLE', 2, None, '___sec32'), + ('Other techniques', 2, None, '___sec33')]} end of tocinfo --> @@ -139,36 +150,40 @@ MathJax.Hub.Config({ @@ -184,15 +199,33 @@ MathJax.Hub.Config({ -

    Incremental PCA

    +

    More on the PCA

    -One problem with the preceding implementation of PCA is that it requires the whole training set to fit in -memory in order for the SVD algorithm to run. Fortunately, Incremental PCA (IPCA) algorithms have -been developed: you can split the training set into mini-batches and feed an IPCA algorithm one minibatch -at a time. This is useful for large training sets, and also to apply PCA online (i.e., on the fly, as new -instances arrive). +Instead of arbitrarily choosing the number of dimensions to reduce down to, it is generally preferable to +choose the number of dimensions that add up to a sufficiently large portion of the variance (e.g., 95%). +Unless, of course, you are reducing dimensionality for data visualization — in that case you will +generally want to reduce the dimensionality down to 2 or 3. +The following code computes PCA without reducing dimensionality, then computes the minimum number +of dimensions required to preserve 95% of the training set’s variance: +

    + +

    pca = PCA()
    +pca.fit(X)
    +cumsum = np.cumsum(pca.explained_variance_ratio_)
    +d = np.argmax(cumsum >= 0.95) + 1
    +
    +

    +You could then set \( n\_components=d \) and run PCA again. However, there is a much better option: instead +of specifying the number of principal components you want to preserve, you can set \( n\_components \) to be +a float between 0.0 and 1.0, indicating the ratio of variance you wish to preserve: +

    + + +

    pca = PCA(n_components=0.95)
    +X_reduced = pca.fit_transform(X)
    +

    @@ -213,6 +246,7 @@ instances arrive).

  • 29
  • 30
  • 31
  • +
  • 32
  • »
  • diff --git a/doc/pub/DimRed/html/._DimRed-bs027.html b/doc/pub/DimRed/html/._DimRed-bs027.html index e5767b817..95a52b810 100644 --- a/doc/pub/DimRed/html/._DimRed-bs027.html +++ b/doc/pub/DimRed/html/._DimRed-bs027.html @@ -89,19 +89,30 @@ Automatically generated HTML file from DocOnce source '___sec14'), ('Towards the PCA theorem', 2, None, '___sec15'), ('The Algorithm before the Theorem', 2, None, '___sec16'), - ('Classical PCA Theorem', 2, None, '___sec17'), - ('Proof of the PCA Theorem', 2, None, '___sec18'), - ('PCA Proof continued', 2, None, '___sec19'), - ('The final step', 2, None, '___sec20'), - ('Principal Component Analysis', 2, None, '___sec21'), - ('PCA and scikit-learn', 2, None, '___sec22'), - ('Back to the Cancer Data', 2, None, '___sec23'), - ('More on the PCA', 2, None, '___sec24'), - ('Incremental PCA', 2, None, '___sec25'), - ('Randomized PCA', 2, None, '___sec26'), - ('Kernel PCA', 2, None, '___sec27'), - ('LLE', 2, None, '___sec28'), - ('Other techniques', 2, None, '___sec29')]} + ('Writing our own PCA code', 2, None, '___sec17'), + ('Compute the sample mean and center the data', + 3, + None, + '___sec18'), + ('Compute the sample covariance', 3, None, '___sec19'), + ('Diagonalize the sample covariance matrix to obtain the ' + 'principal components', + 3, + None, + '___sec20'), + ('Classical PCA Theorem', 2, None, '___sec21'), + ('Proof of the PCA Theorem', 2, None, '___sec22'), + ('PCA Proof continued', 2, None, '___sec23'), + ('The final step', 2, None, '___sec24'), + ('Principal Component Analysis', 2, None, '___sec25'), + ('PCA and scikit-learn', 2, None, '___sec26'), + ('Back to the Cancer Data', 2, None, '___sec27'), + ('More on the PCA', 2, None, '___sec28'), + ('Incremental PCA', 2, None, '___sec29'), + ('Randomized PCA', 2, None, '___sec30'), + ('Kernel PCA', 2, None, '___sec31'), + ('LLE', 2, None, '___sec32'), + ('Other techniques', 2, None, '___sec33')]} end of tocinfo --> @@ -139,36 +150,40 @@ MathJax.Hub.Config({ @@ -184,18 +199,14 @@ MathJax.Hub.Config({ -

    Randomized PCA

    +

    Incremental PCA

    -Scikit-Learn offers yet another option to perform PCA, called Randomized PCA. This is a stochastic -algorithm that quickly finds an approximation of the first d principal components. Its computational -complexity is \( O(m \times d^2)+O(d^3) \), instead of \( O(m \times n^2) + O(n^3) \), so it is dramatically faster than the -previous algorithms when \( d \) is much smaller than \( n \). - -

    -

    -
    - +One problem with the preceding implementation of PCA is that it requires the whole training set to fit in +memory in order for the SVD algorithm to run. Fortunately, Incremental PCA (IPCA) algorithms have +been developed: you can split the training set into mini-batches and feed an IPCA algorithm one minibatch +at a time. This is useful for large training sets, and also to apply PCA online (i.e., on the fly, as new +instances arrive).

    @@ -216,6 +227,7 @@ previous algorithms when \( d \) is much smaller than \( n \).

  • 29
  • 30
  • 31
  • +
  • 32
  • »
  • diff --git a/doc/pub/DimRed/html/._DimRed-bs028.html b/doc/pub/DimRed/html/._DimRed-bs028.html index 9cbb7aa9f..0c9c7f308 100644 --- a/doc/pub/DimRed/html/._DimRed-bs028.html +++ b/doc/pub/DimRed/html/._DimRed-bs028.html @@ -89,19 +89,30 @@ Automatically generated HTML file from DocOnce source '___sec14'), ('Towards the PCA theorem', 2, None, '___sec15'), ('The Algorithm before the Theorem', 2, None, '___sec16'), - ('Classical PCA Theorem', 2, None, '___sec17'), - ('Proof of the PCA Theorem', 2, None, '___sec18'), - ('PCA Proof continued', 2, None, '___sec19'), - ('The final step', 2, None, '___sec20'), - ('Principal Component Analysis', 2, None, '___sec21'), - ('PCA and scikit-learn', 2, None, '___sec22'), - ('Back to the Cancer Data', 2, None, '___sec23'), - ('More on the PCA', 2, None, '___sec24'), - ('Incremental PCA', 2, None, '___sec25'), - ('Randomized PCA', 2, None, '___sec26'), - ('Kernel PCA', 2, None, '___sec27'), - ('LLE', 2, None, '___sec28'), - ('Other techniques', 2, None, '___sec29')]} + ('Writing our own PCA code', 2, None, '___sec17'), + ('Compute the sample mean and center the data', + 3, + None, + '___sec18'), + ('Compute the sample covariance', 3, None, '___sec19'), + ('Diagonalize the sample covariance matrix to obtain the ' + 'principal components', + 3, + None, + '___sec20'), + ('Classical PCA Theorem', 2, None, '___sec21'), + ('Proof of the PCA Theorem', 2, None, '___sec22'), + ('PCA Proof continued', 2, None, '___sec23'), + ('The final step', 2, None, '___sec24'), + ('Principal Component Analysis', 2, None, '___sec25'), + ('PCA and scikit-learn', 2, None, '___sec26'), + ('Back to the Cancer Data', 2, None, '___sec27'), + ('More on the PCA', 2, None, '___sec28'), + ('Incremental PCA', 2, None, '___sec29'), + ('Randomized PCA', 2, None, '___sec30'), + ('Kernel PCA', 2, None, '___sec31'), + ('LLE', 2, None, '___sec32'), + ('Other techniques', 2, None, '___sec33')]} end of tocinfo --> @@ -139,36 +150,40 @@ MathJax.Hub.Config({ @@ -184,28 +199,14 @@ MathJax.Hub.Config({ -

    Kernel PCA

    -
    -
    -

    +

    Randomized PCA

    -The kernel trick is a mathematical technique that implicitly maps instances into a -very high-dimensional space (called the feature space), enabling nonlinear classification and regression -with Support Vector Machines. Recall that a linear decision boundary in the high-dimensional feature -space corresponds to a complex nonlinear decision boundary in the original space. -It turns out that the same trick can be applied to PCA, making it possible to perform complex nonlinear -projections for dimensionality reduction. This is called Kernel PCA (kPCA). It is often good at -preserving clusters of instances after projection, or sometimes even unrolling datasets that lie close to a -twisted manifold. -For example, the following code uses Scikit-Learn’s KernelPCA class to perform kPCA with an -

    +Scikit-Learn offers yet another option to perform PCA, called Randomized PCA. This is a stochastic +algorithm that quickly finds an approximation of the first d principal components. Its computational +complexity is \( O(m \times d^2)+O(d^3) \), instead of \( O(m \times n^2) + O(n^3) \), so it is dramatically faster than the +previous algorithms when \( d \) is much smaller than \( n \). - -

    from sklearn.decomposition import KernelPCA
    -rbf_pca = KernelPCA(n_components = 2, kernel="rbf", gamma=0.04)
    -X_reduced = rbf_pca.fit_transform(X)
    -

    @@ -229,6 +230,7 @@ X_reduced = rbf_pca29
  • 30
  • 31
  • +
  • 32
  • »
  • diff --git a/doc/pub/DimRed/html/._DimRed-bs029.html b/doc/pub/DimRed/html/._DimRed-bs029.html index bf5d8c9b0..e605c052c 100644 --- a/doc/pub/DimRed/html/._DimRed-bs029.html +++ b/doc/pub/DimRed/html/._DimRed-bs029.html @@ -89,19 +89,30 @@ Automatically generated HTML file from DocOnce source '___sec14'), ('Towards the PCA theorem', 2, None, '___sec15'), ('The Algorithm before the Theorem', 2, None, '___sec16'), - ('Classical PCA Theorem', 2, None, '___sec17'), - ('Proof of the PCA Theorem', 2, None, '___sec18'), - ('PCA Proof continued', 2, None, '___sec19'), - ('The final step', 2, None, '___sec20'), - ('Principal Component Analysis', 2, None, '___sec21'), - ('PCA and scikit-learn', 2, None, '___sec22'), - ('Back to the Cancer Data', 2, None, '___sec23'), - ('More on the PCA', 2, None, '___sec24'), - ('Incremental PCA', 2, None, '___sec25'), - ('Randomized PCA', 2, None, '___sec26'), - ('Kernel PCA', 2, None, '___sec27'), - ('LLE', 2, None, '___sec28'), - ('Other techniques', 2, None, '___sec29')]} + ('Writing our own PCA code', 2, None, '___sec17'), + ('Compute the sample mean and center the data', + 3, + None, + '___sec18'), + ('Compute the sample covariance', 3, None, '___sec19'), + ('Diagonalize the sample covariance matrix to obtain the ' + 'principal components', + 3, + None, + '___sec20'), + ('Classical PCA Theorem', 2, None, '___sec21'), + ('Proof of the PCA Theorem', 2, None, '___sec22'), + ('PCA Proof continued', 2, None, '___sec23'), + ('The final step', 2, None, '___sec24'), + ('Principal Component Analysis', 2, None, '___sec25'), + ('PCA and scikit-learn', 2, None, '___sec26'), + ('Back to the Cancer Data', 2, None, '___sec27'), + ('More on the PCA', 2, None, '___sec28'), + ('Incremental PCA', 2, None, '___sec29'), + ('Randomized PCA', 2, None, '___sec30'), + ('Kernel PCA', 2, None, '___sec31'), + ('LLE', 2, None, '___sec32'), + ('Other techniques', 2, None, '___sec33')]} end of tocinfo --> @@ -139,36 +150,40 @@ MathJax.Hub.Config({ @@ -184,14 +199,32 @@ MathJax.Hub.Config({ -

    LLE

    +

    Kernel PCA

    +
    +
    +

    -Locally Linear Embedding (LLE) is another very powerful nonlinear dimensionality reduction -(NLDR) technique. It is a Manifold Learning technique that does not rely on projections like the previous -algorithms. In a nutshell, LLE works by first measuring how each training instance linearly relates to its -closest neighbors (c.n.), and then looking for a low-dimensional representation of the training set where -these local relationships are best preserved (more details shortly). +The kernel trick is a mathematical technique that implicitly maps instances into a +very high-dimensional space (called the feature space), enabling nonlinear classification and regression +with Support Vector Machines. Recall that a linear decision boundary in the high-dimensional feature +space corresponds to a complex nonlinear decision boundary in the original space. +It turns out that the same trick can be applied to PCA, making it possible to perform complex nonlinear +projections for dimensionality reduction. This is called Kernel PCA (kPCA). It is often good at +preserving clusters of instances after projection, or sometimes even unrolling datasets that lie close to a +twisted manifold. +For example, the following code uses Scikit-Learn’s KernelPCA class to perform kPCA with an +

    + + +

    from sklearn.decomposition import KernelPCA
    +rbf_pca = KernelPCA(n_components = 2, kernel="rbf", gamma=0.04)
    +X_reduced = rbf_pca.fit_transform(X)
    +
    +

    +

    +
    +

    @@ -210,6 +243,7 @@ these local relationships are best preserved (more details shortly).

  • 29
  • 30
  • 31
  • +
  • 32
  • »
  • diff --git a/doc/pub/DimRed/html/._DimRed-bs030.html b/doc/pub/DimRed/html/._DimRed-bs030.html index aa8394e93..283c55794 100644 --- a/doc/pub/DimRed/html/._DimRed-bs030.html +++ b/doc/pub/DimRed/html/._DimRed-bs030.html @@ -89,19 +89,30 @@ Automatically generated HTML file from DocOnce source '___sec14'), ('Towards the PCA theorem', 2, None, '___sec15'), ('The Algorithm before the Theorem', 2, None, '___sec16'), - ('Classical PCA Theorem', 2, None, '___sec17'), - ('Proof of the PCA Theorem', 2, None, '___sec18'), - ('PCA Proof continued', 2, None, '___sec19'), - ('The final step', 2, None, '___sec20'), - ('Principal Component Analysis', 2, None, '___sec21'), - ('PCA and scikit-learn', 2, None, '___sec22'), - ('Back to the Cancer Data', 2, None, '___sec23'), - ('More on the PCA', 2, None, '___sec24'), - ('Incremental PCA', 2, None, '___sec25'), - ('Randomized PCA', 2, None, '___sec26'), - ('Kernel PCA', 2, None, '___sec27'), - ('LLE', 2, None, '___sec28'), - ('Other techniques', 2, None, '___sec29')]} + ('Writing our own PCA code', 2, None, '___sec17'), + ('Compute the sample mean and center the data', + 3, + None, + '___sec18'), + ('Compute the sample covariance', 3, None, '___sec19'), + ('Diagonalize the sample covariance matrix to obtain the ' + 'principal components', + 3, + None, + '___sec20'), + ('Classical PCA Theorem', 2, None, '___sec21'), + ('Proof of the PCA Theorem', 2, None, '___sec22'), + ('PCA Proof continued', 2, None, '___sec23'), + ('The final step', 2, None, '___sec24'), + ('Principal Component Analysis', 2, None, '___sec25'), + ('PCA and scikit-learn', 2, None, '___sec26'), + ('Back to the Cancer Data', 2, None, '___sec27'), + ('More on the PCA', 2, None, '___sec28'), + ('Incremental PCA', 2, None, '___sec29'), + ('Randomized PCA', 2, None, '___sec30'), + ('Kernel PCA', 2, None, '___sec31'), + ('LLE', 2, None, '___sec32'), + ('Other techniques', 2, None, '___sec33')]} end of tocinfo --> @@ -139,36 +150,40 @@ MathJax.Hub.Config({ @@ -184,22 +199,16 @@ MathJax.Hub.Config({ -

    Other techniques

    +

    LLE

    -There are many other dimensionality reduction techniques, several of which are available in Scikit-Learn. +Locally Linear Embedding (LLE) is another very powerful nonlinear dimensionality reduction +(NLDR) technique. It is a Manifold Learning technique that does not rely on projections like the previous +algorithms. In a nutshell, LLE works by first measuring how each training instance linearly relates to its +closest neighbors (c.n.), and then looking for a low-dimensional representation of the training set where +these local relationships are best preserved (more details shortly).

    -Here are some of the most popular: - -

      -
    • Multidimensional Scaling (MDS) reduces dimensionality while trying to preserve the distances between the instances.
    • -
    • Isomap creates a graph by connecting each instance to its nearest neighbors, then reduces dimensionality while trying to preserve the geodesic distances between the instances.
    • -
    • t-Distributed Stochastic Neighbor Embedding (t-SNE) reduces dimensionality while trying to keep similar instances close and dissimilar instances apart. It is mostly used for visualization, in particular to visualize clusters of instances in high-dimensional space (e.g., to visualize the MNIST images in 2D).
    • -
    • Linear Discriminant Analysis (LDA) is actually a classification algorithm, but during training it learns the most discriminative axes between the classes, and these axes can then be used to define a hyperplane onto which to project the data. The benefit is that the projection will keep classes as far apart as possible, so LDA is a good technique to reduce dimensionality before running another classification algorithm such as a Support Vector Machine (SVM) classifier discussed in the SVM lectures.
    • -
    - -

      @@ -215,6 +224,8 @@ Here are some of the most popular:
    • 29
    • 30
    • 31
    • +
    • 32
    • +
    • »
    diff --git a/doc/pub/DimRed/html/DimRed-bs.html b/doc/pub/DimRed/html/DimRed-bs.html index 57753922e..8da1ff958 100644 --- a/doc/pub/DimRed/html/DimRed-bs.html +++ b/doc/pub/DimRed/html/DimRed-bs.html @@ -89,19 +89,30 @@ Automatically generated HTML file from DocOnce source '___sec14'), ('Towards the PCA theorem', 2, None, '___sec15'), ('The Algorithm before the Theorem', 2, None, '___sec16'), - ('Classical PCA Theorem', 2, None, '___sec17'), - ('Proof of the PCA Theorem', 2, None, '___sec18'), - ('PCA Proof continued', 2, None, '___sec19'), - ('The final step', 2, None, '___sec20'), - ('Principal Component Analysis', 2, None, '___sec21'), - ('PCA and scikit-learn', 2, None, '___sec22'), - ('Back to the Cancer Data', 2, None, '___sec23'), - ('More on the PCA', 2, None, '___sec24'), - ('Incremental PCA', 2, None, '___sec25'), - ('Randomized PCA', 2, None, '___sec26'), - ('Kernel PCA', 2, None, '___sec27'), - ('LLE', 2, None, '___sec28'), - ('Other techniques', 2, None, '___sec29')]} + ('Writing our own PCA code', 2, None, '___sec17'), + ('Compute the sample mean and center the data', + 3, + None, + '___sec18'), + ('Compute the sample covariance', 3, None, '___sec19'), + ('Diagonalize the sample covariance matrix to obtain the ' + 'principal components', + 3, + None, + '___sec20'), + ('Classical PCA Theorem', 2, None, '___sec21'), + ('Proof of the PCA Theorem', 2, None, '___sec22'), + ('PCA Proof continued', 2, None, '___sec23'), + ('The final step', 2, None, '___sec24'), + ('Principal Component Analysis', 2, None, '___sec25'), + ('PCA and scikit-learn', 2, None, '___sec26'), + ('Back to the Cancer Data', 2, None, '___sec27'), + ('More on the PCA', 2, None, '___sec28'), + ('Incremental PCA', 2, None, '___sec29'), + ('Randomized PCA', 2, None, '___sec30'), + ('Kernel PCA', 2, None, '___sec31'), + ('LLE', 2, None, '___sec32'), + ('Other techniques', 2, None, '___sec33')]} end of tocinfo --> @@ -139,36 +150,40 @@ MathJax.Hub.Config({ @@ -203,7 +218,7 @@ MathJax.Hub.Config({
    [2] Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University

    -

    Oct 25, 2019

    +

    Dec 26, 2019


    @@ -227,7 +242,7 @@ MathJax.Hub.Config({

  • 9
  • 10
  • ...
  • -
  • 31
  • +
  • 32
  • »
  • diff --git a/doc/pub/DimRed/html/DimRed-reveal.html b/doc/pub/DimRed/html/DimRed-reveal.html index 291a8c15e..d75134efb 100644 --- a/doc/pub/DimRed/html/DimRed-reveal.html +++ b/doc/pub/DimRed/html/DimRed-reveal.html @@ -148,7 +148,7 @@ MathJax.Hub.Config({
    [2] Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University

     
    -

    Oct 25, 2019

    +

    Dec 26, 2019


    @@ -982,14 +982,120 @@ $$

  • Order the eigenvalue (and the eigenvectors accordingly) in order of decreasing eigenvalues.
  • Keep only those \( l \) eigenvalues larger than a selected threshold value, discarding thus \( p-l \) features since we expect small variations in the data here.
  • + + + +
    +

    Writing our own PCA code

    + +

    +We will use a simple example first with two-dimensional data +drawn from a multivariate normal distribution with the following mean and covariance matrix: +

     
    +$$ +\mu = (-1,2) \qquad \Sigma = \begin{bmatrix} 4 & 2 \\ +2 & 2 +\end{bmatrix} +$$ +

     
    + +

    +We will generate \( N = 1000 \) points \( X = \{ x_1, \ldots, x_N \} \) from +this distribution, and store them in the \( 1000 \times 2 \) matrix \( \boldsymbol{X} \). + +

    +The following Python code aids in setting up the data +

    + +

    N = 1000
    +mean = (-1, 2)
    +cov = [[4, 2], [2, 2]]
    +X = np.random.multivariate_normal(mean, cov, N)
    +
    +

    +Make a small Python code which plots the data. + +

    +Now we are going to implement the PCA algorithm. We will break it down into sub-steps and across multiple cells. + +

    Compute the sample mean and center the data

    + +

    +The first step of PCA is to compute the sample mean of the data and use it to center the data. Recall the sample mean is +

     
    +$$ +\mu_N = \frac{1}{N} \sum_{i=1}^N x_i +$$ +

     
    + +and the mean-centered data \( \bar{X} = \{ \bar{x}_1, \ldots, \bar{x}_N \} \) takes the form +

     
    +$$ +\bar{x}_i = x_i - \mu_N +$$ +

     
    + +When you are done with these steps, print out \( \mu_N \) to verify it is +close to \( \mu \) and plot your mean centered data to verify it is +centered at the origin! Compare your code with the functionality from Scikit-Learn discussed above. + +

    Compute the sample covariance

    + +

    +Now we are going to use the mean centered data to compute the sample covariance of the data. Recall it is given by: +

     
    +$$ +\begin{equation*} +\Sigma_N = \frac{1}{N-1} \sum_{i=1}^N \bar{x}_i^T \bar{x}_i = \frac{1}{N-1} \sum_{i=1}^N (x_i - \mu_N)^T (x_i - \mu_N) +\end{equation*} +$$ +

     
    + +where the data points \( x_i \in \mathbb{R}^p \) (here in this example \( p = 2 \)) are column vectors and \( x^T \) is the transpose of \( x \). +Compare the computed covariance with the answer given above. + +

    Diagonalize the sample covariance matrix to obtain the principal components

    + +

    +Now we are ready to solve for the principal components! To do so we +diagonalize the sample covariance matrix \( \Sigma_N \). We can use the +function np.linalg.eig to do so. It will return the eigenvalues and +eigenvectors of \( \Sigma_N \). Once you have these, carry out the +following tasks: + +

      +

    • Compute the percentage of the total variance captured by the first principal component
    • +

    • Plot the mean centered data and lines along the first and second principal components
    • +

    • Project the mean centered data onto the first and second principal components, and plot the projected data. What do you observe?
    • +

    • Approximate the data as
    • +
    +

     
    +$$ +\begin{equation*} +x_i \approx \tilde{x}_i := \mu_N + \langle x_i, v_0 \rangle v_0 +\end{equation*} +$$ +

     
    + +where \( v_0 \) is the first principal component. What do you observe? + +

    +Finally, collect all these steps and write your own PCA function and +compare this with the functionality included in Scikit-Learn. +Have the input be the data and have the output be the principal components and their associated eigenvalues, sorted in descending order. Can you think of a way to make it more efficient than the algorithm outlined above? + +

    +Finally, try out your own PCA function with other data sets. + +

    After this we ask ourselves how do we prove the link between the maximum variance and the feature reduction.

    -

    Classical PCA Theorem

    +

    Classical PCA Theorem

    We assume now that we have a design matrix \( \boldsymbol{X} \) which has been centered as discussed above. For the sake of simplicity we skip the overline symbol. The matrix is defined in terms of the various column vectors \( [\boldsymbol{x}_0,\boldsymbol{x}_1,\dots, \boldsymbol{x}_{p-1}] \) @@ -1012,7 +1118,7 @@ The PCA theorem states that minimizing the above reconstruction error correspond

    -

    Proof of the PCA Theorem

    +

    Proof of the PCA Theorem

    To show the PCA theorem let us start with the assumption that there is one vector \( \boldsymbol{w}_0 \) which corresponds to a solution which minimized the reconstruction error \( J \). This is an orthogonal vector. It means that we now approximate the reconstruction error in terms of \( \boldsymbol{w}_0 \) and \( \boldsymbol{z}_0 \) as @@ -1041,7 +1147,7 @@ where the vectors on the rhs are known.

    -

    PCA Proof continued

    +

    PCA Proof continued

    We have now found the unknown parameters \( z_{i0} \). These correspond to the projected coordinates and we can write @@ -1089,7 +1195,7 @@ We are almost there, we have obtained a relation between minimizing the reconstr

    -

    The final step

    +

    The final step

    We could trivially maximize the variance of the projection (and @@ -1148,7 +1254,7 @@ chapter 12.4 and discussion therein.

    -

    Principal Component Analysis

    +

    Principal Component Analysis

    @@ -1205,7 +1311,7 @@ X2D = X_centered.dot(W2)

    -

    PCA and scikit-learn

    +

    PCA and scikit-learn

    Scikit-Learn’s PCA class implements PCA using SVD decomposition just like we did before. The @@ -1237,7 +1343,7 @@ variance that lies along the axis of each principal component.

    -

    Back to the Cancer Data

    +

    Back to the Cancer Data

    We can now repeat the above but applied to real data, in this case our breast cancer data. Here we compute performance scores on the training data using logistic regression.

    @@ -1278,7 +1384,7 @@ We see that our training data after the PCA decomposition has a performance simi

    -

    More on the PCA

    +

    More on the PCA

    Instead of arbitrarily choosing the number of dimensions to reduce down to, it is generally preferable to @@ -1309,7 +1415,7 @@ X_reduced = pca.fit_transform(X)

    -

    Incremental PCA

    +

    Incremental PCA

    One problem with the preceding implementation of PCA is that it requires the whole training set to fit in @@ -1321,7 +1427,7 @@ instances arrive).

    -

    Randomized PCA

    +

    Randomized PCA

    Scikit-Learn offers yet another option to perform PCA, called Randomized PCA. This is a stochastic @@ -1335,7 +1441,7 @@ previous algorithms when \( d \) is much smaller than \( n \).

    -

    Kernel PCA

    +

    Kernel PCA

    @@ -1361,7 +1467,7 @@ X_reduced = rbf_pca.fit_transform(X)

    -

    LLE

    +

    LLE

    Locally Linear Embedding (LLE) is another very powerful nonlinear dimensionality reduction @@ -1373,7 +1479,7 @@ these local relationships are best preserved (more details shortly).

    -

    Other techniques

    +

    Other techniques

    There are many other dimensionality reduction techniques, several of which are available in Scikit-Learn. diff --git a/doc/pub/DimRed/html/DimRed-solarized.html b/doc/pub/DimRed/html/DimRed-solarized.html index 1708ad00f..686a4c32d 100644 --- a/doc/pub/DimRed/html/DimRed-solarized.html +++ b/doc/pub/DimRed/html/DimRed-solarized.html @@ -109,19 +109,30 @@ div { text-align: justify; text-justify: inter-word; } '___sec14'), ('Towards the PCA theorem', 2, None, '___sec15'), ('The Algorithm before the Theorem', 2, None, '___sec16'), - ('Classical PCA Theorem', 2, None, '___sec17'), - ('Proof of the PCA Theorem', 2, None, '___sec18'), - ('PCA Proof continued', 2, None, '___sec19'), - ('The final step', 2, None, '___sec20'), - ('Principal Component Analysis', 2, None, '___sec21'), - ('PCA and scikit-learn', 2, None, '___sec22'), - ('Back to the Cancer Data', 2, None, '___sec23'), - ('More on the PCA', 2, None, '___sec24'), - ('Incremental PCA', 2, None, '___sec25'), - ('Randomized PCA', 2, None, '___sec26'), - ('Kernel PCA', 2, None, '___sec27'), - ('LLE', 2, None, '___sec28'), - ('Other techniques', 2, None, '___sec29')]} + ('Writing our own PCA code', 2, None, '___sec17'), + ('Compute the sample mean and center the data', + 3, + None, + '___sec18'), + ('Compute the sample covariance', 3, None, '___sec19'), + ('Diagonalize the sample covariance matrix to obtain the ' + 'principal components', + 3, + None, + '___sec20'), + ('Classical PCA Theorem', 2, None, '___sec21'), + ('Proof of the PCA Theorem', 2, None, '___sec22'), + ('PCA Proof continued', 2, None, '___sec23'), + ('The final step', 2, None, '___sec24'), + ('Principal Component Analysis', 2, None, '___sec25'), + ('PCA and scikit-learn', 2, None, '___sec26'), + ('Back to the Cancer Data', 2, None, '___sec27'), + ('More on the PCA', 2, None, '___sec28'), + ('Incremental PCA', 2, None, '___sec29'), + ('Randomized PCA', 2, None, '___sec30'), + ('Kernel PCA', 2, None, '___sec31'), + ('LLE', 2, None, '___sec32'), + ('Other techniques', 2, None, '___sec33')]} end of tocinfo --> @@ -163,7 +174,7 @@ MathJax.Hub.Config({

    [2] Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University

    -

    Oct 25, 2019

    +

    Dec 26, 2019












    @@ -950,12 +961,109 @@ $$

  • Keep only those \( l \) eigenvalues larger than a selected threshold value, discarding thus \( p-l \) features since we expect small variations in the data here.
  • +









    + +

    Writing our own PCA code

    + +

    +We will use a simple example first with two-dimensional data +drawn from a multivariate normal distribution with the following mean and covariance matrix: +$$ +\mu = (-1,2) \qquad \Sigma = \begin{bmatrix} 4 & 2 \\ +2 & 2 +\end{bmatrix} +$$ + +

    +We will generate \( N = 1000 \) points \( X = \{ x_1, \ldots, x_N \} \) from +this distribution, and store them in the \( 1000 \times 2 \) matrix \( \boldsymbol{X} \). + +

    +The following Python code aids in setting up the data + +

    + + +

    N = 1000
    +mean = (-1, 2)
    +cov = [[4, 2], [2, 2]]
    +X = np.random.multivariate_normal(mean, cov, N)
    +
    +

    +Make a small Python code which plots the data. + +

    +Now we are going to implement the PCA algorithm. We will break it down into sub-steps and across multiple cells. + +

    Compute the sample mean and center the data

    + +

    +The first step of PCA is to compute the sample mean of the data and use it to center the data. Recall the sample mean is +$$ +\mu_N = \frac{1}{N} \sum_{i=1}^N x_i +$$ + +and the mean-centered data \( \bar{X} = \{ \bar{x}_1, \ldots, \bar{x}_N \} \) takes the form +$$ +\bar{x}_i = x_i - \mu_N +$$ + +When you are done with these steps, print out \( \mu_N \) to verify it is +close to \( \mu \) and plot your mean centered data to verify it is +centered at the origin! Compare your code with the functionality from Scikit-Learn discussed above. + +

    Compute the sample covariance

    + +

    +Now we are going to use the mean centered data to compute the sample covariance of the data. Recall it is given by: +$$ +\begin{equation*} +\Sigma_N = \frac{1}{N-1} \sum_{i=1}^N \bar{x}_i^T \bar{x}_i = \frac{1}{N-1} \sum_{i=1}^N (x_i - \mu_N)^T (x_i - \mu_N) +\end{equation*} +$$ + +where the data points \( x_i \in \mathbb{R}^p \) (here in this example \( p = 2 \)) are column vectors and \( x^T \) is the transpose of \( x \). +Compare the computed covariance with the answer given above. + +

    Diagonalize the sample covariance matrix to obtain the principal components

    + +

    +Now we are ready to solve for the principal components! To do so we +diagonalize the sample covariance matrix \( \Sigma_N \). We can use the +function np.linalg.eig to do so. It will return the eigenvalues and +eigenvectors of \( \Sigma_N \). Once you have these, carry out the +following tasks: + +

      +
    • Compute the percentage of the total variance captured by the first principal component
    • +
    • Plot the mean centered data and lines along the first and second principal components
    • +
    • Project the mean centered data onto the first and second principal components, and plot the projected data. What do you observe?
    • +
    • Approximate the data as
    • +
    + +$$ +\begin{equation*} +x_i \approx \tilde{x}_i := \mu_N + \langle x_i, v_0 \rangle v_0 +\end{equation*} +$$ + +where \( v_0 \) is the first principal component. What do you observe? + +

    +Finally, collect all these steps and write your own PCA function and +compare this with the functionality included in Scikit-Learn. +Have the input be the data and have the output be the principal components and their associated eigenvalues, sorted in descending order. Can you think of a way to make it more efficient than the algorithm outlined above? + +

    +Finally, try out your own PCA function with other data sets. + +

    After this we ask ourselves how do we prove the link between the maximum variance and the feature reduction.











    -

    Classical PCA Theorem

    +

    Classical PCA Theorem

    We assume now that we have a design matrix \( \boldsymbol{X} \) which has been centered as discussed above. For the sake of simplicity we skip the overline symbol. The matrix is defined in terms of the various column vectors \( [\boldsymbol{x}_0,\boldsymbol{x}_1,\dots, \boldsymbol{x}_{p-1}] \) @@ -976,7 +1084,7 @@ The PCA theorem states that minimizing the above reconstruction error correspond











    -

    Proof of the PCA Theorem

    +

    Proof of the PCA Theorem

    To show the PCA theorem let us start with the assumption that there is one vector \( \boldsymbol{w}_0 \) which corresponds to a solution which minimized the reconstruction error \( J \). This is an orthogonal vector. It means that we now approximate the reconstruction error in terms of \( \boldsymbol{w}_0 \) and \( \boldsymbol{z}_0 \) as @@ -999,7 +1107,7 @@ where the vectors on the rhs are known.











    -

    PCA Proof continued

    +

    PCA Proof continued

    We have now found the unknown parameters \( z_{i0} \). These correspond to the projected coordinates and we can write @@ -1037,7 +1145,7 @@ We are almost there, we have obtained a relation between minimizing the reconstr











    -

    The final step

    +

    The final step

    We could trivially maximize the variance of the projection (and @@ -1088,7 +1196,7 @@ chapter 12.4 and discussion therein.











    -

    Principal Component Analysis

    +

    Principal Component Analysis

    @@ -1144,7 +1252,7 @@ X2D = X_centered.dot(W2)

    -

    PCA and scikit-learn

    +

    PCA and scikit-learn

    Scikit-Learn’s PCA class implements PCA using SVD decomposition just like we did before. The @@ -1176,7 +1284,7 @@ variance that lies along the axis of each principal component.











    -

    Back to the Cancer Data

    +

    Back to the Cancer Data

    We can now repeat the above but applied to real data, in this case our breast cancer data. Here we compute performance scores on the training data using logistic regression.

    @@ -1217,7 +1325,7 @@ We see that our training data after the PCA decomposition has a performance simi











    -

    More on the PCA

    +

    More on the PCA

    Instead of arbitrarily choosing the number of dimensions to reduce down to, it is generally preferable to @@ -1247,7 +1355,7 @@ X_reduced = pca.fit_transform(X)











    -

    Incremental PCA

    +

    Incremental PCA

    One problem with the preceding implementation of PCA is that it requires the whole training set to fit in @@ -1259,7 +1367,7 @@ instances arrive).











    -

    Randomized PCA

    +

    Randomized PCA

    Scikit-Learn offers yet another option to perform PCA, called Randomized PCA. This is a stochastic @@ -1274,7 +1382,7 @@ previous algorithms when \( d \) is much smaller than \( n \).











    -

    Kernel PCA

    +

    Kernel PCA

    @@ -1303,7 +1411,7 @@ X_reduced = rbf_pca.fit_transform(X)











    -

    LLE

    +

    LLE

    Locally Linear Embedding (LLE) is another very powerful nonlinear dimensionality reduction @@ -1315,7 +1423,7 @@ these local relationships are best preserved (more details shortly).











    -

    Other techniques

    +

    Other techniques

    There are many other dimensionality reduction techniques, several of which are available in Scikit-Learn. diff --git a/doc/pub/DimRed/html/DimRed.html b/doc/pub/DimRed/html/DimRed.html index 08bc92a30..7b1ba18c7 100644 --- a/doc/pub/DimRed/html/DimRed.html +++ b/doc/pub/DimRed/html/DimRed.html @@ -114,19 +114,30 @@ div { text-align: justify; text-justify: inter-word; } '___sec14'), ('Towards the PCA theorem', 2, None, '___sec15'), ('The Algorithm before the Theorem', 2, None, '___sec16'), - ('Classical PCA Theorem', 2, None, '___sec17'), - ('Proof of the PCA Theorem', 2, None, '___sec18'), - ('PCA Proof continued', 2, None, '___sec19'), - ('The final step', 2, None, '___sec20'), - ('Principal Component Analysis', 2, None, '___sec21'), - ('PCA and scikit-learn', 2, None, '___sec22'), - ('Back to the Cancer Data', 2, None, '___sec23'), - ('More on the PCA', 2, None, '___sec24'), - ('Incremental PCA', 2, None, '___sec25'), - ('Randomized PCA', 2, None, '___sec26'), - ('Kernel PCA', 2, None, '___sec27'), - ('LLE', 2, None, '___sec28'), - ('Other techniques', 2, None, '___sec29')]} + ('Writing our own PCA code', 2, None, '___sec17'), + ('Compute the sample mean and center the data', + 3, + None, + '___sec18'), + ('Compute the sample covariance', 3, None, '___sec19'), + ('Diagonalize the sample covariance matrix to obtain the ' + 'principal components', + 3, + None, + '___sec20'), + ('Classical PCA Theorem', 2, None, '___sec21'), + ('Proof of the PCA Theorem', 2, None, '___sec22'), + ('PCA Proof continued', 2, None, '___sec23'), + ('The final step', 2, None, '___sec24'), + ('Principal Component Analysis', 2, None, '___sec25'), + ('PCA and scikit-learn', 2, None, '___sec26'), + ('Back to the Cancer Data', 2, None, '___sec27'), + ('More on the PCA', 2, None, '___sec28'), + ('Incremental PCA', 2, None, '___sec29'), + ('Randomized PCA', 2, None, '___sec30'), + ('Kernel PCA', 2, None, '___sec31'), + ('LLE', 2, None, '___sec32'), + ('Other techniques', 2, None, '___sec33')]} end of tocinfo --> @@ -168,7 +179,7 @@ MathJax.Hub.Config({

    [2] Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University

    -

    Oct 25, 2019

    +

    Dec 26, 2019












    @@ -955,12 +966,109 @@ $$

  • Keep only those \( l \) eigenvalues larger than a selected threshold value, discarding thus \( p-l \) features since we expect small variations in the data here.
  • +









    + +

    Writing our own PCA code

    + +

    +We will use a simple example first with two-dimensional data +drawn from a multivariate normal distribution with the following mean and covariance matrix: +$$ +\mu = (-1,2) \qquad \Sigma = \begin{bmatrix} 4 & 2 \\ +2 & 2 +\end{bmatrix} +$$ + +

    +We will generate \( N = 1000 \) points \( X = \{ x_1, \ldots, x_N \} \) from +this distribution, and store them in the \( 1000 \times 2 \) matrix \( \boldsymbol{X} \). + +

    +The following Python code aids in setting up the data + +

    + + +

    N = 1000
    +mean = (-1, 2)
    +cov = [[4, 2], [2, 2]]
    +X = np.random.multivariate_normal(mean, cov, N)
    +
    +

    +Make a small Python code which plots the data. + +

    +Now we are going to implement the PCA algorithm. We will break it down into sub-steps and across multiple cells. + +

    Compute the sample mean and center the data

    + +

    +The first step of PCA is to compute the sample mean of the data and use it to center the data. Recall the sample mean is +$$ +\mu_N = \frac{1}{N} \sum_{i=1}^N x_i +$$ + +and the mean-centered data \( \bar{X} = \{ \bar{x}_1, \ldots, \bar{x}_N \} \) takes the form +$$ +\bar{x}_i = x_i - \mu_N +$$ + +When you are done with these steps, print out \( \mu_N \) to verify it is +close to \( \mu \) and plot your mean centered data to verify it is +centered at the origin! Compare your code with the functionality from Scikit-Learn discussed above. + +

    Compute the sample covariance

    + +

    +Now we are going to use the mean centered data to compute the sample covariance of the data. Recall it is given by: +$$ +\begin{equation*} +\Sigma_N = \frac{1}{N-1} \sum_{i=1}^N \bar{x}_i^T \bar{x}_i = \frac{1}{N-1} \sum_{i=1}^N (x_i - \mu_N)^T (x_i - \mu_N) +\end{equation*} +$$ + +where the data points \( x_i \in \mathbb{R}^p \) (here in this example \( p = 2 \)) are column vectors and \( x^T \) is the transpose of \( x \). +Compare the computed covariance with the answer given above. + +

    Diagonalize the sample covariance matrix to obtain the principal components

    + +

    +Now we are ready to solve for the principal components! To do so we +diagonalize the sample covariance matrix \( \Sigma_N \). We can use the +function np.linalg.eig to do so. It will return the eigenvalues and +eigenvectors of \( \Sigma_N \). Once you have these, carry out the +following tasks: + +

      +
    • Compute the percentage of the total variance captured by the first principal component
    • +
    • Plot the mean centered data and lines along the first and second principal components
    • +
    • Project the mean centered data onto the first and second principal components, and plot the projected data. What do you observe?
    • +
    • Approximate the data as
    • +
    + +$$ +\begin{equation*} +x_i \approx \tilde{x}_i := \mu_N + \langle x_i, v_0 \rangle v_0 +\end{equation*} +$$ + +where \( v_0 \) is the first principal component. What do you observe? + +

    +Finally, collect all these steps and write your own PCA function and +compare this with the functionality included in Scikit-Learn. +Have the input be the data and have the output be the principal components and their associated eigenvalues, sorted in descending order. Can you think of a way to make it more efficient than the algorithm outlined above? + +

    +Finally, try out your own PCA function with other data sets. + +

    After this we ask ourselves how do we prove the link between the maximum variance and the feature reduction.











    -

    Classical PCA Theorem

    +

    Classical PCA Theorem

    We assume now that we have a design matrix \( \boldsymbol{X} \) which has been centered as discussed above. For the sake of simplicity we skip the overline symbol. The matrix is defined in terms of the various column vectors \( [\boldsymbol{x}_0,\boldsymbol{x}_1,\dots, \boldsymbol{x}_{p-1}] \) @@ -981,7 +1089,7 @@ The PCA theorem states that minimizing the above reconstruction error correspond











    -

    Proof of the PCA Theorem

    +

    Proof of the PCA Theorem

    To show the PCA theorem let us start with the assumption that there is one vector \( \boldsymbol{w}_0 \) which corresponds to a solution which minimized the reconstruction error \( J \). This is an orthogonal vector. It means that we now approximate the reconstruction error in terms of \( \boldsymbol{w}_0 \) and \( \boldsymbol{z}_0 \) as @@ -1004,7 +1112,7 @@ where the vectors on the rhs are known.











    -

    PCA Proof continued

    +

    PCA Proof continued

    We have now found the unknown parameters \( z_{i0} \). These correspond to the projected coordinates and we can write @@ -1042,7 +1150,7 @@ We are almost there, we have obtained a relation between minimizing the reconstr











    -

    The final step

    +

    The final step

    We could trivially maximize the variance of the projection (and @@ -1093,7 +1201,7 @@ chapter 12.4 and discussion therein.











    -

    Principal Component Analysis

    +

    Principal Component Analysis

    @@ -1149,7 +1257,7 @@ X2D = X_centered -

    PCA and scikit-learn

    +

    PCA and scikit-learn

    Scikit-Learn’s PCA class implements PCA using SVD decomposition just like we did before. The @@ -1181,7 +1289,7 @@ variance that lies along the axis of each principal component.











    -

    Back to the Cancer Data

    +

    Back to the Cancer Data

    We can now repeat the above but applied to real data, in this case our breast cancer data. Here we compute performance scores on the training data using logistic regression.

    @@ -1222,7 +1330,7 @@ We see that our training data after the PCA decomposition has a performance simi











    -

    More on the PCA

    +

    More on the PCA

    Instead of arbitrarily choosing the number of dimensions to reduce down to, it is generally preferable to @@ -1252,7 +1360,7 @@ X_reduced = pca











    -

    Incremental PCA

    +

    Incremental PCA

    One problem with the preceding implementation of PCA is that it requires the whole training set to fit in @@ -1264,7 +1372,7 @@ instances arrive).











    -

    Randomized PCA

    +

    Randomized PCA

    Scikit-Learn offers yet another option to perform PCA, called Randomized PCA. This is a stochastic @@ -1279,7 +1387,7 @@ previous algorithms when \( d \) is much smaller than \( n \).











    -

    Kernel PCA

    +

    Kernel PCA

    @@ -1308,7 +1416,7 @@ X_reduced = rbf_pcaLLE +

    LLE

    Locally Linear Embedding (LLE) is another very powerful nonlinear dimensionality reduction @@ -1320,7 +1428,7 @@ these local relationships are best preserved (more details shortly).











    -

    Other techniques

    +

    Other techniques

    There are many other dimensionality reduction techniques, several of which are available in Scikit-Learn. diff --git a/doc/pub/DimRed/ipynb/DimRed.ipynb b/doc/pub/DimRed/ipynb/DimRed.ipynb index 700af1f72..82b60b04e 100644 --- a/doc/pub/DimRed/ipynb/DimRed.ipynb +++ b/doc/pub/DimRed/ipynb/DimRed.ipynb @@ -10,7 +10,7 @@ " \n", "**Morten Hjorth-Jensen**, Department of Physics, University of Oslo and Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University\n", "\n", - "Date: **Oct 25, 2019**\n", + "Date: **Dec 26, 2019**\n", "\n", "Copyright 1999-2019, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license\n", "\n", @@ -1049,6 +1049,156 @@ "\n", "* Keep only those $l$ eigenvalues larger than a selected threshold value, discarding thus $p-l$ features since we expect small variations in the data here.\n", "\n", + "## Writing our own PCA code\n", + "\n", + "We will use a simple example first with two-dimensional data\n", + "drawn from a multivariate normal distribution with the following mean and covariance matrix:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\n", + "\\mu = (-1,2) \\qquad \\Sigma = \\begin{bmatrix} 4 & 2 \\\\\n", + "2 & 2\n", + "\\end{bmatrix}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We will generate $N = 1000$ points $X = \\{ x_1, \\ldots, x_N \\}$ from\n", + "this distribution, and store them in the $1000 \\times 2$ matrix $\\boldsymbol{X}$.\n", + "\n", + "The following Python code aids in setting up the data" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "N = 1000\n", + "mean = (-1, 2)\n", + "cov = [[4, 2], [2, 2]]\n", + "X = np.random.multivariate_normal(mean, cov, N)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Make a small Python code which plots the data.\n", + "\n", + "Now we are going to implement the PCA algorithm. We will break it down into sub-steps and across multiple cells.\n", + "\n", + "### Compute the sample mean and center the data\n", + "\n", + "The first step of PCA is to compute the sample mean of the data and use it to center the data. Recall the sample mean is" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\n", + "\\mu_N = \\frac{1}{N} \\sum_{i=1}^N x_i\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "and the mean-centered data $\\bar{X} = \\{ \\bar{x}_1, \\ldots, \\bar{x}_N \\}$ takes the form" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\n", + "\\bar{x}_i = x_i - \\mu_N\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When you are done with these steps, print out $\\mu_N$ to verify it is\n", + "close to $\\mu$ and plot your mean centered data to verify it is\n", + "centered at the origin! Compare your code with the functionality from **Scikit-Learn** discussed above.\n", + "\n", + "\n", + "### Compute the sample covariance\n", + "\n", + "Now we are going to use the mean centered data to compute the sample covariance of the data. Recall it is given by:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\n", + "\\Sigma_N = \\frac{1}{N-1} \\sum_{i=1}^N \\bar{x}_i^T \\bar{x}_i = \\frac{1}{N-1} \\sum_{i=1}^N (x_i - \\mu_N)^T (x_i - \\mu_N)\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "where the data points $x_i \\in \\mathbb{R}^p$ (here in this example $p = 2$) are column vectors and $x^T$ is the transpose of $x$.\n", + "Compare the computed covariance with the answer given above.\n", + "\n", + "\n", + "### Diagonalize the sample covariance matrix to obtain the principal components\n", + "\n", + "Now we are ready to solve for the principal components! To do so we\n", + "diagonalize the sample covariance matrix $\\Sigma_N$. We can use the\n", + "function **np.linalg.eig** to do so. It will return the eigenvalues and\n", + "eigenvectors of $\\Sigma_N$. Once you have these, carry out the\n", + "following tasks:\n", + "\n", + "* Compute the percentage of the total variance captured by the first principal component\n", + "\n", + "* Plot the mean centered data and lines along the first and second principal components\n", + "\n", + "* Project the mean centered data onto the first and second principal components, and plot the projected data. What do you observe?\n", + "\n", + "* Approximate the data as" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\n", + "x_i \\approx \\tilde{x}_i := \\mu_N + \\langle x_i, v_0 \\rangle v_0\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "where $v_0$ is the first principal component. What do you observe?\n", + "\n", + "Finally, collect all these steps and write your own PCA function and\n", + "compare this with the functionality included in **Scikit-Learn**.\n", + "Have the input be the data and have the output be the principal components and their associated eigenvalues, sorted in descending order. Can you think of a way to make it more efficient than the algorithm outlined above?\n", + "\n", + "Finally, try out your own PCA function with other data sets.\n", + "\n", + "\n", + "\n", "After this we ask ourselves how do we prove the link between the maximum variance and the feature reduction.\n", "\n", "## Classical PCA Theorem\n", @@ -1320,7 +1470,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 12, "metadata": { "collapsed": false }, @@ -1367,7 +1517,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 13, "metadata": { "collapsed": false }, @@ -1391,7 +1541,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 14, "metadata": { "collapsed": false }, @@ -1415,7 +1565,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 15, "metadata": { "collapsed": false }, @@ -1439,7 +1589,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 16, "metadata": { "collapsed": false }, @@ -1493,7 +1643,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 17, "metadata": { "collapsed": false }, @@ -1516,7 +1666,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 18, "metadata": { "collapsed": false }, @@ -1563,7 +1713,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 19, "metadata": { "collapsed": false }, diff --git a/doc/pub/DimRed/ipynb/ipynb-DimRed-src.tar.gz b/doc/pub/DimRed/ipynb/ipynb-DimRed-src.tar.gz index cb7d0f3ef45648511fd83d24751f006e56622ffb..55bb01bf7c59b9a7601fc78711ecc4c1db61e57c 100644 GIT binary patch literal 190 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Ν>vP82}&_L;GT@`ncy(0F%R7NO4f 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 t)`u?Y_!Me=adJ878;K9hN|!;zMEG9ggRO>- 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 QpPiE*k(ydkNec150LLjNW&i*H delta 100637 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