From 48e5ebfd924cff1dd111a1842a789d36b2d15fad Mon Sep 17 00:00:00 2001 From: mhjensen Date: Sun, 20 Oct 2019 23:11:22 +0200 Subject: [PATCH] adding more material, miss theorem and its proof --- doc/pub/DimRed/html/._DimRed-bs000.html | 57 +++-- doc/pub/DimRed/html/._DimRed-bs001.html | 57 +++-- doc/pub/DimRed/html/._DimRed-bs002.html | 57 +++-- doc/pub/DimRed/html/._DimRed-bs003.html | 57 +++-- doc/pub/DimRed/html/._DimRed-bs004.html | 57 +++-- doc/pub/DimRed/html/._DimRed-bs005.html | 57 +++-- doc/pub/DimRed/html/._DimRed-bs006.html | 57 +++-- doc/pub/DimRed/html/._DimRed-bs007.html | 57 +++-- doc/pub/DimRed/html/._DimRed-bs008.html | 57 +++-- doc/pub/DimRed/html/._DimRed-bs009.html | 61 ++--- doc/pub/DimRed/html/DimRed-bs.html | 57 +++-- doc/pub/DimRed/html/DimRed-reveal.html | 193 +++++++++++++--- doc/pub/DimRed/html/DimRed-solarized.html | 222 +++++++++++++++---- doc/pub/DimRed/html/DimRed.html | 222 +++++++++++++++---- doc/pub/DimRed/ipynb/DimRed.ipynb | 210 +++++++++++++++--- doc/pub/DimRed/ipynb/ipynb-DimRed-src.tar.gz | Bin 190 -> 191 bytes doc/pub/DimRed/pdf/DimRed-minted.pdf | Bin 235597 -> 236978 bytes doc/src/DimRed/DimRed.do.txt | 152 +++++++++++-- doc/src/DimRed/covariance.py | 24 ++ doc/src/DimRed/covfrance.py | 43 ++++ doc/src/DimRed/newcov.py | 28 +++ 21 files changed, 1324 insertions(+), 401 deletions(-) create mode 100644 doc/src/DimRed/covariance.py create mode 100644 doc/src/DimRed/covfrance.py create mode 100644 doc/src/DimRed/newcov.py diff --git a/doc/pub/DimRed/html/._DimRed-bs000.html b/doc/pub/DimRed/html/._DimRed-bs000.html index 4d83066c4..74d5b19a6 100644 --- a/doc/pub/DimRed/html/._DimRed-bs000.html +++ b/doc/pub/DimRed/html/._DimRed-bs000.html @@ -76,17 +76,24 @@ Automatically generated HTML file from DocOnce source 2, None, '___sec9'), - ('Classical PCA Theorem', 2, None, '___sec10'), - ('Prof of the PCA Theorem', 2, None, '___sec11'), - ('Getting started with PCA', 2, None, '___sec12'), - ('Principal Component Analysis', 2, None, '___sec13'), - ('PCA and scikit-learn', 2, None, '___sec14'), - ('More on the PCA', 2, None, '___sec15'), - ('Incremental PCA', 2, None, '___sec16'), - ('Randomized PCA', 2, None, '___sec17'), - ('Kernel PCA', 2, None, '___sec18'), - ('LLE', 2, None, '___sec19'), - ('Other techniques', 2, None, '___sec20')]} + ('Covariance Matrix Examples', 2, None, '___sec10'), + ('Correlation Matrix', 2, None, '___sec11'), + ('Correlation Matrix with Pandas', 2, None, '___sec12'), + ('Correlation Matrix with Pandas and the Franke function', + 2, + None, + '___sec13'), + ('Classical PCA Theorem', 2, None, '___sec14'), + ('Prof of the PCA Theorem', 2, None, '___sec15'), + ('Getting started with PCA', 2, None, '___sec16'), + ('Principal Component Analysis', 2, None, '___sec17'), + ('PCA and scikit-learn', 2, None, '___sec18'), + ('More on the PCA', 2, None, '___sec19'), + ('Incremental PCA', 2, None, '___sec20'), + ('Randomized PCA', 2, None, '___sec21'), + ('Kernel PCA', 2, None, '___sec22'), + ('LLE', 2, None, '___sec23'), + ('Other techniques', 2, None, '___sec24')]} end of tocinfo --> @@ -134,17 +141,21 @@ MathJax.Hub.Config({
  • Basic ideas of the Principal Component Analysis (PCA)
  • Introducing the Covariance and Correlation functions
  • Correlation Function and Design/Feature Matrix
  • -
  • Classical PCA Theorem
  • -
  • Prof of the PCA Theorem
  • -
  • Getting started with PCA
  • -
  • Principal Component Analysis
  • -
  • PCA and scikit-learn
  • -
  • More on the PCA
  • -
  • Incremental PCA
  • -
  • Randomized PCA
  • -
  • Kernel PCA
  • -
  • LLE
  • -
  • Other techniques
  • +
  • Covariance Matrix Examples
  • +
  • Correlation Matrix
  • +
  • Correlation Matrix with Pandas
  • +
  • Correlation Matrix with Pandas and the Franke function
  • +
  • Classical PCA Theorem
  • +
  • Prof of the PCA Theorem
  • +
  • Getting started with PCA
  • +
  • Principal Component Analysis
  • +
  • PCA and scikit-learn
  • +
  • More on the PCA
  • +
  • Incremental PCA
  • +
  • Randomized PCA
  • +
  • Kernel PCA
  • +
  • LLE
  • +
  • Other techniques
  • @@ -203,7 +214,7 @@ MathJax.Hub.Config({
  • 9
  • 10
  • ...
  • -
  • 22
  • +
  • 26
  • »
  • diff --git a/doc/pub/DimRed/html/._DimRed-bs001.html b/doc/pub/DimRed/html/._DimRed-bs001.html index a9498ae16..442883e1a 100644 --- a/doc/pub/DimRed/html/._DimRed-bs001.html +++ b/doc/pub/DimRed/html/._DimRed-bs001.html @@ -76,17 +76,24 @@ Automatically generated HTML file from DocOnce source 2, None, '___sec9'), - ('Classical PCA Theorem', 2, None, '___sec10'), - ('Prof of the PCA Theorem', 2, None, '___sec11'), - ('Getting started with PCA', 2, None, '___sec12'), - ('Principal Component Analysis', 2, None, '___sec13'), - ('PCA and scikit-learn', 2, None, '___sec14'), - ('More on the PCA', 2, None, '___sec15'), - ('Incremental PCA', 2, None, '___sec16'), - ('Randomized PCA', 2, None, '___sec17'), - ('Kernel PCA', 2, None, '___sec18'), - ('LLE', 2, None, '___sec19'), - ('Other techniques', 2, None, '___sec20')]} + ('Covariance Matrix Examples', 2, None, '___sec10'), + ('Correlation Matrix', 2, None, '___sec11'), + ('Correlation Matrix with Pandas', 2, None, '___sec12'), + ('Correlation Matrix with Pandas and the Franke function', + 2, + None, + '___sec13'), + ('Classical PCA Theorem', 2, None, '___sec14'), + ('Prof of the PCA Theorem', 2, None, '___sec15'), + ('Getting started with PCA', 2, None, '___sec16'), + ('Principal Component Analysis', 2, None, '___sec17'), + ('PCA and scikit-learn', 2, None, '___sec18'), + ('More on the PCA', 2, None, '___sec19'), + ('Incremental PCA', 2, None, '___sec20'), + ('Randomized PCA', 2, None, '___sec21'), + ('Kernel PCA', 2, None, '___sec22'), + ('LLE', 2, None, '___sec23'), + ('Other techniques', 2, None, '___sec24')]} end of tocinfo --> @@ -134,17 +141,21 @@ MathJax.Hub.Config({
  • Basic ideas of the Principal Component Analysis (PCA)
  • Introducing the Covariance and Correlation functions
  • Correlation Function and Design/Feature Matrix
  • -
  • Classical PCA Theorem
  • -
  • Prof of the PCA Theorem
  • -
  • Getting started with PCA
  • -
  • Principal Component Analysis
  • -
  • PCA and scikit-learn
  • -
  • More on the PCA
  • -
  • Incremental PCA
  • -
  • Randomized PCA
  • -
  • Kernel PCA
  • -
  • LLE
  • -
  • Other techniques
  • +
  • Covariance Matrix Examples
  • +
  • Correlation Matrix
  • +
  • Correlation Matrix with Pandas
  • +
  • Correlation Matrix with Pandas and the Franke function
  • +
  • Classical PCA Theorem
  • +
  • Prof of the PCA Theorem
  • +
  • Getting started with PCA
  • +
  • Principal Component Analysis
  • +
  • PCA and scikit-learn
  • +
  • More on the PCA
  • +
  • Incremental PCA
  • +
  • Randomized PCA
  • +
  • Kernel PCA
  • +
  • LLE
  • +
  • Other techniques
  • @@ -203,7 +214,7 @@ data.
  • 10
  • 11
  • ...
  • -
  • 22
  • +
  • 26
  • »
  • diff --git a/doc/pub/DimRed/html/._DimRed-bs002.html b/doc/pub/DimRed/html/._DimRed-bs002.html index 13ecbc2ab..c564ea153 100644 --- a/doc/pub/DimRed/html/._DimRed-bs002.html +++ b/doc/pub/DimRed/html/._DimRed-bs002.html @@ -76,17 +76,24 @@ Automatically generated HTML file from DocOnce source 2, None, '___sec9'), - ('Classical PCA Theorem', 2, None, '___sec10'), - ('Prof of the PCA Theorem', 2, None, '___sec11'), - ('Getting started with PCA', 2, None, '___sec12'), - ('Principal Component Analysis', 2, None, '___sec13'), - ('PCA and scikit-learn', 2, None, '___sec14'), - ('More on the PCA', 2, None, '___sec15'), - ('Incremental PCA', 2, None, '___sec16'), - ('Randomized PCA', 2, None, '___sec17'), - ('Kernel PCA', 2, None, '___sec18'), - ('LLE', 2, None, '___sec19'), - ('Other techniques', 2, None, '___sec20')]} + ('Covariance Matrix Examples', 2, None, '___sec10'), + ('Correlation Matrix', 2, None, '___sec11'), + ('Correlation Matrix with Pandas', 2, None, '___sec12'), + ('Correlation Matrix with Pandas and the Franke function', + 2, + None, + '___sec13'), + ('Classical PCA Theorem', 2, None, '___sec14'), + ('Prof of the PCA Theorem', 2, None, '___sec15'), + ('Getting started with PCA', 2, None, '___sec16'), + ('Principal Component Analysis', 2, None, '___sec17'), + ('PCA and scikit-learn', 2, None, '___sec18'), + ('More on the PCA', 2, None, '___sec19'), + ('Incremental PCA', 2, None, '___sec20'), + ('Randomized PCA', 2, None, '___sec21'), + ('Kernel PCA', 2, None, '___sec22'), + ('LLE', 2, None, '___sec23'), + ('Other techniques', 2, None, '___sec24')]} end of tocinfo --> @@ -134,17 +141,21 @@ MathJax.Hub.Config({
  • Basic ideas of the Principal Component Analysis (PCA)
  • Introducing the Covariance and Correlation functions
  • Correlation Function and Design/Feature Matrix
  • -
  • Classical PCA Theorem
  • -
  • Prof of the PCA Theorem
  • -
  • Getting started with PCA
  • -
  • Principal Component Analysis
  • -
  • PCA and scikit-learn
  • -
  • More on the PCA
  • -
  • Incremental PCA
  • -
  • Randomized PCA
  • -
  • Kernel PCA
  • -
  • LLE
  • -
  • Other techniques
  • +
  • Covariance Matrix Examples
  • +
  • Correlation Matrix
  • +
  • Correlation Matrix with Pandas
  • +
  • Correlation Matrix with Pandas and the Franke function
  • +
  • Classical PCA Theorem
  • +
  • Prof of the PCA Theorem
  • +
  • Getting started with PCA
  • +
  • Principal Component Analysis
  • +
  • PCA and scikit-learn
  • +
  • More on the PCA
  • +
  • Incremental PCA
  • +
  • Randomized PCA
  • +
  • Kernel PCA
  • +
  • LLE
  • +
  • Other techniques
  • @@ -202,7 +213,7 @@ ensures that all features are exactly between \( 0 \) and \( 1 \). The
  • 11
  • 12
  • ...
  • -
  • 22
  • +
  • 26
  • »
  • diff --git a/doc/pub/DimRed/html/._DimRed-bs003.html b/doc/pub/DimRed/html/._DimRed-bs003.html index 2ec698d22..6d1edf417 100644 --- a/doc/pub/DimRed/html/._DimRed-bs003.html +++ b/doc/pub/DimRed/html/._DimRed-bs003.html @@ -76,17 +76,24 @@ Automatically generated HTML file from DocOnce source 2, None, '___sec9'), - ('Classical PCA Theorem', 2, None, '___sec10'), - ('Prof of the PCA Theorem', 2, None, '___sec11'), - ('Getting started with PCA', 2, None, '___sec12'), - ('Principal Component Analysis', 2, None, '___sec13'), - ('PCA and scikit-learn', 2, None, '___sec14'), - ('More on the PCA', 2, None, '___sec15'), - ('Incremental PCA', 2, None, '___sec16'), - ('Randomized PCA', 2, None, '___sec17'), - ('Kernel PCA', 2, None, '___sec18'), - ('LLE', 2, None, '___sec19'), - ('Other techniques', 2, None, '___sec20')]} + ('Covariance Matrix Examples', 2, None, '___sec10'), + ('Correlation Matrix', 2, None, '___sec11'), + ('Correlation Matrix with Pandas', 2, None, '___sec12'), + ('Correlation Matrix with Pandas and the Franke function', + 2, + None, + '___sec13'), + ('Classical PCA Theorem', 2, None, '___sec14'), + ('Prof of the PCA Theorem', 2, None, '___sec15'), + ('Getting started with PCA', 2, None, '___sec16'), + ('Principal Component Analysis', 2, None, '___sec17'), + ('PCA and scikit-learn', 2, None, '___sec18'), + ('More on the PCA', 2, None, '___sec19'), + ('Incremental PCA', 2, None, '___sec20'), + ('Randomized PCA', 2, None, '___sec21'), + ('Kernel PCA', 2, None, '___sec22'), + ('LLE', 2, None, '___sec23'), + ('Other techniques', 2, None, '___sec24')]} end of tocinfo --> @@ -134,17 +141,21 @@ MathJax.Hub.Config({
  • Basic ideas of the Principal Component Analysis (PCA)
  • Introducing the Covariance and Correlation functions
  • Correlation Function and Design/Feature Matrix
  • -
  • Classical PCA Theorem
  • -
  • Prof of the PCA Theorem
  • -
  • Getting started with PCA
  • -
  • Principal Component Analysis
  • -
  • PCA and scikit-learn
  • -
  • More on the PCA
  • -
  • Incremental PCA
  • -
  • Randomized PCA
  • -
  • Kernel PCA
  • -
  • LLE
  • -
  • Other techniques
  • +
  • Covariance Matrix Examples
  • +
  • Correlation Matrix
  • +
  • Correlation Matrix with Pandas
  • +
  • Correlation Matrix with Pandas and the Franke function
  • +
  • Classical PCA Theorem
  • +
  • Prof of the PCA Theorem
  • +
  • Getting started with PCA
  • +
  • Principal Component Analysis
  • +
  • PCA and scikit-learn
  • +
  • More on the PCA
  • +
  • Incremental PCA
  • +
  • Randomized PCA
  • +
  • Kernel PCA
  • +
  • LLE
  • +
  • Other techniques
  • @@ -205,7 +216,7 @@ techniques.
  • 12
  • 13
  • ...
  • -
  • 22
  • +
  • 26
  • »
  • diff --git a/doc/pub/DimRed/html/._DimRed-bs004.html b/doc/pub/DimRed/html/._DimRed-bs004.html index a06f5ea25..833541830 100644 --- a/doc/pub/DimRed/html/._DimRed-bs004.html +++ b/doc/pub/DimRed/html/._DimRed-bs004.html @@ -76,17 +76,24 @@ Automatically generated HTML file from DocOnce source 2, None, '___sec9'), - ('Classical PCA Theorem', 2, None, '___sec10'), - ('Prof of the PCA Theorem', 2, None, '___sec11'), - ('Getting started with PCA', 2, None, '___sec12'), - ('Principal Component Analysis', 2, None, '___sec13'), - ('PCA and scikit-learn', 2, None, '___sec14'), - ('More on the PCA', 2, None, '___sec15'), - ('Incremental PCA', 2, None, '___sec16'), - ('Randomized PCA', 2, None, '___sec17'), - ('Kernel PCA', 2, None, '___sec18'), - ('LLE', 2, None, '___sec19'), - ('Other techniques', 2, None, '___sec20')]} + ('Covariance Matrix Examples', 2, None, '___sec10'), + ('Correlation Matrix', 2, None, '___sec11'), + ('Correlation Matrix with Pandas', 2, None, '___sec12'), + ('Correlation Matrix with Pandas and the Franke function', + 2, + None, + '___sec13'), + ('Classical PCA Theorem', 2, None, '___sec14'), + ('Prof of the PCA Theorem', 2, None, '___sec15'), + ('Getting started with PCA', 2, None, '___sec16'), + ('Principal Component Analysis', 2, None, '___sec17'), + ('PCA and scikit-learn', 2, None, '___sec18'), + ('More on the PCA', 2, None, '___sec19'), + ('Incremental PCA', 2, None, '___sec20'), + ('Randomized PCA', 2, None, '___sec21'), + ('Kernel PCA', 2, None, '___sec22'), + ('LLE', 2, None, '___sec23'), + ('Other techniques', 2, None, '___sec24')]} end of tocinfo --> @@ -134,17 +141,21 @@ MathJax.Hub.Config({
  • Basic ideas of the Principal Component Analysis (PCA)
  • Introducing the Covariance and Correlation functions
  • Correlation Function and Design/Feature Matrix
  • -
  • Classical PCA Theorem
  • -
  • Prof of the PCA Theorem
  • -
  • Getting started with PCA
  • -
  • Principal Component Analysis
  • -
  • PCA and scikit-learn
  • -
  • More on the PCA
  • -
  • Incremental PCA
  • -
  • Randomized PCA
  • -
  • Kernel PCA
  • -
  • LLE
  • -
  • Other techniques
  • +
  • Covariance Matrix Examples
  • +
  • Correlation Matrix
  • +
  • Correlation Matrix with Pandas
  • +
  • Correlation Matrix with Pandas and the Franke function
  • +
  • Classical PCA Theorem
  • +
  • Prof of the PCA Theorem
  • +
  • Getting started with PCA
  • +
  • Principal Component Analysis
  • +
  • PCA and scikit-learn
  • +
  • More on the PCA
  • +
  • Incremental PCA
  • +
  • Randomized PCA
  • +
  • Kernel PCA
  • +
  • LLE
  • +
  • Other techniques
  • @@ -280,7 +291,7 @@ svm.fit(X_train_scaled, y_train)
  • 13
  • 14
  • ...
  • -
  • 22
  • +
  • 26
  • »
  • diff --git a/doc/pub/DimRed/html/._DimRed-bs005.html b/doc/pub/DimRed/html/._DimRed-bs005.html index 818201cdb..907bf4187 100644 --- a/doc/pub/DimRed/html/._DimRed-bs005.html +++ b/doc/pub/DimRed/html/._DimRed-bs005.html @@ -76,17 +76,24 @@ Automatically generated HTML file from DocOnce source 2, None, '___sec9'), - ('Classical PCA Theorem', 2, None, '___sec10'), - ('Prof of the PCA Theorem', 2, None, '___sec11'), - ('Getting started with PCA', 2, None, '___sec12'), - ('Principal Component Analysis', 2, None, '___sec13'), - ('PCA and scikit-learn', 2, None, '___sec14'), - ('More on the PCA', 2, None, '___sec15'), - ('Incremental PCA', 2, None, '___sec16'), - ('Randomized PCA', 2, None, '___sec17'), - ('Kernel PCA', 2, None, '___sec18'), - ('LLE', 2, None, '___sec19'), - ('Other techniques', 2, None, '___sec20')]} + ('Covariance Matrix Examples', 2, None, '___sec10'), + ('Correlation Matrix', 2, None, '___sec11'), + ('Correlation Matrix with Pandas', 2, None, '___sec12'), + ('Correlation Matrix with Pandas and the Franke function', + 2, + None, + '___sec13'), + ('Classical PCA Theorem', 2, None, '___sec14'), + ('Prof of the PCA Theorem', 2, None, '___sec15'), + ('Getting started with PCA', 2, None, '___sec16'), + ('Principal Component Analysis', 2, None, '___sec17'), + ('PCA and scikit-learn', 2, None, '___sec18'), + ('More on the PCA', 2, None, '___sec19'), + ('Incremental PCA', 2, None, '___sec20'), + ('Randomized PCA', 2, None, '___sec21'), + ('Kernel PCA', 2, None, '___sec22'), + ('LLE', 2, None, '___sec23'), + ('Other techniques', 2, None, '___sec24')]} end of tocinfo --> @@ -134,17 +141,21 @@ MathJax.Hub.Config({
  • Basic ideas of the Principal Component Analysis (PCA)
  • Introducing the Covariance and Correlation functions
  • Correlation Function and Design/Feature Matrix
  • -
  • Classical PCA Theorem
  • -
  • Prof of the PCA Theorem
  • -
  • Getting started with PCA
  • -
  • Principal Component Analysis
  • -
  • PCA and scikit-learn
  • -
  • More on the PCA
  • -
  • Incremental PCA
  • -
  • Randomized PCA
  • -
  • Kernel PCA
  • -
  • LLE
  • -
  • Other techniques
  • +
  • Covariance Matrix Examples
  • +
  • Correlation Matrix
  • +
  • Correlation Matrix with Pandas
  • +
  • Correlation Matrix with Pandas and the Franke function
  • +
  • Classical PCA Theorem
  • +
  • Prof of the PCA Theorem
  • +
  • Getting started with PCA
  • +
  • Principal Component Analysis
  • +
  • PCA and scikit-learn
  • +
  • More on the PCA
  • +
  • Incremental PCA
  • +
  • Randomized PCA
  • +
  • Kernel PCA
  • +
  • LLE
  • +
  • Other techniques
  • @@ -230,7 +241,7 @@ svm.fit(X_train_scaled, y_train)
  • 14
  • 15
  • ...
  • -
  • 22
  • +
  • 26
  • »
  • diff --git a/doc/pub/DimRed/html/._DimRed-bs006.html b/doc/pub/DimRed/html/._DimRed-bs006.html index 307eae100..3c8eac35c 100644 --- a/doc/pub/DimRed/html/._DimRed-bs006.html +++ b/doc/pub/DimRed/html/._DimRed-bs006.html @@ -76,17 +76,24 @@ Automatically generated HTML file from DocOnce source 2, None, '___sec9'), - ('Classical PCA Theorem', 2, None, '___sec10'), - ('Prof of the PCA Theorem', 2, None, '___sec11'), - ('Getting started with PCA', 2, None, '___sec12'), - ('Principal Component Analysis', 2, None, '___sec13'), - ('PCA and scikit-learn', 2, None, '___sec14'), - ('More on the PCA', 2, None, '___sec15'), - ('Incremental PCA', 2, None, '___sec16'), - ('Randomized PCA', 2, None, '___sec17'), - ('Kernel PCA', 2, None, '___sec18'), - ('LLE', 2, None, '___sec19'), - ('Other techniques', 2, None, '___sec20')]} + ('Covariance Matrix Examples', 2, None, '___sec10'), + ('Correlation Matrix', 2, None, '___sec11'), + ('Correlation Matrix with Pandas', 2, None, '___sec12'), + ('Correlation Matrix with Pandas and the Franke function', + 2, + None, + '___sec13'), + ('Classical PCA Theorem', 2, None, '___sec14'), + ('Prof of the PCA Theorem', 2, None, '___sec15'), + ('Getting started with PCA', 2, None, '___sec16'), + ('Principal Component Analysis', 2, None, '___sec17'), + ('PCA and scikit-learn', 2, None, '___sec18'), + ('More on the PCA', 2, None, '___sec19'), + ('Incremental PCA', 2, None, '___sec20'), + ('Randomized PCA', 2, None, '___sec21'), + ('Kernel PCA', 2, None, '___sec22'), + ('LLE', 2, None, '___sec23'), + ('Other techniques', 2, None, '___sec24')]} end of tocinfo --> @@ -134,17 +141,21 @@ MathJax.Hub.Config({
  • Basic ideas of the Principal Component Analysis (PCA)
  • Introducing the Covariance and Correlation functions
  • Correlation Function and Design/Feature Matrix
  • -
  • Classical PCA Theorem
  • -
  • Prof of the PCA Theorem
  • -
  • Getting started with PCA
  • -
  • Principal Component Analysis
  • -
  • PCA and scikit-learn
  • -
  • More on the PCA
  • -
  • Incremental PCA
  • -
  • Randomized PCA
  • -
  • Kernel PCA
  • -
  • LLE
  • -
  • Other techniques
  • +
  • Covariance Matrix Examples
  • +
  • Correlation Matrix
  • +
  • Correlation Matrix with Pandas
  • +
  • Correlation Matrix with Pandas and the Franke function
  • +
  • Classical PCA Theorem
  • +
  • Prof of the PCA Theorem
  • +
  • Getting started with PCA
  • +
  • Principal Component Analysis
  • +
  • PCA and scikit-learn
  • +
  • More on the PCA
  • +
  • Incremental PCA
  • +
  • Randomized PCA
  • +
  • Kernel PCA
  • +
  • LLE
  • +
  • Other techniques
  • @@ -209,7 +220,7 @@ logreg.fit(X_train_scaled, y_train)
  • 15
  • 16
  • ...
  • -
  • 22
  • +
  • 26
  • »
  • diff --git a/doc/pub/DimRed/html/._DimRed-bs007.html b/doc/pub/DimRed/html/._DimRed-bs007.html index cd6de3817..e6898fbda 100644 --- a/doc/pub/DimRed/html/._DimRed-bs007.html +++ b/doc/pub/DimRed/html/._DimRed-bs007.html @@ -76,17 +76,24 @@ Automatically generated HTML file from DocOnce source 2, None, '___sec9'), - ('Classical PCA Theorem', 2, None, '___sec10'), - ('Prof of the PCA Theorem', 2, None, '___sec11'), - ('Getting started with PCA', 2, None, '___sec12'), - ('Principal Component Analysis', 2, None, '___sec13'), - ('PCA and scikit-learn', 2, None, '___sec14'), - ('More on the PCA', 2, None, '___sec15'), - ('Incremental PCA', 2, None, '___sec16'), - ('Randomized PCA', 2, None, '___sec17'), - ('Kernel PCA', 2, None, '___sec18'), - ('LLE', 2, None, '___sec19'), - ('Other techniques', 2, None, '___sec20')]} + ('Covariance Matrix Examples', 2, None, '___sec10'), + ('Correlation Matrix', 2, None, '___sec11'), + ('Correlation Matrix with Pandas', 2, None, '___sec12'), + ('Correlation Matrix with Pandas and the Franke function', + 2, + None, + '___sec13'), + ('Classical PCA Theorem', 2, None, '___sec14'), + ('Prof of the PCA Theorem', 2, None, '___sec15'), + ('Getting started with PCA', 2, None, '___sec16'), + ('Principal Component Analysis', 2, None, '___sec17'), + ('PCA and scikit-learn', 2, None, '___sec18'), + ('More on the PCA', 2, None, '___sec19'), + ('Incremental PCA', 2, None, '___sec20'), + ('Randomized PCA', 2, None, '___sec21'), + ('Kernel PCA', 2, None, '___sec22'), + ('LLE', 2, None, '___sec23'), + ('Other techniques', 2, None, '___sec24')]} end of tocinfo --> @@ -134,17 +141,21 @@ MathJax.Hub.Config({
  • Basic ideas of the Principal Component Analysis (PCA)
  • Introducing the Covariance and Correlation functions
  • Correlation Function and Design/Feature Matrix
  • -
  • Classical PCA Theorem
  • -
  • Prof of the PCA Theorem
  • -
  • Getting started with PCA
  • -
  • Principal Component Analysis
  • -
  • PCA and scikit-learn
  • -
  • More on the PCA
  • -
  • Incremental PCA
  • -
  • Randomized PCA
  • -
  • Kernel PCA
  • -
  • LLE
  • -
  • Other techniques
  • +
  • Covariance Matrix Examples
  • +
  • Correlation Matrix
  • +
  • Correlation Matrix with Pandas
  • +
  • Correlation Matrix with Pandas and the Franke function
  • +
  • Classical PCA Theorem
  • +
  • Prof of the PCA Theorem
  • +
  • Getting started with PCA
  • +
  • Principal Component Analysis
  • +
  • PCA and scikit-learn
  • +
  • More on the PCA
  • +
  • Incremental PCA
  • +
  • Randomized PCA
  • +
  • Kernel PCA
  • +
  • LLE
  • +
  • Other techniques
  • @@ -264,7 +275,7 @@ applications.
  • 16
  • 17
  • ...
  • -
  • 22
  • +
  • 26
  • »
  • diff --git a/doc/pub/DimRed/html/._DimRed-bs008.html b/doc/pub/DimRed/html/._DimRed-bs008.html index 8f476920d..cbc06114e 100644 --- a/doc/pub/DimRed/html/._DimRed-bs008.html +++ b/doc/pub/DimRed/html/._DimRed-bs008.html @@ -76,17 +76,24 @@ Automatically generated HTML file from DocOnce source 2, None, '___sec9'), - ('Classical PCA Theorem', 2, None, '___sec10'), - ('Prof of the PCA Theorem', 2, None, '___sec11'), - ('Getting started with PCA', 2, None, '___sec12'), - ('Principal Component Analysis', 2, None, '___sec13'), - ('PCA and scikit-learn', 2, None, '___sec14'), - ('More on the PCA', 2, None, '___sec15'), - ('Incremental PCA', 2, None, '___sec16'), - ('Randomized PCA', 2, None, '___sec17'), - ('Kernel PCA', 2, None, '___sec18'), - ('LLE', 2, None, '___sec19'), - ('Other techniques', 2, None, '___sec20')]} + ('Covariance Matrix Examples', 2, None, '___sec10'), + ('Correlation Matrix', 2, None, '___sec11'), + ('Correlation Matrix with Pandas', 2, None, '___sec12'), + ('Correlation Matrix with Pandas and the Franke function', + 2, + None, + '___sec13'), + ('Classical PCA Theorem', 2, None, '___sec14'), + ('Prof of the PCA Theorem', 2, None, '___sec15'), + ('Getting started with PCA', 2, None, '___sec16'), + ('Principal Component Analysis', 2, None, '___sec17'), + ('PCA and scikit-learn', 2, None, '___sec18'), + ('More on the PCA', 2, None, '___sec19'), + ('Incremental PCA', 2, None, '___sec20'), + ('Randomized PCA', 2, None, '___sec21'), + ('Kernel PCA', 2, None, '___sec22'), + ('LLE', 2, None, '___sec23'), + ('Other techniques', 2, None, '___sec24')]} end of tocinfo --> @@ -134,17 +141,21 @@ MathJax.Hub.Config({
  • Basic ideas of the Principal Component Analysis (PCA)
  • Introducing the Covariance and Correlation functions
  • Correlation Function and Design/Feature Matrix
  • -
  • Classical PCA Theorem
  • -
  • Prof of the PCA Theorem
  • -
  • Getting started with PCA
  • -
  • Principal Component Analysis
  • -
  • PCA and scikit-learn
  • -
  • More on the PCA
  • -
  • Incremental PCA
  • -
  • Randomized PCA
  • -
  • Kernel PCA
  • -
  • LLE
  • -
  • Other techniques
  • +
  • Covariance Matrix Examples
  • +
  • Correlation Matrix
  • +
  • Correlation Matrix with Pandas
  • +
  • Correlation Matrix with Pandas and the Franke function
  • +
  • Classical PCA Theorem
  • +
  • Prof of the PCA Theorem
  • +
  • Getting started with PCA
  • +
  • Principal Component Analysis
  • +
  • PCA and scikit-learn
  • +
  • More on the PCA
  • +
  • Incremental PCA
  • +
  • Randomized PCA
  • +
  • Kernel PCA
  • +
  • LLE
  • +
  • Other techniques
  • @@ -194,7 +205,7 @@ We have a data set defined by a design/feature matrix \( \boldsymbol{X} \) (see
  • 17
  • 18
  • ...
  • -
  • 22
  • +
  • 26
  • »
  • diff --git a/doc/pub/DimRed/html/._DimRed-bs009.html b/doc/pub/DimRed/html/._DimRed-bs009.html index 4952e13bb..b8821f107 100644 --- a/doc/pub/DimRed/html/._DimRed-bs009.html +++ b/doc/pub/DimRed/html/._DimRed-bs009.html @@ -76,17 +76,24 @@ Automatically generated HTML file from DocOnce source 2, None, '___sec9'), - ('Classical PCA Theorem', 2, None, '___sec10'), - ('Prof of the PCA Theorem', 2, None, '___sec11'), - ('Getting started with PCA', 2, None, '___sec12'), - ('Principal Component Analysis', 2, None, '___sec13'), - ('PCA and scikit-learn', 2, None, '___sec14'), - ('More on the PCA', 2, None, '___sec15'), - ('Incremental PCA', 2, None, '___sec16'), - ('Randomized PCA', 2, None, '___sec17'), - ('Kernel PCA', 2, None, '___sec18'), - ('LLE', 2, None, '___sec19'), - ('Other techniques', 2, None, '___sec20')]} + ('Covariance Matrix Examples', 2, None, '___sec10'), + ('Correlation Matrix', 2, None, '___sec11'), + ('Correlation Matrix with Pandas', 2, None, '___sec12'), + ('Correlation Matrix with Pandas and the Franke function', + 2, + None, + '___sec13'), + ('Classical PCA Theorem', 2, None, '___sec14'), + ('Prof of the PCA Theorem', 2, None, '___sec15'), + ('Getting started with PCA', 2, None, '___sec16'), + ('Principal Component Analysis', 2, None, '___sec17'), + ('PCA and scikit-learn', 2, None, '___sec18'), + ('More on the PCA', 2, None, '___sec19'), + ('Incremental PCA', 2, None, '___sec20'), + ('Randomized PCA', 2, None, '___sec21'), + ('Kernel PCA', 2, None, '___sec22'), + ('LLE', 2, None, '___sec23'), + ('Other techniques', 2, None, '___sec24')]} end of tocinfo --> @@ -134,17 +141,21 @@ MathJax.Hub.Config({
  • Basic ideas of the Principal Component Analysis (PCA)
  • Introducing the Covariance and Correlation functions
  • Correlation Function and Design/Feature Matrix
  • -
  • Classical PCA Theorem
  • -
  • Prof of the PCA Theorem
  • -
  • Getting started with PCA
  • -
  • Principal Component Analysis
  • -
  • PCA and scikit-learn
  • -
  • More on the PCA
  • -
  • Incremental PCA
  • -
  • Randomized PCA
  • -
  • Kernel PCA
  • -
  • LLE
  • -
  • Other techniques
  • +
  • Covariance Matrix Examples
  • +
  • Correlation Matrix
  • +
  • Correlation Matrix with Pandas
  • +
  • Correlation Matrix with Pandas and the Franke function
  • +
  • Classical PCA Theorem
  • +
  • Prof of the PCA Theorem
  • +
  • Getting started with PCA
  • +
  • Principal Component Analysis
  • +
  • PCA and scikit-learn
  • +
  • More on the PCA
  • +
  • Incremental PCA
  • +
  • Randomized PCA
  • +
  • Kernel PCA
  • +
  • LLE
  • +
  • Other techniques
  • @@ -164,7 +175,7 @@ MathJax.Hub.Config({

    Suppose we have defined two vectors -$\hat{x} and \hat{y} with \( n \) elements each. The covariance matrix $\boldsymbol{C}is defined as +\( \hat{x} \) and \( \hat{y} \) with \( n \) elements each. The covariance matrix \( \boldsymbol{C} \) is defined as $$ \boldsymbol{C}[\boldsymbol{x},\boldsymbol{y}] = \begin{bmatrix} cov[\boldsymbol{x},\boldsymbol{x}] & cov[\boldsymbol{x},\boldsymbol{y}] \\ cov[\boldsymbol{y},\boldsymbol{x}] & cov[\boldsymbol{y},\boldsymbol{y}] \\ @@ -196,7 +207,7 @@ introducing instead the correlation matrix defined via the so-called correlation function $$ -corr[\boldsymbol{x},\boldsymbol{y}]=\frac{cov[\boldsymbol{x},\boldsymbol{y}]}{\sqrt{var[\boldsymbol{x}]\var\boldsymbol{y}]}}. +corr[\boldsymbol{x},\boldsymbol{y}]=\frac{cov[\boldsymbol{x},\boldsymbol{y}]}{\sqrt{var[\boldsymbol{x}]\var[\boldsymbol{y}]}}. $$

    @@ -239,7 +250,7 @@ In the above example this is the function we constructed using pandas.

  • 18
  • 19
  • ...
  • -
  • 22
  • +
  • 26
  • »
  • diff --git a/doc/pub/DimRed/html/DimRed-bs.html b/doc/pub/DimRed/html/DimRed-bs.html index 4d83066c4..74d5b19a6 100644 --- a/doc/pub/DimRed/html/DimRed-bs.html +++ b/doc/pub/DimRed/html/DimRed-bs.html @@ -76,17 +76,24 @@ Automatically generated HTML file from DocOnce source 2, None, '___sec9'), - ('Classical PCA Theorem', 2, None, '___sec10'), - ('Prof of the PCA Theorem', 2, None, '___sec11'), - ('Getting started with PCA', 2, None, '___sec12'), - ('Principal Component Analysis', 2, None, '___sec13'), - ('PCA and scikit-learn', 2, None, '___sec14'), - ('More on the PCA', 2, None, '___sec15'), - ('Incremental PCA', 2, None, '___sec16'), - ('Randomized PCA', 2, None, '___sec17'), - ('Kernel PCA', 2, None, '___sec18'), - ('LLE', 2, None, '___sec19'), - ('Other techniques', 2, None, '___sec20')]} + ('Covariance Matrix Examples', 2, None, '___sec10'), + ('Correlation Matrix', 2, None, '___sec11'), + ('Correlation Matrix with Pandas', 2, None, '___sec12'), + ('Correlation Matrix with Pandas and the Franke function', + 2, + None, + '___sec13'), + ('Classical PCA Theorem', 2, None, '___sec14'), + ('Prof of the PCA Theorem', 2, None, '___sec15'), + ('Getting started with PCA', 2, None, '___sec16'), + ('Principal Component Analysis', 2, None, '___sec17'), + ('PCA and scikit-learn', 2, None, '___sec18'), + ('More on the PCA', 2, None, '___sec19'), + ('Incremental PCA', 2, None, '___sec20'), + ('Randomized PCA', 2, None, '___sec21'), + ('Kernel PCA', 2, None, '___sec22'), + ('LLE', 2, None, '___sec23'), + ('Other techniques', 2, None, '___sec24')]} end of tocinfo --> @@ -134,17 +141,21 @@ MathJax.Hub.Config({
  • Basic ideas of the Principal Component Analysis (PCA)
  • Introducing the Covariance and Correlation functions
  • Correlation Function and Design/Feature Matrix
  • -
  • Classical PCA Theorem
  • -
  • Prof of the PCA Theorem
  • -
  • Getting started with PCA
  • -
  • Principal Component Analysis
  • -
  • PCA and scikit-learn
  • -
  • More on the PCA
  • -
  • Incremental PCA
  • -
  • Randomized PCA
  • -
  • Kernel PCA
  • -
  • LLE
  • -
  • Other techniques
  • +
  • Covariance Matrix Examples
  • +
  • Correlation Matrix
  • +
  • Correlation Matrix with Pandas
  • +
  • Correlation Matrix with Pandas and the Franke function
  • +
  • Classical PCA Theorem
  • +
  • Prof of the PCA Theorem
  • +
  • Getting started with PCA
  • +
  • Principal Component Analysis
  • +
  • PCA and scikit-learn
  • +
  • More on the PCA
  • +
  • Incremental PCA
  • +
  • Randomized PCA
  • +
  • Kernel PCA
  • +
  • LLE
  • +
  • Other techniques
  • @@ -203,7 +214,7 @@ MathJax.Hub.Config({
  • 9
  • 10
  • ...
  • -
  • 22
  • +
  • 26
  • »
  • diff --git a/doc/pub/DimRed/html/DimRed-reveal.html b/doc/pub/DimRed/html/DimRed-reveal.html index 2513c9634..0886daa11 100644 --- a/doc/pub/DimRed/html/DimRed-reveal.html +++ b/doc/pub/DimRed/html/DimRed-reveal.html @@ -526,7 +526,7 @@ We have a data set defined by a design/feature matrix \( \boldsymbol{X} \) (see

    Suppose we have defined two vectors -$\hat{x} and \hat{y} with \( n \) elements each. The covariance matrix $\boldsymbol{C}is defined as +\( \hat{x} \) and \( \hat{y} \) with \( n \) elements each. The covariance matrix \( \boldsymbol{C} \) is defined as

     
    $$ \boldsymbol{C}[\boldsymbol{x},\boldsymbol{y}] = \begin{bmatrix} cov[\boldsymbol{x},\boldsymbol{x}] & cov[\boldsymbol{x},\boldsymbol{y}] \\ @@ -567,7 +567,7 @@ correlation function

     
    $$ -corr[\boldsymbol{x},\boldsymbol{y}]=\frac{cov[\boldsymbol{x},\boldsymbol{y}]}{\sqrt{var[\boldsymbol{x}]\var\boldsymbol{y}]}}. +corr[\boldsymbol{x},\boldsymbol{y}]=\frac{cov[\boldsymbol{x},\boldsymbol{y}]}{\sqrt{var[\boldsymbol{x}]\var[\boldsymbol{y}]}}. $$

     
    @@ -652,13 +652,22 @@ corr[\boldsymbol{x}_{p-1},\boldsymbol{x}_0] & corr[\boldsymbol{x}_{p-1},\bolds \end{bmatrix}, $$

     
    + + + +

    +

    Covariance Matrix Examples

    -The Numpy function np.cov calculates the covariance elements using the factor \( 1/(n-1) \) instead of \( 1/n \) since it assumes we do not have the exact mean values. -The following simple function uses the np.vstack function which takes each vector of dimension \( 1\times n \) and produces a \( 2\times n \) matrix \( \hat{W} \) +The Numpy function np.cov calculates the covariance elements using +the factor \( 1/(n-1) \) instead of \( 1/n \) since it assumes we do not have +the exact mean values. The following simple function uses the +np.vstack function which takes each vector of dimension \( 1\times n \) +and produces a \( 2\times n \) matrix \( \boldsymbol{W} \) +

     
    $$ -\hat{W} = \begin{bmatrix} x_0 & y_0 \\ +\boldsymbol{W} = \begin{bmatrix} x_0 & y_0 \\ x_1 & y_1 \\ x_2 & y_2\\ \dots & \dots \\ @@ -669,9 +678,9 @@ $$

     

    -which in turn is converted into into the \( 3\times 3 \) covariance matrix -\( \hat{\Sigma} \) via the Numpy function np.cov(). We note that we can also calculate -the mean value of each set of samples \( \hat{x} \) etc using the Numpy +which in turn is converted into into the \( 2\times 2 \) covariance matrix +\( \boldsymbol{C} \) via the Numpy function np.cov(). We note that we can also calculate +the mean value of each set of samples \( \boldsymbol{x} \) etc using the Numpy function np.mean(x). We can also extract the eigenvalues of the covariance matrix through the np.linalg.eig() function. @@ -680,35 +689,165 @@ covariance matrix through the np.linalg.eig() function.

    # Importing various packages
     import numpy as np
    -
     n = 100
     x = np.random.normal(size=n)
     print(np.mean(x))
     y = 4+3*x+np.random.normal(size=n)
     print(np.mean(y))
    -z = x**3+np.random.normal(size=n)
    -print(np.mean(z))
    -W = np.vstack((x, y, z))
    -Sigma = np.cov(W)
    -print(Sigma)
    -Eigvals, Eigvecs = np.linalg.eig(Sigma)
    -print(Eigvals)
    +W = np.vstack((x, y))
    +C = np.cov(W)
    +print(C)
     
    -

    Classical PCA Theorem

    +

    Correlation Matrix

    + +

    +The previous example can be converted into the correlation matrix by +simply scaling the matrix elements with the variances. We should also +subtract the mean values for each column. This leads to the following +code which sets up the correlations matrix for the previous example in +a more brute force way. Here we scale the mean values for each column of the design matrix, calculate the relevant mean values and variances and then finally set up the \( 2\times 2 \) correlation matrix (since we have only two vectors). + +

    + + +

    import numpy as np
    +n = 100
    +# define two vectors                                                                                           
    +x = np.random.random(size=n)
    +y = 4+3*x+np.random.normal(size=n)
    +#scaling the x and y vectors                                                                                   
    +x = x - np.mean(x)
    +y = y - np.mean(y)
    +variance_x = np.sum(x@x)/n
    +variance_y = np.sum(y@y)/n
    +print(variance_x)
    +print(variance_y)
    +cov_xy = np.sum(x@y)/n
    +cov_xx = np.sum(x@x)/n
    +cov_yy = np.sum(y@y)/n
    +C = np.zeros((2,2))
    +C[0,0]= cov_xx/variance_x
    +C[1,1]= cov_yy/variance_y
    +C[0,1]= cov_xy/np.sqrt(variance_y*variance_x)
    +C[1,0]= C[0,1]
    +print(C)
    +
    +

    +We see that the matrix elements along the diagonal are one as they +should be and that the matrix is symmetric. Furthermore, diagonalizing +this matrix we easily see that it is a positive definite matrix. + +

    +The above procedure with numpy can be made more compact if we use pandas.

    -

    Prof of the PCA Theorem

    +

    Correlation Matrix with Pandas

    + +

    +We whow here how we can set up the correlation matrix using pandas, as done in this simple code +

    + + +

    import numpy as np
    +import pandas as pd
    +n = 10
    +x = np.random.normal(size=n)
    +x = x - np.mean(x)
    +y = 4+3*x+np.random.normal(size=n)
    +y = y - np.mean(y)
    +X = (np.vstack((x, y))).T
    +print(X)
    +Xpd = pd.DataFrame(X)
    +print(Xpd)
    +correlation_matrix = Xpd.corr()
    +print(correlation_matrix)
    +
    +

    +We expand this model to the Franke function discussed above.

    -

    Getting started with PCA

    +

    Correlation Matrix with Pandas and the Franke function

    + +

    + + +

    # Common imports
    +import numpy as np
    +import pandas as pd
    +
    +
    +def FrankeFunction(x,y):
    +	term1 = 0.75*np.exp(-(0.25*(9*x-2)**2) - 0.25*((9*y-2)**2))
    +	term2 = 0.75*np.exp(-((9*x+1)**2)/49.0 - 0.1*(9*y+1))
    +	term3 = 0.5*np.exp(-(9*x-7)**2/4.0 - 0.25*((9*y-3)**2))
    +	term4 = -0.2*np.exp(-(9*x-4)**2 - (9*y-7)**2)
    +	return term1 + term2 + term3 + term4
    +
    +
    +def create_X(x, y, n ):
    +	if len(x.shape) > 1:
    +		x = np.ravel(x)
    +		y = np.ravel(y)
    +
    +	N = len(x)
    +	l = int((n+1)*(n+2)/2)		# Number of elements in beta
    +	X = np.ones((N,l))
    +
    +	for i in range(1,n+1):
    +		q = int((i)*(i+1)/2)
    +		for k in range(i+1):
    +			X[:,q+k] = (x**(i-k))*(y**k)
    +
    +	return X
    +
    +
    +# Making meshgrid of datapoints and compute Franke's function
    +n = 4
    +N = 100
    +x = np.sort(np.random.uniform(0, 1, N))
    +y = np.sort(np.random.uniform(0, 1, N))
    +z = FrankeFunction(x, y)
    +X = create_X(x, y, n=n)    
    +
    +Xpd = pd.DataFrame(X)
    +# subtract the mean values and set up the covariance matrix
    +Xpd = Xpd - Xpd.mean()
    +covariance_matrix = Xpd.cov()
    +print(covariance_matrix)
    +
    +

    +We note here that the covariance is zero for the first rows and +columns since all matrix elements in the design matrix were set to one +(we are fitting the function in terms of a polynomial of degree \( n \)). + +

    +This means that the variance for these elements will be zero and will +cause problems when we set up the correlation matrix. We can simply +drop these elements as follows and then construct the correlation +matrix. +

    + + +
    +

    Classical PCA Theorem

    +
    + + +
    +

    Prof of the PCA Theorem

    +
    + + +
    +

    Getting started with PCA

    @@ -724,7 +863,7 @@ X_pca = pca.transform(X_train_scaled)

    -

    Principal Component Analysis

    +

    Principal Component Analysis

    @@ -761,7 +900,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 @@ -792,7 +931,7 @@ More material to come here.

    -

    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 @@ -823,7 +962,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 @@ -835,7 +974,7 @@ instances arrive).

    -

    Randomized PCA

    +

    Randomized PCA

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

    -

    Kernel PCA

    +

    Kernel PCA

    @@ -875,7 +1014,7 @@ X_reduced = rbf_pca.fit_transform(X)

    -

    LLE

    +

    LLE

    Locally Linear Embedding (LLE) is another very powerful nonlinear dimensionality reduction @@ -887,7 +1026,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 dbbe0c5ef..c215b4a80 100644 --- a/doc/pub/DimRed/html/DimRed-solarized.html +++ b/doc/pub/DimRed/html/DimRed-solarized.html @@ -96,17 +96,24 @@ div { text-align: justify; text-justify: inter-word; } 2, None, '___sec9'), - ('Classical PCA Theorem', 2, None, '___sec10'), - ('Prof of the PCA Theorem', 2, None, '___sec11'), - ('Getting started with PCA', 2, None, '___sec12'), - ('Principal Component Analysis', 2, None, '___sec13'), - ('PCA and scikit-learn', 2, None, '___sec14'), - ('More on the PCA', 2, None, '___sec15'), - ('Incremental PCA', 2, None, '___sec16'), - ('Randomized PCA', 2, None, '___sec17'), - ('Kernel PCA', 2, None, '___sec18'), - ('LLE', 2, None, '___sec19'), - ('Other techniques', 2, None, '___sec20')]} + ('Covariance Matrix Examples', 2, None, '___sec10'), + ('Correlation Matrix', 2, None, '___sec11'), + ('Correlation Matrix with Pandas', 2, None, '___sec12'), + ('Correlation Matrix with Pandas and the Franke function', + 2, + None, + '___sec13'), + ('Classical PCA Theorem', 2, None, '___sec14'), + ('Prof of the PCA Theorem', 2, None, '___sec15'), + ('Getting started with PCA', 2, None, '___sec16'), + ('Principal Component Analysis', 2, None, '___sec17'), + ('PCA and scikit-learn', 2, None, '___sec18'), + ('More on the PCA', 2, None, '___sec19'), + ('Incremental PCA', 2, None, '___sec20'), + ('Randomized PCA', 2, None, '___sec21'), + ('Kernel PCA', 2, None, '___sec22'), + ('LLE', 2, None, '___sec23'), + ('Other techniques', 2, None, '___sec24')]} end of tocinfo --> @@ -522,7 +529,7 @@ We have a data set defined by a design/feature matrix \( \boldsymbol{X} \) (see

    Suppose we have defined two vectors -$\hat{x} and \hat{y} with \( n \) elements each. The covariance matrix $\boldsymbol{C}is defined as +\( \hat{x} \) and \( \hat{y} \) with \( n \) elements each. The covariance matrix \( \boldsymbol{C} \) is defined as $$ \boldsymbol{C}[\boldsymbol{x},\boldsymbol{y}] = \begin{bmatrix} cov[\boldsymbol{x},\boldsymbol{x}] & cov[\boldsymbol{x},\boldsymbol{y}] \\ cov[\boldsymbol{y},\boldsymbol{x}] & cov[\boldsymbol{y},\boldsymbol{y}] \\ @@ -554,7 +561,7 @@ introducing instead the correlation matrix defined via the so-called correlation function $$ -corr[\boldsymbol{x},\boldsymbol{y}]=\frac{cov[\boldsymbol{x},\boldsymbol{y}]}{\sqrt{var[\boldsymbol{x}]\var\boldsymbol{y}]}}. +corr[\boldsymbol{x},\boldsymbol{y}]=\frac{cov[\boldsymbol{x},\boldsymbol{y}]}{\sqrt{var[\boldsymbol{x}]\var[\boldsymbol{y}]}}. $$

    @@ -628,10 +635,19 @@ corr[\boldsymbol{x}_{p-1},\boldsymbol{x}_0] & corr[\boldsymbol{x}_{p-1},\bolds $$

    -The Numpy function np.cov calculates the covariance elements using the factor \( 1/(n-1) \) instead of \( 1/n \) since it assumes we do not have the exact mean values. -The following simple function uses the np.vstack function which takes each vector of dimension \( 1\times n \) and produces a \( 2\times n \) matrix \( \hat{W} \) +









    + +

    Covariance Matrix Examples

    + +

    +The Numpy function np.cov calculates the covariance elements using +the factor \( 1/(n-1) \) instead of \( 1/n \) since it assumes we do not have +the exact mean values. The following simple function uses the +np.vstack function which takes each vector of dimension \( 1\times n \) +and produces a \( 2\times n \) matrix \( \boldsymbol{W} \) + $$ -\hat{W} = \begin{bmatrix} x_0 & y_0 \\ +\boldsymbol{W} = \begin{bmatrix} x_0 & y_0 \\ x_1 & y_1 \\ x_2 & y_2\\ \dots & \dots \\ @@ -641,9 +657,9 @@ $$ $$

    -which in turn is converted into into the \( 3\times 3 \) covariance matrix -\( \hat{\Sigma} \) via the Numpy function np.cov(). We note that we can also calculate -the mean value of each set of samples \( \hat{x} \) etc using the Numpy +which in turn is converted into into the \( 2\times 2 \) covariance matrix +\( \boldsymbol{C} \) via the Numpy function np.cov(). We note that we can also calculate +the mean value of each set of samples \( \boldsymbol{x} \) etc using the Numpy function np.mean(x). We can also extract the eigenvalues of the covariance matrix through the np.linalg.eig() function. @@ -652,34 +668,164 @@ covariance matrix through the np.linalg.eig() function.

    # Importing various packages
     import numpy as np
    -
     n = 100
     x = np.random.normal(size=n)
     print(np.mean(x))
     y = 4+3*x+np.random.normal(size=n)
     print(np.mean(y))
    -z = x**3+np.random.normal(size=n)
    -print(np.mean(z))
    -W = np.vstack((x, y, z))
    -Sigma = np.cov(W)
    -print(Sigma)
    -Eigvals, Eigvecs = np.linalg.eig(Sigma)
    -print(Eigvals)
    +W = np.vstack((x, y))
    +C = np.cov(W)
    +print(C)
     











    -

    Classical PCA Theorem

    +

    Correlation Matrix

    + +

    +The previous example can be converted into the correlation matrix by +simply scaling the matrix elements with the variances. We should also +subtract the mean values for each column. This leads to the following +code which sets up the correlations matrix for the previous example in +a more brute force way. Here we scale the mean values for each column of the design matrix, calculate the relevant mean values and variances and then finally set up the \( 2\times 2 \) correlation matrix (since we have only two vectors). + +

    + + +

    import numpy as np
    +n = 100
    +# define two vectors                                                                                           
    +x = np.random.random(size=n)
    +y = 4+3*x+np.random.normal(size=n)
    +#scaling the x and y vectors                                                                                   
    +x = x - np.mean(x)
    +y = y - np.mean(y)
    +variance_x = np.sum(x@x)/n
    +variance_y = np.sum(y@y)/n
    +print(variance_x)
    +print(variance_y)
    +cov_xy = np.sum(x@y)/n
    +cov_xx = np.sum(x@x)/n
    +cov_yy = np.sum(y@y)/n
    +C = np.zeros((2,2))
    +C[0,0]= cov_xx/variance_x
    +C[1,1]= cov_yy/variance_y
    +C[0,1]= cov_xy/np.sqrt(variance_y*variance_x)
    +C[1,0]= C[0,1]
    +print(C)
    +
    +

    +We see that the matrix elements along the diagonal are one as they +should be and that the matrix is symmetric. Furthermore, diagonalizing +this matrix we easily see that it is a positive definite matrix. + +

    +The above procedure with numpy can be made more compact if we use pandas.











    -

    Prof of the PCA Theorem

    +

    Correlation Matrix with Pandas

    + +

    +We whow here how we can set up the correlation matrix using pandas, as done in this simple code +

    + + +

    import numpy as np
    +import pandas as pd
    +n = 10
    +x = np.random.normal(size=n)
    +x = x - np.mean(x)
    +y = 4+3*x+np.random.normal(size=n)
    +y = y - np.mean(y)
    +X = (np.vstack((x, y))).T
    +print(X)
    +Xpd = pd.DataFrame(X)
    +print(Xpd)
    +correlation_matrix = Xpd.corr()
    +print(correlation_matrix)
    +
    +

    +We expand this model to the Franke function discussed above.











    -

    Getting started with PCA

    +

    Correlation Matrix with Pandas and the Franke function

    + +

    + + +

    # Common imports
    +import numpy as np
    +import pandas as pd
    +
    +
    +def FrankeFunction(x,y):
    +	term1 = 0.75*np.exp(-(0.25*(9*x-2)**2) - 0.25*((9*y-2)**2))
    +	term2 = 0.75*np.exp(-((9*x+1)**2)/49.0 - 0.1*(9*y+1))
    +	term3 = 0.5*np.exp(-(9*x-7)**2/4.0 - 0.25*((9*y-3)**2))
    +	term4 = -0.2*np.exp(-(9*x-4)**2 - (9*y-7)**2)
    +	return term1 + term2 + term3 + term4
    +
    +
    +def create_X(x, y, n ):
    +	if len(x.shape) > 1:
    +		x = np.ravel(x)
    +		y = np.ravel(y)
    +
    +	N = len(x)
    +	l = int((n+1)*(n+2)/2)		# Number of elements in beta
    +	X = np.ones((N,l))
    +
    +	for i in range(1,n+1):
    +		q = int((i)*(i+1)/2)
    +		for k in range(i+1):
    +			X[:,q+k] = (x**(i-k))*(y**k)
    +
    +	return X
    +
    +
    +# Making meshgrid of datapoints and compute Franke's function
    +n = 4
    +N = 100
    +x = np.sort(np.random.uniform(0, 1, N))
    +y = np.sort(np.random.uniform(0, 1, N))
    +z = FrankeFunction(x, y)
    +X = create_X(x, y, n=n)    
    +
    +Xpd = pd.DataFrame(X)
    +# subtract the mean values and set up the covariance matrix
    +Xpd = Xpd - Xpd.mean()
    +covariance_matrix = Xpd.cov()
    +print(covariance_matrix)
    +
    +

    +We note here that the covariance is zero for the first rows and +columns since all matrix elements in the design matrix were set to one +(we are fitting the function in terms of a polynomial of degree \( n \)). + +

    +This means that the variance for these elements will be zero and will +cause problems when we set up the correlation matrix. We can simply +drop these elements as follows and then construct the correlation +matrix. + +

    +









    + +

    Classical PCA Theorem

    + +

    +









    + +

    Prof of the PCA Theorem

    + +

    +









    + +

    Getting started with PCA

    @@ -694,7 +840,7 @@ X_pca = pca.transform(X_train_scaled)











    -

    Principal Component Analysis

    +

    Principal Component Analysis

    @@ -730,7 +876,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 @@ -761,7 +907,7 @@ More material to come here.











    -

    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 @@ -791,7 +937,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 @@ -803,7 +949,7 @@ instances arrive).











    -

    Randomized PCA

    +

    Randomized PCA

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











    -

    Kernel PCA

    +

    Kernel PCA

    @@ -847,7 +993,7 @@ X_reduced = rbf_pca.fit_transform(X)











    -

    LLE

    +

    LLE

    Locally Linear Embedding (LLE) is another very powerful nonlinear dimensionality reduction @@ -859,7 +1005,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 8478d5b7f..d3244342a 100644 --- a/doc/pub/DimRed/html/DimRed.html +++ b/doc/pub/DimRed/html/DimRed.html @@ -101,17 +101,24 @@ div { text-align: justify; text-justify: inter-word; } 2, None, '___sec9'), - ('Classical PCA Theorem', 2, None, '___sec10'), - ('Prof of the PCA Theorem', 2, None, '___sec11'), - ('Getting started with PCA', 2, None, '___sec12'), - ('Principal Component Analysis', 2, None, '___sec13'), - ('PCA and scikit-learn', 2, None, '___sec14'), - ('More on the PCA', 2, None, '___sec15'), - ('Incremental PCA', 2, None, '___sec16'), - ('Randomized PCA', 2, None, '___sec17'), - ('Kernel PCA', 2, None, '___sec18'), - ('LLE', 2, None, '___sec19'), - ('Other techniques', 2, None, '___sec20')]} + ('Covariance Matrix Examples', 2, None, '___sec10'), + ('Correlation Matrix', 2, None, '___sec11'), + ('Correlation Matrix with Pandas', 2, None, '___sec12'), + ('Correlation Matrix with Pandas and the Franke function', + 2, + None, + '___sec13'), + ('Classical PCA Theorem', 2, None, '___sec14'), + ('Prof of the PCA Theorem', 2, None, '___sec15'), + ('Getting started with PCA', 2, None, '___sec16'), + ('Principal Component Analysis', 2, None, '___sec17'), + ('PCA and scikit-learn', 2, None, '___sec18'), + ('More on the PCA', 2, None, '___sec19'), + ('Incremental PCA', 2, None, '___sec20'), + ('Randomized PCA', 2, None, '___sec21'), + ('Kernel PCA', 2, None, '___sec22'), + ('LLE', 2, None, '___sec23'), + ('Other techniques', 2, None, '___sec24')]} end of tocinfo --> @@ -527,7 +534,7 @@ We have a data set defined by a design/feature matrix \( \boldsymbol{X} \) (see

    Suppose we have defined two vectors -$\hat{x} and \hat{y} with \( n \) elements each. The covariance matrix $\boldsymbol{C}is defined as +\( \hat{x} \) and \( \hat{y} \) with \( n \) elements each. The covariance matrix \( \boldsymbol{C} \) is defined as $$ \boldsymbol{C}[\boldsymbol{x},\boldsymbol{y}] = \begin{bmatrix} cov[\boldsymbol{x},\boldsymbol{x}] & cov[\boldsymbol{x},\boldsymbol{y}] \\ cov[\boldsymbol{y},\boldsymbol{x}] & cov[\boldsymbol{y},\boldsymbol{y}] \\ @@ -559,7 +566,7 @@ introducing instead the correlation matrix defined via the so-called correlation function $$ -corr[\boldsymbol{x},\boldsymbol{y}]=\frac{cov[\boldsymbol{x},\boldsymbol{y}]}{\sqrt{var[\boldsymbol{x}]\var\boldsymbol{y}]}}. +corr[\boldsymbol{x},\boldsymbol{y}]=\frac{cov[\boldsymbol{x},\boldsymbol{y}]}{\sqrt{var[\boldsymbol{x}]\var[\boldsymbol{y}]}}. $$

    @@ -633,10 +640,19 @@ corr[\boldsymbol{x}_{p-1},\boldsymbol{x}_0] & corr[\boldsymbol{x}_{p-1},\bolds $$

    -The Numpy function np.cov calculates the covariance elements using the factor \( 1/(n-1) \) instead of \( 1/n \) since it assumes we do not have the exact mean values. -The following simple function uses the np.vstack function which takes each vector of dimension \( 1\times n \) and produces a \( 2\times n \) matrix \( \hat{W} \) +









    + +

    Covariance Matrix Examples

    + +

    +The Numpy function np.cov calculates the covariance elements using +the factor \( 1/(n-1) \) instead of \( 1/n \) since it assumes we do not have +the exact mean values. The following simple function uses the +np.vstack function which takes each vector of dimension \( 1\times n \) +and produces a \( 2\times n \) matrix \( \boldsymbol{W} \) + $$ -\hat{W} = \begin{bmatrix} x_0 & y_0 \\ +\boldsymbol{W} = \begin{bmatrix} x_0 & y_0 \\ x_1 & y_1 \\ x_2 & y_2\\ \dots & \dots \\ @@ -646,9 +662,9 @@ $$ $$

    -which in turn is converted into into the \( 3\times 3 \) covariance matrix -\( \hat{\Sigma} \) via the Numpy function np.cov(). We note that we can also calculate -the mean value of each set of samples \( \hat{x} \) etc using the Numpy +which in turn is converted into into the \( 2\times 2 \) covariance matrix +\( \boldsymbol{C} \) via the Numpy function np.cov(). We note that we can also calculate +the mean value of each set of samples \( \boldsymbol{x} \) etc using the Numpy function np.mean(x). We can also extract the eigenvalues of the covariance matrix through the np.linalg.eig() function. @@ -657,34 +673,164 @@ covariance matrix through the np.linalg.eig() function.

    # Importing various packages
     import numpy as np
    -
     n = 100
     x = np.random.normal(size=n)
     print(np.mean(x))
     y = 4+3*x+np.random.normal(size=n)
     print(np.mean(y))
    -z = x**3+np.random.normal(size=n)
    -print(np.mean(z))
    -W = np.vstack((x, y, z))
    -Sigma = np.cov(W)
    -print(Sigma)
    -Eigvals, Eigvecs = np.linalg.eig(Sigma)
    -print(Eigvals)
    +W = np.vstack((x, y))
    +C = np.cov(W)
    +print(C)
     











    -

    Classical PCA Theorem

    +

    Correlation Matrix

    + +

    +The previous example can be converted into the correlation matrix by +simply scaling the matrix elements with the variances. We should also +subtract the mean values for each column. This leads to the following +code which sets up the correlations matrix for the previous example in +a more brute force way. Here we scale the mean values for each column of the design matrix, calculate the relevant mean values and variances and then finally set up the \( 2\times 2 \) correlation matrix (since we have only two vectors). + +

    + + +

    import numpy as np
    +n = 100
    +# define two vectors                                                                                           
    +x = np.random.random(size=n)
    +y = 4+3*x+np.random.normal(size=n)
    +#scaling the x and y vectors                                                                                   
    +x = x - np.mean(x)
    +y = y - np.mean(y)
    +variance_x = np.sum(x@x)/n
    +variance_y = np.sum(y@y)/n
    +print(variance_x)
    +print(variance_y)
    +cov_xy = np.sum(x@y)/n
    +cov_xx = np.sum(x@x)/n
    +cov_yy = np.sum(y@y)/n
    +C = np.zeros((2,2))
    +C[0,0]= cov_xx/variance_x
    +C[1,1]= cov_yy/variance_y
    +C[0,1]= cov_xy/np.sqrt(variance_y*variance_x)
    +C[1,0]= C[0,1]
    +print(C)
    +
    +

    +We see that the matrix elements along the diagonal are one as they +should be and that the matrix is symmetric. Furthermore, diagonalizing +this matrix we easily see that it is a positive definite matrix. + +

    +The above procedure with numpy can be made more compact if we use pandas.











    -

    Prof of the PCA Theorem

    +

    Correlation Matrix with Pandas

    + +

    +We whow here how we can set up the correlation matrix using pandas, as done in this simple code +

    + + +

    import numpy as np
    +import pandas as pd
    +n = 10
    +x = np.random.normal(size=n)
    +x = x - np.mean(x)
    +y = 4+3*x+np.random.normal(size=n)
    +y = y - np.mean(y)
    +X = (np.vstack((x, y))).T
    +print(X)
    +Xpd = pd.DataFrame(X)
    +print(Xpd)
    +correlation_matrix = Xpd.corr()
    +print(correlation_matrix)
    +
    +

    +We expand this model to the Franke function discussed above.











    -

    Getting started with PCA

    +

    Correlation Matrix with Pandas and the Franke function

    + +

    + + +

    # Common imports
    +import numpy as np
    +import pandas as pd
    +
    +
    +def FrankeFunction(x,y):
    +	term1 = 0.75*np.exp(-(0.25*(9*x-2)**2) - 0.25*((9*y-2)**2))
    +	term2 = 0.75*np.exp(-((9*x+1)**2)/49.0 - 0.1*(9*y+1))
    +	term3 = 0.5*np.exp(-(9*x-7)**2/4.0 - 0.25*((9*y-3)**2))
    +	term4 = -0.2*np.exp(-(9*x-4)**2 - (9*y-7)**2)
    +	return term1 + term2 + term3 + term4
    +
    +
    +def create_X(x, y, n ):
    +	if len(x.shape) > 1:
    +		x = np.ravel(x)
    +		y = np.ravel(y)
    +
    +	N = len(x)
    +	l = int((n+1)*(n+2)/2)		# Number of elements in beta
    +	X = np.ones((N,l))
    +
    +	for i in range(1,n+1):
    +		q = int((i)*(i+1)/2)
    +		for k in range(i+1):
    +			X[:,q+k] = (x**(i-k))*(y**k)
    +
    +	return X
    +
    +
    +# Making meshgrid of datapoints and compute Franke's function
    +n = 4
    +N = 100
    +x = np.sort(np.random.uniform(0, 1, N))
    +y = np.sort(np.random.uniform(0, 1, N))
    +z = FrankeFunction(x, y)
    +X = create_X(x, y, n=n)    
    +
    +Xpd = pd.DataFrame(X)
    +# subtract the mean values and set up the covariance matrix
    +Xpd = Xpd - Xpd.mean()
    +covariance_matrix = Xpd.cov()
    +print(covariance_matrix)
    +
    +

    +We note here that the covariance is zero for the first rows and +columns since all matrix elements in the design matrix were set to one +(we are fitting the function in terms of a polynomial of degree \( n \)). + +

    +This means that the variance for these elements will be zero and will +cause problems when we set up the correlation matrix. We can simply +drop these elements as follows and then construct the correlation +matrix. + +

    +









    + +

    Classical PCA Theorem

    + +

    +









    + +

    Prof of the PCA Theorem

    + +

    +









    + +

    Getting started with PCA

    @@ -699,7 +845,7 @@ X_pca = pca.









    -

    Principal Component Analysis

    +

    Principal Component Analysis

    @@ -735,7 +881,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 @@ -766,7 +912,7 @@ More material to come here.











    -

    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 @@ -796,7 +942,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 @@ -808,7 +954,7 @@ instances arrive).











    -

    Randomized PCA

    +

    Randomized PCA

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











    -

    Kernel PCA

    +

    Kernel PCA

    @@ -852,7 +998,7 @@ X_reduced = rbf_pcaLLE +

    LLE

    Locally Linear Embedding (LLE) is another very powerful nonlinear dimensionality reduction @@ -864,7 +1010,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 802dd81f3..0e28b6e62 100644 --- a/doc/pub/DimRed/ipynb/DimRed.ipynb +++ b/doc/pub/DimRed/ipynb/DimRed.ipynb @@ -412,7 +412,7 @@ "## Introducing the Covariance and Correlation functions\n", "\n", "Suppose we have defined two vectors\n", - "$\\hat{x} and \\hat{y} with $n$ elements each. The covariance matrix $\\boldsymbol{C}is defined as" + "$\\hat{x}$ and $\\hat{y}$ with $n$ elements each. The covariance matrix $\\boldsymbol{C}$ is defined as" ] }, { @@ -492,7 +492,7 @@ "metadata": {}, "source": [ "$$\n", - "corr[\\boldsymbol{x},\\boldsymbol{y}]=\\frac{cov[\\boldsymbol{x},\\boldsymbol{y}]}{\\sqrt{var[\\boldsymbol{x}]\\var\\boldsymbol{y}]}}.\n", + "corr[\\boldsymbol{x},\\boldsymbol{y}]=\\frac{cov[\\boldsymbol{x},\\boldsymbol{y}]}{\\sqrt{var[\\boldsymbol{x}]\\var[\\boldsymbol{y}]}}.\n", "$$" ] }, @@ -628,8 +628,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The Numpy function **np.cov** calculates the covariance elements using the factor $1/(n-1)$ instead of $1/n$ since it assumes we do not have the exact mean values. \n", - "The following simple function uses the **np.vstack** function which takes each vector of dimension $1\\times n$ and produces a $2\\times n$ matrix $\\hat{W}$" + "## Covariance Matrix Examples\n", + "\n", + "\n", + "The Numpy function **np.cov** calculates the covariance elements using\n", + "the factor $1/(n-1)$ instead of $1/n$ since it assumes we do not have\n", + "the exact mean values. The following simple function uses the\n", + "**np.vstack** function which takes each vector of dimension $1\\times n$\n", + "and produces a $2\\times n$ matrix $\\boldsymbol{W}$" ] }, { @@ -637,7 +643,7 @@ "metadata": {}, "source": [ "$$\n", - "\\hat{W} = \\begin{bmatrix} x_0 & y_0 \\\\\n", + "\\boldsymbol{W} = \\begin{bmatrix} x_0 & y_0 \\\\\n", " x_1 & y_1 \\\\\n", " x_2 & y_2\\\\\n", " \\dots & \\dots \\\\\n", @@ -651,9 +657,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "which in turn is converted into into the $3\\times 3$ covariance matrix\n", - "$\\hat{\\Sigma}$ via the Numpy function **np.cov()**. We note that we can also calculate\n", - "the mean value of each set of samples $\\hat{x}$ etc using the Numpy\n", + "which in turn is converted into into the $2\\times 2$ covariance matrix\n", + "$\\boldsymbol{C}$ via the Numpy function **np.cov()**. We note that we can also calculate\n", + "the mean value of each set of samples $\\boldsymbol{x}$ etc using the Numpy\n", "function **np.mean(x)**. We can also extract the eigenvalues of the\n", "covariance matrix through the **np.linalg.eig()** function." ] @@ -668,25 +674,175 @@ "source": [ "# Importing various packages\n", "import numpy as np\n", - "\n", "n = 100\n", "x = np.random.normal(size=n)\n", "print(np.mean(x))\n", "y = 4+3*x+np.random.normal(size=n)\n", "print(np.mean(y))\n", - "z = x**3+np.random.normal(size=n)\n", - "print(np.mean(z))\n", - "W = np.vstack((x, y, z))\n", - "Sigma = np.cov(W)\n", - "print(Sigma)\n", - "Eigvals, Eigvecs = np.linalg.eig(Sigma)\n", - "print(Eigvals)" + "W = np.vstack((x, y))\n", + "C = np.cov(W)\n", + "print(C)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ + "## Correlation Matrix\n", + "\n", + "The previous example can be converted into the correlation matrix by\n", + "simply scaling the matrix elements with the variances. We should also\n", + "subtract the mean values for each column. This leads to the following\n", + "code which sets up the correlations matrix for the previous example in\n", + "a more brute force way. Here we scale the mean values for each column of the design matrix, calculate the relevant mean values and variances and then finally set up the $2\\times 2$ correlation matrix (since we have only two vectors)." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "n = 100\n", + "# define two vectors \n", + "x = np.random.random(size=n)\n", + "y = 4+3*x+np.random.normal(size=n)\n", + "#scaling the x and y vectors \n", + "x = x - np.mean(x)\n", + "y = y - np.mean(y)\n", + "variance_x = np.sum(x@x)/n\n", + "variance_y = np.sum(y@y)/n\n", + "print(variance_x)\n", + "print(variance_y)\n", + "cov_xy = np.sum(x@y)/n\n", + "cov_xx = np.sum(x@x)/n\n", + "cov_yy = np.sum(y@y)/n\n", + "C = np.zeros((2,2))\n", + "C[0,0]= cov_xx/variance_x\n", + "C[1,1]= cov_yy/variance_y\n", + "C[0,1]= cov_xy/np.sqrt(variance_y*variance_x)\n", + "C[1,0]= C[0,1]\n", + "print(C)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We see that the matrix elements along the diagonal are one as they\n", + "should be and that the matrix is symmetric. Furthermore, diagonalizing\n", + "this matrix we easily see that it is a positive definite matrix.\n", + "\n", + "The above procedure with **numpy** can be made more compact if we use **pandas**.\n", + "\n", + "## Correlation Matrix with Pandas\n", + "\n", + "We whow here how we can set up the correlation matrix using **pandas**, as done in this simple code" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "n = 10\n", + "x = np.random.normal(size=n)\n", + "x = x - np.mean(x)\n", + "y = 4+3*x+np.random.normal(size=n)\n", + "y = y - np.mean(y)\n", + "X = (np.vstack((x, y))).T\n", + "print(X)\n", + "Xpd = pd.DataFrame(X)\n", + "print(Xpd)\n", + "correlation_matrix = Xpd.corr()\n", + "print(correlation_matrix)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We expand this model to the Franke function discussed above.\n", + "\n", + "## Correlation Matrix with Pandas and the Franke function" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Common imports\n", + "import numpy as np\n", + "import pandas as pd\n", + "\n", + "\n", + "def FrankeFunction(x,y):\n", + "\tterm1 = 0.75*np.exp(-(0.25*(9*x-2)**2) - 0.25*((9*y-2)**2))\n", + "\tterm2 = 0.75*np.exp(-((9*x+1)**2)/49.0 - 0.1*(9*y+1))\n", + "\tterm3 = 0.5*np.exp(-(9*x-7)**2/4.0 - 0.25*((9*y-3)**2))\n", + "\tterm4 = -0.2*np.exp(-(9*x-4)**2 - (9*y-7)**2)\n", + "\treturn term1 + term2 + term3 + term4\n", + "\n", + "\n", + "def create_X(x, y, n ):\n", + "\tif len(x.shape) > 1:\n", + "\t\tx = np.ravel(x)\n", + "\t\ty = np.ravel(y)\n", + "\n", + "\tN = len(x)\n", + "\tl = int((n+1)*(n+2)/2)\t\t# Number of elements in beta\n", + "\tX = np.ones((N,l))\n", + "\n", + "\tfor i in range(1,n+1):\n", + "\t\tq = int((i)*(i+1)/2)\n", + "\t\tfor k in range(i+1):\n", + "\t\t\tX[:,q+k] = (x**(i-k))*(y**k)\n", + "\n", + "\treturn X\n", + "\n", + "\n", + "# Making meshgrid of datapoints and compute Franke's function\n", + "n = 4\n", + "N = 100\n", + "x = np.sort(np.random.uniform(0, 1, N))\n", + "y = np.sort(np.random.uniform(0, 1, N))\n", + "z = FrankeFunction(x, y)\n", + "X = create_X(x, y, n=n) \n", + "\n", + "Xpd = pd.DataFrame(X)\n", + "# subtract the mean values and set up the covariance matrix\n", + "Xpd = Xpd - Xpd.mean()\n", + "covariance_matrix = Xpd.cov()\n", + "print(covariance_matrix)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We note here that the covariance is zero for the first rows and\n", + "columns since all matrix elements in the design matrix were set to one\n", + "(we are fitting the function in terms of a polynomial of degree $n$).\n", + "\n", + "This means that the variance for these elements will be zero and will\n", + "cause problems when we set up the correlation matrix. We can simply\n", + "drop these elements as follows and then construct the correlation\n", + "matrix. \n", + "\n", + "\n", + "\n", "## Classical PCA Theorem\n", "\n", "\n", @@ -702,7 +858,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 11, "metadata": { "collapsed": false }, @@ -730,7 +886,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 12, "metadata": { "collapsed": false }, @@ -757,7 +913,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 13, "metadata": { "collapsed": false }, @@ -781,7 +937,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 14, "metadata": { "collapsed": false }, @@ -803,7 +959,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 15, "metadata": { "collapsed": false }, @@ -833,7 +989,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 16, "metadata": { "collapsed": false }, @@ -856,7 +1012,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 17, "metadata": { "collapsed": false }, @@ -903,7 +1059,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 18, "metadata": { "collapsed": false }, @@ -948,7 +1104,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 19, "metadata": { "collapsed": false }, @@ -978,7 +1134,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 20, "metadata": { "collapsed": false }, @@ -1013,7 +1169,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 21, "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 990230aad97bf79bbaaa66d1999de27f7d7f6341..359365f9f6c231d9d10f5ea769acba5b5d717deb 100644 GIT binary patch literal 191 zcmV;w06_mAiwFQ<&8%Gj1MSaC3c@fD2H>uHia9|^Oj6fEyXZoY;ssKY+Ne!xl7hXx zeSoeMH${Yeo1bBZVW!M?**;JF-AAiI2&I(5l-rcei8f0;!>i>3uLM-rASma=n909 tZfb#*w_aHZTo1s7P+l3$uW@J1$@11E@vol=f*=UK_5fD%6)yk?004H;SzQ1C literal 190 zcmV;v073sBiwFRfyR2OR1MSa23xY5d2XN1RiuVa*Q)lNu4;_M#zQAO&t#Y$%LVo+E zLY;~(62X3l{Wtb_yjNG-a$hCx?xNKogo-?eDK`a~6Q#?0hA{!05t8|%NC_aE`AY<7 zy^&r9>!|Ugh%;A~tG9K&tZhH^Syq8({)wZI7Iufx39UeB#~ZCLP|B|6ERp@F8ep2+ s=?e_M4bpI+Y6QxdbW$sNjeDa{hITfIf4xi)1VQk%2l>cItN;iA0Pz!8RsaA1 diff --git a/doc/pub/DimRed/pdf/DimRed-minted.pdf b/doc/pub/DimRed/pdf/DimRed-minted.pdf index 50d765d8b165c55dd801102884edaaaf7b82ba0d..965c1920a27a96fda0fed1bb278b317793375389 100644 GIT binary patch delta 98726 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∓>)}Dh~re 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 diff --git a/doc/src/DimRed/DimRed.do.txt b/doc/src/DimRed/DimRed.do.txt index 8d74941d7..cdeab6903 100644 --- a/doc/src/DimRed/DimRed.do.txt +++ b/doc/src/DimRed/DimRed.do.txt @@ -341,7 +341,7 @@ We have a data set defined by a design/feature matrix $\bm{X}$ (see below for it ===== Introducing the Covariance and Correlation functions ===== Suppose we have defined two vectors -$\hat{x} and \hat{y} with $n$ elements each. The covariance matrix $\bm{C}is defined as +$\hat{x}$ and $\hat{y}$ with $n$ elements each. The covariance matrix $\bm{C}$ is defined as !bt \[ \bm{C}[\bm{x},\bm{y}] = \begin{bmatrix} cov[\bm{x},\bm{x}] & cov[\bm{x},\bm{y}] \\ @@ -378,7 +378,7 @@ correlation function !bt \[ -corr[\bm{x},\bm{y}]=\frac{cov[\bm{x},\bm{y}]}{\sqrt{var[\bm{x}]\var\bm{y}]}}. +corr[\bm{x},\bm{y}]=\frac{cov[\bm{x},\bm{y}]}{\sqrt{var[\bm{x}]\var[\bm{y}]}}. \] !et @@ -456,14 +456,20 @@ corr[\bm{x}_{p-1},\bm{x}_0] & corr[\bm{x}_{p-1},\bm{x}_1] & corr[\bm{x}_{p-1}, !et +!split +===== Covariance Matrix Examples ===== +The Numpy function _np.cov_ calculates the covariance elements using +the factor $1/(n-1)$ instead of $1/n$ since it assumes we do not have +the exact mean values. The following simple function uses the +_np.vstack_ function which takes each vector of dimension $1\times n$ +and produces a $2\times n$ matrix $\bm{W}$ + -The Numpy function _np.cov_ calculates the covariance elements using the factor $1/(n-1)$ instead of $1/n$ since it assumes we do not have the exact mean values. -The following simple function uses the _np.vstack_ function which takes each vector of dimension $1\times n$ and produces a $2\times n$ matrix $\hat{W}$ !bt \[ -\hat{W} = \begin{bmatrix} x_0 & y_0 \\ +\bm{W} = \begin{bmatrix} x_0 & y_0 \\ x_1 & y_1 \\ x_2 & y_2\\ \dots & \dots \\ @@ -473,30 +479,144 @@ The following simple function uses the _np.vstack_ function which takes each vec \] !et -which in turn is converted into into the $3\times 3$ covariance matrix -$\hat{\Sigma}$ via the Numpy function _np.cov()_. We note that we can also calculate -the mean value of each set of samples $\hat{x}$ etc using the Numpy +which in turn is converted into into the $2\times 2$ covariance matrix +$\bm{C}$ via the Numpy function _np.cov()_. We note that we can also calculate +the mean value of each set of samples $\bm{x}$ etc using the Numpy function _np.mean(x)_. We can also extract the eigenvalues of the covariance matrix through the _np.linalg.eig()_ function. !bc pycod # Importing various packages import numpy as np - n = 100 x = np.random.normal(size=n) print(np.mean(x)) y = 4+3*x+np.random.normal(size=n) print(np.mean(y)) -z = x**3+np.random.normal(size=n) -print(np.mean(z)) -W = np.vstack((x, y, z)) -Sigma = np.cov(W) -print(Sigma) -Eigvals, Eigvecs = np.linalg.eig(Sigma) -print(Eigvals) +W = np.vstack((x, y)) +C = np.cov(W) +print(C) !ec +!split +===== Correlation Matrix ===== + +The previous example can be converted into the correlation matrix by +simply scaling the matrix elements with the variances. We should also +subtract the mean values for each column. This leads to the following +code which sets up the correlations matrix for the previous example in +a more brute force way. Here we scale the mean values for each column of the design matrix, calculate the relevant mean values and variances and then finally set up the $2\times 2$ correlation matrix (since we have only two vectors). + +!bc pycod +import numpy as np +n = 100 +# define two vectors +x = np.random.random(size=n) +y = 4+3*x+np.random.normal(size=n) +#scaling the x and y vectors +x = x - np.mean(x) +y = y - np.mean(y) +variance_x = np.sum(x@x)/n +variance_y = np.sum(y@y)/n +print(variance_x) +print(variance_y) +cov_xy = np.sum(x@y)/n +cov_xx = np.sum(x@x)/n +cov_yy = np.sum(y@y)/n +C = np.zeros((2,2)) +C[0,0]= cov_xx/variance_x +C[1,1]= cov_yy/variance_y +C[0,1]= cov_xy/np.sqrt(variance_y*variance_x) +C[1,0]= C[0,1] +print(C) +!ec + +We see that the matrix elements along the diagonal are one as they +should be and that the matrix is symmetric. Furthermore, diagonalizing +this matrix we easily see that it is a positive definite matrix. + +The above procedure with _numpy_ can be made more compact if we use _pandas_. + +!split +===== Correlation Matrix with Pandas ===== + +We whow here how we can set up the correlation matrix using _pandas_, as done in this simple code +!bc pycod +import numpy as np +import pandas as pd +n = 10 +x = np.random.normal(size=n) +x = x - np.mean(x) +y = 4+3*x+np.random.normal(size=n) +y = y - np.mean(y) +X = (np.vstack((x, y))).T +print(X) +Xpd = pd.DataFrame(X) +print(Xpd) +correlation_matrix = Xpd.corr() +print(correlation_matrix) +!ec + + +We expand this model to the Franke function discussed above. + +!split +===== Correlation Matrix with Pandas and the Franke function ===== + +!bc pycod +# Common imports +import numpy as np +import pandas as pd + + +def FrankeFunction(x,y): + term1 = 0.75*np.exp(-(0.25*(9*x-2)**2) - 0.25*((9*y-2)**2)) + term2 = 0.75*np.exp(-((9*x+1)**2)/49.0 - 0.1*(9*y+1)) + term3 = 0.5*np.exp(-(9*x-7)**2/4.0 - 0.25*((9*y-3)**2)) + term4 = -0.2*np.exp(-(9*x-4)**2 - (9*y-7)**2) + return term1 + term2 + term3 + term4 + + +def create_X(x, y, n ): + if len(x.shape) > 1: + x = np.ravel(x) + y = np.ravel(y) + + N = len(x) + l = int((n+1)*(n+2)/2) # Number of elements in beta + X = np.ones((N,l)) + + for i in range(1,n+1): + q = int((i)*(i+1)/2) + for k in range(i+1): + X[:,q+k] = (x**(i-k))*(y**k) + + return X + + +# Making meshgrid of datapoints and compute Franke's function +n = 4 +N = 100 +x = np.sort(np.random.uniform(0, 1, N)) +y = np.sort(np.random.uniform(0, 1, N)) +z = FrankeFunction(x, y) +X = create_X(x, y, n=n) + +Xpd = pd.DataFrame(X) +# subtract the mean values and set up the covariance matrix +Xpd = Xpd - Xpd.mean() +covariance_matrix = Xpd.cov() +print(covariance_matrix) +!ec + +We note here that the covariance is zero for the first rows and +columns since all matrix elements in the design matrix were set to one +(we are fitting the function in terms of a polynomial of degree $n$). + +This means that the variance for these elements will be zero and will +cause problems when we set up the correlation matrix. We can simply +drop these elements as follows and then construct the correlation +matrix. diff --git a/doc/src/DimRed/covariance.py b/doc/src/DimRed/covariance.py new file mode 100644 index 000000000..5f47aeac5 --- /dev/null +++ b/doc/src/DimRed/covariance.py @@ -0,0 +1,24 @@ +# Importing various packages +import numpy as np +n = 100 +# define two vectors +x = np.random.random(size=n) +y = 4+3*x+np.random.normal(size=n) +#scaling the x and y vectors +x = x - np.mean(x) +y = y - np.mean(y) +variance_x = np.sum(x@x)/n +variance_y = np.sum(y@y)/n +print(variance_x) +print(variance_y) +cov_xy = np.sum(x@y)/n +cov_xx = np.sum(x@x)/n +cov_yy = np.sum(y@y)/n +C = np.zeros((2,2)) +C[0,0]= cov_xx/variance_x +C[1,1]= cov_yy/variance_y +C[0,1]= cov_xy/np.sqrt(variance_y*variance_x) +C[1,0]= C[0,1] +print(C) +Eigvals, Eigvecs = np.linalg.eig(C) +print(Eigvals) diff --git a/doc/src/DimRed/covfrance.py b/doc/src/DimRed/covfrance.py new file mode 100644 index 000000000..ab57bf2bd --- /dev/null +++ b/doc/src/DimRed/covfrance.py @@ -0,0 +1,43 @@ +# Common imports +import numpy as np +import pandas as pd + + +def FrankeFunction(x,y): + term1 = 0.75*np.exp(-(0.25*(9*x-2)**2) - 0.25*((9*y-2)**2)) + term2 = 0.75*np.exp(-((9*x+1)**2)/49.0 - 0.1*(9*y+1)) + term3 = 0.5*np.exp(-(9*x-7)**2/4.0 - 0.25*((9*y-3)**2)) + term4 = -0.2*np.exp(-(9*x-4)**2 - (9*y-7)**2) + return term1 + term2 + term3 + term4 + + +def create_X(x, y, n ): + if len(x.shape) > 1: + x = np.ravel(x) + y = np.ravel(y) + + N = len(x) + l = int((n+1)*(n+2)/2) # Number of elements in beta + X = np.ones((N,l)) + + for i in range(1,n+1): + q = int((i)*(i+1)/2) + for k in range(i+1): + X[:,q+k] = (x**(i-k))*(y**k) + + return X + + +# Making meshgrid of datapoints and compute Franke's function +n = 4 +N = 1000 +x = np.sort(np.random.uniform(0, 1, N)) +y = np.sort(np.random.uniform(0, 1, N)) +z = FrankeFunction(x, y) +X = create_X(x, y, n=n) + +Xpd = pd.DataFrame(X) +Xpd = Xpd - Xpd.mean() +correlation_matrix = Xpd.cov() +print(correlation_matrix) + diff --git a/doc/src/DimRed/newcov.py b/doc/src/DimRed/newcov.py new file mode 100644 index 000000000..8e6fab13e --- /dev/null +++ b/doc/src/DimRed/newcov.py @@ -0,0 +1,28 @@ +# Importing various packages +import numpy as np +n = 10 +x = np.random.normal(size=n) +x = x - np.mean(x) +y = 4+3*x+np.random.normal(size=n) +y = y - np.mean(y) +X = (np.vstack((x, y))).T +print(X) +import pandas as pd +Xpd = pd.DataFrame(X) +print(Xpd) +correlation_matrix = Xpd.corr() +print(correlation_matrix) + + + +variance_x = np.sum(x@x)/n +variance_y = np.sum(y@y)/n +cov_xy = np.sum(x@y)/n +cov_xx = np.sum(x@x)/n +cov_yy = np.sum(y@y)/n +C = np.zeros((2,2)) +C[0,0]= cov_xx/variance_x +C[1,1]= cov_yy/variance_y +C[0,1]= cov_xy/np.sqrt(variance_y*variance_x) +C[1,0]= C[0,1] +print(C)