Skip to content

Instantly share code, notes, and snippets.

@hellocybernetics
Created February 4, 2019 10:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hellocybernetics/ceb00f7240e47d08252a1fa05b5c7af2 to your computer and use it in GitHub Desktop.
Save hellocybernetics/ceb00f7240e47d08252a1fa05b5c7af2 to your computer and use it in GitHub Desktop.
Standart_pyro.ipynb
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "Standart_pyro.ipynb",
"version": "0.3.2",
"provenance": [],
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"accelerator": "GPU"
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/hellocybernetics/ceb00f7240e47d08252a1fa05b5c7af2/standart_pyro.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"metadata": {
"id": "AzEKvpUhLMDV",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 197
},
"outputId": "80e1ce2d-688b-4608-b154-1755f5d98f6f"
},
"cell_type": "code",
"source": [
"!pip install pyro-ppl"
],
"execution_count": 1,
"outputs": [
{
"output_type": "stream",
"text": [
"Requirement already satisfied: pyro-ppl in /usr/local/lib/python3.6/dist-packages (0.3.0)\n",
"Requirement already satisfied: tqdm>=4.28 in /usr/local/lib/python3.6/dist-packages (from pyro-ppl) (4.28.1)\n",
"Requirement already satisfied: graphviz>=0.8 in /usr/local/lib/python3.6/dist-packages (from pyro-ppl) (0.10.1)\n",
"Requirement already satisfied: torch>=1.0.0 in /usr/local/lib/python3.6/dist-packages (from pyro-ppl) (1.0.0)\n",
"Requirement already satisfied: opt-einsum>=2.3.0 in /usr/local/lib/python3.6/dist-packages (from pyro-ppl) (2.3.2)\n",
"Requirement already satisfied: networkx>=2.2 in /usr/local/lib/python3.6/dist-packages (from pyro-ppl) (2.2)\n",
"Requirement already satisfied: six>=1.10.0 in /usr/local/lib/python3.6/dist-packages (from pyro-ppl) (1.11.0)\n",
"Requirement already satisfied: numpy>=1.7 in /usr/local/lib/python3.6/dist-packages (from pyro-ppl) (1.14.6)\n",
"Requirement already satisfied: contextlib2 in /usr/local/lib/python3.6/dist-packages (from pyro-ppl) (0.5.5)\n",
"Requirement already satisfied: decorator>=4.3.0 in /usr/local/lib/python3.6/dist-packages (from networkx>=2.2->pyro-ppl) (4.3.2)\n"
],
"name": "stdout"
}
]
},
{
"metadata": {
"id": "hAahp5RjLO6Q",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"import math\n",
"\n",
"import torch\n",
"import torch.nn as nn\n",
"import torch.nn.functional as F\n",
"from torch.distributions import constraints\n",
"\n",
"import pyro\n",
"import pyro.distributions as dist\n",
"from pyro.infer import SVI, Trace_ELBO\n",
"from pyro.optim import Adam\n",
"from pyro.infer.mcmc import NUTS, MCMC\n"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "0MLIne5c-Sd4",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"# データ生成"
]
},
{
"metadata": {
"id": "Gn3wvLQFPYdr",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"N = 300\n",
"TRIAL = 25\n",
"P = 0.45\n",
"\n",
"def get_coin():\n",
" return np.random.binomial(TRIAL, P, N)\n",
"\n",
"data = get_coin()"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "8p-1b9n0QD_B",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 369
},
"outputId": "c0457733-1179-4daf-d95b-cd3bce9db55f"
},
"cell_type": "code",
"source": [
"plt.hist(data, bins=10, alpha=0.6)\n",
"plt.axis((0, 25, 0, 100))"
],
"execution_count": 4,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"(0, 25, 0, 100)"
]
},
"metadata": {
"tags": []
},
"execution_count": 4
},
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 576x396 with 1 Axes>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"metadata": {
"id": "w-lmQTRx-WBW",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"# 確率モデル\n",
"* 事前分布\n",
"$$\n",
"p(\\theta) = {\\rm Beta} (\\theta \\mid 1, 1)\n",
"$$\n",
"* 確率モデル\n",
"$$\n",
"p(x_i \\mid \\theta) = {\\rm Binomial}(x \\mid 25, \\theta)\n",
"$$\n",
"* 尤度関数\n",
"$$\n",
"p(D \\mid \\theta)= \\prod_{i=1}^{300}{\\rm Binomial}(x_i \\mid 25, \\theta)\n",
"$$\n"
]
},
{
"metadata": {
"id": "PdINUruOLtLZ",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"def model(data):\n",
" alpha0 = torch.tensor(1.0).type_as(data)\n",
" beta0 = torch.tensor(1.0).type_as(data)\n",
" # sample f from the beta prior\n",
" theta = pyro.sample(\"latent_fairness\", dist.Beta(alpha0, beta0))\n",
" # loop over the observed data\n",
" with pyro.plate(\"sample\", len(data)):\n",
" # likelihood Binomial(f)\n",
" pyro.sample(\"obs\", dist.Binomial(TRIAL, theta), obs=data)\n",
" \n",
"\n",
" "
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "pOX4-CLN_p10",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"# 変分モデル\n",
"\n",
"$$\n",
"q(\\theta) = {\\rm Normal}(\\theta \\mid \\mu, \\sigma)\n",
"$$"
]
},
{
"metadata": {
"id": "IZ0XX4VG_o2r",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"def guide(data):\n",
" mu_q = pyro.param(\"mu_q\", torch.tensor(0.5),\n",
" constraint=constraints.positive).type_as(data)\n",
" sigma_q = pyro.param(\"sigma_q\", torch.tensor(0.1),\n",
" constraint=constraints.positive).type_as(data)\n",
" pred_p = pyro.sample(\"latent_fairness\", dist.Normal(mu_q, sigma_q))\n",
" return pred_p"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "46w1enUPAJvM",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"# 変分推論"
]
},
{
"metadata": {
"id": "-Ee9NX4yRR-v",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 35
},
"outputId": "a9be6428-2a72-4464-8fea-9c18c9a0306a"
},
"cell_type": "code",
"source": [
"# setup the optimizer\n",
"pyro.clear_param_store()\n",
"adam_params = {\"lr\": 0.0005, \"betas\": (0.90, 0.999)}\n",
"optimizer = Adam(adam_params)\n",
"\n",
"# setup the inference algorithm\n",
"svi = SVI(model, guide, optimizer, loss=Trace_ELBO())\n",
"\n",
"data = torch.tensor(data, dtype=torch.float)\n",
"for step in range(2000):\n",
" svi.step(data)\n",
" if step % 100 == 0:\n",
" print('.', end='')"
],
"execution_count": 7,
"outputs": [
{
"output_type": "stream",
"text": [
"...................."
],
"name": "stdout"
}
]
},
{
"metadata": {
"id": "fM6wXf1IRZwo",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 419
},
"outputId": "54e95dad-3a65-4bf2-b06b-857cd1909ca8"
},
"cell_type": "code",
"source": [
"sns.distplot([guide(data).detach().numpy() for _ in range(1000)])"
],
"execution_count": 8,
"outputs": [
{
"output_type": "stream",
"text": [
"/usr/local/lib/python3.6/dist-packages/matplotlib/axes/_axes.py:6521: MatplotlibDeprecationWarning: \n",
"The 'normed' kwarg was deprecated in Matplotlib 2.1 and will be removed in 3.1. Use 'density' instead.\n",
" alternative=\"'density'\", removal=\"3.1\")\n"
],
"name": "stderr"
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x7f8a08f76cc0>"
]
},
"metadata": {
"tags": []
},
"execution_count": 8
},
{
"output_type": "display_data",
"data": {
"image/png": "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\nBoOsraIAAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 576x396 with 1 Axes>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"metadata": {
"id": "qI3UwFIbAWAb",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"#MAP 推定"
]
},
{
"metadata": {
"id": "XmIbwaqFlJmA",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"from pyro.contrib.autoguide import AutoDelta\n",
"guide_map = AutoDelta(model)"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "t_-0uLrx1bPW",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 91
},
"outputId": "6f758da2-fd4c-4f3e-8f91-6d8d3f3cb96c"
},
"cell_type": "code",
"source": [
"# setup the optimizer\n",
"pyro.clear_param_store()\n",
"adam_params = {\"lr\": 0.01, \"betas\": (0.90, 0.999)}\n",
"optimizer = Adam(adam_params)\n",
"\n",
"# setup the inference algorithm\n",
"svi = SVI(model, guide_map, optimizer, loss=Trace_ELBO())\n",
"\n",
"data = torch.tensor(data, dtype=torch.float)\n",
"for step in range(2000):\n",
" svi.step(data)\n",
" if step % 100 == 0:\n",
" print('.', end='')"
],
"execution_count": 12,
"outputs": [
{
"output_type": "stream",
"text": [
"/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:8: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).\n",
" \n"
],
"name": "stderr"
},
{
"output_type": "stream",
"text": [
"...................."
],
"name": "stdout"
}
]
},
{
"metadata": {
"id": "68jCWemuBSLS",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 35
},
"outputId": "cc739ec3-2b91-409d-c94c-2575e33df3d2"
},
"cell_type": "code",
"source": [
"guide_map()"
],
"execution_count": 15,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"{'latent_fairness': tensor(0.4568, grad_fn=<ExpandBackward>)}"
]
},
"metadata": {
"tags": []
},
"execution_count": 15
}
]
},
{
"metadata": {
"id": "NnB5CFG41gpx",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 769
},
"outputId": "05f063d6-c823-4394-c116-8ff958383013"
},
"cell_type": "code",
"source": [
"plt.figure(figsize=(12, 4))\n",
"plt.hist(guide_map()[\"latent_fairness\"].detach().numpy(), bins=100)"
],
"execution_count": 13,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"(array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]),\n",
" array([-0.04319999, -0.03319999, -0.02319999, -0.01319999, -0.00319999,\n",
" 0.00680001, 0.01680001, 0.02680001, 0.03680001, 0.04680001,\n",
" 0.05680001, 0.06680001, 0.07680001, 0.08680001, 0.09680001,\n",
" 0.10680001, 0.11680001, 0.12680001, 0.13680001, 0.14680001,\n",
" 0.15680001, 0.16680001, 0.17680001, 0.18680001, 0.19680001,\n",
" 0.20680001, 0.21680001, 0.22680001, 0.23680001, 0.24680001,\n",
" 0.25680001, 0.26680001, 0.27680001, 0.28680001, 0.29680001,\n",
" 0.30680001, 0.31680001, 0.32680001, 0.33680001, 0.34680001,\n",
" 0.35680001, 0.36680001, 0.37680001, 0.38680001, 0.39680001,\n",
" 0.40680001, 0.41680001, 0.42680001, 0.43680001, 0.44680001,\n",
" 0.45680001, 0.46680001, 0.47680001, 0.48680001, 0.49680001,\n",
" 0.50680001, 0.51680001, 0.52680001, 0.53680001, 0.54680001,\n",
" 0.55680001, 0.56680001, 0.57680001, 0.58680001, 0.59680001,\n",
" 0.60680001, 0.61680001, 0.62680001, 0.63680001, 0.64680001,\n",
" 0.65680001, 0.66680001, 0.67680001, 0.68680001, 0.69680001,\n",
" 0.70680001, 0.71680001, 0.72680001, 0.73680001, 0.74680001,\n",
" 0.75680001, 0.76680001, 0.77680001, 0.78680001, 0.79680001,\n",
" 0.80680001, 0.81680001, 0.82680001, 0.83680001, 0.84680001,\n",
" 0.85680001, 0.86680001, 0.87680001, 0.88680001, 0.89680001,\n",
" 0.90680001, 0.91680001, 0.92680001, 0.93680001, 0.94680001,\n",
" 0.95680001]),\n",
" <a list of 100 Patch objects>)"
]
},
"metadata": {
"tags": []
},
"execution_count": 13
},
{
"output_type": "display_data",
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAsMAAAD4CAYAAAAJrusFAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAEvJJREFUeJzt3W9onfX9//FX2rQOTSgJJNP+cZaC\nlEUcFhUkRWdJh9v88b0jJsV/OFEE3aZbGdoNUzYTK9jdmHpDZOxGlVqRsN++IHYwFEZNVydbJRGx\nLRjqH5rE1mKsgp3ne2MsWO1y0iQnf/p5PO54rl7n5LzNG8uzx6u56iqVSiUAAFCgRXM9AAAAzBUx\nDABAscQwAADFEsMAABRLDAMAUKz62X7DkZGPZ/stZ11T07k5duzEXI9Bjdnz2c+Oy2DPZbDnMnx1\nzy0tjVVf45PhGqivXzzXIzAL7PnsZ8dlsOcy2HMZprJnMQwAQLHEMAAAxRLDAAAUSwwDAFAsMQwA\nQLHEMAAAxZpUDL/99tvp6OjIM88887Vzr776am644YZ0dnbmySefnPEBAQCgVqrG8IkTJ/Kb3/wm\nV1111WnPP/zww3n88cezc+fO7NmzJwcPHpzxIQEAoBaqxvDSpUvz9NNPp7W19WvnDh8+nGXLluWC\nCy7IokWLcs0116S/v78mgwIAwEyrejvm+vr61Nef/mkjIyNpbm4eP25ubs7hw4cn/HpNTecWcReY\nydz+j4XPns9+82XH/+/n//+0v/6/2/9nlic5O82XPVNb9lyGM91z1RieaSXcF7ylpTEjIx/P9RjU\nmD2f/RbCjuf7fAvBQtgz02fPZfjqnicTxtP6aRKtra0ZHR0dPz5y5MhpL6cAAID5aFoxvHLlyoyN\njeXdd9/NyZMn8/LLL6e9vX2mZgMAgJqqepnEwMBAHn300bz33nupr6/P7t27s2HDhqxcuTIbN27M\n1q1b8/Of/zxJ8oMf/CCrV6+u+dAAADATqsbwJZdckh07dvzX81dccUV27do1o0MBAMBscAc6AACK\nJYYBACiWGAYAoFhiGACAYolhAACKJYYBACiWGAYAoFhiGACAYolhAACKJYYBACiWGAYAoFhiGACA\nYolhAACKJYYBACiWGAYAoFhiGACAYolhAACKJYYBACiWGAYAoFhiGACAYolhAACKJYYBACiWGAYA\noFhiGACAYolhAACKJYYBACiWGAYAoFhiGACAYolhAACKJYYBACiWGAYAoFhiGACAYtVP5km9vb3Z\nv39/6urqsmXLllx66aXj55599tn86U9/yqJFi3LJJZfkl7/8Zc2GBQCAmVT1k+F9+/ZlaGgou3bt\nSk9PT3p6esbPjY2N5fe//32effbZ7Ny5M4cOHco///nPmg4MAAAzpWoM9/f3p6OjI0myZs2aHD9+\nPGNjY0mSJUuWZMmSJTlx4kROnjyZTz/9NMuWLavtxAAAMEOqXiYxOjqatra28ePm5uaMjIykoaEh\n55xzTu655550dHTknHPOyQ9/+MOsXr16wq/X1HRu6usXT3/yea6lpXGuR2AW2PPZb77veL7Pt1D4\nPpbBnstwpnue1DXDX1apVMYfj42N5amnnspLL72UhoaG3HbbbXnrrbeydu3a//r6Y8dOnOlbLjgt\nLY0ZGfl4rsegxuz57LcQdjzf51sIFsKemT57LsNX9zyZMK56mURra2tGR0fHj4eHh9PS0pIkOXTo\nUFatWpXm5uYsXbo0l19+eQYGBqYyOwAAzLqqMdze3p7du3cnSQYHB9Pa2pqGhoYkyYoVK3Lo0KF8\n9tlnSZKBgYFcdNFFtZsWAABmUNXLJNatW5e2trZ0dXWlrq4u3d3d6evrS2NjYzZu3Jg77rgjt956\naxYvXpzLLrssl19++WzMDQAA0zapa4Y3b958yvGXrwnu6upKV1fXzE4FAACzwB3oAAAolhgGAKBY\nYhgAgGKJYQAAiiWGAQAolhgGAKBYYhgAgGKJYQAAiiWGAQAolhgGAKBYYhgAgGKJYQAAiiWGAQAo\nlhgGAKBYYhgAgGKJYQAAiiWGAQAolhgGAKBYYhgAgGKJYQAAiiWGAQAolhgGAKBYYhgAgGKJYQAA\niiWGAQAolhgGAKBYYhgAgGKJYQAAiiWGAQAolhgGAKBYYhgAgGKJYQAAilU/mSf19vZm//79qaur\ny5YtW3LppZeOn/vggw/ys5/9LJ9//nm+/e1v59e//nXNhgUAgJlU9ZPhffv2ZWhoKLt27UpPT096\nenpOOb9t27b86Ec/ygsvvJDFixfn/fffr9mwAAAwk6rGcH9/fzo6OpIka9asyfHjxzM2NpYk+eKL\nL/L6669nw4YNSZLu7u4sX768huMCAMDMqRrDo6OjaWpqGj9ubm7OyMhIkuTo0aM577zz8sgjj2TT\npk3Zvn177SYFAIAZNqlrhr+sUqmc8vjIkSO59dZbs2LFitx111155ZVX8t3vfve/vr6p6dzU1y+e\n0rALSUtL41yPwCyw57PffN/xfJ9vofB9LIM9l+FM91w1hltbWzM6Ojp+PDw8nJaWliRJU1NTli9f\nngsvvDBJctVVV+XAgQMTxvCxYyfOaMCFqKWlMSMjH8/1GNSYPZ/9FsKO5/t8C8FC2DPTZ89l+Oqe\nJxPGVS+TaG9vz+7du5Mkg4ODaW1tTUNDQ5Kkvr4+q1atyjvvvDN+fvXq1VOZHQAAZl3VT4bXrVuX\ntra2dHV1pa6uLt3d3enr60tjY2M2btyYLVu25IEHHkilUsnFF188/pfpAABgvpvUNcObN28+5Xjt\n2rXjj7/1rW9l586dMzsVAADMAnegAwCgWGIYAIBiiWEAAIolhgEAKJYYBgCgWGIYAIBiiWEAAIol\nhgEAKJYYBgCgWGIYAIBiiWEAAIolhgEAKJYYBgCgWGIYAIBiiWEAAIolhgEAKJYYBgCgWGIYAIBi\niWEAAIolhgEAKJYYBgCgWGIYAIBiiWEAAIolhgEAKJYYBgCgWGIYAIBiiWEAAIolhgEAKJYYBgCg\nWGIYAIBiiWEAAIolhgEAKJYYBgCgWJOK4d7e3nR2dqarqytvvPHGaZ+zffv23HLLLTM6HAAA1FLV\nGN63b1+Ghoaya9eu9PT0pKen52vPOXjwYF577bWaDAgAALVSNYb7+/vT0dGRJFmzZk2OHz+esbGx\nU56zbdu23H///bWZEAAAaqS+2hNGR0fT1tY2ftzc3JyRkZE0NDQkSfr6+nLllVdmxYoVk3rDpqZz\nU1+/eIrjLhwtLY1zPQKzwJ7PfvN9x/N9voXC97EM9lyGM91z1Rj+qkqlMv74o48+Sl9fX/7whz/k\nyJEjk3r9sWMnzvQtF5yWlsaMjHw812NQY/Z89lsIO57v8y0EC2HPTJ89l+Gre55MGFe9TKK1tTWj\no6Pjx8PDw2lpaUmS7N27N0ePHs1NN92Ue++9N4ODg+nt7Z3K7AAAMOuqxnB7e3t2796dJBkcHExr\na+v4JRLXXXddXnzxxTz//PN54okn0tbWli1bttR2YgAAmCFVL5NYt25d2tra0tXVlbq6unR3d6ev\nry+NjY3ZuHHjbMwIAAA1Malrhjdv3nzK8dq1a7/2nJUrV2bHjh0zMxUAAMwCd6ADAKBYYhgAgGKJ\nYQAAiiWGAQAolhgGAKBYYhgAgGKJYQAAiiWGAQAolhgGAKBYYhgAgGKJYQAAiiWGAQAolhgGAKBY\nYhgAgGKJYQAAiiWGAQAolhgGAKBYYhgAgGKJYQAAiiWGAQAolhgGAKBYYhgAgGKJYQAAiiWGAQAo\nlhgGAKBYYhgAgGKJYQAAiiWGAQAolhgGAKBYYhgAgGKJYQAAiiWGAQAoVv1kntTb25v9+/enrq4u\nW7ZsyaWXXjp+bu/evfntb3+bRYsWZfXq1enp6cmiRRobAID5r2q17tu3L0NDQ9m1a1d6enrS09Nz\nyvmHHnoov/vd7/Lcc8/lk08+yV//+teaDQsAADOpagz39/eno6MjSbJmzZocP348Y2Nj4+f7+vpy\n/vnnJ0mam5tz7NixGo0KAAAzq+plEqOjo2lraxs/bm5uzsjISBoaGpJk/J/Dw8PZs2dPfvrTn074\n9Zqazk19/eLpzLwgtLQ0zvUIzAJ7PvvN9x3P9/kWCt/HMthzGc50z5O6ZvjLKpXK137tww8/zN13\n353u7u40NTVN+Ppjx06c6VsuOC0tjRkZ+Xiux6DG7PnstxB2PN/nWwgWwp6ZPnsuw1f3PJkwrnqZ\nRGtra0ZHR8ePh4eH09LSMn48NjaWO++8M/fdd1/Wr19/pjMDAMCcqRrD7e3t2b17d5JkcHAwra2t\n45dGJMm2bdty22235eqrr67dlAAAUANVL5NYt25d2tra0tXVlbq6unR3d6evry+NjY1Zv359/vjH\nP2ZoaCgvvPBCkuT6669PZ2dnzQcHAIDpmtQ1w5s3bz7leO3ateOPBwYGZnYiAACYJe6OAQBAscQw\nAADFEsMAABRLDAMAUCwxDABAscQwAADFEsMAABRLDAMAUCwxDABAscQwAADFEsMAABRLDAMAUCwx\nDABAscQwAADFEsMAABRLDAMAUCwxDABAscQwAADFEsMAABRLDAMAUCwxDABAscQwAADFEsMAABRL\nDAMAUCwxDABAscQwAADFEsMAABRLDAMAUCwxDABAscQwAADFEsMAABRLDAMAUCwxDABAsSYVw729\nvens7ExXV1feeOONU869+uqrueGGG9LZ2Zknn3yyJkMCAEAtVI3hffv2ZWhoKLt27UpPT096enpO\nOf/www/n8ccfz86dO7Nnz54cPHiwZsMCAMBMqhrD/f396ejoSJKsWbMmx48fz9jYWJLk8OHDWbZs\nWS644IIsWrQo11xzTfr7+2s7MQAAzJD6ak8YHR1NW1vb+HFzc3NGRkbS0NCQkZGRNDc3n3Lu8OHD\nE369lpbGaYy7cJTy71k6ez77zZcd/+/2/5nrEc5q82XP1JY9l+FM93zGf4GuUqmc6UsAAGBeqhrD\nra2tGR0dHT8eHh5OS0vLac8dOXIkra2tNRgTAABmXtUYbm9vz+7du5Mkg4ODaW1tTUNDQ5Jk5cqV\nGRsby7vvvpuTJ0/m5ZdfTnt7e20nBgCAGVJXmcR1D4899lj+/ve/p66uLt3d3XnzzTfT2NiYjRs3\n5rXXXstjjz2WJPne976XO+64o+ZDAwDATJhUDAMAwNnIHegAACiWGAYAoFhieBrcproME+157969\nufHGG9PV1ZUHH3wwX3zxxRxNyXRNtOf/2L59e2655ZZZnoyZNNGeP/jgg2zatCk33HBDHnrooTma\nkOmaaMfPPvtsOjs7s2nTpq/dUZeF5e23305HR0eeeeaZr5074warMCV/+9vfKnfddVelUqlUDh48\nWLnxxhtPOf/973+/8v7771f+9a9/VTZt2lQ5cODAXIzJNFXb88aNGysffPBBpVKpVH784x9XXnnl\nlVmfkemrtudKpVI5cOBApbOzs3LzzTfP9njMkGp7/slPflL585//XKlUKpWtW7dW3nvvvVmfkemZ\naMcff/xx5dprr618/vnnlUqlUrn99tsr//jHP+ZkTqbnk08+qdx8882VX/3qV5UdO3Z87fyZNphP\nhqfIbarLMNGek6Svry/nn39+kn/fgfHYsWNzMifTU23PSbJt27bcf//9czEeM2SiPX/xxRd5/fXX\ns2HDhiRJd3d3li9fPmezMjUT7XjJkiVZsmRJTpw4kZMnT+bTTz/NsmXL5nJcpmjp0qV5+umnT3tv\ni6k0mBieotHR0TQ1NY0f/+c21UlOe5vq/5xjYZloz0nGf+b28PBw9uzZk2uuuWbWZ2T6qu25r68v\nV155ZVasWDEX4zFDJtrz0aNHc9555+WRRx7Jpk2bsn379rkak2mYaMfnnHNO7rnnnnR0dOTaa6/N\nd77znaxevXquRmUa6uvr841vfOO056bSYGJ4hlT8hLoinG7PH374Ye6+++50d3ef8pswC9eX9/zR\nRx+lr68vt99++xxORC18ec+VSiVHjhzJrbfemmeeeSZvvvlmXnnllbkbjhnx5R2PjY3lqaeeyksv\nvZS//OUv2b9/f9566605nI75QgxPkdtUl2GiPSf//s31zjvvzH333Zf169fPxYjMgIn2vHfv3hw9\nejQ33XRT7r333gwODqa3t3euRmUaJtpzU1NTli9fngsvvDCLFy/OVVddlQMHDszVqEzRRDs+dOhQ\nVq1alebm5ixdujSXX355BgYG5mpUamQqDSaGp8htqssw0Z6Tf19Hetttt+Xqq6+eqxGZARPt+brr\nrsuLL76Y559/Pk888UTa2tqyZcuWuRyXKZpoz/X19Vm1alXeeeed8fP+F/rCM9GOV6xYkUOHDuWz\nzz5LkgwMDOSiiy6aq1Gpkak0mDvQTYPbVJfhv+15/fr1ueKKK3LZZZeNP/f6669PZ2fnHE7LVE30\n3/N/vPvuu3nwwQezY8eOOZyU6Zhoz0NDQ3nggQdSqVRy8cUXZ+vWrVm0yGdGC81EO37uuefS19eX\nxYsX57LLLssvfvGLuR6XKRgYGMijjz6a9957L/X19fnmN7+ZDRs2ZOXKlVNqMDEMAECx/JEXAIBi\niWEAAIolhgEAKJYYBgCgWGIYAIBiiWEAAIolhgEAKNb/Ad2H8a3xTpgHAAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 864x288 with 1 Axes>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"metadata": {
"id": "9OEVB6EfBN3V",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
""
],
"execution_count": 0,
"outputs": []
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment