{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# ECI2017 Bayesian Models class Assignment\n", "\n", "In this assignment, your task will be to implement and analyze Variational Bayesian (VB) inference for Gaussian Mixture Model (GMM) as described in the slides on [Approximate Inference in Bayesian Models](http://www.fit.vutbr.cz/~burget/BayesianModels/4-Approximate%20inference.pdf). The preferred and easiest way of accomplishing this task is to complete this Jupyter Notebook, which already comes with training data definition and a code for Maximum Likelihood (ML) training of a contrastive GMM system. If you do not have any experience with Jupyter Notebook, the easiest way to start is to install Anaconda2, run Jupyter Notebook and open the notebook downloaded from http://www.fit.vutbr.cz/~burget/BayesianModels/ECI2017_BayesianModels_Assignment.ipynb. You can also benefit from reusing pieces of code from the Jupyter Notebooks provided for this class, namely: [bayesian_inference_for_gaussian.ipynb](http://www.fit.vutbr.cz/~burget/BayesianModels/bayesian_inference_for_gaussian.ipynb) and [gs_gmm_training.ipynb](http://www.fit.vutbr.cz/~burget/BayesianModels/gs_gmm_training.ipynb).\n", "\n", "\n", "The following cell contains a code with the definition of training data and the contrastive system training. You should no edit this part! The code does the following:\n", "\n", "1. We \"handcraft\" a GMM (i.e. define GMM parameters) with 4 Gaussian components, which represents the \"true distribution\" of training data.\n", "2. We have pre-generated training data from this GMM (see definition of variable x), so that everyone works with exactly the same data.\n", "3. GMM with C=6 components is trained on the training data using ML training (the standard EM algorithm). You will use this GMM as a contrastive model. You will compare it to your implementation of VB GMM.\n", "4. The following plots are made:\n", " * The true training data distribution (in grey).\n", " * The training observation generated from this true GMM (black + at the x axis).\n", " * The ML GMM estimate obtained using the EM algorithm (in black)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAm8AAAHdCAYAAABL3J5rAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XtUXNd9L/DvnhneIIQACQkQDwkhQA8koffDluI4cZzo\nOrGTJk56a680aXvjJnba3LWSrpV2dTXNalonadOkbZzaaVfi2Hn4cR3baiTF1lsyQiCBAAkEAwKE\nQALEc977/jGcMQwzzJlhzsyc4ftZy8vRnjNnb2zH+vq3X0JKCSIiIiLSB0O0B0BERERE6jG8ERER\nEekIwxsRERGRjjC8EREREekIwxsRERGRjjC8EREREekIwxsRERGRjjC8EREREekIwxsRERGRjpii\nPQCt5OTkyOLi4mgPg4iIiCigurq6O1LKXDXPxm14Ky4uxsWLF6M9DCIiIqKAhBBdap/ltCkRERGR\njjC8EREREekIwxsRERGRjjC8EREREekIwxsRERGRjjC8EREREekIwxsRERGRjjC8EREREekIwxsR\nERGRjjC8EREREekIwxsRERGRjjC8EREREekIwxsRERGRjjC8EREREekIwxsRERGRjjC8EREREekI\nwxsRUQRJKaM9BCLSOYY3IqIIOX/+PAwGAy5duhTtoRCRjjG8ERFFyP/8z/8AAL773e9GeSREpGcM\nb0REEXLv3j0AQF9fX5RHQkR6xvBGRBQhHR0dAIA7d+5EeSREpGcMb0REEdLV1QWA4Y2IFobhjYgo\nQoaHhwG4wxt3nRJRqBjeiIgiRFnzZrfbMTY2FuXREJFeMbwREUWAlBKjo6PIz88HwKlTIgodwxsR\nUQSMj4/D5XJhzZo1ABjeiCh0DG9ERBGgTJkWFBQAcIc5IqJQMLwREUWAEt5WrVoFAJiYmIjmcIhI\nxxjeiIgigOGNiMKF4Y2IKAJGR0cBvB/eOG1KRKFieCMiigDlaJCVK1cCYOWNiELH8EZEFAGTk5MA\ngOXLlwNg5Y2IQsfwRkQUAUp4y8zMhMlkYuWNiELG8EZEFAFKeEtLS0NaWhrDGxGFjOGNiCgClPCW\nkpKCtLQ0TpsSUcgY3oiIImBychIJCQlISEhAeno6K29EFDKGNyKiCJiamkJqaioAsPJGRAvC8EZE\nFAGTk5Oe8Jaamoqpqakoj4iI9IrhjYgoAiYnJ5GSkgIASE5OhsViifKIiEivGN6IiCJgZuWN4Y2I\n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\nPGlpaUycOJG//e1v3HrrrVV2WuXSpUvMmjWLQYMGlet5EkKUX4MGDRg5ciRpaWns2rXL2+EIkQ/b\n3gAAIABJREFUD5PkTYhrYLFYWLhwIcHBwYwePdr0BfjZ2dkMGjSIf/3rX7z66qvEx8fTtm3bSo7W\n0LhxY7788ksWL15MdnY20dHRfPjhh5U+kfXHH39MdnY2b7zxRqXuRwhhGD9+PBcuXGDVqlUUFRV5\nOxzhQZK8CXENfv75Z06dOsXdd99tepL2LVu2EBUVxe7du/nxxx958803qVu36m/8Hjt2LLt372bY\nsGFMnTqVkSNHkpOTUyn7OnfuHO+88w533nknt912W6XsQwhxpbvuuov69euzY8cOOXVay0jyJkQF\n7d27lx07dtCvXz/Td4IuWbKEwYMHExQUxObNm7nnnnsqN0g3mjVrxtKlS/n000+Ji4uja9euLF++\n3OP7ee211zhz5gxvvfWWx+sWQjjXoEEDRo8eTVpaGjt37vR2OMKDJHkTogJsw4KEh4czePBgU9vM\nnj2be+65hy5durBlyxa6dOlSyVGao5TimWeeITk5mfDwcEaPHs2UKVO4dOmSR+pPTEzkk08+YcqU\nKfTs2dMjdQohzHnooYfIy8tj5cqVFBQUeDsc4SGSvAlRTiUlJSxatIji4mJTw4Jorfmf//kfnnrq\nKe68805iY2Np1qxZFUVr3i233MLWrVt58cUX+eSTT4iKirrmb+tnz57lscceIyIiQnrdhPCC4cOH\n07BhQ3bu3MmePXu8HY7wEEnehCinxMREMjMzGTFiBKGhoS7Laq154YUXmDFjBo899hhLliyhQYMG\nVRRp+QUGBvLee++xevVqzp49S+/evfnggw8qNPF9cXExDz30EIcOHWLu3LkEBwdXQsRCCFfq1avH\nAw88wN69e9myZYu3wxEeIsmbEOWQlZVFbGwst9xyC927d3dZtqSkhClTpjBr1iymTZvGv//9b49M\nUl8Vhg0bxi+//MKIESN44YUXGD58OIcPHza9fXFxMU888QQ///wzH3/8sdykIIQX/eEPf8BisbB6\n9Wpyc3O9HY7wAEnehDDJfliQUaNGuRwWpKSkhD/+8Y98+umnvPTSS/z973+vcfN4hoWFsWjRIj7/\n/HMSEhKIjIxk+vTp/Pbbby63O378OCNGjOCrr75i5syZPP3001UUsRDCmT59+tC+fXtSU1NJTU31\ndjjCAyR5E8Kkn376idOnT7sdFsTW6zR79mxee+013nnnnRqXuNkopXjyySdJS0tj/PjxvP/++9xw\nww089NBDLFiwgOzsbIqLi7l06RI7duzglVdeITIyko0bNzJ79mxmzJjh7SYI4fOUUkyePJkjR46w\nevVqGfOtFlCVPTCnt0RHR+vt27d7OwxRS9jGZOvfvz9Dhw4ts1xRURGTJk3im2++4Y033uD111+v\nwigr3759+/jss8/46quvOHv2LGD8Y7B9jvj5+TFu3Djeeecd2rdv781QhRB2jh8/TkREBDExMXz6\n6ad07drV2yEJB0qpZK11tJmyVT8yqBA1zJkzZ1i+fDk33HADgwYNKrPc5cuXefjhh5k/fz5vvfUW\nr7zyStUFWUUiIyOZNWsW7777Ltu3byclJYWcnByCgoJo1aoVgwcPlgnnhaiGWrRowejRo1mzZg0J\nCQmSvNVwkrwJ4UJxcTELFy4EcDksiMVi4cEHH2Tx4sW89957vPjii1UZZpXz9/enT58+9OnTx9uh\nCCFMev7551m8eDE///wzY8eOJTw83NshiQqSa96EcGHDhg0cO3aMUaNG0bRpU6dlCgsLuffee1m8\neDEffvhhrU/chBA106BBg+jSpQtJSUls3brV2+GIayDJmxBlyMzMJD4+nu7du9O5c2enZS5dusS4\nceNYvnw5n332Gc8991wVRymEEOYopZg6dSo5OTksW7aMc+fOeTskUUGSvAnhxIULF1iwYAGhoaGM\nGDHCaZn8/HzGjBnDqlWrmD17Nn/84x+rOEohhCifCRMmEBISQmJiIomJid4OR1SQJG9COCguLmb+\n/PlYLBYeeOABAgICriqTl5fHqFGjWLduHXPmzGHy5MleiFQIIcqnfv36TJ06lX379rFixQry8vK8\nHZKoAEnehHCwZs0ajh49ypgxY7juuuuuWn/hwgVGjBjBhg0bmDt3LpMmTfJClEIIUTHPP/88DRs2\nZP369TJlVg0lyZsQdnbt2sXWrVu59dZbnV7ndv78eYYPH05iYiLffPMNDz/8sBeiFEKIimvSpAnT\npk0jLS2NpUuXcvHiRW+HJMpJkjchrGwX8UZERDBs2LCr1p88eZIhQ4aQlJTEd999x4MPPuiFKIUQ\n4tpNmzaNBg0asG7dOjZs2ODtcEQ5SfImBMap0G+//Zb69etz//33XzWe25EjR+jfvz979uxh0aJF\n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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import scipy.stats as sps\n", "import matplotlib.pyplot as plt\n", "from scipy.misc import logsumexp\n", "from scipy.special import digamma\n", "%matplotlib inline \n", "#%matplotlib qt5 #get an extra window for the plots\n", "plt.rcParams.update({'figure.figsize': (10.0, 8.0), 'font.size': 18}) #Make the plots bigger\n", "\n", "\n", "def GMM_pdf(x, mus, vars, pis):\n", " # Function for evaluating univariate GMM at values given by vector 'x'\n", " # 'mus', 'vars', 'pis' are vectors of means, variances and weights of individual Gaussian components\n", " # 'x[:,np.newaxis]' makes 'x' column vector to evaluate every coefficient of 'x' w.r.t. every Gaussian\n", " # component (row vectors 'mus' and 'vars') at once\n", " return sps.norm.pdf(x[:,np.newaxis], mus, np.sqrt(vars)).dot(pis) \n", "\n", "\n", "#1. Handcraft some GMM parameter \n", "mus_true = [-4.0, 0.0, 4.0, 5]\n", "vars_true = [1.0, 1.96, 1.44, 1]\n", "pis_true = [0.1, 0.4, 0.2, 0.3]\n", "\n", "#2. Pregenerated N datapoints from the GMM distribution above \n", "x=np.array([ -3.07371088e+00, -4.14348725e+00, -3.01490821e+00, -3.54303388e+00, -3.48708234e+00, -3.59262207e+00,\n", " -5.76100178e+00, -5.02726789e+00, 8.28817153e-04, 4.99898450e-01, 2.83745605e-01, 6.71947042e-01,\n", " 7.66679495e-01, 6.96995763e-01, 1.33546855e+00, 6.03847649e-01, -1.05992122e+00, 2.91024229e+00,\n", " -2.12682520e+00, 8.33533885e-01, 1.77147857e+00, 7.37629536e-01, -1.25040836e+00, 1.87318623e+00,\n", " -4.14582880e-01, 5.05680493e-01, 1.63091140e+00, 6.63219549e-01, -3.30841863e-01, -1.21874646e+00,\n", " 2.64384057e+00, -4.32674840e-01, -1.79034947e+00, 3.13567565e-01, -5.43911715e-01, 2.28572951e+00,\n", " 9.55653291e-01, -5.43582974e-01, -2.73850574e-01, -1.50383720e+00, 1.15925073e-01, 3.92541838e+00,\n", " -1.57267817e+00, 4.43581114e-01, -8.11856886e-01, 2.62442641e+00, -4.36298436e-01, -6.72286580e-01,\n", " 1.52223784e+00, 1.25033658e+00, 4.88645989e+00, 2.96110183e+00, 4.74249957e+00, 2.17531545e+00,\n", " 3.43072143e+00, 3.49315547e+00, 2.51223591e+00, 2.55369053e+00, 2.93122261e+00, 6.40247818e+00,\n", " 5.12748233e+00, 4.08277439e+00, 4.96716209e+00, 1.56304959e+00, 4.31869585e+00, 2.07957592e+00,\n", " 4.56265393e+00, 3.74342366e+00, 4.36177483e+00, 5.21824922e+00, 4.94100019e+00, 4.70062989e+00,\n", " 6.12111884e+00, 6.69125720e+00, 5.03104495e+00, 5.72199065e+00, 4.29367941e+00, 3.72747772e+00,\n", " 4.41461701e+00, 5.48741263e+00, 4.56782193e+00, 6.45701533e+00, 5.49118936e+00, 4.25947605e+00,\n", " 3.39235348e+00, 4.10586407e+00, 2.76696554e+00, 6.66059909e+00, 6.00107916e+00, 5.92828295e+00,\n", " 4.97460855e+00, 2.77746143e+00, 2.99416076e+00, 5.24459233e+00, 6.44720235e+00, 4.71084807e+00,\n", " 5.62475093e+00, 3.76422931e+00, 5.79482964e+00, 5.11432194e+00])\n", "\n", "\n", "\n", "#3. Choose some initial GMM parameters for EM training\n", "C = 6 # number of GMM components \n", "mus_ml = x[:C] # We choose few first observations as the initial means\n", "vars_ml = np.repeat(np.var(x), C) # Variances for all components are set to the global variance of the training data\n", "pis_ml = np.ones(C)/C # All component weights are set to the same value 1/C\n", "\n", "\n", "#EM algorithm for ML GMM training\n", "for _ in range(1000):\n", " #E-step\n", " log_p_xz = sps.norm.logpdf(x[:,np.newaxis], mus_ml, np.sqrt(vars_ml)) + np.log(pis_ml)\n", " log_p_x = logsumexp(log_p_xz, axis=1, keepdims=True)\n", " gammas = np.exp(log_p_xz - log_p_x)\n", " \n", " #M-step\n", " Nc = gammas.sum(axis=0)\n", " mus_ml = x.dot(gammas) / Nc\n", " vars_ml = (x**2).dot(gammas) / Nc - mus_ml**2\n", " pis_ml = Nc / Nc.sum()\n", "\n", "#4. Plot the true GMM, ML trained GMM and the observations\n", "t = np.linspace(-10,10,1000)\n", "true_GMM_pdf = GMM_pdf(t, mus_true, vars_true, pis_true)\n", "ml_GMM_pdf = GMM_pdf(t, mus_ml, vars_ml, pis_ml);\n", "plt.plot(t, true_GMM_pdf, 'gray')\n", "plt.plot(t, ml_GMM_pdf, 'k')\n", "plt.plot(x, np.zeros_like(x), '+k');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Variational Bayes update formulae\n", "\n", "$$\n", "\\DeclareMathOperator{\\YY}{\\boldsymbol{Y}}\n", "\\DeclareMathOperator{\\ppi}{\\boldsymbol{\\pi}}\n", "\\DeclareMathOperator{\\mmu}{\\boldsymbol{\\mu}}\n", "\\DeclareMathOperator{\\llambda}{\\boldsymbol{\\lambda}}\n", "\\DeclareMathOperator{\\aalpha}{\\boldsymbol{\\alpha}}\n", "\\DeclareMathOperator{\\dts}{\\mathinner{\\ldotp\\ldotp}}\n", "$$\n", "\n", "Here we summarize the VB update formulas which you need to implement:\n", "\n", "* For all $c=1..C$, update parameters of $q(\\mu_c, \\lambda_c)^*=\\mathrm{NormalGamma}\\left(\\mu_c,\\lambda_c | m_c^*, \\kappa_c^*, a_c^*, b_c^*, \\right)$:\n", "$$\\begin{align*}\n", "\\\\\n", "m_c^* & = \\frac{\\kappa_0 m_0+N_c \\bar{x}_c}{\\kappa_0+N_c} & &N_c = \\sum_n \\gamma_{nc} \\\\\n", "\\kappa_c^* &= \\kappa_0+N_c & &\\bar{x}_c =\\frac{\\sum_n \\gamma_{nc}x_n}{\\sum_n \\gamma_{nc}}\\\\\n", "a_c^* &= a_0+\\frac{N_c}{2} & &s_c =\\frac{\\sum_n \\gamma_{nc}(x_n-\\bar{x}_c)^2}{\\sum_n \\gamma_{nc}}\\\\\n", "b_c^* &= b_0+\\frac{N_c}{2}\\left(s_c+\\frac{\\kappa_0 (\\bar{x}_c-m_0)^2}{\\kappa_0+N_c}\\right)\\\\\n", "\\\\\n", "\\end{align*}$$\n", "where $\\gamma_{nc}$ are the responsibilities defined below in the update of $q(z_n)^*$. For the first VB iteration, use the responsibilities from the last iteration of the EM algorithm above (i.e. use the current setting of the variable 'gammas')\n", "\n", "\n", "* Update parameters of $q(\\boldsymbol{\\pi})^*=\\mathrm{Dir}(\\ppi|\\aalpha^*)$:\n", "$$\\begin{align*}\n", "\\\\\n", "& \\aalpha^*=[\\alpha_1^*, \\alpha_2^*, \\dots, \\alpha_C^*] \\\\\n", "& \\alpha_c^*=\\alpha_0+N_c\\\\\n", "\\\\\n", "\\end{align*}$$\n", "\n", "\n", "* For all $n=1..N$, update distributions $q(z_n)^*$, which are the approximate posterior probabilities for assigning observations to Gaussian components (i.e. the responsibilities $\\gamma_{nc}$):\n", "$$\\begin{align*}\n", "\\\\\n", "& \\rho_{nc} = \\exp\\left(\\psi(\\alpha_c^*)-\\psi\\left(\\sum_c\\alpha_c^*\\right)+\\frac{\\psi(a_c^*)-\\ln b_c^*}{2}-\\frac{1}{2\\kappa_c^*}-\\frac{a_c^*}{2b_c^*}(x_n-m_c^*)^2\\right)\\\\\n", "& \\gamma_{nc}=\\frac{\\rho_{nc}}{\\sum_k \\rho_nc}\\\\\n", "\\\\\n", "\\end{align*}$$\n", "where $\\psi(a)$ is digamma function (e.g. scipy.special.digamma)\n", "\n", "\n", "* Iterate until the convergence (i.e. until there is not significant change when updating the parameters. Alternatively, you can try to derive and implement evaluation of the evidence lower bound function $\\mathcal{L}(q(\\YY))$ and use it to monitor the convergence).\n", "\n", "In the equations abowe, parameters $m_0, \\kappa_0, a_0, b_0$ are the parameters of the NormalGamma priors $p(\\mu_c, \\lambda_c)$. The same prior is used for all Gaussian components $c \\in \\{1\\dts C\\}$. Parameter $\\alpha_0$ is the parameters of the Dirichlet prior distribution of the component weights $p(\\ppi)$. Note that Dirichlet distribution is, in general, parametrized by vector $\\aalpha_0$. However, we set all its coefficients to the same value. Therefore only single scalar parameter $\\alpha_0$.\n", "\n", "For your VB-GMM implementation, use the following setting of the prior parameters!" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Parameters of NormalGamma prior over means (mu) and precision (lambda)\n", "m0, kappa0, a0, b0=[0.0, 0.05, 0.05, 0.05] \n", "\n", "#Parameters of Dirichlet prior weights\n", "alpha0=1.0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, code the update formulas for the VB approximation.\n", "\n", "* Use the responsibilities (variable 'gammas') obtained from the ML training (EM algorithm implemented above) to initialize the assignments of observations to Gaussian components. This implies that we use the same number of Gaussian components $C=6$ as for the ML training.\n", "\n", "* Run iteratively the updates until the algorithm converges.\n", "\n", "Once the VB model is trained:\n", "\n", "* Plot the estimated approximate distributions $q(\\mu_c,\\lambda_c)$ for all the Gaussian components $c \\in \\{1\\dts C\\}$. You can reuse the code for plotting NormalGamma distribution from [bayesian_inference_for_gaussian.ipynb](http://www.fit.vutbr.cz/~burget/BayesianModels/bayesian_inference_for_gaussian.ipynb) notebook.\n", "\n", "* Print also the vector of parameters $\\aalpha^*$ of the approximate posterior distribution of the weights $q(\\ppi)$.\n", "\n", "* Analyze these results. What can you say about the obtained posteriors distributions? What do they represent? How do these posterior distribution compare to the parameter estimates obtained from the EM algorithm?\n", "\n", "* Generate several (say 50) samples from the approximate posterior distribution $q(\\ppi,\\mmu,\\llambda)^* = q(\\ppi)^* \\prod_{c=1}^C q(\\mu_c,\\lambda_c)^*$. Each such sample is set of parameters of one GMM. Plot the GMM distributions corresponding to all the samples into a single figure. Comment on this plot. What do the individual GMM distributions represent?\n", "\n", "* Now, average all the GMM distributions from the previous step. Attention! Average the GMM distributions, not their parameters as sampled from $q(\\ppi,\\mmu,\\llambda)^*$. What can you say about the obtained average distribution? What does it represent? Hint: We do similar averaging of GMMs in [gs_gmm_training.ipynb](http://www.fit.vutbr.cz/~burget/BayesianModels/gs_gmm_training.ipynb).\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "#Your code goes here :)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "Now estimate and plot the posterior predictive distribution using the following formula (Note that similar distribution is evaluated in each iteration of Collapsed Gibbs Sampling in [gs_gmm_training.ipynb](http://www.fit.vutbr.cz/~burget/BayesianModels/gs_gmm_training.ipynb)):\n", "\n", "$$\\begin{align*}\n", "\\\\\n", "& p(x')=\\sum_c St\\left(x'|m_c^*,2a_c^*,\\frac{a_c^* \\kappa_c^*}{b_c^*(\\kappa_c^*+1)}\\right)\\frac{\\alpha_c^*}{\\sum_c \\alpha_c^*}\\\\\n", "\\\\\n", "\\end{align*}$$\n", "How does the resulting posterior predictive distribution compare to:\n", "- the true training data distribution\n", "- the GMM obtained using ML training (i.e. using EM algorithm)\n", "- the average of GMM distributions obtained in the previous step by sampling from $q(\\ppi,\\mmu,\\llambda)^*$" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true }, "outputs": [], "source": [ "#Your code for posterior predictive distribution" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "Generate larger number of training observations (e.g. 1000 samples) from the true distribution (mus_true, vars_true, pis_true) and repeat the whole experiment once more with the larger amount of training data. Regenerate all the plots and comment on how they change from the previous experiments with smaller training data set." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": true }, "outputs": [], "source": [ "#Your code" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Try to implement as much as you can and answer ans many questions as you can. It is fine if you do not understand some questions or if you do not know some of the answers." ] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.13" } }, "nbformat": 4, "nbformat_minor": 2 }