Dimensionality reduction : Principal component analysis"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"In /Users/holtz/anaconda3/lib/python3.7/site-packages/matplotlib/mpl-data/stylelib/_classic_test.mplstyle: \n",
"The text.latex.preview rcparam was deprecated in Matplotlib 3.3 and will be removed two minor releases later.\n",
"In /Users/holtz/anaconda3/lib/python3.7/site-packages/matplotlib/mpl-data/stylelib/_classic_test.mplstyle: \n",
"The mathtext.fallback_to_cm rcparam was deprecated in Matplotlib 3.3 and will be removed two minor releases later.\n",
"In /Users/holtz/anaconda3/lib/python3.7/site-packages/matplotlib/mpl-data/stylelib/_classic_test.mplstyle: Support for setting the 'mathtext.fallback_to_cm' rcParam is deprecated since 3.3 and will be removed two minor releases later; use 'mathtext.fallback : 'cm' instead.\n",
"In /Users/holtz/anaconda3/lib/python3.7/site-packages/matplotlib/mpl-data/stylelib/_classic_test.mplstyle: \n",
"The validate_bool_maybe_none function was deprecated in Matplotlib 3.3 and will be removed two minor releases later.\n",
"In /Users/holtz/anaconda3/lib/python3.7/site-packages/matplotlib/mpl-data/stylelib/_classic_test.mplstyle: \n",
"The savefig.jpeg_quality rcparam was deprecated in Matplotlib 3.3 and will be removed two minor releases later.\n",
"In /Users/holtz/anaconda3/lib/python3.7/site-packages/matplotlib/mpl-data/stylelib/_classic_test.mplstyle: \n",
"The keymap.all_axes rcparam was deprecated in Matplotlib 3.3 and will be removed two minor releases later.\n",
"In /Users/holtz/anaconda3/lib/python3.7/site-packages/matplotlib/mpl-data/stylelib/_classic_test.mplstyle: \n",
"The animation.avconv_path rcparam was deprecated in Matplotlib 3.3 and will be removed two minor releases later.\n",
"In /Users/holtz/anaconda3/lib/python3.7/site-packages/matplotlib/mpl-data/stylelib/_classic_test.mplstyle: \n",
"The animation.avconv_args rcparam was deprecated in Matplotlib 3.3 and will be removed two minor releases later.\n"
]
}
],
"source": [
"%matplotlib inline\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(100, 10)\n",
"[[0.28203457 0.17743954 0.75061475 0.80683474 0.99050514 0.41261768\n",
" 0.37201809 0.77641296 0.34080354 0.93075733]\n",
" [0.85841275 0.42899403 0.75087107 0.75454287 0.10312387 0.90255291\n",
" 0.50525237 0.82645747 0.3200496 0.89552323]\n",
" [0.38920168 0.01083765 0.90538198 0.09128668 0.31931364 0.95006197\n",
" 0.95060715 0.57343789 0.63183721 0.44844552]]\n"
]
}
],
"source": [
"np.random.seed(42)\n",
"X = np.random.normal(size=(100,3))\n",
"R = np.random.random([3,10])\n",
"X = np.dot(X,R)\n",
"print(X.shape)\n",
"np.savetxt('ndim.txt',X)\n",
"print(R)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Start by loading a multi-dimensional data set, from the file ndim.txt using numpy.loadtxt() "
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(100, 10)\n"
]
}
],
"source": [
"X=np.loadtxt('ndim.txt')\n",
"print(X.shape)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The dataset has 100 data points, which is the first index. The second index gives the number of characteristics per \n",
"data point, i.e. the dimensionality of the data. How many dimensions does this data have?\n",
" ANSWER HERE: "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Investigate this data set by making some plots. Do you think that it is a good candidate for dimensionality reduction? Why or why not? \n",
" ANSWER HERE: \n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"