diff --git a/module1-vectors-and-matrices/LS_DS_131_Vectors_and_Matrices_Assignment.ipynb b/module1-vectors-and-matrices/LS_DS_131_Vectors_and_Matrices_Assignment.ipynb index 87fc432d..20b6b208 100644 --- a/module1-vectors-and-matrices/LS_DS_131_Vectors_and_Matrices_Assignment.ipynb +++ b/module1-vectors-and-matrices/LS_DS_131_Vectors_and_Matrices_Assignment.ipynb @@ -43,11 +43,87 @@ "colab": {} }, "source": [ - "" + "import math\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np" ], - "execution_count": 0, + "execution_count": 1, "outputs": [] }, + { + "cell_type": "code", + "metadata": { + "id": "t3uNMUpCmosu", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "outputId": "e7e18a5a-4cc0-4236-dd64-be49ef85f1cb" + }, + "source": [ + "purple = [1, 2]\n", + "purple" + ], + "execution_count": 28, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "[1, 2]" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 28 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Fq84M33Qnz-u", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 265 + }, + "outputId": "f5a33fd7-e759-4476-d9a0-d216f05a5326" + }, + "source": [ + "fig, ax = plt.subplots()\n", + "ax.grid()\n", + "plt.xlim(-.2, 1.2)\n", + "plt.ylim(-.2, 2.2)\n", + "\n", + "plt.arrow(0, 0,\n", + " purple[0],\n", + " purple[1],\n", + " head_width=.02,\n", + " head_length=.02,\n", + " linewidth=3,\n", + " color = 'purple')\n", + "plt.show()" + ], + "execution_count": 29, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, { "cell_type": "markdown", "metadata": { @@ -63,13 +139,109 @@ "metadata": { "id": "atUEd3T6llKm", "colab_type": "code", - "colab": {} + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "outputId": "41d403fe-b856-40bf-80e6-30e6cf9b6a78" }, "source": [ - "" + "purple = [1, 2, 3]\n", + "vector = np.array([[0,0,0,\n", + " purple[0], purple[1], purple[2]]])\n", + "vector" ], - "execution_count": 0, - "outputs": [] + "execution_count": 30, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([[0, 0, 0, 1, 2, 3]])" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 30 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Qklrt1nNpMTj", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 121 + }, + "outputId": "80484171-2b08-4da8-95ce-08896c4926bc" + }, + "source": [ + "# unqip the vector\n", + "X, Y, Z, U, V, W = zip(*vector)\n", + "for letter in [X, Y, Z, U, V, W]:\n", + " print(letter)" + ], + "execution_count": 31, + "outputs": [ + { + "output_type": "stream", + "text": [ + "(0,)\n", + "(0,)\n", + "(0,)\n", + "(1,)\n", + "(2,)\n", + "(3,)\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "7y240utVpefg", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 248 + }, + "outputId": "a4602406-d3f7-4d5e-a923-8a84ac07a3c1" + }, + "source": [ + "# display in 3D\n", + "from mpl_toolkits.mplot3d import Axes3D\n", + "\n", + "fig = plt.figure()\n", + "ax = fig.add_subplot(111, projection='3d')\n", + "ax.quiver(X, Y, Z, U, V, W, length=1, color='purple',linewidth=6)\n", + "ax.set_xlim([0, 3])\n", + "ax.set_ylim([0, 3])\n", + "ax.set_zlim([0, 3])\n", + "ax.set_xlabel('X')\n", + "ax.set_ylabel('Y')\n", + "ax.set_zlabel('Z')\n", + "plt.show()" + ], + "execution_count": 32, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] }, { "cell_type": "markdown", @@ -86,18 +258,18 @@ "metadata": { "id": "ah6zMSLJdJwL", "colab_type": "code", - "outputId": "b1ccb836-02b8-4d42-a7db-6c34f010f6c6", "colab": { "base_uri": "https://localhost:8080/", "height": 52 - } + }, + "outputId": "49371806-d391-4940-ffaf-c72fc1a92068" }, "source": [ "from math import e, pi\n", "print(e)\n", "print(pi)" ], - "execution_count": 0, + "execution_count": 33, "outputs": [ { "output_type": "stream", @@ -109,18 +281,190 @@ } ] }, + { + "cell_type": "code", + "metadata": { + "id": "XLSqLgSetWwG", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "outputId": "f6da472d-1a01-41f8-dec6-a932e9aeef76" + }, + "source": [ + "purple = [1, 2]\n", + "purple" + ], + "execution_count": 34, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "[1, 2]" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 34 + } + ] + }, { "cell_type": "code", "metadata": { "id": "3qpwDlzXkVf5", "colab_type": "code", - "colab": {} + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "outputId": "08f2d3f4-a85d-4684-a242-7899dda8d2d2" }, "source": [ - "" + "five = np.multiply(5, purple)\n", + "five" ], - "execution_count": 0, - "outputs": [] + "execution_count": 35, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([ 5, 10])" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 35 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "traQnQ4Lq-ET", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "outputId": "786f97e4-3339-4eb1-fc35-d506deaa9cb3" + }, + "source": [ + "pi_vector = np.multiply(pi, purple)\n", + "pi_vector" + ], + "execution_count": 36, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([3.14159265, 6.28318531])" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 36 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "mT9LBzbIRKP9", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "outputId": "22fa3974-905d-4ee7-ea23-f5af51f74c37" + }, + "source": [ + "last = np.multiply(-e, purple)\n", + "last" + ], + "execution_count": 37, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([-2.71828183, -5.43656366])" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 37 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "yUbMOD7otCJq", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 265 + }, + "outputId": "9daef744-6cea-4bb5-8d89-8f3395a6ccfc" + }, + "source": [ + "fig, ax = plt.subplots()\n", + "ax.grid()\n", + "plt.xlim(-3,5.5)\n", + "plt.ylim(-6, 11)\n", + "\n", + "plt.arrow(0,0, purple[0], purple[1],\n", + " head_width=.05,\n", + " head_length=.05,\n", + " color='purple')\n", + "\n", + "plt.arrow(0,0, five[0], five[1],\n", + " head_width=.05,\n", + " head_length=.05,\n", + " color='limegreen')\n", + "\n", + "plt.arrow(0,0, last[0], last[1],\n", + " head_width=.05,\n", + " head_length=.05,\n", + " color='red')\n", + "\n", + "plt.show;" + ], + "execution_count": 49, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "HQtcoqMrkKIf", + "colab_type": "text" + }, + "source": [ + "These vectors have kept the same orientation as the vector in 1.1 but its length changed by a scale factor. The directions remain the same." + ] }, { "cell_type": "markdown", @@ -146,11 +490,51 @@ "colab": {} }, "source": [ - "" + "a = np.array([1,2])\n", + "b = np.array([3,4])" ], - "execution_count": 0, + "execution_count": 50, "outputs": [] }, + { + "cell_type": "code", + "metadata": { + "id": "CzRb7gxGoVSM", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 265 + }, + "outputId": "eca0ebd8-3e9a-4b87-cc6b-00094a9a45a5" + }, + "source": [ + "fig, ax = plt.subplots()\n", + "ax.grid()\n", + "plt.xlim(-.5,3.5) \n", + "plt.ylim(-.5,4.5)\n", + "\n", + "plt.arrow(0,0, a[0], a[1],head_width=.05, head_length=0.05, color ='black', linewidth=2)\n", + "plt.arrow(0,0, b[0], b[1],head_width=.05, head_length=0.05, color ='gold', linewidth=2)\n", + "\n", + "plt.show()" + ], + "execution_count": 59, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXIAAAD4CAYAAADxeG0DAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAeaklEQVR4nO3deXxU5aH/8c+TjRAChCVsCXtIXBCvxbW2SNpSt1Zt7bV0calt8dZr8fZW/dmXV3pdfvZn7e1Lr+3V22pdWyvXKy60tWAhLveKFawoewJBE8IWEEgCIcs8vz/mOJMTJ8wkOTNnTub7fr3m5ZwnZ2a+DM6XJ2fOM2OstYiISHBl+R1ARET6R0UuIhJwKnIRkYBTkYuIBJyKXEQk4HKScadFRUW2rKwsGXftmZaWFoYMGeJ3jLiU01vK6S3l9M6aNWsarbXFfbltUop87NixrF69Ohl37Zmqqirmzp3rd4y4lNNbyukt5fSOMeb9vt5Wh1ZERAJORS4iEnAqchGRgFORi4gEnIpcRCTgVOQiIgGnIhcRCTgVuYhIwKnIRUQCTkUuIhJwKnIRkYBTkYuIBJyKXEQk4FTkIiIBpyIXEQk4FbmISMCpyEVEAi7hIjfGZBtj/maMWZrMQCIingodhlAT7P1X6Dzgd5qk6M2M/HpgY7KCiIh46vBrsMnAliHQtgX23QY7vux3qqRIqMiNMaXAhcBDyY0jIuKRw699fCyrMPU5UsBYa+PvZMwzwE+AocAN1tovxNhnAbAAoLi4ePbixYs9juqt5uZmCgvT/y9VOb2lnN5K25z2MByNHkBobiulMK8e8qZC1kgfg/WssrJyjbX21D7d2Fp7zAvwBeA/nOtzgaXxblNeXm7T3cqVK/2OkBDl9JZyeivtcoZC1tZfZu1Gopf3P2dXLn/C2urJ1nY2+52wR8BqG6dbe7rkJND1ZwMXGWMuAPKBYcaYJ6213+zTvxwiIsnQth22TXWPTf4rDD4NtlXB9G1gBuaJenH/VNbaH1lrS621U4D5wAqVuIiklb3/4i7xvBOhoiNc4h8ZoCUOJDQjFxFJT50fQnW3Y94lL8DQL/qTxye9KnJrbRVQlZQkIiK9ceAh2PXdLgNZUN4MWYN9i+QXzchFJFhCR8OzcHs4Ojb2lzDiWv8y+UxFLiLB0fwS1J/vHivbCzmj/cmTJgbu0X8RGThsCGpnu0t85A1wnM34EgfNyEUk3bX+DbZ/wj02rQbypvuTJw1pRi4i6claaPi6u8QLL4aKkEq8G83IRST9tH8AWye7xyavgsFn+JMnzWlGLiLpZe+P3SWeV+Es7lGJ90QzchFJD50HoHqEe6zkORh6sT95AkRFLiL+O/AI7LraPVbeAlkF/uQJGBW5iPgndBRqxkDoUHRs7P0w4jr/MgWQilxE/NGyDOrOdY+V7YGcYn/yBJje7BSR1LIh2H66u8RH/LOzuEcl3heakYtI6rSuhe1/5x6bVg15Zf7kGSA0IxeR5LMWGi53l/iQLziLe1Ti/aUZuYgkV3sdbJ3kHpv8Bgw+0588A5Bm5CKSPI23uUs8d4azuEcl7iXNyEXEe50HobrIPVbyLAz9kj95BjgVuYh46+BjsPMq95gW9ySVilxEvGHboHoshA5Ex8bcByMX+pcpQ6jIRaT/Wl6GunnusbLdkDPGnzwZRm92ikj/bD/LXeIjrncW96jEU0UzchHpm9b3oHUNtK6Kjk3bDHnl/mXKUJqRi0jv7fwWbJ8V3R5yvrO4RyXuB83IRSRx7fWwdaJ7bNL/QMEn/ckjgGbkIpKoxjvdJZ47DfJnq8TTgGbkInJssRb3THgGhl0KdVW+RBI3FbmI9OzgE7DzCvdYeTNkDfEnj8SkIheRj7NtUD0eQvujY2N+DiN/4F8m6ZGKXETcWlZA3WfdY2W7IGesP3kkLr3ZKSJh1sL7n3KXeNF1zuIelXg604xcRODoOqg9yT02dRMMqvAnj/SKZuQimW7nt90lPuTz4cU9KvHA0IxcJFO174Ctpe6xSa9Bwaf8ySN9phm5SCba9xN3iedMgop2lXhAxZ2RG2PygVeBQc7+z1hrf5zsYCKSBJ2HoHq4e2zCYhj29/7kEU8kcmjlKPAZa22zMSYXeN0Y8ydr7ap4NxSRNHLwd7DzG+6x8ibIKvQnj3gmbpFbay3Q7GzmOhebzFAi4iHbDjWl0LknOlb8Mxj1Q/8yiacSerPTGJMNrAHKgF9aa99MaioR8UZLFdRVusfKdkLOOF/iSHKY8IQ7wZ2NKQKWAN+31q7r9rMFwAKA4uLi2YsXL/Yyp+eam5spLEz/XymV01sZlbNtM4Sao9s5xeE3NT2UUc9nklVWVq6x1p7apxtba3t1ARYBNxxrn/LycpvuVq5c6XeEhCintzIiZ+s6azfivrRu9CxbVxnxfKYIsNr2so8/usQ9/dAYU+zMxDHGDAbmAZv69K+GiCTXzgVQOzO6XfA5Z3HPcf5lkqRL5Bj5eOAx5zh5FrDYWrs0ubFEpFc6dkLNBPfYpFegYI4/eSSlEjlr5V3glBRkEZG+2Hc37L05up1TCtNrwWjhdqbQ37RIUHU2QfUw99iE38Owr/qTR3yjIhcJokNPQcPX3WNa3JOxVOQiQWLbYevk8DHxjxTfDaNu8i+T+E5FLhIUh1+BD+a6x8oaIGe8H2kkjejTD0XSnbXwwWfcJV50jfPNPSpx0YxcJL0d3Qi1J7jHpq6HQSfE3l8ykmbkIulq1/fcJV5Q6SzuUYmLm2bkIummYxe0roEDD0bHJlVBwTm+RZL0phm5SDrZdw/UdDnunTMeKtpU4nJMmpGLpINQM2wZ6h6b8DsY9jV/8kigaEYu4rdDT3+8xPNPUYlLwlTkIn6xHVAzERrmR8eKfxI+rVAvTekFHVoR8cPh1+CDbp9MOH0H5E6Ivb/IMeiffZFUshY+mOcu8eHfCc/CVeLSR5qRi6TK0U1Qe7x7bOo6GHSiP3lkwNCMXCQVdl3nLvHBc5zFPSpx6T/NyEWSqWM31HT7xvqJK2BIZez9RfpAM3KRZNn/c3eJZ48JL+5RiYvHNCMX8VqoBbZ0+4KH8U/A8G/6k0cGPBW5iJcOPQMNf+8em3EQsofF3l/EAzq0IuIF2wFbp7pLfPSd4dMKVeKSZJqRi/TX4f+BDz7lHpteD7kl/uSRjKMZuUhfWQt157lLfPi3nMU9KnFJHc3IRfqibQtsq3CPTXkX8k/yJ49kNM3IRXpr90J3iQ8+O7y4RyUuPtGMXCRRHXugZqx7bOLLMOSz/uQRcWhGLpKI/fe6Szx7FFQcVYlLWtCMXORYYi7ueQyGX+FPHpEYVOQiPWl6FnZc6h6bcQCyh/uTR6QHOrQi0p3tgK3T3SU++nZncY9KXNKPZuQiXR15A97/pHtseh3klvqTRyQBmpGLgLO450J3iQ+70lncoxKX9KYZuUhbNWwrd49NWQv5s/zJI9JLmpFLZtv9A3eJ558JFZ0qcQkUzcjFUzU1NZSVlfkdI76OvVAzxj02cRkMmedPHpF+iDsjN8ZMNMasNMZsMMasN8Zcn4pgEhxHjhxh//79zJ07l/Ly8vg38Nv++90lnlXkLO5RiUswJXJopQP4obX2BOBM4B+NMSckN5YEweHDh5k3bx4FBQXU1tbyyiuvYK31O1bPQoehdQ3sWRgdG/cIlH8IJs+/XCL9FLfIrbU7rbVvO9ebgI2APqNTaGtr4+WXX/Y7RmKanoMtQ9xjMw5A0VW+xBHxkunNDMoYMwV4FZhprT3U7WcLgAUAxcXFsxcvXuxdyiRobm6msLAw/o4+S+ec1lrefvttAEpLS6mvrwdg9uzZfsb6uKPrwB4FoLmtlMKCEOSM9znUsaXz33tXyumdysrKNdbaU/ty24SL3BhTCLwC/F9r7bPH2reiosJu3ry5L3lSpqqqirlz5/odI650zdnR0UFubm5k+8knn6Suro4VK1awbNkyH5N1cWQVvH+Wa6hq5zLmVqb/sfB0/XvvTjm9Y4zpc5EndPqhMSYX+G/gt/FKXAa+zs5OV4n/9Kc/paSkhJtvvjk9StxaqL/IXeLDvhn+zHCT2/PtRAIqkbNWDPAwsNFa+/PkR5J0Zq0lJyd61uqtt97KjTfe6GOibtpqYHMWNL8YHZvyDkx4AozxL5dIEiUyIz8buBz4jDHmHedyQZJzSRqy1pKVFf1fZuHChdx+++0+Jupmzw2wbUZ0O/80Z3HPyf5lEkmBuAuCrLWvA5rKZDhrLQUFBZHtK6+8kvvuu8/HRF10NEJNsXts4p9hyOf9ySOSYlqiLwkpLS2ltbUVgIsvvphHH33U30Af+fCX7hLPGgrlrSpxyShaoi9xzZo1i4aGBgDmzJnDc88953MiIHQEthS4x8Y9DEVX+5NHxEcqcjmmOXPm8N577wFw0kkn8corr/icCGh6AXZc7B6bsR+yR/iTR8RnOrQiPbrkkkt47bXXACgpKeHdd9/1N5DthG3Hu0t81CLnm3tU4pK5NCOXmK666iqef/55APLz86mrq/M30JG/wvtnuMemb4fcyb7EEUknmpHLxyxcuJDHHnsssn348GGMX+dgWwv1X3KX+LCvhRf3qMRFAM3IpZtbb72V+++/P7IdCoX8K/G2bbBtuntsytuQf4o/eUTSlGbkEnHPPfdw5513RrY7Ojr8K/E9/8dd4vmzncU9KnGR7jQjFwAeeOABbrrppsh2e3s72dnZqQ/SuQ+qR7vHSv8EheelPotIQGhGLjz55JNce+21ke3W1lbX56mkzIcPuEvcFIQX96jERY5JM/IMt2TJEi6//PLIdktLC4MGDUptiNAR2DIU6IyOjfs1FH0ntTlEAkpFnsGWLVvGl7/85cj2gQMHXJ+nkhLNS6H+i+4xLe4R6RUdWslQr732Gueee25ke+/evQwfPjx1AWwnbJvpLvFRt2hxj0gfaEaegVavXs2cOXMi2w0NDYwePfoYt/DYkbfg/dPdY9NqIW9K6jKIDCCakWeY9evXc9ppp0W2a2trGT8+Rd9faS3s+Iq7xIdeFl7coxIX6TPNyDNITU0NM2fOjGxv2rSJKVOmpObB22ph2zT32JTV4fPDRaRfNCPPEHV1dcyYEf32nLVr11JRUZGaB9/zI3eJDzrZWdyjEhfxgmbkGWD37t1MmjQpsr1q1SpmzZqV/Afu3A/Vo9xjpX+AQn1ToIiXNCMf4D788EPGjRsX2V6xYgVnnHHGMW7h1QP/p7vEzSAoP6ISF0kCzcgHsKamJkaOHBnZXrp0KZWVlcl90FArVA8H2xYdG/efULQguY8rksFU5APUkSNHGDZsWGT76aef5sILL0zugzb/Aeq/4B6bsQ+yR8beX0Q8oUMrA1BbW5trhebDDz/MZZddlrwHtCFo2+Au8VE/chb3qMRFkk1FPsB0dHS4Pivlvvvu4+qrk/iFxK1rYHN2+PNSPjJtGxTflbzHFBEXFfkAEgqFyM3NjWzfeeedLFy4MDkPZi3suAy2nxodG3qps7hnanIeU0Ri0jHyAcJa6/r88JtuuolbbrklOQ/Wth22dSvrQcdDyQ+T83gickyakQ8A1lqysqJ/lddccw133313ch5s77+4S3zQSVDREf7scBHxhWbkA0DXUwznz5/Pgw8+6P2DdH4I1d3euCx9EQq/EHt/EUkZFXnAlZWVceDAAQDOPfdcnnrqKe8f5MBDsOu7XQZyoPwQZA32/rFEpNdU5AF2+umns3Xr1sj1l156ydsHCB2F6hFgu5yRMvY/YMT3vH0cEekXFXlAff7zn+ett94CwrPyN99809sHaH4J6s93j81ohOxRsfcXEd/ozc4A+upXv8ry5cuB8PHx6upq7+7chqB2trvER97oLO5RiYukI83IA2bBggUsXrw4st3Y2Ojdnbf+DbZ/wj02bSvkTYu9v4ikBc3IA+TGG2/k17/+dWQ7FAphjOn/HVsLDV93l3jhl5zFPSpxkXSnGXlA3HHHHfzsZz+LbHd2dnpT4u3vw9Yp7rHJb8Lg02PuLiLpJ+6M3BjzG2PMHmPMulQEko+79957WbRoUWS7o6PDtQCoz/Yucpd43vHhxT0qcZFASaQNHgXOS3IO6UFjYyM/+MEPItttbW2upfh90nkANhnYd0d0rOR5mLYBTD/vW0RSLu6hFWvtq8aYKcmPIt09/fTT1NfXR7YPHz7s+lCsPjnwG9j17S4DBspbtLhHJMD0ZmeaevHFF5k/f35ku6mpicGD+1G2oaOwZai7xMf+Ao4LqcRFAs5Ya+PvFJ6RL7XWzjzGPguABQDFxcWzu54il46am5spLCz0O0ZMTU1NbNmyBYDS0lJGjx7dv8MpoUPQ1u1c8/yT8fK97nR+PrtSTm8pp3cqKyvXWGtPjb9nDNbauBdgCrAukX2ttZSXl9t0t3LlSr8jxPTGG29YIHJZvnx53+8s1Glt7anWbiR62f1D78J2ka7PZ3fK6S3l9A6w2ibYsd0vOv0wjbzzzjucddZZke26ujpqamr6dmet78D2U9xj06ohr6wfCUUkHSVy+uFTwBtAhTGm3hjz7Xi3kd7btGkTp5wSLd6amhpKS0t7f0fWQsM33SVeeJGzuEclLjIQJXLWytdSESST1dbWcvzxx0e2169fz/Tp03t/R+11sHWSe2zyGzD4zH4mFJF0prNWfNbQ0MC0adFl8KtXr+aEE07o/R013uYu8bxyZ3GPSlxkoNMxch81NjZSUlIS2X799deZPXt27+6k8yBUF7nHSpbA0Es8SCgiQaAi98nBgwcpLi6ObC9btoyzzz67d3dy4FHY9S33WHkLZOn7M0UyiYrcBy0tLRQVRWfRS5YsYd68eYnfgW2D6jEQOhgdG/PvMPL7HqYUkaBQkadYa2ura2HCk08+ySWX9OIwSMvLUNet9Mv2QE5x7P1FZMDTm50p1N7e7lpm/+CDD/KNb3wjsRvbEGw/013iI/4p/M09KnGRjKYZeYp0dnaSl5cX2b7nnnu45pprErtx67uw/WT32LQtkDfDw4QiElSakadAKBQiJyf6b+aiRYu44YYbErtx+3Z3iQ+5wFncoxIXkTAVeZJZa10feHX99ddz2223xb9he334M8M790XHJv8vTPwDePHNQCIyYKjIk8haS35+fmT7qquu4t57741/w8Y7YOvE6HbudKhoh8Fn9XwbEclYOkaeRBMmTKCtrQ2ASy65hEceeeTYN4i1uCdvOkzv4wdniUhG0Iw8SU488UR27doFwDnnnMOSJUuOfYODT3y8xMubIaso9v4iIg7NyJPg05/+NBs2bABg1qxZVFVV9byzbYPq8RDaHx0bcy+MvD65IUVkwFCRe+yLX/wir7/+OhD+dp+1a9f2vHPLX6Duc+6xst2QMyaJCUVkoNGhFQ9dccUVLF26FIDBgwfzwQcfxN7RWnj/bHeJj1joLO5RiYtI72hG7pHvf//7PPHEE5HtlpYWTKzTBI+ug9qT3GNTN8GgiiQnFJGBSjNyD9xyyy384he/iGyHQqHYJb7zaneJDzkvvLhHJS4i/aAZeT/dfffd3HXXXZHtjo6Oj5d4+w7Y2u1r2ya9DgW9/NhaEZEYNCPvhwceeICbb745st3e3u5axQlA413uEs+dGl7coxIXEY9oRt5Hjz/+ONdee21ku7W11fV5KnQegurh7htN+C8Y9pUUJRSRTKEi74Nnn32WK6+8MrLd0tLCoEGDojsc/C3s/Kb7RuXNkDUkRQlFJJOoyHvppZde4tJLL41sHzx4kIIC56vVbDvUlEDn3ugNxvwbjPznFKcUkUyiIu+FV199lfPPPz+y3djYyLBhw8IbLSuh7jPuG5TtgpyxKUwoIplIb3YmaPXq1ZxzzjmR7YaGBkaNGuUs7pnjLvGif3QW96jERST5NCNPwLp16zjttNMi29u3b2f8+PFwdD3UznTvPHUjDDouxQlFJJNpRh5HdXU1J50UXcSzefNmJk+eDDu/6y7xgnnO4h6VuIiklmbkx1BXV0d5eXlke+3atZRPLQx/c09Xk16Fgk+nOJ2ISJhm5D3YvXs3kyZNimyvWrWKWSV/hK0l0Z1yJjqLe1TiIuIfzchj2L9/P+PGjYtsv1r1B84YfiZ0OauQCU/DsMtSH05EpBsVeTdNTU3hs1Ecb1fdyCljL3TvVN4EWYUpTiYiEpsOrXRx5MiRyHnhOTlw+N0iThl7T3SH4nvCpxWqxEUkjWhG7mhra4us0JxzGrzyOMCB6A5lOyFnXMzbioj4STNywh89+9Fnpax49KMSdxR9z1ncoxIXkfSU8TPyUChEbm4ux0+HDUu7/XDqBhh0vC+5REQSldEzcmst2dnZPPDjbiVe8BlncY9KXETSX0IzcmPMecB9QDbwkLX2/yU1VYpMGJuF3dhtcFIVFJwTa3cRkbQUt8iNMdnAL4F5QD3wljHmBWvthmSHS6aGD95m56tdBnJKYHotmFzfMomI9EUih1ZOB2qstdustW3A74GLkxsruX5+9/VMGGOjAxN+B2X1KnERCSRjrT32DsZ8BTjPWvsdZ/ty4Axr7XXd9lsALAAoLi6evXjx4uQk7qcjR45QW7uVSaXFFObVQ/4ppPNbBc3NzRQWpv9568rpLeX0VhByVlZWrrHWntqX23p21oq19lfArwAqKirs3LlzvbrrpPjLy39m7ue+6neMuKqqqkj35xKU02vK6a2g5OyrRKaiO4CJXbZLnbFAy84ZFH8nEZEASKTI3wJmGGOmGmPygPnAC8mNJSIiiYp7aMVa22GMuQ74M+HTD39jrV2f9GQiIpKQhI6RW2v/CPwxyVlERKQP0vd0DRERSYiKXEQk4FTkIiIBpyIXEQk4FbmISMCpyEVEAk5FLiIScCpyEZGAU5GLiAScilxEJOBU5CIiAaciFxEJOBW5iEjAqchFRAJORS4iEnAqchGRgDPWWu/v1JgmYLPnd+yt0UCj3yESoJzeUk5vKad3Kqy1Q/tyw4S+IagPNltrT03SfXvCGLM63TOCcnpNOb2lnN4xxqzu6211aEVEJOBU5CIiAZesIv9Vku7XS0HICMrpNeX0lnJ6p88Zk/Jmp4iIpI4OrYiIBJyKXEQk4DwpcmPMSGPMcmNMtfPfET3s12mMece5vODFYyeQ7TxjzGZjTI0x5uYYPx9kjHna+fmbxpgpqcgVI0e8nFcZY/Z2ef6+40PG3xhj9hhj1vXwc2OM+Xfnz/CuMeYTqc7o5IiXc64x5mCX53JRqjM6OSYaY1YaYzYYY9YbY66PsY+vz2mCGX1/Po0x+caYvxpj1jo5b4uxj++v9QRz9v61bq3t9wX4KXCzc/1m4O4e9mv24vF6kSsb2ApMA/KAtcAJ3fa5FnjQuT4feDqVGXuR8yrgF6nO1i3DHOATwLoefn4B8CfAAGcCb6ZpzrnAUj+fSyfHeOATzvWhwJYYf+++PqcJZvT9+XSen0Lnei7wJnBmt33S4bWeSM5ev9a9OrRyMfCYc/0x4BKP7re/TgdqrLXbrLVtwO8JZ+2qa/ZngM8aY0wKM0JiOX1nrX0V2H+MXS4GHrdhq4AiY8z41KSLSiBnWrDW7rTWvu1cbwI2AiXddvP1OU0wo++c56fZ2cx1Lt3P5PD9tZ5gzl7zqsjHWmt3Otd3AWN72C/fGLPaGLPKGJOKsi8B6rps1/Px/wkj+1hrO4CDwKgUZIuZwRErJ8Clzq/XzxhjJqYmWq8k+udIB2c5v97+yRhzot9hnF/zTyE8Q+sqbZ7TY2SENHg+jTHZxph3gD3Acmttj8+lj6/1RHJCL1/rCRe5MeZlY8y6GBfXzNGGfzfo6V+YyTa8TPbrwL3GmOmJPr7wIjDFWjsLWE50ZiG99zbh/xdPBu4HnvMzjDGmEPhv4J+stYf8zNKTOBnT4vm01nZaa/8OKAVON8bM9CNHPAnk7PVrPeEit9Z+zlo7M8bleWD3R7/uOf/d08N97HD+uw2oIvyvezLtALr+a1bqjMXcxxiTAwwH9iU5V3dxc1pr91lrjzqbDwGzU5StNxJ5vn1nrT300a+31to/ArnGmNF+ZDHG5BIuyN9aa5+NsYvvz2m8jOn0fDoZDgArgfO6/SgdXusRPeXsy2vdq0MrLwBXOtevBJ7vvoMxZoQxZpBzfTRwNrDBo8fvyVvADGPMVGNMHuE3OLqfLdM1+1eAFc5vFakUN2e346IXET5WmW5eAK5wzrQ4EzjY5ZBb2jDGjPvo2Kgx5nTCr4OUv6CdDA8DG621P+9hN1+f00QypsPzaYwpNsYUOdcHA/OATd128/21nkjOPr3WPXondhTwF6AaeBkY6YyfCjzkXP8k8B7hMzLeA77txWMnkO0Cwu+0bwVuccZuBy5yrucD/wXUAH8FpqUiVx9y/gRY7zx/K4HjfMj4FLATaCd8rPbbwD8A/2Cj78j/0vkzvAec6tNzGS/ndV2ey1XAJ33K+SnChyHfBd5xLhek03OaYEbfn09gFvA3J+c6YJEznlav9QRz9vq1riX6IiIBp5WdIiIBpyIXEQk4FbmISMCpyEVEAk5FLiIScCpyEZGAU5GLiATc/wdNVj8f7xrHdAAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, { "cell_type": "markdown", "metadata": { @@ -169,11 +553,82 @@ "colab": {} }, "source": [ - "" + "sub = a - b" ], - "execution_count": 0, + "execution_count": 60, "outputs": [] }, + { + "cell_type": "code", + "metadata": { + "id": "8bFwKnqhsCrr", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "outputId": "3f7aeacf-c6ad-40e3-b28b-9dacda60ba29" + }, + "source": [ + "sub" + ], + "execution_count": 62, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([-2, -2])" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 62 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "xJnK76jQr0fk", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 281 + }, + "outputId": "b23ef7fe-88fb-480e-d5b2-dbd0efcff35f" + }, + "source": [ + "fig, ax = plt.subplots()\n", + "ax.grid()\n", + "plt.xlim(-2.5,3.5) \n", + "plt.ylim(-2.5,4.5)\n", + "\n", + "plt.arrow(0,0, a[0], a[1],head_width=.05, head_length=0.05, color ='black', linewidth=2)\n", + "plt.arrow(0,0, b[0], b[1],head_width=.05, head_length=0.05, color ='gold', linewidth=2)\n", + "plt.arrow(0,0, sub[0], sub[1],head_width=.05, head_length=0.05, color ='lightblue', linewidth=2)\n", + "\n", + "plt.title('Vector Subtraction')\n", + "plt.show()" + ], + "execution_count": 70, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, { "cell_type": "markdown", "metadata": { @@ -198,11 +653,42 @@ "colab": {} }, "source": [ - "" + "c = np.array([7, 22, 4, 16])\n", + "d = np.array([12, 6, 2, 9])" ], - "execution_count": 0, + "execution_count": 71, "outputs": [] }, + { + "cell_type": "code", + "metadata": { + "id": "R9kpMi6ZtdWV", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "outputId": "d93bd24a-c651-4277-97f6-a59d48d52afe" + }, + "source": [ + "c*d" + ], + "execution_count": 72, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([ 84, 132, 8, 144])" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 72 + } + ] + }, { "cell_type": "markdown", "metadata": { @@ -227,11 +713,44 @@ "colab": {} }, "source": [ - "" + "e = np.array([[5], [7], [2]])\n", + "f = np.array([[3], [4], [6]])" ], - "execution_count": 0, + "execution_count": 76, "outputs": [] }, + { + "cell_type": "code", + "metadata": { + "id": "coznCZBpvDod", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 69 + }, + "outputId": "f4f802c9-0bdc-4fe7-ffeb-f07314ad735d" + }, + "source": [ + "e*f" + ], + "execution_count": 77, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([[15],\n", + " [28],\n", + " [12]])" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 77 + } + ] + }, { "cell_type": "markdown", "metadata": { @@ -253,13 +772,74 @@ "metadata": { "id": "-5VKOMKBlgaA", "colab_type": "code", - "colab": {} + "colab": { + "base_uri": "https://localhost:8080/", + "height": 104 + }, + "outputId": "ba126bc2-065a-46c7-a758-1cb664b48d45" }, "source": [ - "" + "# Norm of g\n", + "g = np.array([[1], [1], [1], [8]])\n", + "norm_g = np.linalg.norm(g)\n", + "print(g, \"\\n Norm of g:\", norm_g)" ], - "execution_count": 0, - "outputs": [] + "execution_count": 80, + "outputs": [ + { + "output_type": "stream", + "text": [ + "[[1]\n", + " [1]\n", + " [1]\n", + " [8]] \n", + " Norm of g: 8.18535277187245\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "G33MHUmKwNMM", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 104 + }, + "outputId": "faf83cfa-3474-44c2-9087-0102d5b41c1a" + }, + "source": [ + "# Norm of h\n", + "h = np.array([[3], [3], [3], [3]])\n", + "norm_h = np.linalg.norm(h)\n", + "print(h, \"\\n Norm of h:\", norm_h)" + ], + "execution_count": 81, + "outputs": [ + { + "output_type": "stream", + "text": [ + "[[3]\n", + " [3]\n", + " [3]\n", + " [3]] \n", + " Norm of h: 6.0\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Hbv98ToEwkdW", + "colab_type": "text" + }, + "source": [ + "The norm of g is longer" + ] }, { "cell_type": "markdown", @@ -316,9 +896,39 @@ "colab": {} }, "source": [ - "" + "# the dimensions\n", + "# A = 3x2\n", + "# B = 1x3\n", + "# C = 2x3\n", + "# D = 3x3\n", + "# E = 2x2" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "9FIXJjwUtyyM", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# Matrix Multiplication\n", + "# You can multipy any two matrices where the number of columns of the first \n", + "# matrix is equal to the number of rows of the second matrix.\n", + "\n", + "# Combinations\n", + "# 1: AC\n", + "# 2: AD\n", + "# 3: BA\n", + "# 4: BD\n", + "# 5: CA\n", + "# 6: CD\n", + "# 7: DA\n", + "# 8: EC" ], - "execution_count": 0, + "execution_count": null, "outputs": [] }, { @@ -336,13 +946,114 @@ "metadata": { "id": "zhKwiSItoE2F", "colab_type": "code", - "colab": {} + "colab": { + "base_uri": "https://localhost:8080/", + "height": 52 + }, + "outputId": "19f188d0-c852-4c62-acb0-96a667b175cd" }, "source": [ - "" + "# CD\n", + "C = [[9, 6, 3], [4, 7, 11]]\n", + "D = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]\n", + "np.matmul(C,D)\n", + "# dimensions = 2x3" ], - "execution_count": 0, - "outputs": [] + "execution_count": 3, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([[ 9, 6, 3],\n", + " [ 4, 7, 11]])" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 3 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "hSeWRy_uwK0N", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 69 + }, + "outputId": "f1365761-a6b1-4be0-b87b-78ca326e3f7f" + }, + "source": [ + "# AE\n", + "A = [[1, 2], [3, 4], [5, 6]]\n", + "E = [[1, 3], [5, 7]]\n", + "np.matmul(A,E)\n", + "# dimensions = 3x2" + ], + "execution_count": 6, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([[11, 17],\n", + " [23, 37],\n", + " [35, 57]])" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 6 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "y6IrTZj7wnfX", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "outputId": "29ee89c9-1039-4433-8b61-d9293bc081fe" + }, + "source": [ + "# BA\n", + "B = [[2, 4, 6]]\n", + "np.matmul(B,A)\n", + "# dimensions = 1x2" + ], + "execution_count": 7, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([[44, 56]])" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 7 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "DTKEuLGlyS8C", + "colab_type": "text" + }, + "source": [ + "The dimensions of the resulting matrices are the unused dimensions of the factor matrices - the rows of the first matrix and the columns of the second matrix." + ] }, { "cell_type": "markdown", @@ -370,13 +1081,201 @@ "metadata": { "id": "Wl3ElwgLqaAn", "colab_type": "code", - "colab": {} + "colab": { + "base_uri": "https://localhost:8080/", + "height": 202 + }, + "outputId": "1d686a4a-4b81-46bb-d169-b146f7454fe9" }, "source": [ - "" + "import pandas as pd\n", + "F = np.array([[20,19,18,17],[16,15,14,13],[12,11,10,9],[8,7,6,5],[4,3,2,1]])\n", + "\n", + "pd.DataFrame(F)" ], - "execution_count": 0, - "outputs": [] + "execution_count": 11, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
0123
020191817
116151413
21211109
38765
44321
\n", + "
" + ], + "text/plain": [ + " 0 1 2 3\n", + "0 20 19 18 17\n", + "1 16 15 14 13\n", + "2 12 11 10 9\n", + "3 8 7 6 5\n", + "4 4 3 2 1" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 11 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "QuFXypukzeEA", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 171 + }, + "outputId": "9442b7c4-505f-421a-f8ed-67a7b6c03747" + }, + "source": [ + "# transpose\n", + "pd.DataFrame(F.T)" + ], + "execution_count": 12, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
01234
020161284
119151173
218141062
31713951
\n", + "
" + ], + "text/plain": [ + " 0 1 2 3 4\n", + "0 20 16 12 8 4\n", + "1 19 15 11 7 3\n", + "2 18 14 10 6 2\n", + "3 17 13 9 5 1" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 12 + } + ] }, { "cell_type": "markdown", @@ -413,13 +1312,176 @@ "metadata": { "id": "ZnqvZBOYqar3", "colab_type": "code", - "colab": {} + "colab": { + "base_uri": "https://localhost:8080/", + "height": 110 + }, + "outputId": "c5fe6328-ac52-41b2-a8a0-a9154da62af1" }, "source": [ - "" + "# Identity Matrix\n", + "I = np.array([[1,0],[0,1]])\n", + "pd.DataFrame(I)" ], - "execution_count": 0, - "outputs": [] + "execution_count": 13, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
01
010
101
\n", + "
" + ], + "text/plain": [ + " 0 1\n", + "0 1 0\n", + "1 0 1" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 13 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "IlA1biNk0XPi", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 110 + }, + "outputId": "5c964153-7424-40ca-a8f1-fc44d93b6461" + }, + "source": [ + "# G matrix\n", + "G = np.array([[13, 14], [21, 12]])\n", + "pd.DataFrame(G)" + ], + "execution_count": 14, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
01
01314
12112
\n", + "
" + ], + "text/plain": [ + " 0 1\n", + "0 13 14\n", + "1 21 12" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 14 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "vgcFhBZm0hai", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 52 + }, + "outputId": "4951a0ec-3516-46dd-dae8-55a43313ff39" + }, + "source": [ + "# Find IG\n", + "np.matmul(I,G)" + ], + "execution_count": 15, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([[13, 14],\n", + " [21, 12]])" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 15 + } + ] }, { "cell_type": "markdown", @@ -451,13 +1513,64 @@ "metadata": { "id": "5QShhoXyrjDS", "colab_type": "code", - "colab": {} + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "outputId": "119c64ae-8c9f-4b76-ac71-52c1bc6337f5" }, "source": [ - "" + "# |H|\n", + "H = np.array([[12,11],[7,10]])\n", + "np.linalg.det(H)" ], - "execution_count": 0, - "outputs": [] + "execution_count": 16, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "43.000000000000014" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 16 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "2_NsBNPC2Oux", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "outputId": "6d366820-c0ef-4dec-9c8c-5142410d1bab" + }, + "source": [ + "# |J|\n", + "J = np.array([[0,1,2],[7,10,4],[3,2,0]])\n", + "np.linalg.det(J)" + ], + "execution_count": 17, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "-19.999999999999996" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 17 + } + ] }, { "cell_type": "markdown", @@ -474,13 +1587,304 @@ "metadata": { "id": "nyX6De2-rio1", "colab_type": "code", - "colab": {} + "colab": { + "base_uri": "https://localhost:8080/", + "height": 110 + }, + "outputId": "f608c35a-ea18-4d17-e00f-b80871835d2b" }, "source": [ - "" + "pd.DataFrame(H)" ], - "execution_count": 0, - "outputs": [] + "execution_count": 18, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
01
01211
1710
\n", + "
" + ], + "text/plain": [ + " 0 1\n", + "0 12 11\n", + "1 7 10" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 18 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "ZcPumHPe2qsf", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 110 + }, + "outputId": "de692457-b85e-4a80-a641-fb8da23e181f" + }, + "source": [ + "# inverse of matrix H\n", + "H_inverse = np.linalg.inv(H)\n", + "pd.DataFrame(H_inverse)" + ], + "execution_count": 19, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
01
00.232558-0.255814
1-0.1627910.279070
\n", + "
" + ], + "text/plain": [ + " 0 1\n", + "0 0.232558 -0.255814\n", + "1 -0.162791 0.279070" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 19 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "ykJrZ0s021u_", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 141 + }, + "outputId": "d163cb7f-735e-4ac9-bdf0-48628322708c" + }, + "source": [ + "pd.DataFrame(J)" + ], + "execution_count": 20, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
012
0012
17104
2320
\n", + "
" + ], + "text/plain": [ + " 0 1 2\n", + "0 0 1 2\n", + "1 7 10 4\n", + "2 3 2 0" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 20 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "V0oR8Dh324Se", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 141 + }, + "outputId": "bf047b75-35fa-43a2-e847-b0bb056eb43c" + }, + "source": [ + "# inverse of matrix J\n", + "J_inverse = np.linalg.inv(J)\n", + "pd.DataFrame(J_inverse)" + ], + "execution_count": 21, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
012
00.4-0.200.80
1-0.60.30-0.70
20.8-0.150.35
\n", + "
" + ], + "text/plain": [ + " 0 1 2\n", + "0 0.4 -0.20 0.80\n", + "1 -0.6 0.30 -0.70\n", + "2 0.8 -0.15 0.35" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 21 + } + ] }, { "cell_type": "markdown", @@ -494,6 +1898,160 @@ "Please ignore Python rounding errors. If necessary, format your output so that it rounds to 5 significant digits (the fifth decimal place)." ] }, + { + "cell_type": "code", + "metadata": { + "id": "6DrSb2283E0D", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 110 + }, + "outputId": "c11929a2-0a02-4efa-ea99-1d1d3986f9cc" + }, + "source": [ + "# Find H * Inverse of H\n", + "H_inverse_H = np.matmul(H, H_inverse)\n", + "pd.DataFrame(H_inverse_H) " + ], + "execution_count": 22, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
01
01.000000e+005.551115e-16
12.220446e-161.000000e+00
\n", + "
" + ], + "text/plain": [ + " 0 1\n", + "0 1.000000e+00 5.551115e-16\n", + "1 2.220446e-16 1.000000e+00" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 22 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "i1DtXJhk31Xx", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 141 + }, + "outputId": "2f039e0c-4568-48b9-9d1a-32da4256e6d1" + }, + "source": [ + "# Find Inverse of J * J\n", + "J_inverse_J = np.matmul(J_inverse, J)\n", + "pd.DataFrame(J_inverse_J)" + ], + "execution_count": 23, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
012
01.000000e+002.220446e-160.0
1-1.110223e-161.000000e+000.0
2-1.665335e-16-1.110223e-161.0
\n", + "
" + ], + "text/plain": [ + " 0 1 2\n", + "0 1.000000e+00 2.220446e-16 0.0\n", + "1 -1.110223e-16 1.000000e+00 0.0\n", + "2 -1.665335e-16 -1.110223e-16 1.0" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 23 + } + ] + }, { "cell_type": "markdown", "metadata": { diff --git a/module2-intermediate-linear-algebra/LS_DS_132_Intermediate_Linear_Algebra_Assignment.ipynb b/module2-intermediate-linear-algebra/LS_DS_132_Intermediate_Linear_Algebra_Assignment.ipynb index 9110b2b1..7d048f57 100644 --- a/module2-intermediate-linear-algebra/LS_DS_132_Intermediate_Linear_Algebra_Assignment.ipynb +++ b/module2-intermediate-linear-algebra/LS_DS_132_Intermediate_Linear_Algebra_Assignment.ipynb @@ -36,16 +36,195 @@ { "cell_type": "code", "metadata": { - "id": "w1iZfYvBtEA1", + "id": "aftHYRQOSltA", "colab_type": "code", "colab": {} }, "source": [ - "" + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import random\n", + "import math" + ], + "execution_count": 2, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "ngZqSHZhzPcp", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# the list\n", + "sales = [3505, 2400, 3027, 2798, 3700, 3250, 2689]" + ], + "execution_count": 3, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "D63nEIjNzauk", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "outputId": "3b910f46-dce2-45df-ddb9-ee3b5b44b624" + }, + "source": [ + "# find the mean\n", + "total = sum(sales)\n", + "mean_sales = total/len(sales)\n", + "print(\"mean sales: \", mean_sales)" + ], + "execution_count": 4, + "outputs": [ + { + "output_type": "stream", + "text": [ + "mean sales: 3052.714285714286\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "zphV3FlDzqUV", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "outputId": "f2724779-d7d0-49d5-a002-1261603edce8" + }, + "source": [ + "# variance\n", + "# function \n", + "def subtract_mean(number):\n", + " return number-mean_sales\n", + "\n", + "# Converted to lambda for efficiency:\n", + "lambda x: x-mean_sales" + ], + "execution_count": 5, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + ">" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 5 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "QPGGV7LG0jbW", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# apply function to our list using 'map'\n", + "distances = list(map(subtract_mean, sales))" + ], + "execution_count": 6, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "G1OsB4b71UBy", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# square & sum all of the distances\n", + "squared_distances = list(map(lambda x: x**2, distances))" + ], + "execution_count": 7, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "Rqvsln9O1hBM", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# length of the list\n", + "list_length=len(squared_distances)" ], - "execution_count": 0, + "execution_count": 8, "outputs": [] }, + { + "cell_type": "code", + "metadata": { + "id": "L6LMtC461tuG", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "outputId": "47a3199c-f57d-4783-dce1-514890521219" + }, + "source": [ + "# Calculate the variance\n", + "variance_sales = sum(squared_distances)/list_length\n", + "print('{:.2f}'.format(variance_sales,3))" + ], + "execution_count": 9, + "outputs": [ + { + "output_type": "stream", + "text": [ + "183761.06\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "IUPxIQgb2Vu8", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 52 + }, + "outputId": "fc4867a1-9b96-4a29-ecf8-aa87fdf76845" + }, + "source": [ + "# calculate the standard deviation\n", + "print('{:.2f}'.format(math.sqrt(variance_sales))) # math\n", + "print('{:.2f}'.format(np.sqrt(variance_sales))) # numpy" + ], + "execution_count": 10, + "outputs": [ + { + "output_type": "stream", + "text": [ + "428.67\n", + "428.67\n" + ], + "name": "stdout" + } + ] + }, { "cell_type": "markdown", "metadata": { @@ -59,16 +238,43 @@ { "cell_type": "code", "metadata": { - "id": "G7ZB0krot564", + "id": "9RKujHS73QML", "colab_type": "code", "colab": {} }, "source": [ - "" + "# make customer list\n", + "customers = [127, 80, 105, 92, 120, 115, 93]" ], - "execution_count": 0, + "execution_count": 11, "outputs": [] }, + { + "cell_type": "code", + "metadata": { + "id": "WONoDx7N3U-8", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "outputId": "a2a807f1-9443-4a54-a070-fa10199f434b" + }, + "source": [ + "# covariance\n", + "print('{:.2f}'.format(np.cov(sales, customers)[0][1]))" + ], + "execution_count": 12, + "outputs": [ + { + "output_type": "stream", + "text": [ + "7604.36\n" + ], + "name": "stdout" + } + ] + }, { "cell_type": "markdown", "metadata": { @@ -82,217 +288,1541 @@ { "cell_type": "code", "metadata": { - "id": "vFJms2YRrKhY", + "id": "_0xYAwPi6Til", "colab_type": "code", "colab": {} }, "source": [ - "" + "df = pd.DataFrame({\"sales\": sales})\n", + "df['customers'] = pd.Series(customers)" ], - "execution_count": 0, + "execution_count": 13, "outputs": [] }, { - "cell_type": "markdown", + "cell_type": "code", "metadata": { - "id": "IbZVf7nmujPJ", - "colab_type": "text" + "id": "_Eq8HSDn57JB", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 52 + }, + "outputId": "b318a4e3-8397-4984-f6fc-8ec8acd3de0b" }, "source": [ - "## 1.4 Use pandas to import a cleaned version of the titanic dataset from the following link: [Titanic Dataset](https://raw.githubusercontent.com/Geoyi/Cleaning-Titanic-Data/master/titanic_clean.csv)\n", - "\n", - "## Calculate the variance-covariance matrix and correlation matrix for the titanic dataset's numeric columns. (you can encode some of the categorical variables and include them as a stretch goal if you finish early)" + "# calculate the standard deviation of both lists\n", + "std_s = df['sales'].std(ddof=1)\n", + "std_c = df['customers'].std(ddof=1)\n", + "print('{:.4f}'.format(std_s))\n", + "print('{:.4f}'.format(std_c))" + ], + "execution_count": 14, + "outputs": [ + { + "output_type": "stream", + "text": [ + "463.0204\n", + "17.0573\n" + ], + "name": "stdout" + } ] }, { "cell_type": "code", "metadata": { - "id": "0TWgUIiaCFzq", + "id": "tkdRO6Dj7T8L", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "outputId": "6e6219ac-17aa-45ef-f027-6af164cb03f8" + }, + "source": [ + "# Covariance using pandas\n", + "cov_sc = df['sales'].cov(df['customers'])\n", + "print('{:.4f}'.format(cov_sc))" + ], + "execution_count": 15, + "outputs": [ + { + "output_type": "stream", + "text": [ + "7604.3571\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "eaR3GFZa7lxh", "colab_type": "code", "colab": {} }, "source": [ - "" + "# calculate the denominator\n", + "denom = std_s*std_c" ], - "execution_count": 0, + "execution_count": 16, "outputs": [] }, { - "cell_type": "markdown", + "cell_type": "code", "metadata": { - "id": "7K0Xfh8MvYkl", - "colab_type": "text" + "id": "IH-9b8vj7seG", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "outputId": "f0bbd10c-a83b-44ce-e5e2-5cd82513876d" }, "source": [ - "# Orthogonality" + "# calculate the correlation\n", + "corr_sc = cov_sc/denom\n", + "print('{:.2f}'.format(corr_sc))" + ], + "execution_count": 17, + "outputs": [ + { + "output_type": "stream", + "text": [ + "0.96\n" + ], + "name": "stdout" + } ] }, { - "cell_type": "markdown", + "cell_type": "code", "metadata": { - "id": "Pe3eOZ2fvdZ-", - "colab_type": "text" + "id": "1ZSZcLaE75Os", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "outputId": "7ca7c93d-8898-46bc-ec9f-a31994746837" }, "source": [ - "## 2.1 Plot two vectors that are orthogonal to each other. What is a synonym for orthogonal?" + "# check the answer using pandas\n", + "print('{:2f}'.format(df['sales'].corr(df['customers'])))" + ], + "execution_count": 18, + "outputs": [ + { + "output_type": "stream", + "text": [ + "0.962834\n" + ], + "name": "stdout" + } ] }, { "cell_type": "code", "metadata": { - "id": "YLSBk7hJvvCx", + "id": "GY90gXr38OVm", "colab_type": "code", - "colab": {} + "colab": { + "base_uri": "https://localhost:8080/", + "height": 110 + }, + "outputId": "99531b66-7415-403b-a793-58667456d50f" }, "source": [ - "" + "# but this is even shorter\n", + "df.corr()" ], - "execution_count": 0, - "outputs": [] + "execution_count": 19, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
salescustomers
sales1.0000000.962834
customers0.9628341.000000
\n", + "
" + ], + "text/plain": [ + " sales customers\n", + "sales 1.000000 0.962834\n", + "customers 0.962834 1.000000" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 19 + } + ] }, { "cell_type": "markdown", "metadata": { - "id": "7AS4V1Nhvvxz", + "id": "IbZVf7nmujPJ", "colab_type": "text" }, "source": [ - "## 2.2 Are the following vectors orthogonal? Why or why not?\n", + "## 1.4 Use pandas to import a cleaned version of the titanic dataset from the following link: [Titanic Dataset](https://raw.githubusercontent.com/Geoyi/Cleaning-Titanic-Data/master/titanic_clean.csv)\n", "\n", - "\\begin{align}\n", - "a = \\begin{bmatrix} -5 \\\\ 3 \\\\ 7 \\end{bmatrix}\n", - "\\qquad\n", - "b = \\begin{bmatrix} 6 \\\\ -8 \\\\ 2 \\end{bmatrix}\n", - "\\end{align}" + "## Calculate the variance-covariance matrix and correlation matrix for the titanic dataset's numeric columns. (you can encode some of the categorical variables and include them as a stretch goal if you finish early)" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "0TWgUIiaCFzq", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 193 + }, + "outputId": "e94e9c13-6412-4ec9-e239-e67600db7e27" + }, + "source": [ + "titanic = pd.read_csv('https://raw.githubusercontent.com/Geoyi/Cleaning-Titanic-Data/master/titanic_clean.csv')\n", + "titanic.head(3)" + ], + "execution_count": 20, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Unnamed: 0pclasssurvivednamesexagesibspparchticketfarecabinembarkedboatbodyhome.desthas_cabin_number
011.01.0Allen, Miss. Elisabeth Waltonfemale29.00000.00.024160211.3375B5S2NaNSt Louis, MO1
121.01.0Allison, Master. Hudson Trevormale0.91671.02.0113781151.5500C22 C26S11NaNMontreal, PQ / Chesterville, ON1
231.00.0Allison, Miss. Helen Lorainefemale2.00001.02.0113781151.5500C22 C26SNaNNaNMontreal, PQ / Chesterville, ON1
\n", + "
" + ], + "text/plain": [ + " Unnamed: 0 pclass ... home.dest has_cabin_number\n", + "0 1 1.0 ... St Louis, MO 1\n", + "1 2 1.0 ... Montreal, PQ / Chesterville, ON 1\n", + "2 3 1.0 ... Montreal, PQ / Chesterville, ON 1\n", + "\n", + "[3 rows x 16 columns]" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 20 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "fX0tkNQh8tKt", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 325 + }, + "outputId": "8bc6a03b-886d-442c-a318-bd6cf0fc00bf" + }, + "source": [ + "# calculate the covariance for the entire dataset\n", + "titanic.cov()" + ], + "execution_count": 21, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Unnamed: 0pclasssurvivedagesibspparchfarebodyhas_cabin_number
Unnamed: 0143117.500000284.357034-53.967125-1442.93981225.8287461.172783-9410.735123591.579132-95.438885
pclass284.3570340.701969-0.127248-3.9546050.0530900.013287-24.227788-2.876653-0.249992
survived-53.967125-0.1272480.236250-0.314343-0.0140880.0347766.1460230.0000000.061406
age-1442.939812-3.954605-0.314343165.850021-2.559806-1.459378114.41661381.6229221.463138
sibsp25.8287460.053090-0.014088-2.5598061.0850520.3368338.641768-8.708471-0.003946
parch1.1727830.0132870.034776-1.4593780.3368330.7491959.9280314.2371900.013316
fare-9410.735123-24.2277886.146023114.4166138.6417689.9280312678.959738-179.16468410.976961
body591.579132-2.8766530.00000081.622922-8.7084714.237190-179.1646849544.6885673.625689
has_cabin_number-95.438885-0.2499920.0614061.463138-0.0039460.01331610.9769613.6256890.174613
\n", + "
" + ], + "text/plain": [ + " Unnamed: 0 pclass ... body has_cabin_number\n", + "Unnamed: 0 143117.500000 284.357034 ... 591.579132 -95.438885\n", + "pclass 284.357034 0.701969 ... -2.876653 -0.249992\n", + "survived -53.967125 -0.127248 ... 0.000000 0.061406\n", + "age -1442.939812 -3.954605 ... 81.622922 1.463138\n", + "sibsp 25.828746 0.053090 ... -8.708471 -0.003946\n", + "parch 1.172783 0.013287 ... 4.237190 0.013316\n", + "fare -9410.735123 -24.227788 ... -179.164684 10.976961\n", + "body 591.579132 -2.876653 ... 9544.688567 3.625689\n", + "has_cabin_number -95.438885 -0.249992 ... 3.625689 0.174613\n", + "\n", + "[9 rows x 9 columns]" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 21 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "gn5YOQzM82dr", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 325 + }, + "outputId": "7f86b624-0aaa-41e0-b0cf-7efe87f8fe45" + }, + "source": [ + "titanic.corr()" + ], + "execution_count": 22, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Unnamed: 0pclasssurvivedagesibspparchfarebodyhas_cabin_number
Unnamed: 01.0000000.897822-0.293717-0.2961720.0655940.003584-0.4812150.015558-0.603727
pclass0.8978221.000000-0.312469-0.3663700.0608320.018322-0.558629-0.034642-0.713857
survived-0.293717-0.3124691.000000-0.050199-0.0278250.0826600.244265NaN0.302250
age-0.296172-0.366370-0.0501991.000000-0.190747-0.1308720.1718920.0590590.271887
sibsp0.0655940.060832-0.027825-0.1907471.0000000.3735870.160238-0.099961-0.009064
parch0.0035840.0183220.082660-0.1308720.3735871.0000000.2215390.0510990.036806
fare-0.481215-0.5586290.2442650.1718920.1602380.2215391.000000-0.0431100.507253
body0.015558-0.034642NaN0.059059-0.0999610.051099-0.0431101.0000000.083796
has_cabin_number-0.603727-0.7138570.3022500.271887-0.0090640.0368060.5072530.0837961.000000
\n", + "
" + ], + "text/plain": [ + " Unnamed: 0 pclass ... body has_cabin_number\n", + "Unnamed: 0 1.000000 0.897822 ... 0.015558 -0.603727\n", + "pclass 0.897822 1.000000 ... -0.034642 -0.713857\n", + "survived -0.293717 -0.312469 ... NaN 0.302250\n", + "age -0.296172 -0.366370 ... 0.059059 0.271887\n", + "sibsp 0.065594 0.060832 ... -0.099961 -0.009064\n", + "parch 0.003584 0.018322 ... 0.051099 0.036806\n", + "fare -0.481215 -0.558629 ... -0.043110 0.507253\n", + "body 0.015558 -0.034642 ... 1.000000 0.083796\n", + "has_cabin_number -0.603727 -0.713857 ... 0.083796 1.000000\n", + "\n", + "[9 rows x 9 columns]" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 22 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "7K0Xfh8MvYkl", + "colab_type": "text" + }, + "source": [ + "# Orthogonality" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Pe3eOZ2fvdZ-", + "colab_type": "text" + }, + "source": [ + "## 2.1 Plot two vectors that are orthogonal to each other. What is a synonym for orthogonal?" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "YLSBk7hJvvCx", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# The synonym for orthogonal is perpendicular - but perpendicular only relateds\n", + "# to a 2-dimensional plane. Orthogonal goes beyond 2-D in to 3-D and beyond.\n", + "\n", + "r = [4, 4]\n", + "h = [3, -3]" + ], + "execution_count": 23, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "pUHfAejC9w1-", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 324 + }, + "outputId": "9290a1d7-f8d3-452a-d4e1-b5fc9ffeb700" + }, + "source": [ + "# plot the vectors\n", + "fig, ax = plt.subplots(figsize=(5,5))\n", + "ax.grid()\n", + "plt.xlim(-4,5)\n", + "plt.ylim(-4,5)\n", + "\n", + "for vect in [r, h]:\n", + " plt.arrow(0,0, vect[0], vect[1],\n", + " head_width=.2,\n", + " head_length=.2,\n", + " linewidth=3)\n", + "plt.show()" + ], + "execution_count": 24, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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1Qs5+FS1FsCDAJYA2ASgUFU3hLpeig2tWrVCTk5O0Prx48cNTERk0wnMqvoRgI/sWBfFptra2oBz+VJSUngCMxnBLxQnR8THx6Ouri6g3rZtWxw6dMjARORmDD5yTFxcHHw+X0C9Q4cOOHDggIGJyK0YfOQoEQkafmlpafj2228NTERuxOAjx50KvzMvWevWrRt27drVyG8R2YfBR0aICLxeL7p06WKp9+jRA9u2bTM0FbkFg4+M2rt3b8ClbRdffDG2bNliaCJyAwYfGbd169aA787NyspCSUmJoYko1jH4KCKsWbMG1113naXWt29f/Oc//zE0EcUyBh9FjBUrVuDmm2+21K688kqsXr3a0EQUqxh8FFH+8Y9/YOTIkZba1VdfjRUrVhiaiGIRg48izvvvv48xY8ZYagMHDsSyZcsMTUSxhsFHEemNN97A/fffb6nddNNNWLRokaGJKJYw+ChizZo1C48++qilduutt+L99983NBHFCgYfRbQXXngBTz75pKV2++234+233zY0EcUCBh9FvN///veYPHmypfaLX/wCs2fPNjQRRTsGH0WF3/3ud5g2bZqldu+992LmzJmGJqJoxuCjqPHII49g1qxZltqDDz6IgoICQxNRtGLwUVS5//77MWfOHEvt8ccfx7PPPmtoIopGDD6KOmPHjsXcuXMttaeeegoTJ040NBFFGwYfRaU777wT8+fPt9SmTJmCcePGGZqIogmDj6LWbbfdho8+sn7H1Ysvvoj77rvP0EQULUIKPhEZJSIbRMQnIk1/ezmRzW655Rb885//tNRee+013HXXXYYmomgQ6hZfCYCRAHgFORkzaNAgrFy50lKbO3cuRowYYWgiinQhBZ+qblLVzXYNQ3S+BgwYgH//+9+W2sKFC3knZwqKn/FRzLjqqquwdu1aS+3YsWO4+uqrDU1EkUpU9ewLiCwD0DXIS0+o6gL/MssBjFfVorOsJx9APgCkpaXlFBYWnu/MIfF6vUhJSWHvGO5dVVWFDRs2AAAyMjJQXl6OVq1aITs727EZAHe955HSOy8vr1hVmz7eoKohPwAsB5Db3OUzMzPVFI/Hw94u6L1lyxYFoAUFBQpAAeiFF17o6Axue88joTeAIm1GBnFXl2JS7969sX37dktt586d6Nixo6GJKJKEejrLT0SkHMA1AP4uIkvsGYsodD17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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "PyCMOKvI_I0T", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "outputId": "a5994126-8ff3-4af4-a528-84a791ad2eed" + }, + "source": [ + "r = np.array(r)\n", + "h = np.array(h)\n", + "np.dot(r,h)\n", + "\n", + "# the vectors (r & h) are orthogonal" + ], + "execution_count": 25, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "0" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 25 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "7AS4V1Nhvvxz", + "colab_type": "text" + }, + "source": [ + "## 2.2 Are the following vectors orthogonal? Why or why not?\n", + "\n", + "\\begin{align}\n", + "a = \\begin{bmatrix} -5 \\\\ 3 \\\\ 7 \\end{bmatrix}\n", + "\\qquad\n", + "b = \\begin{bmatrix} 6 \\\\ -8 \\\\ 2 \\end{bmatrix}\n", + "\\end{align}" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "F_-y54YSz47k", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "outputId": "e5c67bb0-3f8c-4d51-c8c9-28e826b811bf" + }, + "source": [ + "a = np.array([-5, 3, 7])\n", + "b = np.array([6, -8, 2])\n", + "np.dot(a,b)\n", + "# No, vectors a & b are not orthogonal. \n", + "# The dot product of these vectors is not equal to 0." + ], + "execution_count": 26, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "-40" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 26 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "MiNjyqiEz5SG", + "colab_type": "text" + }, + "source": [ + "## 2.3 Compute the following values: What do these quantities have in common?\n", + "\n", + "## What is $||c||^2$? \n", + "\n", + "## What is $c \\cdot c$? \n", + "\n", + "## What is $c^{T}c$?\n", + "\n", + "\\begin{align}\n", + "c = \\begin{bmatrix} 2 & -15 & 6 & 20 \\end{bmatrix}\n", + "\\end{align}" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "IlV_uaYK1EQB", + "colab_type": "code", + "colab": {} + }, + "source": [ + "c = [2, -15, 6, 20]" + ], + "execution_count": 29, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "_QR8cvdUEC_w", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "outputId": "9f8efd89-909a-4289-830b-9edfda78a34d" + }, + "source": [ + "# ||c||^2\n", + "(2**2) + (-15**2) + (6**2) + (20**2)" + ], + "execution_count": 27, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "215" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 27 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "zr6cLkIYEYJv", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "outputId": "3843406c-2993-498c-cc48-5ecb6a22c9ff" + }, + "source": [ + "np.matmul(c, c)" + ], + "execution_count": 61, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "665" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 61 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Z7lOEd0qEldJ", + "colab_type": "code", + "colab": {} + }, + "source": [ + "c = np.array([2, -15, 6, 20])\n", + "\n", + "pd.DataFrame(c)\n", + "t = pd.DataFrame(c.T)" + ], + "execution_count": 62, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "lJXnoQaRF2wf", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 87 + }, + "outputId": "9cac6a83-2db0-4d50-8724-5f9ebddff0af" + }, + "source": [ + "t = np.array(t)\n", + "t" + ], + "execution_count": 67, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([[ 2],\n", + " [-15],\n", + " [ 6],\n", + " [ 20]])" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 67 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Bm30-FR0E-gz", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "outputId": "1a8e544b-a041-46f5-a80a-f8f22edbe269" + }, + "source": [ + "np.matmul(c, t)" + ], + "execution_count": 68, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([665])" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 68 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "MK_TpWqk1Evk", + "colab_type": "text" + }, + "source": [ + "# Unit Vectors" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Kpit6WWO1b8l", + "colab_type": "text" + }, + "source": [ + "## 3.1 Using Latex, write the following vectors as a linear combination of \n", + "\n", + "---\n", + "\n", + "scalars and unit vectors:\n", + "\n", + "\n", + "\n", + "\\begin{align}\n", + "d = \\begin{bmatrix} 7 \\\\ 12 \\end{bmatrix}\n", + "\\qquad\n", + "e = \\begin{bmatrix} 2 \\\\ 11 \\\\ -8 \\end{bmatrix}\n", + "\\end{align}" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "oBCj1sDW2ouC", + "colab_type": "text" + }, + "source": [ + "*Your* text here" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "rrSdbfXVbMZY", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "outputId": "72bff46d-cf7b-4aed-e390-adcc33663a1c" + }, + "source": [ + "# find the norm of d\n", + "d = np.array([7, 12])\n", + "norm_d = np.linalg.norm(d)\n", + "print('{:.4f}'.format(norm_d))" + ], + "execution_count": 31, + "outputs": [ + { + "output_type": "stream", + "text": [ + "13.8924\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Aqf66uYEdR_k", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "outputId": "e3cc77c3-2b75-42b2-cf7d-9efb2a4e5f66" + }, + "source": [ + "# unit vector of d\n", + "d_hat = d/np.linalg.norm(d)\n", + "print(d_hat)" + ], + "execution_count": 32, + "outputs": [ + { + "output_type": "stream", + "text": [ + "[0.50387103 0.8637789 ]\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "JTrolISsdiov", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "outputId": "38cd7b79-190f-4ddc-eb4a-934087bdf450" + }, + "source": [ + "# linear combination of d's scalar and unit vector\n", + "norm_d * d_hat" + ], + "execution_count": 34, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([ 7., 12.])" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 34 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "EoaFKNRPeUxo", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "outputId": "9569a3e7-c95b-40a9-a7e4-15e9891d2fa2" + }, + "source": [ + "# find the norm of e\n", + "e = np.array([2, 11, -8])\n", + "norm_e = np.linalg.norm(e)\n", + "print('{:.4f}'.format(norm_e))" + ], + "execution_count": 35, + "outputs": [ + { + "output_type": "stream", + "text": [ + "13.7477\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "8TJ9mJ5genD3", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "outputId": "fd8166c8-6078-4423-d08c-35f4ac895923" + }, + "source": [ + "# unit vector of e\n", + "e_hat = e/np.linalg.norm(e)\n", + "print(e_hat)" + ], + "execution_count": 36, + "outputs": [ + { + "output_type": "stream", + "text": [ + "[ 0.14547859 0.80013226 -0.58191437]\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "KmBz4PsxeujS", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "outputId": "37457545-c768-47bd-aeb4-826da56d9261" + }, + "source": [ + "# linear combination\n", + "norm_e * e_hat" + ], + "execution_count": 37, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([ 2., 11., -8.])" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 37 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "dAdUQuep1_yJ", + "colab_type": "text" + }, + "source": [ + "## 3.2 Turn vector $f$ into a unit vector:\n", + "\n", + "\\begin{align}\n", + "f = \\begin{bmatrix} 4 & 12 & 11 & 9 & 2 \\end{bmatrix}\n", + "\\end{align}" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "I3W8ZiHR1_Fa", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "outputId": "da0189be-5726-4efd-fc20-1ec0482cc093" + }, + "source": [ + "# f as an array\n", + "f = np.array([4, 12, 11, 9, 2])\n", + "f" + ], + "execution_count": 38, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([ 4, 12, 11, 9, 2])" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 38 + } ] }, { "cell_type": "code", "metadata": { - "id": "F_-y54YSz47k", + "id": "aG7PnzKPfCzo", "colab_type": "code", - "colab": {} + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "outputId": "b788d51e-93a7-4194-ec4a-48ec44659ffe" }, "source": [ - "" + "# norm\n", + "norm_f = np.linalg.norm(f)\n", + "print('{:.4f}'.format(norm_f))" ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "MiNjyqiEz5SG", - "colab_type": "text" - }, - "source": [ - "## 2.3 Compute the following values: What do these quantities have in common?\n", - "\n", - "## What is $||c||^2$? \n", - "\n", - "## What is $c \\cdot c$? \n", - "\n", - "## What is $c^{T}c$?\n", - "\n", - "\\begin{align}\n", - "c = \\begin{bmatrix} 2 & -15 & 6 & 20 \\end{bmatrix}\n", - "\\end{align}" + "execution_count": 40, + "outputs": [ + { + "output_type": "stream", + "text": [ + "19.1311\n" + ], + "name": "stdout" + } ] }, { "cell_type": "code", "metadata": { - "id": "IlV_uaYK1EQB", + "id": "Mf6aP_HXfQZf", "colab_type": "code", - "colab": {} + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "outputId": "e3887049-164d-466f-d116-ed98d516b939" }, "source": [ - "" + "# unit vector\n", + "f_hat = f/np.linalg.norm(f)\n", + "print(f_hat)" ], - "execution_count": 0, - "outputs": [] + "execution_count": 41, + "outputs": [ + { + "output_type": "stream", + "text": [ + "[0.20908335 0.62725005 0.57497921 0.47043754 0.10454167]\n" + ], + "name": "stdout" + } + ] }, { "cell_type": "markdown", "metadata": { - "id": "MK_TpWqk1Evk", + "id": "o39UyP-I5lpP", "colab_type": "text" }, "source": [ - "# Unit Vectors" + "# Linear Independence / Dependence " ] }, { "cell_type": "markdown", "metadata": { - "id": "Kpit6WWO1b8l", + "id": "ajfBqYe45sT5", "colab_type": "text" }, "source": [ - "## 3.1 Using Latex, write the following vectors as a linear combination of scalars and unit vectors:\n", - "\n", - "\\begin{align}\n", - "d = \\begin{bmatrix} 7 \\\\ 12 \\end{bmatrix}\n", - "\\qquad\n", - "e = \\begin{bmatrix} 2 \\\\ 11 \\\\ -8 \\end{bmatrix}\n", - "\\end{align}" + "## 4.1 Plot two vectors that are linearly dependent and two vectors that are linearly independent (bonus points if done in $\\mathbb{R}^3$)." ] }, { - "cell_type": "markdown", + "cell_type": "code", "metadata": { - "id": "oBCj1sDW2ouC", - "colab_type": "text" + "id": "8F1a9HrPfjQX", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 52 + }, + "outputId": "4776a58c-d545-4cca-c950-bba42bb58d9a" }, "source": [ - "Your text here" + "# linearly dependent vectors\n", + "vector_1 = [-1, 2]\n", + "vector_2 = np.multiply(vector_1, 2)\n", + "print(vector_1, '\\n', vector_2)" + ], + "execution_count": 42, + "outputs": [ + { + "output_type": "stream", + "text": [ + "[-1, 2] \n", + " [-2 4]\n" + ], + "name": "stdout" + } ] }, { - "cell_type": "markdown", + "cell_type": "code", "metadata": { - "id": "dAdUQuep1_yJ", - "colab_type": "text" + "id": "ppcqs3m-fzw6", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 324 + }, + "outputId": "3070ba43-3bfe-491a-acba-bbc5092a883e" }, "source": [ - "## 3.2 Turn vector $f$ into a unit vector:\n", + "# plot the linearly dependent vectors\n", + "fig, ax = plt.subplots(figsize=(5,5))\n", + "ax.grid()\n", + "plt.xlim(-4, 4)\n", + "plt.ylim(-4,4)\n", "\n", - "\\begin{align}\n", - "f = \\begin{bmatrix} 4 & 12 & 11 & 9 & 2 \\end{bmatrix}\n", - "\\end{align}" + "for myvect, mycolor, width in [(vector_1, 'cyan', 15), (vector_2, 'crimson', 5)]:\n", + " plt.arrow(0,0,\n", + " myvect[0],\n", + " myvect[1],\n", + " head_width=.2,\n", + " head_length=.2,\n", + " linewidth=width,\n", + " color=mycolor)" + ], + "execution_count": 45, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } ] }, { "cell_type": "code", "metadata": { - "id": "I3W8ZiHR1_Fa", + "id": "KOqI4O3rgk42", "colab_type": "code", - "colab": {} + "colab": { + "base_uri": "https://localhost:8080/", + "height": 52 + }, + "outputId": "8779b37c-04fc-4a46-ecae-941577433672" }, "source": [ - "" + "# linearly independent vectors\n", + "vector_1 = np.random.randint(low=-2, high=2, size=2)\n", + "vector_2 = np.random.randint(low=-2, high=2, size=2)\n", + "print(vector_1, '\\n', vector_2)" ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "o39UyP-I5lpP", - "colab_type": "text" - }, - "source": [ - "# Linear Independence / Dependence " + "execution_count": 46, + "outputs": [ + { + "output_type": "stream", + "text": [ + "[-2 0] \n", + " [1 1]\n" + ], + "name": "stdout" + } ] }, { - "cell_type": "markdown", + "cell_type": "code", "metadata": { - "id": "ajfBqYe45sT5", - "colab_type": "text" + "id": "rT7mpP3Wg4Y5", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 269 + }, + "outputId": "f3f0251a-67d7-46c6-d90b-e409ff4c1994" }, "source": [ - "## 4.1 Plot two vectors that are linearly dependent and two vectors that are linearly independent (bonus points if done in $\\mathbb{R}^3$)." + "fig, ax = plt.subplots(figsize=(4,4))\n", + "ax.grid()\n", + "plt.xlim(-3,3) \n", + "plt.ylim(-3,3)\n", + "\n", + "for myvect, mycolor, width in [(vector_1, 'cyan', 15), (vector_2, 'crimson', 5)]:\n", + " plt.arrow(0,0,\n", + " myvect[0],\n", + " myvect[1],\n", + " head_width=.2,\n", + " linewidth=width,\n", + " color=mycolor)" + ], + "execution_count": 47, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } ] }, { @@ -329,9 +1859,11 @@ "colab": {} }, "source": [ - "" + "# a[1 2] + b[4 8]\n", + "# The span of g and h are all possible linear combinations \n", + "# Linear combinations = all possible values of a and b" ], - "execution_count": 0, + "execution_count": null, "outputs": [] }, { @@ -360,9 +1892,9 @@ "colab": {} }, "source": [ - "" + "# a[1 2 3] + b[-1 0 7] + c[4 8 2]" ], - "execution_count": 0, + "execution_count": null, "outputs": [] }, { @@ -391,13 +1923,40 @@ "metadata": { "id": "utvF3Pkt8NP6", "colab_type": "code", - "colab": {} + "colab": { + "base_uri": "https://localhost:8080/", + "height": 281 + }, + "outputId": "6506e8bd-774f-42c3-b6f3-86afabdab9ed" }, "source": [ - "" + "# basis vectors\n", + "vector_1 = [-1, 1]\n", + "vector_2 = [1, 1]\n", + "\n", + "plt.arrow(0,0, vector_1[0], vector_1[1], head_width=.05, head_length=.05, color = 'blue')\n", + "plt.arrow(0,0, vector_2[0], vector_2[1], head_width=.05, head_length=.05, color = 'red')\n", + "plt.xlim(-2,2)\n", + "plt.ylim(-1,2)\n", + "plt.title(\"Basis for R^2\")\n", + "plt.show()" ], - "execution_count": 0, - "outputs": [] + "execution_count": 49, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] }, { "cell_type": "markdown", @@ -447,6 +2006,38 @@ "\\end{align}" ] }, + { + "cell_type": "code", + "metadata": { + "id": "5WvSm_XZo5dj", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "outputId": "839e2398-265a-4ee5-cd13-5c0209851836" + }, + "source": [ + "# the rank of P is 3\n", + "P = np.array([[1, 2, 3], [-1, 0, 7], [4, 8, 2]])\n", + "np.linalg.matrix_rank(P)" + ], + "execution_count": 50, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "3" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 50 + } + ] + }, { "cell_type": "markdown", "metadata": { @@ -464,7 +2055,8 @@ "colab_type": "text" }, "source": [ - "" + "\n", + "Rank tells us the number of linearly independent vectors in the row space of a matrix and by extension the space of R^n that is spanned by the vectors of the matrix.\n" ] }, { @@ -498,11 +2090,161 @@ "colab": {} }, "source": [ - "" + "v = np.array([1,3])\n", + "w = np.array([-1, 2])" + ], + "execution_count": 51, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "50uhJupKps0q", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# dot product\n", + "w_dot_v = np.dot(v,w)\n", + "v_dot_v = np.dot(v, v)" + ], + "execution_count": 52, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "zV9dTucbp0gV", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "outputId": "e59f4928-08db-4743-ea2f-622f703ad5d0" + }, + "source": [ + "# projection\n", + "fraction = w_dot_v/v_dot_v\n", + "projection = np.multiply(fraction,v)\n", + "print(projection)" + ], + "execution_count": 53, + "outputs": [ + { + "output_type": "stream", + "text": [ + "[0.5 1.5]\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "OHsrQAeFp-HO", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 269 + }, + "outputId": "3c3fcd45-d6e5-4549-9641-0fd7904fa11a" + }, + "source": [ + "# plot\n", + "plt.xlim(-1,4)\n", + "plt.ylim(-1,4)\n", + "axes = plt.gca()" + ], + "execution_count": 55, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXYAAAD8CAYAAABjAo9vAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAJzUlEQVR4nO3c0Ytmd33H8c+3uyuRaPGiA5VsIF5IQhCa4BAsuZGlwhpFaaGQgF4Je1MhgiBKr/wHxBtvFg0KikFQqKSWEHElCDY6G6NkswaCtLgi7IiI5iYS/fZiBmYrm+7sPCd70u+8XvDAPDPn+Z0vh533Hs5z5qnuDgBz/NXaAwCwLGEHGEbYAYYRdoBhhB1gGGEHGGaxsFfViar6SVU9sdSaANy8Jc/YH01yecH1ADiCRcJeVaeTfCDJF5dYD4CjO7nQOp9P8qkkb32tDarqXJJzSXL77be/+5577llo1wDHw8WLF3/T3Vs32m7jsFfVB5Nc7e6LVfXe19quu88nOZ8k29vbvbOzs+muAY6Vqvrvw2y3xKWYB5N8qKr+K8njSc5U1VcXWBeAI9g47N39me4+3d13JXk4yfe6+yMbTwbAkbiPHWCYpd48TZJ09/eTfH/JNQG4Oc7YAYYRdoBhhB1gGGEHGEbYAYYRdoBhhB1gGGEHGEbYAYYRdoBhhB1gGGEHGEbYAYYRdoBhhB1gGGEHGEbYAYYRdoBhhB1gGGEHGEbYAYYRdoBhhB1gGGEHGEbYAYYRdoBhhB1gGGEHGEbYAYYRdoBhhB1gGGEHGEbYAYYRdoBhhB1gmI3DXlW3VdWPquqnVXWpqj67xGAAHM3JBdZ4JcmZ7n65qk4l+UFV/Ud3/+cCawNwkzYOe3d3kpf3n57af/Sm6wJwNItcY6+qE1X1XJKrSZ7q7meus825qtqpqp3d3d0ldgvAdSwS9u7+U3ffl+R0kgeq6l3X2eZ8d2939/bW1tYSuwXgOha9K6a7f5fkQpKzS64LwOEtcVfMVlW9bf/rNyd5X5Kfb7ouAEezxF0xb0/ylao6kb3/KL7R3U8ssC4AR7DEXTE/S3L/ArMAsAB/eQowjLADDCPsAMMIO8Awwg4wjLADDCPsAMMIO8Awwg4wjLADDCPsAMMIO8Awwg4wjLADDCPsAMMIO8Awwg4wjLADDCPsAMMIO8Awwg4wjLADDCPsAMMIO8Awwg4wjLADDCPsAMMIO8Awwg4wjLADDCPsAMMIO8Awwg4wjLADDLNx2Kvqzqq6UFUvVNWlqnp0icEAOJqTC6zxapJPdvezVfXWJBer6qnufmGBtQG4SRufsXf3r7v72f2v/5DkcpI7Nl0XgKNZ9Bp7Vd2V5P4kz1znZ+eqaqeqdnZ3d5fcLQDXWCzsVfWWJN9M8onu/v1f/ry7z3f3dndvb21tLbVbAP7CImGvqlPZi/rXuvtbS6wJwNEscVdMJflSksvd/bnNRwJgE0ucsT+Y5KNJzlTVc/uPhxZYF4Aj2Ph2x+7+QZJaYBYAFuAvTwGGEXaAYYQdYBhhBxhG2AGGEXaAYYQdYBhhBxhG2AGGEXaAYYQdYBhhBxhG2AGGEXaAYYQdYBhhBxhG2AGGEXaAYYQdYBhhBxhG2AGGEXaAYYQdYBhhBxhG2AGGEXaAYYQdYBhhBxhG2AGGEXaAYYQdYBhhBxhG2AGGEXaAYYQdYJhFwl5Vj1XV1ap6fon1ADi6pc7Yv5zk7EJrAbCBRcLe3U8n+e0SawGwmVt2jb2qzlXVTlXt7O7u3qrdAhw7tyzs3X2+u7e7e3tra+tW7Rbg2HFXDMAwwg4wzFK3O349yQ+T3F1VV6rqY0usC8DNO7nEIt39yBLrALA5l2IAhhF2gGGEHWAYYQcYRtgBhhF2gGGEHWAYYQcYRtgBhhF2gGGEHWAYYQcYRtgBhhF2gGGEHWAYYQcYRtgBhhF2gGGEHWAYYQcYRtgBhhF2gGGEHWAYYQcYRtgBhhF2gGGEHWAYYQcYRtgBhhF2gGGEHWAYYQcYRtgBhhF2gGEWCXtVna2qF6vqpar69BJrAnA0G4e9qk4k+UKS9ye5N8kjVXXvpusCcDRLnLE/kOSl7v5Fd/8xyeNJPrzAugAcwRJhvyPJL695fmX/e/9LVZ2rqp2q2tnd3V1gtwBczy1787S7z3f3dndvb21t3ardAhw7S4T9V0nuvOb56f3vAbCCJcL+4yTvrKp3VNWbkjyc5NsLrAvAEZzcdIHufrWqPp7kySQnkjzW3Zc2ngyAI9k47EnS3d9J8p0l1gJgM/7yFGAYYQcYRtgBhhF2gGGEHWAYYQcYRtgBhhF2gGGEHWAYYQcYRtgBhhF2gGGEHWAYYQcYRtgBhhF2gGGEHWAYYQcYRtgBhhF2gGGEHWAYYQcYRtgBhhF2gGGEHWAYYQcYRtgBhhF2gGGEHWAYYQcYRtgBhhF2gGGEHWAYYQcYRtgBhtko7FX1z1V1qar+XFXbSw0FwNFtesb+fJJ/SvL0ArMAsICTm7y4uy8nSVUtMw0AG9so7Dejqs4lObf/9JWqev5W7fsN7m+S/GbtId4gHIsDjsUBx+LA3YfZ6IZhr6rvJvnb6/zoX7v73w47TXefT3J+f82d7nZNPo7FtRyLA47FAcfiQFXtHGa7G4a9u/9h83EAuFXc7ggwzKa3O/5jVV1J8vdJ/r2qnjzkS89vst9hHIsDjsUBx+KAY3HgUMeiuvv1HgSAW8ilGIBhhB1gmNXCftw/jqCqzlbVi1X1UlV9eu151lRVj1XV1eP+tw1VdWdVXaiqF/Z/Nx5de6a1VNVtVfWjqvrp/rH47Nozra2qTlTVT6rqiRttu+YZ+7H9OIKqOpHkC0nen+TeJI9U1b3rTrWqLyc5u/YQbwCvJvlkd9+b5D1J/uUY/7t4JcmZ7v67JPclOVtV71l5prU9muTyYTZcLezdfbm7X1xr/yt7IMlL3f2L7v5jkseTfHjlmVbT3U8n+e3ac6ytu3/d3c/uf/2H7P0S37HuVOvoPS/vPz21/zi2d3pU1ekkH0jyxcNs7xr7Ou5I8strnl/JMf0F5vqq6q4k9yd5Zt1J1rN/6eG5JFeTPNXdx/ZYJPl8kk8l+fNhNn5dw15V362q56/zOLZnp3AjVfWWJN9M8onu/v3a86ylu//U3fclOZ3kgap619ozraGqPpjkandfPOxrXtcPAfNxBK/pV0nuvOb56f3vccxV1ansRf1r3f2tted5I+ju31XVhey9D3Mc32B/MMmHquqhJLcl+euq+mp3f+S1XuBSzDp+nOSdVfWOqnpTkoeTfHvlmVhZ7X3+9ZeSXO7uz609z5qqaquq3rb/9ZuTvC/Jz9edah3d/ZnuPt3dd2WvFd/7v6KerHu741E/juD/ve5+NcnHkzyZvTfIvtHdl9adaj1V9fUkP0xyd1VdqaqPrT3TSh5M8tEkZ6rquf3HQ2sPtZK3J7lQVT/L3onQU919w9v82OMjBQCGcSkGYBhhBxhG2AGGEXaAYYQdYBhhBxhG2AGG+R9yEvSNCJF9rwAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "aywFiTt6qJ4o", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# get values for L3\n", + "x_vals = np.array(axes.get_xlim())\n", + "y_vals = 3*x_vals" ], - "execution_count": 0, + "execution_count": 56, "outputs": [] }, + { + "cell_type": "code", + "metadata": { + "id": "18aws2YBrFkE", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 341 + }, + "outputId": "47ffd466-1479-4d18-b0ae-559efe98401e" + }, + "source": [ + "plt.xlim(-2,4)\n", + "plt.ylim(-2,4)\n", + "\n", + "axes = plt.gca()\n", + "plt.axes().set_aspect('equal')\n", + "\n", + "plt.plot(x_vals, y_vals, '--', color='b', linewidth=1)" + ], + "execution_count": 60, + "outputs": [ + { + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:5: MatplotlibDeprecationWarning: Adding an axes using the same arguments as a previous axes currently reuses the earlier instance. In a future version, a new instance will always be created and returned. Meanwhile, this warning can be suppressed, and the future behavior ensured, by passing a unique label to each axes instance.\n", + " \"\"\"\n" + ], + "name": "stderr" + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "[]" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 60 + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, { "cell_type": "markdown", "metadata": { @@ -524,11 +2266,11 @@ "metadata": { "id": "cp52kZra-ykj", "colab_type": "code", - "outputId": "12502200-eafe-4e20-bfb7-2d539c6027cb", "colab": { "base_uri": "https://localhost:8080/", "height": 347 - } + }, + "outputId": "12502200-eafe-4e20-bfb7-2d539c6027cb" }, "source": [ "import pandas as pd\n", @@ -547,7 +2289,7 @@ "plt.scatter(df.x, df.y)\n", "plt.show()" ], - "execution_count": 0, + "execution_count": null, "outputs": [ { "output_type": "display_data", @@ -573,7 +2315,7 @@ "source": [ "" ], - "execution_count": 0, + "execution_count": null, "outputs": [] } ] diff --git a/module3-dimensionality-reduction/LS_DS_133_High_Dimensional_Data_Assignment.ipynb b/module3-dimensionality-reduction/LS_DS_133_High_Dimensional_Data_Assignment.ipynb index d0417b2e..525de7d1 100644 --- a/module3-dimensionality-reduction/LS_DS_133_High_Dimensional_Data_Assignment.ipynb +++ b/module3-dimensionality-reduction/LS_DS_133_High_Dimensional_Data_Assignment.ipynb @@ -41,11 +41,85 @@ "colab": {} }, "source": [ - "" + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import math\n", + "plt.rcParams.update({'font.size': 14})" ], - "execution_count": 0, + "execution_count": 2, "outputs": [] }, + { + "cell_type": "code", + "metadata": { + "id": "PHlSSxghhlxH", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 269 + }, + "outputId": "281077f4-7ea9-401a-ec1c-4e12d5ebfdf5" + }, + "source": [ + "# line that passes vertical line test\n", + "x = np.arange(-10, 10)\n", + "y = x**3 + 3*x\n", + "plt.plot(x, y)\n", + "plt.axvline(x=0, color='r');" + ], + "execution_count": 3, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "grO8tbCeh9M6", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 269 + }, + "outputId": "a8ad235a-a7b4-43a5-890e-787f48bd0a79" + }, + "source": [ + "# line that does not pass vertical line test\n", + "y = np.arange(-10, 11)\n", + "x = y**4 + 3*y\n", + "plt.plot(x, y)\n", + "plt.axvline(x=2000, color='r');" + ], + "execution_count": 4, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYcAAAD8CAYAAACcjGjIAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3deXRcZ33/8fd3tIy20S5Zlix5X+WEkCgJ2Z2EBJqWUqAtayE/lrDT32mhpUBpesqhLbSUsJYAbUL4kUCBltACSYjtELKQ2CWL5T12LNuyLcmStViakTR6fn/c0Wg0o9iKI80dzXxe58yRZu4dzfNY8vO5z3LvNeccIiIiiQJ+F0BERDKPwkFERFIoHEREJIXCQUREUigcREQkRb7fBXixamtr3bJly/wuxsKwZ4/3de1af8shIr7avn17j3Ou7sW8Z8GFw7Jly9i2bZvfxVgYNm3yvm7d6mcpRMRnZnboxb5Hw0oiIpJC4SAiIikUDiIikkLhICIiKRQOIiKSYl7CwcyuNrN7zeyomTkzuzlpu5nZrWbWaWYjZrbVzFrnoywiIvLizVfPoQzYAfwpMDLD9r8A/hz4MHAx0AU8YGaheSqPiIi8CPNynoNz7mfAzwDM7I7EbWZmwP8F/sE596PYa+/AC4i3AN+YjzKJiCwEzjn6R8boGozQnfCIOsf7rlmZtnL4cRLccqABuH/yBefciJn9CricGcLBzG4BbgFoaWlJUzFFROZOeCzqNfRDEboGvK/d0wIgHN8+Fk29z059KJj14dAQ+3oi6fUTQNNMb3DO3Q7cDtDW1qa7E4lIRpiYcPQOj05v5Kc1/l6D3zUYYTA8nvJ+M6gpDVIX8h6r6kPUlwepK5t6rS4UpD4UpCyY3uZ6wV0+Q0Rkvg2Pjscb++Thna7BcPyov2dolOhE6vFqaWFerFEvYl1DOVetnt7Y15V5DX51aSH5eZm5aNSPcDge+7oI6Eh4fVHCNhGRORWdcJwcijX2KUM6CQ3/YITTo9GU9+cFjNqywnjj3rq4YnqDHzvCry0LUprmo/z54EcNDuKFwA3AkwBmVgRcBXzMh/KIyALlnGMoMp56hD/DuH7v6QgzHOQTKsqnPta4n7ekMj6kU5/U8FeXFBIIWPor6ZN5CQczKwNWxZ4GgBYzuwDodc51mNkXgU+Y2W5gL/ApYAj43nyUR0QWlrHoBD1DyUf1SY1/7Cg/PDaR8v6CPIs38k2VRVzQXDl9SCdhXL+oIM+HGma++eo5tAFbEp7/bexxJ3Az8DmgGPgqUAX8BrjROTc4T+UREZ855xgYGad7KJxyVJ/c8PeeHp3xZ1SVFMQb+YtaquLj+slDOxXFBXir5uVczdd5DluBF/zNOOcccGvsISILWHgsOu0ovyuhkU8e0x+Nph7lF+YH4kM4y2pLuHh5FXVlRSlDOzVlhQTzdZSfLgt/1kRE5tzEhOPUyFh86GbG4Z1Y498/Mpbyfm+JZiG1saGbFXWl04/wJ4d2QkFCwXwd5WcghYNIjnHOcWp4jMN9w3T0eo/DvSN0DYTjDX/PUITxGWZviwvyqC/3jujXLCrjipU1Mw7tVJcWUpChSzRldhQOIlkoMh7laN9IrOEf5nDfCB0nh+PPByPTT8iqKS2kocJr4NcvDsWP7utC04d3smGJpsyOftMiC5Bzju6hiNfw947EewCTjf/xgTAu4cA/mB+gubqEluoSLlleTXN1Cc1VxbTUlNBcVaJGX1LoL0IkQ42MRr2hn5NTDf+RhKGg5CWcDeVFtFSXcPnKWpqri2mJhUFLdQm1ZcGcWqMvL53CQcQn0QnHiYHwVMOfcPTf0TtCz1Bk2v6lhXk0V5ewrKaUq1fXeUf91d6R/5KqYq3XlzmlcBCZRwPhMTpOTj/i7+gd4XDvMEf7RqYt7QwYNFZ6R/yvXF/vNfwJR/9VJVq7L+mjcBB5CcaiExw7FZ4+5t/njft39A5zanj6Ms/KkgJaqkvYsLicV7U2TBv6WVxZpBU+kjEUDiJn4Jyjb3hs2mTv4YQgONYfnnZVzoI8Y0mVd8R//pIKWmLDPpO9gIriAh9rIzJ7CgfJeeGxKEf6RqaO+CeXfPZ5wz9DScs+a8uCtFQXc9HSKq/xTzj6X1ReRJ4mfiULKBwk6znn6B6MJC33HIn3AI4PhKftX1QQoLnKa+wvXV4db/i9o/9iSgr130ayn/7KJWs45zjWH6a9c4AdR/vZeWyAgz2nOdI3fdmnmbfss7m6hCtX13pBUFMcD4C6sqAmfiXnKRxkQYpOOA72nKa9s5+dnQO0dw7Q3tlPX2wC2AxW1Jayqr6Ma9fWJRz5l9BUqWWfImejcJCMFxmPsu/EEO2d/ew46oXA7uODDMfu1lWYF2BNQxk3bmhgY1M5GxorWL84pOEfkZdA/3skowxFxmM9gf5Yb2CAfScG4xeBKwvms2FxOX/c1kxrYzmtjRWsqi+jMF9LQEXmksJBfNMzFIkPB7V3DrCz05sjmFRbVsiGxgo2ra2LB8HS6hJdBkIkDRQOMu+ccxzpG5nWG2jv7OfEwNTlIZZUFdPaWM7rX95Ea5MXBPUhTQyL+EXhIHNqPDrBgdhEcftRLwh2HhuI3xAmYLCqvozLV9bS2ljOhsZyWhdXUFGik8NEMonCQc5ZeCzKnuOD3tLRWK9g97EBIuPestHC/ADrG0LcdN7i2LBQOesayiku1EohkUyncJBZ6R8Zi08UTy4d3d89FL90RKjImyh+2yuWxucHVtaVkq9rBYksSAoHSdE1EJ42Ubyjs5/DvSPx7fWhIK2N5dywYVE8CJqrizU/IJJFFA7CqeFRHtrbzebdXTz63Em6B6cmipfWlHBeUwVvurglHgR1oaCPpRWRdFA45CDnHHtODLJ5dxdbdnex/VAfE867j/BVq2s5f0klrY3lrG8sp7xIE8UiuUjhkCPCY1Eefa4nFgjdHD3lDRO1NpbzoWtXce26el62pFLnEIgIoHDIapHxCfqGR/nEHU/yyP4eIuMTlBTmccWqWj58nRcIi8qL/C6miGQghUMWGY9O8NvDp9i8u4vNu7r4244+APZ3DfHmS1q4bl09l66oJpivpaQicmYKhwUucTJ5655u+kfGyA8YFy+rpqWmlKqSAh762CatJBKRF0XhsMBMTiY/uMubTP7fjqnJ5FeuX8R16+q5ak2tN5H8vdiQkYJBRF4khcMCMDKaOJncRWe/d+eyjU2aTBaR+aFwyFBH+obZsrsrfu7B5GTylatq+cj1qzWZLCLzSuGQIcajE/xvx6l472DPiUEAWqpLNJksImmncPDZYHiMux4/xL/9+iA9Q6PxyeRP3rSea9fVs7KuVJPJIpJ2CgefnBoe5d8eeZ47HjnIQHicq9fU8ca25qnJZBERHykc0qx7MMK3fn2A7z52iNOjUW7csIgPXbeK85dU+l00EZE4hUOadJ4a4fZfHeDuJzoYi07we+c38oFrV7KuodzvoomIpFA4zLOOk8N8/aH9/HD7EZyD1728ifdvWsmKujK/iyYi8oIUDvNkf9cgX9vyHD95upO8gPGmi1t47zUrWFJV4nfRRETOSuEwx9o7+/nqlv38fMdxivLzeOcVy3jPVSuo1zkJIrKA+BIOZnYr8DdJL59wzjX4UJw58b8dfXx1834e3N1FKJjPBzet4p1XLqe6tNDvoomIvGh+9hz2AJsSnkd9Ksc5c87x+IFevrJlH4/sP0lVSQEfvXENf3LZMiqKtRxVRBYuP8Nh3Dl33MfPP2fOOR7a281XNu9n26E+6kJBPnnTet5yaQulQY3UicjC52dLtsLMOoEI8BvgE865Az6WZ1bCY1E++h9P89/PHKOpspi/e20rf9TWTFGBLmshItnDr3D4DXAzsBuoBz4FPGpmrc65k8k7m9ktwC0ALS0taSzmdKeGR3nPd7bx5PN9fOxVa3nPVSsozA/4Vh4RkfniSzg4536e+NzMHgcOAO8AvjDD/rcDtwO0tbW5dJQx2eHeYd7x709wpHeEL7/55bzmZY1+FENEJC0yYoDcOTdkZu3Aar/LMpNnjpzinXc8yVjU8d13X8oly6v9LpKIyLzKiDERMysC1gHH/C5Lsl/uPMEbv/E4RQV5/Oj9lysYRCQn+HWewz8BPwU68OYc/hooBe70ozwv5K7HD/E3P9nBxqYKvv2Oi6kLBf0ukohIWvg1rLQEuBuoBbqBx4FXOOcO+VSeaSYmHP94326+8dABrl9Xz5ff8nJKCjNiBE5EJC38mpB+kx+fOxuR8Sgf/Y9n+OnTnbztFS3c+ppW8vMyYvRNRCRtdDic4NTwKLfctZ0nDvby8d9Zx3uvXqG7sIlITlI4xBzuHebmf3+Cw70j3PamC3jtBU1+F0lExDcKB2A8OsG77nyS7sEId73rEi5dUeN3kUREfKVwAH64/Qh7Twzxr2+7UMEgIkKGnOfgp+HRcb7wwF4uWlrFq1oX7BXDRUTmVM6Hw7cfPkjXYIRP3LROk88iIjE5HQ49QxH+9aHneHVrAxct1ZnPIiKTcjocvvTgPsLjE3zs1Wv9LoqISEbJ2XA40D3E937TwZsvaWZlXZnfxRERySg5Gw6fv28PhfkB/vT6NX4XRUQk4+RkOGw/1MfPdxznvVev1MX0RERmkHPh4Jzj73+2i7pQkHdftdzv4oiIZKScC4f2zgG2Herjw9etojSocwBFRGaSc+Hw1OFTAFy7tt7nkoiIZK6cC4enD5+iurSQJVXFfhdFRCRj5Vw4PHOkn5ctqdDZ0CIiZ5BT4XA6Ms6+rkHOX1Lpd1FERDJaToXDjqP9TDi4oFnhICJyJjkVDs8c6Qfg/CUVPpdERCSz5VQ4PHXkFEuqiqkp04lvIiJnklPh8MyRU7xM8w0iImeVM+FwcijC4d4RXtasISURkbPJmXB4rvs0AOsayn0uiYhI5suZcBgMjwFQWVLgc0lERDJfzoTDUGQcgDJdT0lE5KxyJhwGw7FwKFI4iIicTc6Ew2TPIRTUsJKIyNnkTDgMhsfICxhFBTlTZRGRc5YzLeVQeJyyYL4uuCciMgs5Ew6DkXFNRouIzFLOhMNQeJyQJqNFRGYld8JBPQcRkVnLmXAYHo1SXJjndzFERBaEnAmHCefIC2gyWkRkNnImHKITjjytVBIRmZWcCoeAeg4iIrOSM+Ew4Rz5CgcRkVnJmXAYV89BRGTWfA0HM/uAmR00s7CZbTezq+brsyY05yAiMmu+hYOZvRG4Dfgs8HLgUeDnZtYyH58X1WolEZFZ87Pn8GfAHc65bzrndjnnPgwcA94/Hx82MQEB9RxERGbFl3Aws0LgIuD+pE33A5fPx2dGJxx5OTPDIiLy0vjVXNYCecCJpNdPAA3JO5vZLWa2zcy2dXd3n9MHTjinnoOIyCwtiGNp59ztzrk251xbXV3dOf2MCYdWK4mIzJJf4dADRIFFSa8vAo7Pxwc651A0iIjMji/h4JwbBbYDNyRtugFv1dLcfyaakBYRmS0/r2H9BeAuM3sCeAR4H9AI/Ot8fNiEcygbRERmx7dwcM5938xqgE8Bi4EdwE3OuUPz83nqOYiIzJavd79xzn0N+Fo6Pks9BxGR2VsQq5XmgnNgmpIWEZmVHAoHh1ayiojMTs6Ew4RDw0oiIrOUM+GQHzDGJ5zfxRARWRByJhyKCvMIj034XQwRkQUhd8KhIEB4LOp3MUREFoTcCYf8PIWDiMgs5Uw4FBfmMaJwEBGZlZwJB/UcRERmL2fCIVgQYEQT0iIis5Iz4VBckEdEPQcRkVnJmXAoKtCcg4jIbOVMOBQX5DE8qnAQEZmNnAmHJVXFdA9GGAyP+V0UEZGMlzPh0NpUDsDu44M+l0REJPPlTDhsWFwBQPvRfp9LIiKS+XImHBaVB6kpLaS9c8DvooiIZLycCQczY0NjOTuPKRxERM4mZ8IBYENjOXtPDDI6rpPhRETOJKfCobWxgrGoY1+XJqVFRM4kx8LBW7G0U/MOIiJnlFPhsKymlOKCPE1Ki4icRU6FQ17AWL84xJPP9+KcbhkqIvJCciocAF5/4RLaOwfYsqfL76KIiGSsnAuHN17czNKaEj5/314mJtR7EBGZSc6FQ0FegD+7YQ27jg3w02c6/S6OiEhGyrlwAHjN+Y2sawjxhQf2MhbVOQ8iIslyMhwCAeNjr1rLoZPD/GDbYb+LIyKScXIyHACuW1dP29IqvvTgPkZ0nwcRkWlyNhzMjL949TpODES487Hn/S6OiEhGydlwALhkeTWb1tbx9a3P0T+imwCJiEzK6XAA+OiNa+kfGeObvzrgd1FERDJGzofDxqYKfu/8xXzz4QP8cucJv4sjIpIRcj4cAP7291tZ2xDilru2cfcTHX4XR0TEdwoHoKYsyN3veQVXr6njr378LF94YK+uvSQiOU3hEFMazOebb2/jjy5awpce3MfHf/Qs4zpBTkRyVL7fBcgkBXkBPveH57O4oogvbd5P12CYr771QkoK9c8kIrlFPYckZsaf3biWz77uPB7a282bb3+cnqGI38USEUkrhcMLeMulLXzjT9rYc2KQN3z9UZ7vOe13kURE0ibt4WBmW83MJT3uSXc5ZuOGDYv43ntewcDIGG/4+qM8ffiU30USEUkLv3oO/w4sTni816dynNWFLVX86P2XUxLM4023P86W3bpJkIhkP7/CYdg5dzzh0e9TOWZlRV0ZP3r/5aysL+Xd39nGPU90aKmriGQ1v8LhTWbWY2btZvZPZhY6085mdouZbTOzbd3d3ekq4zT1oSLuueUyrlhVy8d//Cyv+9qjbN59QiEhIlnJ0t24mdktwCGgE2gF/h7Y55y7cTbvb2trc9u2bZvHEp7ZWHSCH2w7zNe3PseRvhE2NpXzoWtXc+OGRQQC5lu5ZrRpk/d161Y/SyEiPjOz7c65thfznjnpOZjZZ2aYZE5+bAJwzt3unLvPOfesc+4e4I3ADWZ24VyUZb4V5AV466VL2fLRTXz+D8/ndCTK+767nd+57WHufbqTqO5LLSJZYE56DmZWC9SeZbcO59zwDO8NAKPAW51z3z/bZ/ndc0g2Hp3gf549xlc272df1xAr6kr54KZVvPaCRvLzfF4prJ6DiHBuPYc5OfXXOdcD9Jzj288D8oBjc1GWdMvPC/DaC5p4zfmN/KL9OF/evJ8//4+nue3BfXxg00pef+ESCvN1OomILCxpbbXMbKWZfdrM2sxsmZndBNwD/BZ4JJ1lmWuBgHHTeYv52Ueu5Ftvb6OqpICP//hZNn1+C9957HnCY7oVqYgsHOk+pB0FrgfuA/YAXwLuB17pnMuK1tPMeOWGRfzXB6/gzndeQmNlMZ/+STtXf24L33r4AMOj434XUUTkrNJ6RTnn3GHgmnR+pl/MjGvW1HH16loeO3CSLz+4n8/8zy6+vvU53nXVct5+2TLKgrqgn4hkJrVO88zMuHxlLZevrGXb8718efN+PveLPXzjoQO884rl3HzFMiqKC/wupojINJopTaO2ZdXc+c5L+MkHr+DiZdX8yy/3cuU/bObz9+3moC7sJyIZRD0HH7ysuZJvvaONnZ0DfGXLPr629Tm+uuU5VtSWcu26eq5fV0/bsmqtchIR3ygcfLShsZyvvfUiDvcOs3l3Fw/u7uKuxw7x7V8fJBTM56o1tVy3bhGb1tZRWxb0u7gikkMUDhmgubqEd1y+jHdcvozTkXEe2d/D5t1dbN7dxc+ePY4ZvGxJJdevq+e69fVsWFyOWYZdqkNEsorCIcOUBvO5sbWBG1sbcM7R3jnAg7u62Lyni39+YC///MBeGsqL4sNPV6yqpbgwz+9ii0iWUThkMDNjY1MFG5sq+NNXrqZrMMzWPd1s2d3FvU8d5e4nOijMD3D5yhquX1fPtevqWVJV4nexRSQLKBwWkPpQEX/c1swftzUzOj7BEwd7Y3MVJ/jrn7TDT9pZuyjEdeu9XsVFgAafRORcpP2S3S9Vpl14LxM45zjQc5otu7t4cFcXTz7fy/iE44ff/wSVxQXsvPterlldR0WJzqcQyUW+XXhP/GVmrKwrY2VdGe++agUD4TEe3ttD5U8LODU8xkfu/i15AeOipVXepPa6elbVl2lSW0RekHoO2WzTJhzw2+/8J5t3eUtldx0bAKC5upjr1y3i2nX1XLq8mqICTWqLZCv1HCSFARe2VHFhSxUffdVaOk+NsGVPF5t3dXHPkx3c8ejzlBTmccWqWq5cVcvGpnLWLy6npFB/GiK5TC1AjmmsLOatly7lrZcuJTwW5bHnTvLg7hNs2d3NAztPAGAGK2pLaW2sYGNTOa2NFbQ2llNZUuhz6UUkXRQOOayoII9rY0tgnXMc6w/T3jlAe2c/7Z0DbHu+l3uf7ozv31RZTGvjVFhsbKpgUXlQcxciWUjhIIA3qd1YWUxjZTE3bFgUf7339Cg7OwfYEQuM9s5+Hth1gsmpqprSQjbEgmIyOJZWlxAIKDBEFjKFg5xRdWkhV66u5crVU7cIPx0ZZ9exAdo7B9hx1AuNbz18gLGolxhlwXw2LC5nQ2N5vIexqr6MAr/vqS0is6ZwkBetNJhP27Jq2pZVx1+LjEfZd2IoPiTV3jnA9588zEjs9qiF+QHWLgqxsamcDbFhqfUN5br0h0iGUjjInAjm58Uv9TEpOuE42HM6ITD6+fmO49z9xGEAAgYr68rivYsNjeW0Lq7QyXoiGUDhIPMmL2Csqi9jVX0Zr72gCfDO5u7sD8eHo3Z29vP4gV7+66mpie8lVcVsjPUuWpvK2dhYQX15kV/VEMlJCgdJKzOjqbKYpspiXtXaEH/95FDEm8PonAyNAX7Rfjy+vbYsGJvwnpr8bqku0UopkXmicJCMUFMW5Oo1dVy9pi7+2mB4jF3HBmnv7GfHUW9Y6pH9PYxPeBPfoWB+bNJ7amntyrpS8jXxLfKSKRwkY4WKCrhkeTWXLJ+a+A6PeRPfXg/D62V874lDhMcmAAjmB1jXEGJDYzlLa0ppqS6hpbqE5qoSzWWIvAgKB1lQigryOG9JBectmT7xfaB7KD7pvePoAPe1n6D39Oi095YX5dNSEwuLWGhMPhori7XUViSBwkEWvLyAsXpRiNWLQvzBy5virw+GxzjcO0JH7zCHe4fpiD12Hx/klzu7GI1OxPcNGCyuKJ4KjJrpAVJVUqD5DckpCgfJWqGiAjY0FrChsTxl28SE48RgmI6Tw9PC43DfCJv3dNE9GJm2f2lh3vTeRkJ4NFUW66q2knUUDpKTAgFjcUUxiyuKuXRFTcr24dFxjvSNxMOjo3eYI33DPH/yNL/a1x2f4wDvQoWLQkXTh6tqiuPP68p0/SlZeBQOIjMoKcxnzaIQaxaFUrY55+geikwNVZ2MDV31DfPocz38+LdhEm+TUlQQoLlqhrmOGm+iXGeJSyZSOIi8SGZGfaiI+lARFy2tTtkeHoty9FTCXMdJLzg6ekd4/MBJTo9Gp+1fFwrSXDU139GcEB6LQkW6iKH4QuEgMseKCvLit21N5pyjb3gsPlSVGB7bDvVx79OdTCT0OgrzAiypLo73PBLDo7m6mFCRlufK/FA4iKSRmVFdWkh1aSEXNFembB+LTtAZ63XE5zpiK66eOnyK/pGxaftXlxbSXFWcsjS3ubqExRVFOiFQzpnCQSSDFOQFWFpTytKa0hm39w+PxYaohqf1PnYc7ecXO47Hzx4HyA8YTVVeryM5PFqqdVKgnJnCQWQBqSgpoKJk+tVvJ41HJzg+EE46r2OEw73D3N9+nJMvcFJgY0Ux9eVB6sqKqAsFqQsFqY99rS0LUpiv3kcuUjiIZIn8vABLqkpYUlUCK1O3D0XGp87nSPh66KQ335F8RvmkypKCeFjUlQWpLy+iriyYEiQVxTpRMJsoHERyRFkwn/WLy1m/OPWkQPDmO04OjdI1GKZ7MEL3YISu2NfuwQjdQxG2d/TRNRAhMj6R8v7CvAC1ZYXUJYRHPFQSgqS2LKiTBhcAhYOIAN58R0NFEQ0VZ753hnOOocj49OBIDJKhCEdPjfDU4T5Onh6dds7HpPKi/FhYpA5lTT0vorK4QEt5faJwEJEXxcwIFRUQKiqYcbluovHoBL2nR1N6IF0DYbqHvOfPHDlF12CE4aTzP8CbVK+doRcyLUhicyU6mXBuKRxEZN7k5wWoLy+a1Z38TkfGk4aywrEg8QLl+ECYZ472c3IoMu1ckEmhoNcbqU0JkqL4fEldKEh1aSF56o2clcJBRDJCaTCf0mA+y2pnXsY7KTrh6D09GguScLw3khgsOzsH6BqMMBQZT3l/XsCoKS1M7YVMTrYnBElpMHebyDmvuZndArwZeDlQASx3zj2ftE8V8CXg92Mv3Qt82Dl3aq7LIyLZJS9g8YZ9AzNPrk8aHh2nZ3CU7qFwvAeSPEey+9ggPUORaeeITCotzEuZB4mHR3ksUGK9kWw74XA+YrEEuB/4CfAvL7DP94AW4NWx598C7gJeMw/lEZEcVVKYT0uNdz7HmUxMOPqGR6d6IClBEmbP8UF+va+HgXBqbyRgUF2aOA8SjJ07kjpPUhbMXxBLfuc8HJxzXwQws7aZtpvZerxQuNI591jstfcCD5vZWufcnrkuk4jImQQCRk1ZkJqyIOsazrxveCw641BWd8Jcyf4Tg3QPRRiLpvZGigoCKfMgM63Uqikr9PXuhH4MqF0GDAGPJrz2CHAauBxQOIhIxioq8G781Fx95t6Ic45Tw2MpPZDEYa3nuod4/OBJTg2PzfgzqksLqQ8Fuetdl1IXCs5HdV6QH+HQAHQ7N7X62TnnzKwrti1FbB7jFoCWlpa0FFJE5KUwM6pKC6kqLZzxviCJIuNReoZGk84bmQqSUFH6m+pZfaKZfQb45Fl2u9Y5t/Ull2gGzrnbgdsB2traZljEJiKycAXz82iqLKapstjvosTNNo6+CHz3LPt0zPJnHQfqzMwmew/mzc7Ux7aJiIjPZhUOzrkeoGeOPvMxoAxv7mFy3uEyoJTp8xAiIuKT+TjPoQFv7mBN7KUNZlYJdDjnep1zu8zsF8A3YnMJAN8A/lsrlUREMsN8rJN6H/Bb4P/Fnv9P7PnvJ+zzFuBp4L7Y42ngT+ahLFwxKjkAAAXoSURBVCIicg7m4zyHW4Fbz7JPH/C2uf5sERGZG9l1vreIiMwJhYOIiKRQOIiISApzM92mKYOZWTdw6BzfXsvcLcldKHKtzrlWX1Cdc8FLre9S51zdi3nDgguHl8LMtjnnZrwgYLbKtTrnWn1Bdc4FftRXw0oiIpJC4SAiIilyLRxu97sAPsi1OudafUF1zgVpr29OzTmIiMjs5FrPQUREZkHhICIiKRQOIiKSIifCwcw+YGYHzSxsZtvN7Cq/yzQbZvZXZvakmQ2YWbeZ/dTMNibtY2Z2q5l1mtmImW01s9akfarM7C4z64897opdRj1xn/PM7KHYzzhqZp+O3YTJN7H6OzP7SsJrWVdfM1tsZnfGfsdhM9tpZtckbM+qOptZnpn9XcL/yYNm9hkzy0/YZ0HX2cyuNrN7Y5/pzOzmpO1pq5+ZvSH2NxWJfX3drCrhnMvqB/BGYAx4D7Ae+DIwBLT4XbZZlP0+4P8AG4HzgP/Eu1tedcI+fwkMAm+I7fcDoBMIJezzc6Ad76ZKl8W+/2nC9vLYz/1B7Gf8Yexn/rmPdX8FcBDvcu5fydb6ApXAAeA7wCXAcuB6YH0W1/kTQC/wGmAZ3uX8+4C/zpY6AzcBn4195jBwc9L2tNQv9r5xvNs8r499HQcuPWsd0v2H4cMf4m+Abya9tg/4e7/Ldg51KQOiwGtizw04BnwyYZ/i2B/Ie2PP1wMOuCJhnytjr62NPX8/MAAUJ+zzKeAosRVtaa5nBfAccC2wlVg4ZGN9Yw3II2fYno11/m/gzqTX7sS74VfW1RnvYPRmP36nwPeBB5LK80vg7rOVO6uHlcysELgIuD9p0/3A5ekv0UsWwhsK7Is9X4531714/ZxzI8CvmKrfZXh/nIm3YH0EOJ20z8Ox9066D2jEO7JLt9uBHzrntiS9no31/QPgN2b2fTPrMrOnzOxDCUMD2VjnXwPXmtk6ADPbAFwH/Cy2PRvrnCid9buM1PbvPmbR/mV1OOBdrCoPOJH0+gm8X85CcxvwFN59uGGqDmeqXwPQ7WKHDACx77uS9pnpZyR+RlqY2XuAVXhHQMmyrr7ACuADeENLr8L7Hf8D8MGk8mRTnf8RuAvYaWZjeMMldzrnvpZUnmyqc6J01u+F9jlr/ef8TnAyP8zsC3jdyiudc1G/yzMfzGwt3jDLlc65Mb/LkyYBYJtz7q9iz39rZqvxwuErL/y2Be2NwNvxbhfcDlwA3GZmB51z3/a1ZBKX7T2HHrwx+kVJry/Cm8hZEMzsX4A3A9c55w4kbJqsw5nqdxyoS1zBEPu+PmmfmX5G4mekw2V4vb12Mxs3s3HgGuADse9PJpWNhOcLsb7gjT3vTHptF9AS+z7bfscAnwf+yTl3j3PuWefcXcAXgMmAzMY6J0pn/V5on7PWP6vDwTk3CmwHbkjadAPTx/IylpndxlQw7E7afBDvl3xDwv5FwFVM1e8xvInsyxLedxlQmrTPVbH3TroBb/XE83NSkdn5L7xVWRckPLYB98S+30t21Re8ceS1Sa+tYeqeJdn2OwYowTtoSxRlqj3KxjonSmf9HuNc2790zdj79cDrwo4C78ZbAXAb3kTPUr/LNouyfxVvNcJ1eGOEk4+yhH3+EugHXo+3nO0eZl4S9yxTS+KeZfqSuAq8P9Z7Yj/j9bHP9W0pa0LZtpK6lDVr6gtcjLfU+pN4cy1/FKvfB7O4zncAR4DfxZs4fR3QDfxzttQZr2GfPMAZBj4d+74lnfXDm3geBz4OrMPrnY2hpazxf6AP4CVpBK8ncbXfZZplud0LPG5N2MeAW/GGJ8LAQ8DGpJ9TBXw39oczEPu+Mmmf8/BWS4RjP+tv8GEZ6wz/BluZHg5ZV1+8RvLpWFn2Ah9JLEu21Rlv1d0X8XpHI3iT8Z8FirKlzsCmF/i/e0e664d3/sNuvIPkXcDrZ1MHXZVVRERSZPWcg4iInBuFg4iIpFA4iIhICoWDiIikUDiIiEgKhYOIiKRQOIiISAqFg4iIpPj/0eRfR1dcKX0AAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, { "cell_type": "markdown", "metadata": { @@ -63,7 +137,9 @@ "colab_type": "text" }, "source": [ - "" + "A function cannot have the same input.\n", + "(x value/domain value) mapped to multiple outputs.\n", + "(y value/co-domain value).\n" ] }, { @@ -98,6 +174,23 @@ "\\end{align}" ] }, + { + "cell_type": "code", + "metadata": { + "id": "kvSu_AgbisbX", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# Relation 1: No\n", + "# Relation 2: Yes\n", + "# Relation 3: No\n", + "# Relation 4: No\n", + "# Relation 5: No " + ], + "execution_count": 5, + "outputs": [] + }, { "cell_type": "markdown", "metadata": { @@ -127,184 +220,211 @@ { "cell_type": "markdown", "metadata": { - "id": "k4tKHjdHUevC", - "colab_type": "text" - }, - "source": [ - "## 3.2 Do you think it's possible to create a function that maps from a lower dimensional space to a higher dimensional space? If so, provide an example." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "2nEWvwVyVWdW", + "id": "coynojAkj22L", "colab_type": "text" }, "source": [ - "# Vector Transformations" + "Dimensionality of m\n", + "\n", + "Input is 3 dimensions, output is 2 dimensions" ] }, { "cell_type": "markdown", "metadata": { - "id": "1n0-6FsYVcVk", + "id": "YIgS9mn7jwS9", "colab_type": "text" }, "source": [ - "## 4.1 Plug the corresponding unit vectors into each function. Use the output vectors to create a transformation matrix.\n", + "Dimensionality of n\n", "\n", - "\\begin{align}\n", - "p(\\begin{bmatrix}x_1 \\\\ x_2 \\end{bmatrix}) = \\begin{bmatrix} x_1 + 3x_2 \\\\2 x_2 - x_1 \\\\ \\end{bmatrix}\n", - "\\\\\n", - "\\\\\n", - "q(\\begin{bmatrix}x_1 \\\\ x_2 \\\\ x_3\\end{bmatrix}) = \\begin{bmatrix} 4x_1 + x_2 + 2x_3 \\\\2 x_2 - x_1 + 3x_3 \\\\ 5x_1 - 2x_3 + x_2 \\end{bmatrix}\n", - "\\end{align}" + "The input is 4 dimensions, the output is 3 dimensions." ] }, { "cell_type": "markdown", "metadata": { - "id": "n5HUOQIxZ2gp", + "id": "k4tKHjdHUevC", "colab_type": "text" }, "source": [ - "## 4.2 Verify that your transformation matrices are correct by choosing an input matrix and calculating the result both via the traditional functions above and also via vector-matrix multiplication." + "## 3.2 Do you think it's possible to create a function that maps from a lower dimensional space to a higher dimensional space? If so, provide an example." ] }, - { - "cell_type": "code", - "metadata": { - "id": "0UANR1IEaVWE", - "colab_type": "code", - "colab": {} - }, - "source": [ - "" - ], - "execution_count": 0, - "outputs": [] - }, { "cell_type": "markdown", "metadata": { - "id": "vEoiri3mak7j", + "id": "5eeKsdWWkC6d", "colab_type": "text" }, "source": [ - "# Eigenvalues and Eigenvectors" + "I don't think it's possible." ] }, { "cell_type": "markdown", "metadata": { - "id": "5HY0R4u7anIr", + "id": "2nEWvwVyVWdW", "colab_type": "text" }, "source": [ - "## 5.1 In your own words, give an explanation for the intuition behind eigenvalues and eigenvectors." + "# Vector Transformations" ] }, { "cell_type": "markdown", "metadata": { - "id": "VdehMwBtatKI", + "id": "1n0-6FsYVcVk", "colab_type": "text" }, "source": [ - "# The Curse of Dimensionality" + "## 4.1 Plug the corresponding unit vectors into each function. Use the output vectors to create a transformation matrix.\n", + "\n", + "\\begin{align}\n", + "p(\\begin{bmatrix}x_1 \\\\ x_2 \\end{bmatrix}) = \\begin{bmatrix} x_1 + 3x_2 \\\\2 x_2 - x_1 \\\\ \\end{bmatrix}\n", + "\\\\\n", + "\\\\\n", + "q(\\begin{bmatrix}x_1 \\\\ x_2 \\\\ x_3\\end{bmatrix}) = \\begin{bmatrix} 4x_1 + x_2 + 2x_3 \\\\2 x_2 - x_1 + 3x_3 \\\\ 5x_1 - 2x_3 + x_2 \\end{bmatrix}\n", + "\\end{align}" ] }, { - "cell_type": "markdown", + "cell_type": "code", "metadata": { - "id": "4oVrJax-a3SK", - "colab_type": "text" + "id": "iMWD7DY8ld_1", + "colab_type": "code", + "colab": {} }, "source": [ - "## 6.1 What are some of the challenges of working with high dimensional spaces?" - ] + "def f(vect):\n", + " x1=vect[0][0]\n", + " x2=vect[1][0]\n", + " row1 = np.array([x1 + 3*x2])\n", + " row2 = np.array([2*x2 - x1])\n", + " output_vector=np.array([row1, row2])\n", + " return output_vector" + ], + "execution_count": 6, + "outputs": [] }, { - "cell_type": "markdown", + "cell_type": "code", "metadata": { - "id": "ZiBJxsZla88c", - "colab_type": "text" + "id": "1bZPJ00Cme3R", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 52 + }, + "outputId": "71c268d2-6f98-4b94-c827-5ef4dab0d686" }, "source": [ - "## 6.2 What is the rule of thumb for how many observations you should have compared to parameters in your model?" + "# apply f to x-axis unit vector\n", + "i_hat = np.array([[1], [0]])\n", + "a=f(i_hat)\n", + "a" + ], + "execution_count": 7, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([[ 1],\n", + " [-1]])" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 7 + } ] }, { - "cell_type": "markdown", + "cell_type": "code", "metadata": { - "id": "NZmqdeygbHJx", - "colab_type": "text" + "id": "y3yhzd3OmnCO", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 52 + }, + "outputId": "448f85d7-ccfa-4ee0-a5b4-f665d327ba50" }, "source": [ - "# Principal Component Analysis" + "# apply f to y-axis unit vector\n", + "j_hat = np.array([[0], [1]])\n", + "b=f(j_hat)\n", + "b" + ], + "execution_count": 8, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([[3],\n", + " [2]])" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 8 + } ] }, { - "cell_type": "markdown", + "cell_type": "code", "metadata": { - "id": "7iEheetpbJdN", - "colab_type": "text" + "id": "gXsjUwi1mvmF", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 52 + }, + "outputId": "e2b60e95-b8cb-4368-f90b-44305f9522f7" }, "source": [ - "## 7.1 Code for loading and cleaning the 2013 national dataset from the [Housing Affordability Data System (HADS)](https://www.huduser.gov/portal/datasets/hads/hads.html) --housing data, can be found below. \n", - "\n", - "## Perform PCA on the processed dataset `national_processed` (Make sure you standardize your data!) and then make a scatterplot of PC1 against PC2. Some of our discussion and work around PCA with this dataset will continue during tomorrow's lecture and assignment.\n", - "\n", - "Not only does this dataset have decent amount columns to begin with (99), but in preparing the data for PCA we have also [one-hot-encoded](https://hackernoon.com/what-is-one-hot-encoding-why-and-when-do-you-have-to-use-it-e3c6186d008f#targetText=One%20hot%20encoding%20is%20a,the%20entry%20in%20the%20dataset.) all of the categorical variables. This has the effect of creating a new column for each individual category of each categorical variable. After processing this dataset has 64738 columns. --Das a lot of columns.\n", - "\n", - "Don't worry too much about the mechanics of one-hot encoding right now, you will learn and experiment with a whole bunch of categorical encoding approaches in unit 2. \n", - "\n", - "The code below will read in the dataset and perform the one-hot encoding of the categorical variables. Start adding your PCA code at the bottom of the provided code." + "# turn into a matrix\n", + "T = np.column_stack([a, b])\n", + "T" + ], + "execution_count": 9, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([[ 1, 3],\n", + " [-1, 2]])" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 9 + } ] }, { "cell_type": "code", "metadata": { - "id": "Us4nNFs02HlD", + "id": "LebCOdQbm4fr", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", - "height": 351 + "height": 110 }, - "outputId": "974e831f-cd76-41ed-c225-8ab4d1fea275" + "outputId": "0f09fd4e-9fcd-4921-e12a-bab6a3638858" }, "source": [ - "from urllib.request import urlopen\n", - "from zipfile import ZipFile\n", - "from io import BytesIO\n", - "import os.path\n", - "import pandas as pd\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "\n", - "# Read Natinal Data \n", - "national_url = 'https://www.huduser.gov/portal/datasets/hads/hads2013n_ASCII.zip'\n", - "national_file = 'thads2013n.txt'\n", - "\n", - "if os.path.exists(national_file):\n", - " national = pd.read_csv(national_file)\n", - "else: \n", - " z_national = urlopen(national_url)\n", - " zip_national = ZipFile(BytesIO(z_national.read())).extract(national_file)\n", - " national = pd.read_csv(zip_national)\n", - "\n", - "print(national.shape)\n", - "national.head()" + "# turn into a dataframe\n", + "pd.DataFrame(T)" ], - "execution_count": 2, + "execution_count": 10, "outputs": [ - { - "output_type": "stream", - "text": [ - "(64535, 99)\n" - ], - "name": "stdout" - }, { "output_type": "execute_result", "data": { @@ -327,817 +447,278 @@ " \n", " \n", " \n", - " CONTROL\n", - " AGE1\n", - " METRO3\n", - " REGION\n", - " LMED\n", - " FMR\n", - " L30\n", - " L50\n", - " L80\n", - " IPOV\n", - " BEDRMS\n", - " BUILT\n", - " STATUS\n", - " TYPE\n", - " VALUE\n", - " VACANCY\n", - " TENURE\n", - " NUNITS\n", - " ROOMS\n", - " WEIGHT\n", - " PER\n", - " ZINC2\n", - " ZADEQ\n", - " ZSMHC\n", - " STRUCTURETYPE\n", - " OWNRENT\n", - " UTILITY\n", - " OTHERCOST\n", - " COST06\n", - " COST12\n", - " COST08\n", - " COSTMED\n", - " TOTSAL\n", - " ASSISTED\n", - " GLMED\n", - " GL30\n", - " GL50\n", - " GL80\n", - " APLMED\n", - " ABL30\n", - " ...\n", - " COST08RELPOVCAT\n", - " COST08RELFMRPCT\n", - " COST08RELFMRCAT\n", - " COST12RELAMIPCT\n", - " COST12RELAMICAT\n", - " COST12RELPOVPCT\n", - " COST12RELPOVCAT\n", - " COST12RELFMRPCT\n", - " COST12RELFMRCAT\n", - " COSTMedRELAMIPCT\n", - " COSTMedRELAMICAT\n", - " COSTMedRELPOVPCT\n", - " COSTMedRELPOVCAT\n", - " COSTMedRELFMRPCT\n", - " COSTMedRELFMRCAT\n", - " FMTZADEQ\n", - " FMTMETRO3\n", - " FMTBUILT\n", - " FMTSTRUCTURETYPE\n", - " FMTBEDRMS\n", - " FMTOWNRENT\n", - " FMTCOST06RELPOVCAT\n", - " FMTCOST08RELPOVCAT\n", - " FMTCOST12RELPOVCAT\n", - " FMTCOSTMEDRELPOVCAT\n", - " FMTINCRELPOVCAT\n", - " FMTCOST06RELFMRCAT\n", - " FMTCOST08RELFMRCAT\n", - " FMTCOST12RELFMRCAT\n", - " FMTCOSTMEDRELFMRCAT\n", - " FMTINCRELFMRCAT\n", - " FMTCOST06RELAMICAT\n", - " FMTCOST08RELAMICAT\n", - " FMTCOST12RELAMICAT\n", - " FMTCOSTMEDRELAMICAT\n", - " FMTINCRELAMICAT\n", - " FMTASSISTED\n", - " FMTBURDEN\n", - " FMTREGION\n", - " FMTSTATUS\n", + " 0\n", + " 1\n", " \n", " \n", " \n", " \n", " 0\n", - " '100003130103'\n", - " 82\n", - " '3'\n", - " '1'\n", - " 73738\n", - " 956\n", - " 15738\n", - " 26213\n", - " 40322\n", - " 11067\n", - " 2\n", - " 2006\n", - " '1'\n", - " 1\n", - " 40000\n", - " -6\n", - " '1'\n", - " 1\n", - " 6\n", - " 3117.394239\n", - " 1\n", - " 18021\n", - " '1'\n", - " 533\n", " 1\n", - " '1'\n", - " 169.000000\n", - " 213.750000\n", - " 648.588189\n", - " 803.050535\n", - " 696.905247\n", - " 615.156712\n", - " 0\n", - " -9\n", - " 73738\n", - " 15738\n", - " 26213\n", - " 40322\n", - " 51616.6\n", - " 20234.571429\n", - " ...\n", - " 4\n", - " 72.898038\n", - " 2\n", - " 48.402635\n", - " 2\n", - " 290.250487\n", - " 4\n", - " 84.001102\n", - " 2\n", - " 37.077624\n", - " 2\n", - " 222.339102\n", - " 4\n", - " 64.346936\n", - " 2\n", - " '1 Adequate'\n", - " '-5'\n", - " '2000-2009'\n", - " '1 Single Family'\n", - " '2 2BR'\n", - " '1 Owner'\n", - " '4 200%+ Poverty'\n", - " '4 200%+ Poverty'\n", - " '4 200%+ Poverty'\n", - " '4 200%+ Poverty'\n", - " '3 150-200% Poverty'\n", - " '2 50.1 - 100% FMR'\n", - " '2 50.1 - 100% FMR'\n", - " '2 50.1 - 100% FMR'\n", - " '2 50.1 - 100% FMR'\n", - " '1 LTE 50% FMR'\n", - " '2 30 - 50% AMI'\n", - " '2 30 - 50% AMI'\n", - " '2 30 - 50% AMI'\n", - " '2 30 - 50% AMI'\n", - " '2 30 - 50% AMI'\n", - " '.'\n", - " '2 30% to 50%'\n", - " '-5'\n", - " '-5'\n", + " 3\n", " \n", " \n", " 1\n", - " '100006110249'\n", - " 50\n", - " '5'\n", - " '3'\n", - " 55846\n", - " 1100\n", - " 17165\n", - " 28604\n", - " 45744\n", - " 24218\n", - " 4\n", - " 1980\n", - " '1'\n", - " 1\n", - " 130000\n", - " -6\n", - " '1'\n", - " 1\n", - " 6\n", - " 2150.725544\n", - " 4\n", - " 122961\n", - " '1'\n", - " 487\n", - " 1\n", - " '1'\n", - " 245.333333\n", - " 58.333333\n", - " 1167.640781\n", - " 1669.643405\n", - " 1324.671218\n", - " 1058.988479\n", - " 123000\n", - " -9\n", - " 55846\n", - " 17165\n", - " 28604\n", - " 45744\n", - " 55846.0\n", - " 19911.400000\n", - " ...\n", - " 4\n", - " 120.424656\n", - " 3\n", - " 103.094063\n", - " 6\n", - " 275.768999\n", - " 4\n", - " 151.785764\n", - " 3\n", - " 65.388468\n", - " 4\n", - " 174.909320\n", - " 3\n", - " 96.271680\n", + " -1\n", " 2\n", - " '1 Adequate'\n", - " '-5'\n", - " '1980-1989'\n", - " '1 Single Family'\n", - " '4 4BR+'\n", - " '1 Owner'\n", - " '3 150-200% Poverty'\n", - " '4 200%+ Poverty'\n", - " '4 200%+ Poverty'\n", - " '3 150-200% Poverty'\n", - " '4 200%+ Poverty'\n", - " '3 GT FMR'\n", - " '3 GT FMR'\n", - " '3 GT FMR'\n", - " '2 50.1 - 100% FMR'\n", - " '3 GT FMR'\n", - " '4 60 - 80% AMI'\n", - " '4 60 - 80% AMI'\n", - " '6 100 - 120% AMI'\n", - " '4 60 - 80% AMI'\n", - " '7 120% AMI +'\n", - " '.'\n", - " '1 Less than 30%'\n", - " '-5'\n", - " '-5'\n", - " \n", - " \n", - " 2\n", - " '100006370140'\n", - " 53\n", - " '5'\n", - " '3'\n", - " 55846\n", - " 1100\n", - " 13750\n", - " 22897\n", - " 36614\n", - " 15470\n", - " 4\n", - " 1985\n", - " '1'\n", - " 1\n", - " 150000\n", - " -6\n", - " '1'\n", - " 1\n", - " 7\n", - " 2213.789404\n", - " 2\n", - " 27974\n", - " '1'\n", - " 1405\n", - " 1\n", - " '1'\n", - " 159.000000\n", - " 37.500000\n", - " 1193.393209\n", - " 1772.627006\n", - " 1374.582175\n", - " 1068.025168\n", - " 28000\n", - " -9\n", - " 55846\n", - " 13750\n", - " 22897\n", - " 36614\n", - " 44676.8\n", - " 19937.500000\n", - " ...\n", - " 4\n", - " 124.962016\n", - " 3\n", - " 109.452905\n", - " 6\n", - " 458.339239\n", - " 4\n", - " 161.147910\n", - " 3\n", - " 65.946449\n", - " 4\n", - " 276.153890\n", - " 4\n", - " 97.093197\n", - " 2\n", - " '1 Adequate'\n", - " '-5'\n", - " '1980-1989'\n", - " '1 Single Family'\n", - " '4 4BR+'\n", - " '1 Owner'\n", - " '4 200%+ Poverty'\n", - " '4 200%+ Poverty'\n", - " '4 200%+ Poverty'\n", - " '4 200%+ Poverty'\n", - " '3 150-200% Poverty'\n", - " '3 GT FMR'\n", - " '3 GT FMR'\n", - " '3 GT FMR'\n", - " '2 50.1 - 100% FMR'\n", - " '2 50.1 - 100% FMR'\n", - " '4 60 - 80% AMI'\n", - " '5 80 - 100% AMI'\n", - " '6 100 - 120% AMI'\n", - " '4 60 - 80% AMI'\n", - " '4 60 - 80% AMI'\n", - " '.'\n", - " '3 50% or More'\n", - " '-5'\n", - " '-5'\n", - " \n", - " \n", - " 3\n", - " '100006520140'\n", - " 67\n", - " '5'\n", - " '3'\n", - " 55846\n", - " 949\n", - " 13750\n", - " 22897\n", - " 36614\n", - " 13964\n", - " 3\n", - " 1985\n", - " '1'\n", - " 1\n", - " 200000\n", - " -6\n", - " '1'\n", - " 1\n", - " 6\n", - " 2364.585097\n", - " 2\n", - " 32220\n", - " '1'\n", - " 279\n", - " 1\n", - " '1'\n", - " 179.000000\n", - " 70.666667\n", - " 1578.857612\n", - " 2351.169341\n", - " 1820.442900\n", - " 1411.700224\n", - " 0\n", - " -9\n", - " 55846\n", - " 13750\n", - " 22897\n", - " 36614\n", - " 44676.8\n", - " 17875.000000\n", - " ...\n", - " 4\n", - " 191.827492\n", - " 3\n", - " 161.926709\n", - " 7\n", - " 673.494512\n", - " 4\n", - " 247.752301\n", - " 3\n", - " 97.224801\n", - " 5\n", - " 404.382763\n", - " 4\n", - " 148.756610\n", - " 3\n", - " '1 Adequate'\n", - " '-5'\n", - " '1980-1989'\n", - " '1 Single Family'\n", - " '3 3BR'\n", - " '1 Owner'\n", - " '4 200%+ Poverty'\n", - " '4 200%+ Poverty'\n", - " '4 200%+ Poverty'\n", - " '4 200%+ Poverty'\n", - " '4 200%+ Poverty'\n", - " '3 GT FMR'\n", - " '3 GT FMR'\n", - " '3 GT FMR'\n", - " '3 GT FMR'\n", - " '2 50.1 - 100% FMR'\n", - " '6 100 - 120% AMI'\n", - " '7 120% AMI +'\n", - " '7 120% AMI +'\n", - " '5 80 - 100% AMI'\n", - " '4 60 - 80% AMI'\n", - " '.'\n", - " '1 Less than 30%'\n", - " '-5'\n", - " '-5'\n", - " \n", - " \n", - " 4\n", - " '100007130148'\n", - " 26\n", - " '1'\n", - " '3'\n", - " 60991\n", - " 737\n", - " 14801\n", - " 24628\n", - " 39421\n", - " 15492\n", - " 2\n", - " 1980\n", - " '1'\n", - " 1\n", - " -6\n", - " -6\n", - " '2'\n", - " 100\n", - " 4\n", - " 2314.524902\n", - " 2\n", - " 96874\n", - " '1'\n", - " 759\n", - " 5\n", - " '2'\n", - " 146.000000\n", - " 12.500000\n", - " 759.000000\n", - " 759.000000\n", - " 759.000000\n", - " 759.000000\n", - " 96900\n", - " 0\n", - " 60991\n", - " 14801\n", - " 24628\n", - " 39421\n", - " 48792.8\n", - " 16651.125000\n", - " ...\n", - " 3\n", - " 102.985075\n", - " 3\n", - " 55.308707\n", - " 3\n", - " 195.972115\n", - " 3\n", - " 102.985075\n", - " 3\n", - " 55.308707\n", - " 3\n", - " 195.972115\n", - " 3\n", - " 102.985075\n", - " 3\n", - " '1 Adequate'\n", - " 'Central City'\n", - " '1980-1989'\n", - " '5 50+ units'\n", - " '2 2BR'\n", - " '2 Renter'\n", - " '3 150-200% Poverty'\n", - " '3 150-200% Poverty'\n", - " '3 150-200% Poverty'\n", - " '3 150-200% Poverty'\n", - " '4 200%+ Poverty'\n", - " '3 GT FMR'\n", - " '3 GT FMR'\n", - " '3 GT FMR'\n", - " '3 GT FMR'\n", - " '3 GT FMR'\n", - " '3 50 - 60% AMI'\n", - " '3 50 - 60% AMI'\n", - " '3 50 - 60% AMI'\n", - " '3 50 - 60% AMI'\n", - " '7 120% AMI +'\n", - " '0 Not Assisted'\n", - " '1 Less than 30%'\n", - " '-5'\n", - " '-5'\n", " \n", " \n", "\n", - "

5 rows × 99 columns

\n", "" ], "text/plain": [ - " CONTROL AGE1 METRO3 ... FMTBURDEN FMTREGION FMTSTATUS\n", - "0 '100003130103' 82 '3' ... '2 30% to 50%' '-5' '-5'\n", - "1 '100006110249' 50 '5' ... '1 Less than 30%' '-5' '-5'\n", - "2 '100006370140' 53 '5' ... '3 50% or More' '-5' '-5'\n", - "3 '100006520140' 67 '5' ... '1 Less than 30%' '-5' '-5'\n", - "4 '100007130148' 26 '1' ... '1 Less than 30%' '-5' '-5'\n", - "\n", - "[5 rows x 99 columns]" + " 0 1\n", + "0 1 3\n", + "1 -1 2" ] }, "metadata": { "tags": [] }, - "execution_count": 2 + "execution_count": 10 } ] }, { "cell_type": "code", "metadata": { - "id": "O5zrMTud2qFU", + "id": "1ZqLfftgm_g1", "colab_type": "code", - "outputId": "22a279ad-ad46-46ba-82c4-47ff31864e01", "colab": { "base_uri": "https://localhost:8080/", - "height": 1000 - } + "height": 52 + }, + "outputId": "154c265c-ec54-449c-b01f-995900e80a3a" }, "source": [ - "# Look at datatypes\n", - "# a lot of object datatypes even though they seem to be strings of numbers.\n", - "national.dtypes" + "# use original function\n", + "input_vector=np.array([[3],[4]])\n", + "f(input_vector)" ], - "execution_count": 3, + "execution_count": 11, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ - "CONTROL object\n", - "AGE1 int64\n", - "METRO3 object\n", - "REGION object\n", - "LMED int64\n", - "FMR int64\n", - "L30 int64\n", - "L50 int64\n", - "L80 int64\n", - "IPOV int64\n", - "BEDRMS int64\n", - "BUILT int64\n", - "STATUS object\n", - "TYPE int64\n", - "VALUE int64\n", - "VACANCY int64\n", - "TENURE object\n", - "NUNITS int64\n", - "ROOMS int64\n", - "WEIGHT float64\n", - "PER int64\n", - "ZINC2 int64\n", - "ZADEQ object\n", - "ZSMHC int64\n", - "STRUCTURETYPE int64\n", - "OWNRENT object\n", - "UTILITY float64\n", - "OTHERCOST float64\n", - "COST06 float64\n", - "COST12 float64\n", - " ... \n", - "COSTMedRELAMICAT int64\n", - "COSTMedRELPOVPCT float64\n", - "COSTMedRELPOVCAT int64\n", - "COSTMedRELFMRPCT float64\n", - "COSTMedRELFMRCAT int64\n", - "FMTZADEQ object\n", - "FMTMETRO3 object\n", - "FMTBUILT object\n", - "FMTSTRUCTURETYPE object\n", - "FMTBEDRMS object\n", - "FMTOWNRENT object\n", - "FMTCOST06RELPOVCAT object\n", - "FMTCOST08RELPOVCAT object\n", - "FMTCOST12RELPOVCAT object\n", - "FMTCOSTMEDRELPOVCAT object\n", - "FMTINCRELPOVCAT object\n", - "FMTCOST06RELFMRCAT object\n", - "FMTCOST08RELFMRCAT object\n", - "FMTCOST12RELFMRCAT object\n", - "FMTCOSTMEDRELFMRCAT object\n", - "FMTINCRELFMRCAT object\n", - "FMTCOST06RELAMICAT object\n", - "FMTCOST08RELAMICAT object\n", - "FMTCOST12RELAMICAT object\n", - "FMTCOSTMEDRELAMICAT object\n", - "FMTINCRELAMICAT object\n", - "FMTASSISTED object\n", - "FMTBURDEN object\n", - "FMTREGION object\n", - "FMTSTATUS object\n", - "Length: 99, dtype: object" + "array([[15],\n", + " [ 5]])" ] }, "metadata": { "tags": [] }, - "execution_count": 3 + "execution_count": 11 } ] }, { "cell_type": "code", "metadata": { - "id": "yIrOjVmd2yLz", + "id": "WwCUgoG8nQ61", "colab_type": "code", - "outputId": "d855cbbd-42ba-47a2-aba9-584813e9c5ab", "colab": { "base_uri": "https://localhost:8080/", - "height": 35 - } + "height": 52 + }, + "outputId": "e7632bc7-55e2-4d04-a6ec-e1fc307c6039" }, "source": [ - "# check for null values\n", - "national.isnull().sum().any()" + "# matrix multiplication\n", + "output_vector=np.matmul(T, input_vector)\n", + "output_vector" ], - "execution_count": 4, + "execution_count": 12, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ - "False" + "array([[15],\n", + " [ 5]])" ] }, "metadata": { "tags": [] }, - "execution_count": 4 + "execution_count": 12 } ] }, { "cell_type": "code", "metadata": { - "id": "2u9tdmwX3KL_", + "id": "LHZhHpBvnkuv", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# let's repeat for matrix q\n", + "def f1(vect):\n", + " x1=vect[0][0]\n", + " x2=vect[1][0]\n", + " x3=vect[2][0]\n", + " row1 = np.array([4*x1 + x2 + 2*x3])\n", + " row2 = np.array([2*x2 - x1 - 3*x3])\n", + " row3 = np.array([5*x1 + 2*x3 + x2])\n", + " output_vector=np.array([row1, row2, row3])\n", + " return output_vector" + ], + "execution_count": 13, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "OWEYZXn6oLtZ", "colab_type": "code", - "outputId": "ce3e8bc6-7571-4b9b-8b4f-b8ae7c94f837", "colab": { "base_uri": "https://localhost:8080/", - "height": 52 - } + "height": 69 + }, + "outputId": "d95812e5-ae26-4c2e-d6b9-60c9a426e310" }, "source": [ - "# check for number of categorical vs numeric columns\n", - "cat_cols = national.columns[national.dtypes=='object']\n", - "num_cols = national.columns[national.dtypes!='object']\n", - "\n", - "print(f'{len(cat_cols)} categorical columns')\n", - "print(f'{len(num_cols)} numerical columns')" + "i_hat=np.array([[1],[0],[0]])\n", + "a=f1(i_hat)\n", + "a" ], - "execution_count": 5, + "execution_count": 14, "outputs": [ { - "output_type": "stream", - "text": [ - "32 categorical columns\n", - "67 numerical columns\n" - ], - "name": "stdout" + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([[ 4],\n", + " [-1],\n", + " [ 5]])" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 14 } ] }, { "cell_type": "code", "metadata": { - "id": "UMHOtOs_3gcL", + "id": "Rf4PgXYDsE1_", "colab_type": "code", - "outputId": "9194fefa-217a-49e4-cd81-b2d416d77b19", "colab": { "base_uri": "https://localhost:8080/", - "height": 1000 + "height": 69 + }, + "outputId": "f615f5df-a30d-44f0-e733-9914669ab725" + }, + "source": [ + "j_hat=np.array([[0],[1],[0]])\n", + "b=f1(j_hat)\n", + "b" + ], + "execution_count": 15, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([[1],\n", + " [2],\n", + " [1]])" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 15 } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "P7_VKmkHsNQD", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 69 + }, + "outputId": "64b04aea-7744-4971-c3df-234e2f5cb289" }, "source": [ - "# We're making a copy of our data in case we mess something up.\n", - "national_processed = national.copy()\n", - "\n", - "# Categorically Encode our Variables:\n", - "# They need to all be numeric before we do PCA.\n", - "# https://pbpython.com/categorical-encoding.html\n", - "\n", - "# Cast categorical columns to \"category\" data type\n", - "national_processed[cat_cols] = national_processed[cat_cols].astype('category')\n", - "\n", - "national_processed.dtypes" + "z_hat=np.array([[0],[0],[1]])\n", + "c=f1(z_hat)\n", + "c" ], - "execution_count": 6, + "execution_count": 16, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ - "CONTROL category\n", - "AGE1 int64\n", - "METRO3 category\n", - "REGION category\n", - "LMED int64\n", - "FMR int64\n", - "L30 int64\n", - "L50 int64\n", - "L80 int64\n", - "IPOV int64\n", - "BEDRMS int64\n", - "BUILT int64\n", - "STATUS category\n", - "TYPE int64\n", - "VALUE int64\n", - "VACANCY int64\n", - "TENURE category\n", - "NUNITS int64\n", - "ROOMS int64\n", - "WEIGHT float64\n", - "PER int64\n", - "ZINC2 int64\n", - "ZADEQ category\n", - "ZSMHC int64\n", - "STRUCTURETYPE int64\n", - "OWNRENT category\n", - "UTILITY float64\n", - "OTHERCOST float64\n", - "COST06 float64\n", - "COST12 float64\n", - " ... \n", - "COSTMedRELAMICAT int64\n", - "COSTMedRELPOVPCT float64\n", - "COSTMedRELPOVCAT int64\n", - "COSTMedRELFMRPCT float64\n", - "COSTMedRELFMRCAT int64\n", - "FMTZADEQ category\n", - "FMTMETRO3 category\n", - "FMTBUILT category\n", - "FMTSTRUCTURETYPE category\n", - "FMTBEDRMS category\n", - "FMTOWNRENT category\n", - "FMTCOST06RELPOVCAT category\n", - "FMTCOST08RELPOVCAT category\n", - "FMTCOST12RELPOVCAT category\n", - "FMTCOSTMEDRELPOVCAT category\n", - "FMTINCRELPOVCAT category\n", - "FMTCOST06RELFMRCAT category\n", - "FMTCOST08RELFMRCAT category\n", - "FMTCOST12RELFMRCAT category\n", - "FMTCOSTMEDRELFMRCAT category\n", - "FMTINCRELFMRCAT category\n", - "FMTCOST06RELAMICAT category\n", - "FMTCOST08RELAMICAT category\n", - "FMTCOST12RELAMICAT category\n", - "FMTCOSTMEDRELAMICAT category\n", - "FMTINCRELAMICAT category\n", - "FMTASSISTED category\n", - "FMTBURDEN category\n", - "FMTREGION category\n", - "FMTSTATUS category\n", - "Length: 99, dtype: object" + "array([[ 2],\n", + " [-3],\n", + " [ 2]])" ] }, "metadata": { "tags": [] }, - "execution_count": 6 + "execution_count": 16 } ] }, { "cell_type": "code", "metadata": { - "id": "ymxU-aPtQ1eq", + "id": "oxZwSpe5sTVX", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", - "height": 265 + "height": 69 }, - "outputId": "02fe0fad-81bb-404c-a4cd-92242cfe4c6c" + "outputId": "4d3ecf3b-1b2f-4afe-cb36-d25c2e51b94f" }, "source": [ - "# Replace all category cell values with their numeric category codes\n", - "for col in cat_cols:\n", - " national_processed[col] = national_processed[col].cat.codes\n", - "\n", - "print(national_processed.shape)\n", - "national_processed.head()" + "# turn into matrix\n", + "U = np.column_stack([a,b,c])\n", + "U" ], - "execution_count": 7, + "execution_count": 17, "outputs": [ { - "output_type": "stream", - "text": [ - "(64535, 99)\n" - ], - "name": "stdout" + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([[ 4, 1, 2],\n", + " [-1, 2, -3],\n", + " [ 5, 1, 2]])" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 17 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "o3pFWTESsaOe", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 141 }, + "outputId": "9bcd6d44-9052-4720-854e-7db5a78f8575" + }, + "source": [ + "pd.DataFrame(U)" + ], + "execution_count": 18, + "outputs": [ { "output_type": "execute_result", "data": { @@ -1160,637 +741,2703 @@ " \n", " \n", " \n", - " CONTROL\n", - " AGE1\n", - " METRO3\n", - " REGION\n", - " LMED\n", - " FMR\n", - " L30\n", - " L50\n", - " L80\n", - " IPOV\n", - " BEDRMS\n", - " BUILT\n", - " STATUS\n", - " TYPE\n", - " VALUE\n", - " VACANCY\n", - " TENURE\n", - " NUNITS\n", - " ROOMS\n", - " WEIGHT\n", - " PER\n", - " ZINC2\n", - " ZADEQ\n", - " ZSMHC\n", - " STRUCTURETYPE\n", - " OWNRENT\n", - " UTILITY\n", - " OTHERCOST\n", - " COST06\n", - " COST12\n", - " COST08\n", - " COSTMED\n", - " TOTSAL\n", - " ASSISTED\n", - " GLMED\n", - " GL30\n", - " GL50\n", - " GL80\n", - " APLMED\n", - " ABL30\n", - " ...\n", - " COST08RELPOVCAT\n", - " COST08RELFMRPCT\n", - " COST08RELFMRCAT\n", - " COST12RELAMIPCT\n", - " COST12RELAMICAT\n", - " COST12RELPOVPCT\n", - " COST12RELPOVCAT\n", - " COST12RELFMRPCT\n", - " COST12RELFMRCAT\n", - " COSTMedRELAMIPCT\n", - " COSTMedRELAMICAT\n", - " COSTMedRELPOVPCT\n", - " COSTMedRELPOVCAT\n", - " COSTMedRELFMRPCT\n", - " COSTMedRELFMRCAT\n", - " FMTZADEQ\n", - " FMTMETRO3\n", - " FMTBUILT\n", - " FMTSTRUCTURETYPE\n", - " FMTBEDRMS\n", - " FMTOWNRENT\n", - " FMTCOST06RELPOVCAT\n", - " FMTCOST08RELPOVCAT\n", - " FMTCOST12RELPOVCAT\n", - " FMTCOSTMEDRELPOVCAT\n", - " FMTINCRELPOVCAT\n", - " FMTCOST06RELFMRCAT\n", - " FMTCOST08RELFMRCAT\n", - " FMTCOST12RELFMRCAT\n", - " FMTCOSTMEDRELFMRCAT\n", - " FMTINCRELFMRCAT\n", - " FMTCOST06RELAMICAT\n", - " FMTCOST08RELAMICAT\n", - " FMTCOST12RELAMICAT\n", - " FMTCOSTMEDRELAMICAT\n", - " FMTINCRELAMICAT\n", - " FMTASSISTED\n", - " FMTBURDEN\n", - " FMTREGION\n", - " FMTSTATUS\n", + " 0\n", + " 1\n", + " 2\n", " \n", " \n", " \n", " \n", " 0\n", - " 0\n", - " 82\n", - " 2\n", - " 0\n", - " 73738\n", - " 956\n", - " 15738\n", - " 26213\n", - " 40322\n", - " 11067\n", - " 2\n", - " 2006\n", - " 0\n", - " 1\n", - " 40000\n", - " -6\n", - " 1\n", - " 1\n", - " 6\n", - " 3117.394239\n", - " 1\n", - " 18021\n", - " 1\n", - " 533\n", - " 1\n", - " 0\n", - " 169.000000\n", - " 213.750000\n", - " 648.588189\n", - " 803.050535\n", - " 696.905247\n", - " 615.156712\n", - " 0\n", - " -9\n", - " 73738\n", - " 15738\n", - " 26213\n", - " 40322\n", - " 51616.6\n", - " 20234.571429\n", - " ...\n", - " 4\n", - " 72.898038\n", - " 2\n", - " 48.402635\n", - " 2\n", - " 290.250487\n", - " 4\n", - " 84.001102\n", - " 2\n", - " 37.077624\n", - " 2\n", - " 222.339102\n", - " 4\n", - " 64.346936\n", - " 2\n", - " 1\n", - " 0\n", - " 5\n", - " 1\n", - " 2\n", - " 0\n", - " 4\n", " 4\n", - " 4\n", - " 4\n", - " 3\n", - " 1\n", " 1\n", - " 1\n", - " 1\n", - " 1\n", - " 1\n", - " 1\n", - " 1\n", - " 1\n", - " 2\n", - " 0\n", " 2\n", - " 0\n", - " 0\n", " \n", " \n", " 1\n", - " 1\n", - " 50\n", - " 4\n", + " -1\n", " 2\n", - " 55846\n", - " 1100\n", - " 17165\n", - " 28604\n", - " 45744\n", - " 24218\n", - " 4\n", - " 1980\n", - " 0\n", - " 1\n", - " 130000\n", - " -6\n", - " 1\n", - " 1\n", - " 6\n", - " 2150.725544\n", - " 4\n", - " 122961\n", - " 1\n", - " 487\n", - " 1\n", - " 0\n", - " 245.333333\n", - " 58.333333\n", - " 1167.640781\n", - " 1669.643405\n", - " 1324.671218\n", - " 1058.988479\n", - " 123000\n", - " -9\n", - " 55846\n", - " 17165\n", - " 28604\n", - " 45744\n", - " 55846.0\n", - " 19911.400000\n", - " ...\n", - " 4\n", - " 120.424656\n", - " 3\n", - " 103.094063\n", - " 6\n", - " 275.768999\n", - " 4\n", - " 151.785764\n", - " 3\n", - " 65.388468\n", - " 4\n", - " 174.909320\n", - " 3\n", - " 96.271680\n", - " 2\n", - " 1\n", - " 0\n", - " 3\n", - " 1\n", - " 4\n", - " 0\n", - " 3\n", - " 4\n", - " 4\n", - " 3\n", - " 4\n", - " 2\n", - " 2\n", - " 2\n", - " 1\n", - " 3\n", - " 3\n", - " 3\n", - " 5\n", - " 3\n", - " 7\n", - " 0\n", - " 1\n", - " 0\n", - " 0\n", + " -3\n", " \n", " \n", " 2\n", - " 2\n", - " 53\n", - " 4\n", - " 2\n", - " 55846\n", - " 1100\n", - " 13750\n", - " 22897\n", - " 36614\n", - " 15470\n", - " 4\n", - " 1985\n", - " 0\n", - " 1\n", - " 150000\n", - " -6\n", - " 1\n", - " 1\n", - " 7\n", - " 2213.789404\n", - " 2\n", - " 27974\n", - " 1\n", - " 1405\n", - " 1\n", - " 0\n", - " 159.000000\n", - " 37.500000\n", - " 1193.393209\n", - " 1772.627006\n", - " 1374.582175\n", - " 1068.025168\n", - " 28000\n", - " -9\n", - " 55846\n", - " 13750\n", - " 22897\n", - " 36614\n", - " 44676.8\n", - " 19937.500000\n", - " ...\n", - " 4\n", - " 124.962016\n", - " 3\n", - " 109.452905\n", - " 6\n", - " 458.339239\n", - " 4\n", - " 161.147910\n", - " 3\n", - " 65.946449\n", - " 4\n", - " 276.153890\n", - " 4\n", - " 97.093197\n", - " 2\n", - " 1\n", - " 0\n", - " 3\n", - " 1\n", - " 4\n", - " 0\n", - " 4\n", - " 4\n", - " 4\n", - " 4\n", - " 3\n", - " 2\n", - " 2\n", - " 2\n", + " 5\n", " 1\n", " 2\n", - " 3\n", - " 4\n", - " 5\n", - " 3\n", - " 4\n", - " 0\n", - " 3\n", - " 0\n", - " 0\n", " \n", + " \n", + "\n", + "" + ], + "text/plain": [ + " 0 1 2\n", + "0 4 1 2\n", + "1 -1 2 -3\n", + "2 5 1 2" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 18 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "J0pBtlkose4C", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 69 + }, + "outputId": "43ff9847-fc8f-4407-debe-6aad3e674229" + }, + "source": [ + "input_vector=np.array([[3],[4],[5]])\n", + "f1(input_vector)" + ], + "execution_count": 19, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([[ 26],\n", + " [-10],\n", + " [ 29]])" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 19 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "C2_-ZKXPtLbx", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 69 + }, + "outputId": "a8f1b596-5665-4ff8-835b-52af42eb71b3" + }, + "source": [ + "output_vector=np.matmul(U, input_vector)\n", + "output_vector" + ], + "execution_count": 20, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([[ 26],\n", + " [-10],\n", + " [ 29]])" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 20 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "n5HUOQIxZ2gp", + "colab_type": "text" + }, + "source": [ + "## 4.2 Verify that your transformation matrices are correct by choosing an input matrix and calculating the result both via the traditional functions above and also via vector-matrix multiplication." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "0UANR1IEaVWE", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# Please see above" + ], + "execution_count": 21, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "vEoiri3mak7j", + "colab_type": "text" + }, + "source": [ + "# Eigenvalues and Eigenvectors" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "5HY0R4u7anIr", + "colab_type": "text" + }, + "source": [ + "## 5.1 In your own words, give an explanation for the intuition behind eigenvalues and eigenvectors." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "0sp4C4MOuTIr", + "colab_type": "text" + }, + "source": [ + "Eigenvector: Any vector that doesn't change its orientation during a given transformation (an eigenvector can be scaled by some scalar).\n", + "\n", + "Eigenvalue: The scalar that represents how its corresponding eigenvector was scaled during a linear transformation." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "VdehMwBtatKI", + "colab_type": "text" + }, + "source": [ + "# The Curse of Dimensionality" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "4oVrJax-a3SK", + "colab_type": "text" + }, + "source": [ + "## 6.1 What are some of the challenges of working with high dimensional spaces?" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "UeJIN3_7vUG1", + "colab_type": "text" + }, + "source": [ + "Challenge: Too many features, not enough data." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ZiBJxsZla88c", + "colab_type": "text" + }, + "source": [ + "## 6.2 What is the rule of thumb for how many observations you should have compared to parameters in your model?" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "VLqCzAtYvZbB", + "colab_type": "text" + }, + "source": [ + "At least 5x the number of rows as columns." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "NZmqdeygbHJx", + "colab_type": "text" + }, + "source": [ + "# Principal Component Analysis" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "7iEheetpbJdN", + "colab_type": "text" + }, + "source": [ + "## 7.1 Code for loading and cleaning the 2013 national dataset from the [Housing Affordability Data System (HADS)](https://www.huduser.gov/portal/datasets/hads/hads.html) --housing data, can be found below. \n", + "\n", + "## Perform PCA on the processed dataset `national_processed` (Make sure you standardize your data!) and then make a scatterplot of PC1 against PC2. Some of our discussion and work around PCA with this dataset will continue during tomorrow's lecture and assignment.\n", + "\n", + "Not only does this dataset have decent amount columns to begin with (99), but in preparing the data for PCA we have also [one-hot-encoded](https://hackernoon.com/what-is-one-hot-encoding-why-and-when-do-you-have-to-use-it-e3c6186d008f#targetText=One%20hot%20encoding%20is%20a,the%20entry%20in%20the%20dataset.) all of the categorical variables. This has the effect of creating a new column for each individual category of each categorical variable. After processing this dataset has 64738 columns. --Das a lot of columns.\n", + "\n", + "Don't worry too much about the mechanics of one-hot encoding right now, you will learn and experiment with a whole bunch of categorical encoding approaches in unit 2. \n", + "\n", + "The code below will read in the dataset and perform the one-hot encoding of the categorical variables. Start adding your PCA code at the bottom of the provided code." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Us4nNFs02HlD", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 355 + }, + "outputId": "60030d25-664f-4112-c64c-ff6b8b493d0c" + }, + "source": [ + "from urllib.request import urlopen\n", + "from zipfile import ZipFile\n", + "from io import BytesIO\n", + "import os.path\n", + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# Read National Data \n", + "national_url = 'https://www.huduser.gov/portal/datasets/hads/hads2013n_ASCII.zip'\n", + "national_file = 'thads2013n.txt'\n", + "\n", + "if os.path.exists(national_file):\n", + " national = pd.read_csv(national_file)\n", + "else: \n", + " z_national = urlopen(national_url)\n", + " zip_national = ZipFile(BytesIO(z_national.read())).extract(national_file)\n", + " national = pd.read_csv(zip_national)\n", + "\n", + "print(national.shape)\n", + "national.head()" + ], + "execution_count": 22, + "outputs": [ + { + "output_type": "stream", + "text": [ + "(64535, 99)\n" + ], + "name": "stdout" + }, + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
CONTROLAGE1METRO3REGIONLMEDFMRL30L50L80IPOVBEDRMSBUILTSTATUSTYPEVALUEVACANCYTENURENUNITSROOMSWEIGHTPERZINC2ZADEQZSMHCSTRUCTURETYPEOWNRENTUTILITYOTHERCOSTCOST06COST12COST08COSTMEDTOTSALASSISTEDGLMEDGL30GL50GL80APLMEDABL30...COST08RELPOVCATCOST08RELFMRPCTCOST08RELFMRCATCOST12RELAMIPCTCOST12RELAMICATCOST12RELPOVPCTCOST12RELPOVCATCOST12RELFMRPCTCOST12RELFMRCATCOSTMedRELAMIPCTCOSTMedRELAMICATCOSTMedRELPOVPCTCOSTMedRELPOVCATCOSTMedRELFMRPCTCOSTMedRELFMRCATFMTZADEQFMTMETRO3FMTBUILTFMTSTRUCTURETYPEFMTBEDRMSFMTOWNRENTFMTCOST06RELPOVCATFMTCOST08RELPOVCATFMTCOST12RELPOVCATFMTCOSTMEDRELPOVCATFMTINCRELPOVCATFMTCOST06RELFMRCATFMTCOST08RELFMRCATFMTCOST12RELFMRCATFMTCOSTMEDRELFMRCATFMTINCRELFMRCATFMTCOST06RELAMICATFMTCOST08RELAMICATFMTCOST12RELAMICATFMTCOSTMEDRELAMICATFMTINCRELAMICATFMTASSISTEDFMTBURDENFMTREGIONFMTSTATUS
0'100003130103'82'3''1'737389561573826213403221106722006'1'140000-6'1'163117.394239118021'1'5331'1'169.000000213.750000648.588189803.050535696.905247615.1567120-97373815738262134032251616.620234.571429...472.898038248.4026352290.250487484.001102237.0776242222.339102464.3469362'1 Adequate''-5''2000-2009''1 Single Family''2 2BR''1 Owner''4 200%+ Poverty''4 200%+ Poverty''4 200%+ Poverty''4 200%+ Poverty''3 150-200% Poverty''2 50.1 - 100% FMR''2 50.1 - 100% FMR''2 50.1 - 100% FMR''2 50.1 - 100% FMR''1 LTE 50% FMR''2 30 - 50% AMI''2 30 - 50% AMI''2 30 - 50% AMI''2 30 - 50% AMI''2 30 - 50% AMI''.''2 30% to 50%''-5''-5'
1'100006110249'50'5''3'5584611001716528604457442421841980'1'1130000-6'1'162150.7255444122961'1'4871'1'245.33333358.3333331167.6407811669.6434051324.6712181058.988479123000-95584617165286044574455846.019911.400000...4120.4246563103.0940636275.7689994151.785764365.3884684174.909320396.2716802'1 Adequate''-5''1980-1989''1 Single Family''4 4BR+''1 Owner''3 150-200% Poverty''4 200%+ Poverty''4 200%+ Poverty''3 150-200% Poverty''4 200%+ Poverty''3 GT FMR''3 GT FMR''3 GT FMR''2 50.1 - 100% FMR''3 GT FMR''4 60 - 80% AMI''4 60 - 80% AMI''6 100 - 120% AMI''4 60 - 80% AMI''7 120% AMI +''.''1 Less than 30%''-5''-5'
2'100006370140'53'5''3'5584611001375022897366141547041985'1'1150000-6'1'172213.789404227974'1'14051'1'159.00000037.5000001193.3932091772.6270061374.5821751068.02516828000-95584613750228973661444676.819937.500000...4124.9620163109.4529056458.3392394161.147910365.9464494276.153890497.0931972'1 Adequate''-5''1980-1989''1 Single Family''4 4BR+''1 Owner''4 200%+ Poverty''4 200%+ Poverty''4 200%+ Poverty''4 200%+ Poverty''3 150-200% Poverty''3 GT FMR''3 GT FMR''3 GT FMR''2 50.1 - 100% FMR''2 50.1 - 100% FMR''4 60 - 80% AMI''5 80 - 100% AMI''6 100 - 120% AMI''4 60 - 80% AMI''4 60 - 80% AMI''.''3 50% or More''-5''-5'
3'100006520140'67'5''3'558469491375022897366141396431985'1'1200000-6'1'162364.585097232220'1'2791'1'179.00000070.6666671578.8576122351.1693411820.4429001411.7002240-95584613750228973661444676.817875.000000...4191.8274923161.9267097673.4945124247.752301397.2248015404.3827634148.7566103'1 Adequate''-5''1980-1989''1 Single Family''3 3BR''1 Owner''4 200%+ Poverty''4 200%+ Poverty''4 200%+ Poverty''4 200%+ Poverty''4 200%+ Poverty''3 GT FMR''3 GT FMR''3 GT FMR''3 GT FMR''2 50.1 - 100% FMR''6 100 - 120% AMI''7 120% AMI +''7 120% AMI +''5 80 - 100% AMI''4 60 - 80% AMI''.''1 Less than 30%''-5''-5'
4'100007130148'26'1''3'609917371480124628394211549221980'1'1-6-6'2'10042314.524902296874'1'7595'2'146.00000012.500000759.000000759.000000759.000000759.0000009690006099114801246283942148792.816651.125000...3102.985075355.3087073195.9721153102.985075355.3087073195.9721153102.9850753'1 Adequate''Central City''1980-1989''5 50+ units''2 2BR''2 Renter''3 150-200% Poverty''3 150-200% Poverty''3 150-200% Poverty''3 150-200% Poverty''4 200%+ Poverty''3 GT FMR''3 GT FMR''3 GT FMR''3 GT FMR''3 GT FMR''3 50 - 60% AMI''3 50 - 60% AMI''3 50 - 60% AMI''3 50 - 60% AMI''7 120% AMI +''0 Not Assisted''1 Less than 30%''-5''-5'
\n", + "

5 rows × 99 columns

\n", + "
" + ], + "text/plain": [ + " CONTROL AGE1 METRO3 ... FMTBURDEN FMTREGION FMTSTATUS\n", + "0 '100003130103' 82 '3' ... '2 30% to 50%' '-5' '-5'\n", + "1 '100006110249' 50 '5' ... '1 Less than 30%' '-5' '-5'\n", + "2 '100006370140' 53 '5' ... '3 50% or More' '-5' '-5'\n", + "3 '100006520140' 67 '5' ... '1 Less than 30%' '-5' '-5'\n", + "4 '100007130148' 26 '1' ... '1 Less than 30%' '-5' '-5'\n", + "\n", + "[5 rows x 99 columns]" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 22 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "O5zrMTud2qFU", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 225 + }, + "outputId": "bdda92de-8103-426b-e536-6e47c356bf6d" + }, + "source": [ + "# Look at datatypes\n", + "# a lot of object datatypes even though they seem to be strings of numbers.\n", + "national.dtypes" + ], + "execution_count": 23, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "CONTROL object\n", + "AGE1 int64\n", + "METRO3 object\n", + "REGION object\n", + "LMED int64\n", + " ... \n", + "FMTINCRELAMICAT object\n", + "FMTASSISTED object\n", + "FMTBURDEN object\n", + "FMTREGION object\n", + "FMTSTATUS object\n", + "Length: 99, dtype: object" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 23 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "yIrOjVmd2yLz", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "outputId": "e3383813-6387-4368-ac64-fd5a18fb936c" + }, + "source": [ + "# check for null values\n", + "national.isnull().sum().any()" + ], + "execution_count": 24, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "False" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 24 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "2u9tdmwX3KL_", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 52 + }, + "outputId": "d9411274-1e32-482c-cc6f-7762cee174e0" + }, + "source": [ + "# check for number of categorical vs numeric columns\n", + "cat_cols = national.columns[national.dtypes=='object']\n", + "num_cols = national.columns[national.dtypes!='object']\n", + "\n", + "print(f'{len(cat_cols)} categorical columns')\n", + "print(f'{len(num_cols)} numerical columns')" + ], + "execution_count": 25, + "outputs": [ + { + "output_type": "stream", + "text": [ + "32 categorical columns\n", + "67 numerical columns\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "UMHOtOs_3gcL", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 225 + }, + "outputId": "f924a660-8600-4987-88d9-2e41cfe8b61e" + }, + "source": [ + "# We're making a copy of our data in case we mess something up.\n", + "national_processed = national.copy()\n", + "\n", + "# Categorically Encode our Variables:\n", + "# They need to all be numeric before we do PCA.\n", + "# https://pbpython.com/categorical-encoding.html\n", + "\n", + "# Cast categorical columns to \"category\" data type\n", + "national_processed[cat_cols] = national_processed[cat_cols].astype('category')\n", + "\n", + "national_processed.dtypes" + ], + "execution_count": 26, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "CONTROL category\n", + "AGE1 int64\n", + "METRO3 category\n", + "REGION category\n", + "LMED int64\n", + " ... \n", + "FMTINCRELAMICAT category\n", + "FMTASSISTED category\n", + "FMTBURDEN category\n", + "FMTREGION category\n", + "FMTSTATUS category\n", + "Length: 99, dtype: object" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 26 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "ymxU-aPtQ1eq", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 269 + }, + "outputId": "1f3c363f-4727-42bc-f676-0173442c51f5" + }, + "source": [ + "# Replace all category cell values with their numeric category codes\n", + "for col in cat_cols:\n", + " national_processed[col] = national_processed[col].cat.codes\n", + "\n", + "print(national_processed.shape)\n", + "national_processed.head()" + ], + "execution_count": 27, + "outputs": [ + { + "output_type": "stream", + "text": [ + "(64535, 99)\n" + ], + "name": "stdout" + }, + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
CONTROLAGE1METRO3REGIONLMEDFMRL30L50L80IPOVBEDRMSBUILTSTATUSTYPEVALUEVACANCYTENURENUNITSROOMSWEIGHTPERZINC2ZADEQZSMHCSTRUCTURETYPEOWNRENTUTILITYOTHERCOSTCOST06COST12COST08COSTMEDTOTSALASSISTEDGLMEDGL30GL50GL80APLMEDABL30...COST08RELPOVCATCOST08RELFMRPCTCOST08RELFMRCATCOST12RELAMIPCTCOST12RELAMICATCOST12RELPOVPCTCOST12RELPOVCATCOST12RELFMRPCTCOST12RELFMRCATCOSTMedRELAMIPCTCOSTMedRELAMICATCOSTMedRELPOVPCTCOSTMedRELPOVCATCOSTMedRELFMRPCTCOSTMedRELFMRCATFMTZADEQFMTMETRO3FMTBUILTFMTSTRUCTURETYPEFMTBEDRMSFMTOWNRENTFMTCOST06RELPOVCATFMTCOST08RELPOVCATFMTCOST12RELPOVCATFMTCOSTMEDRELPOVCATFMTINCRELPOVCATFMTCOST06RELFMRCATFMTCOST08RELFMRCATFMTCOST12RELFMRCATFMTCOSTMEDRELFMRCATFMTINCRELFMRCATFMTCOST06RELAMICATFMTCOST08RELAMICATFMTCOST12RELAMICATFMTCOSTMEDRELAMICATFMTINCRELAMICATFMTASSISTEDFMTBURDENFMTREGIONFMTSTATUS
0082207373895615738262134032211067220060140000-61163117.394239118021153310169.000000213.750000648.588189803.050535696.905247615.1567120-97373815738262134032251616.620234.571429...472.898038248.4026352290.250487484.001102237.0776242222.339102464.34693621051204444311111111120200
115042558461100171652860445744242184198001130000-61162150.7255444122961148710245.33333358.3333331167.6407811669.6434051324.6712181058.988479123000-95584617165286044574455846.019911.400000...4120.4246563103.0940636275.7689994151.785764365.3884684174.909320396.27168021031403443422213335370100
225342558461100137502289736614154704198501150000-61172213.7894042279741140510159.00000037.5000001193.3932091772.6270061374.5821751068.02516828000-95584613750228973661444676.819937.500000...4124.9620163109.4529056458.3392394161.147910365.9464494276.153890497.09319721031404444322212345340300
33674255846949137502289736614139643198501200000-61162364.585097232220127910179.00000070.6666671578.8576122351.1693411820.4429001411.7002240-95584613750228973661444676.817875.000000...4191.8274923161.9267097673.4945124247.752301397.2248015404.3827634148.75661031031304444422222566440100
44260260991737148012462839421154922198001-6-6210042314.524902296874175951146.00000012.500000759.000000759.000000759.000000759.0000009690006099114801246283942148792.816651.125000...3102.985075355.3087073195.9721153102.985075355.3087073195.9721153102.98507531135213333422223222271100
\n", + "

5 rows × 99 columns

\n", + "
" + ], + "text/plain": [ + " CONTROL AGE1 METRO3 REGION ... FMTASSISTED FMTBURDEN FMTREGION FMTSTATUS\n", + "0 0 82 2 0 ... 0 2 0 0\n", + "1 1 50 4 2 ... 0 1 0 0\n", + "2 2 53 4 2 ... 0 3 0 0\n", + "3 3 67 4 2 ... 0 1 0 0\n", + "4 4 26 0 2 ... 1 1 0 0\n", + "\n", + "[5 rows x 99 columns]" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 27 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "6NS5AQpcQ8Je", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 225 + }, + "outputId": "2a40e50a-3d1c-4727-96aa-3857d7fcd317" + }, + "source": [ + "# Now we only have numeric columns (ints and floats)\n", + "national_processed.dtypes" + ], + "execution_count": 28, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "CONTROL int32\n", + "AGE1 int64\n", + "METRO3 int8\n", + "REGION int8\n", + "LMED int64\n", + " ... \n", + "FMTINCRELAMICAT int8\n", + "FMTASSISTED int8\n", + "FMTBURDEN int8\n", + "FMTREGION int8\n", + "FMTSTATUS int8\n", + "Length: 99, dtype: object" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 28 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "WAJ8bjVcEwhA", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "outputId": "537e50d2-087b-42ce-e6e0-e3711ae3c053" + }, + "source": [ + "# standardize the data\n", + "from sklearn.preprocessing import StandardScaler\n", + "feature_cols=national_processed.columns[1:]\n", + "feature_cols[:5]" + ], + "execution_count": 29, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "Index(['AGE1', 'METRO3', 'REGION', 'LMED', 'FMR'], dtype='object')" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 29 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "8jG7sW73GRjW", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# normalize the features\n", + "x = national_processed.loc[:, feature_cols].values\n", + "x = StandardScaler().fit_transform(x)" + ], + "execution_count": 30, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "1VJm0vyuGeSB", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 52 + }, + "outputId": "3a38e30d-9acc-405c-9d29-aed4cc5e962f" + }, + "source": [ + "# check whether the normalized data has a mean\n", + "# of zero and a standard deviation of 1\n", + "print('{:.2f}'.format(np.mean(x)))\n", + "print(np.std(x))" + ], + "execution_count": 31, + "outputs": [ + { + "output_type": "stream", + "text": [ + "0.00\n", + "0.9948848769417227\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "zZIWFkHiG2QL", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 251 + }, + "outputId": "e1cd1646-5ee3-43b8-c67c-e6be59992111" + }, + "source": [ + "# convert normalized features into a dataframe\n", + "normal_national_processed = pd.DataFrame(x,columns=feature_cols)\n", + "normal_national_processed.head(5)" + ], + "execution_count": 32, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
AGE1METRO3REGIONLMEDFMRL30L50L80IPOVBEDRMSBUILTSTATUSTYPEVALUEVACANCYTENURENUNITSROOMSWEIGHTPERZINC2ZADEQZSMHCSTRUCTURETYPEOWNRENTUTILITYOTHERCOSTCOST06COST12COST08COSTMEDTOTSALASSISTEDGLMEDGL30GL50GL80APLMEDABL30ABL50...COST08RELPOVCATCOST08RELFMRPCTCOST08RELFMRCATCOST12RELAMIPCTCOST12RELAMICATCOST12RELPOVPCTCOST12RELPOVCATCOST12RELFMRPCTCOST12RELFMRCATCOSTMedRELAMIPCTCOSTMedRELAMICATCOSTMedRELPOVPCTCOSTMedRELPOVCATCOSTMedRELFMRPCTCOSTMedRELFMRCATFMTZADEQFMTMETRO3FMTBUILTFMTSTRUCTURETYPEFMTBEDRMSFMTOWNRENTFMTCOST06RELPOVCATFMTCOST08RELPOVCATFMTCOST12RELPOVCATFMTCOSTMEDRELPOVCATFMTINCRELPOVCATFMTCOST06RELFMRCATFMTCOST08RELFMRCATFMTCOST12RELFMRCATFMTCOSTMEDRELFMRCATFMTINCRELFMRCATFMTCOST06RELAMICATFMTCOST08RELAMICATFMTCOST12RELAMICATFMTCOSTMEDRELAMICATFMTINCRELAMICATFMTASSISTEDFMTBURDENFMTREGIONFMTSTATUS
01.4880750.608784-1.3278720.454953-0.528766-0.444470-0.445262-0.553127-0.681429-0.6037001.504196-0.271749-0.142292-0.409728-0.26814-0.518234-0.2537010.1936410.989256-0.345248-0.582421-0.001189-0.538157-0.626460-0.858681-0.1083181.002403-0.524572-0.489431-0.511002-0.535753-0.693001-0.7743030.454953-0.444470-0.445262-0.553127-0.100276-0.139349-0.140598...0.448213-0.508180-0.588115-0.524716-1.139197-0.2942000.432580-0.487463-0.685212-0.580668-0.896546-0.2728480.472927-0.526199-0.452728-0.001189-0.7066471.728565-0.627170-0.612264-0.8586810.6766100.6498380.6157310.7035410.071352-0.518776-0.588115-0.685212-0.452728-1.091609-0.956874-1.028145-1.139197-0.896546-0.779119-0.7092780.549473-0.4621070.0
10.0888122.1842700.576698-0.991324-0.163391-0.123184-0.122457-0.0435661.1401321.2248390.515773-0.271749-0.142292-0.048319-0.26814-0.518234-0.2537010.1936410.2131780.8237430.827974-0.001189-0.584987-0.626460-0.8586810.478101-0.065553-0.214100-0.155728-0.190289-0.2354101.204959-0.774303-0.991324-0.123184-0.122457-0.0435660.108920-0.207233-0.206327...0.448213-0.1351920.796007-0.1027320.682587-0.3165210.432580-0.0844200.716067-0.2034810.115986-0.3991990.167739-0.199905-0.452728-0.001189-0.7066470.467274-0.6271701.390040-0.858681-0.0809370.6498380.615731-0.0523820.7783500.8598200.7960070.716067-0.4527280.9260910.024966-0.0774780.6825870.1159861.171883-0.709278-0.544709-0.4621070.0
20.2199932.1842700.576698-0.991324-0.163391-0.892063-0.892949-0.901606-0.0715641.2248390.705854-0.271749-0.1422920.031993-0.26814-0.518234-0.2537010.7187080.2638080.044416-0.448652-0.0011890.349585-0.626460-0.858681-0.185141-0.208710-0.198696-0.116072-0.164791-0.229295-0.260945-0.774303-0.991324-0.892063-0.892949-0.901606-0.443533-0.201751-0.203806...0.448213-0.0995830.796007-0.0536690.682587-0.0351180.432580-0.0287530.716067-0.1960460.115986-0.1294880.472927-0.191508-0.452728-0.001189-0.7066470.467274-0.6271701.390040-0.8586810.6766100.6498380.6157310.7035410.0713520.8598200.7960070.716067-0.452728-0.0827590.0249660.3978560.6825870.1159860.001282-0.7092781.643655-0.4621070.0
30.8321702.1842700.576698-0.991324-0.546527-0.892063-0.892949-0.901606-0.2801620.3105700.705854-0.271749-0.1422920.232776-0.26814-0.518234-0.2537010.1936410.3848720.044416-0.391586-0.001189-0.796742-0.626460-0.858681-0.0314940.0191970.0318700.1067100.0629910.003272-0.693001-0.774303-0.991324-0.892063-0.892949-0.901606-0.443533-0.634993-0.636447...0.4482130.4251760.7960070.3512041.1380320.2965100.4325800.4861900.7160670.2206770.6222520.2121080.4729270.3365290.923669-0.001189-0.7066470.467274-0.6271700.388888-0.8586810.6766100.6498380.6157310.7035410.7783500.8598200.7960070.7160670.923669-0.0827591.0068071.3485231.1380320.6222520.001282-0.709278-0.544709-0.4621070.0
4-0.960634-0.9667020.576698-0.575434-1.084440-0.655433-0.659250-0.637803-0.068517-0.6037000.515773-0.271749-0.142292-0.570378-0.268141.0978991.554657-0.8564940.3446820.0444160.477364-0.001189-0.3080772.0944011.164576-0.285012-0.380500-0.458529-0.506394-0.479279-0.4384140.8022211.226057-0.575434-0.655433-0.659250-0.637803-0.239947-0.892076-0.895889...0.144074-0.2720580.796007-0.471430-0.683751-0.4395150.129067-0.3745850.716067-0.337774-0.390280-0.3430890.167739-0.1312890.923669-0.0011891.4151340.4672742.095949-0.6122641.164576-0.080937-0.110391-0.147898-0.0523820.7783500.8598200.7960070.7160670.9236690.926091-0.465954-0.552811-0.683751-0.3902801.1718830.773833-0.544709-0.4621070.0
\n", + "

5 rows × 98 columns

\n", + "
" + ], + "text/plain": [ + " AGE1 METRO3 REGION ... FMTBURDEN FMTREGION FMTSTATUS\n", + "0 1.488075 0.608784 -1.327872 ... 0.549473 -0.462107 0.0\n", + "1 0.088812 2.184270 0.576698 ... -0.544709 -0.462107 0.0\n", + "2 0.219993 2.184270 0.576698 ... 1.643655 -0.462107 0.0\n", + "3 0.832170 2.184270 0.576698 ... -0.544709 -0.462107 0.0\n", + "4 -0.960634 -0.966702 0.576698 ... -0.544709 -0.462107 0.0\n", + "\n", + "[5 rows x 98 columns]" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 32 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "93s4xwm-HCnW", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# use sklearn library to import PCA module\n", + "from sklearn.decomposition import PCA" + ], + "execution_count": 33, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "ux_URDveHKrg", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# instantiate the sklearn class\n", + "# pass the desired number of components\n", + "pca_national_processed = PCA(n_components=2)" + ], + "execution_count": 34, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "3S_HdFPtHlhQ", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# call fit_transform on the aggregate data\n", + "pca_data = pca_national_processed.fit_transform(x)" + ], + "execution_count": 35, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "5RYJpK2DHuQT", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 202 + }, + "outputId": "8d94fd88-fd3b-443b-b254-f4db40896cc0" + }, + "source": [ + "# create DataFrame with principle component\n", + "# values for all samples\n", + "df_final = pd.DataFrame(data = pca_data, columns = ['comp_1', 'comp_2'])\n", + "df_final.head()" + ], + "execution_count": 36, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
comp_1comp_2
0-2.607484-1.380332
12.010313-0.992019
21.1848490.366219
32.7917721.719967
4-1.600407-0.882243
\n", + "
" + ], + "text/plain": [ + " comp_1 comp_2\n", + "0 -2.607484 -1.380332\n", + "1 2.010313 -0.992019\n", + "2 1.184849 0.366219\n", + "3 2.791772 1.719967\n", + "4 -1.600407 -0.882243" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 36 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "KZwFfWOQH0HB", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "outputId": "32864ec5-d3ac-4ed3-d048-dc212d601838" + }, + "source": [ + "# how much variation did each principal component explain?\n", + "pca_national_processed.explained_variance_ratio_" + ], + "execution_count": 37, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([0.34391213, 0.14590979])" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 37 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "bKPkNL8_IwiR", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "outputId": "bfa31fac-c680-46f6-c962-47159ee1ec1e" + }, + "source": [ + "# total variance explained\n", + "sum(pca_national_processed.explained_variance_ratio_)" + ], + "execution_count": 38, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "0.48982192040999617" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 38 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "-am2JRWwI4uI", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "outputId": "f9ad97b1-da78-43d5-89d4-19a1a9adc979" + }, + "source": [ + "# How much info did we lose?\n", + "1-sum(pca_national_processed.explained_variance_ratio_)" + ], + "execution_count": 39, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "0.5101780795900038" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 39 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "kbmUexuoI93e", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 202 + }, + "outputId": "ba8b4311-9e00-4d57-aa4e-3f4053a2ca09" + }, + "source": [ + "# add back in the target\n", + "df_final['CONTROL']=national_processed['CONTROL']\n", + "df_final.sample(5)" + ], + "execution_count": 40, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
comp_1comp_2CONTROL
33674255846949137502289736614139643198501200000-61162364.585097232220127910179.00000070.6666671578.8576122351.1693411820.4429001411.7002240-95584613750228973661444676.817875.000000...4191.8274923161.9267097673.4945124247.752301397.2248015404.3827634148.756610310313044444222225664401001479-7.09117911.9029691479
44260260991737148012462839421154922198001-6-6210042314.524902296874175951146.00000012.500000759.000000759.000000759.000000759.0000009690006099114801246283942148792.816651.125000...3102.985075355.3087073195.9721153102.985075355.3087073195.9721153102.9850753113521333342222322227110097034.9309480.1513429703
53432-2.5292420.24536953432
63472-8.029214-2.70002763472
31597.392706-1.1488143159
\n", - "

5 rows × 99 columns

\n", "
" ], "text/plain": [ - " CONTROL AGE1 METRO3 REGION ... FMTASSISTED FMTBURDEN FMTREGION FMTSTATUS\n", - "0 0 82 2 0 ... 0 2 0 0\n", - "1 1 50 4 2 ... 0 1 0 0\n", - "2 2 53 4 2 ... 0 3 0 0\n", - "3 3 67 4 2 ... 0 1 0 0\n", - "4 4 26 0 2 ... 1 1 0 0\n", - "\n", - "[5 rows x 99 columns]" + " comp_1 comp_2 CONTROL\n", + "1479 -7.091179 11.902969 1479\n", + "9703 4.930948 0.151342 9703\n", + "53432 -2.529242 0.245369 53432\n", + "63472 -8.029214 -2.700027 63472\n", + "3159 7.392706 -1.148814 3159" ] }, "metadata": { "tags": [] }, - "execution_count": 7 + "execution_count": 40 } ] }, { "cell_type": "code", "metadata": { - "id": "6NS5AQpcQ8Je", + "id": "KinfjUzjg3qH", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", - "height": 1000 + "height": 202 }, - "outputId": "3cbe9b8e-05e4-4126-f072-030c8d2ac7b4" + "outputId": "71099549-6827-4764-ebea-a65e60aa17ec" }, "source": [ - "# Now we only ahve numeric columns (ints and floats)\n", - "national_processed.dtypes" + "df_final.drop(['CONTROL'], axis=1, inplace=True)\n", + "df_final.sample(5)" ], - "execution_count": 10, + "execution_count": 47, "outputs": [ { "output_type": "execute_result", "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
comp_1comp_2
83174.500217-2.482691
47877-3.732058-0.942890
35896-0.2450051.148639
42274-1.293870-2.844602
224383.778215-1.107943
\n", + "
" + ], "text/plain": [ - "CONTROL int32\n", - "AGE1 int64\n", - "METRO3 int8\n", - "REGION int8\n", - "LMED int64\n", - "FMR int64\n", - "L30 int64\n", - "L50 int64\n", - "L80 int64\n", - "IPOV int64\n", - "BEDRMS int64\n", - "BUILT int64\n", - "STATUS int8\n", - "TYPE int64\n", - "VALUE int64\n", - "VACANCY int64\n", - "TENURE int8\n", - "NUNITS int64\n", - "ROOMS int64\n", - "WEIGHT float64\n", - "PER int64\n", - "ZINC2 int64\n", - "ZADEQ int8\n", - "ZSMHC int64\n", - "STRUCTURETYPE int64\n", - "OWNRENT int8\n", - "UTILITY float64\n", - "OTHERCOST float64\n", - "COST06 float64\n", - "COST12 float64\n", - " ... \n", - "COSTMedRELAMICAT int64\n", - "COSTMedRELPOVPCT float64\n", - "COSTMedRELPOVCAT int64\n", - "COSTMedRELFMRPCT float64\n", - "COSTMedRELFMRCAT int64\n", - "FMTZADEQ int8\n", - "FMTMETRO3 int8\n", - "FMTBUILT int8\n", - "FMTSTRUCTURETYPE int8\n", - "FMTBEDRMS int8\n", - "FMTOWNRENT int8\n", - "FMTCOST06RELPOVCAT int8\n", - "FMTCOST08RELPOVCAT int8\n", - "FMTCOST12RELPOVCAT int8\n", - "FMTCOSTMEDRELPOVCAT int8\n", - "FMTINCRELPOVCAT int8\n", - "FMTCOST06RELFMRCAT int8\n", - "FMTCOST08RELFMRCAT int8\n", - "FMTCOST12RELFMRCAT int8\n", - "FMTCOSTMEDRELFMRCAT int8\n", - "FMTINCRELFMRCAT int8\n", - "FMTCOST06RELAMICAT int8\n", - "FMTCOST08RELAMICAT int8\n", - "FMTCOST12RELAMICAT int8\n", - "FMTCOSTMEDRELAMICAT int8\n", - "FMTINCRELAMICAT int8\n", - "FMTASSISTED int8\n", - "FMTBURDEN int8\n", - "FMTREGION int8\n", - "FMTSTATUS int8\n", - "Length: 99, dtype: object" + " comp_1 comp_2\n", + "8317 4.500217 -2.482691\n", + "47877 -3.732058 -0.942890\n", + "35896 -0.245005 1.148639\n", + "42274 -1.293870 -2.844602\n", + "22438 3.778215 -1.107943" ] }, "metadata": { "tags": [] }, - "execution_count": 10 + "execution_count": 47 } ] }, { "cell_type": "code", "metadata": { - "id": "WAJ8bjVcEwhA", + "id": "54GOVpkpLxfH", "colab_type": "code", - "colab": {} + "colab": { + "base_uri": "https://localhost:8080/", + "height": 287 + }, + "outputId": "7f9421b9-63b0-4d8d-df13-d3a1196e8b2d" }, "source": [ - "### Your Code Here" + "# plot the components\n", + "plt.scatter(df_final['comp_1'], df_final['comp_2'])\n", + "plt.xlabel('Component 1')\n", + "plt.ylabel('Component 2');" ], - "execution_count": 0, - "outputs": [] + "execution_count": 48, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] }, { "cell_type": "markdown", diff --git a/module4-clustering/LS_DS_134_Clustering_Assignment.ipynb b/module4-clustering/LS_DS_134_Clustering_Assignment.ipynb index 3342efb0..e934d4a2 100644 --- a/module4-clustering/LS_DS_134_Clustering_Assignment.ipynb +++ b/module4-clustering/LS_DS_134_Clustering_Assignment.ipynb @@ -54,11 +54,11 @@ "metadata": { "id": "ws5R9X6hLJQ2", "colab_type": "code", - "outputId": "078a0dfa-1b57-4a70-b7dd-6747910059c9", "colab": { "base_uri": "https://localhost:8080/", - "height": 278 - } + "height": 257 + }, + "outputId": "d68dc287-bf70-40da-86d4-4902e18080f3" }, "source": [ "import pandas as pd\n", @@ -72,7 +72,7 @@ "print(df.shape)\n", "df.head()" ], - "execution_count": 0, + "execution_count": 88, "outputs": [ { "output_type": "stream", @@ -113,7 +113,19 @@ " compactness_mean\n", " concavity_mean\n", " concave points_mean\n", - " ...\n", + " symmetry_mean\n", + " fractal_dimension_mean\n", + " radius_se\n", + " texture_se\n", + " perimeter_se\n", + " area_se\n", + " smoothness_se\n", + " compactness_se\n", + " concavity_se\n", + " concave points_se\n", + " symmetry_se\n", + " fractal_dimension_se\n", + " radius_worst\n", " texture_worst\n", " perimeter_worst\n", " area_worst\n", @@ -139,7 +151,19 @@ " 0.27760\n", " 0.3001\n", " 0.14710\n", - " ...\n", + " 0.2419\n", + " 0.07871\n", + " 1.0950\n", + " 0.9053\n", + " 8.589\n", + " 153.40\n", + " 0.006399\n", + " 0.04904\n", + " 0.05373\n", + " 0.01587\n", + " 0.03003\n", + " 0.006193\n", + " 25.38\n", " 17.33\n", " 184.60\n", " 2019.0\n", @@ -163,7 +187,19 @@ " 0.07864\n", " 0.0869\n", " 0.07017\n", - " ...\n", + " 0.1812\n", + " 0.05667\n", + " 0.5435\n", + " 0.7339\n", + " 3.398\n", + " 74.08\n", + " 0.005225\n", + " 0.01308\n", + " 0.01860\n", + " 0.01340\n", + " 0.01389\n", + " 0.003532\n", + " 24.99\n", " 23.41\n", " 158.80\n", " 1956.0\n", @@ -187,7 +223,19 @@ " 0.15990\n", " 0.1974\n", " 0.12790\n", - " ...\n", + " 0.2069\n", + " 0.05999\n", + " 0.7456\n", + " 0.7869\n", + " 4.585\n", + " 94.03\n", + " 0.006150\n", + " 0.04006\n", + " 0.03832\n", + " 0.02058\n", + " 0.02250\n", + " 0.004571\n", + " 23.57\n", " 25.53\n", " 152.50\n", " 1709.0\n", @@ -211,7 +259,19 @@ " 0.28390\n", " 0.2414\n", " 0.10520\n", - " ...\n", + " 0.2597\n", + " 0.09744\n", + " 0.4956\n", + " 1.1560\n", + " 3.445\n", + " 27.23\n", + " 0.009110\n", + " 0.07458\n", + " 0.05661\n", + " 0.01867\n", + " 0.05963\n", + " 0.009208\n", + " 14.91\n", " 26.50\n", " 98.87\n", " 567.7\n", @@ -235,7 +295,19 @@ " 0.13280\n", " 0.1980\n", " 0.10430\n", - " ...\n", + " 0.1809\n", + " 0.05883\n", + " 0.7572\n", + " 0.7813\n", + " 5.438\n", + " 94.44\n", + " 0.011490\n", + " 0.02461\n", + " 0.05688\n", + " 0.01885\n", + " 0.01756\n", + " 0.005115\n", + " 22.54\n", " 16.67\n", " 152.20\n", " 1575.0\n", @@ -249,44 +321,15 @@ " \n", " \n", "\n", - "

5 rows × 33 columns

\n", "" ], "text/plain": [ - " id diagnosis radius_mean texture_mean perimeter_mean area_mean \\\n", - "0 842302 M 17.99 10.38 122.80 1001.0 \n", - "1 842517 M 20.57 17.77 132.90 1326.0 \n", - "2 84300903 M 19.69 21.25 130.00 1203.0 \n", - "3 84348301 M 11.42 20.38 77.58 386.1 \n", - "4 84358402 M 20.29 14.34 135.10 1297.0 \n", - "\n", - " smoothness_mean compactness_mean concavity_mean concave points_mean \\\n", - "0 0.11840 0.27760 0.3001 0.14710 \n", - "1 0.08474 0.07864 0.0869 0.07017 \n", - "2 0.10960 0.15990 0.1974 0.12790 \n", - "3 0.14250 0.28390 0.2414 0.10520 \n", - "4 0.10030 0.13280 0.1980 0.10430 \n", - "\n", - " ... texture_worst perimeter_worst area_worst smoothness_worst \\\n", - "0 ... 17.33 184.60 2019.0 0.1622 \n", - "1 ... 23.41 158.80 1956.0 0.1238 \n", - "2 ... 25.53 152.50 1709.0 0.1444 \n", - "3 ... 26.50 98.87 567.7 0.2098 \n", - "4 ... 16.67 152.20 1575.0 0.1374 \n", - "\n", - " compactness_worst concavity_worst concave points_worst symmetry_worst \\\n", - "0 0.6656 0.7119 0.2654 0.4601 \n", - "1 0.1866 0.2416 0.1860 0.2750 \n", - "2 0.4245 0.4504 0.2430 0.3613 \n", - "3 0.8663 0.6869 0.2575 0.6638 \n", - "4 0.2050 0.4000 0.1625 0.2364 \n", - "\n", - " fractal_dimension_worst Unnamed: 32 \n", - "0 0.11890 NaN \n", - "1 0.08902 NaN \n", - "2 0.08758 NaN \n", - "3 0.17300 NaN \n", - "4 0.07678 NaN \n", + " id diagnosis ... fractal_dimension_worst Unnamed: 32\n", + "0 842302 M ... 0.11890 NaN\n", + "1 842517 M ... 0.08902 NaN\n", + "2 84300903 M ... 0.08758 NaN\n", + "3 84348301 M ... 0.17300 NaN\n", + "4 84358402 M ... 0.07678 NaN\n", "\n", "[5 rows x 33 columns]" ] @@ -294,7 +337,7 @@ "metadata": { "tags": [] }, - "execution_count": 1 + "execution_count": 88 } ] }, @@ -315,17 +358,17 @@ "metadata": { "id": "86MHoPJon_aC", "colab_type": "code", - "outputId": "d4d9f1cd-c63c-4623-954e-11a61d1e3ced", "colab": { "base_uri": "https://localhost:8080/", - "height": 261 - } + "height": 239 + }, + "outputId": "b150b2a3-7321-444e-8a7d-f202d9fbda37" }, "source": [ "df = df.drop('diagnosis', axis=1)\n", "df.head()" ], - "execution_count": 0, + "execution_count": 89, "outputs": [ { "output_type": "execute_result", @@ -359,7 +402,18 @@ " concavity_mean\n", " concave points_mean\n", " symmetry_mean\n", - " ...\n", + " fractal_dimension_mean\n", + " radius_se\n", + " texture_se\n", + " perimeter_se\n", + " area_se\n", + " smoothness_se\n", + " compactness_se\n", + " concavity_se\n", + " concave points_se\n", + " symmetry_se\n", + " fractal_dimension_se\n", + " radius_worst\n", " texture_worst\n", " perimeter_worst\n", " area_worst\n", @@ -385,7 +439,18 @@ " 0.3001\n", " 0.14710\n", " 0.2419\n", - " ...\n", + " 0.07871\n", + " 1.0950\n", + " 0.9053\n", + " 8.589\n", + " 153.40\n", + " 0.006399\n", + " 0.04904\n", + " 0.05373\n", + " 0.01587\n", + " 0.03003\n", + " 0.006193\n", + " 25.38\n", " 17.33\n", " 184.60\n", " 2019.0\n", @@ -409,7 +474,18 @@ " 0.0869\n", " 0.07017\n", " 0.1812\n", - " ...\n", + " 0.05667\n", + " 0.5435\n", + " 0.7339\n", + " 3.398\n", + " 74.08\n", + " 0.005225\n", + " 0.01308\n", + " 0.01860\n", + " 0.01340\n", + " 0.01389\n", + " 0.003532\n", + " 24.99\n", " 23.41\n", " 158.80\n", " 1956.0\n", @@ -433,7 +509,18 @@ " 0.1974\n", " 0.12790\n", " 0.2069\n", - " ...\n", + " 0.05999\n", + " 0.7456\n", + " 0.7869\n", + " 4.585\n", + " 94.03\n", + " 0.006150\n", + " 0.04006\n", + " 0.03832\n", + " 0.02058\n", + " 0.02250\n", + " 0.004571\n", + " 23.57\n", " 25.53\n", " 152.50\n", " 1709.0\n", @@ -457,7 +544,18 @@ " 0.2414\n", " 0.10520\n", " 0.2597\n", - " ...\n", + " 0.09744\n", + " 0.4956\n", + " 1.1560\n", + " 3.445\n", + " 27.23\n", + " 0.009110\n", + " 0.07458\n", + " 0.05661\n", + " 0.01867\n", + " 0.05963\n", + " 0.009208\n", + " 14.91\n", " 26.50\n", " 98.87\n", " 567.7\n", @@ -481,7 +579,18 @@ " 0.1980\n", " 0.10430\n", " 0.1809\n", - " ...\n", + " 0.05883\n", + " 0.7572\n", + " 0.7813\n", + " 5.438\n", + " 94.44\n", + " 0.011490\n", + " 0.02461\n", + " 0.05688\n", + " 0.01885\n", + " 0.01756\n", + " 0.005115\n", + " 22.54\n", " 16.67\n", " 152.20\n", " 1575.0\n", @@ -495,44 +604,15 @@ " \n", " \n", "\n", - "

5 rows × 32 columns

\n", "" ], "text/plain": [ - " id radius_mean texture_mean perimeter_mean area_mean \\\n", - "0 842302 17.99 10.38 122.80 1001.0 \n", - "1 842517 20.57 17.77 132.90 1326.0 \n", - "2 84300903 19.69 21.25 130.00 1203.0 \n", - "3 84348301 11.42 20.38 77.58 386.1 \n", - "4 84358402 20.29 14.34 135.10 1297.0 \n", - "\n", - " smoothness_mean compactness_mean concavity_mean concave points_mean \\\n", - "0 0.11840 0.27760 0.3001 0.14710 \n", - "1 0.08474 0.07864 0.0869 0.07017 \n", - "2 0.10960 0.15990 0.1974 0.12790 \n", - "3 0.14250 0.28390 0.2414 0.10520 \n", - "4 0.10030 0.13280 0.1980 0.10430 \n", - "\n", - " symmetry_mean ... texture_worst perimeter_worst area_worst \\\n", - "0 0.2419 ... 17.33 184.60 2019.0 \n", - "1 0.1812 ... 23.41 158.80 1956.0 \n", - "2 0.2069 ... 25.53 152.50 1709.0 \n", - "3 0.2597 ... 26.50 98.87 567.7 \n", - "4 0.1809 ... 16.67 152.20 1575.0 \n", - "\n", - " smoothness_worst compactness_worst concavity_worst concave points_worst \\\n", - "0 0.1622 0.6656 0.7119 0.2654 \n", - "1 0.1238 0.1866 0.2416 0.1860 \n", - "2 0.1444 0.4245 0.4504 0.2430 \n", - "3 0.2098 0.8663 0.6869 0.2575 \n", - "4 0.1374 0.2050 0.4000 0.1625 \n", - "\n", - " symmetry_worst fractal_dimension_worst Unnamed: 32 \n", - "0 0.4601 0.11890 NaN \n", - "1 0.2750 0.08902 NaN \n", - "2 0.3613 0.08758 NaN \n", - "3 0.6638 0.17300 NaN \n", - "4 0.2364 0.07678 NaN \n", + " id radius_mean ... fractal_dimension_worst Unnamed: 32\n", + "0 842302 17.99 ... 0.11890 NaN\n", + "1 842517 20.57 ... 0.08902 NaN\n", + "2 84300903 19.69 ... 0.08758 NaN\n", + "3 84348301 11.42 ... 0.17300 NaN\n", + "4 84358402 20.29 ... 0.07678 NaN\n", "\n", "[5 rows x 32 columns]" ] @@ -540,7 +620,7 @@ "metadata": { "tags": [] }, - "execution_count": 2 + "execution_count": 89 } ] }, @@ -565,82 +645,2194 @@ "colab": {} }, "source": [ - "# Perform K-Means Clustering on the Dataset" + "features = ['radius_mean', 'texture_mean']" ], - "execution_count": 0, + "execution_count": 90, "outputs": [] }, { - "cell_type": "markdown", + "cell_type": "code", "metadata": { - "id": "7ghqYSxrP_FE", - "colab_type": "text" + "id": "y9GaKpBJ8h7g", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 280 + }, + "outputId": "dc9d083b-b18b-4861-d9cf-9c5c8e74f629" }, "source": [ - "## Check you work: \n", - "\n", - "This is something that in a truly unsupervised learning situation **WOULD NOT BE POSSIBLE**. But for educational purposes go back and grab the true diagnosis column (label) from the original dataset. Take your cluster labels and compare them to the original diagnosis column. You can make scatterplots for each to see how they compare or you can calculate a percent accuracy score like: \n", - "\\begin{align}\n", - "\\frac{\\text{Num Correct Labels}}{\\text{Num Total Observations}}\n", - "\\end{align}" + "df[features].plot(kind='scatter', x=features[0], y=features[1]);" + ], + "execution_count": 91, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } ] }, { "cell_type": "code", "metadata": { - "id": "OIG7-yGLP-eA", + "id": "X9puBZgT9k-S", "colab_type": "code", "colab": {} }, "source": [ - "# Your Code Here" + "# Initialize instance of KMeans class from sklearn\n", + "k = 3\n", + "model = KMeans(n_clusters=k, max_iter=1)" ], - "execution_count": 0, + "execution_count": 92, "outputs": [] }, { - "cell_type": "markdown", + "cell_type": "code", "metadata": { - "id": "BedOTS0eJ9_K", - "colab_type": "text" + "id": "jGgbO3Ql9wQw", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 69 + }, + "outputId": "b968ab68-62b8-44ba-be7f-b3bda131df25" }, "source": [ - "# 2) Perform PCA on your dataset first and *then* use k-means clustering. \n", - "\n", - "- You need to standardize your data before PCA.\n", - "- First try clustering just on PC1 and PC2 so that you can make a scatterplot of your clustering.\n", - "- Then use use a scree plot to decide how many principal components to include in your clustering, and use however many principal components you need in order to retain 90% of the variation of the original dataset\n", - "\n" + "# fit the instantiated model to our dataframe\n", + "model.fit(df[features].values)" + ], + "execution_count": 93, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=1,\n", + " n_clusters=3, n_init=10, n_jobs=None, precompute_distances='auto',\n", + " random_state=None, tol=0.0001, verbose=0)" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 93 + } ] }, { "cell_type": "code", "metadata": { - "id": "dW1AeAK8PNah", + "id": "gKWfHTsD95Bv", "colab_type": "code", "colab": {} }, "source": [ - "##### Your Code Here #####" + "# assign clusters back to our dataframe\n", + "df['cluster'] = model.labels_" ], - "execution_count": 0, + "execution_count": 94, "outputs": [] }, { - "cell_type": "markdown", + "cell_type": "code", "metadata": { - "id": "PkrfbzfBROpP", - "colab_type": "text" + "id": "bOQZRPcO9-Jb", + "colab_type": "code", + "colab": {} }, "source": [ - "## Check your work: \n", - "\n", - "- Compare your PC1, PC2 clustering scatterplot to the clustering scatterplots you made on the raw data\n", - "- Calculate accuracy scores for both the PC1,PC2 Principal component clustering and the 90% of explained variance clustering.\n", - "\n", - "How do your accuracy scores -when preprocessing the data with PCA- compare to the accuracy when simply clustering on the raw data?" + "# Get our centroids\n", + "centroids = model.cluster_centers_" + ], + "execution_count": 95, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "U7Vq0Gyp-Ck0", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 141 + }, + "outputId": "2f9041a1-48a5-4fbd-97ea-d301440da802" + }, + "source": [ + "# turn them into a dataframe\n", + "cc = pd.DataFrame(centroids)\n", + "cc.head()" + ], + "execution_count": 96, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
01
012.32578817.196584
118.90661921.091655
213.97235826.891194
\n", + "
" + ], + "text/plain": [ + " 0 1\n", + "0 12.325788 17.196584\n", + "1 18.906619 21.091655\n", + "2 13.972358 26.891194" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 96 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "c2KpNslr-J7U", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# setup colors for plotting\n", + "base_colors = ['r', 'g', 'b']\n", + "colors = [base_colors[centroid] for centroid in model.labels_]" + ], + "execution_count": 97, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "8EbaoLCs-Vqd", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 374 + }, + "outputId": "0bacba6b-86f2-4c38-b7c3-80701fa28ca2" + }, + "source": [ + "# plot the scatter of our points with calculated centroids\n", + "fig, ax = plt.subplots(figsize=(7,6))\n", + "ax.scatter(df[features[0]], df[features[1]], c=colors)\n", + "ax.scatter(cc[0], cc[1], c=base_colors, s=100);" + ], + "execution_count": 98, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } ] }, + { + "cell_type": "code", + "metadata": { + "id": "DkFur5Jf-s6E", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# import metrics\n", + "from sklearn import metrics" + ], + "execution_count": 99, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "DJaPDihwtZvy", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 239 + }, + "outputId": "e16dd509-cdea-4fcc-d2e5-b23ae1274ffc" + }, + "source": [ + "# drop column\n", + "df = df.drop('Unnamed: 32', axis=1)\n", + "df.head()" + ], + "execution_count": 100, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idradius_meantexture_meanperimeter_meanarea_meansmoothness_meancompactness_meanconcavity_meanconcave points_meansymmetry_meanfractal_dimension_meanradius_setexture_seperimeter_searea_sesmoothness_secompactness_seconcavity_seconcave points_sesymmetry_sefractal_dimension_seradius_worsttexture_worstperimeter_worstarea_worstsmoothness_worstcompactness_worstconcavity_worstconcave points_worstsymmetry_worstfractal_dimension_worstcluster
084230217.9910.38122.801001.00.118400.277600.30010.147100.24190.078711.09500.90538.589153.400.0063990.049040.053730.015870.030030.00619325.3817.33184.602019.00.16220.66560.71190.26540.46010.118900
184251720.5717.77132.901326.00.084740.078640.08690.070170.18120.056670.54350.73393.39874.080.0052250.013080.018600.013400.013890.00353224.9923.41158.801956.00.12380.18660.24160.18600.27500.089021
28430090319.6921.25130.001203.00.109600.159900.19740.127900.20690.059990.74560.78694.58594.030.0061500.040060.038320.020580.022500.00457123.5725.53152.501709.00.14440.42450.45040.24300.36130.087581
38434830111.4220.3877.58386.10.142500.283900.24140.105200.25970.097440.49561.15603.44527.230.0091100.074580.056610.018670.059630.00920814.9126.5098.87567.70.20980.86630.68690.25750.66380.173000
48435840220.2914.34135.101297.00.100300.132800.19800.104300.18090.058830.75720.78135.43894.440.0114900.024610.056880.018850.017560.00511522.5416.67152.201575.00.13740.20500.40000.16250.23640.076781
\n", + "
" + ], + "text/plain": [ + " id radius_mean ... fractal_dimension_worst cluster\n", + "0 842302 17.99 ... 0.11890 0\n", + "1 842517 20.57 ... 0.08902 1\n", + "2 84300903 19.69 ... 0.08758 1\n", + "3 84348301 11.42 ... 0.17300 0\n", + "4 84358402 20.29 ... 0.07678 1\n", + "\n", + "[5 rows x 32 columns]" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 100 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "pJV4sC_i-9-8", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "outputId": "a4c0c637-2b1a-4584-fc9b-f86282d10509" + }, + "source": [ + "# silhouette score\n", + "metrics.silhouette_score(df, model.labels_, metric='euclidean')" + ], + "execution_count": 101, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "0.017089750246457324" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 101 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "fj8WzfGGAOJe", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 485 + }, + "outputId": "8708f214-3c80-4c47-b0b0-795dc3db85e1" + }, + "source": [ + "model.labels_" + ], + "execution_count": 39, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([1, 2, 2, 0, 2, 1, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 1, 1, 1,\n", + " 1, 2, 2, 1, 0, 2, 0, 1, 2, 0, 2, 2, 0, 2, 0, 0, 0, 0, 0, 0, 2, 0,\n", + " 0, 2, 1, 0, 1, 0, 0, 1, 1, 2, 0, 0, 2, 0, 0, 1, 1, 0, 0, 1, 0, 0,\n", + " 0, 0, 1, 1, 2, 1, 2, 1, 1, 0, 1, 1, 2, 1, 0, 1, 2, 2, 1, 2, 0, 2,\n", + " 0, 1, 0, 0, 1, 0, 0, 2, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 2, 0,\n", + " 1, 0, 0, 0, 1, 0, 1, 1, 0, 2, 1, 2, 2, 1, 1, 1, 0, 2, 1, 2, 1, 0,\n", + " 0, 1, 2, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1,\n", + " 1, 1, 2, 0, 1, 1, 0, 2, 2, 0, 2, 0, 1, 0, 2, 1, 1, 0, 1, 1, 1, 1,\n", + " 1, 0, 0, 1, 2, 2, 0, 1, 0, 1, 2, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 2,\n", + " 2, 0, 0, 2, 2, 0, 0, 1, 1, 2, 0, 1, 2, 0, 2, 2, 0, 1, 1, 1, 2, 2,\n", + " 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 2, 0, 0, 2, 1, 0, 2, 2, 0, 2, 1, 1,\n", + " 1, 0, 2, 0, 1, 1, 0, 1, 2, 1, 2, 1, 2, 1, 2, 1, 0, 2, 2, 2, 2, 0,\n", + " 2, 2, 0, 0, 1, 0, 1, 1, 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 0, 1, 1,\n", + " 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 2, 0, 2, 1, 1, 0, 1, 1,\n", + " 1, 1, 0, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 0, 0,\n", + " 1, 0, 0, 1, 0, 2, 1, 2, 1, 2, 1, 1, 1, 2, 1, 1, 0, 1, 1, 1, 1, 0,\n", + " 2, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 2, 2, 1, 2, 2, 0, 1, 2, 2,\n", + " 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 2, 1, 1, 0, 2, 1, 1,\n", + " 0, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 0, 2, 1, 1, 1, 0, 0, 0, 0, 0, 0,\n", + " 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 2, 2, 1, 0, 0, 1, 0, 1,\n", + " 1, 2, 1, 1, 2, 0, 2, 1, 0, 2, 0, 2, 0, 1, 1, 0, 0, 0, 0, 0, 2, 2,\n", + " 0, 1, 1, 0, 0, 1, 2, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1,\n", + " 1, 1, 1, 2, 1, 0, 0, 1, 2, 1, 0, 0, 1, 1, 2, 2, 1, 0, 1, 2, 1, 1,\n", + " 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 2, 2, 1, 1, 1, 2, 0, 0, 1, 1, 0, 1,\n", + " 1, 1, 1, 0, 1, 2, 1, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0,\n", + " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0],\n", + " dtype=int32)" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 39 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "7ghqYSxrP_FE", + "colab_type": "text" + }, + "source": [ + "## Check you work: \n", + "\n", + "This is something that in a truly unsupervised learning situation **WOULD NOT BE POSSIBLE**. But for educational purposes go back and grab the true diagnosis column (label) from the original dataset. Take your cluster labels and compare them to the original diagnosis column. You can make scatterplots for each to see how they compare or you can calculate a percent accuracy score like: \n", + "\\begin{align}\n", + "\\frac{\\text{Num Correct Labels}}{\\text{Num Total Observations}}\n", + "\\end{align}" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "tgdbN6z7ts5U", + "colab_type": "code", + "colab": {} + }, + "source": [ + "df = pd.read_csv(\"https://raw.githubusercontent.com/ryanleeallred/datasets/master/Cancer_Cells.csv\")" + ], + "execution_count": 103, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "ej_jq3EIvD2s", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 202 + }, + "outputId": "d253ecfb-8854-4943-a2b3-113f1f8d16f6" + }, + "source": [ + "df_diag = df['diagnosis']\n", + "df_diag = pd.DataFrame(df_diag)\n", + "df_diag.head()" + ], + "execution_count": 108, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
diagnosis
0M
1M
2M
3M
4M
\n", + "
" + ], + "text/plain": [ + " diagnosis\n", + "0 M\n", + "1 M\n", + "2 M\n", + "3 M\n", + "4 M" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 108 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "OV5JWq_YvKnE", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 166 + }, + "outputId": "0ed30f1c-3dff-4eca-db92-fad17ef64c35" + }, + "source": [ + "df_diag['Diagnosis'] = np.where(df_diag['diagnosis']=='M', 1, 0)" + ], + "execution_count": 115, + "outputs": [ + { + "output_type": "error", + "ename": "IndexError", + "evalue": "ignored", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mdf_diag\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'Diagnosis'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwhere\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf_diag\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'diagnosis'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m==\u001b[0m\u001b[0;34m'M'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mIndexError\u001b[0m: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "BedOTS0eJ9_K", + "colab_type": "text" + }, + "source": [ + "# 2) Perform PCA on your dataset first and *then* use k-means clustering. \n", + "\n", + "- You need to standardize your data before PCA.\n", + "- First try clustering just on PC1 and PC2 so that you can make a scatterplot of your clustering.\n", + "- Then use use a scree plot to decide how many principal components to include in your clustering, and use however many principal components you need in order to retain 90% of the variation of the original dataset\n", + "\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "dW1AeAK8PNah", + "colab_type": "code", + "colab": {} + }, + "source": [ + "##### Your Code Here #####" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "JcYUek2DAS_g", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# read back in the data\n", + "df = pd.read_csv(\"https://raw.githubusercontent.com/ryanleeallred/datasets/master/Cancer_Cells.csv\", index_col=0)" + ], + "execution_count": 44, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "1QNjY14mCPh-", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 270 + }, + "outputId": "99798e78-0df3-45fb-b988-b9b6beaf9574" + }, + "source": [ + "df = df.drop('Unnamed: 32', axis=1)\n", + "df.head()" + ], + "execution_count": 64, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
radius_meantexture_meanperimeter_meanarea_meansmoothness_meancompactness_meanconcavity_meanconcave points_meansymmetry_meanfractal_dimension_meanradius_setexture_seperimeter_searea_sesmoothness_secompactness_seconcavity_seconcave points_sesymmetry_sefractal_dimension_seradius_worsttexture_worstperimeter_worstarea_worstsmoothness_worstcompactness_worstconcavity_worstconcave points_worstsymmetry_worstfractal_dimension_worst
id
84230217.9910.38122.801001.00.118400.277600.30010.147100.24190.078711.09500.90538.589153.400.0063990.049040.053730.015870.030030.00619325.3817.33184.602019.00.16220.66560.71190.26540.46010.11890
84251720.5717.77132.901326.00.084740.078640.08690.070170.18120.056670.54350.73393.39874.080.0052250.013080.018600.013400.013890.00353224.9923.41158.801956.00.12380.18660.24160.18600.27500.08902
8430090319.6921.25130.001203.00.109600.159900.19740.127900.20690.059990.74560.78694.58594.030.0061500.040060.038320.020580.022500.00457123.5725.53152.501709.00.14440.42450.45040.24300.36130.08758
8434830111.4220.3877.58386.10.142500.283900.24140.105200.25970.097440.49561.15603.44527.230.0091100.074580.056610.018670.059630.00920814.9126.5098.87567.70.20980.86630.68690.25750.66380.17300
8435840220.2914.34135.101297.00.100300.132800.19800.104300.18090.058830.75720.78135.43894.440.0114900.024610.056880.018850.017560.00511522.5416.67152.201575.00.13740.20500.40000.16250.23640.07678
\n", + "
" + ], + "text/plain": [ + " radius_mean texture_mean ... symmetry_worst fractal_dimension_worst\n", + "id ... \n", + "842302 17.99 10.38 ... 0.4601 0.11890\n", + "842517 20.57 17.77 ... 0.2750 0.08902\n", + "84300903 19.69 21.25 ... 0.3613 0.08758\n", + "84348301 11.42 20.38 ... 0.6638 0.17300\n", + "84358402 20.29 14.34 ... 0.2364 0.07678\n", + "\n", + "[5 rows x 30 columns]" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 64 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "-09x6ewaAjrl", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 537 + }, + "outputId": "16d9ae27-0824-4aeb-b436-690aaeab73ab" + }, + "source": [ + "features = list(df.columns)\n", + "features" + ], + "execution_count": 65, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "['radius_mean',\n", + " 'texture_mean',\n", + " 'perimeter_mean',\n", + " 'area_mean',\n", + " 'smoothness_mean',\n", + " 'compactness_mean',\n", + " 'concavity_mean',\n", + " 'concave points_mean',\n", + " 'symmetry_mean',\n", + " 'fractal_dimension_mean',\n", + " 'radius_se',\n", + " 'texture_se',\n", + " 'perimeter_se',\n", + " 'area_se',\n", + " 'smoothness_se',\n", + " 'compactness_se',\n", + " 'concavity_se',\n", + " 'concave points_se',\n", + " 'symmetry_se',\n", + " 'fractal_dimension_se',\n", + " 'radius_worst',\n", + " 'texture_worst',\n", + " 'perimeter_worst',\n", + " 'area_worst',\n", + " 'smoothness_worst',\n", + " 'compactness_worst',\n", + " 'concavity_worst',\n", + " 'concave points_worst',\n", + " 'symmetry_worst',\n", + " 'fractal_dimension_worst']" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 65 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "zIhO9EMKAmxl", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# instantiate the SKLearn class for standardization\n", + "from sklearn.preprocessing import StandardScaler\n", + "scaler = StandardScaler()" + ], + "execution_count": 66, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "lZCuweqfAwBP", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# Standardize dataset\n", + "scaled_data = scaler.fit_transform(df)" + ], + "execution_count": 67, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "LEY_4DY6CWdn", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 884 + }, + "outputId": "26154303-cb62-400e-a310-9cd893fbe831" + }, + "source": [ + "scaled_data[:5]" + ], + "execution_count": 68, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([[ 1.09706398e+00, -2.07333501e+00, 1.26993369e+00,\n", + " 9.84374905e-01, 1.56846633e+00, 3.28351467e+00,\n", + " 2.65287398e+00, 2.53247522e+00, 2.21751501e+00,\n", + " 2.25574689e+00, 2.48973393e+00, -5.65265059e-01,\n", + " 2.83303087e+00, 2.48757756e+00, -2.14001647e-01,\n", + " 1.31686157e+00, 7.24026158e-01, 6.60819941e-01,\n", + " 1.14875667e+00, 9.07083081e-01, 1.88668963e+00,\n", + " -1.35929347e+00, 2.30360062e+00, 2.00123749e+00,\n", + " 1.30768627e+00, 2.61666502e+00, 2.10952635e+00,\n", + " 2.29607613e+00, 2.75062224e+00, 1.93701461e+00],\n", + " [ 1.82982061e+00, -3.53632408e-01, 1.68595471e+00,\n", + " 1.90870825e+00, -8.26962447e-01, -4.87071673e-01,\n", + " -2.38458552e-02, 5.48144156e-01, 1.39236330e-03,\n", + " -8.68652457e-01, 4.99254601e-01, -8.76243603e-01,\n", + " 2.63326966e-01, 7.42401948e-01, -6.05350847e-01,\n", + " -6.92926270e-01, -4.40780058e-01, 2.60162067e-01,\n", + " -8.05450380e-01, -9.94437403e-02, 1.80592744e+00,\n", + " -3.69203222e-01, 1.53512599e+00, 1.89048899e+00,\n", + " -3.75611957e-01, -4.30444219e-01, -1.46748968e-01,\n", + " 1.08708430e+00, -2.43889668e-01, 2.81189987e-01],\n", + " [ 1.57988811e+00, 4.56186952e-01, 1.56650313e+00,\n", + " 1.55888363e+00, 9.42210440e-01, 1.05292554e+00,\n", + " 1.36347845e+00, 2.03723076e+00, 9.39684817e-01,\n", + " -3.98007910e-01, 1.22867595e+00, -7.80083377e-01,\n", + " 8.50928301e-01, 1.18133606e+00, -2.97005012e-01,\n", + " 8.14973504e-01, 2.13076435e-01, 1.42482747e+00,\n", + " 2.37035535e-01, 2.93559404e-01, 1.51187025e+00,\n", + " -2.39743838e-02, 1.34747521e+00, 1.45628455e+00,\n", + " 5.27407405e-01, 1.08293217e+00, 8.54973944e-01,\n", + " 1.95500035e+00, 1.15225500e+00, 2.01391209e-01],\n", + " [-7.68909287e-01, 2.53732112e-01, -5.92687167e-01,\n", + " -7.64463792e-01, 3.28355348e+00, 3.40290899e+00,\n", + " 1.91589718e+00, 1.45170736e+00, 2.86738293e+00,\n", + " 4.91091929e+00, 3.26373441e-01, -1.10409044e-01,\n", + " 2.86593405e-01, -2.88378148e-01, 6.89701660e-01,\n", + " 2.74428041e+00, 8.19518384e-01, 1.11500701e+00,\n", + " 4.73268037e+00, 2.04751088e+00, -2.81464464e-01,\n", + " 1.33984094e-01, -2.49939304e-01, -5.50021228e-01,\n", + " 3.39427470e+00, 3.89339743e+00, 1.98958826e+00,\n", + " 2.17578601e+00, 6.04604135e+00, 4.93501034e+00],\n", + " [ 1.75029663e+00, -1.15181643e+00, 1.77657315e+00,\n", + " 1.82622928e+00, 2.80371830e-01, 5.39340452e-01,\n", + " 1.37101143e+00, 1.42849277e+00, -9.56046689e-03,\n", + " -5.62449981e-01, 1.27054278e+00, -7.90243702e-01,\n", + " 1.27318941e+00, 1.19035676e+00, 1.48306716e+00,\n", + " -4.85198799e-02, 8.28470780e-01, 1.14420474e+00,\n", + " -3.61092272e-01, 4.99328134e-01, 1.29857524e+00,\n", + " -1.46677038e+00, 1.33853946e+00, 1.22072425e+00,\n", + " 2.20556166e-01, -3.13394511e-01, 6.13178758e-01,\n", + " 7.29259257e-01, -8.68352984e-01, -3.97099619e-01]])" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 68 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "0x74UV8sCcHS", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 239 + }, + "outputId": "77c8f32e-7694-496a-f51d-97ce921aa94f" + }, + "source": [ + "df_scaled = pd.DataFrame(scaled_data, columns=features)\n", + "df_scaled.head()" + ], + "execution_count": 69, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
radius_meantexture_meanperimeter_meanarea_meansmoothness_meancompactness_meanconcavity_meanconcave points_meansymmetry_meanfractal_dimension_meanradius_setexture_seperimeter_searea_sesmoothness_secompactness_seconcavity_seconcave points_sesymmetry_sefractal_dimension_seradius_worsttexture_worstperimeter_worstarea_worstsmoothness_worstcompactness_worstconcavity_worstconcave points_worstsymmetry_worstfractal_dimension_worst
01.097064-2.0733351.2699340.9843751.5684663.2835152.6528742.5324752.2175152.2557472.489734-0.5652652.8330312.487578-0.2140021.3168620.7240260.6608201.1487570.9070831.886690-1.3592932.3036012.0012371.3076862.6166652.1095262.2960762.7506221.937015
11.829821-0.3536321.6859551.908708-0.826962-0.487072-0.0238460.5481440.001392-0.8686520.499255-0.8762440.2633270.742402-0.605351-0.692926-0.4407800.260162-0.805450-0.0994441.805927-0.3692031.5351261.890489-0.375612-0.430444-0.1467491.087084-0.2438900.281190
21.5798880.4561871.5665031.5588840.9422101.0529261.3634782.0372310.939685-0.3980081.228676-0.7800830.8509281.181336-0.2970050.8149740.2130761.4248270.2370360.2935591.511870-0.0239741.3474751.4562850.5274071.0829320.8549741.9550001.1522550.201391
3-0.7689090.253732-0.592687-0.7644643.2835533.4029091.9158971.4517072.8673834.9109190.326373-0.1104090.286593-0.2883780.6897022.7442800.8195181.1150074.7326802.047511-0.2814640.133984-0.249939-0.5500213.3942753.8933971.9895882.1757866.0460414.935010
41.750297-1.1518161.7765731.8262290.2803720.5393401.3710111.428493-0.009560-0.5624501.270543-0.7902441.2731891.1903571.483067-0.0485200.8284711.144205-0.3610920.4993281.298575-1.4667701.3385391.2207240.220556-0.3133950.6131790.729259-0.868353-0.397100
\n", + "
" + ], + "text/plain": [ + " radius_mean texture_mean ... symmetry_worst fractal_dimension_worst\n", + "0 1.097064 -2.073335 ... 2.750622 1.937015\n", + "1 1.829821 -0.353632 ... -0.243890 0.281190\n", + "2 1.579888 0.456187 ... 1.152255 0.201391\n", + "3 -0.768909 0.253732 ... 6.046041 4.935010\n", + "4 1.750297 -1.151816 ... -0.868353 -0.397100\n", + "\n", + "[5 rows x 30 columns]" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 69 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "PvKKF44yCk9V", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 555 + }, + "outputId": "75df343f-0e99-4427-f555-c5ab9e03857a" + }, + "source": [ + "df_scaled.mean()" + ], + "execution_count": 70, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "radius_mean -1.256562e-16\n", + "texture_mean 1.049736e-16\n", + "perimeter_mean -1.272171e-16\n", + "area_mean -1.900452e-16\n", + "smoothness_mean 1.490704e-16\n", + "compactness_mean 2.544342e-16\n", + "concavity_mean -1.338511e-16\n", + "concave points_mean -8.429110e-17\n", + "symmetry_mean 2.081912e-16\n", + "fractal_dimension_mean 5.408679e-16\n", + "radius_se 2.475807e-16\n", + "texture_se -9.912009e-17\n", + "perimeter_se -2.968237e-16\n", + "area_se -1.088760e-16\n", + "smoothness_se 4.426014e-16\n", + "compactness_se 1.958988e-16\n", + "concavity_se 1.678017e-16\n", + "concave points_se 2.185325e-17\n", + "symmetry_se 1.523874e-16\n", + "fractal_dimension_se -5.658430e-17\n", + "radius_worst -7.988142e-16\n", + "texture_worst -1.834112e-17\n", + "perimeter_worst -4.015534e-16\n", + "area_worst -2.848727e-17\n", + "smoothness_worst -2.189227e-16\n", + "compactness_worst -2.579464e-16\n", + "concavity_worst 1.143393e-16\n", + "concave points_worst 2.829215e-16\n", + "symmetry_worst 1.670212e-16\n", + "fractal_dimension_worst 2.321908e-16\n", + "dtype: float64" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 70 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "r_9RJ-m6CoEa", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 555 + }, + "outputId": "9f177c8f-2b1a-464c-9545-bb0220c55a6c" + }, + "source": [ + "df_scaled[features].std()" + ], + "execution_count": 71, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "radius_mean 1.00088\n", + "texture_mean 1.00088\n", + "perimeter_mean 1.00088\n", + "area_mean 1.00088\n", + "smoothness_mean 1.00088\n", + "compactness_mean 1.00088\n", + "concavity_mean 1.00088\n", + "concave points_mean 1.00088\n", + "symmetry_mean 1.00088\n", + "fractal_dimension_mean 1.00088\n", + "radius_se 1.00088\n", + "texture_se 1.00088\n", + "perimeter_se 1.00088\n", + "area_se 1.00088\n", + "smoothness_se 1.00088\n", + "compactness_se 1.00088\n", + "concavity_se 1.00088\n", + "concave points_se 1.00088\n", + "symmetry_se 1.00088\n", + "fractal_dimension_se 1.00088\n", + "radius_worst 1.00088\n", + "texture_worst 1.00088\n", + "perimeter_worst 1.00088\n", + "area_worst 1.00088\n", + "smoothness_worst 1.00088\n", + "compactness_worst 1.00088\n", + "concavity_worst 1.00088\n", + "concave points_worst 1.00088\n", + "symmetry_worst 1.00088\n", + "fractal_dimension_worst 1.00088\n", + "dtype: float64" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 71 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "qHf4egjXCrTU", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# import and instantiate the PCA class\n", + "from sklearn.decomposition import PCA\n", + "pca = PCA(n_components=2)" + ], + "execution_count": 58, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "RqgN4hz7C0Hv", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 104 + }, + "outputId": "2930be20-c668-4f3d-ac71-b25100f02c19" + }, + "source": [ + "# apply PCA\n", + "pca_features = pca.fit_transform(df_scaled)\n", + "pca_features[:5]" + ], + "execution_count": 72, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([[ 9.19283683, 1.94858307],\n", + " [ 2.3878018 , -3.76817174],\n", + " [ 5.73389628, -1.0751738 ],\n", + " [ 7.1229532 , 10.27558912],\n", + " [ 3.93530207, -1.94807157]])" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 72 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "KASyn4_HEvBU", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "outputId": "2bf1fad7-f62a-4f41-9397-825a8aa00d8f" + }, + "source": [ + "# how much variation did each principal component explain?\n", + "pca.explained_variance_ratio_" + ], + "execution_count": 73, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([0.44272026, 0.18971182])" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 73 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "CLfFeRUUE7Rt", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "outputId": "5749bce1-733a-4596-8eca-1824d5630f1a" + }, + "source": [ + "# how much total variance did we explain?\n", + "sum(pca.explained_variance_ratio_)" + ], + "execution_count": 75, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "0.6324320765155943" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 75 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "dNKnU0LmE0Ti", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "outputId": "fbd4cfb8-421c-420c-d413-9e049351a3d6" + }, + "source": [ + "# how much info did we lose?\n", + "1-sum(pca.explained_variance_ratio_)" + ], + "execution_count": 74, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "0.3675679234844057" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 74 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "ebMXdbCpFAjd", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 202 + }, + "outputId": "25812a0d-766e-4efb-8e7a-274120c38225" + }, + "source": [ + "# turn into a dataframe\n", + "df_pca = pd.DataFrame(pca_features, columns=['comp_1', 'comp_2'])\n", + "df_pca.head()" + ], + "execution_count": 76, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
comp_1comp_2
09.1928371.948583
12.387802-3.768172
25.733896-1.075174
37.12295310.275589
43.935302-1.948072
\n", + "
" + ], + "text/plain": [ + " comp_1 comp_2\n", + "0 9.192837 1.948583\n", + "1 2.387802 -3.768172\n", + "2 5.733896 -1.075174\n", + "3 7.122953 10.275589\n", + "4 3.935302 -1.948072" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 76 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "kHWL19Q1FM1k", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# initialize an instance of the KMeans class from sklearn\n", + "k = 3\n", + "model = KMeans(n_clusters=k, max_iter=1)" + ], + "execution_count": 77, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "_VIOR7feFVLW", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 69 + }, + "outputId": "beda2c17-911b-489f-a4ce-a0f264dd90f7" + }, + "source": [ + "# fit instantiated model to our dataframe\n", + "model.fit(df_pca.values)" + ], + "execution_count": 78, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=1,\n", + " n_clusters=3, n_init=10, n_jobs=None, precompute_distances='auto',\n", + " random_state=None, tol=0.0001, verbose=0)" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 78 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "TADlfVCgFcTw", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# assign predicted clusters back to our dataframe\n", + "df_pca['cluster'] = model.labels_" + ], + "execution_count": 79, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "RbbSz8Q6FkNB", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# get centroids\n", + "centroids = model.cluster_centers_" + ], + "execution_count": 80, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "U6jIrB2RFn2f", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 141 + }, + "outputId": "dffb1f46-2b98-466a-9ba7-d776f0e8f524" + }, + "source": [ + "# turn into dataframe\n", + "cc = pd.DataFrame(centroids)\n", + "cc.head()" + ], + "execution_count": 81, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
01
05.317557-1.539816
1-2.030723-0.222233
22.4301644.273687
\n", + "
" + ], + "text/plain": [ + " 0 1\n", + "0 5.317557 -1.539816\n", + "1 -2.030723 -0.222233\n", + "2 2.430164 4.273687" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 81 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "roWG1gb3Fsbe", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# setup for plotting\n", + "base_colors = ['r', 'g', 'b']\n", + "colors = [base_colors[centroid] for centroid in model.labels_]" + ], + "execution_count": 82, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "PhiQunlgF7mE", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 374 + }, + "outputId": "e382f804-d0a7-4c0f-b74e-5725402d9062" + }, + "source": [ + "# plot scatter of our points with calculated centroids\n", + "fig, ax = plt.subplots(figsize=(7,6))\n", + "ax.scatter(df_pca['comp_1'], df_pca['comp_2'], c=colors)\n", + "ax.scatter(cc[0], cc[1], c=base_colors, s=100);" + ], + "execution_count": 83, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "CCOGeL3KGOh-", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "outputId": "7cce2a4b-e81c-45db-b779-7456992ede7b" + }, + "source": [ + "# silhouette score\n", + "metrics.silhouette_score(df, model.labels_, metric='euclidean')" + ], + "execution_count": 85, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "0.16672553865903092" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 85 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "8I_idW_ZGYxo", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 485 + }, + "outputId": "dcdc10c3-8827-4d1a-e01a-86be08939ca9" + }, + "source": [ + "# what is predicted centroid for each data point?\n", + "model.labels_" + ], + "execution_count": 86, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([0, 0, 0, 2, 0, 2, 0, 2, 2, 2, 1, 0, 0, 1, 2, 2, 1, 0, 0, 1, 1, 1,\n", + " 2, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1,\n", + " 1, 0, 1, 2, 1, 1, 1, 1, 1, 0, 1, 1, 0, 2, 1, 1, 1, 1, 2, 1, 2, 2,\n", + " 1, 1, 2, 1, 0, 2, 0, 1, 1, 1, 1, 0, 0, 1, 1, 2, 0, 0, 1, 0, 1, 0,\n", + " 1, 2, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 0, 1,\n", + " 1, 1, 2, 1, 1, 1, 1, 2, 2, 1, 1, 0, 0, 1, 1, 1, 1, 0, 2, 0, 1, 1,\n", + " 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 2, 2, 1,\n", + " 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 2, 1, 1, 1,\n", + " 2, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1,\n", + " 0, 1, 1, 0, 0, 2, 1, 1, 1, 1, 2, 1, 0, 1, 0, 2, 2, 2, 1, 1, 0, 0,\n", + " 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1,\n", + " 2, 1, 0, 1, 1, 2, 1, 1, 0, 1, 0, 1, 0, 1, 0, 2, 0, 0, 0, 1, 0, 1,\n", + " 0, 0, 1, 1, 1, 2, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1,\n", + " 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1,\n", + " 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 2,\n", + " 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 2,\n", + " 0, 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0,\n", + " 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 1, 1, 0, 0, 1, 1,\n", + " 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0,\n", + " 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 0, 0, 1, 1, 1, 1, 1, 1,\n", + " 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,\n", + " 1, 1, 1, 2, 1, 1, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1,\n", + " 1, 2, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 2, 1, 0, 2, 2,\n", + " 1, 2, 1, 2, 1, 1, 2, 1, 1, 1, 0, 0, 1, 1, 2, 0, 1, 1, 1, 1, 1, 1,\n", + " 1, 1, 1, 1, 1, 0, 1, 0, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", + " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 0, 0, 1, 0, 1],\n", + " dtype=int32)" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 86 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "PkrfbzfBROpP", + "colab_type": "text" + }, + "source": [ + "## Check your work: \n", + "\n", + "- Compare your PC1, PC2 clustering scatterplot to the clustering scatterplots you made on the raw data\n", + "- Calculate accuracy scores for both the PC1,PC2 Principal component clustering and the 90% of explained variance clustering.\n", + "\n", + "How do your accuracy scores -when preprocessing the data with PCA- compare to the accuracy when simply clustering on the raw data?" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "OIG7-yGLP-eA", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# Your Code Here" + ], + "execution_count": null, + "outputs": [] + }, { "cell_type": "markdown", "metadata": { @@ -664,7 +2856,7 @@ "source": [ "" ], - "execution_count": 0, + "execution_count": null, "outputs": [] } ]