Skip to content

Instantly share code, notes, and snippets.

@georgehc
Created November 9, 2020 16:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save georgehc/7ac68b716a0a27cf14f942ff09bddafa to your computer and use it in GitHub Desktop.
Save georgehc/7ac68b716a0a27cf14f942ff09bddafa to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 94-775/95-865: Recitation 2\n",
"Author: Erick Rodriguez (erickger [at symbol] cmu.edu)\n",
"\n",
"This demo is 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": "markdown",
"metadata": {},
"source": [
"#### Creating the dataset"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib inline\n",
"import matplotlib.pyplot as plt\n",
"plt.style.use('seaborn') # prettier plots\n",
"import numpy as np\n",
"import pandas as pd\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": "markdown",
"metadata": {},
"source": [
"#### Looking at the table with a dataframe"
]
},
{
"cell_type": "code",
"execution_count": 34,
"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": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"food_df = pd.DataFrame(food_data, columns=column_labels, index=row_labels)\n",
"food_df.head(20)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Running PCA"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAfoAAAFKCAYAAAD13508AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3deXwU9eH/8ddmNxckQI5NCKeBcMmNQY5wKQQQLCoSQaBqFdQv2NoWqgFtoT8RAZWqgCIClSIKBBAtWvCAUJUAchiOcAUUwpkNJIQchBzz+8OyNYqAIWHJp+/nX8xMZufz3uWx753Z2RmbZVkWIiIiYiQvTw9AREREKo6KXkRExGAqehEREYOp6EVERAymohcRETGYil5ERMRgDk8P4EpcrnOeHsJVCwqqQmZmnqeHUWFMzwfmZzQ9HyijCUzPB5fP6HQGluu2tEdfjhwOu6eHUKFMzwfmZzQ9HyijCUzPB9c3o4peRETEYCp6ERERg6noRUREDKaiFxERMZiKXkRExGAqehEREYOp6EVERAymohcRETGYil5ERMRgKnoRERGDqehFREQMpqIXERExmIpeRETEYCp6ERERg6noRUREDKaiFxERMZiKXkRExGAqehEREYOp6EVERAymohcRETGYil5ERMRgKnoRERGDqehFREQMpqIXERExmIpeRETEYCp6ERERg6noRUREDKaiFxERMZiKXkRExGAqehEREYOp6EVERAymohcRETGYil5ERMRgKnoRERGDqehFREQMVuainzx5MoMHD2bIkCHs2LGj1LINGzYwaNAgBg8ezKxZs0otO3/+PD179mTFihVl3bSIiIhcpTIV/ebNmzl8+DBLlixh0qRJPPfcc6WWT5o0iRkzZvDee+/xxRdfkJqa6l72xhtvUKNGjWsbtYiIiFyVMhV9UlISvXr1AiAqKors7GxycnIASEtLo3r16kRERODl5UX37t1JSkoC4ODBg6SmptKjR4/yGb2IiIhcVpmKPiMjg6CgIPd0SEgILpcLAJfLRXBwsHtZaGioe9nUqVOJj4+/lvGKiIjIL+Aoy0qWZf1k2mazXXIZgM1mY+XKlbRp04a6dev+om0FBVXB4bCXZZge4XQGenoIFcr0fGB+RtPzgTKawPR8cP0ylqnow8PDycjIcE+np6cTGhp6yWWnTp3C6XSSmJhIWloaiYmJnDx5Eh8fH2rWrEnnzp0vu63MzLyyDNEjnM5AXK5znh5GhTE9H5if0fR8oIwmMD0fXD5jeX8AKFPRx8TEMGPGDIYMGUJKSgphYWEEBAQAUKdOHXJycjh69Cg1a9Zk3bp1vPTSSwwfPty9/owZM6hdu/YVS15ERESuTZmKvl27djRv3pwhQ4Zgs9mYMGECK1asIDAwkNjYWCZOnMiYMWMA6NevH5GRkeU6aBEREbk6NutSX6rfQCrT4RvTDzeZng/Mz2h6PlBGE5ieD67voXtdGU9ERMRgKnoRERGDqehFREQMpqIXERExmIpeRETEYCp6ERERg6noRUREDKaiFxERMZiKXkRExGAqehEREYOp6EVERAymohcRETGYil5ERMRgKnoRERGDqehFREQMpqIXERExmIpeRETEYCp6ERERg6noRUREDKaiFxERMZiKXkRExGAqehEREYOp6EVERAymohcRETGYil5ERMRgKnoRERGDqehFREQMpqIXERExmIpeRETEYCp6ERERg6noRUREDKaiFxERMZiKXkRExGAqehEREYOp6EVERAymohcRETGYil5ERMRgKnoRERGDqehFREQMpqIXERExmIpeRETEYCp6ERERg6noRUREDKaiFxERMZiKXkRExGCOsq44efJkkpOTsdlsjB8/nlatWrmXbdiwgenTp2O32+nWrRujR48GYNq0aWzdupWioiIee+wxevfufe0JRERE5GeVqeg3b97M4cOHWbJkCampqYwbN46EhAT38kmTJjFv3jzCw8MZOnQoffr0ISMjgwMHDrBkyRIyMzO55557VPQiIiIVrExFn5SURK9evQCIiooiOzubnJwcAgICSEtLo3r16kRERADQvXt3kpKSGDp0qHuvv3r16uTn51NcXIzdbi+nKCIiIvJjZfqOPiMjg6CgIPd0SEgILpcLAJfLRXBwsHtZaGgoLpcLu91OlSpVAEhISKBbt24qeRERkQpWpj16y7J+Mm2z2S65DHAvA/jss89YtmwZ8+fPv6ptBQVVweGoPB8InM5ATw+hQpmeD8zPaHo+UEYTmJ4Prl/GMhV9eHg4GRkZ7un09HRCQ0MvuezUqVM4nU4AvvjiC2bPns3cuXMJDLy6gJmZeWUZokc4nYG4XOc8PYwKY3o+MD+j6flAGU1gej64fMby/gBQpkP3MTExrFmzBoCUlBTCwsIICAgAoE6dOuTk5HD06FGKiopYt24dMTExnDt3jmnTpvHmm29So0aN8ksgIiIiP6tMe/Tt2rWjefPmDBkyBJvNxoQJE1ixYgWBgYHExsYyceJExowZA0C/fv2IjIx0n23/+9//3v04U6dOpVatWuWTRERERH7CZl3qS/UbSGU6fGP64SbT84H5GU3PB8poAtPzQSU4dC8iIiKVg4peRETEYCp6ERERg6noRUREDKaiFxERMZiKXkRExGAqehEREYOp6EVERAymohcRETGYil5ERMRgKnoRERGDqehFREQMpqIXERExmIpeRETEYCp6ERERg6noRUREDKaiFxERMZiKXkRExGAqehEREYOp6EVERAymohcRETGYil5ERMRgKnoRERGDqehFREQMpqIXERExmIpeRETEYCp6ERERg6noRUREDKaiFxERMZiKXkRExGAqehEREYOp6EVERAymohcRETGYil5ERMRgKnoRERGDqehFREQMpqIXERExmIpeRETEYCp6ERERg6noRUREDKaiFxERMZiKXkRExGAqehEREYOp6EVERAymohcRETHY/1TRFxQWk56ZR0FhsaeHUq48lcvU51NE5GpVhvdBR1lXnDx5MsnJydhsNsaPH0+rVq3cyzZs2MD06dOx2+1069aN0aNHX3GdilRcUsKStals3+/iTHYBwdV8advYyeDbo7B7Vd7POp7KZerzKSJytSrT+2CZin7z5s0cPnyYJUuWkJqayrhx40hISHAvnzRpEvPmzSM8PJyhQ4fSp08fzpw5c9l1KtKStal8tuWoe/p0doF7emivxtdlDBXBU7lMfT5FRK5WZXofLNPHjqSkJHr16gVAVFQU2dnZ5OTkAJCWlkb16tWJiIjAy8uL7t27k5SUdNl1KlJBYTHb97suuWz7/owb+nDL5Xgql6nPp4jI1aps74Nl2qPPyMigefPm7umQkBBcLhcBAQG4XC6Cg4Pdy0JDQ0lLSyMzM/Nn17mcoKAqOBz2sgwTgBMZuZw5V3DJZZnnzmP38cYZWrXMj/9jTmdguT3W5VzvXBfZfbw9st3r6Xq9hp5iej5QRhPcyPnK6/33emUsU9FblvWTaZvNdsllADab7bLrXE5mZl5ZhuhWXFhMcKAvp7N/+qIEBfpRfKEQl+vcNW3jIqczsNwe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72+h+Omna6hRowZ5ebkUFxcTE9Od1q3bEBrqZOHC+fzf//2u1PrXKiamKx07diY7OxuHw8HWrV9z8uQJbrutFzt3JtOv3wD8/Pyw2bw4ceIE/fr96pq3KSJyI/Lz8+Phhx+luDiXt99+m759+wLw97//nYiICKKjo+nZsydLliyhbt26TJs2jT179nD77bcTGRn5s4+rov+RPn364XA4mDHjb8TEdKVHj54UFxfRtWt39u5NYeXK5XTvfhu+vv+9fGtlPEnshxfcCQkJxbIs8vPzKSy8QGioEz8/f7Kystwnfnz11RfUq1ePHj16llq/PNjtdoKCgigqKuLcuWxuuaU9vr6+HD78HY89NhqAZcsW88ADv6mwQ/YiIjeKmjVrEh8fD8CFCxeYOnUqa9asYerUqfTv35+6deuSnp5OVlYWtWrVomvXrpd9vBv/x+Ee0LNnb2bNeothwx4kKCiYv/99LufP5zNixON89NEHnD59+j/fLVMpS/6HLha2zWbD39+fBx54mD59+uHv78/27VtxOLzZvn0rK1cu449//CNAhd15zuFwMGjQEPr27Y/LlU5+fh7FxcUsWrSA7Oxs7r773grZrojIjejinT7/+te/Ur9+fbKzsxkxYgQAW7ZsoXr16nTs2JGAgIDLPo726H/GxQK3271wOp08++zT9O3bHx8fXyIizNyrvHg43m63Ex19Kzt2fMM//jGfzz//hA4dOtGqVSvS07Ovy8WD+vbtT15eHlOmPMfnn3/K+PF/cX+4EhH5X+Dl5YWfnx+DBw8GoFatWowfP56+ffvy8ccf061bNzp06HDFx1HRX4Gvrx+jRj3JN99sY9u2LYwc+X9UrRpQaQ/ZX87FArcsC29vbx57bDSZmZlkZLgYMeLx6z6egQPjyM+/ky5duhMTc/lDUyIiphs7dizr169n8+bN1KhRg65du17VjpfNusHvEepynfP0EK6a0xlYqcZ7OZf6IBMSUpXTp6/t1rY3OpNew0sxPR8oowlMzweXz+h0Bl5x/ZSUFG6++ear2pa+o5dLuljyP/w+vjJc719E5H/B1ZY8qOjlClTuIiKVm97FRUREDKaiFxERMZiKXkRExGAqehEREYOp6EVERAymohcRETGYil5ERMRgKnoRERGDqehFREQMpqIXERExmIpeRETEYCp6ERERg6noRUREDKaiFxERMZiKXkRExGAqehEREYOp6EVERAymohcRETGYoywrFRYWEh8fz/Hjx7Hb7bzwwgvUrVu31N98+OGHLFiwAC8vLwYPHsygQYMoKirimWeeIS0tjaKiIp566imio6PLJYiIiIj8VJn26FetWkW1atV47733GDlyJC+//HKp5Xl5ecyaNYu3336bhQsXMnfuXLKysvjggw/w9/fn3Xff5fnnn2fKlCnlEkJEREQurUxFn5SURGxsLABdunRh69atpZYnJyfTsmVLAgMD8fPzIzo6mm3btjFgwADGjRsHQHBwMFlZWdc4fBEREbmcMh26z1sRje8AAAyZSURBVMjIIDg4GAC73Y6XlxcXLlzAx8fnJ8sBQkNDcblceHt7u+ctWLCAO++881rGLiIiIldwxaJPSEggISGh1Lzk5ORS05ZlYbPZSk1fbvmiRYvYvXs3s2fPvuIAg4Kq4HDYr/h3NwqnM9DTQ6hQpucD8zOang+U0QSm54Prl/GKRR8XF0dcXFypefHx8bhcLpo2bUphYSGWZZXaWw8PDycxMdE9nZ6eTps2bYDvPzisXbuW119/vdQ6PyczM+9qs3ic0xmIy3XO08OoMKbnA/Mzmp4PlNEEpueDy2cs7w8AZfqOPiYmhtWrVwOwbt06OnToUGp569at2blzJ9nZ2eTm5rJt2zaio6NJS0tj8eLFzJw5E19f32sfvYiIiFxWmb6j79evHxs2bOD+++/Hx8fHffb8nDlzaN++PW3btmXMmDE88sgj2Gw2Ro8eTWBgIG+99RZZWVk8+uij7seaN2+e+7t9ERERKV8268dfqN9gKtPhG9MPN5meD8zPaHo+UEYTmJ4PKsGhexEREakcVPQiIiIGU9GLiIgYTEUvIiJiMBW9iIiIwVT0IiIiBlPRi4iIGExFLyIiYjAVvYiIiMFU9CIiIgZT0YuIiBhMRS8iImIwFb2IiIjBVPQiIiIGU9GLiIgYTEUvIiJiMBW9iIiIwVT0IiIiBlPRi4iIGExFLyIiYjAVvYiIiMFU9CIiIgZT0YuIiBhMRS8iImIwFb2IiIjBVPQiIiIGU9GLiIgYTEUvIiJiMBW9iIiIwVT0IiIiBlPRi4iIGExFLyIiYjAVvYiIiMFU9CIiIgZT0YuIiBhMRS8iImIwFb2IiIjBVPQiIiIGU9GLiIgYTEUvIiJiMBW9iIiIwVT0IiIiBlPRi4iIGExFLyIiYjAVvYiIiMHKVPSFhYWMGTOG+++/n+HDh5OWlvaTv/nwww+59957iYuLY9myZaWWZWRk0L59ezZt2lS2UYuIiMhVKVPRr1q1imrVqvHee+8xcuRIXn755VLL8/LymDVrFm+//TYLFy5k7ty5ZGVluZdPmzaNunXrXtvIRURE5IrKVPRJSUnExsYC0KVLF7Zu3VpqeXJyMi1btiQwMBA/Pz+io6PZtm2be92qVavSuHHjaxy6iIiIXEmZij4jI4Pg4GAA7HY7Xl5eXLhw4ZLLAUJDQ3G5XFy4cIFZs2bxhz/84RqHLSIiIlfDcaU/SEhIICEhodS85OTkUtOWZWGz2UpNX2r5nDlziIuLo1q1alc9wKCgKjgc9qv+e09zOgM9PYQKZXo+MD+j6flAGU1gej64fhmvWPRxcXHExcWVmhcfH4/L5aJp06YUFhZiWRbe3t7u5eHh4SQmJrqn09PTadOmDStWrKCkpIRFixZx5MgRduzYwauvvkqjRo1+dvuZmXlliOUZTmcgLtc5Tw+jwpieD8zPaHo+UEYTmJ4PLp+xvD8AlOnQfUxMDKtXrwZg3bp1dOjQodTy1q1bs3PnTrKzs8nNzWXbtm1ER0ezePFili5dytKlS+nRowcTJky4bMmLiIjItbniHv2l9OvXjw0bNnD//ffj4+PDlClTAJgzZw7t27enbdu2jBkzhkceeQSbzcbo0aMJDDT/MIyIiMiNxmb9+Av1G0xlOnxj+uEm0/OB+RlNzwfKaALT80ElOHQvIiIilYOKXkRExGAqehEREYOp6EVERAymohcRETGYil5ERMRgKnoRERGDqehFREQMpqIXERExmIpeRETEYCp6ERERg6noRUREDKaiFxERMZiKXkRExGAqehEREYOp6EVERAymohcRETGYil5ERMRgKnoRERGDqehFREQMpqIXERExmIpeRETEYCp6ERERg6noRUREDKaiFxERMZiKXkRExGAqehEREYOp6EVERAymohcRETGYil5ERMRgKnoRERGDqehFREQMpqIXERExmIpeRETEYCp6ERERg6noRUREDGazLMvy9CBERESkYmiPXkRExGAqehEREYOp6EVERAymohcRETGYil5ERMRgKnoRERGDOTw9gMqoqKiIZ555hrS0NIqKinjqqaeIjo5m7969TJw4EYAm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\n",
"text/plain": [
"<Figure size 576x396 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from sklearn.decomposition import PCA\n",
"\n",
"# instantiate PCA class\n",
"single_dimension_pca = PCA(n_components=1)\n",
"# use our pca to fit and transform the whole dataset\n",
"single_dimension_food_data = single_dimension_pca.fit_transform(food_data.T)\n",
"\n",
"# 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",
"plt.scatter(single_dimension_food_data, y_axis_all_zeros)\n",
"\n",
"for idx in range(len(single_dimension_food_data)):\n",
" plt.annotate(column_labels[idx], (single_dimension_food_data[idx] - 15, y_axis_all_zeros[idx]-0.011), rotation=-30)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Explaining the results"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For this we can plot the data"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 576x576 with 4 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, figsize=(8,8))\n",
"\n",
"ax1.bar(range(len(row_labels)), food_data[:, 0])\n",
"ax1.set_title(column_labels[0])\n",
"ax1.set_xticks(range(len(row_labels)))\n",
"ax1.set_xticklabels(row_labels, rotation=90)\n",
"\n",
"ax2.bar(range(len(row_labels)), food_data[:, 1])\n",
"ax2.set_title(column_labels[1])\n",
"ax2.set_xticks(range(len(row_labels)))\n",
"ax2.set_xticklabels(row_labels, rotation=90)\n",
"\n",
"ax3.bar(range(len(row_labels)), food_data[:, 2])\n",
"ax3.set_title(column_labels[2])\n",
"ax3.set_xticks(range(len(row_labels)))\n",
"ax3.set_xticklabels(row_labels, rotation=90)\n",
"\n",
"ax4.bar(range(len(row_labels)), food_data[:, 3])\n",
"ax4.set_title(column_labels[3])\n",
"ax4.set_xticks(range(len(row_labels)))\n",
"ax4.set_xticklabels(row_labels, rotation=90)\n",
"\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Some reasons?\n",
"\n",
"- Northern Ireland eat way more grams of fresh potatoes and way fewer of fresh fruits, cheese, fish and alcoholic drinks\n",
"- It turns out that Northern Ireland is the only of the four countries not on the island of Great Britain"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Using PCA with 2 components instead of two"
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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QAVRsIBKcvEzWJfz9/dXSEiIDhw4oFatWrm2Z2VlKTU1Vc2aNVNCQoJSUlL029/+VpKUn5+vlStXUrAAAAA8HKcIAm7w5z//WW+88YbOnTsnScrLy9Orr76qdevW6fvvv9eRI0e0bt06rV69WqtXr1ZCQoI2bNignJwcNycHAADA1fAOFuAGMTEx8vPz0+9//3sFBQXJMAw98MAD+uMf/6hJkyapT58+qlGjhuv6DRs2VGRkpNavX6/evXtLkn788Ue9/PLLyszM1IkTJzR48GB1795djz/+uLseFgAAQLVnM37pwyAAAAAAgGvCKYIAAAAAYBIKFgAAAACYhIIFAAAAACahYAEAAACASShYAAAAAGASChYAAAAAmISCBQAAAAAmoWABAAAAgEkoWAAAAABgEgoWAAAAAJiEggUAAAAAJvFzdwAzOZ1Z7o7gUq9ekNLTc9wdo1zIbA1vzCx5Z24yW6OszA5HsBvSAADgXryDVUn8/HzdHaHcyGwNb8wseWduMlvDGzMDAFBZKFgAAAAAYBIKFgAAAACYhIIFAAAAACahYAEAAACASShYAAAAAGASChYAAAAAmISCBQAAAAAmoWABAAAAgEkoWAAAAABgEgoWAAAAAJiEggUAAAAAJqFgAQAAAIBJKFgAAAAAYBIKFgAAAACYhIIFAAAAACahYAEAAACASShYAAAAAGASChYAAAAAmISCBQAAAAAmoWABAAAAgEkoWAAAAABgEgoWAAAAAJiEggUAAAAAJqFgAQAAAIBJKFgAAAAAYBIKFgAAAACYhIIFAAAAACahYAEAAACASSwrWG+//bb69++v2NhY7dmzp8S+r776Sv369VP//v01a9asEvvy8vIUHR2tlStXWhUVAAAAACrEkoK1bds2HT16VHFxcZowYYLefPPNEvsnTJigGTNm6MMPP9QXX3yh5ORk177Zs2erbt26VsQEAAAAgOtiScFKSkpSjx49JEkRERHKzMxUdna2JOn48eOqU6eOGjZsKB8fH3Xv3l1JSUmSpO+//17Jycm65557rIgJAAAAANfFz4pfkpaWptatW7su169fX06nU7Vq1ZLT6VRISIhrX2hoqI4fPy5JmjRpkl577TWtWrXqmn5PvXpB8vPzNTf8dXA4gt0dodzIbA1vzCx5Z24yW8MbMwMAUBksKViGYVxx2WazlbpPkmw2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\n",
"text/plain": [
"<Figure size 864x576 with 3 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# similarly we define a PCA with two components\n",
"two_dimension_pca = PCA(n_components=2)\n",
"two_dimension_food_data = two_dimension_pca.fit_transform(food_data.T)\n",
"\n",
"# Notice that this is another way of plotting subplots\n",
"# ----------------------------------------------------\n",
"plt.figure(figsize=(12,8))\n",
"\n",
"plt.subplot(2,2,1) #upper left figure\n",
"plt.scatter(two_dimension_food_data[:,0], two_dimension_food_data[:,1])\n",
"for idx in range(len(two_dimension_food_data)):\n",
" plt.annotate(column_labels[idx], (two_dimension_food_data[:,0][idx], two_dimension_food_data[:,1][idx]), rotation=0)\n",
"plt.xlabel(\"PCA 1\")\n",
"plt.ylabel(\"PCA 2\")\n",
"\n",
"# note this is the first PC, and it is completely the same with the one with only one PC.\n",
"plt.subplot(2,2,3) #lower left figure\n",
"plt.scatter(two_dimension_food_data[:,0], y_axis_all_zeros)\n",
"for idx in range(len(two_dimension_food_data)):\n",
" plt.annotate(column_labels[idx], (two_dimension_food_data[:,0][idx], y_axis_all_zeros[idx]), rotation=90)\n",
"plt.xlabel(\"PCA 1\")\n",
"\n",
"plt.subplot(2,2,2) #upper right figure\n",
"plt.scatter(y_axis_all_zeros, two_dimension_food_data[:,1])\n",
"for idx in range(len(two_dimension_food_data)):\n",
" plt.annotate(column_labels[idx], (y_axis_all_zeros[idx], two_dimension_food_data[:,1][idx]), rotation=0)\n",
"plt.ylabel(\"PCA 2\")\n",
"\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### PCA Results"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Data points for decomposition into 1 dimension:\n",
"\n",
"[[-144.99315218]\n",
" [-240.52914764]\n",
" [ -91.869339 ]\n",
" [ 477.39163882]]\n",
"\n",
"\n",
"Data points for decomposition into 2 dimensions:\n",
"\n",
"[[-144.99315218 -2.53299944]\n",
" [-240.52914764 -224.64692488]\n",
" [ -91.869339 286.08178613]\n",
" [ 477.39163882 -58.90186182]]\n"
]
}
],
"source": [
"print('Data points for decomposition into 1 dimension:\\n')\n",
"print(single_dimension_food_data)\n",
"print('\\n\\nData points for decomposition into 2 dimensions:\\n')\n",
"print(two_dimension_food_data)"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The explained ratio for decomposition into 1 dimension is 0.6744434639658381\n",
"\n",
"The explained ratio for decomposition into 2 dimensions is 0.6744434639658381 and 0.29052474576876536\n"
]
}
],
"source": [
"print('The explained ratio for decomposition into 1 dimension is', single_dimension_pca.explained_variance_ratio_[0])\n",
"print('\\nThe explained ratio for decomposition into 2 dimensions is', two_dimension_pca.explained_variance_ratio_[0], \n",
" 'and', two_dimension_pca.explained_variance_ratio_[1])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Differences among fit, transform, and fit_transform"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"When we fit the data before by doing `single_dimension_pca.fit_transform(food_data.T)` we actually runned two methods `fit()` and `transform()`. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Usually this is really helpfull when we create machine learning models because we can fit the model and then inject new data to be \"transformed\" or predicted. That is `fit()` fits the model to the data we sent as a parameter."
]
},
{
"cell_type": "code",
"execution_count": 47,
"metadata": {},
"outputs": [],
"source": [
"one_dim_pca = PCA(n_components=1)\n",
"one_dim_pca_fitted_model = single_dimension_pca.fit(food_data.T)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can look at results by using our original data"
]
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[-144.99315218]\n",
" [-240.52914764]\n",
" [ -91.869339 ]\n",
" [ 477.39163882]]\n"
]
}
],
"source": [
"one_dim_pca_results = one_dim_pca_fitted_model.transform(food_data.T)\n",
"print(one_dim_pca_results)"
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[-144.99315218],\n",
" [-240.52914764]])"
]
},
"execution_count": 49,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"one_dim_pca_fitted_model.transform([food_data[:, 0], food_data[:, 1]])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"However, we could actually plug in new data that we didn't fit within the PCA model (for example, if we collected the 17 measurements for Adelaide, we could use it with transform as well, etc)."
]
},
{
"cell_type": "code",
"execution_count": 50,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 988.7778723 127.25386502 383.61871694 215.68171475 312.97931132\n",
" 1078.52755231 1360.1017595 751.51907256 664.38757406 265.34368123\n",
" 1145.75372296 1281.77430384 426.36468158 439.01033511 1498.55667725\n",
" 930.49749995 132.4467529 ]\n"
]
}
],
"source": [
"# Let's imagine this is the data for Adelaide\n",
"adelaide_data = np.random.uniform(low=100, high=1500, size=(17,))\n",
"print(adelaide_data)"
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The results for using our moodel with Adelaide's dataset is: -361.26558393738446\n"
]
}
],
"source": [
"# Now let's see what are the results on this\n",
"print(\"The results for using our moodel with Adelaide's dataset is: \", \n",
" one_dim_pca_fitted_model.transform([adelaide_data])[0][0])"
]
},
{
"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": 90,
"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_) # index 0 is for the 1st principal component"
]
},
{
"cell_type": "code",
"execution_count": 12,
"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",
"[ 0.01601285 0.01391582 -0.01533114 -0.05075495 -0.09538866 -0.0430217\n",
" -0.71501708 -0.14490027 -0.22545092 0.04285076 -0.0454518 -0.17774074\n",
" -0.21259968 -0.03056054 0.55512431 0.11353652 0.00594992]\n"
]
}
],
"source": [
"print(two_dimension_pca.components_[0])\n",
"print(two_dimension_pca.components_[1])"
]
},
{
"cell_type": "code",
"execution_count": 65,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['Fresh fruit' 'Alcoholic drinks' 'Fresh potatoes' 'Other meat'\n",
" 'Other Veg' 'Soft drinks' 'Fresh Veg' 'Fish' 'Cheese' 'Carcass meat'\n",
" 'Cereals' 'Sugars' 'Processed Veg' 'Confectionary' 'Processed potatoes'\n",
" 'Beverages' 'Fats and oils']\n"
]
}
],
"source": [
"importance_idx = np.argsort(-abs(two_dimension_pca.components_[0]))\n",
"# print row_labels in descending importance order\n",
"print(np.asarray(row_labels)[importance_idx])\n",
"# if interested, you could refer to the bar chart to verify"
]
},
{
"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": 66,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Single dimension PCA means:\n",
" [ 94.25 245.25 706. 130.5 205.25 154.25 798.25 208. 457.75\n",
" 202. 349. 967.5 1502.5 57.5 1427. 360.75 55.25]\n",
"\n",
"Two dimensions PCA means:\n",
" [ 94.25 245.25 706. 130.5 205.25 154.25 798.25 208. 457.75\n",
" 202. 349. 967.5 1502.5 57.5 1427. 360.75 55.25]\n"
]
}
],
"source": [
"print('Single dimension PCA means:\\n', single_dimension_pca.mean_)\n",
"print('\\nTwo dimensions PCA means:\\n', two_dimension_pca.mean_)"
]
},
{
"cell_type": "code",
"execution_count": 67,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"-144.99315218207676"
]
},
"execution_count": 67,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.inner(single_dimension_pca.components_[0], food_data[:, 0] - single_dimension_pca.mean_)"
]
},
{
"cell_type": "code",
"execution_count": 68,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"-240.52914763517666"
]
},
"execution_count": 68,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.inner(single_dimension_pca.components_[0],\n",
" food_data[:, 1] - single_dimension_pca.mean_)"
]
},
{
"cell_type": "code",
"execution_count": 69,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"-2.532999437040636"
]
},
"execution_count": 69,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.inner(two_dimension_pca.components_[1],\n",
" food_data[:, 0] - two_dimension_pca.mean_)"
]
},
{
"cell_type": "code",
"execution_count": 70,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"-224.646924881269"
]
},
"execution_count": 70,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.inner(two_dimension_pca.components_[1],\n",
" food_data[:, 1] - two_dimension_pca.mean_)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Argsort"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In the previous lecture we saw the `sorted` function; now we introduce numpy's `argsort`, which does *not* return the sorted list but instead returns the rearranged indices that would sort the list (put another way, it returns rankings)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Going back to our previous exmaple with the food data, in PCA, weights with larger absolute value correspond to features that lead to the largest spread along the projected 1D axis. Here's some code to rank the weights by largest absolute value to smallest absolute value:"
]
},
{
"cell_type": "code",
"execution_count": 71,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Index Food Absolute Value\n",
"----- -------------------- ----------------------\n",
"11 Fresh fruit -0.6326408978722377 \n",
"15 Alcoholic drinks -0.4639681679767063 \n",
"6 Fresh potatoes 0.40140206029624825 \n",
"2 Other meat -0.25891665833612104 \n",
"8 Other Veg -0.2435937289902743 \n",
"14 Soft drinks 0.2322441404728945 \n",
"7 Fresh Veg -0.15184994156230225 \n",
"3 Fish -0.08441498252508359 \n",
"0 Cheese -0.05695537978568534 \n",
"1 Carcass meat 0.04792762813468509 \n",
"12 Cereals -0.04770285837364884 \n",
"5 Sugars -0.03762098283940194 \n",
"10 Processed Veg -0.03648826911159385 \n",
"16 Confectionary -0.029650201087993867 \n",
"9 Processed potatoes -0.026886232536746928 \n",
"13 Beverages -0.026187755908533446 \n",
"4 Fats and oils -0.0051936226600476955\n"
]
}
],
"source": [
"abs_1PC_weights = np.abs(single_dimension_pca.components_[0])\n",
"\n",
"ranking_abs_1PC_weights = np.argsort(-abs_1PC_weights) # use negative to get largest to smallest\n",
"\n",
"# Printing out the food items from highest to lowest absolute value weight\n",
"print(\"{0:5} {1:20} {2:10}\".format('Index', 'Food', 'Absolute Value'))\n",
"print(\"{0:5} {1:20} {2:22}\".format('-----', '--------------------', '----------------------'))\n",
"for index in ranking_abs_1PC_weights:\n",
" print(\"{0:5} {1:20} {2:22}\".format(str(index), row_labels[index], str(single_dimension_pca.components_[0][index])))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Using argsort with our example"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[-144.99315218],\n",
" [-240.52914764],\n",
" [ -91.869339 ],\n",
" [ 477.39163882]])"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"single_dimension_food_data"
]
},
{
"cell_type": "code",
"execution_count": 116,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"N Ireland : 477.3916388161171\n",
"Scotland : -91.86933899886354\n",
"England : -144.9931521820767\n",
"Wales : -240.52914763517674\n"
]
}
],
"source": [
"ranking_of_region_from_large_to_small_1st_component = \\\n",
"np.argsort(-(single_dimension_food_data[:,0] - np.average(single_dimension_food_data[:,0])))\n",
"\n",
"for index in ranking_of_region_from_large_to_small_1st_component:\n",
" print(column_labels[index], \":\", single_dimension_food_data[index,0])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Using argsort with a dictionary"
]
},
{
"cell_type": "code",
"execution_count": 86,
"metadata": {},
"outputs": [],
"source": [
"from collections import Counter\n",
"dict_fruits = {\"apple\":10, \"pear\":7, \"banana\":11, \"grape\":20, \"orange\":12}\n",
"stock = Counter(dict_fruits)"
]
},
{
"cell_type": "code",
"execution_count": 87,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[('grape', 20), ('orange', 12), ('banana', 11), ('apple', 10), ('pear', 7)]"
]
},
"execution_count": 87,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sorted(stock.items(), reverse=True, key = lambda x:x[1])"
]
},
{
"cell_type": "code",
"execution_count": 88,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([-1, -2])"
]
},
"execution_count": 88,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.dot(-1, [1,2])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Task:** Try to return a list in descending order based on the stock with argsort.\n",
"\n",
"Useful methods:\n",
"- Counter.keys()\n",
"- Counter.values()"
]
},
{
"cell_type": "code",
"execution_count": 91,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array(['grape', 'orange', 'banana', 'apple', 'pear'], dtype='<U6')"
]
},
"execution_count": 91,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sorted_index = np.argsort(np.dot(-1, list(stock.values())))\n",
"\n",
"# another way to do it in desecending order\n",
"# sorted_index = np.argsort(list(stock.values()))[::-1]\n",
"\n",
"sorted_stock_keys = np.array(list(stock.keys()))\n",
"sorted_stock_keys[sorted_index]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Using argsort with matrices"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Suppose we have a list of fruits with their respective prices. These prices correspond to 4 states in the Australia.\n",
"\n",
"**Tasks:** \n",
"- Give a list of the fruits from the most expensive to the cheapest. This thinking that each row correspond to one state.\n",
"- Now, do the same, but now think that the states are actually the columns of the matrix."
]
},
{
"cell_type": "code",
"execution_count": 98,
"metadata": {},
"outputs": [],
"source": [
"fruits = np.array([['apple', 'banana', 'kiwi', 'passionfruit'], \n",
" ['mango', 'orange', 'mandarin', 'citrus'], \n",
" ['watermelon', 'rockmelon', 'papaya', 'grape'], \n",
" ['plum', 'peach', 'apricot', 'lychee']])\n",
"\n",
"fruit_prices = np.array([[5,3,12,1],\n",
" [12,5,3,9],\n",
" [2,6,1,19],\n",
" [1,5,4,14]])"
]
},
{
"cell_type": "code",
"execution_count": 99,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[3 0 2 0]\n",
" [2 1 1 1]\n",
" [0 3 3 3]\n",
" [1 2 0 2]]\n",
"\n",
"[[3 1 0 2]\n",
" [2 1 3 0]\n",
" [2 0 1 3]\n",
" [0 2 1 3]]\n"
]
}
],
"source": [
"#return index matrix sorting by column\n",
"print(np.argsort(fruit_prices, axis=0))\n",
"print()\n",
"\n",
"#return index matrix sorting by row\n",
"print(np.argsort(fruit_prices, axis=1))"
]
},
{
"cell_type": "code",
"execution_count": 100,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[3, 1, 0, 2],\n",
" [2, 1, 3, 0],\n",
" [2, 0, 1, 3],\n",
" [0, 2, 1, 3]])"
]
},
"execution_count": 100,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sorted_fruits = np.argsort(fruit_prices, axis=1)\n",
"sorted_fruits"
]
},
{
"cell_type": "code",
"execution_count": 101,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['passionfruit' 'banana' 'apple' 'kiwi']\n",
"['mandarin' 'orange' 'citrus' 'mango']\n",
"['papaya' 'watermelon' 'rockmelon' 'grape']\n",
"['plum' 'apricot' 'peach' 'lychee']\n"
]
},
{
"data": {
"text/plain": [
"[None, None, None, None]"
]
},
"execution_count": 101,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# To show the results of this in terms of the labels you can do as follow\n",
"[print(fruit[sorted_fruits[idx]]) for idx,fruit in enumerate(fruits)]"
]
},
{
"cell_type": "code",
"execution_count": 102,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([['passionfruit', 'banana', 'apple', 'kiwi'],\n",
" ['mandarin', 'orange', 'citrus', 'mango'],\n",
" ['papaya', 'watermelon', 'rockmelon', 'grape'],\n",
" ['plum', 'apricot', 'peach', 'lychee']], dtype='<U12')"
]
},
"execution_count": 102,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# You can also use \n",
"np.take_along_axis(fruits, sorted_fruits, axis=1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Exercise2 [From demo Co-Occurrence Analysis for Finding Possible Relationships]**\n",
"\n",
"Output the rankings of each pair given the lists of strings for rows and columns"
]
},
{
"cell_type": "code",
"execution_count": 106,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[-0.99657 -4.23412 3.72022]\n",
" [-0.43363 0.06578 -0.62373]\n",
" [ 3.76277 -2.79671 -0.74926]]\n"
]
}
],
"source": [
"#Get the PMI table and lists of names and companies\n",
"np.set_printoptions(precision=5, suppress=True)\n",
"co_occurrence_table = np.array([[10, 15, 300],\n",
" [500, 10000, 500],\n",
" [200, 30, 10]])\n",
"joint_prob_table = co_occurrence_table / co_occurrence_table.sum()\n",
"\n",
"people_prob = joint_prob_table.sum(axis=1)\n",
"company_prob = joint_prob_table.sum(axis=0)\n",
"joint_prob_table_if_people_and_companies_were_indep = np.outer(people_prob, company_prob)\n",
"PMI = np.log2(joint_prob_table / joint_prob_table_if_people_and_companies_were_indep)\n",
"names = ['Elon Musk', 'Mark Zuckerberg', 'Tim Cook']\n",
"companies = ['Apple', 'Facebook', 'Tesla']\n",
"print(PMI)"
]
},
{
"cell_type": "code",
"execution_count": 107,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[(3.7627680252977145, 'Tim Cook', 'Apple'),\n",
" (3.7202223303316297, 'Elon Musk', 'Tesla'),\n",
" (0.06578417815296361, 'Mark Zuckerberg', 'Facebook'),\n",
" (-0.43362918750578877, 'Mark Zuckerberg', 'Apple'),\n",
" (-0.6237320708857317, 'Mark Zuckerberg', 'Tesla'),\n",
" (-0.7492629529695907, 'Tim Cook', 'Tesla'),\n",
" (-0.996565381896946, 'Elon Musk', 'Apple'),\n",
" (-2.796712298097102, 'Tim Cook', 'Facebook'),\n",
" (-4.2341176104044, 'Elon Musk', 'Facebook')]"
]
},
"execution_count": 107,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Do it with sorted\n",
"PMI_name_company_tuples = [(PMI[row_idx, col_idx], names[row_idx], companies[col_idx]) for row_idx in range(PMI.shape[0]) for col_idx in range(PMI.shape[1])]\n",
"sorted(PMI_name_company_tuples, reverse=True) # without using itemgetter/lambda, sorts based on index 0"
]
},
{
"cell_type": "code",
"execution_count": 109,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Company Name PMI \n",
"-------------------- ---------- --------------------\n",
"Tim Cook Apple 3.7627680252977145 \n",
"Elon Musk Tesla 3.7202223303316297 \n",
"Mark Zuckerberg Facebook 0.06578417815296361 \n",
"Mark Zuckerberg Apple -0.43362918750578877\n",
"Mark Zuckerberg Tesla -0.6237320708857317 \n",
"Tim Cook Tesla -0.7492629529695907 \n",
"Elon Musk Apple -0.996565381896946 \n",
"Tim Cook Facebook -2.796712298097102 \n",
"Elon Musk Facebook -4.2341176104044 \n"
]
}
],
"source": [
"# do it with argsort\n",
"sorted_idx = np.argsort(PMI.flatten())\n",
"names_list = [t[1] for t in PMI_name_company_tuples]\n",
"companies_list = [t[2] for t in PMI_name_company_tuples]\n",
"sorted_idx = np.argsort(PMI.flatten())\n",
"print(\"{0:20} {1:10} {2:20}\".format('Company', 'Name', 'PMI'))\n",
"print(\"{0:20} {1:10} {2:20}\".format('--------------------', '----------', '--------------------'))\n",
"for idx in sorted_idx[::-1]:\n",
" print(\"{0:20} {1:10} {2:20}\".format(names_list[idx], companies_list[idx], str(PMI.flatten()[idx])))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"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.8.3"
}
},
"nbformat": 4,
"nbformat_minor": 1
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment