Created
November 9, 2017 03:18
-
-
Save fedden/beaf19ab999d9418980b50149505cbc1 to your computer and use it in GitHub Desktop.
PCA
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Imports\n", | |
"\n", | |
"Here we import the necessary libraries and seed numpy so the program is deterministic and reproducable." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import numpy as np\n", | |
"import matplotlib.pyplot as plt\n", | |
"from mpl_toolkits.mplot3d import Axes3D\n", | |
"\n", | |
"%matplotlib inline\n", | |
"\n", | |
"np.random.seed(8)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Create Random Dataset\n", | |
"\n", | |
"Here we create a random dataset with two classes. The size is 40, and each example is a vector of size 3. When parameterising the multivariate Gaussian distribution, the two classes both have the same covariances, which are an idenity matrix. They however both have different means. \n", | |
"\n", | |
"We could use any dimensionalty for our random dataset here, but having samples with three dimensions ensures that we can easily visualise the intial data, and then visualise the data at two dimensions after we have performed PCA on it!" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"total_size = 40\n", | |
"\n", | |
"def get_data(size, mu):\n", | |
" mu = np.array(mu)\n", | |
" cov = np.identity(len(mu))\n", | |
" data = np.random.multivariate_normal(mu, cov, size)\n", | |
" return data\n", | |
"\n", | |
"class_size = total_size // 2\n", | |
"class_one_data = get_data(class_size, [0, 0, 0])\n", | |
"class_two_data = get_data(class_size, [1, 1, 1])" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Graph Dataset\n", | |
"\n", | |
"Here is a quick and dirty plot of the dataset we have generated." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "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\nlB7C/wEWD8mMjsK6PQAAAABJRU5ErkJggg==\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x7ff1de10e2b0>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"fig = plt.figure()\n", | |
"ax = fig.add_subplot(111, projection='3d')\n", | |
"\n", | |
"_ = ax.scatter(class_one_data.T[0],\n", | |
" class_one_data.T[1],\n", | |
" class_one_data.T[2],\n", | |
" c='r', \n", | |
" marker='o')\n", | |
"_ = ax.scatter(class_two_data.T[0],\n", | |
" class_two_data.T[1],\n", | |
" class_two_data.T[2],\n", | |
" c='b', \n", | |
" marker='^')" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Create Eigenvectors\n", | |
"\n", | |
"First thing we do is concatenate both classes examples into one big dataset. We don't need labels for PCA. The next job is to calculate the covariance matrix, which generalises the notion of variance to multiple dimensions for our matrix. The eigenvalues and eigenvectors are then finally computed for the covariance matrix. " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"array([[-0.53273701, -0.81832965, 0.2157032 ],\n", | |
" [-0.80366544, 0.40933805, -0.43193082],\n", | |
" [-0.26516627, 0.40345874, 0.87573278]])" | |
] | |
}, | |
"execution_count": 4, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"all_data = np.concatenate((class_one_data, class_two_data))\n", | |
"covariance_matrix = np.cov(all_data.T)\n", | |
"eigenvalues, eigenvectors = np.linalg.eig(covariance_matrix)\n", | |
"eigenvectors" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Sort Eigenvectors\n", | |
"\n", | |
"We next sort the eigenvectors in descending order by the size of the corresponding eigenvalues. " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"size_vector_pairs = [(np.abs(eigenvalues[i]), eigenvectors.T[i])\n", | |
" for i in range(len(eigenvalues))]\n", | |
"size_vector_pairs.sort(key=lambda x: x[0], reverse=True)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Create Transformation Matrix\n", | |
"\n", | |
"The goal is to reduce the dimensionality of our feature space whilst retaining the maximum amount of information about the distribution of the data. Typically, the eigenvalues with the greatest values will pertain to the eigenvectors that describe the most about of information about the dataset's distibution of examples. \n", | |
"\n", | |
"Knowing this, we first create a matrix with the desired dimensions amount of eigenvectors.\n", | |
"\n", | |
"Next, we multiply this to the data, which transforms the data to a lower dimensional subspace." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"(2, 40)" | |
] | |
}, | |
"execution_count": 6, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"desired_dimensions = 2\n", | |
"transform_matrix = np.array([size_vector_pairs[i][1]\n", | |
" for i in range(desired_dimensions)])\n", | |
"transformed_data = transform_matrix.dot(all_data.T)\n", | |
"transformed_data.shape" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Plot PCA Results\n", | |
"\n", | |
"We plot the lower dimensional subspace below." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"metadata": { | |
"scrolled": true | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"<matplotlib.collections.PathCollection at 0x7ff1dbfc1978>" | |
] | |
}, | |
"execution_count": 7, | |
"metadata": {}, | |
"output_type": "execute_result" | |
}, | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x7ff1de10e1d0>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"fig = plt.figure()\n", | |
"plt.scatter(transformed_data[0][:class_size],\n", | |
" transformed_data[1][:class_size],\n", | |
" c='r', \n", | |
" marker='o')\n", | |
"plt.scatter(transformed_data[0][-class_size:],\n", | |
" transformed_data[1][-class_size:],\n", | |
" c='b', \n", | |
" marker='^')" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Sanity Check\n", | |
"\n", | |
"Finally, as a sanity check we can check our results against good implementation, such as sklearn. We can see the resultant plot is identical. Now we understand PCA, there is no harm in using sklearn for ease too!" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"<matplotlib.collections.PathCollection at 0x7ff1d090ef28>" | |
] | |
}, | |
"execution_count": 8, | |
"metadata": {}, | |
"output_type": "execute_result" | |
}, | |
{ | |
"data": { | |
"image/png": "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\nAAAASUVORK5CYII=\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x7ff1dc00f3c8>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"from sklearn.decomposition import PCA as sklearnPCA\n", | |
"\n", | |
"sklearn_pca = sklearnPCA(n_components=2)\n", | |
"sklearn_data = sklearn_pca.fit_transform(all_data)\n", | |
"plt.scatter(sklearn_data.T[0][:class_size],\n", | |
" sklearn_data.T[1][:class_size],\n", | |
" c='r', \n", | |
" marker='o')\n", | |
"plt.scatter(sklearn_data.T[0][-class_size:],\n", | |
" sklearn_data.T[1][-class_size:],\n", | |
" c='b', \n", | |
" marker='^')" | |
] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 3", | |
"language": "python", | |
"name": "python3" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython3", | |
"version": "3.5.2" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment