├── .gitignore ├── bimodal_example.csv └── IRIS Classification with GMM.ipynb /.gitignore: -------------------------------------------------------------------------------- 1 | # Project 2 | .ipynb_checkpoints 3 | 4 | # Python 5 | *.pyc 6 | 7 | 8 | -------------------------------------------------------------------------------- /bimodal_example.csv: -------------------------------------------------------------------------------- 1 | x 2 | 0.252851472 3 | -1.034562007 4 | 3.319558106 5 | 4.552363068 6 | -0.775994667 7 | 2.937873264 8 | 0.569945443 9 | 2.224869289 10 | 3.348944903 11 | 2.853570329 12 | 2.297581431 13 | 0.547961466 14 | 2.018261017 15 | 3.068131176 16 | 1.15231219 17 | 0.219459292 18 | 2.465655025 19 | 0.037637784 20 | 3.140001216 21 | 0.669892418 22 | 4.648751789 23 | -0.853002927 24 | -0.38345711 25 | 0.01806533 26 | -0.513325558 27 | 4.443086805 28 | 3.271462922 29 | 3.588714361 30 | 1.812535776 31 | 0.44893393 32 | 4.58539636 33 | 2.782744025 34 | 3.702400079 35 | 2.210021454 36 | 2.541170787 37 | 2.505654015 38 | 3.383577185 39 | 2.241496066 40 | 5.136333375 41 | 3.026996827 42 | 2.723790283 43 | 3.787105385 44 | 4.107203203 45 | 3.108508963 46 | -0.326544717 47 | 1.949356083 48 | 1.695866777 49 | 1.129910929 50 | 1.324487799 51 | -0.508412878 52 | 3.559899547 53 | 2.944526479 54 | 2.365391438 55 | -2.822876989 56 | -0.157141858 57 | 1.869571347 58 | -0.29604336 59 | 0.343715846 60 | 2.415834235 61 | 2.240754209 62 | -0.200165327 63 | 2.459341059 64 | 4.004447638 65 | 0.284228526 66 | 3.684524261 67 | 3.560917066 68 | 2.528741203 69 | -0.119928539 70 | 3.389403317 71 | 1.946072505 72 | 2.77075784 73 | -0.412113386 74 | 0.293753917 75 | 2.544798158 76 | 3.438346307 77 | 1.330114752 78 | 4.035044514 79 | 1.877561894 80 | 3.394259372 81 | 4.888690731 82 | 2.860191531 83 | -0.057095488 84 | 3.824106786 85 | 2.403762696 86 | 3.361454896 87 | -0.466080107 88 | 0.148557612 89 | 3.374388407 90 | -1.064233753 91 | -1.161258162 92 | -2.088670346 93 | -1.264098591 94 | 3.47298241 95 | 0.94936938 96 | 3.044411963 97 | -1.064411324 98 | 3.704321111 99 | 2.937206081 100 | 1.100277963 101 | 2.652242395 -------------------------------------------------------------------------------- /IRIS Classification with GMM.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [ 8 | { 9 | "name": "stdout", 10 | "output_type": "stream", 11 | "text": [ 12 | "Populating the interactive namespace from numpy and matplotlib\n" 13 | ] 14 | } 15 | ], 16 | "source": [ 17 | "%pylab inline\n", 18 | "import numpy as np\n", 19 | "import pandas as pd\n", 20 | "import seaborn as sbn\n", 21 | "\n", 22 | "from sklearn.datasets import load_iris\n", 23 | "from sklearn.mixture import GaussianMixture\n", 24 | "from sklearn.model_selection import StratifiedKFold" 25 | ] 26 | }, 27 | { 28 | "cell_type": "markdown", 29 | "metadata": {}, 30 | "source": [ 31 | "## Data" 32 | ] 33 | }, 34 | { 35 | "cell_type": "code", 36 | "execution_count": 7, 37 | "metadata": {}, 38 | "outputs": [ 39 | { 40 | "name": "stdout", 41 | "output_type": "stream", 42 | "text": [ 43 | "train_x: (120, 4)\n", 44 | "train_y: (120,)\n", 45 | "test_x: (30, 4)\n", 46 | "test_y: (30,)\n" 47 | ] 48 | } 49 | ], 50 | "source": [ 51 | "iris = load_iris()\n", 52 | "skf = StratifiedKFold(n_splits=5, shuffle=False, random_state=0)\n", 53 | "train_idx, test_idx = next(iter(skf.split(iris.data, iris.target)))\n", 54 | "\n", 55 | "train_x = iris.data[train_idx]\n", 56 | "train_y = iris.target[train_idx]\n", 57 | "test_x = iris.data[test_idx]\n", 58 | "test_y = iris.target[test_idx]\n", 59 | "\n", 60 | "n_classes = len(np.unique(iris.target))\n", 61 | "\n", 62 | "print('train_x:', train_x.shape)\n", 63 | "print('train_y:', train_y.shape)\n", 64 | "print('test_x:', test_x.shape)\n", 65 | "print('test_y:', test_y.shape)" 66 | ] 67 | }, 68 | { 69 | "cell_type": "code", 70 | "execution_count": 3, 71 | "metadata": {}, 72 | "outputs": [ 73 | { 74 | "data": { 75 | "image/png": "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\nfj4PPvggV1xxBbNnzz5j7OzsbMLDwxkzZgwAvr6+AGzZsoUHH3wQgJSUFGJjY3+W3Lds2cJnn30G\nwIwZM6itraWpqQmAhQsXWjyxg0ruiqI4mUWLFrFixQoqKipYvHgxRUVFPP744/zqV78647jCwkK8\nvLxOfR0QEEBWVhY//vgjr732GsuXL+ett96yerynx2BJqreMoihOZfHixXz88cesWLGCRYsWMWfO\nHN566y1aWloAKC0tparq5/db1tTUYDabueaaa3jmmWfYu3fvGc8nJydTXl7O7t27AWhubsZoNDJ5\n8mQ++OADAHJyciguLiY5OfmM155+zIYNGwgODj515m8t6sxdURTrsFPp4pAhQ2hubiYyMpLw8HDC\nw8M5cuQI48ePB8Db25v3338frVZ7xutKS0u5/fbbMZu7btn5y1/+csbzrq6ufPLJJzz44IO0t7fj\n4eHBmjVruO+++7j33ntJS0vDxcWFZcuW4ebmdsZrly5dyh133MGwYcPw9PS0SQ941fLXSaiWv4q9\nqZa/lqda/iqKoihnUMldURTFCankriiK4oRUclcURXFCKrkriqI4IZXcFUVRnJCqc1cUxSo+zfnU\nouMtSlrUq9eVlZXx61//+lTzr5666667ePjhh0lNTT3vMa+99hqenp7ceuutvYrNmlRyVxTFqUVE\nRJwzsXfXYvfNN9/sdux77nHc5rhqWUZRFKdxvpa/Q4cOBWDZsmUsXLiQGTNmcNlll2E2m7nvvvtI\nSUlh1qxZzJs379QbwbRp0zh5o6W3tze///3vGT58OBkZGVRWVp4xPkBeXh4zZ85k+PDhjBo1imPH\njtHS0sJll13GqFGjSEtL46uvvrLZz0Ild0VRnMbixYtZvnz5qa+XL1/OuHHjzjhm7969rFixgo0b\nN/L5559TWFjI4cOHee+999i+ffs5x21tbSUjI4OsrCymTJnCG2+88bNjbrrpJu6//36ysrLYtm0b\n4eHhuLu788UXX7B3717Wr1/PI488gq26AqhlGUVRnMa5Wv5GR0efccysWbMIDAwEulrxLlq0CI1G\nw4ABA5g+ffo5x3V1dWX+/PkAjB49mtWrV5/xfHNzM6WlpVx11VUAuLu7A2AwGPjv//5vNm3ahEaj\nobS0lMrKSgYMGGDR7/tcVHJXFMWpnN3y92y9abGr0+k4sU80Wq0Wo9HYo9d98MEHVFdXs2fPHnQ6\n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\n", 76 | "text/plain": [ 77 | "" 78 | ] 79 | }, 80 | "metadata": {}, 81 | "output_type": "display_data" 82 | } 83 | ], 84 | "source": [ 85 | "labels = ['setosa', 'versicolor', 'virginica']\n", 86 | "for i, label in enumerate(labels):\n", 87 | " sub_data = iris.data[iris.target == i]\n", 88 | " sbn.distplot(sub_data[:, 0], label=label)\n", 89 | " plt.legend()" 90 | ] 91 | }, 92 | { 93 | "cell_type": "markdown", 94 | "metadata": {}, 95 | "source": [ 96 | "## Training GMM" 97 | ] 98 | }, 99 | { 100 | "cell_type": "code", 101 | "execution_count": 4, 102 | "metadata": {}, 103 | "outputs": [ 104 | { 105 | "data": { 106 | "text/plain": [ 107 | "GaussianMixture(covariance_type='tied', init_params='kmeans', max_iter=20,\n", 108 | " means_init=array([[ 5.0425, 3.445 , 1.4675, 0.25 ],\n", 109 | " [ 5.895 , 2.745 , 4.2325, 1.3125],\n", 110 | " [ 6.5925, 2.9825, 5.4975, 2.0225]]),\n", 111 | " n_components=3, n_init=1, precisions_init=None, random_state=0,\n", 112 | " reg_covar=1e-06, tol=0.001, verbose=0, verbose_interval=10,\n", 113 | " warm_start=False, weights_init=None)" 114 | ] 115 | }, 116 | "execution_count": 4, 117 | "metadata": {}, 118 | "output_type": "execute_result" 119 | } 120 | ], 121 | "source": [ 122 | " gmm = GaussianMixture(n_classes, covariance_type='tied', max_iter=20, random_state=0)\n", 123 | "gmm.means_init = [train_x[train_y == i].mean(axis=0) for i in range(n_classes)]\n", 124 | "gmm.fit(train_x)" 125 | ] 126 | }, 127 | { 128 | "cell_type": "markdown", 129 | "metadata": {}, 130 | "source": [ 131 | "## Evaluation" 132 | ] 133 | }, 134 | { 135 | "cell_type": "code", 136 | "execution_count": 5, 137 | "metadata": {}, 138 | "outputs": [ 139 | { 140 | "name": "stdout", 141 | "output_type": "stream", 142 | "text": [ 143 | "[Covariance]\n", 144 | "[[ 0.22865317 0.07736423 0.1490959 0.03308773]\n", 145 | " [ 0.07736423 0.11258242 0.04137369 0.02472392]\n", 146 | " [ 0.1490959 0.04137369 0.18415626 0.03961295]\n", 147 | " [ 0.03308773 0.02472392 0.03961295 0.03901318]]\n", 148 | "\n", 149 | "train_accuracy: 0.96\n", 150 | "test_accuracy : 1.0\n" 151 | ] 152 | } 153 | ], 154 | "source": [ 155 | "train_accuracy = np.mean(gmm.predict(train_x) == train_y)\n", 156 | "test_accuracy = np.mean(gmm.predict(test_x) == test_y)\n", 157 | "\n", 158 | "print('[Covariance]')\n", 159 | "print(gmm.covariances_)\n", 160 | "print()\n", 161 | "\n", 162 | "print('train_accuracy:', round(train_accuracy, 2))\n", 163 | "print('test_accuracy :', round(test_accuracy, 2))" 164 | ] 165 | } 166 | ], 167 | "metadata": { 168 | "kernelspec": { 169 | "display_name": "Python 3", 170 | "language": "python", 171 | "name": "python3" 172 | }, 173 | "language_info": { 174 | "codemirror_mode": { 175 | "name": "ipython", 176 | "version": 3 177 | }, 178 | "file_extension": ".py", 179 | "mimetype": "text/x-python", 180 | "name": "python", 181 | "nbconvert_exporter": "python", 182 | "pygments_lexer": "ipython3", 183 | "version": "3.6.1" 184 | } 185 | }, 186 | "nbformat": 4, 187 | "nbformat_minor": 2 188 | } 189 | --------------------------------------------------------------------------------