Skip to content

Instantly share code, notes, and snippets.

@georgehc
Last active March 30, 2024 19:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save georgehc/af73c94f49378b22ec233c26021e24ef to your computer and use it in GitHub Desktop.
Save georgehc/af73c94f49378b22ec233c26021e24ef to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 95-865: PCA Demo\n",
"Author: George Chen (georgechen [at symbol] cmu.edu)\n",
"\n",
"This demo is heavily based on Mark Richardson's 2009 \"Principle Component Analysis\" notes and uses data he pulled from DEFRA on 1997 UK food consumption (grams/person/week). This dataset is also used as a nice illustrated example of PCA here:\n",
"http://setosa.io/ev/principal-component-analysis/"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib inline\n",
"import matplotlib.pyplot as plt\n",
"plt.style.use('seaborn') # prettier plots\n",
"import numpy as np\n",
"\n",
"# grams per person per week\n",
"food_data = np.array([[105, 103, 103, 66],\n",
" [245, 227, 242, 267],\n",
" [685, 803, 750, 586],\n",
" [147, 160, 122, 93],\n",
" [193, 235, 184, 209], \n",
" [156, 175, 147, 139],\n",
" [720, 874, 566, 1033],\n",
" [253, 265, 171, 143],\n",
" [488, 570, 418, 355],\n",
" [198, 203, 220, 187],\n",
" [360, 365, 337, 334],\n",
" [1102, 1137, 957, 674],\n",
" [1472, 1582, 1462, 1494],\n",
" [57, 73, 53, 47],\n",
" [1374, 1256, 1572, 1506],\n",
" [375, 475, 458, 135],\n",
" [54, 64, 62, 41]])\n",
"row_labels = ['Cheese',\n",
" 'Carcass meat',\n",
" 'Other meat',\n",
" 'Fish',\n",
" 'Fats and oils',\n",
" 'Sugars',\n",
" 'Fresh potatoes',\n",
" 'Fresh Veg',\n",
" 'Other Veg',\n",
" 'Processed potatoes',\n",
" 'Processed Veg',\n",
" 'Fresh fruit',\n",
" 'Cereals',\n",
" 'Beverages',\n",
" 'Soft drinks',\n",
" 'Alcoholic drinks',\n",
" 'Confectionary']\n",
"column_labels = ['England', 'Wales', 'Scotland', 'N Ireland']"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" England Wales Scotland N Ireland\n",
"Cheese 105 103 103 66\n",
"Carcass meat 245 227 242 267\n",
"Other meat 685 803 750 586\n",
"Fish 147 160 122 93\n",
"Fats and oils 193 235 184 209\n",
"Sugars 156 175 147 139\n",
"Fresh potatoes 720 874 566 1033\n",
"Fresh Veg 253 265 171 143\n",
"Other Veg 488 570 418 355\n",
"Processed potatoes 198 203 220 187\n",
"Processed Veg 360 365 337 334\n",
"Fresh fruit 1102 1137 957 674\n",
"Cereals 1472 1582 1462 1494\n",
"Beverages 57 73 53 47\n",
"Soft drinks 1374 1256 1572 1506\n",
"Alcoholic drinks 375 475 458 135\n",
"Confectionary 54 64 62 41\n"
]
}
],
"source": [
"# printing out the table using some basic Python\n",
"\n",
"first_column_width = 20\n",
"other_columns_width = 15\n",
"\n",
"# print header\n",
"print(\"\".ljust(first_column_width), end='')\n",
"for column_label in column_labels:\n",
" print(column_label.rjust(other_columns_width), end='')\n",
"print()\n",
"\n",
"# print each row in the numpy array with a column label\n",
"for row_label, row in zip(row_labels, food_data):\n",
" print(row_label.ljust(first_column_width), end='')\n",
" print(\"\".join([(\"%d\" % x).rjust(other_columns_width) for x in row]))"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>England</th>\n",
" <th>Wales</th>\n",
" <th>Scotland</th>\n",
" <th>N Ireland</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>Cheese</th>\n",
" <td>105</td>\n",
" <td>103</td>\n",
" <td>103</td>\n",
" <td>66</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Carcass meat</th>\n",
" <td>245</td>\n",
" <td>227</td>\n",
" <td>242</td>\n",
" <td>267</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Other meat</th>\n",
" <td>685</td>\n",
" <td>803</td>\n",
" <td>750</td>\n",
" <td>586</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Fish</th>\n",
" <td>147</td>\n",
" <td>160</td>\n",
" <td>122</td>\n",
" <td>93</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Fats and oils</th>\n",
" <td>193</td>\n",
" <td>235</td>\n",
" <td>184</td>\n",
" <td>209</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Sugars</th>\n",
" <td>156</td>\n",
" <td>175</td>\n",
" <td>147</td>\n",
" <td>139</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Fresh potatoes</th>\n",
" <td>720</td>\n",
" <td>874</td>\n",
" <td>566</td>\n",
" <td>1033</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Fresh Veg</th>\n",
" <td>253</td>\n",
" <td>265</td>\n",
" <td>171</td>\n",
" <td>143</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Other Veg</th>\n",
" <td>488</td>\n",
" <td>570</td>\n",
" <td>418</td>\n",
" <td>355</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Processed potatoes</th>\n",
" <td>198</td>\n",
" <td>203</td>\n",
" <td>220</td>\n",
" <td>187</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Processed Veg</th>\n",
" <td>360</td>\n",
" <td>365</td>\n",
" <td>337</td>\n",
" <td>334</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Fresh fruit</th>\n",
" <td>1102</td>\n",
" <td>1137</td>\n",
" <td>957</td>\n",
" <td>674</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Cereals</th>\n",
" <td>1472</td>\n",
" <td>1582</td>\n",
" <td>1462</td>\n",
" <td>1494</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Beverages</th>\n",
" <td>57</td>\n",
" <td>73</td>\n",
" <td>53</td>\n",
" <td>47</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Soft drinks</th>\n",
" <td>1374</td>\n",
" <td>1256</td>\n",
" <td>1572</td>\n",
" <td>1506</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Alcoholic drinks</th>\n",
" <td>375</td>\n",
" <td>475</td>\n",
" <td>458</td>\n",
" <td>135</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Confectionary</th>\n",
" <td>54</td>\n",
" <td>64</td>\n",
" <td>62</td>\n",
" <td>41</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" England Wales Scotland N Ireland\n",
"Cheese 105 103 103 66\n",
"Carcass meat 245 227 242 267\n",
"Other meat 685 803 750 586\n",
"Fish 147 160 122 93\n",
"Fats and oils 193 235 184 209\n",
"Sugars 156 175 147 139\n",
"Fresh potatoes 720 874 566 1033\n",
"Fresh Veg 253 265 171 143\n",
"Other Veg 488 570 418 355\n",
"Processed potatoes 198 203 220 187\n",
"Processed Veg 360 365 337 334\n",
"Fresh fruit 1102 1137 957 674\n",
"Cereals 1472 1582 1462 1494\n",
"Beverages 57 73 53 47\n",
"Soft drinks 1374 1256 1572 1506\n",
"Alcoholic drinks 375 475 458 135\n",
"Confectionary 54 64 62 41"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# printing out the table using Pandas\n",
"\n",
"import pandas\n",
"df = pandas.DataFrame(food_data, columns=column_labels, index=row_labels)\n",
"df"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 105, 245, 685, 147, 193, 156, 720, 253, 488, 198, 360,\n",
" 1102, 1472, 57, 1374, 375, 54],\n",
" [ 103, 227, 803, 160, 235, 175, 874, 265, 570, 203, 365,\n",
" 1137, 1582, 73, 1256, 475, 64],\n",
" [ 103, 242, 750, 122, 184, 147, 566, 171, 418, 220, 337,\n",
" 957, 1462, 53, 1572, 458, 62],\n",
" [ 66, 267, 586, 93, 209, 139, 1033, 143, 355, 187, 334,\n",
" 674, 1494, 47, 1506, 135, 41]])"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"food_data.T"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(4, 17)"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"food_data.T.shape"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"([<matplotlib.axis.XTick at 0x12142cc90>,\n",
" <matplotlib.axis.XTick at 0x123807710>,\n",
" <matplotlib.axis.XTick at 0x111250ad0>,\n",
" <matplotlib.axis.XTick at 0x123f2ab90>,\n",
" <matplotlib.axis.XTick at 0x123f2acd0>,\n",
" <matplotlib.axis.XTick at 0x123f3c6d0>,\n",
" <matplotlib.axis.XTick at 0x123f3cd50>,\n",
" <matplotlib.axis.XTick at 0x123f423d0>,\n",
" <matplotlib.axis.XTick at 0x123f42a10>,\n",
" <matplotlib.axis.XTick at 0x123f42450>,\n",
" <matplotlib.axis.XTick at 0x123f3c050>,\n",
" <matplotlib.axis.XTick at 0x123f4a3d0>,\n",
" <matplotlib.axis.XTick at 0x123f4aa10>,\n",
" <matplotlib.axis.XTick at 0x123f4ad50>,\n",
" <matplotlib.axis.XTick at 0x123f506d0>,\n",
" <matplotlib.axis.XTick at 0x123f50d10>,\n",
" <matplotlib.axis.XTick at 0x123f56390>],\n",
" <a list of 17 Text xticklabel objects>)"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 576x396 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.bar(range(len(row_labels)), food_data[:, 0])\n",
"plt.xticks(range(len(row_labels)), row_labels, rotation=90)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"([<matplotlib.axis.XTick at 0x123fe82d0>,\n",
" <matplotlib.axis.XTick at 0x123fd9a90>,\n",
" <matplotlib.axis.XTick at 0x123fd9950>,\n",
" <matplotlib.axis.XTick at 0x124151910>,\n",
" <matplotlib.axis.XTick at 0x124151e10>,\n",
" <matplotlib.axis.XTick at 0x124158490>,\n",
" <matplotlib.axis.XTick at 0x124158b10>,\n",
" <matplotlib.axis.XTick at 0x1241601d0>,\n",
" <matplotlib.axis.XTick at 0x1241607d0>,\n",
" <matplotlib.axis.XTick at 0x124160e10>,\n",
" <matplotlib.axis.XTick at 0x124158a90>,\n",
" <matplotlib.axis.XTick at 0x124167110>,\n",
" <matplotlib.axis.XTick at 0x1241677d0>,\n",
" <matplotlib.axis.XTick at 0x124167e10>,\n",
" <matplotlib.axis.XTick at 0x12416d490>,\n",
" <matplotlib.axis.XTick at 0x12416dad0>,\n",
" <matplotlib.axis.XTick at 0x124175190>],\n",
" <a list of 17 Text xticklabel objects>)"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 576x396 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.bar(range(len(row_labels)), food_data[:, 1])\n",
"plt.xticks(range(len(row_labels)), row_labels, rotation=90)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.decomposition import PCA\n",
"\n",
"single_dimension_pca = PCA(n_components=1) # project data down to a single dimension\n",
"\n",
"# single_dimension_pca.fit(food_data.T)\n",
"\n",
"single_dimension_food_data = single_dimension_pca.fit_transform(food_data.T)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[-144.99315218],\n",
" [-240.52914764],\n",
" [ -91.869339 ],\n",
" [ 477.39163882]])"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"single_dimension_food_data"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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v1+VlZUaO3asOnbsaJt8klRTU6Pp06drz549CgkJ0YIFC2RZlq0ySlJJSYmGDBmiP/7xj3I6nbbLN3jwYLlcLknS5ZdfrpEjR9bN/tNCnXjyySetFStWWJZlWQUFBdbgwYMty7KsW2+91SosLLS8Xq919913W9u3b7f+8Y9/WBkZGZZlWdZHH31kjRkzJljT/t4eeeQRq3///taECRN8y+yW8TQ7ZDjT8uXLrYEDB1rDhw+3LMuy7r33Xuu9996zLMuyZsyYYb399tvW9u3brVGjRller9fav3+/NWTIkGBO+Ttbu3atNXfuXMuyLNvr1ysAAARHSURBVKu0tNS69tprbZXPsizrnXfesaZOnWpZlmW999571pgxY2yXsbKy0vrNb35j3XDDDdZnn31mu3zl5eXWoEGDai2rq/0nR+Z1ZPTo0QoLC5N08i/o8PBwud1uVVZWKiEhQZKUkpKirVu3qqioSL1795YkdevWTdu3bw/avL+v5ORkXX/99Vq9erUk2TLjabm5ucZnOFNCQoL+8Ic/aMqUKZKkHTt2qFevXpKkPn36aPPmzWrXrp1SUlLkcDjUunVr1dTUqLS0VHFxccGc+gUNGDBA/fv39z0OCQmxVT5Juv766/WLX/xCknTgwAE1b95cGzZssFXGRYsWKTU1VcuXL5dkr99RSdq5c6dOnDihO++8U9XV1Ro/fnyd7T95zdwPa9as0cCBA2t97d27VxERESoqKtLkyZP1wAMPyO12KyYmxve86OholZWVfWt5SEiIqqurgxHlnM6WMT8/XzfddJMcDodvO5MzXogdMpypf//+cjq//vvdsizfz/JcP7fTyxu66OhoxcTEyO126/7779eECRNsle80p9OpjIwMPfLII+rfv7+tMr722muKi4vzlZhkr99RSYqIiNBdd92l559/XnPmzNGDDz6oyMhI3/qL2X9yZO6H4cOHa/jw4d9avmvXLj3wwAOaMmWKevXqJbfbLY/H41vv8XjUtGlTlZeX11ru9Xpr7WQbgnNl/KaYmBhjM17IN7OZmOF8mjT5+m/50z+3s/08T7++19B99dVXuu+++5Senq5bbrlFjz32mG+dHfKdtmjRIk2aNEkjRoxQRUWFb7npGV999VU5HA5t3bpVn3zyiTIyMlRaWupbb3o+SWrXrp3atm0rh8Ohdu3ayeVy6ciRI771F7P/5Mi8jnz22Wf67W9/q8zMTF177bWSTpZBaGio9u3bJ8uytGnTJvXs2VPJycnKycmRdPLiscTExGBO/aLYOaMdMpxPly5dtG3bNklSTk6O7+e2adMmeb1eHThwQF6v14jTl8XFxbrzzjs1efJkDRs2TJK98knSn//8Zz3zzDOSpMjISDkcDl111VW2ybhy5Uq99NJLysrKUufOnbVo0SL16dPHNvkkae3atVq4cKEk6eDBgzpx4oSioqLqZP9pn8OMIMvMzFRlZaXmzZsn6WTJLVu2THPmzNGkSZNUU1OjlJQUde3aVT/+8Y+1efNmpaamyrIszZ8/P8izvzh2zdivXz/jM5xPRkaGZsyYocWLF6t9+/bq37+/QkJC1LNnT40cOVJer1czZ84M9jS/k6efflrHjh3T0qVLtXTpUknSQw89pLlz59oinyTdcMMNevDBB3Xbbbepurpa06ZNU4cOHWzzMzwbO/2OStKwYcP04IMPKi0tTQ6HQ/Pnz1eTJk3qZP/JXdMAADAcp9kBADAcZQ4AgOEocwAADEeZAwBgOMocAADDUeYAABiOMgcAwHCUOQAAhvv/cpF4Gxnz4fEAAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 576x396 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# matplotlib doesn't have a built-in 1D scatter plot but we can\n",
"# just use a 2D scatter plot with y-axis values all set to 0\n",
"y_axis_all_zeros = np.zeros(len(single_dimension_food_data))\n",
"\n",
"plt.scatter(single_dimension_food_data, y_axis_all_zeros)\n",
"for idx in range(len(single_dimension_food_data)):\n",
" plt.annotate(column_labels[idx],\n",
" (single_dimension_food_data[idx],\n",
" y_axis_all_zeros[idx]), rotation=90)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([0.67444346])"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"single_dimension_pca.explained_variance_ratio_"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For any data point in the original 17-dimensional space, we can see what the PCA single-dimensional representation is using the `transform` function. For example, in the next cell, we compute the 1D projections for both England and Wales. However, we could actually plug in data that we didn't fit the PCA model with (for example, if we collected the 17 measurements for Pennsylvania, we could use it with transform as well, etc)."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[array([ 105, 245, 685, 147, 193, 156, 720, 253, 488, 198, 360,\n",
" 1102, 1472, 57, 1374, 375, 54]),\n",
" array([ 103, 227, 803, 160, 235, 175, 874, 265, 570, 203, 365,\n",
" 1137, 1582, 73, 1256, 475, 64])]"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"[food_data[:, 0], food_data[:, 1]]"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[-144.99315218],\n",
" [-240.52914764]])"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"single_dimension_pca.transform([food_data[:, 0], food_data[:, 1]])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here, we use transform to find the 1D PCA representation for a completely made-up feature vector of food/drink consumption values:"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[543.79528741]])"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"single_dimension_pca.transform([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Interpretation\n",
"\n",
"How do we interpret the low-dimensional representation? Why is North Ireland so far away from the other points? One way to try to answer this question is to first look at what features (i.e., what specific food/drink items) are being assigned high weight by PCA:"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[-0.05695538 0.04792763 -0.25891666 -0.08441498 -0.00519362 -0.03762098\n",
" 0.40140206 -0.15184994 -0.24359373 -0.02688623 -0.03648827 -0.6326409\n",
" -0.04770286 -0.02618776 0.23224414 -0.46396817 -0.0296502 ]\n"
]
}
],
"source": [
"print(single_dimension_pca.components_[0]) # index 0 is for the 1st principal component (since Python starts counting at 0)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Importantly, how PCA (that has already been fitted) actually projects a data point to 1D is to take a weighted combination using the above weights (although it first subtracts off the feature means). Specifically, here are the calculations for England and Wales:"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([ 105, 245, 685, 147, 193, 156, 720, 253, 488, 198, 360,\n",
" 1102, 1472, 57, 1374, 375, 54])"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"food_data[:, 0]"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([ 94.25, 245.25, 706. , 130.5 , 205.25, 154.25, 798.25,\n",
" 208. , 457.75, 202. , 349. , 967.5 , 1502.5 , 57.5 ,\n",
" 1427. , 360.75, 55.25])"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"single_dimension_pca.mean_"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"-144.99315218207676"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.inner(single_dimension_pca.components_[0],\n",
" food_data[:, 0] - single_dimension_pca.mean_)"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"-240.52914763517674"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.inner(single_dimension_pca.components_[0],\n",
" food_data[:, 1] - single_dimension_pca.mean_)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Weights with larger absolute value correspond to features that lead to the largest spread along the projected 1D axis."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here's some code to rank the weights by largest absolute value to smallest absolute value:"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Fresh fruit : -0.6326408978722377\n",
"Alcoholic drinks : -0.4639681679767064\n",
"Fresh potatoes : 0.40140206029624803\n",
"Other meat : -0.25891665833612115\n",
"Other Veg : -0.24359372899027434\n",
"Soft drinks : 0.2322441404728946\n",
"Fresh Veg : -0.1518499415623022\n",
"Fish : -0.08441498252508357\n",
"Cheese : -0.05695537978568525\n",
"Carcass meat : 0.04792762813468533\n",
"Cereals : -0.047702858373648994\n",
"Sugars : -0.03762098283940196\n",
"Processed Veg : -0.03648826911159385\n",
"Confectionary : -0.029650201087993877\n",
"Processed potatoes : -0.026886232536746935\n",
"Beverages : -0.026187755908533467\n",
"Fats and oils : -0.005193622660047771\n"
]
}
],
"source": [
"abs_val_of_1st_principal_component_weights = np.abs(single_dimension_pca.components_[0])\n",
"\n",
"# in the previous lecture we saw the `sorted` function; now we introduce numpy's `argsort`,\n",
"# which does *not* return the sorted list but instead returns the rearranged indices that\n",
"# would sort the list (put another way, it returns rankings)\n",
"ranking_of_largest_to_smallest = np.argsort(-abs_val_of_1st_principal_component_weights) # use negative to get largest to smallest\n",
"\n",
"# now print out the food items having highest to lowest absolute value weight\n",
"for rank in ranking_of_largest_to_smallest:\n",
" print(row_labels[rank], ':', single_dimension_pca.components_[0][rank])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"At this point, we leave the following as an exercise to you: for a few of the food/drink items with the highest absolute value weight, compare the values between the different regions of the UK. Can you see why North Ireland is considered very different from the other regions?"
]
}
],
"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.7.6"
}
},
"nbformat": 4,
"nbformat_minor": 1
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment