{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# [NTDS'18] milestone 3: spectral graph theory\n", "[ntds'18]: https://github.com/mdeff/ntds_2018\n", "\n", "[Michaël Defferrard](http://deff.ch), [EPFL LTS2](https://lts2.epfl.ch)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## Students\n", "\n", "* Team: 6\n", "* Students: Gabor Csordas, Maëlle Le Clainche, Nicolas Fontbonne, Marie Sadler\n", "* Dataset: Flights routes" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## Rules\n", "\n", "* Milestones have to be completed by teams. No collaboration between teams is allowed.\n", "* Textual answers shall be short. Typically one to two sentences.\n", "* Code has to be clean.\n", "* You cannot import any other library than we imported.\n", "* When submitting, the notebook is executed and the results are stored. I.e., if you open the notebook again it should show numerical results and plots. We won't be able to execute your notebooks.\n", "* The notebook is re-executed from a blank state before submission. That is to be sure it is reproducible. You can click \"Kernel\" then \"Restart & Run All\" in Jupyter." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## Objective\n", "\n", "The goal of this milestone is to get familiar with the graph Laplacian and its spectral decomposition." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## 0 Load your network" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*If you get a `No module named 'sklearn'` error when running the below cell, install [scikit-learn](https://scikit-learn.org) with `conda install scikit-learn` (after activating the `ntds_2018` environment).*" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "from scipy import sparse\n", "from scipy import linalg\n", "import scipy.sparse.linalg\n", "import matplotlib as mpl\n", "mpl.style.use('seaborn')\n", "import matplotlib.pyplot as plt\n", "from sklearn.cluster import KMeans\n", "# for ground truth checking\n", "import pandas as pd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*Let's denote your graph as $\\mathcal{G} = (\\mathcal{V}, \\mathcal{E}, A)$, where $\\mathcal{V}$ is the set of nodes, $\\mathcal{E}$ is the set of edges, $A \\in \\mathbb{R}^{N \\times N}$ is the (weighted) adjacency matrix, and $N = |\\mathcal{V}|$ is the number of nodes.*\n", "\n", "*Import the adjacency matrix $A$ that you constructed in the first milestone.\n", "(You're allowed to update it between milestones if you want to.)*" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "adjacency = np.load(\"adjacency.npy\")\n", "adjacency_unweighted = np.copy(adjacency)\n", "adjacency_unweighted[adjacency_unweighted!=0]=1\n", "degrees = np.sum(adjacency_unweighted, axis = 0)\n", "n_nodes = adjacency_unweighted.shape[0]\n", "## We are removing those edges where the weight is smaller thane the threshold\n", "threshold = 20\n", "node_map = np.where(degrees >= threshold)[0]\n", "adjacency_th = np.delete(adjacency_unweighted,np.where(degrees < threshold),0)\n", "adjacency_th = np.delete(adjacency_th,np.where(degrees < threshold),1)\n", "degrees_th = np.sum(adjacency_th, axis = 0)\n", "n_nodes_th = adjacency_th.shape[0]\n", "\n", "adjacency_csr = sparse.csr_matrix(adjacency_unweighted);\n", "degree_matrix_csc = sparse.diags(degrees,format = \"csc\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## 1 Graph Laplacian" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "### Question 1\n", "\n", "*From the (weighted) adjacency matrix $A$, compute both the combinatorial (also called unnormalized) and the normalized graph Laplacian matrices.*\n", "\n", "*Note: if your graph is weighted, use the weighted adjacency matrix. If not, use the binary adjacency matrix.*\n", "\n", "*For efficient storage and computation, store these sparse matrices in a [compressed sparse row (CSR) format](https://en.wikipedia.org/wiki/Sparse_matrix#Compressed_sparse_row_.28CSR.2C_CRS_or_Yale_format.29).*" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "laplacian_combinatorial_csr = sparse.csr_matrix(degree_matrix_csc - adjacency_csr);\n", "inv_degree_matrix_csr = sparse.linalg.inv(degree_matrix_csc).tocsr()\n", "sqrt_inv_degree_matrix_csr = sparse.csr_matrix.sqrt(inv_degree_matrix_csr)\n", "laplacian_normalized_csr = sqrt_inv_degree_matrix_csr * laplacian_combinatorial_csr * sqrt_inv_degree_matrix_csr" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*Use one of them as the graph Laplacian $L$ for the rest of the milestone.\n", "We however encourage you to run the code with both to get a sense of the difference!*" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "laplacian = laplacian_normalized_csr" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "### Question 2\n", "\n", "*Compute the eigendecomposition of the Laplacian $L = U^\\top \\Lambda U$, where the columns $u_k \\in \\mathbb{R}^N$ of $U = [u_1, \\dots, u_N] \\in \\mathbb{R}^{N \\times N}$ are the eigenvectors and the diagonal elements $\\lambda_k = \\Lambda_{kk}$ are the corresponding eigenvalues.*\n", "\n", "*Make sure that the eigenvalues are ordered, i.e., $0 = \\lambda_1 \\leq \\lambda_2 \\leq \\dots \\leq \\lambda_N$.*" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "# calculate eigenvalues and eigenvectors\n", "[eigenvalues, eigenvectors] = sparse.linalg.eigsh(laplacian_normalized_csr, k = n_nodes-1, which = 'LM')\n", "\n", "#This function will not return the first eigenvalue 0 because we know that the first eigenvalue is always 0\n", "#So when we now look at eigenvalues we should not forget that there is one more 0.\n", "\n", "# sort the resulting values and vectors\n", "sortID = np.argsort(eigenvalues)\n", "eigenvalues = eigenvalues[sortID]\n", "eigenvalues[eigenvalues < 10**(-10)] = 0\n", "\n", "eigenvectors = eigenvectors[:,sortID]\n", "eigenvectors[eigenvectors < 10**(-10)] = 0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* *Justify your choice of eigensolver.*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Answer**\n", "\n", "\n", "The Laplacian is always a symmetric real valued matrix and therefore a Hermitian matrix as well. So we can use the solver for sparse Hermitian matrices." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "### Question 3\n", "\n", "* *We can write $L = S S^\\top$. What is the matrix $S$? What does $S^\\top x$, with $x \\in \\mathbb{R}^N$, compute?*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Answer**\n", "\n", "The matrix S is the incidence matrix having as rows the nodes and as columns the edges ($S \\in \\mathbb{R}^{NxM}$, N the number of nodes and M the number of edges). For an unweighted graph, $S_{i,j}$ = 1, for an edge $e_j$ between two vertexes $v_{i,k}$, -1 for $e_j$ between $v_{k,i}$ and 0 otherwise (the choice of sign is arbitrary, but it has to be once positive and once negative for a given edge). For a weighted graph, the entries are $\\sqrt{w_{i,k}}$ and $-\\sqrt{w_{i,k}}$, instead of +1 and -1, respectively. \n", "\n", "$S^\\top$ acts as a graph gradient, and $S^\\top x$ for a weighted graph computes:\n", "\n", "\\begin{equation}\n", "(S^\\top x )[j]= \\sqrt{w_{i,k}} (x[i] - x[k])\n", "\\end{equation}\n", "\n", "which corresponds to the derivative of x along edge j" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "### Question 4\n", "\n", "* *Show that $\\lambda_k = \\| S^\\top u_k \\|_2^2$, where $\\| \\cdot \\|_2^2$ denotes the squared Euclidean norm (a.k.a. squared $L^2$ norm).*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Answer**\n", "\n", "\\begin{equation} \n", "\\begin{split}\n", "\\lambda_k & = u_k^\\top L u_k \\text{, result of the eigendecomposition of $L$ with $u_k$ being a unit-vector}\\\\ \n", " & = u_k^\\top S S^\\top u_k \\text{ , with $L = S S^\\top$}\\\\\n", " & = (S^\\top u_k)^\\top S^\\top u_k \\text{ , where the order of factors reverses when taking the transpose}\\\\\n", " & =\\| S^\\top u_k \\|_2^2 \\text{ , with $x^\\top x$ being the squared Euclidean norm}\\\\\n", "\\end{split}\n", "\\end{equation} " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* *What does the quantity $\\| S^\\top x \\|_2^2$ tell us about $x$?*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Answer**\n", "\n", "This quantity tells us how \"smooth\" x is, i.e. a larger quantity means a higher variation among the x vector components." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "### Question 5\n", "\n", "* *What is the value of $u_0$, both for the combinatorial and normalized Laplacians?*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Answer**\n", "\n", " * **Combinatorial Laplacian**\n", "\n", "$u_0$ corresponds to the eigenvalue 0 and cannot be the vector 0. From the definition of the eigendecomposition we have:\n", "\n", "\\begin{equation}\n", "L u_0 = \\lambda_0 u_0 = 0 \n", "\\end{equation}\n", "\n", "Multiply by $u_0^\\top$ gives: \n", "\\begin{equation}\n", "u_0^\\top L u_0 = u_0^\\top \\cdot 0 = 0\n", "\\end{equation}\n", "\n", "Since $u_0^\\top L u_0$ is defined as follows:\n", "\\begin{equation}\n", "u_0^\\top L u_0 = \\frac{1}{2} \\sum_{\\substack{u,v} \\in E} w_{u,v}(u_0[u]-u_0[v])^2\n", "\\end{equation}\n", "\n", "We get: \n", "\\begin{equation}\n", "\\sum_{\\substack{u,v} \\in E} w_{u,v}(u_0[u]-u_0[v])^2 = 0 \n", "\\end{equation}\n", "\n", "For this equation to hold, we need to have $u_0[u] = u_0[v]$ for any edge (u,v) $\\in E$. In the case where the graph is connected, we get that $u_0[i] = u_0[k]$ for every i,k $\\in V$. From this we get that $u_0$ equals: \n", "\\begin{align}\n", " u_0 &= \\alpha \\begin{bmatrix}\n", " 1 \\\\\n", " 1 \\\\\n", " \\vdots \\\\\n", " 1\n", " \\end{bmatrix}\n", " \\end{align}\n", "\n", "with $\\alpha \\in \\mathbb{R}^*$, or to have a unit vector, $\\alpha$ needs to equal $\\alpha = \\frac{1}{\\sqrt{N}}$, where $N$ is the number of connected nodes. Thus, the value of $u_0$ is the unit vector $e$. \n", "\n", "- **Normalized Laplacian**\n", "\n", "Let's call $u_0'$ the eigenvector of the normalized Laplacian $L_{norm}$.\n", "\n", "From the theory, we know that $u_0' = D^{\\frac{1}{2}} u_0$, and hence $u_0' = D^{\\frac{1}{2}} e$ is the eigenvector of $L_{norm}$ of eigenvalue 0." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "### Question 6\n", "\n", "- *Look at the spectrum of the Laplacian by plotting the eigenvalues.\n", "Comment on what you observe.*" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0, 0.5, 'Eigenvalue')" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(eigenvalues.real, \"b.\" , markersize = 1)\n", "plt.xlabel('Eigenvalue Index')\n", "plt.ylabel('Eigenvalue')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Answer**\n", "\n", "As espected the eigenvalues are in the domain $[0,2]$. The first eigenvalues which equal to 0 represent the number of connected components. \n", "\n", "It is interesting to observe that a lot of eigenvalues equal 1. In this notebook we will not further investigate into this property, but we will keep it in mind for the final report. \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- *How many connected components are there in your graph? Answer using the eigenvalues only.*" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of connected components: 8\n" ] } ], "source": [ "# in addition to the 0-multiplicity we add 1 which corresponds to the first eigenvalue 0 which is omitted in the computation\n", "n_conn_comp = eigenvalues[eigenvalues == 0].shape[0] + 1 \n", "print(\"Number of connected components:\",n_conn_comp)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There are **8** connected components." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- *Is there an upper bound on the eigenvalues, i.e., what is the largest possible eigenvalue? Answer for both the combinatorial and normalized Laplacians.*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Answer**\n", "\n", "For normalized Laplacians the upper bound on the eigenvalues is 2, where equality holds iff the graph is bipartite. \n", "\n", "For our graph (normalized graph and the threshold graph), we observed that the upper bound of the eigenvalues of the combinatorial Laplacian was the same than the maximum degree. Defining the upper bound is an active field of research, and diverse theorems of tight bounds can be found in the literature." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## 3 Laplacian eigenmaps\n", "\n", "*Laplacian eigenmaps* is a method to embed a graph $\\mathcal{G}$ in a $d$-dimensional Euclidean space.\n", "That is, it associates a vector $z_i \\in \\mathbb{R}^d$ to every node $v_i \\in \\mathcal{V}$.\n", "The graph $\\mathcal{G}$ is thus embedded as $Z \\in \\mathbb{R}^{N \\times d}$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "### Question 7\n", "\n", "* *What do we use Laplacian eigenmaps for? (Or more generally, graph embeddings.)*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Answer**\n", "\n", "We use Laplacian eigenmaps for **dimensionality reduction**. Often, graph data is intrinsically low dimensional, but lies in a very high-dimensional space. Thus, **mapping a network to a vector space and reducing the dimension, while preserving relevant graph properties**, can be useful for faster **computation, machine learning algorithms, statistics, or visualization**. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "### Question 8\n", "\n", "*Embed your graph in $d=2$ dimensions with Laplacian eigenmaps.\n", "Try with and without re-normalizing the eigenvectors by the degrees, then keep the one your prefer.*\n", "\n", "*Recompute the eigenvectors you need with a partial eigendecomposition method for sparse matrices.\n", "When $k \\ll N$ eigenvectors are needed, partial eigendecompositions are much more efficient than complete eigendecompositions.\n", "A partial eigendecomposition scales as $\\Omega(k |\\mathcal{E}|$), while a complete eigendecomposition costs $\\mathcal{O}(N^3)$ operations.*" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "#Creating the matrix in the good format\n", "adjacency_lc_csr = sparse.csr_matrix(adjacency_th);\n", "degrees_lc = np.sum(adjacency_th, axis = 0)\n", "degree_matrix_lc_csc = sparse.diags(degrees_lc,format = \"csc\")\n", "n_nodes_lc = degrees_lc.shape[0]\n", "\n", "#Computation of the laplacian for our graph\n", "laplacian_combinatorial_lc_csr = sparse.csr_matrix(degree_matrix_lc_csc - adjacency_lc_csr);\n", "inv_degree_matrix_lc_csr = sparse.linalg.inv(degree_matrix_lc_csc).tocsr()\n", "sqrt_inv_degree_matrix_lc_csr = sparse.csr_matrix.sqrt(inv_degree_matrix_lc_csr)\n", "laplacian_normalized_lc_csr = sqrt_inv_degree_matrix_lc_csr * laplacian_combinatorial_lc_csr * sqrt_inv_degree_matrix_lc_csr\n" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "def graph_embedding(laplacian_normalized_csr, d):\n", " [eigenvalues, eigenvectors] = sparse.linalg.eigsh(laplacian_normalized_csr, k = d+1, which = 'SM')\n", " sortID = np.argsort(eigenvalues)\n", " eigenvalues = eigenvalues[sortID]\n", " eigenvectors = eigenvectors[:,sortID]\n", " proj = eigenvectors[:,1:d+1]\n", " return proj" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* *Plot the nodes embedded in 2D. Comment on what you see.*" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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2+3GkSNHUFFRkdJzj3aO8cb117/+FY899hg2btwodmcJgoDvfe97uHTpEoDrv6dKkFWbpnR1dWHZsmVobW1Fbm4uNm7ciOLiYrz44ou44447UF5ejl/96leoq6uDz+fDU089hYkTJ+LEiROora1Fbm4uioqKUFtbC4PBELKskmKrqKjAN77xDQwaNEiswU+aNAmPPvooXn/9dbz77rvIzc3F3Xffjaqqql6PyT/a9KuvvoIgCFi7di3q6upQWlqKGTNmYO/evdizZw8EQcDDDz+M2bNn48qVK1i2bBkcDgcKCwuxceNG5OXlhSybTnJi+973vge3243i4mIAwPDhw/H888/jf/7nf7Bjxw5oNBp84xvfwKOPPqq42P7xj3+IzZd6vR6rV69GSUlJVnxvAPDv//7vePzxx8XxKAAy4m9MKlpsft/61rfw7rvvQqvVhr3u+EetC4KAe++9F/fff7+i4lqyZAkaGxsxePBgAN21+i1btuDjjz/GSy+9BJ1Oh5EjR2LFihXIzc1NV2gxy6pETkRE1NdkVdM6ERFRX8NETkREpGBM5ERERArGRE5ERKRgTOREREQKxkRORESkYEzkRERECsZETkREpGD/P3sdM8WEM5wjAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "proj = graph_embedding(laplacian_normalized_lc_csr, 2)\n", "plt.plot(proj[:,0],proj[:,1], '.')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Answer**\n", "\n", "With the embedding in two dimensions, airports that are connected by a flight now appear close to each other in the plot. We start to see clusters that naturally emerge form the geometry. Since the clusters represent airports that are well connected to each other, there might be another meaning to it such as financially, economically, and culturally similar countries." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "### Question 9" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "What does the embedding $Z \\in \\mathbb{R}^{N \\times d}$ preserve?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Answer**\n", "\n", "The embedding $Z \\in \\mathbb{R}^{N \\times d}$ preserves relevant graphs properties such as the number of data points N, while reducing the dimension d. \n", "The goal of the Laplacian eigenmap algorithm is to preserve local information optimally. All the point node that are close to each other, meaning nodes connected by an edge with a large weight, must remain close to each other in the embedding." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## 2 Spectral clustering\n", "\n", "*Spectral clustering is a method to partition a graph into distinct clusters.\n", "The method associates a feature vector $z_i \\in \\mathbb{R}^d$ to every node $v_i \\in \\mathcal{V}$, then runs [$k$-means](https://en.wikipedia.org/wiki/K-means_clustering) in the embedding space $\\mathbb{R}^d$ to assign each node $v_i \\in \\mathcal{V}$ to a cluster $c_j \\in \\mathcal{C}$, where $k = |\\mathcal{C}|$ is the number of desired clusters.* " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For this part, we have chosen to use the unweighted adjacency matrix, because we feel that our graph will probably be clustered according to geographical features. Moreover we kept only the nodes with a degree larger than 20, because we want to see only the airports (=nodes) that are significant (an airport with less than 20 flights is not very significant). By applying this threshold, we also assure that our graph is connected." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "#Computation of the eigenvalues and eigenvectors for our graph\n", "[eigenvalues_lc, eigenvectors_lc] = sparse.linalg.eigsh(laplacian_normalized_lc_csr, k = n_nodes_lc-1, which = 'LM')\n", "#This function will not return the first 0 because it is assuming it is always there. \n", "#So when we now look at eigenvalues we had not to forget that there is one more 0.\n", "sortID = np.argsort(eigenvalues_lc)\n", "eigenvalues_lc = eigenvalues_lc[sortID]\n", "eigenvectors_lc = eigenvectors_lc[:,sortID]" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of connected components: 1\n" ] } ], "source": [ "n_conn_comp = eigenvalues_lc[eigenvalues_lc == 0].shape[0]+1\n", "eigenvalues_lc[eigenvalues_lc < 10**(-10)] = 0\n", "print(\"Number of connected components:\",n_conn_comp)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0, 0.5, 'Values of eigenvalues')" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAe8AAAFlCAYAAADComBzAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4wLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvqOYd8AAAIABJREFUeJzt3X1gzvX+x/HXtV02m00mozhNNywHdSS5KTcxN8nNMLL4jaRzkuPkpphyk5+bMSRRpJK7I3YwYufUqUlI5WaZInQScndqMrGNzXZ9f3/4uTJs13B9r2vf7fn45+z6Xtf1/b6vd51e1+fz/V6fr80wDEMAAMAyfLxdAAAAuD6ENwAAFkN4AwBgMYQ3AAAWQ3gDAGAxhDcAABZj93YBQGm1YsUK/eMf/1BGRoYuXLigO+64Q0OGDNGf/vQntx1j5MiRqlmzpvr37+/yte+8846SkpJkGIYcDoeaNWumoUOHys/Pz231XPL0009r+vTpqlixotv3DZQGhDfgBTNmzND27ds1c+ZMVatWTZL05Zdf6tlnn1ViYqKqVq3q0Xo+/PBDJScnKyEhQWXLllV2draef/55vfHGGxo2bJjbj7dlyxa37xMoTQhvwMNOnjypRYsW6ZNPPlHlypWd25s0aaKRI0fq3LlzkqRWrVrp/vvv1/79+zVs2DDZ7XbNmzdPOTk5OnXqlLp06aIhQ4Zo69atmjp1qqpUqaIjR46obNmymjJliu655x5J0s6dOxUdHa2TJ0+qZs2aevXVVxUYGJivprS0NOXl5en8+fMqW7as/P39NWbMGJ06dUrSxRG8zWbTgQMHdOrUKT3yyCMaPXq0ypQpowMHDmjSpEk6ffq08vLyFBMTo+7du0uSVq5cqQULFsjHx0chISGKj4/XrFmzJEl9+/bV22+/rd69e+f7nJMnT9brr7+u++67z9mH119/XSEhIerbt68aN26s1NRU5ebmasSIEUpISNCPP/6ounXrasaMGfLx4WwgSgEDgEd98sknRteuXV2+rmXLlsYbb7xhGIZhOBwO43/+53+MgwcPGoZhGP/973+NP/7xj8avv/5qfPXVV0atWrWM7du3G4ZhGO+//75z/7GxsUb37t2NrKwsIzc31+jatauxevXqq4515swZo1+/fkadOnWMJ554wpg8ebKxbds25/OxsbFGly5djIyMDCM7O9vo3bu3sWTJEuPChQvG448/buzevdu5n/bt2xs7d+409u7dazRq1Mg4fvy4YRiGsWDBAmPMmDGGYRhGeHi48euvv171OS89/uabb656fOTIESM8PNxITk42DMMwxo4da7Rs2dI4e/ascf78eeORRx4xUlJSivBPALA+Rt6AhxlXrEickZGh3r17S5KysrLUvn1751R1gwYNJEk2m01vvfWWPvvsMyUlJenAgQMyDMM5Sq9Vq5bztVFRURo/frzS09MlSa1bt1ZAQIAkqWbNms7R9OWCg4P13nvv6ciRI/rqq6+0bds2/eUvf1GvXr00fPhwSVLXrl1Vrlw5SVJkZKTWr1+vxo0b66efftLLL7/s3Nf58+f13XffKTs7W02bNtXtt98uSXrqqacK7Mml2l0pU6aMWrVqJUkKCwvTAw88oKCgIElS5cqV9dtvvxVpP4DVEd6Ah91///06ePCg0tPTFRISoqCgIH3wwQeSpNmzZztDV5JzejsrK0tdu3ZV69at1aBBA0VFRSk5Odn5RcDX1zffMQzDcG6z23//v7nNZrvqy4N08WK1Bx98UPXr19cdd9yhHj16aMeOHfrzn//sDO/Lj2EYhnx8fJSXl6fy5cs765cunhYIDg5WQkKCbDabc/v58+d17Ngx53T+5a6cxr+8xpycHOffZcqUybfPMmXKXLUvoDTg5BDgYVWqVFGfPn00ePBgHT9+3Ln9+PHj+vrrr695zvbw4cPKyMjQkCFD1KpVK23btk05OTlyOBySpH379mnfvn2SpISEBNWvX1/ly5cvck3nz5/Xq6++qtOnTzu3HTx4ULVr13Y+/vDDD5WTk6Ps7GytXr1aLVu21F133SV/f39neJ84cUIdO3bU7t271ahRI3355Zf65ZdfJEnLly/XtGnTJF38IpCbm3vNWipWrKjdu3dLklJTU5WWllbkzwGUFoy8AS8YOnSo1q5dqxdffFFZWVnKzc2Vn5+fHn/8cecU+uXuvfdePfroo2rfvr3Kly+vsLAw1ahRQ4cPH5afn58qVaqkmTNn6tixY6pYsaKmTp16XfUMHDhQNptN0dHRstlscjgcqlu3rmbOnOl8TdmyZdWrVy+dOXNG7dq1U1RUlHx8fDRnzhxNmjRJ7777rnJzczV48GA9+OCDkqThw4frmWeekSSFhoYqLi5OktSmTRv16tVLc+bMuaqWF198UePGjVNCQoLq1KmjOnXqXNdnAUoDm3GtOTQAlrF161ZNmDBBSUlJph3jen4vDsB8TJsDAGAxjLwBALAYRt4AAFgM4Q0AgMUQ3gAAWIxlfiqWlnbWrfsLCQlUenqWW/eJ/Oixueiv+eixueiva6GhwdfcXmpH3na7r+sX4abQY3PRX/PRY3PR3xtXasMbAACrIrwBALAYwhsAAIshvAEAsBjCGwAAiyG8AQCwGMIbAACLIbwBALAYwhsAAIshvAEAsBjCGwAAiyG8AQBwg1WrPHevL8IbAAA3iIrK9dixCG8AACyG8AYAwGIIbwAALMbU8N61a5diYmIKfH7MmDGaPn26mSUAAFDimBbe77zzjkaPHq3s7OxrPr98+XJ9//33Zh0eAIASy7TwDgsL0+zZs6/53Ndff61du3apZ8+eZh0eAIASy7QfpbVr105Hjx69avsvv/yiN998U2+88YY+/PDDIu8vJCRQdruvO0tUaGiwW/eHq9Fjc9Ff89Fjc9HfG+O5X5T/v48++kjp6en6y1/+orS0NJ0/f1533323unXrVuj70tOz3FpHaGiw0tLOunWfyI8em4v+mo8em4v+ulbQlxuPh3efPn3Up08fSVJiYqJ+/PFHl8ENAAB+57Gfiq1bt04JCQmeOhwAACWWzTAMw9tFFIW7p1aYrjEfPTYX/TUfPTZXServqlV2U5ZHLWjanEVaAAC4SZ5c11wivAEAsBzCGwCAm+TJ24FKhDcAADeNaXMAAFAowhsAAIshvAEAsBjCGwAAiyG8AQCwGMIbAACLIbwBALAYwhsAAIshvAEAuAmeXl1NIrwBALgpnl5dTSK8AQC4Yd4YdUuENwAAN8wbo26J8AYAwHIIbwAALIbwBgDAYghvAAAshvAGAOAGeOtKc4nwBgDguq1aZffaleYS4Q0AwHXxdnBLhDcAAEVWHIJbIrwBACiy4hDcEuENAECRePMCtSsR3gAAuBAb61dsRt0S4Q0AgEvx8TneLiEfwhsAgEIUp+nySwhvAAAKUFyuLr8S4Q0AwDUU1+CWCG8AAK5SnINbkorfRD4AAF5w+bnt4hzckskj7127dikmJuaq7UlJSerRo4eio6M1duxYORwOM8sAAKBIoqJyi31wSyaOvN955x2tXbtWAQEB+bafP39eM2fO1Lp16xQQEKBhw4Zpw4YNioiIMKsUAACuyUqj7cuZFt5hYWGaPXu2RowYkW+7n5+fli9f7gz13Nxc+fv7m1UGAAD5WDWwL2daeLdr105Hjx69aruPj48qVaokSVqyZImysrL0yCOPuNxfSEig7HZft9YYGhrs1v3havTYXPTXfPTYXJ7u79Kl0oABHj2kKbxywZrD4dC0adN08OBBzZ49WzabzeV70tOz3FpDaGiw0tLOunWfyI8em4v+mo8em8uT/V21yq5t23wUH5+jtDSPHNItCvpy45XwHjt2rPz8/DRnzhz5+PBrNQCAOS5NkV+8EM3LxbiRx8J73bp1ysrKUt26dbVy5Uo1aNBAffv2lST16dNHbdq08VQpAIASrCSc03bFZhiG4e0iisLdUytMh5mPHpuL/pqPHpvL3f29fJRdUhQ0bc6cNQDA8kpicBeGFdYAAJZz5Z2+SktoX0J4AwAsIzbWTw0bOkpdWF+J8AYAFFtXjrDj43O8VEnxQngDAIqN0j4dXlSENwDA60rDz7vcifAGAHjF0qXS2bOl6ypxdyG8AQAecWmJ0oYNL94GesAAKS2N0L4RhDcAwO2uPHctlbwlSr2J8AYAuMWlwL50AxCYh/AGAFy3gkbWF//X09WUPoQ3AKBQVwY1I2vvI7wBAE6XT31furDsyivBGVl7H+ENAKXQtaa9Jaa+rYLwBoASrKCQlvhttZUR3gBQglw57U1Al0yENwBY0JULnlzCtHfpQHgDQDHlasqbgC69CG8AKCYK++00cDnCGwC8JDbWL9+0N0GNoiK8AcBEhU19s9AJbhThDQBuwE+y4EmENwBch2stFcpPsuBphDcAXOFSQAcHS+vXF35emiu+4Q2EN4BS61rreEu/B3RoqNS2LeelUfwQ3gBKvCuv6r6EBU1gVYQ3gBKBq7pRmhDeACyjsICWuKobpQfhDaBYKSigt23zYQQN/D/CG4BXXO9PrjgvDfzuusI7IyNDJ06cUM2aNc2qB0AJc3lIX35VNz+5Am6cy/BesWKFvv76aw0fPlxdunRRuXLl1LZtWw0dOtQT9QEoxgoaPV/u8pAmoAH3cBney5Yt03vvvae1a9cqIiJCo0aN0hNPPEF4A6VEQSNnidEz4C1FmjavUKGCNm7cqD59+shutys7O7tIO9+1a5emT5+uJUuW5Nv+6aef6s0335TdbldUVJSeeOKJ668cgFu5WrDk4t8eLwvANbgM7xo1aujZZ5/V0aNH1aRJEw0ePFj33Xefyx2/8847Wrt2rQICAvJtv3DhgiZPnqyVK1cqICBATz75pFq1aqVKlSrd+KcAUGQsWAJYn8vwjouL086dOxUeHi4/Pz9FRkaqefPmLnccFham2bNna8SIEfm2HzhwQGFhYbrlllskSQ8++KC2b9+u9u3b3+BHAHClggJaYsESoCRwGd4Oh0M7duzQypUrNWbMGH333Xdq2rSpyx23a9dOR48evWp7RkaGgoODnY/LlSunjIwMl/sLCQmU3e7r8nXXIzQ02PWLcFPosTmWLr3017X7+957HiulxOPfYXPR3xvjMrzHjx+vihUras+ePfL19dVPP/2kUaNGadq0aTd0wKCgIGVmZjofZ2Zm5gvzgqSnZ93Q8QoSGhqstLSzbt0n8qPHN6+wFcUGDAgosL9paWZVVLrw77C56K9rBX25cRnee/bs0erVq7Vp0yYFBAQoPj5enTp1uuFC7rnnHh0+fFinT59WYGCgduzYof79+9/w/gCru1ZAc49oAIVxGd42m005OTmy2WySpPT0dOff12PdunXKyspSz549NXLkSPXv31+GYSgqKkpVqlS5/soBC7negOaiMQCFsRmGYRT2gjVr1mjFihU6fPiw2rdvr+TkZP31r39V9+7dPVWjJLl9aoXpGvOVxh4XdTUxdyiN/fU0emwu+uvaDU+bd+nSRXXr1tXWrVuVl5enuXPnqlatWm4vELCKgn4PLfGbaACe4TK816xZI+niVeGStG/fPu3bt09dunQxtzLAy1atshca0IQzAG9xGd5bt251/n3hwgWlpKSoQYMGhDdKlGudk46KyiWgARRLLsN78uTJ+R6fPn2adc1hWdd7G0oAKI6u+37egYGBOnbsmBm1AG51rXPT3EgDQEngMrxjYmKcPw0zDENHjx4t0vKogKewVjeA0sZleP/tb39z/m2z2RQSEqIaNWqYWhRwLQWtNsZa3QBKmwLDe/v27ZJ01YIs6enp2r59ux566CFzK0OpxXlpAChcgeE9a9asAt9ks9m0ePFiUwpC6XT51DfnpQGgcAWG95IlSzxZB0qBwm6ywdQ3ABSdy3PeO3bs0Pz585WVlSXDMORwOHT8+HF9+umnnqgPFrZ0qXT27O9XfBPQAOAeLsN79OjR+vOf/6zVq1crJiZGmzZtUu3atT1RGyzkWqPqAQOktDSu+AYAd3MZ3mXLllVUVJSOHTum8uXLa+LEierWrZsnakMxVdD0NxeUAYBnuAxvf39/nT59WnfddZd27dqlJk2aKCsryxO1oZi5dFEZIQ0A3uUyvJ966ikNHTpUs2fPVvfu3bVu3TrVrVvXE7XBS/g9NQAUby7Du1GjRnrsscdks9mUmJioQ4cOcUvQEoqRNQBYg8vw7tq1q2rVqqXOnTurdevWXKxWwlw+ymZkDQDW4DK8N2zYoK+++kpJSUl69dVX1bBhQ0VGRqpJkyaeqA8muDywGWUDgPW4DG8fHx89/PDDevjhh7V161bFx8dr0KBBSklJ8UR9cKNLoU1gA4C1uQzvPXv2KCkpScnJybrzzjvVr18/tWnTxhO1wQ2uvPiM4AYA63MZ3mPGjFFkZKSWLVumSpUqeaIm3ATCGgBKPpfhnZiYqIyMDJ09e1bHjx93bq9ataqpheH6MS0OAKWDy/CeN2+e5s2bpwoVKji32Ww2rV+/3tTC4BqjbAAonVyG94oVK5ScnKyKFSt6oh4UASNsACjdXIb37bffrltuucUTtaAIYmP9+D02AJRyLsP7zjvvVK9evdSoUSP5+fk5tw8aNMjUwnDRlVPjBDcAwGV4V6lSRVWqVPFELbgMU+MAgIK4DO9BgwYpKytLP/30k8LDw3X+/HkFBgZ6orZSa9UqO6ENACiQj6sXfPnll4qMjNTAgQN18uRJtWrVSp9//rknaiuVCrqjFwAAl7gM7xkzZuj9999X+fLlVblyZf3973/X1KlTPVFbqbJqld054mbUDQAojMthnsPhUGhoqPNxjRo1TC2otOHcNgDgerkM79tuu00bNmyQzWbTmTNntHTpUlZXcxPObQMAboTLafPx48dr3bp1OnHihFq3bq29e/dq/PjxnqitxIqN9SO4AQA3zOXI+9Zbb9WMGTOue8cOh0Pjxo3T/v375efnp4kTJ6p69erO59977z0lJSXJZrNpwIABpepOZfxWGwBwM1yGd9u2bZWXl+d8bLPZVLZsWd19992KjY1VtWrVrvm+5ORk5eTkKCEhQampqZoyZYrmzp0rSTpz5owWL16sjz/+WOfOnVOXLl1KTXgz4gYA3CyX4d28eXP94Q9/UPfu3SVJa9eu1bfffqtWrVpp1KhRWrhw4TXfl5KSombNmkmS6tWrp927dzufCwgIUNWqVXXu3DmdO3dONpvNDR/FGghuAMDNchneKSkpGj16tPNxr1691K1bN02ePFlz5swp8H0ZGRkKCgpyPvb19VVubq7s9ouHvP3229WhQwfl5eXp2WefdVloSEig7HZfl6+7HqGhwW7dnytLl0q9e3v0kF7n6R6XNvTXfPTYXPT3xrgMbx8fH23evNk5it68ebP8/Px08uRJ5eYWPIoMCgpSZmam87HD4XAG96ZNm/TLL784byvav39/1a9fX/fff3+B+0tPzyraJyqi0NBgpaWddes+C3NpujwtzWOH9DpP97i0ob/mo8fmor+uFfTlxuXV5pMnT9Zrr72mRo0aqVGjRpo9e7YmTZqkhIQEPf300wW+r379+tq0aZMkKTU1VeHh4c7nbrnlFpUtW1Z+fn7y9/dXcHCwzpw5c72fyTI4zw0AcCebYRhGUV7422+/ydfXN99UeGEuXW3+/fffyzAMxcXFadOmTQoLC1NERIRmzZqlzZs3y8fHR/Xr19eIESMKPfft7m9nnvjGV9oXYOFbtbnor/nosbnor2sFjbwLDO8xY8ZowoQJiomJuWaoLl682L0VumDF8C7t6LG56K/56LG56K9rBYV3gee8e/bsKUn629/+Zk5FJRxT5QAAsxR4zrtu3bqSpIYNG8rX11cHDhxQvXr1ZLPZ1LBhQ48VaFUENwDALC4vWFu0aJFmzpyphQsXKjMzU2PHjtX8+fM9UZtlxcb6ebsEAEAJ5jK8V69erfnz5ysgIEAhISFauXKlVq1a5YnaLIvlTwEAZnIZ3j4+PvLz+30k6e/vL19f9y6WUpJcusIcAACzuEyahg0bKj4+XufOnVNycrISEhLUuHFjT9RmOVykBgDwBJcj7xEjRqh69eq69957tWbNGrVo0UKxsbGeqM1SCG4AgKcUaXnU6OhoRUdHe6IeSyK4AQCe5HLkDdcIbgCAJxUY3ocPH/ZkHZbFBWoAAE8rMLyHDBkiSRo4cKDHirEiRt0AAE8rcNjo4+OjJ598Uvv371efPn2uet7Ta5sXR5zrBgB4Q4HhvWjRIu3du1ejRo3SoEGDPFmTZRDcAABvKDC8g4KC9NBDD2n58uWSpF27dikvL0/16tVTpUqVPFYgAADIz+XV5nv27FFkZKQSExO1evVqde7cWRs2bPBEbcUaF6oBALzFZQK99tprev/993XHHXdIko4cOaJBgwapZcuWphdXnDFlDgDwFpcj79zcXGdwS9Idd9whh8NhalEAAKBgLsO7atWqWrhwoTIyMpSRkaGFCxeqWrVqnqitWGPaHADgLS7De9KkSUpNTVXr1q0VERGhnTt3avz48Z6ordjiJ2IAAG9yOXy89dZbNXPmTE/UYhkENwDAm1jbHAAAiyG8rxPnugEA3nZd4Z2RkaH//Oc/ZtViCUyZAwC8zWV4r1ixQi+99JJOnTqlxx9/XM8//7xee+01T9RW7DDqBgAUBy7De9myZYqNjVVSUpIiIiK0bt06bd682RO1FTuMugEAxUGRps0rVKigjRs36tFHH5Xdbld2drbZdQEAgAK4DO8aNWro2Wef1dGjR9WkSRMNHjxY9913nydqAwAA1+DyJG5cXJx27typ8PBw+fn5KTIyUs2bN/dEbcUKC7MAAIoLlyNvh8OhHTt2KC4uThkZGfruu+9K5drmBDcAoLhwGd7jx4/XuXPntGfPHvn6+uqnn37SqFGjPFFbscFV5gCA4qRI9/MeNmyY7Ha7AgICFB8fr71793qitmKDUTcAoDhxGd42m005OTmy2WySpPT0dOffpQGjbgBAceMymfr06aN+/fopLS1NkyZNUnJysv7617+63LHD4dC4ceO0f/9++fn5aeLEiapevbrz+Y0bN+rNN9+UYRiqU6eOXnnllWL5pYBRNwCguHEZ3l26dFHdunW1detW5eXlae7cuapVq5bLHScnJysnJ0cJCQlKTU3VlClTNHfuXEkXl1mdNm2aFi9erIoVK+qdd95Renq6KlasePOfCACAEs5leK9Zs0aSVK5cOUnSvn37tG/fPnXp0qXQ96WkpKhZs2aSpHr16mn37t3O5y799Cw+Pl5HjhxRjx49CG4AAIrIZXhv3brV+feFCxeUkpKiBg0auAzvjIwMBQUFOR/7+voqNzdXdrtd6enp2rp1q9asWaPAwED17t1b9erV01133VXg/kJCAmW3+xblMxVZaGiwW/eHq9Fjc9Ff89Fjc9HfG+MyvCdPnpzv8enTpzV06FCXOw4KClJmZqbzscPhkN1+8XAVKlTQfffdp9DQUElSgwYNtHfv3kLDOz09y+Uxr0doaLDS0s4W+hoWZrk5Rekxbhz9NR89Nhf9da2gLzfXfT/vwMBAHTt2zOXr6tevr02bNkmSUlNTFR4e7nyuTp06+v7773Xq1Cnl5uZq165dqlGjxvWWYjqCGwBQHLkcecfExDivAjcMQ0ePHi3S8qht2rTRli1bFB0dLcMwFBcXpwULFigsLEwRERF64YUX9Mwzz0iSHnvssXzhXhww6gYAFFc2wzCMwl6wbdu2319ssykkJMQro2R3T60wXWM+emwu+ms+emwu+utaQdPmBY68t2/fLklX/fY6PT1d27dv10MPPeTG8gAAQFEVGN6zZs0q8E02m02LFy82pSAAAFC4AsN7yZIlnqwDAAAUkcsL1nbs2KH58+crKytLhmHI4XDo+PHj+vTTTz1Rn9dwwRoAoLhy+VOx0aNHq3Xr1srLy1Pv3r1VvXp1tW7d2hO1eRXBDQAorlyGd9myZRUVFaWGDRuqfPnymjhxovNiNgAA4Hkuw9vf31+nT5/WXXfdpV27dslmsykry72rnQEAgKJzGd5PPfWUhg4dqpYtW2rNmjXq0KGD6tat64navIZ7eAMAirMCF2k5ffq0KlSoIOniymqXRtyHDh1SrVq15ONz3Sur3hQWabEeemwu+ms+emwu+uvada9t3q5dOw0ePFibN292LtQSGBio2rVrezy4AQDA7wpM4c8++0ytWrXSwoUL1apVK73++us6cuSIJ2sDAADXUGB4BwQEKDIyUvPnz9fy5csVFBSkQYMGqW/fvlq3bp0na/QozncDAIq7Is1/V65cWf3799e8efNUvXp1vfTSS2bX5TX8vhsAUNy5HGaeOXNGH330kdatW6eTJ0+qa9euWr9+vSdqAwAA11BgeP/rX//S2rVrtXPnTkVERGjw4MFq0KCBJ2sDAADXUGB4L126VN26ddOMGTMUGBjoyZoAAEAhCg1vAABQ/PCDbQAALIbwBgDAYghvAAAshvAGAMBiCG8AACyG8L4MS6MCAKyA8L4MS6MCAKyA8AYAwGIIbwAALIbwBgDAYghvAAAshvAGAMBiCG8AACyG8AYAwGIIbwAALIbwBgDAYkwLb4fDobFjx6pnz56KiYnR4cOHr/maZ555RsuWLTOrDAAAShzTwjs5OVk5OTlKSEjQCy+8oClTplz1mpkzZ+rMmTNmlQAAQIlkWninpKSoWbNmkqR69epp9+7d+Z7/6KOPZLPZnK8BAABFY9pttDIyMhQUFOR87Ovrq9zcXNntdn3//fdKSkrSrFmz9OabbxZpfyEhgbLbfd1aY2hosFv3h6vRY3PRX/PRY3PR3xtjWngHBQUpMzPT+djhcMhuv3i4NWvW6Oeff1bfvn117NgxlSlTRtWqVVPz5s0L3F96epZb6wsNDVZa2lm37hP50WNz0V/z0WNz0V/XCvpyY1p4169fXxs2bNDjjz+u1NRUhYeHO58bMWKE8+/Zs2erUqVKhQY3AAD4nWnh3aZNG23ZskXR0dEyDENxcXFasGCBwsLCFBERYdZhAQAo8WyGYRjeLqIo3D21wnSN+eixueiv+eixueivawVNm7NIy/8dQAerAAAPeklEQVRbtcq0SQgAANyK8P5/UVG53i4BAIAiIbwBALAYwhsAAIshvAEAsBjCGwAAiyG8AQCwGMIbAACLIbwBALAYwlss0AIAsBbCWyzQAgCwFsIbAACLIbwBALAYwhsAAIsp9eHNxWoAAKsp9eHNxWoAAKsp9eENAIDVEN4AAFgM4Q0AgMUQ3gAAWAzhDQCAxRDeAABYDOENAIDFEN4AAFgM4Q0AgMUQ3gAAWAzhDQCAxRDeAABYDOENAIDFEN4AAFgM4Q0AgMUQ3gAAWAzhDQCAxdjN2rHD4dC4ceO0f/9++fn5aeLEiapevbrz+YULF+qf//ynJKlFixYaNGiQWaUAAFCimDbyTk5OVk5OjhISEvTCCy9oypQpzueOHDmitWvXavny5frHP/6hzz//XPv27TOrFAAAShTTRt4pKSlq1qyZJKlevXravXu387nbbrtN7777rnx9fSVJubm58vf3N6sUAABKFNPCOyMjQ0FBQc7Hvr6+ys3Nld1uV5kyZVSxYkUZhqGpU6eqdu3auuuuuwrdX0hIoOx2X7fWGBoa7Nb94Wr02Fz013z02Fz098aYFt5BQUHKzMx0PnY4HLLbfz9cdna2Xn75ZZUrV06vvPKKy/2lp2e5tb7Q0GClpZ116z6RHz02F/01Hz02F/11raAvN6ad865fv742bdokSUpNTVV4eLjzOcMwNHDgQN17770aP368c/ocAAC4ZtrIu02bNtqyZYuio6NlGIbi4uK0YMEChYWFyeFwaNu2bcrJydHmzZslScOGDdMDDzxgVjkAAJQYpoW3j4+Pxo8fn2/bPffc4/z722+/NevQAACUaCzSAgCAxRDeAABYDOENAIDFEN4AAFgM4Q0AgMUQ3gAAWAzhDQCAxRDeAABYDOENAIDFlOrwXrXKtAXmAAAwTakO76ioXG+XAADAdSvV4Q0AgBUR3gAAWAzhDQCAxZTa8F661NsVAABwY0ptePfu7e0KAAC4MaU2vAEAsCrCGwAAiyG8AQCwGMIbAACLIbwBALAYwhsAAIshvAEAsBjCGwAAiyG8AQCwGMIbAACLIbwBALAYwhsAAIuxGYZheLsIAABQdIy8AQCwGMIbAACLIbwBALAYwhsAAIshvAEAsBjCGwAAi7F7uwBPczgcGjdunPbv3y8/Pz9NnDhR1atX93ZZlrZr1y5Nnz5dS5Ys0eHDhzVy5EjZbDbVrFlTr7zyinx8fPTGG2/os88+k91u18svv6z777/f22UXexcuXNDLL7+sY8eOKScnR88995xq1KhBf90oLy9Po0eP1sGDB2Wz2fS///u/8vf3p8du9uuvv6pbt2567733ZLfb6a87GKXMv//9byM2NtYwDMPYuXOnMWDAAC9XZG1vv/220bFjR6NHjx6GYRjGs88+a3z11VeGYRjGmDFjjI8//tjYvXu3ERMTYzgcDuPYsWNGt27dvFmyZaxcudKYOHGiYRiGkZ6ebrRo0YL+utknn3xijBw50jAMw/jqq6+MAQMG0GM3y8nJMQYOHGi0bdvW+OGHH+ivm5S6afOUlBQ1a9ZMklSvXj3t3r3byxVZW1hYmGbPnu18vGfPHjVs2FCS1Lx5c33xxRdKSUlR06ZNZbPZVLVqVeXl5enUqVPeKtkyHnvsMQ0ePFiSZBiGfH196a+btW7dWhMmTJAkHT9+XOXLl6fHbhYfH6/o6GhVrlxZEv+NcJdSF94ZGRkKCgpyPvb19VVubq4XK7K2du3ayW7//eyLYRiy2WySpHLlyuns2bNX9fzSdhSuXLlyCgoKUkZGhp5//nkNGTKE/prAbrcrNjZWEyZMUKdOneixGyUmJqpixYrOAZPEfyPcpdSFd1BQkDIzM52PHQ5HvvDBzfHx+f1fqczMTJUvX/6qnmdmZio4ONgb5VnOiRMn1KdPH0VGRqpTp0701yTx8fH697//rTFjxig7O9u5nR7fnFWrVumLL75QTEyM9u7dq9jY2Hwjavp740pdeNevX1+bNm2SJKWmpio8PNzLFZUstWvX1tatWyVJmzZtUoMGDVS/fn19/vnncjgcOn78uBwOhypWrOjlSou/kydP6umnn9bw4cPVvXt3SfTX3dasWaN58+ZJkgICAmSz2VS3bl167CZLly7V3//+dy1ZskR//OMfFR8fr+bNm9NfNyh1Q842bdpoy5Ytio6OlmEYiouL83ZJJUpsbKzGjBmjGTNm6O6771a7du3k6+urBg0aqGfPnnI4HBo7dqy3y7SEt956S2fOnNGcOXM0Z84cSdKoUaM0ceJE+usmbdu21UsvvaTevXsrNzdXL7/8su655x7+HTYR/41wD+4qBgCAxZS6aXMAAKyO8AYAwGIIbwAALIbwBgDAYghvAAAshvAGrnD06FHde++92rJlS77trVq10tGjR296/+7az4146aWX1K5dOyUlJeXbHhMT4/z73nvvdftxX3/9da1fv97t+y2qo0ePqlWrVl47PuBupe533kBRlClTRmPGjNHatWvzLdtodatXr9Y333wjPz+/fNu3bdtm6nEvrdEOwD0YeQPXULlyZT388MOKj4+/6rmtW7fmG6mOHDlSiYmJOnr0qCIjIzVo0CC1bdtWw4YN0/Lly9WzZ0899thjOnDggPM9b7zxhrp06aKePXtq3759ki6uqDZw4EB169ZNUVFR+uKLLyRJs2fPVv/+/fX4449r6dKlWrBggTp37qwuXbpcczELh8OhiRMnqkOHDurYsaPefvttSdKAAQNkGIZ69OihX3/91fn6iRMnSpJ69Ojh3DZ27Fh17txZnTt31uHDhyVJ33zzjZ588kl17dpVTz/9tI4cOXLVsQ8fPqx+/fqpa9euevLJJ/Xdd9/l65EkLV68WG3btlVUVJSGDx/uvLHNpk2b1L17d3Xp0kWDBg1Senq6pIszFTNnzlT37t3VoUMH7d69W/v27VPHjh2dx92wYYMGDBig3NxcjR49Wj179lRERISeeeYZnT9/Pl+Nl9ci/T7TkJmZqdjYWHXr1k2RkZHO2Yl9+/bpiSeeULdu3fTkk0/q0KFDV31uwNMIb6AAI0eO1Oeff37V9Hlh9u/fr4EDB+qjjz7St99+q2PHjikhIUEdO3ZUQkKC83XVq1fXmjVrNHDgQI0cOVKSNGnSJEVFRSkxMVFz587V2LFjlZGRIUnKycnRv/71L/Xs2VPz5s3TqlWrlJiYKJvNpp9//jlfDcuWLdOJEye0du1arVixQh9//LE+++wzvfXWW5KkDz74QLfeeqvz9aNHj5YkrVixwrnt4Ycf1tq1a/XII49o+fLlysnJ0ejRo/Xqq69q9erV6tevn8aMGXPV54+NjdXw4cO1evVqTZgwQUOHDs33/L59+7R06VIlJibq/fffd34xOHXqlF599VXNnz9fa9asUdOmTTV9+nTn+ypUqKCVK1cqOjpa8+bNU61ateTj46Pvv/9ekpSUlKTOnTtr586dKlOmjBISEvTJJ58oOztbGzduLNI/u7lz56pOnTpKTEzU0qVL9dZbb+nIkSNatGiR+vXrp8TERMXExCg1NbVI+wPMxLQ5UICgoCBNmDDBOX1eFJUqVVLt2rUlSbfddpuaNGkiSapatWq+89yXRrktWrTQ8OHDdebMGX3xxRf68ccfNWvWLElSbm6uc3R7//33S7p4B6wHHnhA3bt3V0REhHr37q0qVarkq2Hr1q3q2rWrfH19FRAQoE6dOunLL7/Uo48+WuTP3rp1a0lSjRo1tGPHDh06dEhHjhzRc88953zNpS8Wl2RmZmr37t166aWXnNuysrKcI2hJ+vLLL9WyZUvnqYgOHTrozJkz2rVrl/MmLNLF2YNbbrnF+b5Ld6WqWbOmPv74Y0lSZGSk/vnPf+qOO+7Qtm3bFBcXJ39/f1WoUEFLly7Vjz/+qEOHDikrK6tIn/mLL77Q+fPntWrVKmft//nPf9SiRQuNHz9emzdvVsuWLdWuXbuiNREwEeENFKJp06ZXTZ/bbDZdvqrwhQsXnH9feS7Z19f3mvu9cnuZMmXkcDi0aNEiVahQQZL0888/q1KlSkpOTlbZsmWdr50zZ45SU1O1adMmPfPMM5o+fbrz/sjSxeC7nGEYysvLK+pHliTnnfYufVaHw6E//OEP+uCDDyRJeXl5OnnyZL73OBwO+fn5OV8jSf/973+dn0e6eNe5K+u7tL/69es7Zweys7Pz3WXK39/fWc8lHTt2VN++fVWrVi01bdpU/v7+Wr9+vWbNmqU+ffqoW7duSk9P15UrQF/+z+/yf3YOh0PTpk1TnTp1JF08jXHLLbeoTJkyeuCBB7RhwwYtWrRIGzdudJ5qALyFaXPAhUvT57/88oskKSQkREeOHFF2drZOnz6tlJSU697nunXrJEmffPKJ7r77bgUEBKhx48Z6//33JUk//PCDOnfurHPnzuV736lTp9S+fXuFh4dr8ODBeuSRR7R///58r2ncuLHWrFmjvLw8nTt3TuvWrVOjRo0KrcfVfe3vvvtu/fbbb9qxY4eki7d6fPHFF/O9Jjg4WHfeeaczvLds2aLevXvne02TJk20ceNGZWRkKCcnRx9//LFsNpv+9Kc/KTU1VQcPHpR08QvK1KlTC625SpUquv322/X222+rc+fOki6O7Nu3b6+oqChVqlRJ27dvv+qLS4UKFfTDDz9IkpKTk53bGzdurGXLlkmSfvnlF3Xu3FknTpzQkCFD9M033yg6OlqDBw92nscHvImRN+DCpenz/v37S7o4dduiRQt16NBB1apV04MPPnjd+zx06JAiIyNVrlw5TZkyRdLFc89jx45Vp06dJElTp0696kr3ihUrKjo6Wt27d1dAQIBuv/12de3aNd9revbs6dz/hQsX1LlzZ7Vp06bQeiIiIhQZGZnvQq7L+fn56fXXX9ekSZOUnZ2toKCga17MN23aNI0bN07vvvuuypQpo9deey3faDk8PFx9+vRRz549FRgYqJCQEPn7+ys0NFRxcXEaMmSIHA6HqlSpomnTprnsY2RkpF577TXnl5MePXroxRdf1EcffSQ/Pz/Vq1fvqp/l9erVS0OGDFGnTp3UuHFjhYaGSpIGDRqkcePGqWPHjsrLy9Pw4cMVFhamAQMGaNSoUZozZ458fX2d1ygA3sRdxQB4zMGDB7Vx40Y99dRTkqTnnntOPXr04DfYwHVi5A3AY6pVq6Zvv/1WHTt2lM1mU9OmTdWyZUtvlwVYDiNvAAAshgvWAACwGMIbAACLIbwBALAYwhsAAIshvAEAsBjCGwAAi/k/lhqauaPcR9sAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Graph Spectrum\n", "plt.plot(eigenvalues_lc, \"b.\" , markersize = 1)\n", "plt.title(\"Graph Spectrum\")\n", "plt.xlabel(\"Numbers of the eigenvalues\")\n", "plt.ylabel(\"Values of eigenvalues\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "### Question 10\n", "\n", "* *Choose $k$ and $d$. How did you get to those numbers?*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Answer**\n", "- k is chosen according to the graph of eigenvalues : the number of eighenvalues before the \"gap\" corresponds to k. k is the number of clusters.\n", "- d is the dimension of the embedding space, it has to be chosen in order to preserve local infomation optimally in a certain sense. (after Belkin's book)." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "number of eigenvalues before 1st gap : 3\n", "number of eigenvalues before 2nd gap : 6\n" ] }, { "data": { "image/png": "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Y77//nvTqlUr8/PPP5uUlBTjcDhMXl6eu+6HHnrI3Y+hQ4caY4zZsWOHadSokVm3bp0xxpjJkyebMWPGlLldT+Odrb//7szeLVu2zNx5551m3759xhhjnn32WTN69GhjjDGjRo0yb7/9tjHGmKKiIvPUU0+ZpKSkMuONHDnS9OrVy+Tm5pqCggLTv39/884775jc3FzTr18/c+TIEWOMMdu3b3ffv5ctW2ZatmxpcnJyjDGl7/tnG9/hcJiCggJTWFhoevXqZVJSUozT6TT33HOP2b17tzHGmBMnTphu3bqZ7du3G2OMGT58uBk/frwZPXp0qV6e675/5mPxxx9/NG3btnU/rr744gvTrl07d70lVq9e7e5/icjISPPtt9+6lyMiIso8PuF9zLgvEyWXyr/55hsNHjxYzZs31zXXXCNJ2rBhg3bt2qWYmBhJksvlUn5+vvtYh8Mhf39/+fv7q2vXrvrss8/UsWNHTZs2TatWrVJGRoZ27typvLw89zHNmjUrMzupqE2bNulvf/ub/P39JUkJCQn661//6t7eqVMnSacvr19zzTU6fvy4brrpJvf2ffv2qaCgQHfffbd7v7vvvluffvqpmjdvfs7b9dQHSfrss8/Url0792X2AQMGKDExsULHd+zYUdWqVVNQUJDq16+v48ePKyIiQrfccovWr1+vNm3aKDU1VZMnT1bNmjXL7a8nO3bsUFZWVqm++fj4KD09XZGRke5ZZtu2bfXkk08qODi4zBh79+5V/fr1S63LyMjQY489phdeeEENGzbUxo0bFRoaqqZNm0qSwsLC1KJFC3311VfatGmT+vTpo6uuukqSdP/992vevHkqLCyUJPfVg5LfXWRkpCQpNDRUX331VZl6PI13tv560qRJE/c53nrrrfr4448lnf5b+K5du5SSkiLp9Iz4XHr37q2aNWtKkqKjo7Vu3ToNGDBA8+bN08aNG7Vv3z599913OnnypPuYxo0bu2fbnkRGRiogIECS1KhRIx0/flz79u3Tzz//rKefftq936lTp/TNN9+oWbNmmjhxoqKjo1WjRg0tX768QrdTYvPmzYqIiHD/Xtq0aaO6detq9+7dioiIcO/ncrnOevyZVwxuuukm7d27t9TjE95HcF9mbrvtNo0ePVpjxoxR06ZN9cc//lEul0uDBg1SfHy8pNN/uzrzSe/MADbG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K/Tmm29q06ZNVVWq1crrc2BgoO6//34FBgYqKChIERERl1Zwt2jRwv2L37Fjhxo1auTe1qRJE23dulUFBQXKycnRnj17Sm1HxZTXY1w85fXZGKMhQ4aocePGmjRpknx9fauqTKuV1+OffvpJQ4cOlTFG/v7+CggIULVq/JPM+SqvxyNGjNDSpUv1zjvvqHfv3nrwwQfVvn37qirVauX1ed++fbrvvvtUXFwsp9Opbdu26fbbby93vEqdinXu3Fmff/654uLiZIzRlClT9MYbbyg0NFSdOnVSQkKC4uPjZYzR3/72N/4ueAE89RgXR3l9drlc+uqrr1RYWKhPP/1UkjR8+HA1b968iqu2i6f78i233CKHw+H+G2yrVq2qumTr8HxROTz1OTo6Wv369ZO/v7+io6MVFhZW7nh8OxgAABbh2hIAABYhuAEAsAjBDQCARQhuAAAsQnADAGARghs4h/j4eK1evbrUupMnT6p169Y6cuTIOY9LSEjQl19+6bW6Nm7cqI4dO+rJJ58stX7JkiXuekeNGqXly5df1NvdtWuXnnnmmYs65vnydm8BGxDcwDn06dOnTHCvWbNGrVu3Vt26dauoqtOfH/3oo49qxowZpdZv375dhYWFXrvdO+64Q5MnT/ba+AAqhuAGzqFbt27atm2bjh075l63cuVKxcTESJI+/PBD9evXTz179lSXLl2UlpZW6vgvv/xSCQkJ7uUzZ8Hvv/++evfurejoaD399NNn/YrVDRs2KDo6Wj169NCQIUN0+PBhLV26VOvWrdPcuXO1dOlS975ffPGF1q9fr1dffdX9oS+ffPKJ+vbtq44dO2rJkiWSTn+U8MiRI9WnTx9FR0eXeWEiScXFxZo6dap69+6tnj176s033yxzPt9//717jGeffVadO3eWJB0+fFhDhgxRnz59FBMToy+++EKSlJiYqDFjxighIUFRUVGaO3euJKl3797atWuX+3bbt2+v7Oxsr/cWsBnBDZxDzZo11alTJ/3zn/+UJB08eFB79+5VZGSkXC6XFi9erHnz5mnlypUaPHiwFixYUKFxf/jhByUnJ2vx4sX64IMPdM0115Q5Njs7W+PGjdPs2bO1atUqtWjRQpMmTVJsbKyioqL0+OOPKzY21r1/27Zt3etLvoWosLBQS5cu1f/8z//o5ZdfliTNnTtXt99+u5YvX66FCxdq3rx52r9/f6nbTk5OliStWLFCKSkpWrdunbZs2VJqn1GjRmnYsGH64IMPdNNNN6m4uFiSNHnyZMXExGj58uWaO3euxo0b5/6yoPT0dC1YsEBLly5VUlKSTpw4oejoaPd3aW/evFmNGzdWnTp1vNpbwHZ8+wRQjpiYGL3yyiuKi4vTqlWr1LNnT/dnYs+ePVvr16/X3r179dVXX1X4s7K//PJLZWRkqF+/fpIkp9Op2267rdQ+X3/9tZo0aaI//vGPkiSHw6GkpKTzqr1Tp07y8fFRWFiYjh49Kun0zPzUqVNatmyZpNN/s//hhx900003uY9LTU3Vt99+6/7SjpMnTyo9PV0333yzJOnYsWP65Zdf1KFDB3eP3n77bff4P/30k1599VVJUlFRkfuFQevWrRUQEKBrrrlGV199tXJycnTvvfcqLi5OI0aM0OrVq9399WZvAdsR3EA57rzzTmVlZSkzM1MrV67UrFmzJJ2+5BwTE6Po6Gi1bNlSjRs31sKFC0sd6+PjozM/UdjpdEo6fUm4W7duGjNmjHuskhlrCZfLVWrZGFPqKy0rouTLTc78nmqXy6UXXnjB/SUGhw8fVu3atUsdV1xcrL///e+6++67JUlHjhzRVVddpZ07d7rHPdcnJbtcLr311lvu73s/ePCgrr32Wq1du7bUdw+U9CYkJER/+tOf9OWXXyo1NVXjxo3zem8B23GpHPCgd+/emjt3rmrXrq3Q0FBJp7/Rp1q1anr00UcVERGhTZs2lQmIOnXqaP/+/SooKNCxY8e0detWSadnnh9//LGys7NljNGECRP01ltvlTq2adOm2rlzpw4cOCDp9DvGW7duXW6dvr6+HkMqIiJC7733niTp0KFD6tmzpzIzM8vsk5ycLKfTqby8PMXHx7tDW5KCg4MVGhqqjRs3SpJWrVpV6thFixZJkn788Uf17NlT+fn55dYUHR2tadOmqVWrVgoMDPR6bwHbMeMGPOjVq5c6depU6h3Vt9xyi2699VZ169ZNNWrUUMuWLfXrr7+WOi4sLEwdOnTQvffeqxtvvFHh4eHuY4cOHaoHHnhALpdLt956qx5++OFSx1577bWaNGmShg4dKqfTqXr16nl8R3fbtm310ksvlfs99kOHDtWECRPUvXt398y65MVIibi4OGVkZKh3794qKipSnz591Lp161L/hjVt2jQ9/fTTeuWVV9S4cWPVqFFDkjRmzBiNGzdOPXr0kCRNnz5dQUFB5dbduXNnjR8/3v3vbd7uLWA7vh0MwHmbNWuW+vXrpz/84Q9as2aNVq1apcTExKouC7giMOMGcN7q1aunhx56SH5+fqpVqxb/3w1UImbcAABYhDenAQBgEYIbAACLENwAAFiE4AYAwCIENwAAFiG4AQCwyP8Dqs42Lvl+hdMAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#Plot eigenvalues repartitions\n", "x = np.ones_like(range(len(eigenvalues_lc)))\n", "plt.plot(eigenvalues_lc,x,\"b.\",markersize = 10)\n", "plt.xlim([0,0.5])\n", "plt.title(\"Repartition of eigenvalues (zoom on the part next to 0)\")\n", "plt.xlabel(\"Value of the eigenvalue\")\n", "\n", "##count how many values we have until the gap\n", "nb_before_1rst=len(eigenvalues_lc[np.where(eigenvalues_lc< 0.2)])+1 # +1 correspond to the first 0 not in the list of eigenvalues\n", "nb_before_2nd=len(eigenvalues_lc[np.where(eigenvalues_lc< 0.4)])+1 # +1 correspond to the first 0 not in the list of eigenvalues\n", "print(\"number of eigenvalues before 1st gap :\",nb_before_1rst)\n", "print(\"number of eigenvalues before 2nd gap :\",nb_before_2nd)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- As we see on the graph, we have two big gaps. The first corresponds to k=3 and the second to k=6. We will test these two possibilities\n", "- We have decided to take d=k, because d is the number of eigenvectors to keep when applying the K-means. If d 2$ clusters, run $k$-means on $Z$. Don't implement $k$-means, use the `KMeans` class imported from scikit-learn.*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We choose to do the embedding with the eigenvectors obtained from the eigendecomposition of the normalized Laplacian." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "----- For k= 3 and d= 3 -----\n", "Number of elements in clusters :\n", "Cluster 1 : 289\n", "Cluster 2 : 112\n", "Cluster 3 : 60\n", "\n", "----- For k= 6 and d= 6 -----\n", "Number of elements in clusters :\n", "Cluster 1 : 107\n", "Cluster 2 : 11\n", "Cluster 3 : 167\n", "Cluster 4 : 93\n", "Cluster 5 : 58\n", "Cluster 6 : 25\n" ] } ], "source": [ "# For k=3 and d=3\n", "k = 3; d = 3\n", "H = eigenvectors_lc[:,:d]; \n", "clusters3 = KMeans(n_clusters=k, random_state=0).fit_predict(H)\n", "\n", "print(\"----- For k=\",k,\" and d=\",d,\" -----\")\n", "print(\"Number of elements in clusters :\")\n", "for i in range(k):\n", " cnt = 0\n", " for j in clusters3:\n", " if j == i:\n", " cnt +=1\n", " print(\"Cluster \",i+1,\":\",cnt)\n", "\n", "#For k=6 and d=6\n", "k = 6; d = 6\n", "H = eigenvectors_lc[:,:d]; \n", "clusters6 = KMeans(n_clusters=k, random_state=0).fit_predict(H)\n", "print()\n", "print(\"----- For k=\",k,\" and d=\",d,\" -----\")\n", "print(\"Number of elements in clusters :\")\n", "for i in range(k):\n", " cnt = 0\n", " for j in clusters6:\n", " if j == i:\n", " cnt +=1\n", " print(\"Cluster \",i+1,\":\",cnt)\n" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "----- For k=2 (this is just an exemple, it has no real sense for our graph) -----\n", "Number of elements in clusters :\n", "Cluster labeled +1 : 148\n", "Cluster labeled -1 : 313\n" ] } ], "source": [ "#For k=2, we have :\n", "fiedler_vect = np.sign(eigenvectors_lc[:,0])\n", "nb_neg=len(fiedler_vect[np.where(fiedler_vect==-1)])\n", "nb_pos=len(fiedler_vect[np.where(fiedler_vect==1)])\n", "print(\"----- For k=2 (this is just an exemple, it has no real sense for our graph) -----\")\n", "print(\"Number of elements in clusters :\")\n", "print(\"Cluster labeled +1 :\",nb_pos)\n", "print(\"Cluster labeled -1 :\",nb_neg)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "### Question 12\n", "\n", "- *Use the computed cluster assignment to reorder the adjacency matrix $A$.\n", "What do you expect? What do you observe?*" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 1.05, 'Reordered ajacency matrix for k=6')" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAVEAAAFWCAYAAADQc676AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4wLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvqOYd8AAAIABJREFUeJztfX20V1WZ/+fyomOAGZMzZaUDJpqSmJGmIa2swClvopkgDNNIaqlDQz8lEBV8IYFEy3DKmonGpFYIFzOb1fIltRvgS2P5rmmZpAiGUQak8nLP7w/WuW02z7P3s/fZ55x9vt/9Weuu+/2es/ezn/2cfZ79vJ3z7ciyLENCQkJCghf61M1AQkJCQpORlGhCQkJCASQlmpCQkFAASYkmJCQkFEBSogkJCQkFkJRoQkJCQgEkJVoBDj74YHR2duKkk07CuHHjMHbsWHzyk5/Eo48+WtqYjz76KI4//vjS6G/cuBEHH3ywU5+f/vSnmDt3bkkcxYl77rkH1157LXnOVR47duzAOeecg7Fjx2LJkiXePB188MHYuHGjU5/77rsPp5xyCj7xiU/gtNNOwyOPPOI9fquhX90MtAtuuOEGDB48uPf7t7/9bcydOxdLly6tkatq8eEPfxgf/vCH62ajUjz66KN45ZVXyHOu8njppZewcuVKPPTQQ+jbt28oFq3YunUrvvCFL+Db3/42Dj30UNx9992YPn06brvttsp4iBlJidaA7du3Y926dXjjG9/Ye+wb3/gGbr/9dvT09OBtb3sb5syZg3/8x3/E+vXrcemll2Lt2rXIsgzjxo3DmWeeiRdeeAGTJk3CgQceiLVr1+LGG2/EnXfeiRtuuAEDBw7EsGHDdhmToz958mS88Y1vxLPPPovTTz8d48aNw5e+9CU8/fTT2LZtG4455hh88YtfRL9+/XD77bfjK1/5Cvbaay8MHz6cnd/y5cuxdOlSbNu2Da+88grOOussTJw4EStWrMBtt92Gb37zm3jooYdw1VVXYevWrdiwYQOOPfZYXHnllQCAu+++G1/96lfR09ODN7zhDbjssstwyCGH4Je//CUWLlyIV199FR0dHZg6dSo+9KEPYcWKFbjjjjvQp08frFmzBv3798eCBQswbNgwbNiwAXPmzMGzzz6LPn36YMKECfjIRz6Cj3/84+ju7sagQYOQZRlOOOEEXHvttTjkkEN657FixQrcfvvteO2117B27Vq89a1vxaRJk7BkyRI899xzOOOMMzBlyhT89a9/xaWXXornnnsOr7zyCgYMGICFCxdi06ZN+MEPfoAdO3Zg0KBBOOCAA7B8+XK8+uqrGDhwIE4++WTcdtttuPbaa/HJT34SEydOxKRJk7B8+XLccMMNuOmmm7DXXnsBADZv3owzzzwT27dvxymnnIJFixbhD3/4A7785S/j1VdfRf/+/TFt2jSMHj0aK1as2GWcG2+8kbxOGzZswBlnnIEJEybgE5/4BCZPnrxbmxNOOAHnnHMOuru70b9/f2RZhueffx5vetOb5Au+1ZEllI5hw4ZlJ554YtbZ2Zl94AMfyI4//vjsiiuuyF5++eUsy7Ls5ptvzqZNm5Zt27Yty7Is+8EPfpCdeeaZWZZl2aRJk7LFixdnWZZlf/nLX7LOzs7sxz/+cfb8889nw4YNy37xi19kWZZlTzzxRHbMMcdkf/jDH7Isy7JLLrkk+9CHPmSl/y//8i/ZhRde2MvrzJkzs+9+97tZlmXZ9u3bswsuuCD71re+lW3YsCF773vfmz3zzDNZlmXZ9ddfnw0bNmy3uW7evDk77bTTso0bN2ZZlmW/+tWvsiOOOCLLsizr6urKzj777CzLsuwLX/hCdt999/X2Ofroo7NHH320d5wnnngiy7Isu+2227LPfOYz2Z///OdszJgx2fPPP59lWZatX78+Gz16dLZ27dqsq6sre+9735utW7cuy7Isu/zyy7MvfvGLWZZl2XnnnZctWLCgV34f//jHs+eeey4755xzsiVLlmRZlmWrV6/OTjvttN3mktN98cUXsx07dmQf+9jHsqlTp2Y7duzInnzyyezd7353tmPHjuwnP/lJdsUVV/T2u+SSS7LLL788y7Is+9rXvpZddtllvfTe9773ZZs2bdpNHk899VR21FFHZffcc0927LHHZr/97W934+f555/vleXGjRuzY445JnvooYeyLMuyp59+OjvqqKOy3//+97uNo2PYsGHZE088kX3sYx/LbrnlFrINhQ0bNmSjRo3KDjvssOyOO+4Q92t1JEu0IuTu/BNPPIGzzjoL73nPe/D3f//3AHZaXo8++ig++clPAgB6enrw6quv4q9//St++ctfYvHixQCAQYMG4ZRTTkF3dzdGjBiBfv364YgjjgAA3HvvvfjABz6AfffdFwAwfvx4rFy50kg/x8iRI3s/33PPPXj00UexfPlyAMBrr70GAHjwwQcxbNgwvPOd7+ylf8011+w2zwEDBuD666/Hz372Mzz33HN46qmn8Ne//nW3dvPnz0d3dzeuv/56PPvss3jttdd653vQQQfhXe96FwBgzJgxGDNmDH72s59hw4YNOO+883ppdHR04Ne//jUA4LDDDsNb3vIWAMChhx6KO+64AwCwevVqTJ8+vVd+P/7xjwEAkyZNwlVXXYVJkyZh6dKlOP3008nr9u53vxtvfetbAQBvf/vbMWrUKPTp0wfveMc78Prrr+PVV1/FCSecgHe84x248cYbsWbNGjzwwAN4z3veQ9I7+OCDMXDgQPL4v//7v+Ozn/0s5s+fj6FDh5L9czzyyCPYf//9MWLECADAQQcdhCOPPBIPPPAAOjo62HFynHXWWXjLW96Czs5OAMBf/vIXoyUKAG9+85vx85//HI8//jj+7d/+DQceeCCGDBli5LMdkJRoxTj00ENx4YUX4uKLL8aIESPw9re/HT09PTjzzDMxceJEADtjUK+88gp6enqQaa826Onpwfbt2wEAe+yxB/r123kJOzo6dmmrxsw4+jne8IY37NL22muvxYEHHghg583V0dGBe++9dxf6+bg61q9fj/Hjx+O0007De9/7Xpxwwgm4++67d2s3adIkHHLIITjuuOPwz//8z3j44YeRZRn69u2Ljo6O3nZZluHXv/41duzYgQMPPBDLli3rPffSSy9h8ODBuPXWW/F3f/d3vcdVWfTr128Xerkreuyxx+LVV1/Fvffei//7v//DggULyPnsscceu3yn5v39738fN910EyZNmoTOzk7ss88+eOGFF0h6qqx1PPPMM3jzm9+Mhx9+GOPGjWPbATuvk44sy7B9+3b079/fOA4AXH755bj++uvxne98B1OmTMHee++NW265hWy7adMm3HffffjoRz8KYOeGdcghh+Dpp59OShQpO18LTjzxRBxxxBG9McBRo0Zh+fLl2Lx5MwDg2muvxRe/+EUMHDgQI0aMwPe+9z0AOxfzD3/4Qxx77LG70Tz22GOxatUqrF+/HgBw8803957j6FMYNWoU/ud//gdZlmHr1q0455xzsGTJEowcORK/+c1v8NRTTwHYGS+k8Nhjj2Hw4ME4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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAVEAAAFWCAYAAADQc676AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4wLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvqOYd8AAAIABJREFUeJztnX20V1Wd/98XsMYEI2acKSpJTDQlNbphGtLKGmDKG2gmyB2mFWk+DRMzaBAJ+JRCikYyRs0MjUktES6KNGuWimkMQupYPlv2JCmCYUwqpjzce35/8Du3zebz+ezPPk/ffb7f/Vrrrvv9nrMfPmeffT7n87DP+bYlSZIgEolEIpno02gBIpFIpM5EJRqJRCI5iEo0EolEchCVaCQSieQgKtFIJBLJQVSikUgkkoOoRCvgyCOPREdHB8aPH48JEyZg7Nix+MxnPoPHH3+8tD4ff/xxnHLKKaW1v337dhx55JFede655x5ceeWVJUkUJvfddx8WLVpE7vMdj+7ubpx//vkYO3Ysli1bllmmI488Etu3b/eq88c//hEzZszAhAkTMG7cONx+++2Z+282+jVagFbhpptuwqBBg3q//8d//AeuvPJKLF++vIFSVcvHP/5xfPzjH2+0GJXy+OOP4+WXXyb3+Y7Hiy++iPXr1+ORRx5B3759ixJRxaxZs3D44Ydj4cKF2Lp1Kzo6OvDhD38Yb3/72yuVI0SiEm0Ae/bswZYtW/DWt761d9u3vvUt3HXXXejp6cE73/lOzJs3D3/zN3+DrVu34tJLL8XmzZuRJAkmTJiAs88+G88//zw6Oztx+OGHY/Pmzbj55puxdu1a3HTTTejfvz+GDRu2T59c+1OmTMFb3/pW/OY3v8FZZ52FCRMm4Gtf+xqeeeYZ7N69GyeeeCK+/OUvo1+/frjrrrtw/fXX48ADD8Tw4cPZ41u5ciWWL1+O3bt34+WXX8Y555yDyZMnY9WqVbjzzjvx7W9/G4888giuueYa7Nq1C9u2bcNJJ52Eq666CgBw77334hvf+AZ6enrwlre8BZdddhmOOuoo/PSnP8W1116L119/HW1tbZg2bRo+9rGPYdWqVbj77rvRp08fbNq0CQcccAAWLFiAYcOGYdu2bZg3bx5+85vfoE+fPpg0aRI+8YlP4FOf+hTWrVuHAQMGIEkSjBs3DosWLcJRRx3VexyrVq3CXXfdhTfeeAObN2/GO97xDnR2dmLZsmV49tln8fnPfx5Tp07Fn/70J1x66aV49tln8fLLL+Oggw7Ctddei1dffRW33HILuru7MWDAAAwZMgQrV67E66+/jv79++O0007DnXfeiUWLFuEzn/kMJk+ejM7OTqxcuRI33XQTbr31Vhx44IEAgB07duDss8/Gnj17cPrpp+OGG27A73//e3z961/H66+/jgMOOADTp0/H6NGjsWrVqn36ufnmm8nztG3bNnz+85/HpEmT8OlPfxpTpkzZr8y4ceNw1llnYcOGDbj++usBAG9/+9tx66237jN/W5okUjrDhg1LTj311KSjoyP5yEc+kpxyyinJFVdckbz00ktJkiTJbbfdlkyfPj3ZvXt3kiRJcssttyRnn312kiRJ0tnZmSxdujRJkiR55ZVXko6OjuSHP/xh8txzzyXDhg1LHnrooSRJkuSpp55KTjzxxOT3v/99kiRJMmfOnORjH/uYs/2///u/T77yla/0yjpr1qzke9/7XpIkSbJnz57koosuSr7zne8k27ZtSz74wQ8mv/zlL5MkSZIlS5Ykw4YN2+9Yd+zYkZx55pnJ9u3bkyRJkp/97GfJ8ccfnyRJknR1dSVf/OIXkyRJkn/+539OfvKTn/TWOeGEE5LHH3+8t5+nnnoqSZIkufPOO5MvfOELyR//+MdkzJgxyXPPPZckSZJs3bo1GT16dLJ58+akq6sr+eAHP5hs2bIlSZIkufzyy5Mvf/nLSZIkyYUXXpgsWLCgd/w+9alPJc8++2xy/vnnJ8uWLUuSJEk2bNiQnHnmmfsdS9ruCy+8kHR3dyef/OQnk2nTpiXd3d3J008/nbz//e9Puru7k//+7/9Orrjiit56c+bMSS6//PIkSZLkm9/8ZnLZZZf1tvehD30oefXVV/cbj5///OfJyJEjk/vuuy856aSTkl//+tf7yfPcc8/1juX27duTE088MXnkkUeSJEmSZ555Jhk5cmTyu9/9br9+bIYNG5Y89dRTySc/+clk9erVZBmTRx99NDnllFOSf/3Xf00mTpyYnHbaackPf/hDZ71WIVqiFZG680899RTOOeccfOADH8Bf/uVfAthreT3++OP4zGc+AwDo6enB66+/jj/96U/46U9/iqVLlwIABgwYgNNPPx3r1q3Dcccdh379+uH4448HAGzcuBEf+chHcMghhwAAJk6ciPXr14vtp7S3t/d+vu+++/D4449j5cqVAIA33ngDAPDwww9j2LBheO9739vb/nXXXbffcR500EFYsmQJfvzjH+PZZ5/Fz3/+c/zpT3/ar9z8+fOxbt06LFmyBL/5zW/wxhtv9B7vEUccgfe9730AgDFjxmDMmDH48Y9/jG3btuHCCy/sbaOtrQ2/+MUvAADHHHNMr2t59NFH4+677wYAbNiwARdffHHv+P3whz8EAHR2duKaa65BZ2cnli9fjrPOOos8b+9///vxjne8AwDwrne9C6NGjUKfPn3w7ne/Gzt37sTrr7+OcePG4d3vfjduvvlmbNq0CQ8++CA+8IEPkO0deeSR6N+/P7n9H//xH3Huuedi/vz5GDp0KFk/5bHHHsOhhx6K4447DgBwxBFHYMSIEXjwwQfR1tbG9pNyzjnn4O1vfzs6OjoAAK+88gpriY4cORLPP/88+vfvj1tuuQWbNm1CZ2cnhgwZInokrUJUohVz9NFH4ytf+QouueQSHHfccXjXu96Fnp4enH322Zg8eTIAYNeuXXj55ZfR09ODxHq1QU9PD/bs2QMAeNOb3oR+/faewra2tn3KmjEzrv2Ut7zlLfuUXbRoEQ4//HAAey+utrY2bNy4cZ/2035ttm7diokTJ+LMM8/EBz/4QYwbNw733nvvfuU6Oztx1FFH4eSTT8bf/d3f4dFHH0WSJOjbty/a2tp6yyVJgl/84hfo7u7G4YcfjhUrVvTue/HFFzFo0CCsWbMGf/EXf9G73RyLfv367dPec889h7e97W046aST8Prrr2Pjxo343//9XyxYsIA8nje96U37fKeO+wc/+AFuvfVWdHZ2oqOjAwMHDsTzzz9PtmeOtc0vf/lL/NVf/RUeffRRTJgwgS0H7D1PNkmSYM+ePTjggAPEfgDg8ssvx5IlS/Dd734XU6dOxcEHH4zVq1eTZZ977jkAwOmnnw4AGDJkCEaMGIHHHnssKlHE7HxDOPXUU3H88cf3xgBHjRqFlStXYseOHQCARYsW4ctf/jL69++P4447Dt///vcBAK+++ipuv/12nHTSSfu1edJJJ+H+++/H1q1bAQC33XZb7z6ufYpRo0bhP//zP5EkCXbt2oXzzz8fy5YtQ3t7O371q1/h5z//OYC98UKKJ554AoMGDcIFF1yAk08+uVeBdnd395Z5+eWX8cQTT+Ciiy7CmDFj8OKLL+J3v/sdenp6cNxxx+HXv/41fvnLXwLYm8G++OKLcfzxx2PTpk146KGHAABPP/00xo4di9///vfiWJ944ono6urqHb/Pfe5zePbZZ9HW1obJkyfjq1/9Kk499VS8+c1vFtuRWL9+PU477TR89rOfxWGHHYYf/ehHvcfbt2/f3puexF133YUHHngAd9xxB+6//36sXbtWLH/cccfht7/9LR577DEAexXwQw89hJEjR6pkPv744zF//nx861vfwjPPPCOWffe7341jjjmmd0699NJL+NnPfhYV6P8nWqINYs6cOfj0pz+N//mf/8FnP/tZvPjiizjzzDPR1taGd7zjHZg/fz4A4Nprr8Xll1+OVatWYdeuXejo6MDpp5+OzZs379PekUceiYsvvhif+9zncNBBB+HYY4/t3Se1b/PVr34VX/va19DR0YHdu3fjpJNOwtlnn40DDjgA1157LS666CIccMAB+NCHPkTW/8hHPoKVK1di3LhxOPDAA3Hsscdi0KBB2LRpU2+Zt771rfjiF7+I0047DQMHDsTb3vY2jBgxAps2bcKJJ56Ia6+9FjNnzkR3dzf69++P66+/HoMGDcI3v/lNfP3rX8fOnTuRJAm+/vWv453vfKc4znPnzsWll16Kjo4OJEmCc889t/fiP+2007BgwQJMnDjRfcIEpk6dirlz52LVqlXo27cvjjnmmF7FdOKJJ2LatGk44IADcMwxx5D1t2zZgnnz5mHJkiUYNGgQ5s+fjwsvvBDDhw9ns9+DBg3CokWLcMUVV+CNN95AW1sbrr76ahx22GH42c9+ppJ76NChuOCCC3DxxRdjxYoV+1ndJosXL8bll1+OW265BT09Pbjwwgv3mWOtTFti+4uRSEl873vfw09/+lN84xvfaLQoAID/+q//wm233YZ///d/b7QokRoTLdFIJSxcuBC33XYbrrjiikaLAgCYMmUKXnrpJdxwww2NFiVSc6IlGolEIjmIiaVIJBLJQVSikUgkkoOGxER7enpw6aWX4he/+AXe9KY34corr8SQIUMaIUplPProo7j22mt7F2TPmjULbW1tOOKIIzBv3jz06dMHixcvxn333Yd+/fph9uzZTZP93L17N2bPno3Nmzf3Lpt673vf21Jj0N3d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vklJb3GqlSXaTEtHijoOysKUMsdUfZ++JBlc+7P20wivoKg+XcrR/m//SeWlPrmVBNp55zqnrrg8tZ2y4imPhPM0zG1cApWT2W6HGnupnEStLNFmpNmtMA2tMgacReeCyvZLqwiyxKolGasi5HkQ/EuZtScuyx01K2WHDopy512uFldGs09bVnNepH5CvnjyEmps3RcpHJF+5nApde7mQM1hya2XZKHCD1I/dt30xxQpglCirUwzKxAtzTwGVLyS2yYpB+qi59ozy3AyuRSN65h8jAvtTV0TE82KawxdNE1MNKUZ7u5VHkOR8T1uu2/cs1VJL1pNHJGy/LglaXbb0rlK/3PxVykuKMUQi0QKVWTBXmtsb89DLZVoMySXqjyGovqSLvxmSvqFADWeVBJFs85X04fdn6k8KaVT9LnmlGaeNqrCudi+u7sbl1xyCX7729+ira0Nl112Gd785jdj1qxZaGtrwxFHHIF58+ahT58+WLx4Me677z7069cPs2fPxrHHHlvFMUQiwULF/Ips2/7sat+26KiwgY+Mvm49V6eIcWnUTdypRO+9914AwC233IIHHngA119/PZIkwfTp03HCCSdg7ty5uOeeezB48GA8+OCDWLFiBbZs2YJp06ahq6ur9ANodaQYml2mqL6o7SlFJLCKrNtoNO4v50oD9DIhyl3ntnMxU0km7fmU5JRwrTKg2nRZ4UVtz3LtqBJLe/bsQb9+/XDbbbfhJz/5CTZs2IB169ahra0Na9euxf3334/DDjsMb7zxBr74xS8CACZMmIClS5di0KBBYtvNmlDQ0sxJFS3NPgaSUtJkrillolniRPURlzhlo5AlTjNnzsTdd9+Nb37zm5g1axbWr18PANi4cSO6urowdOhQDBw4EJMnTwYAdHZ24qqrrsKQIUMKOIS9mI8HSksOiuyvjH7S46jiGNL+iuhLaqfIsSpr3BuB5pHWqlizcLy3PGmd9HzY16B9rqhzl26j+qba4Nqx29L2z1HUdei1xGnbtm0488wzsWPHDjz00EMAgLVr12LDhg14z3veg507d+Kcc84BEC1RLSHffaui2cfA5R5Ly6B88VnP6bvW0q5XNFXPA5/jyLXE6fbbb8e3v/1tAMCBBx6ItrY2DB8+HA888AAAYN26dWhvb8eIESOwfv169PT04IUXXkBPT49TgUaai7jEyY0U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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# For k=3\n", "new_order3 = np.array([],dtype = int)\n", "for i in range(3):\n", " new_order3 = np.append(new_order3,np.where(clusters3 == i))\n", "plt.spy(adjacency_th[:,new_order3][new_order3], markersize=1)\n", "plt.title(\"Reordered ajacency matrix for k=3\")\n", "\n", "#For k=6\n", "plt.figure()\n", "new_order6 = np.array([],dtype = int)\n", "for i in range(6):\n", " new_order6 = np.append(new_order6,np.where(clusters6 == i))\n", "plt.spy(adjacency_th[:,new_order6][new_order6], markersize=1)\n", "plt.title(\"Reordered ajacency matrix for k=6\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We were expecting a block diagonal matrix or something close to it, because the nodes of one cluster are supposed to be mostly connected with the nodes of this same cluster. Of course the clusters are not fully independent (in this case, our graph would have several distinct components).\n", "- For k=3, we observe 3 blocks in the diagonal. However, those blocks seems to have \"internal\" blocks : that means that it may exist some \"internal\" clusters in clusters. This is fully visible in the case k=6.\n", "- For k=6, the diagonal is composed of 6 blocks. Some blocks (like the 3rd - 167 nodes) are much bigger than others (like the 2nd - 11 nodes). The blocks are still connected with the other blocks even if they are mostly link with themselves." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "### Question 13\n", "\n", "*If you have ground truth clusters for your dataset, compare the cluster assignment from spectral clustering to the ground truth.\n", "A simple quantitative measure is to compute the percentage of nodes that have been correctly categorized.\n", "If you don't have a ground truth, qualitatively assess the quality of the clustering.*\n", "\n", "*Ground truth clusters are the \"real clusters\".\n", "For example, the genre of musical tracks in FMA, the category of Wikipedia articles, the spammer status of individuals, etc.\n", "Look for the `labels` in the [dataset descriptions](https://github.com/mdeff/ntds_2018/tree/master/projects/README.md).*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Since there are no labels in our dataset, we have chosen to check our hypothesis of geographical clusters. In order to do that we import back our dataframe of airports and flights." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "# import of routes\n", "routes = pd.read_csv('routes.dat', sep=',', encoding='utf-8', engine='python')\n", "routes.columns = ['Airline','Airline ID','Source Airport','Source Airport ID','Destination Airport','Destination Airport ID','Codeshare','Stops','Equipment']\n", "routes = routes.drop(columns=['Source Airport ID','Destination Airport ID'])\n", "\n", "# import of source and destination airport\n", "source_airports = routes[['Source Airport']]\n", "source_airports = source_airports.rename(columns={'Source Airport':'Airport'})\n", "\n", "dest_airports = routes[['Destination Airport']]\n", "dest_airports = dest_airports.rename(columns={'Destination Airport':'Airport'})\n", "\n", "# creation of a dataframe with all airport and airport_idx \n", "# (we use airport_idx insteed of airportID because some airports have no airportID)\n", "airports = pd.concat([source_airports,dest_airports])\n", "airports = airports.drop_duplicates()\n", "airports.reset_index(inplace=True)\n", "airports = airports.drop(columns=['index'])\n", "airports.reset_index(inplace=True)\n", "airports = airports.set_index('Airport')\n", "airports = airports.rename(columns={'index':'airport_idx'})" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "--------------------------------- For k=3 ---------------------------------\n", "\n", "Cluster 1 :\n", " ['DME' 'GYD' 'KZN' 'LED' 'OVB' 'SVX' 'IKT' 'YKS' 'ABJ' 'ACC' 'COO' 'DKR'\n", " 'BOD' 'BRS' 'GVA' 'LCA' 'LPA' 'TFS' 'ZRH' 'ARN' 'OSL' 'TRF' 'DWC' 'MNL'\n", " 'SSA' 'BCN' 'DLA' 'LGW' 'LOS' 'NBO' 'BKK' 'DRW' 'HKT' 'KUL' 'PEN' 'PER'\n", " 'REP' 'RGN' 'SGN' 'DUS' 'FMM' 'HAM' 'MUC' 'NAP' 'OLB' 'SZG' 'TXL' 'ZAD'\n", " 'AMS' 'BGY' 'BLQ' 'BRU' 'CGN' 'CMN' 'LYS' 'MPL' 'PMI' 'SAW' 'TLS' 'TSF'\n", " 'MEL' 'SYD' 'CAI' 'TLV' 'VKO' 'CCU' 'DAC' 'DXB' 'JED' 'KTM' 'MCT' 'HAV'\n", " 'DEL' 'ISB' 'AYT' 'BSL' 'HRG' 'SKP' 'AGP' 'ALG' 'ATH' 'BEG' 'BGO' 'BHX'\n", " 'BIA' 'BIO' 'BRE' 'BRI' 'BUD' 'CAG' 'CDG' 'CFU' 'CTA' 'CWL' 'DBV' 'DTM'\n", " 'DUB' 'EDI' 'FAO' 'FCO' 'FRA' 'HAJ' 'HEL' 'HER' 'IBZ' 'KGS' 'KRK' 'KTW'\n", " 'LEJ' 'LHR' 'LIN' 'LIS' 'MAD' 'MAN' 'MXP' 'NCE' 'NUE' 'PMO' 'PRG' 'PSA'\n", " 'RAK' 'RHO' 'SKG' 'SPU' 'STN' 'STR' 'SUF' 'TRN' 'TUN' 'VCE' 'VIE' 'VRN'\n", " 'WAW' 'WRO' 'ZAG' 'FAI' 'BET' 'BKI' 'CEB' 'CGK' 'DPS' 'NRT' 'SVO' 'TOS'\n", " 'AEP' 'CPT' 'JNB' 'BLR' 'BOM' 'COK' 'HYD' 'MAA' 'SXF' 'TBS' 'CPH' 'KJA'\n", " 'KRR' 'EVN' 'RIX' 'HND' 'ALA' 'DYU' 'FRU' 'IKA' 'IST' 'SHJ' 'KUF' 'ROV'\n", " 'ADB' 'BJV' 'DLM' 'AMM' 'HBE' 'TIP' 'BVA' 'KBP' 'KIV' 'OTP' 'AUH' 'BAH'\n", " 'CMB' 'DMM' 'DOH' 'KWI' 'RUH' 'CHQ' 'IEV' 'MRS' 'NTE' 'SOF' 'AJA' 'FLR'\n", " 'GOT' 'LIL' 'ORY' 'SXB' 'EBB' 'ABZ' 'ADL' 'AKL' 'BNE' 'CHC' 'CNS' 'CTS'\n", " 'GLA' 'ITM' 'LBA' 'LHE' 'LUX' 'NAN' 'NCL' 'PPT' 'RTM' 'SVG' 'ACE' 'ALC'\n", " 'DJE' 'FNC' 'FUE' 'GDN' 'JER' 'LCY' 'MAH' 'MLA' 'NBE' 'SVQ' 'VLC' 'ADD'\n", " 'FIH' 'LAD' 'TRD' 'VNO' 'CGH' 'VCP' 'ABV' 'BEY' 'BLL' 'DAR' 'LJU' 'MRU'\n", " 'SOU' 'TNR' 'ORN' 'MLE' 'MYY' 'SUB' 'UPG' 'AGA' 'KEF' 'MSQ' 'OPO' 'TLL'\n", " 'AHO' 'KHI' 'KRT' 'TAS' 'TSE' 'MHD' 'SYZ' 'THR' 'PFO' 'EMA' 'LPL' 'POM'\n", " 'KHV' 'GSE' 'RYG' 'ORK' 'SCQ' 'SNN' 'EBL' 'MED' 'SAH' 'WLG' 'TPS' 'ESB'\n", " 'HIR' 'VLI' 'CIA' 'CRL' 'EIN' 'GRO' 'HHN' 'LTN' 'NRN' 'NYO' 'PIK' 'WMI'\n", " 'BFS']\n", "Cluster 2 :\n", " ['LIM' 'BOG' 'UIO' 'BSB' 'GIG' 'GRU' 'ORD' 'STL' 'YQB' 'YUL' 'ATL' 'FLL'\n", " 'JAX' 'MCO' 'PBI' 'RSW' 'TPA' 'AUA' 'ANU' 'SDQ' 'SXM' 'YVR' 'LAS' 'LAX'\n", " 'DFW' 'EZE' 'JFK' 'MIA' 'PUJ' 'YEG' 'YOW' 'YYC' 'CUN' 'GDL' 'GUA' 'MEX'\n", " 'MTY' 'PVR' 'SAT' 'SJD' 'SJO' 'SNA' 'TIJ' 'SCL' 'CWB' 'POA' 'YWG' 'BZE'\n", " 'ANC' 'CCS' 'CLT' 'POS' 'CVG' 'DTW' 'GSP' 'LGA' 'MEM' 'MSP' 'MSY' 'BOS'\n", " 'SJU' 'PLS' 'PTY' 'EWR' 'YYZ' 'PHL' 'ABQ' 'AUS' 'BDL' 'BHM' 'BNA' 'BUF'\n", " 'BWI' 'CHS' 'CLE' 'CMH' 'CNF' 'DCA' 'DEN' 'GRR' 'HNL' 'HOU' 'IAD' 'IAH'\n", " 'IND' 'MBJ' 'MCI' 'MKE' 'MYR' 'NAS' 'OAK' 'OGG' 'OKC' 'OMA' 'PDX' 'PHX'\n", " 'PIT' 'RDU' 'SAL' 'SAN' 'SDF' 'SEA' 'SFO' 'SJC' 'SLC' 'SMF' 'YHZ' 'DAL'\n", " 'MDW' 'SFB' 'AZA' 'PIE']\n", "Cluster 3 :\n", " ['HAK' 'HGH' 'HKG' 'KIX' 'SIN' 'SWA' 'TPE' 'CAN' 'CGO' 'CGQ' 'CKG' 'CSX'\n", " 'CTU' 'DLC' 'FOC' 'HET' 'HFE' 'HRB' 'ICN' 'INC' 'KHN' 'KMG' 'KWE' 'KWL'\n", " 'LHW' 'LJG' 'NGB' 'NKG' 'NNG' 'PEK' 'PVG' 'SHE' 'SJW' 'SYX' 'SZX' 'TAO'\n", " 'TNA' 'TSN' 'TYN' 'URC' 'WNZ' 'WUH' 'XIY' 'XMN' 'ZUH' 'HAN' 'MFM' 'NGO'\n", " 'PUS' 'CJU' 'FUK' 'CNX' 'SHA' 'KHH' 'OKA' 'RMQ' 'DMK' 'YNT' 'DAD' 'NAY']\n" ] } ], "source": [ "#For clustering with k=3\n", "print(\"--------------------------------- For k=3 ---------------------------------\\n\")\n", "\n", "for i in range(3):\n", " print(\"Cluster\",i+1,\" :\\n\",airports.index[node_map[np.where(clusters3 == i)]].values)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For k=3, we observe that our cluster are relative to the continents.\n", "- **Cluster 1:** European Airports (ex : Geneva, Lyon, Dublin, Rome, Vienne etc) + some Indonesian Airports (Jawa Timur, Jakarta)\n", "- **Cluster 2:** American Continent Airport (ex : Peru, America, Canada etc)\n", "- **Cluster 3:** Asian Continent (ex : China, Japan)\n", "\n", "We notice that some airports are badly clustered if we consider geographical clusters : for exemple ITM (Osaka Airport, Japan) is in Cluster 1 (\"Europe\"). Moreover the \"mix\" of geographic areas in cluster 1 really shows that some in-clusters exist. Choosing a higher k will probably show a result closer to the geographical \"reality\"." ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "--------------------------------- For k=6 ---------------------------------\n", "\n", "Cluster 1 :\n", " ['LIM' 'BOG' 'UIO' 'ORD' 'STL' 'YQB' 'YUL' 'ATL' 'FLL' 'JAX' 'MCO' 'PBI'\n", " 'RSW' 'TPA' 'AUA' 'ANU' 'SDQ' 'SXM' 'YVR' 'LAS' 'LAX' 'DFW' 'JFK' 'MIA'\n", " 'PUJ' 'YEG' 'YOW' 'YYC' 'CUN' 'GDL' 'GUA' 'HAV' 'MEX' 'MTY' 'PVR' 'SAT'\n", " 'SJD' 'SJO' 'SNA' 'TIJ' 'FAI' 'BET' 'SCL' 'YWG' 'BZE' 'ANC' 'CCS' 'CLT'\n", " 'POS' 'CVG' 'DTW' 'GSP' 'LGA' 'MEM' 'MSP' 'MSY' 'BOS' 'SJU' 'PLS' 'PTY'\n", " 'EWR' 'YYZ' 'PHL' 'ABQ' 'AUS' 'BDL' 'BHM' 'BNA' 'BUF' 'BWI' 'CHS' 'CLE'\n", " 'CMH' 'DCA' 'DEN' 'GRR' 'HOU' 'IAD' 'IAH' 'IND' 'MBJ' 'MCI' 'MKE' 'MYR'\n", " 'NAS' 'OAK' 'OGG' 'OKC' 'OMA' 'PDX' 'PHX' 'PIT' 'RDU' 'SAL' 'SAN' 'SDF'\n", " 'SEA' 'SFO' 'SJC' 'SLC' 'SMF' 'YHZ' 'DAL' 'MDW' 'SFB' 'AZA' 'PIE']\n", "Cluster 2 :\n", " ['BSB' 'GIG' 'GRU' 'SSA' 'EZE' 'AEP' 'CWB' 'POA' 'CNF' 'CGH' 'VCP']\n", "Cluster 3 :\n", " ['BOD' 'BRS' 'GVA' 'LCA' 'LPA' 'TFS' 'ZRH' 'ARN' 'OSL' 'TRF' 'BCN' 'LGW'\n", " 'DUS' 'FMM' 'HAM' 'MUC' 'NAP' 'OLB' 'SZG' 'TXL' 'ZAD' 'AMS' 'BGY' 'BLQ'\n", " 'BRU' 'CGN' 'LYS' 'MPL' 'PMI' 'SAW' 'TLS' 'TSF' 'TLV' 'AYT' 'BSL' 'HRG'\n", " 'SKP' 'AGP' 'ALG' 'ATH' 'BEG' 'BGO' 'BHX' 'BIA' 'BIO' 'BRE' 'BRI' 'BUD'\n", " 'CAG' 'CDG' 'CFU' 'CTA' 'CWL' 'DBV' 'DTM' 'DUB' 'EDI' 'FAO' 'FCO' 'FRA'\n", " 'HAJ' 'HEL' 'HER' 'IBZ' 'KGS' 'KRK' 'KTW' 'LEJ' 'LIN' 'LIS' 'MAD' 'MAN'\n", " 'MXP' 'NCE' 'NUE' 'PMO' 'PRG' 'PSA' 'RAK' 'RHO' 'SKG' 'SPU' 'STN' 'STR'\n", " 'SUF' 'TRN' 'TUN' 'VCE' 'VIE' 'VRN' 'WAW' 'WRO' 'ZAG' 'TOS' 'SXF' 'CPH'\n", " 'RIX' 'ADB' 'BJV' 'DLM' 'BVA' 'KIV' 'OTP' 'CHQ' 'IEV' 'MRS' 'NTE' 'SOF'\n", " 'AJA' 'FLR' 'GOT' 'LIL' 'ORY' 'SXB' 'ABZ' 'GLA' 'LBA' 'LUX' 'NCL' 'RTM'\n", " 'SVG' 'ACE' 'ALC' 'DJE' 'FNC' 'FUE' 'GDN' 'JER' 'LCY' 'MAH' 'MLA' 'NBE'\n", " 'SVQ' 'VLC' 'TRD' 'VNO' 'BLL' 'LJU' 'SOU' 'TNR' 'ORN' 'AGA' 'KEF' 'OPO'\n", " 'TLL' 'AHO' 'PFO' 'EMA' 'LPL' 'GSE' 'RYG' 'ORK' 'SCQ' 'SNN' 'TPS' 'ESB'\n", " 'CIA' 'CRL' 'EIN' 'GRO' 'HHN' 'LTN' 'NRN' 'NYO' 'PIK' 'WMI' 'BFS']\n", "Cluster 4 :\n", " ['MNL' 'BKK' 'DRW' 'HAK' 'HGH' 'HKG' 'HKT' 'KIX' 'PEN' 'PER' 'REP' 'RGN'\n", " 'SGN' 'SIN' 'SWA' 'TPE' 'CAN' 'CGO' 'CGQ' 'CKG' 'CSX' 'CTU' 'DLC' 'FOC'\n", " 'HET' 'HFE' 'HRB' 'ICN' 'INC' 'KHN' 'KMG' 'KWE' 'KWL' 'LHW' 'LJG' 'MEL'\n", " 'NGB' 'NKG' 'NNG' 'PEK' 'PVG' 'SHE' 'SJW' 'SYD' 'SYX' 'SZX' 'TAO' 'TNA'\n", " 'TSN' 'TYN' 'WNZ' 'WUH' 'XIY' 'XMN' 'ZUH' 'BKI' 'CEB' 'CGK' 'DPS' 'HAN'\n", " 'MFM' 'NGO' 'NRT' 'PUS' 'CJU' 'FUK' 'HND' 'CNX' 'SHA' 'KHH' 'ADL' 'AKL'\n", " 'BNE' 'CHC' 'CNS' 'CTS' 'HNL' 'ITM' 'NAN' 'PPT' 'OKA' 'RMQ' 'DMK' 'MYY'\n", " 'SUB' 'UPG' 'YNT' 'DAD' 'POM' 'WLG' 'HIR' 'VLI' 'NAY']\n", "Cluster 5 :\n", " ['ABJ' 'ACC' 'COO' 'DKR' 'DWC' 'DLA' 'LOS' 'NBO' 'KUL' 'CMN' 'CAI' 'CCU'\n", " 'DAC' 'DXB' 'JED' 'KTM' 'MCT' 'DEL' 'ISB' 'LHR' 'CPT' 'JNB' 'BLR' 'BOM'\n", " 'COK' 'HYD' 'MAA' 'IKA' 'IST' 'SHJ' 'AMM' 'HBE' 'TIP' 'AUH' 'BAH' 'CMB'\n", " 'DMM' 'DOH' 'KWI' 'RUH' 'EBB' 'LHE' 'ADD' 'FIH' 'LAD' 'ABV' 'BEY' 'DAR'\n", " 'MRU' 'MLE' 'KHI' 'KRT' 'MHD' 'SYZ' 'THR' 'EBL' 'MED' 'SAH']\n", "Cluster 6 :\n", " ['DME' 'GYD' 'KZN' 'LED' 'OVB' 'SVX' 'IKT' 'YKS' 'URC' 'VKO' 'SVO' 'TBS'\n", " 'KJA' 'KRR' 'EVN' 'ALA' 'DYU' 'FRU' 'KUF' 'ROV' 'KBP' 'MSQ' 'TAS' 'TSE'\n", " 'KHV']\n" ] } ], "source": [ "#For clustering with k=6\n", "print(\"--------------------------------- For k=6 ---------------------------------\\n\")\n", "\n", "for i in range(6):\n", " print(\"Cluster\",i+1,\" :\\n\",airports.index[node_map[np.where(clusters6 == i)]].values)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For k=6, we observe that our clusters are more relative to smaller areas (countries or region of countries).\n", "- **Cluster 1:** North and Central America (Peru, Colombia, and a lot of cities of the USA)\n", "- **Cluster 2:** South Ameria (Bresil, Argentine)\n", "- **Cluster 3:** Europe (France, Switzerland, Italy, UK, etc)\n", "- **Cluster 4:** Asia and Indonesia (Phillipines, Thailande, Chine, Japon, etc)\n", "- **Cluster 5:** Africa (Cote d'Ivoire, Egypt, Arabie Saoudite, Iran, etc)\n", "- **Cluster 6:** Russia (+ some countries linked to Russia like Kazakhstan)\n", "\n", "This clustering is really qualitative and shows some meaningful relations between countries. The case of Russia is quite revealing : it is a separate cluster and includes a lot of countries from the former Soviet Union." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "### Question 14\n", "\n", "Plot the cluster assignment (one color per cluster) on the 2D embedding you computed above with Laplacian eigenmaps." ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "image/png": "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4L/66iuUlpbCarWiq6sLJ06cQE5OTkTqVF5eDgCoqqqSBkIBQG5uLiorK9HR0YHW1lbU1dUhOztb9n3wVjaSlNTts88+w9q1a/HGG2/g+9//PgB7a2PGjBkwm80QRRGff/65dNMZKUrq9vzzz+PAgQMAuv/GouVzA4BPP/0UhYWFUlm1/I0581U3X89x/3vLyspCfX09rl+/js7OTvz973/HuHHjwnrtPV1joPU6d+4cnn76aWzatEnqzhJFEQ888AD++c9/Auj+PdWCqNo0pb29HcuXL0dTUxPi4+OxadMmpKSkYOPGjbj33nuRm5uLP/7xjygvL4fNZsOvfvUr3HHHHaiursbq1asRHx+PwYMHY/Xq1TAajbJltVS3cePG4Z577sGtt94qteDvvPNOPPXUU3jjjTewf/9+xMfHY+bMmSgtLe31OjlGm545cwaiKGLdunUoLy9HRkYGioqKsGvXLuzcuROiKOLJJ5/EtGnT8M0332D58uUwm81ISkrCpk2bkJiYKFs2kpTU7YEHHkBnZydSUlIAAJmZmXjxxRfx17/+Fdu3b4der8c999yDp556SnN1a2hokNKXCQkJWLNmDVJTU6PicwOAn/70p1i6dKk0HgWAKv7GnPVUN4cf/ehH2L9/P/r16+f1e8cxal0URcyaNQvz5s3TVL0WLVqE2tpaDB06FIC9Vb9161YcPXoUL7/8Mvr374+srCw8//zziI+Pj1TV/BZVgZyIiKiviarUOhERUV/DQE5ERKRhDOREREQaxkBORESkYQzkREREGsZATkREpGEM5ERERBrGQE5ERKRh/z8tZDlogxhngwAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "colors = ['Blue', 'Red', 'Green']\n", "\n", "for i in range(3):\n", " cluster = proj[np.where(clusters3 == i)[0], :].real\n", " plt.plot(cluster[:,0],cluster[:,1], '.', color=colors[i])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Answer**\n", "\n", "- **Blue :** Europe + Indonesia (Jawa Timur, Jakarta)\n", "- **Red :** America\n", "- **Green :** Asia" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "### Question 15\n", "\n", "Why did we use the eigenvectors of the graph Laplacian as features? Could we use other features for clustering?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Answer**\n", "\n", "The eigenvectors give the embedding of the node in a lower dimensional space keeping similar nodes (in the sense of their egde weigth) close together. Similar nodes are close to each other considering the $L-$distance used for the $k$-mean clustering. Therefore, the eigenvectors are good choice for clustering nodes. \n", "\n", "We could have used other features, such as the eigenvectors of the adjacency matrix. " ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.0" } }, "nbformat": 4, "nbformat_minor": 2 }