From 6b703367e321690765414f66dd61df587be51c39 Mon Sep 17 00:00:00 2001 From: mhjensen Date: Wed, 1 Jan 2020 10:51:38 +0100 Subject: [PATCH] some update of pca --- doc/pub/DimRed/html/._DimRed-bs000.html | 4 +- doc/pub/DimRed/html/._DimRed-bs018.html | 34 ++++----- doc/pub/DimRed/html/DimRed-bs.html | 4 +- doc/pub/DimRed/html/DimRed-reveal.html | 37 +++++----- doc/pub/DimRed/html/DimRed-solarized.html | 38 +++++----- doc/pub/DimRed/html/DimRed.html | 38 +++++----- doc/pub/DimRed/ipynb/DimRed.ipynb | 69 +++++++++++-------- doc/pub/DimRed/ipynb/ipynb-DimRed-src.tar.gz | Bin 191 -> 190 bytes doc/pub/DimRed/pdf/DimRed-minted.pdf | Bin 262893 -> 262834 bytes doc/src/DimRed/DimRed.do.txt | 34 ++++----- doc/src/DimRed/Programs/PCAsimple.py | 19 +++-- 11 files changed, 150 insertions(+), 127 deletions(-) diff --git a/doc/pub/DimRed/html/._DimRed-bs000.html b/doc/pub/DimRed/html/._DimRed-bs000.html index f4b4f0e52..59e9e22ca 100644 --- a/doc/pub/DimRed/html/._DimRed-bs000.html +++ b/doc/pub/DimRed/html/._DimRed-bs000.html @@ -224,7 +224,7 @@ MathJax.Hub.Config({
[2] Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University

-

Dec 31, 2019

+

Jan 1, 2020


@@ -266,7 +266,7 @@ MathJax.Hub.Config({

- © 1999-2019, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license + © 1999-2020, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license
diff --git a/doc/pub/DimRed/html/._DimRed-bs018.html b/doc/pub/DimRed/html/._DimRed-bs018.html index e7381a724..4686a77d7 100644 --- a/doc/pub/DimRed/html/._DimRed-bs018.html +++ b/doc/pub/DimRed/html/._DimRed-bs018.html @@ -290,7 +290,16 @@ $$ $$ 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. +We can write our own code or simply use either the functionaly of numpy or that of pandas, as follows +

+ + +

print(np.cov(X.T))
+print(df.cov())
+print(np.cov(X_centered.T))
+
+

+Depending on the number of points \( n \), we will get results that are close to the covariance values defined above.

Diagonalize the sample covariance matrix to obtain the principal components

@@ -298,14 +307,14 @@ Compare the computed covariance with the answer given above. 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 +eigenvectors of \( \Sigma_n \). Once we have these we can perform the following tasks: $$ @@ -317,15 +326,11 @@ $$ 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? +Collecting all these steps we can write our own PCA function and +compare this with the functionality included in Scikit-Learn.

-The code here outlines some of the elements you could include in this analysis. +The code here outlines some of the elements we could include in the analysis. Feel free to extend upon this.

@@ -345,9 +350,6 @@ X2Dsl = pca.print(pca.components_.T[:, 0]) -

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

diff --git a/doc/pub/DimRed/html/DimRed-bs.html b/doc/pub/DimRed/html/DimRed-bs.html index f4b4f0e52..59e9e22ca 100644 --- a/doc/pub/DimRed/html/DimRed-bs.html +++ b/doc/pub/DimRed/html/DimRed-bs.html @@ -224,7 +224,7 @@ MathJax.Hub.Config({

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

-

Dec 31, 2019

+

Jan 1, 2020


@@ -266,7 +266,7 @@ MathJax.Hub.Config({

- © 1999-2019, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license + © 1999-2020, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license
diff --git a/doc/pub/DimRed/html/DimRed-reveal.html b/doc/pub/DimRed/html/DimRed-reveal.html index 4c8a61a41..dff77c4d9 100644 --- a/doc/pub/DimRed/html/DimRed-reveal.html +++ b/doc/pub/DimRed/html/DimRed-reveal.html @@ -148,12 +148,12 @@ MathJax.Hub.Config({
[2] Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University

 
-

Dec 31, 2019

+

Jan 1, 2020


- © 1999-2019, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license + © 1999-2020, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license
@@ -1102,7 +1102,16 @@ $$

 
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. +We can write our own code or simply use either the functionaly of numpy or that of pandas, as follows +

+ + +

print(np.cov(X.T))
+print(df.cov())
+print(np.cov(X_centered.T))
+
+

+Depending on the number of points \( n \), we will get results that are close to the covariance values defined above.

Diagonalize the sample covariance matrix to obtain the principal components

@@ -1110,14 +1119,14 @@ Compare the computed covariance with the answer given above. 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 +eigenvectors of \( \Sigma_n \). Once we have these we can perform the following tasks:

 
$$ @@ -1130,15 +1139,11 @@ $$ 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? +Collecting all these steps we can write our own PCA function and +compare this with the functionality included in Scikit-Learn.

-The code here outlines some of the elements you could include in this analysis. +The code here outlines some of the elements we could include in the analysis. Feel free to extend upon this.

@@ -1158,8 +1163,6 @@ X2Dsl = pca.fit_transform(X) print(pca.components_.T[:, 0]) -

-Finally, try out your own PCA function with other data sets. diff --git a/doc/pub/DimRed/html/DimRed-solarized.html b/doc/pub/DimRed/html/DimRed-solarized.html index b46a53c3d..ee3a4cc6f 100644 --- a/doc/pub/DimRed/html/DimRed-solarized.html +++ b/doc/pub/DimRed/html/DimRed-solarized.html @@ -179,7 +179,7 @@ MathJax.Hub.Config({

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

-

Dec 31, 2019

+

Jan 1, 2020












@@ -1076,7 +1076,16 @@ $$ $$ 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. +We can write our own code or simply use either the functionaly of numpy or that of pandas, as follows +

+ + +

print(np.cov(X.T))
+print(df.cov())
+print(np.cov(X_centered.T))
+
+

+Depending on the number of points \( n \), we will get results that are close to the covariance values defined above.

Diagonalize the sample covariance matrix to obtain the principal components

@@ -1084,14 +1093,14 @@ Compare the computed covariance with the answer given above. 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 +eigenvectors of \( \Sigma_n \). Once we have these we can perform the following tasks: $$ @@ -1103,15 +1112,11 @@ $$ 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? +Collecting all these steps we can write our own PCA function and +compare this with the functionality included in Scikit-Learn.

-The code here outlines some of the elements you could include in this analysis. +The code here outlines some of the elements we could include in the analysis. Feel free to extend upon this.

@@ -1131,9 +1136,6 @@ X2Dsl = pca.fit_transform(X) print(pca.components_.T[:, 0]) -

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











@@ -1538,7 +1540,7 @@ Here are some of the most popular:

- © 1999-2019, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license + © 1999-2020, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license
diff --git a/doc/pub/DimRed/html/DimRed.html b/doc/pub/DimRed/html/DimRed.html index 3d025d9fe..2e10a51a3 100644 --- a/doc/pub/DimRed/html/DimRed.html +++ b/doc/pub/DimRed/html/DimRed.html @@ -184,7 +184,7 @@ MathJax.Hub.Config({
[2] Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University

-

Dec 31, 2019

+

Jan 1, 2020












@@ -1081,7 +1081,16 @@ $$ $$ 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. +We can write our own code or simply use either the functionaly of numpy or that of pandas, as follows +

+ + +

print(np.cov(X.T))
+print(df.cov())
+print(np.cov(X_centered.T))
+
+

+Depending on the number of points \( n \), we will get results that are close to the covariance values defined above.

Diagonalize the sample covariance matrix to obtain the principal components

@@ -1089,14 +1098,14 @@ Compare the computed covariance with the answer given above. 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 +eigenvectors of \( \Sigma_n \). Once we have these we can perform the following tasks: $$ @@ -1108,15 +1117,11 @@ $$ 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? +Collecting all these steps we can write our own PCA function and +compare this with the functionality included in Scikit-Learn.

-The code here outlines some of the elements you could include in this analysis. +The code here outlines some of the elements we could include in the analysis. Feel free to extend upon this.

@@ -1136,9 +1141,6 @@ X2Dsl = pca.print(pca.components_.T[:, 0]) -

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











@@ -1543,7 +1545,7 @@ Here are some of the most popular:

- © 1999-2019, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license + © 1999-2020, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license
diff --git a/doc/pub/DimRed/ipynb/DimRed.ipynb b/doc/pub/DimRed/ipynb/DimRed.ipynb index 5707585db..c6bca2820 100644 --- a/doc/pub/DimRed/ipynb/DimRed.ipynb +++ b/doc/pub/DimRed/ipynb/DimRed.ipynb @@ -10,9 +10,9 @@ " \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: **Dec 31, 2019**\n", + "Date: **Jan 1, 2020**\n", "\n", - "Copyright 1999-2019, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license\n", + "Copyright 1999-2020, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license\n", "\n", "\n", "\n", @@ -1212,7 +1212,27 @@ "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", + "We can write our own code or simply use either the functionaly of **numpy** or that of **pandas**, as follows" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "print(np.cov(X.T))\n", + "print(df.cov())\n", + "print(np.cov(X_centered.T))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Depending on the number of points $n$, we will get results that are close to the covariance values defined above.\n", "\n", "\n", "### Diagonalize the sample covariance matrix to obtain the principal components\n", @@ -1220,16 +1240,16 @@ "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", + "eigenvectors of $\\Sigma_n$. Once we have these we can perform the \n", "following tasks:\n", "\n", - "* Compute the percentage of the total variance captured by the first principal component\n", + "* We 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", + "* We 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", + "* Then we project the mean centered data onto the first and second principal components, and plot the projected data. \n", "\n", - "* Approximate the data as" + "* Finally, we approximate the data as" ] }, { @@ -1247,19 +1267,15 @@ "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**. Have\n", - "the input be the data and have the output be the principal components\n", - "and their associated eigenvalues, sorted in descending order. Can you\n", - "think of a way to make it more efficient than the algorithm outlined\n", - "above?\n", + "Collecting all these steps we can write our own PCA function and\n", + "compare this with the functionality included in **Scikit-Learn**. \n", "\n", - "The code here outlines some of the elements you could include in this analysis." + "The code here outlines some of the elements we could include in the analysis. Feel free to extend upon this." ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 14, "metadata": { "collapsed": false }, @@ -1286,11 +1302,6 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Finally, try out your own PCA function with other data sets.\n", - "\n", - "\n", - "\n", - "\n", "## Classical PCA Theorem\n", "\n", "We assume now that we have a design matrix $\\boldsymbol{X}$ which has been\n", @@ -1575,7 +1586,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 15, "metadata": { "collapsed": false }, @@ -1622,7 +1633,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 16, "metadata": { "collapsed": false }, @@ -1646,7 +1657,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 17, "metadata": { "collapsed": false }, @@ -1670,7 +1681,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 18, "metadata": { "collapsed": false }, @@ -1694,7 +1705,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 19, "metadata": { "collapsed": false }, @@ -1748,7 +1759,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 20, "metadata": { "collapsed": false }, @@ -1771,7 +1782,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 21, "metadata": { "collapsed": false }, @@ -1818,7 +1829,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 22, "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 ed525379a1fc44e21e2e3d5de22501be1c94bdb1..352fb2e04ed0179591134ed0fb84beb4760aaf00 100644 GIT binary patch literal 190 zcmV;v073sBiwFRXYYbih1MSaC3c@fD24L4c#hjo_O%vBbyKo^$@d7DHZPX?;Nx|OU zK0sHBn<7HK%|9W-FjM5)Y@f&e?pKRJM3$y7=7!NJaXr5$NkSnZ3<)yIh8hz>C|Ln6 zx6(`JJh#It^;v2s_1nIot*SoEnNNXd{)uC)9PAFguZ;$6yey5mK&F~PideP1EmIle$}6M!HEOLnS>Cuf`t>nE5Cp;39tihJzW@jT0OsLUQ~&?~ literal 191 zcmV;w06_mAiwFQQfeT&$1MSbv3c@f92k@Qu6nTP?Zryek=D~v?!x!ji=c=xqZ3ph{ z-3RDN@iIi{@A4-kgrwYViv2cncNeS%5i?3*$~;Tw#CWM^grq={4C5S;W(1HV2~7jQ z^-g-}tz%|9r8x^_g?c+Tj@9*tJ7yZoM=Dm>Pg_E}hhhUBk}klVPom!e2k*d7kHe?Ezx8l_CHL002(PSUCUy diff --git a/doc/pub/DimRed/pdf/DimRed-minted.pdf b/doc/pub/DimRed/pdf/DimRed-minted.pdf index 243dbec69a8d99eba0c83c5c19a57289554c1012..02e5a8671063f41105247ff963853d53de7521b0 100644 GIT binary patch delta 7604 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