├── .gitignore ├── LICENSE ├── README.md ├── appended.gif ├── dpmmpythonStreaming ├── __init__.py ├── dpmmwrapper.py ├── install.py ├── priors.py └── release.py ├── examples ├── clustering_example.ipynb └── multi_process.ipynb └── setup.py /.gitignore: -------------------------------------------------------------------------------- 1 | .py[cod] 2 | 3 | # C extensions 4 | *.so 5 | 6 | # Packages 7 | *.egg 8 | *.egg-info 9 | dist 10 | build 11 | eggs 12 | parts 13 | bin 14 | var 15 | sdist 16 | develop-eggs 17 | .installed.cfg 18 | lib 19 | lib64 20 | __pycache__ 21 | *.pyc 22 | # Installer logs 23 | pip-log.txt 24 | 25 | # Unit test / coverage reports 26 | .coverage 27 | .pytest_cache 28 | .tox 29 | nosetests.xml 30 | 31 | # Translations 32 | *.mo 33 | 34 | # Mr Developer 35 | .mr.developer.cfg 36 | .project 37 | .pydevproject 38 | 39 | .ropeproject 40 | # PyCharm 41 | .idea/* 42 | 43 | # created by distutils during build process 44 | MANIFEST 45 | 46 | # Mac Os 47 | .DS_Store 48 | 49 | 50 | .vscode* -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 BGU-CS-VIL 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## DPMMSubClustersStreaming 2 | 3 | This package is a Python wrapper for the [DPMMSubClustersStreaming.jl](https://github.com/BGU-CS-VIL/DPMMSubClustersStreaming.jl) Julia package.
4 | (for our paper [Sampling in Dirichlet Process Mixture Models for Clustering Streaming Data](https://dinarior.github.io/papers/Dinari_AISTATS_streaming.pdf), AISTATS 2022.). 5 | 6 |
7 |

8 | Streaming DPGMM 9 |

10 | 11 | 12 | ### Installation 13 | 14 | 1. Install Julia from: https://julialang.org/downloads/platform 15 | 2. Add our DPMMSubClusterStreaming package from within a Julia terminal via Julia package manager: 16 | ``` 17 | ] add DPMMSubClustersStreaming 18 | ``` 19 | 3. Add our dpmmpythonStreaming package in python: pip install dpmmpythonStreaming 20 | 4. Add Environment Variables: 21 | #### On Linux: 22 | 1. Add to the "PATH" environment variable the path to the Julia executable (e.g., in .bashrc add: export PATH =$PATH:$HOME/julia/julia-1.6.0/bin). 23 | #### On Windows: 24 | 1. Add to the "PATH" environment variable the path to the Julia executable (e.g., C:\Users\\AppData\Local\Programs\Julia\Julia-1.6.0\bin). 25 | 5. Install PyJulia from within a Python terminal: 26 | ``` 27 | import julia;julia.install(); 28 | ``` 29 | 30 | ### Usage Example: 31 | 32 | ``` 33 | from julia.api import Julia 34 | jl = Julia(compiled_modules=False) 35 | from dpmmpythonStreaming.dpmmwrapper import DPMMPython 36 | from dpmmpythonStreaming.priors import niw 37 | import numpy as np 38 | data,gt = DPMMPython.generate_gaussian_data(10000, 2, 10, 100.0) 39 | batch1 = data[:,0:5000] 40 | batch2 = data[:,5000:] 41 | prior = DPMMPython.create_prior(2, 0, 1, 1, 1) 42 | model= DPMMPython.fit_init(batch1,100.0,prior = prior,verbose = True, burnout = 5, gt = None, epsilon = 0.0000001) 43 | labels = DPMMPython.get_labels(model) 44 | model = DPMMPython.fit_partial(model,1, 2, batch2) 45 | labels = DPMMPython.get_labels(model) 46 | print(labels) 47 | ``` 48 | ### Misc 49 | 50 | For any questions: dinari@post.bgu.ac.il 51 | 52 | Contributions, feature requests, suggestion etc.. are welcomed. 53 | 54 | If you use this code for your work, please cite the following: 55 | 56 | ``` 57 | @inproceedings{dinari2022streaming, 58 | title={Sampling in Dirichlet Process Mixture Models for Clustering Streaming Data}, 59 | author={Dinari, Or and Freifeld, Oren}, 60 | booktitle={International Conference on Artificial Intelligence and Statistics}, 61 | year={2022} 62 | } 63 | ``` 64 | -------------------------------------------------------------------------------- /appended.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BGU-CS-VIL/dpmmpythonStreaming/0a1d52a9725743d8be85b67f71ad98c8b6117318/appended.gif -------------------------------------------------------------------------------- /dpmmpythonStreaming/__init__.py: -------------------------------------------------------------------------------- 1 | from .release import __version__ 2 | from .install import install 3 | import os 4 | import julia 5 | 6 | -------------------------------------------------------------------------------- /dpmmpythonStreaming/dpmmwrapper.py: -------------------------------------------------------------------------------- 1 | import julia 2 | julia.install() 3 | from dpmmpythonStreaming.priors import niw, multinomial 4 | from julia import DPMMSubClustersStreaming 5 | import numpy as np 6 | 7 | 8 | 9 | class DPMMPython: 10 | """ 11 | Wrapper for the DPMMSubCluster Julia package 12 | """ 13 | 14 | @staticmethod 15 | def create_prior(dim,mean_prior,mean_str,cov_prior,cov_str): 16 | """ 17 | Creates a gaussian prior, if cov_prior is a scalar, then creates an isotropic prior scaled to that, if its a matrix 18 | uses it as covariance 19 | :param dim: data dimension 20 | :param mean_prior: if a scalar, will create a vector scaled to that, if its a vector then use it as the prior mean 21 | :param mean_str: prior mean psuedo count 22 | :param cov_prior: if a scalar, will create an isotropic covariance scaled to cov_prior, if a matrix will use it as 23 | the covariance. 24 | :param cov_str: prior covariance psuedo counts 25 | :return: DPMMSubClustersStreaming.niw_hyperparams prior 26 | """ 27 | if isinstance(mean_prior,(int,float)): 28 | prior_mean = np.ones(dim) * mean_prior 29 | else: 30 | prior_mean = mean_prior 31 | 32 | if isinstance(cov_prior, (int, float)): 33 | prior_covariance = np.eye(dim) * cov_prior 34 | else: 35 | prior_covariance = cov_prior 36 | prior =niw(mean_str,prior_mean,dim + cov_str, prior_covariance) 37 | return prior 38 | 39 | @staticmethod 40 | def fit_init(data,alpha, prior, 41 | iterations= 100,init_clusters=1, verbose = False, 42 | burnout = 15, gt = None, epsilon = 0.1, smart_splits = False, warm_start = None, allow_splits = True, allow_merges = True): 43 | """ 44 | Wrapper for DPMMSubClustersStreaming fit, reffer to "https://bgu-cs-vil.github.io/DPMMSubClustersStreaming.jl/stable/usage/" for specification 45 | Note that directly working with the returned clusters can be problematic software displaying the workspace (such as PyCharm debugger). 46 | :return: labels, clusters, sublabels 47 | """ 48 | 49 | results,split_history = DPMMSubClustersStreaming.dp_parallel_streaming(data, prior.to_julia_prior(), alpha, iterations,init_clusters, 50 | None, verbose, False, 51 | burnout,gt, epsilon, smart_splits, warm_start,allow_splits,allow_merges) 52 | return results,split_history 53 | 54 | @staticmethod 55 | def fit_partial(model,iterations, t, data): 56 | results,split_history = DPMMSubClustersStreaming.run_model_streaming(model,iterations, t, data) 57 | return model, split_history 58 | 59 | @staticmethod 60 | def get_labels(model): 61 | return DPMMSubClustersStreaming.get_labels(model) 62 | 63 | def get_sublabels(model): 64 | return DPMMSubClustersStreaming.get_sublabels(model) 65 | 66 | @staticmethod 67 | def predict(model,data): 68 | return DPMMSubClustersStreaming.predict(model,data) 69 | 70 | 71 | 72 | @staticmethod 73 | def generate_gaussian_data(sample_count,dim,components,var): 74 | ''' 75 | Wrapper for DPMMSubClustersStreaming cluster statistics 76 | :param sample_count: how much of samples 77 | :param dim: samples dimension 78 | :param components: number of components 79 | :param var: variance between componenets means 80 | :return: (data, gt) 81 | ''' 82 | data = DPMMSubClustersStreaming.generate_gaussian_data(sample_count, dim, components, var) 83 | gt = data[1] 84 | data = data[0] 85 | return data,gt 86 | 87 | @staticmethod 88 | def add_procs(procs_count): 89 | j = julia.Julia(compiled_modules=False) 90 | j.eval('using Distributed') 91 | j.eval('addprocs(' + str(procs_count) + ')') 92 | j.eval('@everywhere using DPMMSubClustersStreaming') 93 | 94 | 95 | if __name__ == "__main__": 96 | j = julia.Julia(compiled_modules=False) 97 | data,gt = DPMMPython.generate_gaussian_data(10000, 2, 10, 100.0) 98 | prior = DPMMPython.create_prior(2, 0, 1, 1, 1) 99 | model= DPMMPython.fit_init(data,100.0,prior = prior,verbose = True, burnout = 5, gt = None, epsilon = 1.0) 100 | labels = DPMMPython.get_labels(model) 101 | print(labels) 102 | 103 | 104 | -------------------------------------------------------------------------------- /dpmmpythonStreaming/install.py: -------------------------------------------------------------------------------- 1 | import julia 2 | import os 3 | import sys 4 | import wget 5 | import tarfile 6 | from julia.api import Julia 7 | 8 | 9 | 10 | def get_julia_path_from_dir(base_dir): 11 | dir_content = os.listdir(base_dir) 12 | julia_path = base_dir 13 | for item in dir_content: 14 | if os.path.isdir(os.path.join(julia_path,item)): 15 | julia_path = os.path.join(julia_path,item) 16 | break 17 | 18 | return os.path.join(julia_path,'bin','julia'),os.path.join(julia_path,'bin') 19 | 20 | 21 | 22 | def install(julia_download_path = 'https://julialang-s3.julialang.org/bin/linux/x64/1.4/julia-1.4.0-linux-x86_64.tar.gz', julia_target_path = None): 23 | ''' 24 | :param julia_download_path: Path for the julia download, you can modify for your preferred version 25 | :param julia_target_path: Specify where to install Julia, if not specified will install in $HOME$/julia 26 | ''' 27 | if julia_target_path == None: 28 | julia_target_path = os.path.join(os.path.expanduser("~"),'julia') 29 | if not os.path.isdir(julia_target_path): 30 | os.mkdir(julia_target_path) 31 | download_path = os.path.join(julia_target_path,'julia_install.tar.gz') 32 | print("Downloading Julia:") 33 | wget.download(julia_download_path, download_path) 34 | print("\nExtracting...") 35 | tar = tarfile.open(download_path,"r:gz") 36 | tar.extractall(julia_target_path) 37 | _, partial_path = get_julia_path_from_dir(julia_target_path) 38 | os.environ["PATH"] += os.pathsep + partial_path 39 | os.system("echo '# added by dpmmpython' >> ~/.bashrc") 40 | os.system("echo 'export PATH=\""+partial_path+":$PATH\"' >> ~/.bashrc") 41 | print("Configuring PyJulia") 42 | julia.install() 43 | julia.Julia(compiled_modules=False) 44 | print("Adding DPMMSubClustersStreaming package") 45 | from julia import Pkg 46 | Pkg.add("DPMMSubClustersStreaming") 47 | print("Please exit the shell and restart, before attempting to use the package") 48 | 49 | 50 | if __name__ == "__main__": 51 | install() -------------------------------------------------------------------------------- /dpmmpythonStreaming/priors.py: -------------------------------------------------------------------------------- 1 | import julia 2 | from julia import DPMMSubClustersStreaming 3 | import numpy as np 4 | 5 | class prior: 6 | def to_julia_prior(self): 7 | pass 8 | 9 | class niw(prior): 10 | def __init__(self, kappa, mu, nu, psi): 11 | if nu < len(mu): 12 | raise Exception('nu should be atleast the Dim') 13 | self.kappa = kappa 14 | self.mu = mu 15 | self.nu = nu 16 | self.psi = psi 17 | 18 | 19 | def to_julia_prior(self): 20 | return DPMMSubClustersStreaming.niw_hyperparams(self.kappa,self.mu,self.nu, self.psi) 21 | 22 | 23 | class multinomial(prior): 24 | def __init__(self, alpha,dim = 1): 25 | if isinstance(alpha,np.ndarray): 26 | self.alpha = alpha 27 | else: 28 | self.alpha = np.ones(dim)*alpha 29 | 30 | 31 | 32 | def to_julia_prior(self): 33 | return DPMMSubClustersStreaming.multinomial_hyper(self.alpha) 34 | 35 | class compact_multinomial(prior): 36 | def __init__(self, alpha): 37 | if isinstance(alpha,np.ndarray): 38 | self.alpha = alpha 39 | else: 40 | self.alpha = np.ones(dim)*alpha 41 | 42 | 43 | def to_julia_prior(self): 44 | return DPMMSubClustersStreaming.compact_mnm_hyper(self.alpha) 45 | 46 | -------------------------------------------------------------------------------- /dpmmpythonStreaming/release.py: -------------------------------------------------------------------------------- 1 | # This file is executed via setup.py and imported via __init__.py 2 | 3 | __version__ = "0.1.2" 4 | # For Python versioning scheme, see: 5 | # https://www.python.org/dev/peps/pep-0440/#version-scheme -------------------------------------------------------------------------------- /examples/clustering_example.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "### Simple clustering example using the package" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 1, 13 | "metadata": {}, 14 | "outputs": [], 15 | "source": [ 16 | "import numpy as np\n", 17 | "from matplotlib import pyplot as plt" 18 | ] 19 | }, 20 | { 21 | "cell_type": "markdown", 22 | "metadata": {}, 23 | "source": [ 24 | "Importing the package main class, and the Normal Inverse Wishart (NIW) prior.\n", 25 | "\n", 26 | "Follow the installation guide at: https://github.com/BGU-CS-VIL/DPMMPython before importing. Extra steps are required after `pip install`." 27 | ] 28 | }, 29 | { 30 | "cell_type": "code", 31 | "execution_count": 2, 32 | "metadata": {}, 33 | "outputs": [], 34 | "source": [ 35 | "from dpmmpython.dpmmwrapper import DPMMPython\n", 36 | "from dpmmpython.priors import niw" 37 | ] 38 | }, 39 | { 40 | "cell_type": "code", 41 | "execution_count": 20, 42 | "metadata": {}, 43 | "outputs": [], 44 | "source": [ 45 | "import julia\n", 46 | "from julia import Random\n", 47 | "jl = julia.Julia()\n", 48 | "jl.eval('Random.seed!(1)');" 49 | ] 50 | }, 51 | { 52 | "cell_type": "markdown", 53 | "metadata": {}, 54 | "source": [ 55 | "### Data Generation\n", 56 | "\n", 57 | "We will use the package data generation function to generate some 2D data" 58 | ] 59 | }, 60 | { 61 | "cell_type": "code", 62 | "execution_count": 4, 63 | "metadata": {}, 64 | "outputs": [], 65 | "source": [ 66 | "D = 2 # Dimension\n", 67 | "K = 20 # Number of Clusters\n", 68 | "N = 20000 #Number of points\n", 69 | "var_scale = 100.0 # The variance of the MV-Normal distribution where the clusters means are sampled from.\n", 70 | "data, labels = DPMMPython.generate_gaussian_data(N, D, K, var_scale)" 71 | ] 72 | }, 73 | { 74 | "cell_type": "markdown", 75 | "metadata": {}, 76 | "source": [ 77 | "Plotting the data\n", 78 | "\n", 79 | "Note that as Julia is a column first language, the data generated is $DxN$" 80 | ] 81 | }, 82 | { 83 | "cell_type": "code", 84 | "execution_count": 5, 85 | "metadata": {}, 86 | "outputs": [ 87 | { 88 | "data": { 89 | "text/plain": [ 90 | "" 91 | ] 92 | }, 93 | "execution_count": 5, 94 | "metadata": {}, 95 | "output_type": "execute_result" 96 | }, 97 | { 98 | "data": { 99 | "image/png": "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\n", 100 | "text/plain": [ 101 | "
" 102 | ] 103 | }, 104 | "metadata": { 105 | "needs_background": "light" 106 | }, 107 | "output_type": "display_data" 108 | } 109 | ], 110 | "source": [ 111 | "plt.scatter(data[0,:],data[1,:],c=labels, s=1)" 112 | ] 113 | }, 114 | { 115 | "cell_type": "markdown", 116 | "metadata": {}, 117 | "source": [ 118 | "### Fiting DPGMM Model to the data\n", 119 | "\n", 120 | "Start by defining a niw prior and $\\alpha$" 121 | ] 122 | }, 123 | { 124 | "cell_type": "code", 125 | "execution_count": 6, 126 | "metadata": {}, 127 | "outputs": [], 128 | "source": [ 129 | "prior = niw(1,np.zeros(D),2,np.eye(D)*0.5)\n", 130 | "alpha = 10.0" 131 | ] 132 | }, 133 | { 134 | "cell_type": "markdown", 135 | "metadata": {}, 136 | "source": [ 137 | "Fit the model and store the results in `results`.\n", 138 | "When working from Jupyter Notebook/Lab you will not see Julia prints. However when running python from terminal you will see all the prints (as in the Julia packages)" 139 | ] 140 | }, 141 | { 142 | "cell_type": "code", 143 | "execution_count": 7, 144 | "metadata": {}, 145 | "outputs": [], 146 | "source": [ 147 | "results = DPMMPython.fit(data,alpha,prior = prior,iterations=500, burnout=10)" 148 | ] 149 | }, 150 | { 151 | "cell_type": "markdown", 152 | "metadata": {}, 153 | "source": [ 154 | "The returned object is a tuple with `(labels, cluster_distribution,sub_labels)`, we will only require the first item" 155 | ] 156 | }, 157 | { 158 | "cell_type": "code", 159 | "execution_count": 8, 160 | "metadata": {}, 161 | "outputs": [], 162 | "source": [ 163 | "inferred_labels = results[0]" 164 | ] 165 | }, 166 | { 167 | "cell_type": "code", 168 | "execution_count": 9, 169 | "metadata": {}, 170 | "outputs": [ 171 | { 172 | "data": { 173 | "text/plain": [ 174 | "" 175 | ] 176 | }, 177 | "execution_count": 9, 178 | "metadata": {}, 179 | "output_type": "execute_result" 180 | }, 181 | { 182 | "data": { 183 | "image/png": "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\n", 184 | "text/plain": [ 185 | "
" 186 | ] 187 | }, 188 | "metadata": { 189 | "needs_background": "light" 190 | }, 191 | "output_type": "display_data" 192 | } 193 | ], 194 | "source": [ 195 | "plt.scatter(data[0,:],data[1,:],c=inferred_labels, s=1)" 196 | ] 197 | }, 198 | { 199 | "cell_type": "markdown", 200 | "metadata": {}, 201 | "source": [ 202 | "Looks good, we can quantilize the quality of the clustering using NMI:" 203 | ] 204 | }, 205 | { 206 | "cell_type": "code", 207 | "execution_count": 10, 208 | "metadata": {}, 209 | "outputs": [], 210 | "source": [ 211 | "from sklearn.metrics.cluster import normalized_mutual_info_score" 212 | ] 213 | }, 214 | { 215 | "cell_type": "code", 216 | "execution_count": 11, 217 | "metadata": {}, 218 | "outputs": [ 219 | { 220 | "name": "stdout", 221 | "output_type": "stream", 222 | "text": [ 223 | "DPGMM NMI:0.9728852990709327\n" 224 | ] 225 | } 226 | ], 227 | "source": [ 228 | "dpgmmm_nmi = normalized_mutual_info_score(inferred_labels.astype(int), np.array(labels),average_method='arithmetic')\n", 229 | "print(f'DPGMM NMI:{dpgmmm_nmi}') " 230 | ] 231 | }, 232 | { 233 | "cell_type": "markdown", 234 | "metadata": {}, 235 | "source": [ 236 | "### Comparing VS other methods" 237 | ] 238 | }, 239 | { 240 | "cell_type": "code", 241 | "execution_count": 12, 242 | "metadata": {}, 243 | "outputs": [], 244 | "source": [ 245 | "from sklearn.cluster import KMeans\n", 246 | "from sklearn.mixture import GaussianMixture" 247 | ] 248 | }, 249 | { 250 | "cell_type": "markdown", 251 | "metadata": {}, 252 | "source": [ 253 | "#### K-means:" 254 | ] 255 | }, 256 | { 257 | "cell_type": "code", 258 | "execution_count": 13, 259 | "metadata": {}, 260 | "outputs": [], 261 | "source": [ 262 | "kmeans = KMeans(n_clusters=K).fit(data.T)\n", 263 | "kmeans_labels = kmeans.labels_" 264 | ] 265 | }, 266 | { 267 | "cell_type": "code", 268 | "execution_count": 14, 269 | "metadata": {}, 270 | "outputs": [ 271 | { 272 | "data": { 273 | "text/plain": [ 274 | "" 275 | ] 276 | }, 277 | "execution_count": 14, 278 | "metadata": {}, 279 | "output_type": "execute_result" 280 | }, 281 | { 282 | "data": { 283 | "image/png": "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\n", 284 | "text/plain": [ 285 | "
" 286 | ] 287 | }, 288 | "metadata": { 289 | "needs_background": "light" 290 | }, 291 | "output_type": "display_data" 292 | } 293 | ], 294 | "source": [ 295 | "plt.scatter(data[0,:],data[1,:],c=kmeans_labels, s=1)" 296 | ] 297 | }, 298 | { 299 | "cell_type": "code", 300 | "execution_count": 15, 301 | "metadata": {}, 302 | "outputs": [ 303 | { 304 | "name": "stdout", 305 | "output_type": "stream", 306 | "text": [ 307 | "K-means NMI:0.9309229767796119\n" 308 | ] 309 | } 310 | ], 311 | "source": [ 312 | "kmeans_nmi = normalized_mutual_info_score(kmeans_labels.astype(int), np.array(labels),average_method='arithmetic')\n", 313 | "print(f'K-means NMI:{kmeans_nmi}') " 314 | ] 315 | }, 316 | { 317 | "cell_type": "markdown", 318 | "metadata": {}, 319 | "source": [ 320 | "#### GMM:" 321 | ] 322 | }, 323 | { 324 | "cell_type": "code", 325 | "execution_count": 16, 326 | "metadata": {}, 327 | "outputs": [], 328 | "source": [ 329 | "gmm = GaussianMixture(n_components=20,covariance_type='full').fit(data.T)\n", 330 | "gmm_labels = gmm.predict(data.T)" 331 | ] 332 | }, 333 | { 334 | "cell_type": "code", 335 | "execution_count": 17, 336 | "metadata": {}, 337 | "outputs": [ 338 | { 339 | "data": { 340 | "text/plain": [ 341 | "" 342 | ] 343 | }, 344 | "execution_count": 17, 345 | "metadata": {}, 346 | "output_type": "execute_result" 347 | }, 348 | { 349 | "data": { 350 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXkAAAD4CAYAAAAJmJb0AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAABLNElEQVR4nO3dd3yURf7A8c9s3/TeQw8lhF4EUUCaoCiK3dOzYzu7P+vdeXfWs9xZzt6wgSiKBSugoIiU0DuEEhLSezbbd+f3x4YQJCEJ2RSWeb9eeZF9yjzfIcl3Z+eZZ0ZIKVEURVECk6ajA1AURVHajkryiqIoAUwleUVRlACmkryiKEoAU0leURQlgOk6OoD6YmJiZLdu3To6DEVRlBPK2rVrS6SUsQ3t61RJvlu3bmRmZnZ0GIqiKCcUIUR2Y/tUd42iKEoAU0leURQlgKkkryiKEsBUklcURQlgKskriqIEMJXkFUVRAphK8oqiKAFMJXlFCUBSSh76/kce/2kpXinZU1qGmlb85NSpHoZSFMU/vFIyf8tWBLAu7yAb8wt5cPxYUsPD+WTTZp49exoRZnNHh6m0A5XkFSVAuDwenly6jMGJibi9Xry1LfdN+YUA/LRnL6tycgGYu3ETN486pcNiVdqPSvKKEiDyqqp5f90G3mcDQXp93fZDnTSHErwGeO7X3zglNZWhyUntH6jSrlSfvKIEiK6REbwy4xxSwsJwetyNHnfxwAH0iYkhITSkHaNTOopK8ooSILLLK7jly68x6XS4vY3fZP1402Y+uPgC3s1cx8u/r2rHCJWOoLprFCVAbCsqAiCrrKzJY2d+OJfcqioMWi23jlZ984FMteQV5QSUW1nJLV98xdbCorpt/ePj0ArRrPODjQYGJiTw8eWXtFWISifR6iQvhEgVQvwshNguhNgqhLijdnuUEGKREGJ37b+RrQ9XURTw3UT9cXcWi3bvBuC37Gyu+mQ+nmaOhS+tsRJiNOA9RreOEhj80V3jBu6RUq4TQoQCa4UQi4CrgSVSyqeEEA8ADwD3++F6inLSm5HeD51GQ6/oKC6bO491B/OaneABBiTE8/PefQxPTmZwUmIbRqp0tFYneSllPpBf+321EGI7kAzMAMbXHvYesBSV5BXFL3QaDc8u+5V8i+W4zn9i6hRyKyvpHx/v58iUzsavffJCiG7AEGAVEF/7BnDojSCukXNmCSEyhRCZxcXF/gxHUQLaiNSUFh0vgJSwMJ6ddiaxwcEMSUrCoNW2TXBKp+G3JC+ECAE+A+6UUlY19zwp5RtSyuFSyuGxsQ2uQ6soSgNGdUlt0fESyK2q4sEfFrF8f6NLgioBxi9JXgihx5fgP5JSfl67uVAIkVi7PxEoaux8RVFabkBCAmnRUVyY0b/JYw89AavXaHB7vXi83rYOT+kkWt0nL4QQwNvAdinlf+rt+gq4Cniq9t8vW3stRVEO6xkdxf6KCgotNQBEm82EGo3sr6g46tgQo4Gnpk7hjJ49MOl0iGYOtVROfP5oyY8BrgQmCCE21H6dhS+5TxZC7AYm175WFMVP9BoNp3XtStfICAAmp6Xx/XVX0ysqCvD1wSeGhqATgn6xsZzVtw9mvV4l+JOMP0bXLMf3+9SQia0tX1GUhgkhePOC85FSsrWoiLjgYM57/yMq7HYEEGk2k1/tG32TX1XdscEqHUY98aooJzghBBnx8VQ5HOwoLmZYSjIb77iN204dTZjRiACePXtqR4epdBDRmVaLGT58uMzMzOzoMBTlhFVsqSHCbEJfb2ikx+tFq1HtuUAmhFgrpRze0D41QZmiBJDYkOCjtqkEf3JTP31FUZQAppK8oihKAFNJXlEUJYCpJK8oihLAVJJXFEUJYCrJK4qiBDCV5BVFUQKYSvKKoigBTCV5RVGUAKaSvKIoSgBTSV5RFCWAqSSvKIoSwFSSVxRFCWAqySuKogQwleQVRVECmEryiqIoAUwleUVRlACmknytb/fsZNG+rI4OQ1EUxa9Ukge8UnLLj1/zl0Vfd3QoiqIofqXWeAU0QvDG1PPQq7UwFUUJMCrJ15rSvVdHh6AoiuJ3qunaAl4pWXZgH5UOe0eHoiiK0iwnXZK3OJ3M3ryOEmtNi89ddmAfV33zGf/67ec2iExRFMX/Aj7Jl9msXPvt5/ywdxcAX+zexj+W/8TszetaXNbg+ETOS+vHZf0G+jvMNvPx8g28/uPKI7ZV2exszSnAYndwxQtzueKFueSUVNQd/+ini/F6JQBOt5s/PT+H6U+8w66DxRwormjnGiiK0hoB3Sf/6rpVfL17B9vKivkpey8rr7yRhKAQQvV61uTn8tzq5QyOS6R7RCS51VWMTe12zPIiTWaen3R2+wTfAi99+xtFlRbuOHsMT3+xjIvHDGJ4zxR2Hizi+YW/YnW66Zccy+3vfIVXQkxoECXVVrQCPL5czv+++41ftu3DpNdTarFSUmVhb2E52bXJH+DC5z4EINio56YzRxFsNLD9YBGF5RbSU+MZ0j2JsCAj/VMTOuB/QVGUhggpZUfHUGf48OEyMzPzuM+3u914pZcgvYFyu40h774MQJewcKRXsvDiP3PKe69h97jRCoFHSvpExeCVkt3lpfx2xSySQ8P8VR2/c7rd6LVa3F4vz3+9nJFpqYzr34OJ/3iD4qoju5+CjXpqHK52jzEsyMgVpw+loKKaRy6ehBCi3WNQlJONEGKtlHJ4Q/sCqrtm2ifvMXz2q7g8HsKNJq7sPxijVsuBqkrK7TZu/O5LTklMZlRSKs+cMZV3zjqfV6acyz0jxxBjMnPxF3OpdjjweL3M+OxDbv7hqw6ri9vjZe3eXFweDxv25fH3j39gxP0v8a9PF5NbUskHv6zj9UWrAHj5hvMIMeqPOL+9EnzfpFieuOxMggy+D4U3Tj6F+Ss38/mqLZRWW5n22Nv869PF7RKLoihHC6jumvSYWGKCgtBqNCzPzWbFwQOkRUazpaQIi9vFyvycumP7RcXwwdYNRJqD6BIaTondBsDFX8zlukHD2VpciNXp7Kiq8PmqzTw2/yfuPXcsCzO3syOvmPAgE9GhQXSPj+LVWecTGxbCK9+vYOHaHVg6oNWu1QjiI0KYPiKd8QN6UlFjIyU6gimD+mB3udBoBIWVFgorLO0em6IoPgGR5IutNby5MZMHRo0jNSwcgL8tW0x2dQXPnHEm//fzDwBEGk2UO+xogaU5+3BLidXlQqfREGYwUu10sL2shH+v+hW3lGRXV2J1OQnSG9q9TsN7pjCmb1dG9e7CW0tWA5ASHU5SZDg2p5ON+/ORUvL6olWkRke0e3zj+/fg6SvPxqDTAhBiMhJiMgIQHxFSd9zKJ29Fp9G2e3yKovgERJL/fu9u3tiwBrNWx10jx+D2esmurgAgISgEAUigZ0QkESYzj46dzP0/f092ZQU1Lif7K8uZ0asv3SOjsLpcTOjagwsWzMHmdnOgsoK+MXHtXqce8dG8OmsmAK/OOp+Xvl3Bip3ZbM1ZRKXVxms/rqR3YgwAA7rEExMWxIZ9ebTmDktUkIky6+FnAOrfmE2NDufKcUP5cvU2EiJDue+8cZgMTf/6GHQB8SumNJOUXqSsQaMJ7ehQlFoBcePV6nKyMGsnZ/ZII9xoAuDznVv5528/UelwHHV8UlAIedajuxBGxCfzyOkT6BUZza6yEnKrKvl27y76x8Rx89BTWl4hP3K43Py0eQ9r9uRw+1lj+GXbPgZ0SWBnXjEj01Ix6HSc+tDLCCAmLLjuRmxCRAjXTRjB2PQeLFy7HYNey2s/rMSs13HO8HTKLDZ+2pLF+IyePH75VAoqqgk1GSivsWN1OPlpcxZnZPSiT3Jsh9ZfOTEUl91LtfUjUuKXYtD36ehwThrHuvEaEEn+j3aWFnPVN58RYjCQVV52zGNNWh12jxuAc3r14eusnZzZvRc/7MuiR1gEe6sqiDUHsebqW1odV1s7WFaJSe9rOf/rkyWM7tOFS08bfNRxh37mauSL0hQpJU7Xdgz6NITQH7G9xrYAg75/XTJ3u4spKL0KjyefhOiv0OuT0aj5oNrFsZJ8QH6WXrBrGwU1Fqg3qnBK156sKsg9omVv1mqxedz8KX0Qy3L2sWjfHobEJ2KpveEaaTZDVQVmvZ5qp4N3Nq3lvLR0uoZHtHONmic5Krzu+xeuO7fR41RyV5rLav+OwtLrCA+9jaiwB3C6dpJffAFGw2Bsjp/RaFIIMo1Br+2GxfYtLvdmDNrJPHLBrVQWpPHKmmfxer1oteq+TEcJyLfZid2OnGxMIwS/5GZT5XAQaTTVVdrm8ZAeHcuqvBxyq6uwe9w8MmYC2ZUVTOjag8vSBwEwoWtPluzfw3/XrODtTa3/pKEoJ4Lqmk+w2n/FaBiBVkSQUzieg0UT8MpybI51gAGvNxeLdR7l1f/G5d7sO696FYX7neTuPsDZQZdzTvAV5O8r7NjKnMQCsiUfZTLX3WwF38Rih7pkyh12Tk1MYUV+LgDbSosBGJmQzGtTZ2Bzu8m1VDEgLp6ZffqTHBrGkPhEAB51TlKzVSonjdLKp/B680mK+4G8ojP/sLey0fO8HgvF2WYcNQC+v7s/9/wLepOe5LQELrz7HH5452cuvOcc+o3qzY5Vuxk1fZj6hNlG/JLkhRDvANOBIillRu22KGAe0A3YD1wspSz3x/WaotUIXpx0NsMTkim12bh98UL2Vh6+9Ir8XLRCoBcahBDYPG42FhUQpDcQZQ7iwVFjWXkwB7vbxejkLnXnXZkxuD3CV5QOJaUHp2sHSCsAXo+1BeeC1wvxPSwc2BxxxD6X3cX+zTk8e80rAOxau4fuA7qyY9Vu/r3o7wydOMBvdVAO81d3zWxg6h+2PQAskVKmAUtqX7eLv/z4Nbct/oaNRQVkxMWz6NJruCJ9EGOTu9Z21/imNLB7PdhqW/g6oaHvm8/zc/Zenlz5Cz/n7OOp35fRmW5MK0p7qKh+hYNFk/BKX2u9oPRPzT7X44Y5D/XiwOampwdxWJ3sWLUbjVZDnxE9jzte5dj8kuSllL8AfxzGMgN4r/b794Dz/HGt5rh7xBiSQ0K56cev2FlajFaj4bFxk3n/3It4beoMvPVGk0ebzAyJS+CaQcOIMJoIMxox1t4ken/rRnaXl3GgqqK9QleUDmcyDMOgzyDINA3fh/3mt+R1enA7mp9WuvVPZdjkgXg9XgCqyy14vd4WRqwci9+GUAohugEL63XXVEgpI+rtL5dSRjZw3ixgFkCXLl2GZWdn+yWer3Zv5/u9u3l2wtSjnljdW1HGy+tWMSg2gWk9exMbFFy3b23BQWZvWsfXe3YC0D8mjq0lRfx+5Y0khvge8MitriTaFIRZf+R8MYoSKMqrXgAEHm8Z1ZZ5SCqadd6uVaE8d/FAkC3rXxcawT8X3MffZ/ybs26YyF2v39TyoE9inXoIpZTyDeAN8I2T91e556b149y0fg3u6xERxXMTptW9fnPjGjYWFvDg6HH8Y/lPbC4u5PJ+gyioqWZEYjKxQcFEmswA7Kso54y5bzO+S3dmn32Bv8JVlE6lvOo5QNA9eQ9aTQxej53KmueaPC+hp43IRDvleeYWXU96JXs37SexZzzd+ndp+gSl2doyyRcKIRKllPlCiESgqA2v1SLbS4uYMf9Drh04nPtGnc7jK5YBEGEyo6ltgFw3aCg9I6MBuJnDT7tGm4MYkZDM+NTu7R63orSXlHjffE9O1zbKqx7HaBiJ2TgZm2PRMc8Li3GT1Nva4iQP8NHjn/HM4n/Q/1T1pKw/teU4+a+Aq2q/vwr4sg2v1Wxr8nOZ9sn7eGq7qTRCMKmb76bPtpJCNhYVohUCs06Pw+Nmwa5tlNfOUAkQZjTy6fmXcfXAoR0Sv6K0B4O+X+3XAGIjXyA28mmiIx4GTE2ee/v727no71ktvqbL7ubAthyev+l11v+0+TiiVhrilyQvhJgL/A70EULkCiGuA54CJgshdgOTa193uDCDkRhzEE+NP5MHRo8F4KwevQk1GFhXmF838gYB3+7ZxV1LvuWltb93cNSK0jGEEIQGX4xB3weDvg8xEc8067zxfy6A45gu7437P+SbNxYz7+lO0SYMCH7prpFSXtbIron+KN+f+kTHkvmHeWjO751OsdVKhcPOq+tXEWMOIikkjHGp3bhmwFAur33yVVFOdqHBM/F4i3A6tyFEIhbbK8DRo2FcTg0gavc13JZMH92bhB7xrPpmLf1OSSOxZzxblu/AUl7DjFv/OCJbOV4BOUFZSx2oqmDsR2+RFhnNW9POJ1ivJ6beiBtFUY7m8VaSnZeBQZeBV7rxeKqQFAK++aEObA5m4YtJ5G4PpSw3mPhuMZQcLMftcBPbJYZ/fv5/pA3tcUSZlSVV7N2UzeAzMtQTsC1w0s1C2VJSSj7duYXekTEMrp3CQFGUpnm9VoQwIISO8qoXKa96ksjQB7A512B3LEF6gvh1XigfPZDGPxb4kvquzD2MOW+kSuJ+pJK8oijtwittaIQZm305ZVXPYDaejrXagqf6err2S+no8AJWpx4nryhK4NAI39BJs+k0kk2nAVBvBmylAwTkVMOKoiiKj0ryiqIoAUwleUXpRKod27E4d3d0GEoAUX3yil+4vR6e2DaP9LAuXNjlNKxuO0atAa3Q4PC4WFS4ntNi0okwhHR0qJ2WlF5W5l2AVgQxoVv7DkBweV1klm9ib/V+1lVswelxcX3PyxkUkd6ucSj+p5K84hdVLiuLC9ezx5LH6XH9uei3J+gRnMATg65mY/lent7+KdldxnJr2jkdHapf2Fy55FTNoWvEtRi1Mc0+z+kpZVfZM3QJu5IwY/8j9gmhoUfErWhFy+d9aa252V/yTcHiI7YdtOWrJB8AVJJXWuTL3N+Zd+AX/jt0FksKNpBdU4hR6OkTnsI/06/g2V3z+fPvz2IQWvbWFHDTmpeYkjAMgOGRaR0cvf/kWRaQXfUuZn0qqWG+B75dngqE0KPTNP4gXZltFfmWL9GJkKOSPEDPyFvbLOZj2W3ZB0CoNpgoQwR9Q9P4seAXIvURaISGNWUbSDUnckr0UDLLNzElYRwGjZpq+0SgkrzSIlmWPHJtJczL/oX5ucsP78hv+HivlATrjJi1BhLMUe0TZDvoEvZnTLpkEoJ9j9+7PVaWHTgdsy6VManfNnpeXPAUBomXiTSPOGJ7sfVnTNoEQo0NT499iMtTgc2dR5ixdS3sapeFx7e/wNjY0UxNGM/EuNPYZdlDtaeGalsN2baDAGyq3MayopV48ACwuGg5RY4S4k0xjIga3KoYlPahkrzSLCWOSmrcDk6L7U9aSBLP7vy8WedVua30Dk3mu3GPohGBc59frw0nOXQmAHZ3Ib/mTMagjTwieZfafie3+hPCDOl0Db8ajdCjETrigiccUZbNnc+Gwlsw61I4LdU3la/TU8qmortJDb2C+JDJdcduLLqLcvtKRid/TYjh+BeVr3Jb2FeTA1Lw/v5PkY1MJvZT0W9HvC5ylHBJ6gwGRRz9KUTpnFSSV5rl1sxXyLf/cYXH5nlw02zu6nM+56ec6ueoOgeBBr0mmPigKfSN+SuVji2sybsMsy4Vq3sfRTXfE2EcfFTrHcDqOsBvudMw61IJ0fdhW8kj9I3+K1ZXNuX21bg9VhAQZkjHrE8mKeR8dJoQzLqkVsWcbE7g1WFP8f6+T9lnPYCgeXNGhmiDmJkyrekDlU5DJXmlSZsr9jMubgA/FW6kyFHR4vONGj3pYYG72o9OE8ao5C8x6eLqbRUkhkxHr41CSi/hpiE43WWsK5iFRmOkX8wjWJy7a98gIrC5c7C5DwJeuoffQIRpKOHGoVQ61rGp6HYijMMZkfQBSaHnkhR6rl/ijjJEcEva1QwqTue1vR806xyLx8o3BxdzdvIkv8SgtD2V5JVGba/K4Znt88my5BFvjDiuBB9tCKNPWAp9wlo+b4nV7kQjBCZj573BV2Jdzuaie3DLKtJjniDEkIaUHsZ1/Q3pdVFmW41BH4NH2liWcxqH2ssrD86oLUHH5O6bKapZgttrxeEpAjSU2n6ne/iNZFe8g1OWkhJ2ad01y+1rqbRvpGv41YhWdoEZNHo+zV3YonM+yfmakdFDiDVFt+raSvtQSV5p1Ht7F5FlyUODoPA4EjzA3FPvx6Q1NH1gLSkldz3xGWajnswtBwgJMrLglVnHde225vSUsa3kYdyyCoBtJf/k0DS7RzPjS/BHdoyEGfqTXfEBEeahVFoWs7/qNXIrP8buzUVDEF6svmu5S+rO2Vb8MFZ3Nm5vDb2ibmtVHcqcFYTqQih1ljf7HLt0cNv6vzJ31CtqJskTgErySoMcHhdur4cQrQmLx97i86MNoVzUZWyLEjyAlLB1Vz5BJj3pPRMIMrfs/PZS5djOqryZ6DUxmHSp2N05NJ7gAQ4tIXlkz3eVcyNVzo1QL8favb6E7kvwGsBLsOHwmsLdI25kW8kjmHWtn9XxhV1vsd+aA4BB6Ik0RGDQ6MixNTJcqpZO6FSCP0GoJK80qNRZxeryXYRqWvZgzt29Z1LjsdM/vAuDI3s2ebzXK/n8xw306RHPgN5JaDSCJ+6dgcvl5tR6C0rkF1XyxrzfuOr8U+iWcmQ3QXmVlf25pVisDk4ffvwjTlpCI3xvPgZtOJHGEeRaPqGhFZKOT/03VS/R5nGEGg4PmUwKPZ+k0PP9cqVxsaPZWZ3FpLixnJ00kURzPACX/n5zoyNuAK7scgF7LQfoERK491oChZpPXmnUPksB1696HlftGOnmuLfvBZybPKrZx+8/WMrld82md7c4Zj99JQCTr36JGquTX+bciU6n5d6nPmfFutqHdYKNfPPWzWzdlU96WiI79xYy669z0Wk1uD1e5v73aqIigvF4vESEBbWswi3k8ToAyU/ZQ2q3+FrdrXNkGTpicFNCkK4bY1K/a2XZzfdq1vssLV7RQHQaBob3I8IQxtLi3/lb+l1khPdpt7iUhqn55JXj0j0kgdTgWPbWFDR57LiYDC7vPoE+ocktukbXpCgeumkKad0Oj0y559qJ1FgdeLxenn51EWs2Zdftq65xMOnPL+J0eYmJDKGk3IJepyUlIYJ9uaVs3pnHm5+soLLaxuL3b0enbbux+VqNEUdtX7lORHNK8hyq7NvZXHJnK0o98k3Cja98gZEtxQ9idxcwLOHtVt9wbcqWyu1135s1JpxeFx48CCDPXki0MZJ+oWmkmNVKap1d4DydovjN/ppCPti3BIfHxYvDbubi1NPr9tXvY+8bksKp0X2ZkjCUfwy4gn5hqS1+4EkIwfQJA+jTI75u29Sx6VwwdQj7cstY+PNWXG4vCTGhTBrdGwCny5cIS8otALjcHnp2ieGaC0bRNSWaUwZ145RB3aistvHu/N/Zl1t63P8XTdFrwwnS9cCsS8SsSyUh9EySQw+ta28AjH65jkYYKbB8T7l9FSsPXkCpbaVfym3Mg/18N3Q1aJiWOKFubPxZiROZkjCOJUXLGRjha9ErnZtqyStHeW/fYpYUbqBnaCKnxqQzIro33x5cg8VrZ0x0P85PGUPP0ESCdaY2i6G8soas7CJu+dMY5n69joKSagpKqhs9fvGKnQB88MVq3B4vvbrE8N6Clcz/bgNvfrKCx+6azoTR/u9W0Ag9HmnB6t6PVzqpsK+lyr4Rsy6V0clfk2/5mu2lfyNY3w+Ptwa758BxXafatanue4trB3vKXyDa3PxusZZKCUriyq4XYNKYmJRwOlUuCy7pZmLcaZi0JtxeN+PjWvdwW1ZRKdvyizhnYF91E7cNqSSvHOWGntMYFNGdEVG+lvOe6nwsXjszkkdzXY8ziTA0PgGXv1x8+9vU2FwtPs/t8bXysw6UkHWghLAQI1qtlvBQM1LKNkkmpyTN9yV4xzrWFVyHVgSj04SiEQZig8dT4biAuKAzKLEt42B1Hl3DbiCvagE6TTA2bzbgbtH1okyn0Tf6Yb/X44+mJx2eTiFMH8JlXc6re32+H556fXDBD2w5WEjfhFh6xzd/Jk+lZVSSV46SZI7ivHpTEFzWdTyTE4YSa2q/xTpjIkOosTV/7HZjqiwOuqVEcdu/PuWSs4Zyx9Vn+CG6Ixl1sQDoNCEkBE8nKeQCoswjEUJg1MbgcOezsegvjE7+mj5Rf+Wn7EEAuLy+MfMazJh13TDpYii3r8NLDQDRprGU2pejEyG4ZRVGTQpJIefRPfIGtBpft1m5bQ0ubwVxwZMbjK0z02k0tf+qVnxbUkleaZIQol0TPMA7T13JL2uycLrcPPnaj60qa3+ub86d0JC2614CX//8gLhnjtqeEDIdjdBjcGZSUXoxADoRhVv64sqIfZr4kMPTBORbvuFg9ScYdFGAl/6xT5Jd+S4Vjkz2Vf0PofHSM9LXZ76x6A5c3nImdF2HtoXDXTvatIzeSCmJCWn7T4YnMzWEUunUzrruFSqqbZiMOuyOlnVr/FGQ2cDAvkk8e/9MNO3UevTaFkLlQxB0PVjfBmysc6XSJeohdJpQtMJIuGnQEefkWxaypfj/SAm9gh4RszDqYvF4rZTb17Kn/CXSou4mqrY/vti6FKe7jOSwme1Sn87A5nRh0GnR1Ha9qf58NYRSOUFV19hxeXxj9MOCTeg0DizH0U9/iNXmZOX6/Tz47Jf8687pGA3t8OsvnYAdHF8CNtCPZFj8OyCtyMqHwXzxUafEB01BE6cjyjQavdb3CUqrCSIm6HRigk4/4tjYoPFtX4c2YHe5Oful98hIiueFS6ezr6SMFxav4I5JY+geE9noeaUWK+OeeYMxvbri8nrZcrCQT2+8HLNex9Jd+zhvcD8MOpXW6lP/G0qnVVlto8bqJD46lLTucSzP3OOXcn/N3MN9T3/Bfx6aiVbjv1HE3urnwLUZEfkGovaJWE3QTKT5PPDmg+cgwjASAOnaCI5F4MnDW/V3RNQHSNtCsM4DWUpc7M8Ibft2kbUXq9PFK0tXUm6xsq+4lFeXrsRsMPDDtt30T45jSnpv/rNoOTaHk4JqCxVWG3qtljP69uSnHXuICjZT43Bid7uotjuY8b/3OG9If+ZlbibUZGBahno4qz7VXaN0asVlFmb9dQ6FJdXccfUZvPT+z3gbfKjUi2/yr5Z9dP/3fTManAphW1YB7y9YyZ3XTCAhpnljwb0lM8C9HRG3GqGJOOaxUkpwrUdaPwH752C6FOwfHz7AMB6pG4A2rHUTkHUWTrebi16fQ1pcDH0TYnlu0XLSE2PZVVCCW0quGj2En3fu5UBZZaNlRJhNVNgOT/kQbNBT43Sh0wi+vPVKvt64g+tOG06IyT/PJpxIVHeNcsKKjQrhjccuo8bmpFtyNG9/sgKL1TedAEDvUVl4XAb2rO0Kwos+yIWr5tDUxE0n/J9+39Vgkl+6ahe/rNnDhNF9SDiteUleRH0E0tpogvdaP4GqxxFR7yMMg8AwFFl+O6AB6cZm1/L9op7s3x9KXoGObTtKSUj6H5PPHsTlV5/eYJmdncvjweOVeKUku7QCk05Plc03kVt2WQUGvRa30817v69vsqz6CR4gITSYPaUVuL2S++d/z9xZl1Jtd7ZJPU5kqiWvnFD2F+fx5KfvsvU3PcMvWkfvfoVYKszs3x1PUD8LUsK+n1IoWJsIUtusMh+8aQrhoWbGjjic7B1OF5t35TMkPcVvXTremg+g+lFE1BzQD0ZWPwP2ZeDdS37l9TzytxIOHAipd4ZvauK4WAsvvdadiKRrQLpBGBGi886xX9+U/75DcbWFVQ/dwoo9B1iwfis/bsvyW/n1J26+YEh/Plu/lf9ddi4T+zU9OV4gUS15JWC4zWWEnrKREUMFerMbKSEo3EbsoFJsXiMaPPSYnIvXo6FofdNL5Gk1gidf+xGzSc+S92+v22406Bme4d8ZFjXBVyKD/oQQGqT7AFjfBU1XiosjmPfJZg4c+OMnCt8nkZnnbiNc+wXSFgtVfwURClHvIPQD/Bqfv/2WtZ+c8kp0Gg1nvzib3IrGn1g+HnqthrS4aLblFwMQGWwmKTyU+DA1JLM+NXeNckLpGdyfO/o9idEsAA1SgkZApM5KlM5CvK4CjQZ6nXmAoPhjJxWDXotB72vtTxzdG4ezdUM0m+PQxGJC1wUR+S4i6m3++9oFfL8ojca6l+Z8MoC3Zg9h5eo4ELEgK5FlNyKdG9s83uNVbXcwZ5Uvvphgs98TPIBRp6tL8MO7JnPTuFNYcs/1ZCQn+P1aJzKV5JUTihCC1KCeeHETKSo51JNi0HgI09nRaSRa3Gi00Hfmbo61PLXT5cHmcNM1KYqFP2/lt3V726cStYRxDJ/MzWHd2mMtNgJV1Wbmf9GfD16fD7LQt1GWIGvew1vzAZ2pyxUgr6KKkU+8wrqcPADKrLYmzjg+NQ4nXaMjOCujNx9cdzHBxs65wExHU0leOeHY3DUIvATrjx4z75IaPOgAL0LTvJb5I7dNI6N3Iq/PWU6NrX1v3FWUWZp97OWXbMZqq3efwbEQqh8FV+e6j2XQaokJCWJKX1/3k9Pjr8VUfLRCYNRpOaNPD7697Wqeu/hsv5YfaFSfvHJCkmhwS9BKqP/Ao0HjBSQCiSncQ3i3SqqyI6jf2B0xIJUdewqptjp59sHz6NszgSCTge1ZBThdboLbccnBG26bgtGoZ87s5U0e+/H8DNJ6lhFkPrJlLF37QT+szeeYb64teYWUWKzUuI7/wbXGnNk/jTPT05ia0Vs96dpMneO3QlFawKwLJs0ciUl7ZIIHX/98iqGUOH01WuGl30U7GXfHbl7620XER4cCUFFtp9pa22KXvgKee2gmP86+jcgmVpOSUvJt7mZ2VxX6pS4ajeDTOb8369jdWbE8//Lo2lf1xoJXP4ws7Ie3YCRe+28AeG2L8BaNQ7q2+SXOljileyp/OWMUs8aOJNTYulFAUcFmIoN8cw6N6pbC85dMZ9qAPirBt0Cbt+SFEFOBFwAt8JaU8qm2vqYS2LIsW7B7smhs0SedBnS4icPO8ISbSQrqRq/QLlw4bQjzvlnLn88/hZc/XMY9106sW0dWq9FgNjXd5tlnKeHezM9ID09k/hk3+qU+02YM5atP1zTrWG1dF9Qf+/ElUAEV1+CN2wi2z8Cbj/QUIfTptCezQc+tZ/jejKodLW/Np0SGclrP7lw5ejA9YqNxeTxYnS7CzW07wVygatMkL4TQAi8Dk4FcYI0Q4ispZfs3L5SAYRJ6mjO/WEb4aMbGn4OUktWb9nPW+P786dwRAEw8zgVEuoZEc2e/iQyJTsXhcWHUtn68+mV/Pq3ZSX7wwKJjH6AbDkXDgdrkavsKqe+P0PqmQ5bSjRDt10v7yDkTeOKbn3F5m745PLJ7CjanG40QfJy5iQuHZwCg12oJNzfvmQflaG3dXTMSyJJS7pVSOoGPgRltfE0lwFW59hzVTdOQLMtPuL0ONu/M487HPjtiymKL1cGzby1hW1bT69fWpxUaZvU5nSJ7NUO+fpzvD25tafhHiY4N5YufHiAkpOnH8cPCg0FXuyKUiK3dWu/P2L0eX4Kv/Q9yLERWP4+UXrzVzyML05Gu7bSHDTn5uD1eVj10K/dOOa1uuwBCDL43R13tD3JcWjdmX30hn9x4GXdNGsM1pw4jLU4tJOIPbZ3kk4Gceq9za7fVEULMEkJkCiEyi4uL2zgcJRD0Cm3+wh9ur5OeXWM5a3x/Lpo6pG77ph0H+fzHDXzy7doWXdsjvVQ5bYTpTYTrTYTp/dOFoNEImhoJaTTqmHzRf8C9ErS9EXHL8a0je2jeHgBP7b+HCtOA/VNkYV9wrAME0t0+Q0Uf++YnHv92Ka//sppnf/TdWI4NCUICFqfvk0a42ffGdqifffH2LOxuN/dNHYtBp1rv/tDWSb6h9tYRv8pSyjeklMOllMNjY2MbOFxRjrSkaAGQ0mRSBFh48D6CzQb+estURgzsWrf9lMHdePzuc7j9qpatFHXvmvmM+vbf6IWWiYn96BoS3cLoGyYArb7xpCY0cNk1p6PRJSKiFyCi3gZPLmiaau3WG77oXolv5JGn0aP96V8zJvP4eVM4s39a3Sev+6eOJTE8tO6Y3vGxZCTHk54Uh9cruW3u19zx8cJ2ie9k0dadc7lAar3XKUBeG19TCXDrypehlcWENeO3N8aQ1uB2rUbDGaN6N/uaOTVlCAS9w+LZVVXEquJ9fH5gPclB4czoMphsSxkv7fiZ0bHdua3fhGaXe4jRpGf+9/eydVMOb7+8hKxd+dhr586fNG0gZ0zJYMRo37hzoe+P9OQjSyaCtie+kTYOCLoTrC/ie8s4lMjDgXozO5qvA9M5LY7veKQnxpGeGEdhlQWjTkek2cybyzPJr6zmX+dOYsvBAmaNO4XkiMMTwL1wyXT0jd1RV45LWyf5NUCaEKI7cBC4FLi8ja+pBLjb057i432zcMljPykK0DN0bKuvJ6XknCUvoxUaVp79ANNS+mNxOVhflsNLO5byVc4msmt8S/kJ4LZ+x3+t/gNT+c/rVzP7tZ9Yn7mPp166EnND4/Y1EWAYA8YxoBsM5X8GbRAibhWy7CZwH+qG+sPUvbbZSG8F0vk9GKaARo8Ie6RNJzxze704XG7yXdUYaz+thJoM/HPG0evSTunf8JuycvzaNMlLKd1CiL8AP+AbQvmOlLL1d6qUk1qoPpKLuv2HLw7cjdVT0uhxQZoYUkManJiv2b7N3cI3uZu5sOtQTFo9N6z4gNUl+wGYkpiOTmiYkphOldvOTb1PJ8zgn3VWN204wPYtB7FZnQ0meSHMiKh3D29IqDdgLfxhZPl94P3jbI860A8Fx2e+l84lIKuQwbMQui5ITyloIv36UJXL4+GeT77hnIF9OW9If0b1SMUrZd3Mnlani9zySnrHq5usbaXNPxdJKb+VUvaWUvaUUj7e1tc7GWVtOsCzf5lN3t4mhtcFkAhDKuYmVk6SzRi215QvD2zg54KdzOw6lHszpmB3Hx73/XvxHtzSyylx3Xlk8HTig8Ix6/zztOxTL1zBvG/vISo6pOmD/0DoM0Ac6q6pd1tMhCAiX6aubSerfPvLrkM61yOLRyMr729t6Edwuj1szStid1Epo3t2QQhxxNTNDy/4kRkvf8DGnHy/Xlc5THV+BYBHr36dJfNW8s6jCzo6lHbl8Bx73hcbpXhl624yPjXsfCL0Zh5e9wUA01MH1u2rdjt4ceQlnBrnm7t8v6UUh8c/j/IbjDoio1oxZW7IvWCeyeE/cQGGEUjpBurP6SPBa0N6a58Atv9w/NdsQLDRwIoHbmLuDZc2uH9Kei9GdU+lS1SEX6+rHKbmrgkANz95CQteW8yoaQPxeLxoT4IbVxZXMRbPsacWGBh+IRrRumF44QYz0aYQQmuHSl7R8xQqnVZsHhdrivfz4LoF/HhwGxUuG8uLsjg7JYNnhl/Yqmv6g8Y8GcyT8Wq7gOVFCP0bWF6G4tFACGABTIAdKALLYxD8F9C0/JNDU0KPsRzftAF9mDZArcnallSSDwAxiRFsWr6LTct3UXiglAGje7Pqx038OGcFL//8V+JSojo6RL/TCSPh+hRqXKW4aXgq2+Tgwa2+jkZo+HrirZQ7ajhYU86/t/zA4vwdRxyz8OBmACIMZk6P61w3DoW+PxIN4AR56P6Ftfbf2uX0jDPAOAahjUWWz8KriUdjVjM7BgqV5E8wToeL3D2FfPfer+j1WpZ9kUlZYVXd/h/nrODDfy+kz7Bu2Cx2PO72GRPd3nZUfU+lK5eM8PPYUvlFg8cszf8v3UPH+OV6l/3yFgdqyo/YpgF0QotTejBr9JyXOrjTTZwljOMQtTdlpflipHRAzVtgnQdU+x6qingaIQTe4umAC+y/IXVdOv3KU0rzqCTfiWXvzOODf3/N5EtPpe+w7twx5QkKD5Q1evyoaQNY+Z2vVWmrtvPM1/fgPI4Jok4EvcMmYXNXIvEwLOpK1pbN5ci+ZkgJGeq36wXrjuxyMKDFiQdnbZ+/zeviw72rcEsvZ6VkoO0k0/7WJzTBCIIh7D7f11EH6IAIcMxHerYiYr5s7xCVNqCSfCfltLt4cObzlBdV8dvX69EaNHicx1584VCCByjMKeXuac8AMHvtY8R3CawhakG6KLqHjuHzA7cCoMFQ/9lOwnSJhOj89wR177A4dlcW4a69SkpwBHtrSo88SEr+PujsTpngm0NEL0BKL8L+Mej6A+B1rAfLsxD2JBq9f9e8VdqHSvKdiJSSl++bS3BEEGUFFZQXHe6GaSrB/1FwmJnoxAhiEiMpLawMuCQPEG/qy/j4e9lZtQiPdFFkPzxW3OIuZn35HEbGXIVW0/phjQdqyusSPMBBa+VRx7iRzM76nQ1luXQPiabAVklKUCTX9T7tqGM7IyEEQmgh6E+HN1rfBNcasLwAkc91XHDKcROdaX3I4cOHy8zMzrWUWXuyVtu4oMddfikrbVAXXlz8EDeMfoTcrELmbnuaiNiwpk88Qf1e+DrrK+ahw0zPsNNJMg8i0tiFBHN/v5Rf43Jw7pKXybdXoeGIGWEalGyO4KCtgkRzOEvO9M/PtCN4nZug8i4IexSN8dSODkdphBBirZSywSf/VEu+E8nanNP0QU0QGpBeGHmmbzz3jFkT2LMph9Ao/w+N6yxcXhvrKz7GrI3gsu7vYdL6/81sR2UBFU7fqJRjJfhxcWncN+BMQvRGKpw2gv30cFRH0RgGQuySjg5DaQWV5DuB6vIa/n75/9ixdl+ry5K1Gah7P9+MztOvGdfqMjs7vcbMuSnPYdSGtkmCB/i5YBc2b9MLg2uEoHuor2ss1hTaxNGK0vZOzDtEAWTZF5lcN+rv7Mjc94dJmFvnuw+WM++F7/1XYCeXEjyUWJP/x6gvK9jFvuoSZvU+jRn1nnZtTJmjxu8xKEprqJZ8B3vzb59SXea/xGAw6YmMC2PtT1spyi3lkjum+q3sk01uTTk3r5xD77A4iu0WatxNz3qZ84ex9IrS0VRLvgP9PH8VIRFBfi3zukfOp/BAKcFhZp7+8h6/ln2ySQwK58bepzM5sR/lTisub9MPlpW5rNyxah7/WP81b+9a3g5RKsqxqZZ8OyvILuGWcY9y6vQhLJm30u/lDx2fzq1PX0Z4dAgRMapPuDW0QsMd6ROpdtkptFVT5bazonAPFk/DLXozOmy4WZTvW0M1wRx2wgyfVAKXSvLtzGaxY7M62iTBp/SKJ6VXAim9Evxe9sksVG+ia2gUz21dfMzjbLVP3J4e14t7M6ac8CNrlMCgumva2T+vfBWtTkNIhH8WlzAFG7nvtWtJ7Z3AQ2/f4JcylaNNSOjLoMgUzBo9Zq2eoRGpjR4bbwojLSyOpKCI9gtQURqhknw76zu8OwNP7c0pZzY9UqM5nHYnuzdmk7OrgFvPeJyc3QV+KVc5UvfQGOLModi8LmweF+sqGn+mYf6BdeyuOvY0yIrSXlSSb2cPvHE9T8y/E28rVi2KTgznxscvYvS0QWg0GqZfM47zbpyAOdh4Uswl31Gmpwzgvv5TmnXszSvntnE0itI8alqDDmCz2JnZ/c4Wn3foadbhkzJ4dO5fAN98N51tettA5JVeMr78F4LmPc7w2OAZ9I2Ip194ovr5KG3uWNMaqGZfB1j47jISu0UDYA5pfNUcgNPPGcJ1/5gJwIDRvXlp8UM8/NbhvneVQNqHRmh4ethMLu42nHOP8VCUFsGAiGTe3P0rFy59g69yNjZZ9ke71nHTss9weJp+olZRWkqNrmln2TvyeP/Jr3C7PHyy+zleuf9jln2RifRKDEF6nFYXeqMOl8ONKcjA9f+6iLiUKM6/cSIarUYl9Q40PXUgExP7csUv7zQ6SZkHyeaKgwAMjEwmIzK5yXI/27uZ9SV5FNsspIRE+DVmRVFJvp0tX7get8vDpfecRWhEMONmjmDM9CF43F66pSfxw4e/8af/O5vsHfl0S08mKMS3tqhW17q1ShX/WFOSzfaqxm9u64WGO9Mn0Tcigd8Ks4g1HntiOIfHzTnd0nlgyBmkhESwpvAAOo2WIbFNvzkoSnOoJN/OLrhlMmkDuzD0jHSsFjv/vOIVIuPCmLP1aQBmPXoRAOkje3ZkmEojHl73xTH36zVaLu0+nKe3/Mi8/Zn0j0hiWkpGo8cvzN7OvzIXc13fEfSPSuDiRR8BsOWSewjW+8bZf7hrHe9sX82Hky4nKThwp4tW2oZK8u3MFGRg5BTf2pk6vZZbn76M6ITwDo5Kaa5b+o7n6c3f45AeeofGkWetwOJx1u1PDYrEpNVza9/xDIxMZmJi32OWNzG5Fzemj+KSXoMI0unpHxmP0+vBpD38p7mtvJB91eWUO6wqySstpkbXKEoL3Z/5OV/nbiJaH0Spy3rU/gu6DsHj9fLAgKmEGVr/0FuxrYaLf/iAYL0BvVbLJ1OuQK9R3XfKYWp0jaL40aHWeXxQOAMiko7YF6oxsLJoH1/kbGRLRV6rr1XhsJFTXc5+SznbywvZXJqP23v4lu+W0gJu+eVz8mqqjlGKcjJTSV5RWijeHIoAdELDTX3GEqz19Z33C08gMcS37N9DGVPpEhSJsxXDIlcVHmDIp89z0y8LAN9oHo+UmLQ6Ptq5jvt//4Zvsrfz3YGdrCzM9kPNThzV1XY+W5DJ1Te8xZ69RR0dTqem+uQVpYWCdUYksKniIClBkYQbzMRpQ9leWYBJ4/uTqnLZmbL4Rc5KzuDZERce13W0QhBpMFNst2DUaEFKHNLLS5t/46XNv+GWXgZFJTAwKoHpXfr5sYad31PPfsOKlVkArFu/n6W/7ODyS0ZhNqtJ4f5IJXlFaSGn10NKUATdQ2LYWJ5Dnq2S4VFdSIgN5/fivRiElp8LdpIRkcSo2O7HfZ2HVn1PudPG4yOn8vDq7zn0hMR/N/1ad8zGMt9wzinfvMnSGTe3plqdVkWFlVm3ziYk2MjIkT0x6LXk5JYy+pSeXH/NOD6Ys4Klv+yga5doJk3wz8LtgUQleUVpoXWlB8i1VnBt2hhWFO0FIM9WybeTbmN5URaPbPgajRDMGz+rVde5pNcgfi/I5vsDO4Cjp1MI1uqoqe0OCtEd+8npE43N5uTl15aQX1DBjp35WG0uikuq2ZddUndMTm45UycPYM8+X3fNoiVbVZJvgEryitJCl/UYweCoFNIjEpmeMoBlhbvJs1XiRTIhsS9nJPTxy3Wu6zcSt9fLU+t/5uo+w5m988iRZzX1+vuv7j2MW5ct4NSErqRHxdMnMpagE3g++yeeXsjyFbubPO6Rx74AQAiYeV6Dg0tOeirJK36TW1RB5o4cpo/pj66J2TDtDhd2p5uIUP/Mq9+etEJTN11BiN7EvHE3UON2YNLqAf/OJ/TnPsNIDYlgQnJPfsjZSb61+qhjzELH/636FoBvc3yt/oyoeOZM+hOhhhOjhe9yeZj32WrefveX4zrfYNCRGK+eN2mIGl2j+EVZlZW//PczHnt/EXe+uIDfNu87Yv9HP2Ry2T/ep7TSt2j5df+ex5S7X8NibXpx7M6uV1gcg6IaX0SkNcw6PWd17YtJp2dkXMPXsMkjR/AIYEtZIUsONt0S7iwWfrfhuBM8gMPh5mCeWkS9Iaolr/jF96u2k1tciVGvZeXWbFZuzSYs2Mj8f13Nva98xaY9+bXH7aBvl1i8Xi8ZPRIwGk7sX0Gb24m5HbpF1hcfJMJg5u/DJvHR7nXsqyprcII08PXdB2n1LMvdw/iknkQYO9enpYoKKwu/3UBaWjxpPeO5/e4POZhf2aoyp0zqz4dzf8do0jN0cFc/RRoYVEte8YsFv2wGICHq8GP3VTUOHvtgcV2CB/jvJ8t4bt4ydueWcOvM09CfwBOvvbbzF4YtfII5e1cx+pt/szhve5td683tq3hv11rSImJYfO6NjEvyzW3UWMeQ1ePii+xtjPr8JVYVZjNy/ou8tGl5m8XXEs/89zvefu9XHvjrfK66/q1WJfiwUCNCwI6dBWzbkcf6DSfX8wLNoZK80mq7cooJMhpIiAwhu/DIj8y/bNhz1PFZucUkRofxz3d+oKzq6GkBThRxphCiDMF4JVS6bFQ4264u/xg+hVfGns+pCd0AyKosQYNocgETh8fDpYvmUGyvochuabP4WkKr9b01CQGWmtZ1140elUaP7rEMGpjCO69fy9VXnuaPEAOKmrtGabVrn5x7RGu9ObQagccrufX807j6rBEn/Dz5Do8LY+2N1/ZQ5bSzuiiHu5Z/hcXtmyCtsTnuAcwaHRNTevHi6ed16P91cXEVl1z5Kv5IOzqdBhD8uPCeE/73p7XabO4aIcRFQoitQgivEGL4H/Y9KITIEkLsFEKc2ZrrKJ3bxGFphJibP4ojOsyMp3aN25cXLGfZ+qNb+yea9kzwAGEGE5NS0pjZY0DdtsYSPIDN62bhgR3csHQ+1c6Ou9m9ZdtBvyT4pMQIPnhnFu+/ff1Jn+Cb0tq7XluAmcDr9TcKIdKBS4H+QBKwWAjRW0rpaeX1lE7C7fFy/kPvYDbq2ZtX2qJzS6tshAUZqaodWXPvK19x44zR3HDO6LYINaD9c+QULuk1iHe2r+azfVsACNUZqHY7Gzx+ycEs3ty+irGJPRgWm0y1y0Go3thuiXLL1txWlzFiWHf+dNloEtSQyWZpVUteSrldSrmzgV0zgI+llA4p5T4gCxjZmmspnY/XK9E3MR6+MVVWB6H1Wv+vf/k7v27c66/QTirpUfE8MGxC3Wur20n30MhGj39p829c9OMHPL1hKYM++S9vb1/dHmEC4HId6/PGsfVJS2DRN/fy9BMXM2hA2wxZDURtdeM1Gcip9zq3dttRhBCzhBCZQojM4uLiNgpH8TedVsM3z9zAR49cidlwfCNkqm1HdhscuiGntFyMKZjPz7ySobHJ9ImI45Keg5o8Ryc0xJtDSAlpnxax0+lm3Yb9tX3pzXPoA8Zll5zCa/+7Ct0JPBqrozT5vy2EWCyE2NLA14xjndbAtgZ74qSUb0gph0sph8fGxjY3bqUDzV28jp/X+R60kVJyxtC0Vpd59VkjOTXj+CfzOtltKs1n5g8f0DUkkm+mX0dCcCgAukYGWZo1Ov63ZQUPDZ3A1C598Xi9PLN+KYtz/P8AVUFBJVl7CpFSUlFhIzjIyLF6h8ad3huAsDATUkK/volcd9VYv8d1smiyT15KOek4ys0F6n+eSgFav4KC0uEsVgfPfbyUyFAzB4sr+WH1TrZnF7aqzIweCVwwdqCfIjw5JQaFMig6kTEJvgeBrC4XAO4/tK1MGi12r4dgvRG7w8Ob21fj9HowarS8svV3+kTEMim19W/a9d1x70cUFVez8PM7+XL+7Wg0goKCSv76z8/o3SuB/QdK2LHTN5tmbEwIN91wBl27xDBqZE8iI4OJigxGe5zdgoqfhlAKIZYC90opM2tf9wfm4OuHTwKWAGlN3XhVQyhPDMs37WX2t6vZkJVHTHgQJZWtHx8+JqM7L9x5vh+iUwBK7VZe3LSc/lHxbCsrZF7WRuzew9MffDzpcv780zwSgkI5YKkgOTiMx0ZOpUtoBD3Cov0ay2dfZHLwYDm33TKpwRu8FRVW8goqSIgLIzIyWI2WOQ7HGkLZqiQvhDgfeAmIBSqADVLKM2v3PQxcC7iBO6WU3zVVnkryJ479BWV8vHgd85du8luZs84dzaxz1Qgbfxr3xascsFQAEGkwIQGDRkeE0cSuyhKCdQZGxKVwc8apjc6No3R+x0ryrRpCKaVcACxoZN/jwOOtKV/pvLolRDG8byrzl26qe7CptapqbH6ITKnvjoGns728kKv6DCMlJAKAu3/7mgW1wy1r3E42luaTFBTKktzdbCjJ486Bp6PVqO6RQHFizw6ldCiDzvfrM35oL5ZkHv8NuzMG9+DKaSNJ7xrvr9CUWjN7ZAAZR2y7sEcG32TvwOV1Y9BoKXfYmPnD+0QYzOyuLCG/popnx5zTMQErfqferpXjNqR3Mj2To9m27/hvvOq0gsdmnc3AnklqeFw7+b3wAE6v75asw+tBKwTFthqSg8IQQG5NFU6Ph/FfvMo1P83r6HCVVlIteeW4hQaZ0Go0FJZVE2TUYXW4mz7pD9weya8b9zJphH9WU1KadnnaEAwaLX0j4thRWcS+qjIW5exmaf5eTonrwgeTLsUrJZVOO9WuE3++/5OdmqBMaRW7w8XGPXnc+p/PjruMIWlJvHn/pX6MSmkpt9fL7B2ZdcsHAni8XjRCqNEuJ4A2u/GqKCajnkG9GnyYudkmDOvtp2iU46XTaLg+/ciZR9TN18CgfopKq5kMOrSa42/tPffx0hZPcqYoSvOoJK/4xaPXn0VcREiTC3j/UbDJQEpsOKFBJ8aC0ycTKSVvblvFktwTZ61Y5Wiqu0bxiykj+zB+SE8eev0bljawGlRj/nfXTAb0TGrDyJTjVeqw8sS6n0gJDmdiin+nOlDaj0ryit8UV9SwdMMeYsKDKamsqdseHmyksoFl3rrER6gE34nFmIJ5Y9yFJAaFNnrMu9vXYNBq+VPvoe0YmdISKskrfpMcG877f72cuMhQSiosbMw6SG5xJZv35lO5t+CIY+++ZBzDeqdid7gwGdt3VSWl+SY3MFmZV0ryaqpIDg7j0bWLMWl1Ksl3YmoIpdKmxt76ElaHi96psZya0Y0Pf8zE7ZEkRIVSUFbNxGFp/Ptm9XTlieTVLSt4esMyXhs7k1hzMFqhYVCM+kTWkdpsjVdFORYpJS6PbyWgXTnFXDpxCP26JgBgtbsY1ieF8UN6dWSIynHoH5VAWng0XUMjGRqbohJ8J6e6a5Q2NaBHIoVlVYQFmwgyGXj3ocvweH2JX43DPjGNTerBj0mzOjoMpZlUklfajBCCN+67+KjtKrkrSvtRf22KoigBTCV5RVGUAKaSvKIoSgBTSV5RFCWAqSSvKIoSwFSSVxRFCWAqySuKogQwleQVRVECmEryiqIoAUwleUVRlHYmpWTdb7uwVNna/FoqySuKorSzzF928vA1b/PGE1+3+bVUklcURWlnfQamMn76YKZcOKLNr6UmKFMURWlnYZHB3P+fy9rlWqolryiK0kper5c1y3ZQY7HXbbNbnVw84h/cf8XrHRiZaskriqK02jdzVvLKv75k2qWncPalo9iwMovMX3ZSXWlj0+q9XHHaY/Tqn8LIM/oy7ZJTEEK0W2xq+T9FUZTjsPyHzTx550cMHNmDDb/vafZ5F90wjmv/76y615tW7UFv0NFvSNfjjkUt/6coiuInedkl/P2Gd1j58za8HtmiBA/w6/ebkFJSVlSFx+Pl/ivf4O5LXqG0qLJN4lXdNYqiKE0oK6ri0b+8z5gzBzD7ue/xuL3HXVZBTjln9XkAgAefvxydXoPb5eW+P73O24vu81fIdVSSVxRFaYTT6eZv173NgT1FVJRY2LEhx3+FC4hPieKp92/kkRvfJbFLtP/KrkcleUVRlAZ4PF7W/rqLTav2tkn5E84dQp+BqQDMz/xnm1wDVJJXFEU5SkFOGa8++iWrl+5ok/JTesRy/f1nt0nZf6RuvCqKotRTkFvGnJcXt1mCDwo18sTs64mMCW2T8v9IteQVRTlpbVq9l4eveYtr7plGaVElYRFBzP7PDxjNer9fa9zZg0juHsM5fzqViOgQv5ffmFa15IUQzwghdgghNgkhFgghIurte1AIkSWE2CmEOLPVkSqKoviZ9Eq8Hi9b1+7j83d+5WB2KQAOm8vv17rwhnFcefuUdk3w0PrumkVAhpRyILALeBBACJEOXAr0B6YCrwghtK28lqIoil8NGtWThdufJG1ACsGhJuw2B6ERQX4p+7xrTuPTzEd4Yvb13P3UxfTsl+SXcluqVd01Usof671cCVxY+/0M4GMppQPYJ4TIAkYCv7fmeoqiKP4mhCB7VwE11XZ+/Xaz38rN219KSFgQQ05N81uZx8OfN16vBb6r/T4ZqD+gNLd2m6IoSqficrrp1jeBS285AwC9QYtoaWYUkNorFoApFw7n1Cn9mXJhg7MMtLsmW/JCiMVAQgO7HpZSfll7zMOAG/jo0GkNHN/gJDlCiFnALIAuXbo0I2RFURT/Wb9iN7Of/QGA+JQIevVPYfVP23F5PRjNOhw295EnCOqymUYLZ18+mmvvncbSrzfywl8/Y9va/bz5w/+1byWOockkL6WcdKz9QoirgOnARHl4trNcILXeYSlAXiPlvwG8Ab4JypoRs6Ioit8MGt0Lc7ABW42TR165mu59E3nqrjks+2YjqT3jydpysO7YmIRwSgureOWbO3E53KRlpNTtm3zBcBAwYESPjqhGo1o1C6UQYirwH2CclLK43vb+wBx8/fBJwBIgTUrpOVZ5ahZKRVE6gtfrpabKfsRNV4fdxbvPfsfqpdu57r6zCQoxkjG8O06nm+AQUwdGe7RjzULZ2iSfBRiB0tpNK6WUN9XuexhfP70buFNK+V3DpRymkryiKErLHSvJt3Z0Ta9j7HsceLw15SuKoiito6Y1UBRFCWAqySuKogQwleQVRVECmEryiqIoAUwleUVRlACmkryiKEoAU0leURQlgLXqYSh/E0IUA9kdHccxxAAlHR1EOzgZ6nky1BFUPQNNY/XsKqWMbeiETpXkOzshRGZjT5UFkpOhnidDHUHVM9AcTz1Vd42iKEoAU0leURQlgKkk3zJvdHQA7eRkqOfJUEdQ9Qw0La6n6pNXFEUJYKolryiKEsBUklcURQlgKsk3QQjxjBBihxBikxBigRAiot6+B4UQWUKInUKIMzswzFYTQlwkhNgqhPAKIYb/YV/A1BN8K5rV1iVLCPFAR8fjL0KId4QQRUKILfW2RQkhFgkhdtf+G9mRMfqDECJVCPGzEGJ77e/sHbXbA6quQgiTEGK1EGJjbT3/Wbu9RfVUSb5pi4AMKeVAYBfwIIAQIh24FOgPTAVeEUJoOyzK1tsCzAR+qb8x0OpZG/vLwDQgHbisto6BYDa+n1F9DwBLpJRp+JbhDIQ3NTdwj5SyHzAKuLX2ZxhodXUAE6SUg4DBwFQhxChaWE+V5JsgpfxRSnloufaV+BYlB5gBfCyldEgp9wFZ+Na0PSFJKbdLKXc2sCug6okv9iwp5V4ppRP4GF8dT3hSyl+Asj9sngG8V/v9e8B57RlTW5BS5ksp19V+Xw1sB5IJsLpKH0vtS33tl6SF9VRJvmWuBQ6tVZsM5NTbl1u7LdAEWj0DrT5NiZdS5oMvOQJxHRyPXwkhugFDgFUEYF2FEFohxAagCFgkpWxxPVu1xmugEEIsBhIa2PWwlPLL2mMexvcx8aNDpzVwfKcej9qcejZ0WgPbOnU9mxBo9TlpCSFCgM+AO6WUVUI09KM9sUkpPcDg2nuBC4QQGS0tQyV5QEo56Vj7hRBXAdOBifLwgwW5QGq9w1KAvLaJ0D+aqmcjTrh6NiHQ6tOUQiFEopQyXwiRiK9FeMITQujxJfiPpJSf124OyLoCSCkrhBBL8d1zaVE9VXdNE4QQU4H7gXOllNZ6u74CLhVCGIUQ3YE0YHVHxNjGAq2ea4A0IUR3IYQB303lrzo4prb0FXBV7fdXAY19YjthCF+T/W1gu5TyP/V2BVRdhRCxh0bzCSHMwCRgBy2tp5RSfR3jC9+NxhxgQ+3Xa/X2PQzsAXYC0zo61lbW83x8rVwHUAj8EIj1rK3PWfhGSu3B11XV4TH5qV5zgXzAVfuzvA6IxjcCY3ftv1EdHacf6nkavi62TfX+Ls8KtLoCA4H1tfXcAvy9dnuL6qmmNVAURQlgqrtGURQlgKkkryiKEsBUklcURQlgKskriqIEMJXkFUVRAphK8oqiKAFMJXlFUZQA9v9pn2i6ejc3dAAAAABJRU5ErkJggg==\n", 351 | "text/plain": [ 352 | "
" 353 | ] 354 | }, 355 | "metadata": { 356 | "needs_background": "light" 357 | }, 358 | "output_type": "display_data" 359 | } 360 | ], 361 | "source": [ 362 | "plt.scatter(data[0,:],data[1,:],c=gmm_labels, s=1)" 363 | ] 364 | }, 365 | { 366 | "cell_type": "code", 367 | "execution_count": 18, 368 | "metadata": {}, 369 | "outputs": [ 370 | { 371 | "name": "stdout", 372 | "output_type": "stream", 373 | "text": [ 374 | "GMM NMI:0.9513343588873828\n" 375 | ] 376 | } 377 | ], 378 | "source": [ 379 | "gmm_nmi = normalized_mutual_info_score(gmm_labels.astype(int), np.array(labels),average_method='arithmetic')\n", 380 | "print(f'GMM NMI:{gmm_nmi}') " 381 | ] 382 | }, 383 | { 384 | "cell_type": "markdown", 385 | "metadata": {}, 386 | "source": [ 387 | "Even when using the correct K for K-means and GMM, the DPGMM outperform them." 388 | ] 389 | } 390 | ], 391 | "metadata": { 392 | "@webio": { 393 | "lastCommId": null, 394 | "lastKernelId": null 395 | }, 396 | "kernelspec": { 397 | "display_name": "py36", 398 | "language": "python", 399 | "name": "py36" 400 | }, 401 | "language_info": { 402 | "codemirror_mode": { 403 | "name": "ipython", 404 | "version": 3 405 | }, 406 | "file_extension": ".py", 407 | "mimetype": "text/x-python", 408 | "name": "python", 409 | "nbconvert_exporter": "python", 410 | "pygments_lexer": "ipython3", 411 | "version": "3.6.11" 412 | } 413 | }, 414 | "nbformat": 4, 415 | "nbformat_minor": 2 416 | } 417 | -------------------------------------------------------------------------------- /examples/multi_process.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "#### Multiprocessing example\n", 8 | "\n", 9 | "In this example, we will Distributed the computation over several processes" 10 | ] 11 | }, 12 | { 13 | "cell_type": "code", 14 | "execution_count": 1, 15 | "metadata": {}, 16 | "outputs": [], 17 | "source": [ 18 | "import numpy as np\n", 19 | "from matplotlib import pyplot as plt\n", 20 | "from dpmmpython.dpmmwrapper import DPMMPython\n", 21 | "from dpmmpython.priors import niw\n", 22 | "from time import time" 23 | ] 24 | }, 25 | { 26 | "cell_type": "markdown", 27 | "metadata": {}, 28 | "source": [ 29 | "Generate some high dimensional data" 30 | ] 31 | }, 32 | { 33 | "cell_type": "code", 34 | "execution_count": 2, 35 | "metadata": {}, 36 | "outputs": [], 37 | "source": [ 38 | "D = 128 # Dimension\n", 39 | "K = 20 # Number of Clusters\n", 40 | "N = 200000 #Number of points\n", 41 | "var_scale = 0.1 # The variance of the MV-Normal distribution where the clusters means are sampled from.\n", 42 | "data, labels = DPMMPython.generate_gaussian_data(N, D, K, var_scale)" 43 | ] 44 | }, 45 | { 46 | "cell_type": "code", 47 | "execution_count": 3, 48 | "metadata": {}, 49 | "outputs": [], 50 | "source": [ 51 | "prior = niw(1,np.zeros(D),D+3,np.eye(D)*1.0)\n", 52 | "alpha = 10.0" 53 | ] 54 | }, 55 | { 56 | "cell_type": "code", 57 | "execution_count": 6, 58 | "metadata": {}, 59 | "outputs": [], 60 | "source": [ 61 | "tic = time()\n", 62 | "results = DPMMPython.fit(data,alpha,prior = prior,iterations=200)\n", 63 | "toc = time()-tic" 64 | ] 65 | }, 66 | { 67 | "cell_type": "code", 68 | "execution_count": 7, 69 | "metadata": {}, 70 | "outputs": [ 71 | { 72 | "name": "stdout", 73 | "output_type": "stream", 74 | "text": [ 75 | "481.3736569881439\n" 76 | ] 77 | } 78 | ], 79 | "source": [ 80 | "print(toc)" 81 | ] 82 | }, 83 | { 84 | "cell_type": "code", 85 | "execution_count": 8, 86 | "metadata": {}, 87 | "outputs": [ 88 | { 89 | "name": "stderr", 90 | "output_type": "stream", 91 | "text": [ 92 | "/home/dinari/anaconda2/envs/py36/lib/python3.6/site-packages/julia/core.py:689: FutureWarning: Accessing `Julia().` to obtain Julia objects is deprecated. Use `from julia import Main; Main.` or `jl = Julia(); jl.eval('')`.\n", 93 | " FutureWarning,\n" 94 | ] 95 | } 96 | ], 97 | "source": [ 98 | "DPMMPython.add_procs(4)" 99 | ] 100 | }, 101 | { 102 | "cell_type": "code", 103 | "execution_count": 11, 104 | "metadata": {}, 105 | "outputs": [], 106 | "source": [ 107 | "tic = time()\n", 108 | "results = DPMMPython.fit(data,alpha,prior = prior,iterations=200)\n", 109 | "toc = time()-tic" 110 | ] 111 | }, 112 | { 113 | "cell_type": "code", 114 | "execution_count": 12, 115 | "metadata": {}, 116 | "outputs": [ 117 | { 118 | "name": "stdout", 119 | "output_type": "stream", 120 | "text": [ 121 | "320.60466051101685\n" 122 | ] 123 | } 124 | ], 125 | "source": [ 126 | "print(toc)" 127 | ] 128 | }, 129 | { 130 | "cell_type": "markdown", 131 | "metadata": {}, 132 | "source": [ 133 | "When working with large datasets, using multiple processes could increase performance." 134 | ] 135 | } 136 | ], 137 | "metadata": { 138 | "kernelspec": { 139 | "display_name": "Python 3.6.8 64-bit ('py36': conda)", 140 | "language": "python", 141 | "name": "python36864bitpy36conda05fe657eec56468098aba7ffec2c4b33" 142 | }, 143 | "language_info": { 144 | "codemirror_mode": { 145 | "name": "ipython", 146 | "version": 3 147 | }, 148 | "file_extension": ".py", 149 | "mimetype": "text/x-python", 150 | "name": "python", 151 | "nbconvert_exporter": "python", 152 | "pygments_lexer": "ipython3", 153 | "version": "3.6.8" 154 | } 155 | }, 156 | "nbformat": 4, 157 | "nbformat_minor": 2 158 | } 159 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | import setuptools 2 | 3 | import os 4 | from io import open # for Python 2 (identical to builtin in Python 3) 5 | 6 | from setuptools import find_packages, setup 7 | 8 | 9 | def pyload(name): 10 | ns = {} 11 | with open(name, encoding="utf-8") as f: 12 | exec(compile(f.read(), name, "exec"), ns) 13 | return ns 14 | 15 | 16 | # In case it's Python 2: 17 | try: 18 | execfile 19 | except NameError: 20 | pass 21 | else: 22 | def pyload(path): 23 | ns = {} 24 | execfile(path, ns) 25 | return ns 26 | 27 | 28 | repo_root = os.path.abspath(os.path.dirname(__file__)) 29 | 30 | with open(os.path.join(repo_root, "README.md"), encoding="utf-8") as f: 31 | long_description = f.read() 32 | 33 | 34 | ns = pyload(os.path.join(repo_root, "dpmmpythonStreaming", "release.py")) 35 | version = ns["__version__"] 36 | 37 | 38 | 39 | setup(name='dpmmpythonStreaming', 40 | version=version, 41 | description="Python wrapper for DPMMSubClustersStreaming julia package", 42 | long_description=long_description, 43 | long_description_content_type="text/markdown", 44 | author='Or Dinari', 45 | author_email='dinari@post.bgu.ac.il', 46 | license='MIT', 47 | keywords='julia python', 48 | classifiers=[ 49 | # How mature is this project? Common values are 50 | # 3 - Alpha 51 | # 4 - Beta 52 | # 5 - Production/Stable 53 | 'Development Status :: 3 - Alpha', 54 | 55 | # Indicate who your project is intended for 56 | #'Intended Audience :: Developers', 57 | 58 | 'License :: OSI Approved :: MIT License', 59 | 60 | # Specify the Python versions you support here. In particular, ensure 61 | # that you indicate whether you support Python 2, Python 3 or both. 62 | 'Programming Language :: Python :: 2', 63 | 'Programming Language :: Python :: 2.7', 64 | 'Programming Language :: Python :: 3', 65 | 'Programming Language :: Python :: 3.4', 66 | 'Programming Language :: Python :: 3.5', 67 | 'Programming Language :: Python :: 3.6', 68 | 'Programming Language :: Python :: 3.7', 69 | ], 70 | url='https://github.com/BGU-CS-VIL/DPMMPythonStreaming', 71 | project_urls={ 72 | "Source": "https://github.com/BGU-CS-VIL/DPMMPythonStreaming", 73 | "Tracker": "https://github.com/BGU-CS-VIL/issues", 74 | "Documentation": "https://bgu-cs-vil.github.io/DPMMSubClusters.jl/latest/", 75 | }, 76 | packages=find_packages(), 77 | install_requires=[ 78 | 'julia','wget' 79 | ], 80 | extras_require={ 81 | # Update `ci/test-upload/tox.ini` when "test" is changed: 82 | "test": [ 83 | "numpy", 84 | "ipython", 85 | # pytest 4.4 for pytest.skip in doctest: 86 | # https://github.com/pytest-dev/pytest/pull/4927 87 | "pytest>=4.4", 88 | "mock", 89 | ], 90 | }, 91 | ) --------------------------------------------------------------------------------