Skip to content

Instantly share code, notes, and snippets.

@NTT123
Last active October 11, 2018 05:41
Show Gist options
  • Save NTT123/ec8a3a531e0765ae5d75276bc184cb91 to your computer and use it in GitHub Desktop.
Save NTT123/ec8a3a531e0765ae5d75276bc184cb91 to your computer and use it in GitHub Desktop.
HMM.ipynb
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "HMM.ipynb",
"version": "0.3.2",
"provenance": [],
"collapsed_sections": [],
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"[View in Colaboratory](https://colab.research.google.com/gist/NTT123/ec8a3a531e0765ae5d75276bc184cb91/hmm.ipynb)"
]
},
{
"metadata": {
"id": "qZafBPDoEFA1",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"# Hidden Markov Models\n",
"\nAuthor: Thong Nguyen\n",
"\n",
"From \"A Tutorial on Hidden Markov Models and Selected Applications in Speech Recognition\" LAWRENCE R. RABINER, FELLOW, IEEE \n"
]
},
{
"metadata": {
"id": "qXeN7kfCEBLw",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"## Markov chains"
]
},
{
"metadata": {
"id": "weA52KSaEpIz",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"<img width=\"400px\" src=\"data:image/png;base64,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\" alt=\"\" />"
]
},
{
"metadata": {
"id": "k4xUOVM6E8PD",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Let $\\pi(t)$ is the distribution of states at time step $t$, we have:\n",
"$$\n",
"\\pi(t+1) = A^T \\pi(t)\n",
"$$"
]
},
{
"metadata": {
"id": "itJNf1WWkgNT",
"colab_type": "code",
"colab": {},
"cellView": "form"
},
"cell_type": "code",
"source": [
"#@title\n",
"# http://pytorch.org/\n",
"from os import path\n",
"from wheel.pep425tags import get_abbr_impl, get_impl_ver, get_abi_tag\n",
"platform = '{}{}-{}'.format(get_abbr_impl(), get_impl_ver(), get_abi_tag())\n",
"\n",
"accelerator = 'cu80' if path.exists('/opt/bin/nvidia-smi') else 'cpu'\n",
"\n",
"!pip install -q http://download.pytorch.org/whl/{accelerator}/torch-0.4.1-{platform}-linux_x86_64.whl torchvision\n",
" \n",
"data = \"\"\"2013-01-06,7.794975\n",
"2013-01-13,7.863400\n",
"2013-01-20,8.234920\n",
"2013-01-27,8.186260\n",
"2013-02-03,8.317480\n",
"2013-02-10,8.154040\n",
"2013-02-17,7.883740\n",
"2013-02-24,7.859420\n",
"2013-03-03,7.958560\n",
"2013-03-10,7.976260\n",
"2013-03-17,8.145660\n",
"2013-03-24,8.306540\n",
"2013-03-31,8.248350\n",
"2013-04-07,7.270060\n",
"2013-04-14,7.384700\n",
"2013-04-21,7.469860\n",
"2013-04-28,7.311920\n",
"2013-05-05,7.735940\n",
"2013-05-12,7.534840\n",
"2013-05-19,7.678740\n",
"2013-05-26,7.703500\n",
"2013-06-02,7.800800\n",
"2013-06-09,7.804360\n",
"2013-06-16,7.689940\n",
"2013-06-23,7.919940\n",
"2013-06-30,7.535260\n",
"2013-07-07,7.011460\n",
"2013-07-14,7.207520\n",
"2013-07-21,7.028780\n",
"2013-07-28,6.757800\n",
"2013-08-04,6.589520\n",
"2013-08-11,6.398180\n",
"2013-08-18,6.435180\n",
"2013-08-25,6.641880\n",
"2013-09-01,6.791300\n",
"2013-09-08,6.584620\n",
"2013-09-15,6.511300\n",
"2013-09-22,6.366740\n",
"2013-09-29,6.333920\n",
"2013-10-06,6.154460\n",
"2013-10-13,6.166320\n",
"2013-10-20,6.167020\n",
"2013-10-27,6.159360\n",
"2013-11-03,6.001520\n",
"2013-11-10,5.923280\n",
"2013-11-17,5.992420\n",
"2013-11-24,5.845100\n",
"2013-12-01,5.869520\n",
"2013-12-08,5.945120\n",
"2013-12-15,5.980200\n",
"2013-12-22,5.888720\n",
"2013-12-29,5.926050\n",
"2014-01-05,5.810850\n",
"2014-01-12,5.813080\n",
"2014-01-19,5.897680\n",
"2014-01-26,5.868780\n",
"2014-02-02,5.938920\n",
"2014-02-09,6.076480\n",
"2014-02-16,6.082700\n",
"2014-02-23,6.211280\n",
"2014-03-02,6.228440\n",
"2014-03-09,6.551060\n",
"2014-03-16,6.559180\n",
"2014-03-23,6.530720\n",
"2014-03-30,6.629660\n",
"2014-04-06,6.795720\n",
"2014-04-13,6.795040\n",
"2014-04-20,6.775225\n",
"2014-04-27,6.766620\n",
"2014-05-04,6.864440\n",
"2014-05-11,6.870480\n",
"2014-05-18,6.607120\n",
"2014-05-25,6.374580\n",
"2014-06-01,6.312940\n",
"2014-06-08,6.130040\n",
"2014-06-15,5.978580\n",
"2014-06-22,5.962500\n",
"2014-06-29,5.949760\n",
"2014-07-06,5.604380\n",
"2014-07-13,5.314360\n",
"2014-07-20,5.142040\n",
"2014-07-27,4.955360\n",
"2014-08-03,4.946680\n",
"2014-08-10,4.938600\n",
"2014-08-17,4.972100\n",
"2014-08-24,4.956000\n",
"2014-08-31,4.904480\n",
"2014-09-07,4.776020\n",
"2014-09-14,4.598040\n",
"2014-09-21,4.545860\n",
"2014-09-28,4.374580\n",
"2014-10-05,4.319680\n",
"2014-10-12,4.541180\n",
"2014-10-19,4.689040\n",
"2014-10-26,4.735860\n",
"2014-11-02,4.958700\n",
"2014-11-09,4.939940\n",
"2014-11-16,5.055720\n",
"2014-11-23,4.970060\n",
"2014-11-30,5.018660\n",
"2014-12-07,5.015720\n",
"2014-12-14,5.130840\n",
"2014-12-21,5.291280\n",
"2014-12-28,5.330100\n",
"2015-01-04,5.213650\n",
"2015-01-11,5.181300\n",
"2015-01-18,5.009220\n",
"2015-01-25,5.006000\n",
"2015-02-01,4.870800\n",
"2015-02-08,4.940660\n",
"2015-02-15,5.009900\n",
"2015-02-22,5.010540\n",
"2015-03-01,4.906280\n",
"2015-03-08,4.922140\n",
"2015-03-15,4.906320\n",
"2015-03-22,4.772120\n",
"2015-03-29,4.964580\n",
"2015-04-05,4.871475\n",
"2015-04-12,4.817700\n",
"2015-04-19,4.749300\n",
"2015-04-26,4.706060\n",
"2015-05-03,4.545440\n",
"2015-05-10,4.517460\n",
"2015-05-17,4.520540\n",
"2015-05-24,4.516200\n",
"2015-05-31,4.402940\n",
"2015-06-07,4.465800\n",
"2015-06-14,4.472640\n",
"2015-06-21,4.411040\n",
"2015-06-28,4.623160\n",
"2015-07-05,5.142840\n",
"2015-07-12,5.255180\n",
"2015-07-19,5.296720\n",
"2015-07-26,4.961260\n",
"2015-08-02,4.601720\n",
"2015-08-09,4.579440\n",
"2015-08-16,4.593880\n",
"2015-08-23,4.545800\n",
"2015-08-30,4.525360\n",
"2015-09-06,4.411720\n",
"2015-09-13,4.473660\n",
"2015-09-20,4.633600\n",
"2015-09-27,4.613740\n",
"2015-10-04,4.671460\n",
"2015-10-11,4.713540\n",
"2015-10-18,4.559620\n",
"2015-10-25,4.540980\n",
"2015-11-01,4.576460\n",
"2015-11-08,4.528960\n",
"2015-11-15,4.352200\n",
"2015-11-22,4.355200\n",
"2015-11-29,4.382240\n",
"2015-12-06,4.426340\n",
"2015-12-13,4.431680\n",
"2015-12-20,4.433440\n",
"2015-12-27,4.335400\n",
"2016-01-03,4.254175\n",
"2016-01-10,4.179460\n",
"2016-01-17,4.220240\n",
"2016-01-24,4.338940\n",
"2016-01-31,4.356660\n",
"2016-02-07,4.369680\n",
"2016-02-14,4.262160\n",
"2016-02-21,4.302920\n",
"2016-02-28,4.266340\n",
"2016-03-06,4.176820\n",
"2016-03-13,4.222440\n",
"2016-03-20,4.303180\n",
"2016-03-27,4.322175\n",
"2016-04-03,4.248160\n",
"2016-04-10,4.194940\n",
"2016-04-17,4.318960\n",
"2016-04-24,4.480920\n",
"2016-05-01,4.478360\n",
"2016-05-08,4.386540\n",
"2016-05-15,4.402120\n",
"2016-05-22,4.557520\n",
"2016-05-29,4.670100\n",
"2016-06-05,4.770040\n",
"2016-06-12,4.932320\n",
"2016-06-19,4.986040\n",
"2016-06-26,4.581180\n",
"2016-07-03,4.304040\n",
"2016-07-10,3.994300\n",
"2016-07-17,4.047380\n",
"2016-07-24,3.897380\n",
"2016-07-31,3.820160\n",
"2016-08-07,3.735640\n",
"2016-08-14,3.731200\n",
"2016-08-21,3.811200\n",
"2016-08-28,3.749080\n",
"2016-09-04,3.591260\n",
"2016-09-11,3.732840\n",
"2016-09-18,3.733980\n",
"2016-09-25,3.777040\n",
"2016-10-02,3.707120\n",
"2016-10-09,3.855420\n",
"2016-10-16,3.870520\n",
"2016-10-23,3.960620\n",
"2016-10-30,3.953340\n",
"2016-11-06,3.909120\n",
"2016-11-13,3.859900\n",
"2016-11-20,3.820720\n",
"2016-11-27,3.920300\n",
"2016-12-04,3.813300\n",
"2016-12-11,3.909460\n",
"2016-12-18,3.927520\n",
"2016-12-25,3.816060\n",
"2017-01-01,3.836375\n",
"2017-01-08,3.922450\n",
"2017-01-15,3.913840\n",
"2017-01-22,3.988140\n",
"2017-01-29,3.990860\n",
"2017-02-05,3.970100\n",
"2017-02-12,4.031860\n",
"2017-02-19,4.087060\n",
"2017-02-26,4.017940\n",
"2017-03-05,4.034880\n",
"2017-03-12,3.982420\n",
"2017-03-19,3.899360\n",
"2017-03-26,3.845300\n",
"2017-04-02,3.842600\n",
"2017-04-09,3.889200\n",
"2017-04-16,3.941000\n",
"2017-04-23,3.861580\n",
"2017-04-30,3.859440\n",
"2017-05-07,3.913580\n",
"2017-05-14,3.881540\n",
"2017-05-21,3.875240\n",
"2017-05-28,3.906200\n",
"2017-06-04,3.897800\n",
"2017-06-11,4.011300\n",
"2017-06-18,3.987140\n",
"2017-06-25,3.858920\n",
"2017-07-02,3.805340\n",
"2017-07-09,4.003400\n",
"2017-07-16,4.002000\n",
"2017-07-23,3.949500\n",
"2017-07-30,3.870500\n",
"2017-08-06,3.803000\n",
"2017-08-13,3.806500\n",
"2017-08-20,3.681500\n",
"2017-08-27,3.574500\n",
"2017-09-03,3.512500\n",
"2017-09-10,3.569000\n",
"2017-09-17,3.542500\n",
"2017-09-24,3.507000\n",
"2017-10-01,3.530000\n",
"\"\"\""
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "3LHMxCTCD4Ff",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 119
},
"outputId": "34c5081c-f202-42d7-b2e8-e964e32728a0"
},
"cell_type": "code",
"source": [
"\n",
"import torch\n",
"\n",
"A = torch.Tensor( [ [0.4, 0.3, 0.3],[0.2, 0.6, 0.2],[0.1, 0.1, 0.8]] )\n",
"print(A)\n",
"\n",
"pi = torch.rand(3, 1)\n",
"pi = pi / pi.sum()\n",
"\n",
"for _ in range(1000):\n",
" pi = torch.matmul(A.t(), pi)\n",
"print(pi)"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"tensor([[0.4000, 0.3000, 0.3000],\n",
" [0.2000, 0.6000, 0.2000],\n",
" [0.1000, 0.1000, 0.8000]])\n",
"tensor([[0.1818],\n",
" [0.2727],\n",
" [0.5455]])\n"
],
"name": "stdout"
}
]
},
{
"metadata": {
"id": "LNtzvrnJIub4",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 68
},
"outputId": "d7f8fab5-6217-4e2d-da59-cbb94e5277b5"
},
"cell_type": "code",
"source": [
"v = torch.eig(A.t(), eigenvectors=True)[1][:,0:1]\n",
"v=v/v.sum()\n",
"v"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"tensor([[0.1818],\n",
" [0.2727],\n",
" [0.5455]])"
]
},
"metadata": {
"tags": []
},
"execution_count": 3
}
]
},
{
"metadata": {
"id": "IuXrE48oOiI2",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"## Hidden markov models\n",
"\n"
]
},
{
"metadata": {
"id": "ydXN26rzOmzb",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"<img alt=\"\" src=\"//upload.wikimedia.org/wikipedia/commons/thumb/8/8a/HiddenMarkovModel.svg/300px-HiddenMarkovModel.svg.png\" width=\"300\" height=\"240\" class=\"thumbimage\" srcset=\"//upload.wikimedia.org/wikipedia/commons/thumb/8/8a/HiddenMarkovModel.svg/450px-HiddenMarkovModel.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/8/8a/HiddenMarkovModel.svg/600px-HiddenMarkovModel.svg.png 2x\" data-file-width=\"750\" data-file-height=\"600\">"
]
},
{
"metadata": {
"id": "t7vbL_qXO_Kt",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"We aim to compute\n",
"$$\n",
"P(y_{1:t})\n",
"$$"
]
},
{
"metadata": {
"id": "saHu9FtMPvc0",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Here we implement the forward algorithm. Let $\\alpha_t(x_t) = P( x_t, y_{1:t})$. \n",
"\n",
"We have\n",
"$$\n",
"P(y_{1:t}) = \\sum_{s \\in S} \\alpha_t (s)\n",
"$$ where $S$ is the set of hidden states.\n",
"\n",
"The recursive formula of $\\alpha_t(x_t)$ is as follows:\n",
"$$\n",
"\\alpha_t(x_t) = b_{x_t, y_t} \\times \\sum_{x_{t-1} \\in S} \\alpha_{t-1}(x_{t-1}) \\times a_{x_{t-1}, x_t} \n",
"$$\n",
"\n",
"and\n",
"\n",
"$$\n",
"\\alpha_1(x_1) = \\pi(x_1) \\times b_{x_1, y_1}\n",
"$$"
]
},
{
"metadata": {
"id": "bl7fOQGALlEk",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"import math\n",
"\n",
"class HMM(torch.nn.Module):\n",
" def __init__(self, n):\n",
" super().__init__()\n",
" \n",
" self.n = n\n",
" A = 0.01*torch.randn(n, n)\n",
" self.register_parameter(\"A\", torch.nn.Parameter(A))\n",
" B_mean = torch.randn(n)\n",
" B_logvar = 0.01*torch.randn(n)\n",
" self.register_parameter(\"B_mean\", torch.nn.Parameter(B_mean))\n",
" self.register_parameter(\"B_logvar\", torch.nn.Parameter(B_logvar))\n",
" pi = 0.01*torch.randn(n)\n",
" self.register_parameter(\"pi\", torch.nn.Parameter(pi))\n",
" \n",
"\n",
" def forward(self, y):\n",
" #y :observed values y1, ...\n",
" \n",
" # convert to probabilities\n",
" pa = torch.log_softmax(self.A, dim=1 )\n",
" ppi = torch.log_softmax(self.pi, dim=0)\n",
" \n",
" # and variance\n",
" var = torch.exp(self.B_logvar) \n",
" \n",
" # gaussian observed values\n",
" py = -torch.pow(self.B_mean - y[0],2) / var/2 - 0.5 * (math.log(2*math.pi)+self.B_logvar)\n",
" \n",
" # initial alpha values (log likelihood)\n",
" alpha = py + ppi\n",
" \n",
" # recurvive computation (on log scale)\n",
" for i in range(1, y.size(0)):\n",
" py = -torch.pow(self.B_mean - y[i],2) / var/2 - 0.5 * (math.log(2*math.pi)+self.B_logvar)\n",
" alpha = torch.logsumexp(alpha.view(self.n, 1) + pa, dim=0) + py\n",
" \n",
" # return sum of alpha \n",
" return torch.logsumexp(alpha, dim=0)"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "3336AiR7LyiV",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"model = HMM(5)"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "489YhrFrzAFG",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "qa1qu2TrL4MT",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"price = torch.Tensor([float(l.split(\",\")[1]) for l in data.split(\"\\n\")[:-1]])"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "oZpMF-hQ9SG4",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"price = price - price.mean()\n",
"price = price / price.std()"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "x9AFoIffuULY",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
},
"outputId": "a27a0fbe-e8da-47ea-ca85-de362128e6e5"
},
"cell_type": "code",
"source": [
"price.size(0)-5"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"243"
]
},
"metadata": {
"tags": []
},
"execution_count": 9
}
]
},
{
"metadata": {
"id": "vs1lvUgSzF6i",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 2567
},
"outputId": "907bda94-d57d-4dc0-b583-ccecac85056c"
},
"cell_type": "code",
"source": [
"ll = -1\n",
"for epoch in range(500000): \n",
" idx = epoch % (price.size(0) - 10)\n",
" loss= - model( price[idx:idx+5])\n",
" optimizer.zero_grad()\n",
"\n",
" loss.backward()\n",
"\n",
" optimizer.step()\n",
" if ll == -1:\n",
" ll = loss.data.item()\n",
" else:\n",
" ll = 0.999 * ll + (1.0 - 0.999) * loss.data.item()\n",
" if epoch % 10000 == 0:\n",
" print(ll)\n",
" print( model( price[-5:]).item())\n",
" print(model.B_mean.data)"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"10.42137336730957\n",
"-9.904097557067871\n",
"tensor([ 1.2435, -0.0636, 1.4191, 0.5233, -0.8998])\n",
"1.6659804438897716\n",
"-5.045734405517578\n",
"tensor([ 1.5446, -0.9213, 1.5701, 0.6190, -0.3473])\n",
"0.26294181726871196\n",
"-24.104997634887695\n",
"tensor([ 2.0082, -0.9540, 2.0505, 0.8773, -0.3952])\n",
"0.14269235375517736\n",
"-24.943679809570312\n",
"tensor([ 1.8318, -0.9539, 2.2615, 0.8765, -0.3955])\n",
"0.10994652790125825\n",
"-25.016605377197266\n",
"tensor([ 1.8448, -0.9536, 2.2792, 0.8768, -0.3955])\n",
"0.11389683388326427\n",
"-25.063264846801758\n",
"tensor([ 1.8473, -0.9534, 2.2802, 0.8769, -0.3955])\n",
"0.1267401776018149\n",
"-25.094295501708984\n",
"tensor([ 1.8523, -0.9533, 2.2803, 0.8769, -0.3955])\n",
"0.15214649965553814\n",
"-25.11527442932129\n",
"tensor([ 1.8511, -0.9532, 2.2802, 0.8789, -0.3955])\n",
"0.1590621973444389\n",
"-25.12967300415039\n",
"tensor([ 1.8503, -0.9532, 2.2801, 0.8832, -0.3955])\n",
"0.16278601880001342\n",
"-25.139789581298828\n",
"tensor([ 1.8497, -0.9531, 2.2801, 0.8881, -0.3955])\n",
"0.16419796758234295\n",
"-25.14704704284668\n",
"tensor([ 1.8494, -0.9531, 2.2800, 0.8910, -0.3955])\n",
"0.1716214467047759\n",
"-25.152423858642578\n",
"tensor([ 1.8491, -0.9531, 2.2800, 0.8906, -0.3955])\n",
"0.18095696763137814\n",
"-25.156557083129883\n",
"tensor([ 1.8490, -0.9531, 2.2800, 0.8872, -0.3955])\n",
"0.19245426378362698\n",
"-25.159931182861328\n",
"tensor([ 1.8489, -0.9531, 2.2800, 0.8815, -0.3955])\n",
"0.1977639607957912\n",
"-25.162765502929688\n",
"tensor([ 1.8488, -0.9531, 2.2800, 0.8749, -0.3955])\n",
"0.20026169399188348\n",
"-25.16525650024414\n",
"tensor([ 1.8488, -0.9531, 2.2800, 0.8703, -0.3955])\n",
"0.21241968293279842\n",
"-25.16754150390625\n",
"tensor([ 1.8488, -0.9531, 2.2800, 0.8700, -0.3955])\n",
"0.23024657079536856\n",
"-25.16966438293457\n",
"tensor([ 1.8487, -0.9531, 2.2800, 0.8740, -0.3955])\n",
"0.23538370344566628\n",
"-25.171716690063477\n",
"tensor([ 1.8487, -0.9531, 2.2800, 0.8789, -0.3955])\n",
"0.25342020583923763\n",
"-25.173795700073242\n",
"tensor([ 1.8487, -0.9531, 2.2800, 0.8801, -0.3954])\n",
"0.27578638229087593\n",
"-25.180063247680664\n",
"tensor([ 1.8487, -0.9531, 2.2800, 0.8790, -0.3933])\n",
"0.2771308563839316\n",
"-25.192819595336914\n",
"tensor([ 1.8487, -0.9531, 2.2800, 0.8783, -0.3894])\n",
"0.27364688727594383\n",
"-25.204593658447266\n",
"tensor([ 1.8487, -0.9531, 2.2800, 0.8778, -0.3861])\n",
"0.270464264793765\n",
"-25.212421417236328\n",
"tensor([ 1.8487, -0.9531, 2.2800, 0.8775, -0.3847])\n",
"0.27361799540998893\n",
"-25.221965789794922\n",
"tensor([ 1.8487, -0.9531, 2.2800, 0.8773, -0.3821])\n",
"0.28992920987026605\n",
"-25.2320499420166\n",
"tensor([ 1.8487, -0.9531, 2.2800, 0.8771, -0.3774])\n",
"0.30947759894336596\n",
"-25.240856170654297\n",
"tensor([ 1.8487, -0.9531, 2.2800, 0.8770, -0.3706])\n",
"0.31196499690105706\n",
"-25.24869155883789\n",
"tensor([ 1.8487, -0.9531, 2.2800, 0.8770, -0.3635])\n",
"0.3114140619238951\n",
"-25.255496978759766\n",
"tensor([ 1.8487, -0.9531, 2.2800, 0.8769, -0.3568])\n",
"0.30763316274840796\n",
"-25.26129913330078\n",
"tensor([ 1.8487, -0.9531, 2.2800, 0.8769, -0.3510])\n",
"0.30192596444441794\n",
"-25.26610565185547\n",
"tensor([ 1.8487, -0.9531, 2.2800, 0.8769, -0.3469])\n",
"0.2991548043879867\n",
"-25.26995277404785\n",
"tensor([ 1.8487, -0.9531, 2.2800, 0.8769, -0.3455])\n",
"0.30287387135995864\n",
"-25.273332595825195\n",
"tensor([ 1.8487, -0.9531, 2.2800, 0.8769, -0.3453])\n",
"0.3109499857409771\n",
"-25.2768611907959\n",
"tensor([ 1.8487, -0.9531, 2.2800, 0.8769, -0.3433])\n",
"0.30617735598520895\n",
"-25.28030014038086\n",
"tensor([ 1.8487, -0.9531, 2.2800, 0.8769, -0.3421])\n",
"0.30140305379253257\n",
"-25.28352165222168\n",
"tensor([ 1.8487, -0.9531, 2.2800, 0.8769, -0.3424])\n",
"0.2949640793011718\n",
"-25.286760330200195\n",
"tensor([ 1.8487, -0.9531, 2.2800, 0.8769, -0.3432])\n",
"0.29375283307946354\n",
"-25.28981590270996\n",
"tensor([ 1.8487, -0.9531, 2.2800, 0.8769, -0.3450])\n",
"0.2951011015086103\n",
"-25.29248046875\n",
"tensor([ 1.8487, -0.9531, 2.2800, 0.8769, -0.3483])\n",
"0.3039233211118434\n",
"-25.294673919677734\n",
"tensor([ 1.8487, -0.9531, 2.2800, 0.8769, -0.3530])\n",
"0.31003409113126457\n",
"-25.2957706451416\n",
"tensor([ 1.8487, -0.9531, 2.2800, 0.8769, -0.3589])\n",
"0.3194086324292594\n",
"-25.29519271850586\n",
"tensor([ 1.8487, -0.9531, 2.2800, 0.8769, -0.3655])\n",
"0.3268512756317831\n",
"-25.291227340698242\n",
"tensor([ 1.8487, -0.9531, 2.2800, 0.8769, -0.3727])\n",
"0.3265047370139794\n",
"-25.28326416015625\n",
"tensor([ 1.8487, -0.9531, 2.2800, 0.8769, -0.3796])\n",
"0.32223086287632036\n",
"-25.274822235107422\n",
"tensor([ 1.8487, -0.9531, 2.2800, 0.8769, -0.3849])\n",
"0.32529371419852443\n",
"-25.279953002929688\n",
"tensor([ 1.8487, -0.9530, 2.2800, 0.8769, -0.3880])\n",
"0.3211423304196827\n",
"-25.399688720703125\n",
"tensor([ 1.8487, -0.9523, 2.2800, 0.8769, -0.3905])\n",
"0.31910119447616425\n",
"-24.66801643371582\n",
"tensor([ 1.8487, -0.9554, 2.2800, 0.8769, -0.3922])\n",
"0.32236833639177226\n",
"-22.78359031677246\n",
"tensor([ 1.8487, -0.9633, 2.2800, 0.8769, -0.3933])\n",
"0.30346350158836055\n",
"-20.935359954833984\n",
"tensor([ 1.8487, -0.9713, 2.2800, 0.8769, -0.3941])\n"
],
"name": "stdout"
}
]
},
{
"metadata": {
"id": "8USfK1A5zz9r",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
},
"outputId": "67426f52-6e69-47a5-d106-de8ba772a6ca"
},
"cell_type": "code",
"source": [
"torch.exp(0.5*model.B_logvar)"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"tensor([0.2090, 0.0814, 0.1326, 0.2928, 0.2456], grad_fn=<ExpBackward>)"
]
},
"metadata": {
"tags": []
},
"execution_count": 11
}
]
},
{
"metadata": {
"id": "16RKQkLVBFab",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 71
},
"outputId": "9bd14b22-14fa-4d2d-b1cf-602dc965f4cb"
},
"cell_type": "code",
"source": [
"model.B_mean"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"Parameter containing:\n",
"tensor([ 1.8487, -0.9752, 2.2800, 0.8769, -0.3944], requires_grad=True)"
]
},
"metadata": {
"tags": []
},
"execution_count": 12
}
]
},
{
"metadata": {
"id": "pNYfdnwA3TG_",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 122
},
"outputId": "2be86403-2452-4f0f-de29-ba320a404671"
},
"cell_type": "code",
"source": [
"torch.round(1000*torch.softmax(model.A, dim=1 ))/1000"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"tensor([[1.0000, 0.0000, 0.0000, 0.0000, 0.0000],\n",
" [0.0000, 1.0000, 0.0000, 0.0000, 0.0000],\n",
" [0.0970, 0.0000, 0.9030, 0.0000, 0.0000],\n",
" [0.0000, 0.0000, 0.0000, 0.9930, 0.0070],\n",
" [0.0000, 0.0050, 0.0000, 0.0000, 0.9950]], grad_fn=<DivBackward0>)"
]
},
"metadata": {
"tags": []
},
"execution_count": 13
}
]
},
{
"metadata": {
"id": "sznkRkJb4IVr",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 54
},
"outputId": "922cfbc3-e623-4783-a22d-de4586dc27ef"
},
"cell_type": "code",
"source": [
"torch.softmax(model.pi, dim=0)"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"tensor([0.0515, 0.2224, 0.0535, 0.2139, 0.4587], grad_fn=<SoftmaxBackward>)"
]
},
"metadata": {
"tags": []
},
"execution_count": 14
}
]
},
{
"metadata": {
"id": "f4UF1QKi3yR7",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 452
},
"outputId": "7e0b3c4a-26db-4b78-e7c3-5d70038c8339"
},
"cell_type": "code",
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"plt.hist(price.numpy())"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"(array([54., 43., 47., 25., 8., 23., 19., 5., 11., 13.]),\n",
" array([-1.25947654, -0.88813452, -0.51679249, -0.14545046, 0.22589157,\n",
" 0.59723359, 0.96857562, 1.33991765, 1.71125968, 2.0826017 ,\n",
" 2.45394373]),\n",
" <a list of 10 Patch objects>)"
]
},
"metadata": {
"tags": []
},
"execution_count": 15
},
{
"output_type": "display_data",
"data": {
"image/png": "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\n96pUKmPe39raMhlvs4v/+8lXJv01AeB/TUXDJnTk29bWlq1bt45+/89//jOtra2TNhQA1LMJxff0\n009Pb29vkuTZZ59NW1tbDjjggEkdDADq1YROOy9YsCDHHXdcli9fnlmzZuWGG26Y7LkAoG7NqlT7\ngS0AMKlc4QoAChNfAChsUv7UqF498cQTWblyZW666aZ0dHS87/4HHnggv/nNbzJ79uycd955Offc\nc6dhyr3z7rvvpqurK6+++moaGhry4x//OEceeeQujznuuOOyYMGC0e9//etfp6GhofSoe2Wsy50+\n/vjjWbduXRoaGrJo0aJceeWV0zjp3hlrXYsXL85hhx02uje33nprDj300Okada9t3rw5V1xxRb75\nzW/mggsu2OW+Wt6zZOy11fq+rV27Nk8++WR27tyZyy67LGefffbofbW8b2Ota0r2rMJuvfTSS5XL\nL7+8csUVV1Qefvjh993/zjvvVM4+++zKW2+9VRkaGqp86UtfqgwODk7DpHvnvvvuq9x4442VSqVS\neeyxxyorV65832NOOeWU0mPtk/7+/sq3v/3tSqVSqTz//POV8847b5f7ly5dWnn11VcrIyMjlRUr\nVlSee+656Rhzr1VbV0dHR+Xtt9+ejtH22TvvvFO54IILKtdff33l7rvvft/9tbpnlUr1tdXyvvX1\n9VUuueSSSqVSqfzrX/+qnHHGGbvcX6v7Vm1dU7FnTjvvQWtra37+85+npWX3f1z99NNP54QTTkhL\nS0vmzJmTBQsW5Kmnnio85d7r6+vLWWedlSRZuHBhTcxczViXO3355Zdz0EEH5fDDD8/s2bNzxhln\npK+vbzrHHbd6voxrU1NT7rzzzrS1tb3vvlres2TstdW6k08+ObfddluS5MADD8zQ0FBGRkaS1Pa+\njbWuqSK+e/DBD35wzFOtW7duzSGHHDL6fa1cYvO9c8+ePTuzZs3Kjh07dnnMjh07smrVqixfvjwb\nN26cjjH3yliXOx0YGKjJfUrGdxnXG264IStWrMitt95a9UpzM0ljY2PmzJmz2/tqec+Ssdf2X7W6\nbw0NDWlubk6S9PT0ZNGiRaP/n6zlfRtrXf812XvmZ75J7r333tx777273Hb11Venvb193K8xE/8D\n2t26nn766V2+393cq1evzpe//OXMmjUrF1xwQU466aSccMIJUzrrZJqJezEZ/ndd3/nOd9Le3p6D\nDjooV155ZXp7e/PFL35xmqZjvOph3x566KH09PRkw4YN0z3KpNrTuqZiz8Q3ybnnnrvXvyy1u0ts\nnnjiiZM92j7Z3bq6uroyMDCQY445Ju+++24qlUqampp2ecyKFStGv/785z+fzZs3z+j4jnW50/+9\nb8uWLTVzOrDaZVyXLVs2+vWiRYuyefPmmvuf+O7U8p6NR63v22OPPZb169fnV7/61S4/lqv1fdvT\nupKp2TOnnSfos5/9bP72t7/lrbfeyjvvvJOnnnoqJ5100nSPVdXpp5+e3//+90mSRx55JKeeeuou\n97/44otZtWpVKpVKdu7cmaeeeipHH330dIw6bmNd7vSII47I22+/nX/84x/ZuXNnHnnkkZx++unT\nOe64jbWubdu25eKLLx79kcGf//znGb9P41XLe1ZNre/btm3bsnbt2txxxx05+OCDd7mvlvdtrHVN\n1Z458t2DRx99NHfddVdefPHFPPvss7n77ruzYcOG/PKXv8zJJ5+cz33uc1m1alUuvvjizJo1K1de\neeUefzlrJjnnnHPy+OOPZ8WKFWlqasqaNWuSZJd1HXbYYfn617+e2bNnZ/Hixbv8ectMtLvLnd53\n331paWnJWWedlRtvvDGrVq1K8v/X//GPf3yaJx6fautatGhRzj///HzgAx/Ipz/96Zo6enrmmWdy\n880355VXXkljY2N6e3uzePHiHHHEETW9Z0n1tdXyvj344IMZHBzMNddcM3rbqaeemk996lM1vW/V\n1jUVe+bykgBQmNPOAFCY+AJAYeILAIWJLwAUJr4AUJj4AkBh4gsAhYkvABT2/wCHFGn97RpH2QAA\nAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f768c757080>"
]
},
"metadata": {
"tags": []
}
}
]
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment