├── .gitignore ├── D1-linear-reg └── D1-linear-reg-ols.ipynb ├── D11-bubble-sort └── bubble-sort.ipynb ├── D13 └── D13-sql.txt ├── D14 └── D14-sql.txt ├── D15-sql-intermediate └── problems.txt ├── D16-cnn-basics └── D16_cnn_basics.ipynb ├── D2-logistic-reg └── D2-logistic-regression.ipynb ├── D3-rmsprop ├── D3-1-gradient-descent.ipynb └── D3-RMSPROP-logistic-reg.ipynb ├── D4-knn └── D4-knn.ipynb ├── D5-kmeans └── D5-Kmeans.ipynb ├── D6-naivebayes ├── D6-naive-bayes.ipynb └── iris.csv ├── D7-GMM └── D7-Gaussian-mixture-model.ipynb ├── D8-SLP └── D8-SLP.ipynb ├── D9-10 └── Multilayer-perceptron.ipynb ├── Output-images ├── D1.png ├── D11.png ├── D12.png ├── D13.png ├── D14.png ├── D16-cnn-basics.png ├── D2.png ├── D3-rmsprop.png ├── D4.png ├── D5.png ├── D6.png ├── D7.png ├── D8.png ├── D9.png └── d15.png └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | /.ipynb_checkpoints/ 2 | *.ipynb_checkpoints/ 3 | -------------------------------------------------------------------------------- /D1-linear-reg/D1-linear-reg-ols.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 38, 6 | "id": "herbal-stroke", 7 | "metadata": {}, 8 | "outputs": [], 9 | "source": [ 10 | "# LINEAR REGRESSION USING ORDINARY LEAST SQUARES\n", 11 | "\n", 12 | "\n", 13 | "# OLS = Ordinaryleastsquares\n", 14 | "\n", 15 | "class Ordinaryleastsquares():\n", 16 | " \n", 17 | " def __init__(self):\n", 18 | " \n", 19 | " # list to store coef's we'll get after OLS\n", 20 | " self.coefs = [] \n", 21 | " \n", 22 | " \n", 23 | " # Function -- > if we are passing only 1D array of fetaures we would like to convert that \n", 24 | " # list to Two Dimensional Input for processing\n", 25 | " \n", 26 | " def reshape_input(self,X):\n", 27 | " \n", 28 | " return X.reshape(-1,1) \n", 29 | " \n", 30 | " def concat_ones(self,X):\n", 31 | " \n", 32 | " # if we have n rows in dataset we will create a Numpy Ones array of shape (n,1)\n", 33 | " \n", 34 | " ones = np.ones(shape = X.shape[0]).reshape(-1,1)\n", 35 | " \n", 36 | " return np.concatenate((ones,X),axis=1)\n", 37 | " \n", 38 | " def forward(self,X,y):\n", 39 | " \n", 40 | " if len(X.shape) == 1: \n", 41 | " X = self.reshape_input(X)\n", 42 | " \n", 43 | " X = self.concat_ones(X)\n", 44 | " \n", 45 | " \n", 46 | " # formula \n", 47 | " \n", 48 | " # link https://towardsdatascience.com/multiple-linear-regression-from-scratch-in-numpy-36a3e8ac8014\n", 49 | " self.coefs = np.linalg.inv(X.transpose().dot(X)).dot(X.transpose()).dot(y)\n", 50 | " \n", 51 | " def predict(self,data):\n", 52 | " \n", 53 | " b0 = self.coefs[0]\n", 54 | " \n", 55 | " other_coefs = self.coefs[1:]\n", 56 | " \n", 57 | " prediction = b0\n", 58 | " \n", 59 | " for i,j in zip(data,other_coefs):\n", 60 | " \n", 61 | " prediction += i*j\n", 62 | " \n", 63 | " return prediction" 64 | ] 65 | }, 66 | { 67 | "cell_type": "code", 68 | "execution_count": 39, 69 | "id": "nasty-heaven", 70 | "metadata": {}, 71 | "outputs": [], 72 | "source": [ 73 | "import pandas as pd\n", 74 | "import numpy as np\n", 75 | "df = pd.read_csv('PYTORCH_NOTEBOOKS/Data/iris.csv')\n", 76 | "\n", 77 | "input_features = [col for col in list(df.columns) if col!='target']\n", 78 | "\n", 79 | "X = df[input_features].values\n", 80 | "y =df['target'].values\n" 81 | ] 82 | }, 83 | { 84 | "cell_type": "code", 85 | "execution_count": 40, 86 | "id": "infinite-blackjack", 87 | "metadata": {}, 88 | "outputs": [], 89 | "source": [ 90 | "model = Ordinaryleastsquares()\n", 91 | "\n", 92 | "model.forward(X,y)" 93 | ] 94 | }, 95 | { 96 | "cell_type": "code", 97 | "execution_count": 41, 98 | "id": "rapid-ethics", 99 | "metadata": {}, 100 | "outputs": [ 101 | { 102 | "data": { 103 | "text/plain": [ 104 | "array([ 0.19208399, -0.10974146, -0.04424045, 0.22700138, 0.60989412])" 105 | ] 106 | }, 107 | "execution_count": 41, 108 | "metadata": {}, 109 | "output_type": "execute_result" 110 | } 111 | ], 112 | "source": [ 113 | "model.coefs" 114 | ] 115 | }, 116 | { 117 | "cell_type": "code", 118 | "execution_count": 42, 119 | "id": "human-transportation", 120 | "metadata": {}, 121 | "outputs": [ 122 | { 123 | "name": "stdout", 124 | "output_type": "stream", 125 | "text": [ 126 | "2.0\n" 127 | ] 128 | }, 129 | { 130 | "data": { 131 | "text/plain": [ 132 | "1.591379758075804" 133 | ] 134 | }, 135 | "execution_count": 42, 136 | "metadata": {}, 137 | "output_type": "execute_result" 138 | } 139 | ], 140 | "source": [ 141 | "print(y[123])\n", 142 | "model.predict(X[123])" 143 | ] 144 | } 145 | ], 146 | "metadata": { 147 | "kernelspec": { 148 | "display_name": "Python 3.8.2 64-bit", 149 | "language": "python", 150 | "name": "python38264bita03373cad2404f55bdc5db0285b9fbe0" 151 | }, 152 | "language_info": { 153 | "codemirror_mode": { 154 | "name": "ipython", 155 | "version": 3 156 | }, 157 | "file_extension": ".py", 158 | "mimetype": "text/x-python", 159 | "name": "python", 160 | "nbconvert_exporter": "python", 161 | "pygments_lexer": "ipython3", 162 | "version": "3.8.5" 163 | } 164 | }, 165 | "nbformat": 4, 166 | "nbformat_minor": 5 167 | } 168 | -------------------------------------------------------------------------------- /D11-bubble-sort/bubble-sort.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "id": "affiliated-success", 6 | "metadata": {}, 7 | "source": [ 8 | "Bubble Sort goes through n-1 iterations, looking at n-1 pairs of adjacent elements. This gives it the time complexity of O(n2), in both best-case and average-case situations. O(n2) is considered pretty horrible for a sorting algorithm.\n", 9 | "\n", 10 | "It does have an O(1) space complexity, but that isn't enough to compensate for its shortcomings in other fields." 11 | ] 12 | }, 13 | { 14 | "cell_type": "code", 15 | "execution_count": 10, 16 | "id": "first-payment", 17 | "metadata": {}, 18 | "outputs": [], 19 | "source": [ 20 | "def bubble_sort(ls):\n", 21 | " _swapped = True\n", 22 | "\n", 23 | " num_of_iterations = 0\n", 24 | "\n", 25 | " while(_swapped):\n", 26 | " _swapped = False\n", 27 | " for i in range(len(ls) - num_of_iterations - 1):\n", 28 | " if ls[i] > ls[i+1]:\n", 29 | " # Swap\n", 30 | " ls[i], ls[i+1] = ls[i+1], ls[i]\n", 31 | " _swapped = True\n", 32 | " num_of_iterations += 1\n", 33 | "\n", 34 | " return ls\n", 35 | "import random\n", 36 | "ls= random.sample(range(1, 10000),1000)\n", 37 | "bubble_sort()" 38 | ] 39 | } 40 | ], 41 | "metadata": { 42 | "kernelspec": { 43 | "display_name": "Python 3.8.2 64-bit", 44 | "language": "python", 45 | "name": "python38264bita03373cad2404f55bdc5db0285b9fbe0" 46 | }, 47 | "language_info": { 48 | "codemirror_mode": { 49 | "name": "ipython", 50 | "version": 3 51 | }, 52 | "file_extension": ".py", 53 | "mimetype": "text/x-python", 54 | "name": "python", 55 | "nbconvert_exporter": "python", 56 | "pygments_lexer": "ipython3", 57 | "version": "3.8.5" 58 | } 59 | }, 60 | "nbformat": 4, 61 | "nbformat_minor": 5 62 | } 63 | -------------------------------------------------------------------------------- /D13/D13-sql.txt: -------------------------------------------------------------------------------- 1 | /* problem 1 -weather station 19 problem Hacker rank */ 2 | SELECT 3 | ROUND(SQRT( 4 | POWER(MAX(LAT_N) - MIN(LAT_N), 2) 5 | + POWER(MAX(LONG_W) - MIN(LONG_W), 2) 6 | ), 4) 7 | FROM 8 | STATION; -------------------------------------------------------------------------------- /D14/D14-sql.txt: -------------------------------------------------------------------------------- 1 | SELECT ROUND(MEDIAN(Lat_N), 4) 2 | FROM Station; 3 | #solution for oracle only 4 | -------------------------------------------------------------------------------- /D15-sql-intermediate/problems.txt: -------------------------------------------------------------------------------- 1 | q1. Write a query to calculate the average daily price change in Apple stock, grouped by year. 2 | 3 | answer :- select year,avg(close-open) as open_close_price from tutorial.aapl_historical_stock_price group by year order by year 4 | 5 | Q2. Write a query that calculates the lowest and highest prices that Apple stock achieved each month. 6 | 7 | answer :- select year,month, max(high) as MAXIMUM ,min(low) as MINIMUM from tutorial.aapl_historical_stock_price group by year,month ORDER by year,month 8 | 9 | 10 | Q3. Basic example of using HAVINg keyword 11 | answer:- SELECT year, 12 | month, 13 | MAX(high) AS month_high 14 | FROM tutorial.aapl_historical_stock_price 15 | GROUP BY year, month 16 | HAVING MAX(high) > 400 17 | ORDER BY year, month 18 | -------------------------------------------------------------------------------- /D16-cnn-basics/D16_cnn_basics.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "D16-cnn-basics.ipynb", 7 | "provenance": [], 8 | "collapsed_sections": [] 9 | }, 10 | "kernelspec": { 11 | "name": "python3", 12 | "display_name": "Python 3" 13 | }, 14 | "language_info": { 15 | "name": "python" 16 | } 17 | }, 18 | "cells": [ 19 | { 20 | "cell_type": "code", 21 | "metadata": { 22 | "colab": { 23 | "base_uri": "https://localhost:8080/" 24 | }, 25 | "id": "yEsg7V5bvGF5", 26 | "outputId": "d0ef687c-5e34-4243-dd38-04864e85326e" 27 | }, 28 | "source": [ 29 | "#resource = https://jhui.github.io/2017/03/16/CNN-Convolutional-neural-network/\n", 30 | "# and https://victorzhou.com/blog/intro-to-cnns-part-1/\n", 31 | "\n", 32 | "# run this notebook in colab if not having tensorflow in local\n", 33 | "import numpy as np\n", 34 | "from tensorflow import keras\n", 35 | "(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()\n", 36 | "x_train.shape" 37 | ], 38 | "execution_count": 3, 39 | "outputs": [ 40 | { 41 | "output_type": "stream", 42 | "text": [ 43 | "Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz\n", 44 | "11493376/11490434 [==============================] - 0s 0us/step\n" 45 | ], 46 | "name": "stdout" 47 | }, 48 | { 49 | "output_type": "execute_result", 50 | "data": { 51 | "text/plain": [ 52 | "(60000, 28, 28)" 53 | ] 54 | }, 55 | "metadata": { 56 | "tags": [] 57 | }, 58 | "execution_count": 3 59 | } 60 | ] 61 | }, 62 | { 63 | "cell_type": "code", 64 | "metadata": { 65 | "id": "tW3t1Zi0vtol" 66 | }, 67 | "source": [ 68 | "\n", 69 | "class Conv3x3:\n", 70 | " # A Convolution layer using 3x3 filters.\n", 71 | "\n", 72 | " def __init__(self, num_filters):\n", 73 | " self.num_filters = num_filters\n", 74 | "\n", 75 | " # filters is a 3d array with dimensions (num_filters, 3, 3)\n", 76 | " # We divide by 9 to reduce the variance of our initial values---> This is Xavier Initialisation\n", 77 | " self.filters = np.random.randn(num_filters, 3, 3) / 9\n", 78 | "\n", 79 | " def iterate_regions(self, image):\n", 80 | " '''\n", 81 | " Generates all possible 3x3 image regions using valid padding.\n", 82 | " - image is a 2d numpy array\n", 83 | " '''\n", 84 | " h, w = image.shape\n", 85 | "\n", 86 | " for i in range(h - 2):\n", 87 | " for j in range(w - 2):\n", 88 | " im_region = image[i:(i + 3), j:(j + 3)]\n", 89 | " # print(\"Regions\",'\\n',im_region,i,j)\n", 90 | " # region of image where our convolution will take place (a 3x3 grid of image)\n", 91 | " yield im_region, i, j\n", 92 | "\n", 93 | " def forward(self, input):\n", 94 | " '''\n", 95 | " Performs a forward pass of the conv layer using the given input.\n", 96 | " Returns a 3d numpy array with dimensions (h, w, num_filters).\n", 97 | " - input is a 2d numpy array\n", 98 | " '''\n", 99 | " h, w = input.shape\n", 100 | " #initialising all Feature maps with zeros (8 feature maps of shape 26,26)\n", 101 | " output = np.zeros((h - 2, w - 2, self.num_filters))\n", 102 | "\n", 103 | " # for i in range(output.shape[2]):\n", 104 | " # print('Initialyy :-',output[i],output[i].shape)\n", 105 | "\n", 106 | " for im_region, i, j in self.iterate_regions(input):\n", 107 | " \n", 108 | " output[i, j] = np.sum(im_region * self.filters, axis=(1, 2))\n", 109 | "\n", 110 | " return output\n", 111 | "\n", 112 | "\n", 113 | "\n", 114 | "class MaxPool2:\n", 115 | " # A Max Pooling layer using a pool size of 2.\n", 116 | "\n", 117 | " def iterate_regions(self, image):\n", 118 | " '''\n", 119 | " Generates non-overlapping 2x2 image regions to pool over.\n", 120 | " - image is a 2d numpy array\n", 121 | " '''\n", 122 | " h, w, _ = image.shape\n", 123 | " new_h = h // 2\n", 124 | " new_w = w // 2\n", 125 | "\n", 126 | " for i in range(new_h):\n", 127 | " for j in range(new_w):\n", 128 | " im_region = image[(i * 2):(i * 2 + 2), (j * 2):(j * 2 + 2)]\n", 129 | " yield im_region, i, j\n", 130 | "\n", 131 | " def forward(self, input):\n", 132 | " '''\n", 133 | " Performs a forward pass of the maxpool layer using the given input.\n", 134 | " Returns a 3d numpy array with dimensions (h / 2, w / 2, num_filters).\n", 135 | " - input is a 3d numpy array with dimensions (h, w, num_filters)\n", 136 | " '''\n", 137 | " h, w, num_filters = input.shape\n", 138 | " output = np.zeros((h // 2, w // 2, num_filters))\n", 139 | "\n", 140 | " for im_region, i, j in self.iterate_regions(input):\n", 141 | " output[i, j] = np.amax(im_region, axis=(0, 1))\n", 142 | "\n", 143 | " return output\n", 144 | "\n" 145 | ], 146 | "execution_count": 28, 147 | "outputs": [] 148 | }, 149 | { 150 | "cell_type": "code", 151 | "metadata": { 152 | "colab": { 153 | "base_uri": "https://localhost:8080/" 154 | }, 155 | "id": "aMHn2Lzovtsn", 156 | "outputId": "ec77aeed-c715-43fc-fb5b-108044d05bd2" 157 | }, 158 | "source": [ 159 | "conv = Conv3x3(8)\n", 160 | "pool = MaxPool2()\n", 161 | "\n", 162 | "output = conv.forward(x_train[0])\n", 163 | "output = pool.forward(output)\n", 164 | "print(output.shape) # (13, 13, 8)" 165 | ], 166 | "execution_count": 30, 167 | "outputs": [ 168 | { 169 | "output_type": "stream", 170 | "text": [ 171 | "(13, 13, 8)\n" 172 | ], 173 | "name": "stdout" 174 | } 175 | ] 176 | }, 177 | { 178 | "cell_type": "code", 179 | "metadata": { 180 | "id": "2jGQTIABvtwD" 181 | }, 182 | "source": [ 183 | "" 184 | ], 185 | "execution_count": null, 186 | "outputs": [] 187 | }, 188 | { 189 | "cell_type": "code", 190 | "metadata": { 191 | "id": "w9fOp-kTvty8" 192 | }, 193 | "source": [ 194 | "" 195 | ], 196 | "execution_count": null, 197 | "outputs": [] 198 | }, 199 | { 200 | "cell_type": "code", 201 | "metadata": { 202 | "id": "tcbwUaTivt1s" 203 | }, 204 | "source": [ 205 | "" 206 | ], 207 | "execution_count": null, 208 | "outputs": [] 209 | }, 210 | { 211 | "cell_type": "code", 212 | "metadata": { 213 | "id": "D-cP_Zquvt4X" 214 | }, 215 | "source": [ 216 | "" 217 | ], 218 | "execution_count": null, 219 | "outputs": [] 220 | }, 221 | { 222 | "cell_type": "code", 223 | "metadata": { 224 | "id": "ZH9Wm-Jivt67" 225 | }, 226 | "source": [ 227 | "" 228 | ], 229 | "execution_count": null, 230 | "outputs": [] 231 | }, 232 | { 233 | "cell_type": "code", 234 | "metadata": { 235 | "id": "WoHG47zivt9q" 236 | }, 237 | "source": [ 238 | "" 239 | ], 240 | "execution_count": null, 241 | "outputs": [] 242 | }, 243 | { 244 | "cell_type": "code", 245 | "metadata": { 246 | "id": "H8jWT3kOvuAD" 247 | }, 248 | "source": [ 249 | "" 250 | ], 251 | "execution_count": null, 252 | "outputs": [] 253 | }, 254 | { 255 | "cell_type": "code", 256 | "metadata": { 257 | "id": "xfYjVvkUvuCJ" 258 | }, 259 | "source": [ 260 | "" 261 | ], 262 | "execution_count": null, 263 | "outputs": [] 264 | } 265 | ] 266 | } -------------------------------------------------------------------------------- /D2-logistic-reg/D2-logistic-regression.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 38, 6 | "id": "precious-pharmaceutical", 7 | "metadata": {}, 8 | "outputs": [], 9 | "source": [ 10 | "#import required modules\n", 11 | "\n", 12 | "\n", 13 | "import warnings\n", 14 | "warnings.filterwarnings('ignore' )\n", 15 | "\n", 16 | "\n", 17 | "import numpy as np\n", 18 | " \n", 19 | "class LogisticRegression:\n", 20 | " def __init__(self,x,y): \n", 21 | " self.intercept = np.ones((x.shape[0], 1)) \n", 22 | " self.x = np.concatenate((self.intercept, x), axis=1)\n", 23 | " self.weight = np.zeros(self.x.shape[1])\n", 24 | " self.y = y\n", 25 | " \n", 26 | " #Sigmoid method\n", 27 | " def sigmoid(self, x, weight):\n", 28 | " z = np.dot(x, weight)\n", 29 | " return 1 / (1 + np.exp(-z))\n", 30 | " \n", 31 | " #method to calculate the Loss\n", 32 | " # h- predicted value\n", 33 | " # y- true value\n", 34 | " def loss(self, h, y):\n", 35 | " return (-y * np.log(h) - (1 - y) * np.log(1 - h)).mean()\n", 36 | " \n", 37 | " #Method for calculating the gradients\n", 38 | " def gradient_descent(self, X, h, y):\n", 39 | " return np.dot(X.T, (h - y)) / y.shape[0]\n", 40 | " \n", 41 | " \n", 42 | " def fit(self, lr , iterations):\n", 43 | " \n", 44 | " # this is batch gradient descent\n", 45 | " for i in range(iterations):\n", 46 | " if i==0:\n", 47 | " print(\"For first epochs weights are \",self.weight,\"\\n\")\n", 48 | " z = self.sigmoid(self.x, self.weight)\n", 49 | " \n", 50 | " loss = self.loss(z,self.y)\n", 51 | " \n", 52 | " delta_w = self.gradient_descent(self.x , z, self.y)\n", 53 | " \n", 54 | " #Updating the weights\n", 55 | " self.weight -= lr * delta_w\n", 56 | " \n", 57 | " return print('fitted successfully to data',\"\\n\")\n", 58 | " \n", 59 | " #Method to predict the class label.\n", 60 | " def predict(self, x_new , treshold):\n", 61 | " x_new = np.concatenate((self.intercept, x_new), axis=1)\n", 62 | " result = self.sigmoid(x_new, self.weight)\n", 63 | " result = result >= treshold\n", 64 | " y_pred = np.zeros(result.shape[0])\n", 65 | " for i in range(len(y_pred)):\n", 66 | " if result[i] == True: \n", 67 | " y_pred[i] = 1\n", 68 | " else:\n", 69 | " continue\n", 70 | " \n", 71 | " return y_pred" 72 | ] 73 | }, 74 | { 75 | "cell_type": "code", 76 | "execution_count": 40, 77 | "id": "determined-things", 78 | "metadata": {}, 79 | "outputs": [ 80 | { 81 | "name": "stdout", 82 | "output_type": "stream", 83 | "text": [ 84 | "For first epochs weights are [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", 85 | " 0. 0. 0. 0. 0. 0. 0.] \n", 86 | "\n", 87 | "fitted successfully to data \n", 88 | "\n", 89 | "accuracy -> 0.9103690685413005\n", 90 | "CPU times: user 5.77 s, sys: 0 ns, total: 5.77 s\n", 91 | "Wall time: 5.77 s\n" 92 | ] 93 | } 94 | ], 95 | "source": [ 96 | "%%time\n", 97 | "from sklearn.datasets import load_breast_cancer\n", 98 | " \n", 99 | "#Loading the data\n", 100 | "data = load_breast_cancer()\n", 101 | " \n", 102 | "#Preparing the data\n", 103 | "x = data.data\n", 104 | "y = data.target\n", 105 | " \n", 106 | "#creating the class Object\n", 107 | "regressor = LogisticRegression(x,y)\n", 108 | " \n", 109 | "#\n", 110 | "regressor.fit(0.001 , 50000)\n", 111 | " \n", 112 | "y_pred = regressor.predict(x,0.5)\n", 113 | " \n", 114 | "print('accuracy -> {}'.format(sum(y_pred == y) / y.shape[0]))" 115 | ] 116 | } 117 | ], 118 | "metadata": { 119 | "kernelspec": { 120 | "display_name": "Python 3.8.5 64-bit", 121 | "language": "python", 122 | "name": "python385jvsc74a57bd0916dbcbb3f70747c44a77c7bcd40155683ae19c65e1c03b4aa3499c5328201f1" 123 | }, 124 | "language_info": { 125 | "codemirror_mode": { 126 | "name": "ipython", 127 | "version": 3 128 | }, 129 | "file_extension": ".py", 130 | "mimetype": "text/x-python", 131 | "name": "python", 132 | "nbconvert_exporter": "python", 133 | "pygments_lexer": "ipython3", 134 | "version": "3.8.5" 135 | } 136 | }, 137 | "nbformat": 4, 138 | "nbformat_minor": 5 139 | } 140 | -------------------------------------------------------------------------------- /D3-rmsprop/D3-RMSPROP-logistic-reg.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 91, 6 | "id": "designed-reader", 7 | "metadata": {}, 8 | "outputs": [], 9 | "source": [ 10 | "#import required modules\n", 11 | "\n", 12 | "# link to article = https://ruder.io/optimizing-gradient-descent/\n", 13 | "import warnings\n", 14 | "warnings.filterwarnings('ignore' )\n", 15 | "\n", 16 | "\n", 17 | "import numpy as np\n", 18 | " \n", 19 | "class LogisticRegression:\n", 20 | " def __init__(self,x,y): \n", 21 | " self.intercept = np.ones((x.shape[0], 1)) \n", 22 | " self.x = np.concatenate((self.intercept, x), axis=1)\n", 23 | " self.weight = np.zeros(self.x.shape[1])\n", 24 | " self.y = y\n", 25 | " \n", 26 | " #Sigmoid method\n", 27 | " def sigmoid(self, x, weight):\n", 28 | " z = np.dot(x, weight)\n", 29 | " return 1 / (1 + np.exp(-z))\n", 30 | " \n", 31 | " #method to calculate the Loss\n", 32 | " # h- predicted value\n", 33 | " # y- true value\n", 34 | " def loss(self, h, y):\n", 35 | " return (-y * np.log(h) - (1 - y) * np.log(1 - h)).mean()\n", 36 | " \n", 37 | " #Method for calculating the gradients\n", 38 | " def gradient_descent(self, X, h, y):\n", 39 | " return np.dot(X.T, (h - y)) / y.shape[0]\n", 40 | " \n", 41 | " \n", 42 | " def fit(self, lr , iterations,decay_factor = 0.9,eps=0.0000001):\n", 43 | " \n", 44 | " grad_sq =0\n", 45 | " \n", 46 | " # index will be used to randomly select rows\n", 47 | " index_ = [i for i in range(len(self.x)-1)]\n", 48 | " \n", 49 | " for i in range(iterations):\n", 50 | " \n", 51 | " \n", 52 | " random_index = random.choice(index_)\n", 53 | " \n", 54 | " # STOCHASTIC GRADIENT DESCENT selcting only one row for X and Y\n", 55 | " row_x = self.x[random_index:random_index+1,:]\n", 56 | " \n", 57 | " row_y = self.y[random_index:random_index+1]\n", 58 | " \n", 59 | " if i==0:\n", 60 | " print(\"For first epochs weights are \",self.weight,\"\\n\")\n", 61 | " z = self.sigmoid(row_x, self.weight)\n", 62 | " \n", 63 | " loss = self.loss(z,row_y)\n", 64 | " \n", 65 | " delta_w = self.gradient_descent(row_x , z, row_y)\n", 66 | " \n", 67 | " # moving averages\n", 68 | " grad_sq = decay_factor * grad_sq + (1-decay_factor)*(delta_w**2)\n", 69 | " \n", 70 | " #Updating the weights accoring to RMS prop \n", 71 | " # eps is added because at times grad_sq will be close to zero so to prevent shooting sqrt to infinite\n", 72 | " self.weight -= (lr/np.sqrt(grad_sq+eps))*delta_w\n", 73 | " \n", 74 | " return print('fitted successfully to data',\"\\n\")\n", 75 | " \n", 76 | " #Method to predict the class label.\n", 77 | " def predict(self, x_new , treshold):\n", 78 | " x_new = np.concatenate((self.intercept, x_new), axis=1)\n", 79 | " result = self.sigmoid(x_new, self.weight)\n", 80 | " result = result >= treshold\n", 81 | " y_pred = np.zeros(result.shape[0])\n", 82 | " for i in range(len(y_pred)):\n", 83 | " if result[i] == True: \n", 84 | " y_pred[i] = 1\n", 85 | " else:\n", 86 | " continue\n", 87 | " \n", 88 | " return y_pred" 89 | ] 90 | }, 91 | { 92 | "cell_type": "code", 93 | "execution_count": 92, 94 | "id": "brutal-situation", 95 | "metadata": {}, 96 | "outputs": [ 97 | { 98 | "name": "stdout", 99 | "output_type": "stream", 100 | "text": [ 101 | "For first epochs weights are [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", 102 | " 0. 0. 0. 0. 0. 0. 0.] \n", 103 | "\n", 104 | "fitted successfully to data \n", 105 | "\n", 106 | "accuracy -> 0.929701230228471\n", 107 | "CPU times: user 1.33 s, sys: 0 ns, total: 1.33 s\n", 108 | "Wall time: 1.33 s\n" 109 | ] 110 | } 111 | ], 112 | "source": [ 113 | "%%time\n", 114 | "from sklearn.datasets import load_breast_cancer\n", 115 | " \n", 116 | "#Loading the data\n", 117 | "data = load_breast_cancer()\n", 118 | " \n", 119 | "#Preparing the data\n", 120 | "x = data.data\n", 121 | "y = data.target\n", 122 | " \n", 123 | "#creating the class Object\n", 124 | "regressor = LogisticRegression(x,y)\n", 125 | " \n", 126 | "#\n", 127 | "regressor.fit(lr= 0.0001 , iterations=50000)\n", 128 | " \n", 129 | "y_pred = regressor.predict(x,0.5)\n", 130 | " \n", 131 | "print('accuracy -> {}'.format(sum(y_pred == y) / y.shape[0]))" 132 | ] 133 | } 134 | ], 135 | "metadata": { 136 | "kernelspec": { 137 | "display_name": "Python 3.8.5 64-bit", 138 | "language": "python", 139 | "name": "python385jvsc74a57bd0916dbcbb3f70747c44a77c7bcd40155683ae19c65e1c03b4aa3499c5328201f1" 140 | }, 141 | "language_info": { 142 | "codemirror_mode": { 143 | "name": "ipython", 144 | "version": 3 145 | }, 146 | "file_extension": ".py", 147 | "mimetype": "text/x-python", 148 | "name": "python", 149 | "nbconvert_exporter": "python", 150 | "pygments_lexer": "ipython3", 151 | "version": "3.8.5" 152 | } 153 | }, 154 | "nbformat": 4, 155 | "nbformat_minor": 5 156 | } 157 | -------------------------------------------------------------------------------- /D4-knn/D4-knn.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 104, 6 | "id": "annual-lotus", 7 | "metadata": {}, 8 | "outputs": [], 9 | "source": [ 10 | "import numpy as np\n", 11 | "import pandas as pd\n", 12 | "\n", 13 | "# loading data\n", 14 | "from sklearn.metrics import accuracy_score\n", 15 | "from sklearn.datasets import load_wine\n", 16 | "from sklearn.metrics import accuracy_score\n", 17 | "from sklearn.model_selection import train_test_split\n", 18 | "\n", 19 | "from numpy.random import randint\n", 20 | "#Loading the Data\n", 21 | "data= load_wine()\n", 22 | " \n", 23 | "# Store features matrix in X\n", 24 | "X= data.data\n", 25 | "#Store target vector in \n", 26 | "y= data.target\n", 27 | " \n", 28 | "X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.33, random_state=42)" 29 | ] 30 | }, 31 | { 32 | "cell_type": "code", 33 | "execution_count": 114, 34 | "id": "hundred-ministry", 35 | "metadata": {}, 36 | "outputs": [ 37 | { 38 | "name": "stdout", 39 | "output_type": "stream", 40 | "text": [ 41 | "0.7457627118644068\n" 42 | ] 43 | } 44 | ], 45 | "source": [ 46 | "class KNN:\n", 47 | " def __init__(self,n_neighbours=3):\n", 48 | " self.n_neighbours = n_neighbours\n", 49 | " self.top_k = []\n", 50 | " self.x = []\n", 51 | " self.y = []\n", 52 | " self.distances = []\n", 53 | " \n", 54 | " \n", 55 | " def load(self,x,y):\n", 56 | " \n", 57 | " if type(x) == np.ndarray and len(x.shape)>1 and type(y) == np.ndarray :\n", 58 | " if x.shape[0]==y.shape[0]:\n", 59 | " self.x = x\n", 60 | " self.y = y \n", 61 | " else:\n", 62 | " raise ValueError('Number of rows do not match for X and Y' )\n", 63 | " else:\n", 64 | " raise ValueError('Input Data not in Valid Format. Type should be N dimensional Numpy array')\n", 65 | " \n", 66 | " def predict(self,test_data):\n", 67 | " \n", 68 | " if type(test_data)==np.ndarray and test_data.shape[1]==self.x.shape[1]:\n", 69 | " \n", 70 | " prediction=[]\n", 71 | " \n", 72 | " for t in range(test_data.shape[0]):\n", 73 | " \n", 74 | " # Euclidean distance of test data point wrt to all Training rows\n", 75 | " ls = [ np.linalg.norm(self.x[i]-test_data[t]) for i in range(self.x.shape[0]) ] \n", 76 | " \n", 77 | " # indexes of sorted euclidean distances \n", 78 | " top_k_index = np.argsort(ls)\n", 79 | "\n", 80 | " # slicing top k predictions\n", 81 | " self.top_k = self.y[top_k_index[:self.n_neighbours]]\n", 82 | "\n", 83 | " # converting np array of shape (n,1) to (n,)\n", 84 | " self.top_k = self.top_k.reshape(self.top_k.shape[0])\n", 85 | " \n", 86 | " # storing predictions( actual labels ) we require\n", 87 | " prediction.append(np.bincount(self.top_k).argmax())\n", 88 | " \n", 89 | " return prediction\n", 90 | " else:\n", 91 | " raise ValueError('Test Data dimensions don\\'t match with dimensions of Training data')\n", 92 | " \n", 93 | "f = KNN(n_neighbours=50)\n", 94 | "f.load(X_train,y_train)\n", 95 | "prediction=f.predict(X_test)\n", 96 | "print(accuracy_score(y_test,prediction))\n" 97 | ] 98 | }, 99 | { 100 | "cell_type": "markdown", 101 | "id": "lesser-poetry", 102 | "metadata": {}, 103 | "source": [ 104 | "### Sklearn's KNN" 105 | ] 106 | }, 107 | { 108 | "cell_type": "code", 109 | "execution_count": 115, 110 | "id": "insured-reminder", 111 | "metadata": {}, 112 | "outputs": [ 113 | { 114 | "name": "stdout", 115 | "output_type": "stream", 116 | "text": [ 117 | "0.7457627118644068\n" 118 | ] 119 | } 120 | ], 121 | "source": [ 122 | "from sklearn.neighbors import KNeighborsClassifier\n", 123 | "neigh = KNeighborsClassifier(n_neighbors=50)\n", 124 | "neigh.fit(X_train,y_train)\n", 125 | "p=neigh.predict(X_test)\n", 126 | "\n", 127 | "print(accuracy_score(y_test,p))" 128 | ] 129 | } 130 | ], 131 | "metadata": { 132 | "kernelspec": { 133 | "display_name": "Python 3.8.2 64-bit", 134 | "language": "python", 135 | "name": "python38264bita03373cad2404f55bdc5db0285b9fbe0" 136 | }, 137 | "language_info": { 138 | "codemirror_mode": { 139 | "name": "ipython", 140 | "version": 3 141 | }, 142 | "file_extension": ".py", 143 | "mimetype": "text/x-python", 144 | "name": "python", 145 | "nbconvert_exporter": "python", 146 | "pygments_lexer": "ipython3", 147 | "version": "3.8.5" 148 | } 149 | }, 150 | "nbformat": 4, 151 | "nbformat_minor": 5 152 | } 153 | -------------------------------------------------------------------------------- /D5-kmeans/D5-Kmeans.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "id": "latter-elements", 7 | "metadata": {}, 8 | "outputs": [], 9 | "source": [ 10 | "import numpy as np\n", 11 | "import random\n", 12 | "from scipy.spatial.distance import cdist \n", 13 | "\n", 14 | "\n", 15 | "# make sure number of centroids are not more than Number of data points in dataset\n", 16 | "class Kmeans: \n", 17 | " def __init__(self,centroids=3,iterations=1000):\n", 18 | " # Hyperparameter - number of centroids \n", 19 | " self.centroids = centroids\n", 20 | " \n", 21 | " # data to be used for clustering\n", 22 | " self.data = []\n", 23 | " \n", 24 | " # list containing centroids selected at each iteration\n", 25 | " self.centroids_ls =[]\n", 26 | " #number of iterations\n", 27 | " self.iterations = iterations \n", 28 | " \n", 29 | " def load(self,data): \n", 30 | " \n", 31 | " if type(data) == np.ndarray and len(data.shape)>1:\n", 32 | " \n", 33 | " self.data = data\n", 34 | " else:\n", 35 | " raise ValueError('Input Data not in Valid Format. Type should be N dimensional Numpy array') \n", 36 | " \n", 37 | " def fit(self):\n", 38 | " # if number of centroids more than number of rows in dataset then run this\n", 39 | " if self.centroids < len(self.data):\n", 40 | " \n", 41 | " # selecting random rows indexes\n", 42 | " n_random_rows = np.random.randint(self.data.shape[0], size=self.centroids)\n", 43 | " centroids_ = self.data[n_random_rows, :]\n", 44 | "\n", 45 | " # storing centroids we get at each stage --- ADDITIONAL STEP\n", 46 | " self.centroids_ls.append(centroids_)\n", 47 | "\n", 48 | " # distances from centroids to rest of other points\n", 49 | " distances = cdist(self.data,centroids_,'euclidean')\n", 50 | "\n", 51 | " #Centroid with the minimum Distance on first Iteration\n", 52 | " # points will always vary from 0 to centroids\n", 53 | " points = np.array([np.argmin(i) for i in distances]) \n", 54 | "\n", 55 | "\n", 56 | " for _ in range(self.iterations):\n", 57 | "\n", 58 | " centroids_ =[]\n", 59 | " # For each centoid we will see which point belongs to that class and then take mean to \n", 60 | " # update centroid of that class\n", 61 | " for c in range(self.centroids):\n", 62 | "\n", 63 | " #Updating Centroids by taking mean of Cluster it belongs to\n", 64 | " temp_cent = self.data[points==c].mean(axis=0)\n", 65 | "\n", 66 | " centroids_.append(temp_cent)\n", 67 | "\n", 68 | "\n", 69 | " # on every iteration storing new centoids formed\n", 70 | " self.centroids_ls.append(centroids_)\n", 71 | "\n", 72 | " centroids_ = np.vstack(centroids_)\n", 73 | " distances = cdist(self.data, centroids_ ,'euclidean')\n", 74 | " points = np.array([np.argmin(i) for i in distances])\n", 75 | " return points\n", 76 | " else:\n", 77 | " raise ValueError(\"Number of Centroids more than Number of rows of Dataset\")\n" 78 | ] 79 | }, 80 | { 81 | "cell_type": "code", 82 | "execution_count": 2, 83 | "id": "distributed-benefit", 84 | "metadata": {}, 85 | "outputs": [], 86 | "source": [ 87 | "from sklearn.datasets import load_iris\n", 88 | "#Loading the data\n", 89 | "data = load_iris()\n", 90 | " \n", 91 | "#Preparing the data\n", 92 | "x = data.data\n", 93 | "y = data.target\n", 94 | " \n", 95 | "k = Kmeans(centroids=3,iterations=100)\n", 96 | "\n", 97 | "k.load(x)\n", 98 | "\n", 99 | "preds = k.fit()" 100 | ] 101 | }, 102 | { 103 | "cell_type": "code", 104 | "execution_count": null, 105 | "id": "known-start", 106 | "metadata": {}, 107 | "outputs": [], 108 | "source": [] 109 | } 110 | ], 111 | "metadata": { 112 | "kernelspec": { 113 | "display_name": "Python 3.8.5 64-bit", 114 | "language": "python", 115 | "name": "python385jvsc74a57bd0916dbcbb3f70747c44a77c7bcd40155683ae19c65e1c03b4aa3499c5328201f1" 116 | }, 117 | "language_info": { 118 | "codemirror_mode": { 119 | "name": "ipython", 120 | "version": 3 121 | }, 122 | "file_extension": ".py", 123 | "mimetype": "text/x-python", 124 | "name": "python", 125 | "nbconvert_exporter": "python", 126 | "pygments_lexer": "ipython3", 127 | "version": "3.8.5" 128 | } 129 | }, 130 | "nbformat": 4, 131 | "nbformat_minor": 5 132 | } 133 | -------------------------------------------------------------------------------- /D6-naivebayes/D6-naive-bayes.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 3, 6 | "id": "liked-vertex", 7 | "metadata": {}, 8 | "outputs": [], 9 | "source": [ 10 | "# why we are ignoring Marginal prob term ( denominator) of Naive bayes\n", 11 | "# https://chrisalbon.com/machine_learning/naive_bayes/naive_bayes_classifier_from_scratch/\n", 12 | "\n", 13 | "import pandas as pd\n", 14 | "import numpy as np" 15 | ] 16 | }, 17 | { 18 | "cell_type": "code", 19 | "execution_count": 12, 20 | "id": "junior-envelope", 21 | "metadata": {}, 22 | "outputs": [], 23 | "source": [ 24 | "class NaiveBayesClassifier():\n", 25 | " '''\n", 26 | " Bayes Theorem form\n", 27 | " P(y|X) = P(X|y) * P(y) / P(X)\n", 28 | " '''\n", 29 | " def calc_prior(self, features, target):\n", 30 | " '''\n", 31 | " prior probability P(y)\n", 32 | " calculate prior probabilities\n", 33 | " '''\n", 34 | " self.prior = (features.groupby(target).apply(lambda x: len(x)) / self.rows).to_numpy()\n", 35 | "\n", 36 | " return self.prior\n", 37 | " \n", 38 | " def calc_statistics(self, features, target):\n", 39 | " '''\n", 40 | " calculate mean, variance for each column and convert to numpy array\n", 41 | " ''' \n", 42 | " self.mean = features.groupby(target).apply(np.mean).to_numpy()\n", 43 | " self.var = features.groupby(target).apply(np.var).to_numpy()\n", 44 | " \n", 45 | " return self.mean, self.var\n", 46 | " \n", 47 | " def gaussian_density(self, class_idx, x): \n", 48 | " '''\n", 49 | " calculate probability from gaussian density function (normally distributed)\n", 50 | " we will assume that probability of specific target value given specific class is normally distributed \n", 51 | " \n", 52 | " probability density function for gaussain dist. is:\n", 53 | " (1/√2pi*σ) * exp((-1/2)*((x-μ)^2)/(2*σ²)), where μ is mean, σ² is variance, σ is quare root of variance (standard deviation)\n", 54 | " '''\n", 55 | " mean = self.mean[class_idx]\n", 56 | " var = self.var[class_idx]\n", 57 | " numerator = np.exp((-1/2)*((x-mean)**2) / (2 * var))\n", 58 | " denominator = np.sqrt(2 * np.pi * var)\n", 59 | " prob = numerator / denominator\n", 60 | " return prob\n", 61 | " \n", 62 | " def calc_posterior(self, x):\n", 63 | " posteriors = []\n", 64 | "\n", 65 | " # calculate posterior probability for each class\n", 66 | " for i in range(self.count):\n", 67 | " prior = self.prior[i] ## use the log to make it more numerically stable\n", 68 | " conditional = np.sum(self.gaussian_density(i, x)) # use the log to make it more numerically stable\n", 69 | " posterior = prior * conditional\n", 70 | " posteriors.append(posterior)\n", 71 | " # return class with highest posterior probability\n", 72 | " return self.classes[np.argmax(posteriors)]\n", 73 | " def fit(self, features, target):\n", 74 | " self.classes = np.unique(target)\n", 75 | " self.count = len(self.classes)\n", 76 | " self.feature_nums = features.shape[1]\n", 77 | " self.rows = features.shape[0]\n", 78 | " \n", 79 | " self.calc_statistics(features, target)\n", 80 | " self.calc_prior(features, target)\n", 81 | " \n", 82 | " def predict(self, features):\n", 83 | " preds = [self.calc_posterior(f) for f in features.to_numpy()]\n", 84 | " return preds\n", 85 | "\n", 86 | " def accuracy(self, y_test, y_pred):\n", 87 | " accuracy = np.sum(y_test == y_pred) / len(y_test)\n", 88 | " return accuracy\n" 89 | ] 90 | }, 91 | { 92 | "cell_type": "code", 93 | "execution_count": 13, 94 | "id": "alternative-police", 95 | "metadata": {}, 96 | "outputs": [ 97 | { 98 | "name": "stdout", 99 | "output_type": "stream", 100 | "text": [ 101 | "(150, 5)\n", 102 | "(100, 4) (100,)\n", 103 | "(50, 4) (50,)\n" 104 | ] 105 | } 106 | ], 107 | "source": [ 108 | "# upload Iris dataset - shape is (150, 5)\n", 109 | "df = pd.read_csv(\"/home/sahib/100days/D6-naivebayes/iris.csv\")\n", 110 | "# shuffle dataset with sample\n", 111 | "df = df.sample(frac=1, random_state=1).reset_index(drop=True)\n", 112 | "# df shape\n", 113 | "print(df.shape)\n", 114 | "# set features and target\n", 115 | "X, y = df.iloc[:, :-1], df.iloc[:, -1]\n", 116 | "\n", 117 | "\n", 118 | "# # split on train and test 0.7/0.3\n", 119 | "X_train, X_test, y_train, y_test = X[:100], X[100:], y[:100], y[100:]\n", 120 | "\n", 121 | "print(X_train.shape, y_train.shape)\n", 122 | "print(X_test.shape, y_test.shape)" 123 | ] 124 | }, 125 | { 126 | "cell_type": "code", 127 | "execution_count": 14, 128 | "id": "champion-closure", 129 | "metadata": {}, 130 | "outputs": [], 131 | "source": [ 132 | "# train the model\n", 133 | "x = NaiveBayesClassifier()\n", 134 | "\n", 135 | "\n", 136 | "x.fit(X_train, y_train)" 137 | ] 138 | }, 139 | { 140 | "cell_type": "code", 141 | "execution_count": 15, 142 | "id": "sixth-allah", 143 | "metadata": {}, 144 | "outputs": [ 145 | { 146 | "data": { 147 | "text/plain": [ 148 | "0.92" 149 | ] 150 | }, 151 | "execution_count": 15, 152 | "metadata": {}, 153 | "output_type": "execute_result" 154 | } 155 | ], 156 | "source": [ 157 | "predictions = x.predict(X_test)\n", 158 | "x.accuracy(y_test, predictions)" 159 | ] 160 | } 161 | ], 162 | "metadata": { 163 | "kernelspec": { 164 | "display_name": "Python 3.8.5 64-bit", 165 | "language": "python", 166 | "name": "python385jvsc74a57bd0916dbcbb3f70747c44a77c7bcd40155683ae19c65e1c03b4aa3499c5328201f1" 167 | }, 168 | "language_info": { 169 | "codemirror_mode": { 170 | "name": "ipython", 171 | "version": 3 172 | }, 173 | "file_extension": ".py", 174 | "mimetype": "text/x-python", 175 | "name": "python", 176 | "nbconvert_exporter": "python", 177 | "pygments_lexer": "ipython3", 178 | "version": "3.8.5" 179 | } 180 | }, 181 | "nbformat": 4, 182 | "nbformat_minor": 5 183 | } 184 | -------------------------------------------------------------------------------- /D6-naivebayes/iris.csv: -------------------------------------------------------------------------------- 1 | "sepal.length","sepal.width","petal.length","petal.width","variety" 2 | 5.1,3.5,1.4,.2,"Setosa" 3 | 4.9,3,1.4,.2,"Setosa" 4 | 4.7,3.2,1.3,.2,"Setosa" 5 | 4.6,3.1,1.5,.2,"Setosa" 6 | 5,3.6,1.4,.2,"Setosa" 7 | 5.4,3.9,1.7,.4,"Setosa" 8 | 4.6,3.4,1.4,.3,"Setosa" 9 | 5,3.4,1.5,.2,"Setosa" 10 | 4.4,2.9,1.4,.2,"Setosa" 11 | 4.9,3.1,1.5,.1,"Setosa" 12 | 5.4,3.7,1.5,.2,"Setosa" 13 | 4.8,3.4,1.6,.2,"Setosa" 14 | 4.8,3,1.4,.1,"Setosa" 15 | 4.3,3,1.1,.1,"Setosa" 16 | 5.8,4,1.2,.2,"Setosa" 17 | 5.7,4.4,1.5,.4,"Setosa" 18 | 5.4,3.9,1.3,.4,"Setosa" 19 | 5.1,3.5,1.4,.3,"Setosa" 20 | 5.7,3.8,1.7,.3,"Setosa" 21 | 5.1,3.8,1.5,.3,"Setosa" 22 | 5.4,3.4,1.7,.2,"Setosa" 23 | 5.1,3.7,1.5,.4,"Setosa" 24 | 4.6,3.6,1,.2,"Setosa" 25 | 5.1,3.3,1.7,.5,"Setosa" 26 | 4.8,3.4,1.9,.2,"Setosa" 27 | 5,3,1.6,.2,"Setosa" 28 | 5,3.4,1.6,.4,"Setosa" 29 | 5.2,3.5,1.5,.2,"Setosa" 30 | 5.2,3.4,1.4,.2,"Setosa" 31 | 4.7,3.2,1.6,.2,"Setosa" 32 | 4.8,3.1,1.6,.2,"Setosa" 33 | 5.4,3.4,1.5,.4,"Setosa" 34 | 5.2,4.1,1.5,.1,"Setosa" 35 | 5.5,4.2,1.4,.2,"Setosa" 36 | 4.9,3.1,1.5,.2,"Setosa" 37 | 5,3.2,1.2,.2,"Setosa" 38 | 5.5,3.5,1.3,.2,"Setosa" 39 | 4.9,3.6,1.4,.1,"Setosa" 40 | 4.4,3,1.3,.2,"Setosa" 41 | 5.1,3.4,1.5,.2,"Setosa" 42 | 5,3.5,1.3,.3,"Setosa" 43 | 4.5,2.3,1.3,.3,"Setosa" 44 | 4.4,3.2,1.3,.2,"Setosa" 45 | 5,3.5,1.6,.6,"Setosa" 46 | 5.1,3.8,1.9,.4,"Setosa" 47 | 4.8,3,1.4,.3,"Setosa" 48 | 5.1,3.8,1.6,.2,"Setosa" 49 | 4.6,3.2,1.4,.2,"Setosa" 50 | 5.3,3.7,1.5,.2,"Setosa" 51 | 5,3.3,1.4,.2,"Setosa" 52 | 7,3.2,4.7,1.4,"Versicolor" 53 | 6.4,3.2,4.5,1.5,"Versicolor" 54 | 6.9,3.1,4.9,1.5,"Versicolor" 55 | 5.5,2.3,4,1.3,"Versicolor" 56 | 6.5,2.8,4.6,1.5,"Versicolor" 57 | 5.7,2.8,4.5,1.3,"Versicolor" 58 | 6.3,3.3,4.7,1.6,"Versicolor" 59 | 4.9,2.4,3.3,1,"Versicolor" 60 | 6.6,2.9,4.6,1.3,"Versicolor" 61 | 5.2,2.7,3.9,1.4,"Versicolor" 62 | 5,2,3.5,1,"Versicolor" 63 | 5.9,3,4.2,1.5,"Versicolor" 64 | 6,2.2,4,1,"Versicolor" 65 | 6.1,2.9,4.7,1.4,"Versicolor" 66 | 5.6,2.9,3.6,1.3,"Versicolor" 67 | 6.7,3.1,4.4,1.4,"Versicolor" 68 | 5.6,3,4.5,1.5,"Versicolor" 69 | 5.8,2.7,4.1,1,"Versicolor" 70 | 6.2,2.2,4.5,1.5,"Versicolor" 71 | 5.6,2.5,3.9,1.1,"Versicolor" 72 | 5.9,3.2,4.8,1.8,"Versicolor" 73 | 6.1,2.8,4,1.3,"Versicolor" 74 | 6.3,2.5,4.9,1.5,"Versicolor" 75 | 6.1,2.8,4.7,1.2,"Versicolor" 76 | 6.4,2.9,4.3,1.3,"Versicolor" 77 | 6.6,3,4.4,1.4,"Versicolor" 78 | 6.8,2.8,4.8,1.4,"Versicolor" 79 | 6.7,3,5,1.7,"Versicolor" 80 | 6,2.9,4.5,1.5,"Versicolor" 81 | 5.7,2.6,3.5,1,"Versicolor" 82 | 5.5,2.4,3.8,1.1,"Versicolor" 83 | 5.5,2.4,3.7,1,"Versicolor" 84 | 5.8,2.7,3.9,1.2,"Versicolor" 85 | 6,2.7,5.1,1.6,"Versicolor" 86 | 5.4,3,4.5,1.5,"Versicolor" 87 | 6,3.4,4.5,1.6,"Versicolor" 88 | 6.7,3.1,4.7,1.5,"Versicolor" 89 | 6.3,2.3,4.4,1.3,"Versicolor" 90 | 5.6,3,4.1,1.3,"Versicolor" 91 | 5.5,2.5,4,1.3,"Versicolor" 92 | 5.5,2.6,4.4,1.2,"Versicolor" 93 | 6.1,3,4.6,1.4,"Versicolor" 94 | 5.8,2.6,4,1.2,"Versicolor" 95 | 5,2.3,3.3,1,"Versicolor" 96 | 5.6,2.7,4.2,1.3,"Versicolor" 97 | 5.7,3,4.2,1.2,"Versicolor" 98 | 5.7,2.9,4.2,1.3,"Versicolor" 99 | 6.2,2.9,4.3,1.3,"Versicolor" 100 | 5.1,2.5,3,1.1,"Versicolor" 101 | 5.7,2.8,4.1,1.3,"Versicolor" 102 | 6.3,3.3,6,2.5,"Virginica" 103 | 5.8,2.7,5.1,1.9,"Virginica" 104 | 7.1,3,5.9,2.1,"Virginica" 105 | 6.3,2.9,5.6,1.8,"Virginica" 106 | 6.5,3,5.8,2.2,"Virginica" 107 | 7.6,3,6.6,2.1,"Virginica" 108 | 4.9,2.5,4.5,1.7,"Virginica" 109 | 7.3,2.9,6.3,1.8,"Virginica" 110 | 6.7,2.5,5.8,1.8,"Virginica" 111 | 7.2,3.6,6.1,2.5,"Virginica" 112 | 6.5,3.2,5.1,2,"Virginica" 113 | 6.4,2.7,5.3,1.9,"Virginica" 114 | 6.8,3,5.5,2.1,"Virginica" 115 | 5.7,2.5,5,2,"Virginica" 116 | 5.8,2.8,5.1,2.4,"Virginica" 117 | 6.4,3.2,5.3,2.3,"Virginica" 118 | 6.5,3,5.5,1.8,"Virginica" 119 | 7.7,3.8,6.7,2.2,"Virginica" 120 | 7.7,2.6,6.9,2.3,"Virginica" 121 | 6,2.2,5,1.5,"Virginica" 122 | 6.9,3.2,5.7,2.3,"Virginica" 123 | 5.6,2.8,4.9,2,"Virginica" 124 | 7.7,2.8,6.7,2,"Virginica" 125 | 6.3,2.7,4.9,1.8,"Virginica" 126 | 6.7,3.3,5.7,2.1,"Virginica" 127 | 7.2,3.2,6,1.8,"Virginica" 128 | 6.2,2.8,4.8,1.8,"Virginica" 129 | 6.1,3,4.9,1.8,"Virginica" 130 | 6.4,2.8,5.6,2.1,"Virginica" 131 | 7.2,3,5.8,1.6,"Virginica" 132 | 7.4,2.8,6.1,1.9,"Virginica" 133 | 7.9,3.8,6.4,2,"Virginica" 134 | 6.4,2.8,5.6,2.2,"Virginica" 135 | 6.3,2.8,5.1,1.5,"Virginica" 136 | 6.1,2.6,5.6,1.4,"Virginica" 137 | 7.7,3,6.1,2.3,"Virginica" 138 | 6.3,3.4,5.6,2.4,"Virginica" 139 | 6.4,3.1,5.5,1.8,"Virginica" 140 | 6,3,4.8,1.8,"Virginica" 141 | 6.9,3.1,5.4,2.1,"Virginica" 142 | 6.7,3.1,5.6,2.4,"Virginica" 143 | 6.9,3.1,5.1,2.3,"Virginica" 144 | 5.8,2.7,5.1,1.9,"Virginica" 145 | 6.8,3.2,5.9,2.3,"Virginica" 146 | 6.7,3.3,5.7,2.5,"Virginica" 147 | 6.7,3,5.2,2.3,"Virginica" 148 | 6.3,2.5,5,1.9,"Virginica" 149 | 6.5,3,5.2,2,"Virginica" 150 | 6.2,3.4,5.4,2.3,"Virginica" 151 | 5.9,3,5.1,1.8,"Virginica" -------------------------------------------------------------------------------- /D7-GMM/D7-Gaussian-mixture-model.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "attachments": { 5 | "b11da248-8866-48db-85c7-d6216be795f7.png": { 6 | "image/png": "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oLi4+Lbbbnvssce6urri8fiQIUP+9V//VSeX1umRNVDbt29/++23m5ubLcvyDYFHjhx5/fXX33jjjfXr1+uoJN92q5NUp6en33fffa+++urx48d13oyNGzfedNNN2dnZWgZNLSUZCoUOHjz429/+dsCAAb6wfklAvoQX1T/+aDSqQa6qqsrMzCwsLDzXW9IA6jmTP6DouAvtIeUXitb9QedM9rUI+u1chnHM54pDcPyVhYB2/9y7d++GDRt0VoDTZn5+Z/7hV6450m0FNjXh4Rnbfvrl5ts2Rf7PmY3/y8jqH81p+5fxZS+sqthjohOIiwgZdq0EHAfyHEjXlcJ0RTuw6oT8j2l5/23agf9jYUufCdV9D+CV3Xh4Us7gJXkldSGT44M7bfsSkq7vFxMOh995551bb711z549ms904jRNisuXL7/uuuv69Olz/fXXv/rqq5999tmbb7751ltvvf322/369Vu7dq2vsRw/fvw//dM/LVy4UGuGFy1a9Dd/8zeapzWda/1kfn7+W2+9dezYMT/35+bNm5988sk+ffr8x3/8x4ABA0aOHDlw4MDPPvts2LBh77///htvvPHUU0/94z/+Y58+fd577714PK5bS09Pv/nmm7Ozs/WD6BFBy1WhUGjFihU33HBDWlqa/kVdWePFRblbPalKLcOuq2ada+MaQJ3AROvqdQt+CkCNua+403v9gUyT7mnj3bneQ3B8gMC5IqD1duFw2PcnSB0oUgUMv6/+YCvXFunanO9xv4X5dRh6FP2b8P/Orv9vU47dmRm/fU7p0/NyCkMyDESMMJQFIw7hnhvpChVO2D3AwsrOHw+Yc8Oyij8U4W++Krk3x5kZwYLj2F4narsRFSTpxqHilIrjXLvTxTlej5VaoJw1a9bf//3fv/32277UrvtfPB6fOXPm9ddff9tttz3++OP33Xff9ddff+utt95999233377r3/966lTp2rHBMuypk6d+sILL3R2dupGamtr//jHP6anp/tCj5aSd+7c+cYbb2iBVbP73Llzb7rppj/84Q99+/Z95JFH7rnnngceeODRRx+9//7777jjjptvvvmOO+742c9+duONNy5btswPv9u4ceOvfvWrzMxM30FRR5TG4/FoNPrQQw/94he/aG1t1eKX7yN2cbC7ElrxXZ80yH4V3nO9d/1+/Y7hv83TZN8z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" 7 | }, 8 | "f7a898b0-b393-418b-a4e9-f05a773fb32a.png": { 9 | "image/png": "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" 10 | } 11 | }, 12 | "cell_type": "markdown", 13 | "id": "obvious-store", 14 | "metadata": {}, 15 | "source": [ 16 | "## GAUSSIAN MIXTURE MODELS are basically composed of Expectation and Maximization step\n", 17 | "### 1. Expectation Step in Multivariate Case\n", 18 | "![image.png](attachment:b11da248-8866-48db-85c7-d6216be795f7.png)\n", 19 | "\n", 20 | "### 2. Expectation Step in Single Varibale Case\n", 21 | "![image.png](attachment:f7a898b0-b393-418b-a4e9-f05a773fb32a.png)" 22 | ] 23 | }, 24 | { 25 | "cell_type": "markdown", 26 | "id": "stuffed-documentary", 27 | "metadata": {}, 28 | "source": [ 29 | "The only diffrence Between One and Multi Dimension data for GMM is instead of Variance\n", 30 | "\n", 31 | "We capture Covariance\n", 32 | "\n", 33 | "To learn what is Covariance [here](https://www.youtube.com/watch?v=WBlnwvjfMtQ)" 34 | ] 35 | }, 36 | { 37 | "cell_type": "code", 38 | "execution_count": 161, 39 | "id": "impossible-recipient", 40 | "metadata": {}, 41 | "outputs": [ 42 | { 43 | "name": "stdout", 44 | "output_type": "stream", 45 | "text": [ 46 | "Dataset shape: (300,)\n", 47 | "initially [-5.29908696 -4.88724168 -2.25448289] [0.78700799 0.3781514 0.54445358] \n", 48 | "\n" 49 | ] 50 | } 51 | ], 52 | "source": [ 53 | "class GMM():\n", 54 | " \n", 55 | " def __init__(self,data,k,epochs,eps=1e-8):\n", 56 | " # data\n", 57 | " self.X=data\n", 58 | " # number of clusters \n", 59 | " self.k=k\n", 60 | " # list of likelihood\n", 61 | " self.likelihood =[]\n", 62 | " # expectation\n", 63 | " self.b =[]\n", 64 | " # epsilon\n", 65 | " self.eps=eps\n", 66 | " #epochs\n", 67 | " self.epochs=epochs\n", 68 | " \n", 69 | " \n", 70 | " def prob_density_function(self,data, mean, variance):\n", 71 | " # A normal continuous random variable.\n", 72 | " s1 = 1/(np.sqrt(2*np.pi*variance))\n", 73 | " s2 = np.exp(-(np.square(data - mean)/(2*variance)))\n", 74 | " return s1 * s2\n", 75 | " \n", 76 | " def fit(self): \n", 77 | " \n", 78 | " weights = np.ones((self.k)) / self.k # ones array of each weight 1/k (here 1/3)\n", 79 | " means = np.random.choice(self.X, self.k)\n", 80 | " variances = np.random.random_sample(size=self.k)\n", 81 | " self.X=np.array(self.X)\n", 82 | " print(\"initially \",means,variances,\"\\n\")\n", 83 | " \n", 84 | " ls_mean=[]\n", 85 | " ls_variance=[]\n", 86 | " # iterating throught the data\n", 87 | " for i in range(self.epochs):\n", 88 | " \n", 89 | " # calculate the maximum likelihood of each observation xi\n", 90 | " self.likelihood = []\n", 91 | " # Expectation step\n", 92 | " for j in range(self.k):\n", 93 | " self.likelihood.append(self.prob_density_function(self.X, means[j], np.sqrt(variances[j])))\n", 94 | " self.likelihood = np.array(self.likelihood)\n", 95 | " \n", 96 | " self.b = []\n", 97 | " \n", 98 | " \n", 99 | " # Maximization step \n", 100 | " for j in range(self.k):\n", 101 | " \n", 102 | " # use the current values for the parameters to evaluate the posterior\n", 103 | " # probabilities of the data to have been generanted by each gaussian \n", 104 | " self.b.append((self.likelihood[j] * weights[j]) / (np.sum([self.likelihood[i] * weights[i] for i in range(self.k)], axis=0)+self.eps))\n", 105 | "\n", 106 | " # updage mean and variance\n", 107 | " means[j] = np.sum(self.b[j] * self.X) / (np.sum(self.b[j]+self.eps))\n", 108 | " variances[j] = np.sum(self.b[j] * np.square(self.X - means[j])) / (np.sum(self.b[j]+self.eps))\n", 109 | "\n", 110 | " # update the weights\n", 111 | " weights[j] = np.mean(self.b[j])\n", 112 | " # storing means for each iteration \n", 113 | " ls_mean.append(means.tolist())\n", 114 | " # storing variance for each iteration \n", 115 | " ls_variance.append(variances.tolist())\n", 116 | "# print(f'after {i} epochs means is {means} and variance is {variances}')\n", 117 | " return ls_mean,ls_variance\n", 118 | "# print(f'after {i} epochs means is {means} and variance is {variances}')\n", 119 | "\n", 120 | "\n", 121 | " \n", 122 | " \n", 123 | "## Generating my own 1d data\n", 124 | "n_samples =100\n", 125 | "\n", 126 | "# mu --> mean and sigma ---> standard deviation\n", 127 | "\n", 128 | "# define the number of points\n", 129 | "n_samples = 100\n", 130 | "mu1, sigma1 = -5, 1.2 # mean and variance\n", 131 | "mu2, sigma2 = 5, 1.8 # mean and variance\n", 132 | "mu3, sigma3 = 0, 1.6 # mean and variance\n", 133 | "\n", 134 | "x1 = np.random.normal(mu1, np.sqrt(sigma1), n_samples)\n", 135 | "x2 = np.random.normal(mu2, np.sqrt(sigma2), n_samples)\n", 136 | "x3 = np.random.normal(mu3, np.sqrt(sigma3), n_samples)\n", 137 | "\n", 138 | "X = np.array(list(x1) + list(x2) + list(x3))\n", 139 | "np.random.shuffle(X)\n", 140 | "print(\"Dataset shape:\", X.shape)\n", 141 | "\n", 142 | "gaussain = GMM(data=X,k=3,epochs=15,eps=1e-7)\n", 143 | "mean,variance = gaussain.fit()\n", 144 | " \n", 145 | " " 146 | ] 147 | }, 148 | { 149 | "cell_type": "code", 150 | "execution_count": 162, 151 | "id": "known-withdrawal", 152 | "metadata": {}, 153 | "outputs": [ 154 | { 155 | "data": { 156 | "text/plain": [ 157 | "[[-5.447911687806895, -4.951896946876751, -0.5550162097775722],\n", 158 | " [-5.391387238156239, -4.852843508515019, 1.5730825573084812],\n", 159 | " [-5.303079891428191, -4.648157774798244, 2.5189544997806244],\n", 160 | " [-5.265546765946115, -4.390236896785014, 2.697618361752606],\n", 161 | " [-5.322051025897019, -4.119717090722412, 2.835451824440251],\n", 162 | " [-5.428595347859782, -3.8018603055540767, 2.9787518465034166],\n", 163 | " [-5.519339495708541, -3.419554700391987, 3.1583608286991893],\n", 164 | " [-5.547176671221818, -2.973874323953654, 3.3937667105372413],\n", 165 | " [-5.504520343889167, -2.4791721712158856, 3.67729030856226],\n", 166 | " [-5.409892953408194, -1.9426131815331689, 3.984337580974629],\n", 167 | " [-5.293001175054609, -1.3931250711594054, 4.314744514749055],\n", 168 | " [-5.1851869896880185, -0.9321227155425464, 4.635336386158243],\n", 169 | " [-5.102586930070997, -0.6256510057762783, 4.876354196388706],\n", 170 | " [-5.043216069762877, -0.434073681206713, 5.033373234897915],\n", 171 | " [-5.002003982042112, -0.31250361535637, 5.132054434612007]]" 172 | ] 173 | }, 174 | "execution_count": 162, 175 | "metadata": {}, 176 | "output_type": "execute_result" 177 | } 178 | ], 179 | "source": [ 180 | "mean" 181 | ] 182 | }, 183 | { 184 | "cell_type": "markdown", 185 | "id": "protective-scheduling", 186 | "metadata": {}, 187 | "source": [ 188 | "### choose iteration number \n", 189 | "\n", 190 | "1. select to see gaussian mixture working\n", 191 | " 1. First select iteratio number =0\n", 192 | " \n", 193 | " and then select iteration number =14 (last epoch) ( This will be a fitted graph)" 194 | ] 195 | }, 196 | { 197 | "cell_type": "code", 198 | "execution_count": 163, 199 | "id": "ceramic-headline", 200 | "metadata": {}, 201 | "outputs": [ 202 | { 203 | "data": { 204 | "text/plain": [ 205 | "[]" 206 | ] 207 | }, 208 | "execution_count": 163, 209 | "metadata": {}, 210 | "output_type": "execute_result" 211 | }, 212 | { 213 | "data": { 214 | "image/png": "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\n", 215 | "text/plain": [ 216 | "
" 217 | ] 218 | }, 219 | "metadata": { 220 | "needs_background": "light" 221 | }, 222 | "output_type": "display_data" 223 | } 224 | ], 225 | "source": [ 226 | "\n", 227 | "iteration_no=0\n", 228 | "\n", 229 | "# Graph at begining\n", 230 | "bins = np.linspace(np.min(X),np.max(X),100)\n", 231 | "\n", 232 | "plt.figure(figsize=(10,7))\n", 233 | "plt.xlabel(\"$x$\")\n", 234 | "plt.ylabel(\"pdf\")\n", 235 | "plt.scatter(X, [0.005] * len(X), color='navy', s=30, marker=2, label=\"Train data\")\n", 236 | "\n", 237 | "plt.plot(bins, gaussain.prob_density_function(bins, mu1,sigma1), color='red', label=\"True pdf\")\n", 238 | "plt.plot(bins, gaussain.prob_density_function(bins, mu2, sigma2), color='red')\n", 239 | "plt.plot(bins, gaussain.prob_density_function(bins,mu3 , sigma3), color='red')\n", 240 | "\n", 241 | "\n", 242 | "plt.plot(bins, gaussain.prob_density_function(bins, mean[iteration_no][0],variance[iteration_no][0] ), color='magenta', label=\"Cluster 1\")\n", 243 | "plt.plot(bins, gaussain.prob_density_function(bins, mean[iteration_no][1], variance[iteration_no][1]), color='green',label='Cluster 2')\n", 244 | "plt.plot(bins, gaussain.prob_density_function(bins, mean[iteration_no][2] , variance[iteration_no][2]), color='blue',label='Cluster 3')\n", 245 | "\n", 246 | "\n", 247 | "plt.legend()\n", 248 | "plt.plot()" 249 | ] 250 | }, 251 | { 252 | "cell_type": "markdown", 253 | "id": "major-register", 254 | "metadata": {}, 255 | "source": [ 256 | "##### Below is code which does not follow oops" 257 | ] 258 | }, 259 | { 260 | "cell_type": "code", 261 | "execution_count": 164, 262 | "id": "determined-lawsuit", 263 | "metadata": {}, 264 | "outputs": [], 265 | "source": [ 266 | "\n", 267 | "# def prob_density_function(data, mean, variance):\n", 268 | "# # A normal continuous random variable.\n", 269 | "# s1 = 1/(np.sqrt(2*np.pi*variance))\n", 270 | "# s2 = np.exp(-(np.square(data - mean)/(2*variance)))\n", 271 | "# return s1 * s2\n" 272 | ] 273 | }, 274 | { 275 | "cell_type": "code", 276 | "execution_count": 170, 277 | "id": "turned-charm", 278 | "metadata": {}, 279 | "outputs": [], 280 | "source": [ 281 | "# import numpy as np\n", 282 | "# import pandas as pd\n", 283 | "# import math\n", 284 | "# import matplotlib.pyplot as plt\n", 285 | "\n", 286 | "# ## Generating my own 1d data\n", 287 | "# n_samples =100\n", 288 | "\n", 289 | "# # mu --> mean and sigma ---> standard deviation\n", 290 | "\n", 291 | "# # define the number of points\n", 292 | "# n_samples = 100\n", 293 | "# mu1, sigma1 = -4, 1.2 # mean and variance\n", 294 | "# mu2, sigma2 = 4, 1.8 # mean and variance\n", 295 | "# mu3, sigma3 = 0, 1.6 # mean and variance\n", 296 | "\n", 297 | "# x1 = np.random.normal(mu1, np.sqrt(sigma1), n_samples)\n", 298 | "# x2 = np.random.normal(mu2, np.sqrt(sigma2), n_samples)\n", 299 | "# x3 = np.random.normal(mu3, np.sqrt(sigma3), n_samples)\n", 300 | "\n", 301 | "# X = np.array(list(x1) + list(x2) + list(x3))\n", 302 | "# np.random.shuffle(X)\n", 303 | "# print(\"Dataset shape:\", X.shape)" 304 | ] 305 | }, 306 | { 307 | "cell_type": "code", 308 | "execution_count": 171, 309 | "id": "large-midnight", 310 | "metadata": {}, 311 | "outputs": [], 312 | "source": [ 313 | "# # visualize the training data\n", 314 | "\n", 315 | "\n", 316 | "# bins = np.linspace(np.min(X),np.max(X),100)\n", 317 | "\n", 318 | "# plt.figure(figsize=(10,7))\n", 319 | "# plt.xlabel(\"$x$\")\n", 320 | "# plt.ylabel(\"pdf\")\n", 321 | "# plt.scatter(X, [0.005] * len(X), color='navy', s=30, marker=2, label=\"Train data\")\n", 322 | "\n", 323 | "# plt.plot(bins, prob_density_function(bins, mu1, sigma1), color='red', label=\"True pdf\")\n", 324 | "# plt.plot(bins, prob_density_function(bins, mu2, sigma2), color='red')\n", 325 | "# plt.plot(bins, prob_density_function(bins, mu3, sigma3), color='red')\n", 326 | "\n", 327 | "# plt.legend()\n", 328 | "# plt.plot()" 329 | ] 330 | }, 331 | { 332 | "cell_type": "code", 333 | "execution_count": 172, 334 | "id": "furnished-database", 335 | "metadata": {}, 336 | "outputs": [], 337 | "source": [ 338 | "# # define the number of clusters to be learned\n", 339 | "# k = 3\n", 340 | "# weights = np.ones((k)) / k\n", 341 | "# means = np.random.choice(X, k)\n", 342 | "# variances = np.random.random_sample(size=k)\n", 343 | "# print(means, variances)" 344 | ] 345 | }, 346 | { 347 | "cell_type": "code", 348 | "execution_count": 173, 349 | "id": "computational-dynamics", 350 | "metadata": {}, 351 | "outputs": [], 352 | "source": [ 353 | "# X = np.array(X)" 354 | ] 355 | }, 356 | { 357 | "cell_type": "code", 358 | "execution_count": 174, 359 | "id": "built-italian", 360 | "metadata": {}, 361 | "outputs": [], 362 | "source": [ 363 | "# eps=1e-8\n", 364 | "# for step in range(20):\n", 365 | " \n", 366 | "# if step % 5 == 0:\n", 367 | " \n", 368 | "# plt.figure(figsize=(10,6))\n", 369 | "# axes = plt.gca()\n", 370 | "# plt.xlabel(\"$x$\")\n", 371 | "# plt.ylabel(\"pdf\")\n", 372 | "# plt.title(\"Iteration {}\".format(step))\n", 373 | "# plt.scatter(X, [0.005] * len(X), color='navy', s=30, marker=2, label=\"Train data\")\n", 374 | "\n", 375 | "# plt.plot(bins, prob_density_function(bins, mu1, sigma1), color='grey', label=\"True pdf\")\n", 376 | "# plt.plot(bins, prob_density_function(bins, mu2, sigma2), color='grey')\n", 377 | "# plt.plot(bins, prob_density_function(bins, mu3, sigma3), color='grey')\n", 378 | "\n", 379 | "# plt.plot(bins, prob_density_function(bins, means[0], variances[0]), color='blue', label=\"Cluster 1\")\n", 380 | "# plt.plot(bins, prob_density_function(bins, means[1], variances[1]), color='green', label=\"Cluster 2\")\n", 381 | "# plt.plot(bins, prob_density_function(bins, means[2], variances[2]), color='magenta', label=\"Cluster 3\")\n", 382 | "\n", 383 | "# plt.legend(loc='upper left')\n", 384 | "\n", 385 | "\n", 386 | "# plt.show()\n", 387 | " \n", 388 | "# # calculate the maximum likelihood of each observation xi\n", 389 | "# likelihood = []\n", 390 | "# # Expectation step\n", 391 | "# for j in range(k):\n", 392 | "# likelihood.append(prob_density_function(X, means[j], np.sqrt(variances[j])))\n", 393 | "# likelihood = np.array(likelihood)\n", 394 | " \n", 395 | "# b = []\n", 396 | "# # Maximization step \n", 397 | "# for j in range(k):\n", 398 | " \n", 399 | "# # use the current values for the parameters to evaluate the posterior\n", 400 | "# # probabilities of the data to have been generanted by each gaussian \n", 401 | "# b.append((likelihood[j] * weights[j]) / (np.sum([likelihood[i] * weights[i] for i in range(k)], axis=0)+eps))\n", 402 | " \n", 403 | "# # updage mean and variance\n", 404 | "# means[j] = np.sum(b[j] * X) / (np.sum(b[j]+eps))\n", 405 | "# variances[j] = np.sum(b[j] * np.square(X - means[j])) / (np.sum(b[j]+eps))\n", 406 | "\n", 407 | "# # update the weights\n", 408 | "# weights[j] = np.mean(b[j])" 409 | ] 410 | }, 411 | { 412 | "cell_type": "code", 413 | "execution_count": 140, 414 | "id": "tracked-syntax", 415 | "metadata": {}, 416 | "outputs": [], 417 | "source": [] 418 | }, 419 | { 420 | "cell_type": "code", 421 | "execution_count": null, 422 | "id": "ethical-applicant", 423 | "metadata": {}, 424 | "outputs": [], 425 | "source": [] 426 | }, 427 | { 428 | "cell_type": "markdown", 429 | "id": "multiple-conditions", 430 | "metadata": {}, 431 | "source": [] 432 | }, 433 | { 434 | "cell_type": "code", 435 | "execution_count": null, 436 | "id": "female-reform", 437 | "metadata": {}, 438 | "outputs": [], 439 | "source": [] 440 | }, 441 | { 442 | "cell_type": "code", 443 | "execution_count": null, 444 | "id": "comic-navigator", 445 | "metadata": {}, 446 | "outputs": [], 447 | "source": [] 448 | } 449 | ], 450 | "metadata": { 451 | "kernelspec": { 452 | "display_name": "Python 3.8.5 64-bit", 453 | "language": "python", 454 | "name": "python385jvsc74a57bd0916dbcbb3f70747c44a77c7bcd40155683ae19c65e1c03b4aa3499c5328201f1" 455 | }, 456 | "language_info": { 457 | "codemirror_mode": { 458 | "name": "ipython", 459 | "version": 3 460 | }, 461 | "file_extension": ".py", 462 | "mimetype": "text/x-python", 463 | "name": "python", 464 | "nbconvert_exporter": "python", 465 | "pygments_lexer": "ipython3", 466 | "version": "3.8.5" 467 | } 468 | }, 469 | "nbformat": 4, 470 | "nbformat_minor": 5 471 | } 472 | -------------------------------------------------------------------------------- /D9-10/Multilayer-perceptron.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 185, 6 | "id": "fitted-currency", 7 | "metadata": {}, 8 | "outputs": [], 9 | "source": [ 10 | "## Loading data and importing libraries\n", 11 | "import numpy as np\n", 12 | "import pandas as pd\n", 13 | "from sklearn.datasets import load_iris\n", 14 | "from sklearn import datasets" 15 | ] 16 | }, 17 | { 18 | "cell_type": "code", 19 | "execution_count": 193, 20 | "id": "organic-washington", 21 | "metadata": {}, 22 | "outputs": [], 23 | "source": [ 24 | "class MLP(): # Multilayer Perceptron\n", 25 | " def __init__(self,epochs,lr):\n", 26 | " self.learning_rate = lr\n", 27 | " self.epochs=epochs\n", 28 | " def sigmoid(self,x):\n", 29 | " return 1/(1+np.exp(-x)) \n", 30 | " def der_sigmoid(self,x):\n", 31 | " return self.sigmoid(x)*(1-self.sigmoid(x))\n", 32 | " def fit(self,features,labels):\n", 33 | " weights_layer1 = np.random.rand(features.shape[1],features.shape[1]*2) # weight's shape (2,4) \n", 34 | " weights_layer2 = np.random.rand(features.shape[1]*2,6) # weights for hidden layer1 to hidden layer 2\n", 35 | " weights_layer3 = np.random.rand(6,1) # hidden layer having 6 neurons and going to 1 neuron for output\n", 36 | " for i in range(self.epochs):\n", 37 | " ls=[]\n", 38 | " # feedforward\n", 39 | " \n", 40 | " # layer 1 --> layer 2 ( 2 input neurons to 4 neurons in hidden layer1)\n", 41 | " z1 = np.dot(features, weights_layer1)\n", 42 | " a1 = self.sigmoid(z1)\n", 43 | " \n", 44 | " # layer 2 ---> layer 3 ( 4 neurons in hidden layer 1 to 6 neurons in hidden layer 2 )\n", 45 | " z2 = np.dot(a1, weights_layer2)\n", 46 | " a2 = self.sigmoid(z2)\n", 47 | " \n", 48 | " # layer 3 --> output layer ( 6 neurons in hidden layer 2 to 1 neuron in output layer)\n", 49 | " z3 = np.dot(a2,weights_layer3)\n", 50 | " a3 = self.sigmoid(z3)\n", 51 | " ls.append(a3)\n", 52 | " # backpropagation\n", 53 | " labels = labels.reshape(-1,1)\n", 54 | " # Phase 1 # Updating weights of hidden layer 2 (hidden layer2 to output layer)\n", 55 | " error_out = ((1 / 2) * (np.power((a3 - labels), 2)))\n", 56 | " dcost_dao = 2*(a3 - labels) # derivative of cost wrt ao\n", 57 | " dao_dzo = self.der_sigmoid(z3) # derivative of ao wrt to zo\n", 58 | " dzo_dwo = a2 # derivative of zo wrt w_3\n", 59 | " \n", 60 | " dcost_weight_output_layer = np.dot(dzo_dwo.T, dcost_dao * dao_dzo)\n", 61 | " weights_layer3 -= self.learning_rate * dcost_weight_output_layer\n", 62 | " \n", 63 | " # Phase 2 # Updating weights of hidden layer 1 ( hidden layer1 to hidden layer 2 )\n", 64 | " #dcost_dw2 = dcost_da2 * da2_dz2 * dz2_dw2\n", 65 | " # Breaking -------> dcost_da2\n", 66 | " # dcost_da2 = dcost_dao *dao_dzo *dzo_da2 \n", 67 | " \n", 68 | " #Final quation\n", 69 | " # dcost_dw2 = (dcost_dao *dao_dzo) * (dzo_da2 .T * da2_dz2 .T ) * (dz2_dw2) === > (part1) * (part2) *(dz2_dw2)\n", 70 | " \n", 71 | " dzo_da2 = weights_layer3.T # 1,6\n", 72 | " \n", 73 | " da2_dz2 = self.der_sigmoid(z2).T # 6,100\n", 74 | " dz2_dw2 = a1 #100,4\n", 75 | " part1 = np.dot(dcost_dao.T,dao_dzo) #1 , 1 \n", 76 | " \n", 77 | " part2 = np.dot(dzo_da2,da2_dz2) # 1,100\n", 78 | "\n", 79 | " temp = np.dot(part1,part2) # 1,100\n", 80 | " dcost_dw2=np.dot(temp,dz2_dw2).T \n", 81 | " weights_layer2 -= self.learning_rate * dcost_dw2\n", 82 | " \n", 83 | " # Phase 3 # Updating weights of Input layer ( input layer to hidden layer1 )\n", 84 | " \n", 85 | " # dcost_dw1 = dcost_a1 * da1_dz1 * dz1_dw1\n", 86 | "\n", 87 | " # Breaking ---> dcost_da1 = dcost_dzo * dzo_da1 ( means dcost_da1 consists of 2 parts )= part1 * part2\n", 88 | " # Breaking part1 ---> dcost_dzo = dcost_dao * dao_dzo \n", 89 | " # Breaking part2 ----> dzo_da1 = dzo_da2 * da2_dz2 * dz2_da1 \n", 90 | " # part1 is already calculated above ( dcost_dzo = dcost_dao * dao_dzo ) # 1,1\n", 91 | " dzo_da2 = weights_layer3.T # 1,6\n", 92 | " \n", 93 | "# # da2_dz2 already calulate above # 6,100\n", 94 | "# print(\"da2_dz2\",da2_dz2.shape)\n", 95 | " dz2_da1 = weights_layer2.T # 6,4\n", 96 | " part2 = np.dot(dzo_da2,dz2_da1)\n", 97 | " \n", 98 | " temp= np.dot(part1,part2)\n", 99 | " \n", 100 | " da1_dz1 = self.der_sigmoid(z1).T # 4,100\n", 101 | " \n", 102 | " dz1_dw1 = features # 100,2\n", 103 | " \n", 104 | " part3 = np.dot(da1_dz1,dz1_dw1)\n", 105 | " \n", 106 | " dcost_dw1 = np.dot(temp,part3).T # (2,1)\n", 107 | " # final eq\n", 108 | " weights_layer1 -= self.learning_rate * dcost_dw1\n", 109 | " return ls # predictions\n", 110 | " \n", 111 | " " 112 | ] 113 | }, 114 | { 115 | "cell_type": "code", 116 | "execution_count": 194, 117 | "id": "annual-extension", 118 | "metadata": {}, 119 | "outputs": [ 120 | { 121 | "name": "stderr", 122 | "output_type": "stream", 123 | "text": [ 124 | ":6: RuntimeWarning: overflow encountered in exp\n", 125 | " return 1/(1+np.exp(-x))\n" 126 | ] 127 | }, 128 | { 129 | "data": { 130 | "text/plain": [ 131 | "[array([[4.81937919e-13],\n", 132 | " [4.81937919e-13],\n", 133 | " [4.81937919e-13],\n", 134 | " [4.81937919e-13],\n", 135 | " [4.81937919e-13],\n", 136 | " [4.81937919e-13],\n", 137 | " [4.81937919e-13],\n", 138 | " [6.94217005e-07],\n", 139 | " [4.81937919e-13],\n", 140 | " [4.81937919e-13],\n", 141 | " [4.81937919e-13],\n", 142 | " [4.81937919e-13],\n", 143 | " [4.81937919e-13],\n", 144 | " [4.81937919e-13],\n", 145 | " [4.81937919e-13],\n", 146 | " [6.94217005e-07],\n", 147 | " [4.81937919e-13],\n", 148 | " [4.81937919e-13],\n", 149 | " [4.81937919e-13],\n", 150 | " [4.81937919e-13],\n", 151 | " [4.81937919e-13],\n", 152 | " [6.94217005e-07],\n", 153 | " [4.81937919e-13],\n", 154 | " [4.81937919e-13],\n", 155 | " [4.81937919e-13],\n", 156 | " [4.81937919e-13],\n", 157 | " [4.81937919e-13],\n", 158 | " [6.94217005e-07],\n", 159 | " [4.81937919e-13],\n", 160 | " [6.94217005e-07],\n", 161 | " [4.81937919e-13],\n", 162 | " [4.81937919e-13],\n", 163 | " [4.81937919e-13],\n", 164 | " [4.81937919e-13],\n", 165 | " [4.81937919e-13],\n", 166 | " [4.81937919e-13],\n", 167 | " [4.81937919e-13],\n", 168 | " [4.81937919e-13],\n", 169 | " [6.94217005e-07],\n", 170 | " [4.81937919e-13],\n", 171 | " [4.81937919e-13],\n", 172 | " [4.81937919e-13],\n", 173 | " [4.81937919e-13],\n", 174 | " [4.81937919e-13],\n", 175 | " [4.81937919e-13],\n", 176 | " [4.81937919e-13],\n", 177 | " [6.94217005e-07],\n", 178 | " [4.81937919e-13],\n", 179 | " [4.81937919e-13],\n", 180 | " [4.81937919e-13],\n", 181 | " [4.81937919e-13],\n", 182 | " [4.81937919e-13],\n", 183 | " [4.81937919e-13],\n", 184 | " [4.81937919e-13],\n", 185 | " [4.81937919e-13],\n", 186 | " [4.81937919e-13],\n", 187 | " [6.94217005e-07],\n", 188 | " [4.81937919e-13],\n", 189 | " [4.81937919e-13],\n", 190 | " [4.81937919e-13],\n", 191 | " [4.81937919e-13],\n", 192 | " [4.81937919e-13],\n", 193 | " [4.81937919e-13],\n", 194 | " [4.81937919e-13],\n", 195 | " [4.81937919e-13],\n", 196 | " [6.94217005e-07],\n", 197 | " [4.81937919e-13],\n", 198 | " [4.81937919e-13],\n", 199 | " [4.81937919e-13],\n", 200 | " [4.81937919e-13],\n", 201 | " [4.81937919e-13],\n", 202 | " [4.81937919e-13],\n", 203 | " [6.94217005e-07],\n", 204 | " [6.94217005e-07],\n", 205 | " [4.81937919e-13],\n", 206 | " [4.81937919e-13],\n", 207 | " [4.81937919e-13],\n", 208 | " [4.81937919e-13],\n", 209 | " [4.81937919e-13],\n", 210 | " [6.94217005e-07],\n", 211 | " [4.81937919e-13],\n", 212 | " [4.81937919e-13],\n", 213 | " [4.81937919e-13],\n", 214 | " [6.94217005e-07],\n", 215 | " [6.94217005e-07],\n", 216 | " [4.81937919e-13],\n", 217 | " [4.81937919e-13],\n", 218 | " [4.81937919e-13],\n", 219 | " [4.81937919e-13],\n", 220 | " [4.81937919e-13],\n", 221 | " [6.94217005e-07],\n", 222 | " [4.81937919e-13],\n", 223 | " [4.81937919e-13],\n", 224 | " [6.94217005e-07],\n", 225 | " [4.81937919e-13],\n", 226 | " [4.81937919e-13],\n", 227 | " [4.81937919e-13],\n", 228 | " [6.94217005e-07],\n", 229 | " [6.94217005e-07],\n", 230 | " [4.81937919e-13]])]" 231 | ] 232 | }, 233 | "execution_count": 194, 234 | "metadata": {}, 235 | "output_type": "execute_result" 236 | } 237 | ], 238 | "source": [ 239 | "s =MLP(2000,0.9)\n", 240 | "features,target = datasets.make_moons(100, noise=0.25)\n", 241 | "prediction=s.fit(features,target)\n", 242 | "prediction" 243 | ] 244 | } 245 | ], 246 | "metadata": { 247 | "kernelspec": { 248 | "display_name": "Python 3.8.5 64-bit", 249 | "language": "python", 250 | "name": "python385jvsc74a57bd0916dbcbb3f70747c44a77c7bcd40155683ae19c65e1c03b4aa3499c5328201f1" 251 | }, 252 | "language_info": { 253 | "codemirror_mode": { 254 | "name": "ipython", 255 | "version": 3 256 | }, 257 | "file_extension": ".py", 258 | "mimetype": "text/x-python", 259 | "name": "python", 260 | "nbconvert_exporter": "python", 261 | "pygments_lexer": "ipython3", 262 | "version": "3.8.5" 263 | } 264 | }, 265 | "nbformat": 4, 266 | "nbformat_minor": 5 267 | } 268 | -------------------------------------------------------------------------------- /Output-images/D1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahibpreetsingh12/100daysofmlcode/940c4b039ac1657cb2b48e0cd7ab351c67b0b198/Output-images/D1.png -------------------------------------------------------------------------------- /Output-images/D11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahibpreetsingh12/100daysofmlcode/940c4b039ac1657cb2b48e0cd7ab351c67b0b198/Output-images/D11.png -------------------------------------------------------------------------------- /Output-images/D12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahibpreetsingh12/100daysofmlcode/940c4b039ac1657cb2b48e0cd7ab351c67b0b198/Output-images/D12.png -------------------------------------------------------------------------------- /Output-images/D13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahibpreetsingh12/100daysofmlcode/940c4b039ac1657cb2b48e0cd7ab351c67b0b198/Output-images/D13.png -------------------------------------------------------------------------------- /Output-images/D14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahibpreetsingh12/100daysofmlcode/940c4b039ac1657cb2b48e0cd7ab351c67b0b198/Output-images/D14.png -------------------------------------------------------------------------------- /Output-images/D16-cnn-basics.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahibpreetsingh12/100daysofmlcode/940c4b039ac1657cb2b48e0cd7ab351c67b0b198/Output-images/D16-cnn-basics.png -------------------------------------------------------------------------------- /Output-images/D2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahibpreetsingh12/100daysofmlcode/940c4b039ac1657cb2b48e0cd7ab351c67b0b198/Output-images/D2.png -------------------------------------------------------------------------------- /Output-images/D3-rmsprop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahibpreetsingh12/100daysofmlcode/940c4b039ac1657cb2b48e0cd7ab351c67b0b198/Output-images/D3-rmsprop.png -------------------------------------------------------------------------------- /Output-images/D4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahibpreetsingh12/100daysofmlcode/940c4b039ac1657cb2b48e0cd7ab351c67b0b198/Output-images/D4.png -------------------------------------------------------------------------------- /Output-images/D5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahibpreetsingh12/100daysofmlcode/940c4b039ac1657cb2b48e0cd7ab351c67b0b198/Output-images/D5.png -------------------------------------------------------------------------------- /Output-images/D6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahibpreetsingh12/100daysofmlcode/940c4b039ac1657cb2b48e0cd7ab351c67b0b198/Output-images/D6.png -------------------------------------------------------------------------------- /Output-images/D7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahibpreetsingh12/100daysofmlcode/940c4b039ac1657cb2b48e0cd7ab351c67b0b198/Output-images/D7.png -------------------------------------------------------------------------------- /Output-images/D8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahibpreetsingh12/100daysofmlcode/940c4b039ac1657cb2b48e0cd7ab351c67b0b198/Output-images/D8.png -------------------------------------------------------------------------------- /Output-images/D9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahibpreetsingh12/100daysofmlcode/940c4b039ac1657cb2b48e0cd7ab351c67b0b198/Output-images/D9.png -------------------------------------------------------------------------------- /Output-images/d15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahibpreetsingh12/100daysofmlcode/940c4b039ac1657cb2b48e0cd7ab351c67b0b198/Output-images/d15.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 100daysofmlcode 2 | 3 | #### Day 11 4 | 5 | > Started learning SQL under #100daysofcode it's Day 1 of #8weeksqlchallenge 6 | --------------------------------------------------------------------------------