markov-models/markov.ipynb

558 lines
449 KiB
Plaintext
Raw Normal View History

2020-12-11 21:33:20 +00:00
{
"metadata": {
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
2020-12-31 19:30:39 +00:00
"version": "3.8.6-final"
2020-12-11 21:33:20 +00:00
},
"orig_nbformat": 2,
"kernelspec": {
"name": "python3",
"display_name": "Python 3",
"language": "python"
}
},
"nbformat": 4,
"nbformat_minor": 2,
"cells": [
{
"cell_type": "code",
2020-12-23 20:12:08 +00:00
"execution_count": 1,
2020-12-11 21:33:20 +00:00
"metadata": {},
"outputs": [],
"source": [
2020-12-31 19:30:39 +00:00
"#IMPORTS AND COMMON VARIABLES\n",
2020-12-11 21:33:20 +00:00
"import matplotlib.pyplot as plt\n",
2020-12-23 20:12:08 +00:00
"from matplotlib import cm\n",
2020-12-11 21:33:20 +00:00
"import numpy as np\n",
2020-12-31 19:30:39 +00:00
"from math import sqrt\n",
2020-12-11 21:33:20 +00:00
"\n",
"from constants import *\n",
"from maths import gaussian\n",
2020-12-31 19:30:39 +00:00
"from markov import MarkovModel\n",
"from markovlog import LogMarkovModel\n",
"\n",
"x = np.linspace(-4, 8, 120) # x values for figures\n",
"x_label = \"Observation Space\"\n",
"y_label = \"Probability Density\""
2020-12-11 21:33:20 +00:00
]
},
{
"source": [
"State Probability Functions (1)\n",
"==================="
],
"cell_type": "markdown",
"metadata": {}
},
{
"cell_type": "code",
2020-12-23 20:12:08 +00:00
"execution_count": 2,
2020-12-11 21:33:20 +00:00
"metadata": {},
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": "<Figure size 432x288 with 1 Axes>",
2020-12-31 19:30:39 +00:00
"image/svg+xml": "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n<!-- Created with matplotlib (https://matplotlib.org/) -->\n<svg height=\"277.314375pt\" version=\"1.1\" viewBox=\"0 0 385.78125 277.314375\" width=\"385.78125pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n <metadata>\n <rdf:RDF xmlns:cc=\"http://creativecommons.org/ns#\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\n <cc:Work>\n <dc:type rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\"/>\n <dc:date>2020-12-31T19:28:10.006788</dc:date>\n <dc:format>image/svg+xml</dc:format>\n <dc:creator>\n <cc:Agent>\n <dc:title>Matplotlib v3.3.3, https://matplotlib.org/</dc:title>\n </cc:Agent>\n </dc:creator>\n </cc:Work>\n </rdf:RDF>\n </metadata>\n <defs>\n <style type=\"text/css\">*{stroke-linecap:butt;stroke-linejoin:round;}</style>\n </defs>\n <g id=\"figure_1\">\n <g id=\"patch_1\">\n <path d=\"M 0 277.314375 \nL 385.78125 277.314375 \nL 385.78125 0 \nL 0 0 \nz\n\" style=\"fill:none;\"/>\n </g>\n <g id=\"axes_1\">\n <g id=\"patch_2\">\n <path d=\"M 43.78125 239.758125 \nL 378.58125 239.758125 \nL 378.58125 22.318125 \nL 43.78125 22.318125 \nz\n\" style=\"fill:#ffffff;\"/>\n </g>\n <g id=\"matplotlib.axis_1\">\n <g id=\"xtick_1\">\n <g id=\"line2d_1\">\n <path clip-path=\"url(#p4d211b6ef7)\" d=\"M 58.999432 239.758125 \nL 58.999432 22.318125 \n\" style=\"fill:none;stroke:#b0b0b0;stroke-dasharray:2.96,1.28;stroke-dashoffset:0;stroke-width:0.8;\"/>\n </g>\n <g id=\"line2d_2\">\n <defs>\n <path d=\"M 0 0 \nL 0 3.5 \n\" id=\"m41176b222c\" style=\"stroke:#000000;stroke-width:0.8;\"/>\n </defs>\n <g>\n <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"58.999432\" xlink:href=\"#m41176b222c\" y=\"239.758125\"/>\n </g>\n </g>\n <g id=\"text_1\">\n <!-- 4 -->\n <g transform=\"translate(51.628338 254.356562)scale(0.1 -0.1)\">\n <defs>\n <path d=\"M 10.59375 35.5 \nL 73.1875 35.5 \nL 73.1875 27.203125 \nL 10.59375 27.203125 \nz\n\" id=\"DejaVuSans-8722\"/>\n <path d=\"M 37.796875 64.3125 \nL 12.890625 25.390625 \nL 37.796875 25.390625 \nz\nM 35.203125 72.90625 \nL 47.609375 72.90625 \nL 47.609375 25.390625 \nL 58.015625 25.390625 \nL 58.015625 17.1875 \nL 47.609375 17.1875 \nL 47.609375 0 \nL 37.796875 0 \nL 37.796875 17.1875 \nL 4.890625 17.1875 \nL 4.890625 26.703125 \nz\n\" id=\"DejaVuSans-52\"/>\n </defs>\n <use xlink:href=\"#DejaVuSans-8722\"/>\n <use x=\"83.789062\" xlink:href=\"#DejaVuSans-52\"/>\n </g>\n </g>\n </g>\n <g id=\"xtick_2\">\n <g id=\"line2d_3\">\n <path clip-path=\"url(#p4d211b6ef7)\" d=\"M 109.726705 239.758125 \nL 109.726705 22.318125 \n\" style=\"fill:none;stroke:#b0b0b0;stroke-dasharray:2.96,1.28;stroke-dashoffset:0;stroke-width:0.8;\"/>\n </g>\n <g id=\"line2d_4\">\n <g>\n <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"109.726705\" xlink:href=\"#m41176b222c\" y=\"239.758125\"/>\n </g>\n </g>\n <g id=\"text_2\">\n <!-- 2 -->\n <g transform=\"translate(102.355611 254.356562)scale(0.1 -0.1)\">\n <defs>\n <path d=\"M 19.1875 8.296875 \nL 53.609375 8.296875 \nL 53.609375 0 \nL 7.328125 0 \nL 7.328125 8.296875 \nQ 12.9375 14.109375 22.625 23.890625 \nQ 32.328125 33.6875 34.8125 36.53125 \nQ 39.546875 41.84375 41.421875 45.53125 \nQ 43.3125 49.21875 43.3125 52.78125 \nQ 43.3125 58.59375 39.234375 62.25 \nQ 35.15625 65.921875 28.609375 65.921875 \nQ 23.96875 65.921875 18.8125 64.3125 \nQ 13.671875 62.703125 7.8125 59.421875 \nL 7.8125 69.390625 \nQ 13.765625 71.78125 18.9375 73 \nQ 24.125 74.21875 28.421875 74.21875 \nQ 39.75 74.21875 46.484375 68.546875 \nQ 53.21875 62.890625 53.21875 53.421875 \nQ 53.21875 48.921875 51.53125 44.890625 \nQ 49.859375 40.875 45.40625 35.40625 \nQ 44.
"image/png": "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
2020-12-11 21:33:20 +00:00
},
"metadata": {
"needs_background": "light"
}
}
],
"source": [
"state_1_y = [gaussian(i, state1.mean, state1.std_dev) for i in x]\n",
"state_2_y = [gaussian(i, state2.mean, state2.std_dev) for i in x]\n",
"\n",
"plt.plot(x, state_1_y, c='r', label=\"State 1\")\n",
"plt.plot(x, state_2_y, c='b', label=\"State 2\")\n",
"\n",
"plt.legend()\n",
"plt.title(\"State Probability Density Functions\")\n",
"\n",
2020-12-31 19:30:39 +00:00
"plt.xlabel(x_label)\n",
"plt.ylabel(y_label)\n",
2020-12-11 21:33:20 +00:00
"plt.grid(linestyle=\"--\")\n",
"\n",
"plt.show()"
]
},
{
"source": [
"Output Probability Densities (2)\n",
"=========="
],
"cell_type": "markdown",
"metadata": {}
},
{
"cell_type": "code",
2020-12-23 20:12:08 +00:00
"execution_count": 3,
2020-12-11 21:33:20 +00:00
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"3.8 -> State 1: 0.02185157424475792, State 2: 0.5471239427774459\n4.2 -> State 1: 0.009496655019831194, State 2: 0.5471239427774459\n3.4 -> State 1: 0.04499247209432338, State 2: 0.3947074079064296\n-0.4 -> State 1: 0.16833223796171576, State 2: 1.500652790137751e-09\n1.9 -> State 1: 0.2509478601290037, State 2: 0.006331212017054291\n3.0 -> State 1: 0.08289761566062391, State 2: 0.2054255182126689\n1.6 -> State 1: 0.2933877723035829, State 2: 0.001596702666402633\n1.9 -> State 1: 0.2509478601290037, State 2: 0.006331212017054291\n5.0 -> State 1: 0.0012852324969092556, State 2: 0.2054255182126689\n"
]
}
],
"source": [
"for obs in observations:\n",
" print(f'{obs} -> State 1: {gaussian(obs, state1.mean, state1.std_dev)}, State 2: {gaussian(obs, state2.mean, state2.std_dev)}')"
]
},
{
"cell_type": "code",
2020-12-23 20:12:08 +00:00
"execution_count": 4,
2020-12-11 21:33:20 +00:00
"metadata": {},
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": "<Figure size 432x288 with 1 Axes>",
2020-12-31 19:30:39 +00:00
"image/svg+xml": "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n<!-- Created with matplotlib (https://matplotlib.org/) -->\n<svg height=\"277.314375pt\" version=\"1.1\" viewBox=\"0 0 385.78125 277.314375\" width=\"385.78125pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n <metadata>\n <rdf:RDF xmlns:cc=\"http://creativecommons.org/ns#\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\n <cc:Work>\n <dc:type rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\"/>\n <dc:date>2020-12-31T19:28:10.820261</dc:date>\n <dc:format>image/svg+xml</dc:format>\n <dc:creator>\n <cc:Agent>\n <dc:title>Matplotlib v3.3.3, https://matplotlib.org/</dc:title>\n </cc:Agent>\n </dc:creator>\n </cc:Work>\n </rdf:RDF>\n </metadata>\n <defs>\n <style type=\"text/css\">*{stroke-linecap:butt;stroke-linejoin:round;}</style>\n </defs>\n <g id=\"figure_1\">\n <g id=\"patch_1\">\n <path d=\"M 0 277.314375 \nL 385.78125 277.314375 \nL 385.78125 0 \nL 0 0 \nz\n\" style=\"fill:none;\"/>\n </g>\n <g id=\"axes_1\">\n <g id=\"patch_2\">\n <path d=\"M 43.78125 239.758125 \nL 378.58125 239.758125 \nL 378.58125 22.318125 \nL 43.78125 22.318125 \nz\n\" style=\"fill:#ffffff;\"/>\n </g>\n <g id=\"PathCollection_1\">\n <defs>\n <path d=\"M -4.031129 4.031129 \nL 4.031129 -4.031129 \nM -4.031129 -4.031129 \nL 4.031129 4.031129 \n\" id=\"m514a6efa29\" style=\"stroke:#800000;stroke-width:1.5;\"/>\n </defs>\n <g clip-path=\"url(#peddbf5cb5e)\">\n <use style=\"fill:#800000;stroke:#800000;stroke-width:1.5;\" x=\"256.835795\" xlink:href=\"#m514a6efa29\" y=\"222.286649\"/>\n <use style=\"fill:#800000;stroke:#800000;stroke-width:1.5;\" x=\"266.98125\" xlink:href=\"#m514a6efa29\" y=\"226.576827\"/>\n <use style=\"fill:#800000;stroke:#800000;stroke-width:1.5;\" x=\"246.690341\" xlink:href=\"#m514a6efa29\" y=\"214.251098\"/>\n <use style=\"fill:#800000;stroke:#800000;stroke-width:1.5;\" x=\"150.308523\" xlink:href=\"#m514a6efa29\" y=\"171.422037\"/>\n <use style=\"fill:#800000;stroke:#800000;stroke-width:1.5;\" x=\"208.644886\" xlink:href=\"#m514a6efa29\" y=\"142.734212\"/>\n <use style=\"fill:#800000;stroke:#800000;stroke-width:1.5;\" x=\"236.544886\" xlink:href=\"#m514a6efa29\" y=\"201.088744\"/>\n <use style=\"fill:#800000;stroke:#800000;stroke-width:1.5;\" x=\"201.035795\" xlink:href=\"#m514a6efa29\" y=\"127.997184\"/>\n <use style=\"fill:#800000;stroke:#800000;stroke-width:1.5;\" x=\"208.644886\" xlink:href=\"#m514a6efa29\" y=\"142.734212\"/>\n <use style=\"fill:#800000;stroke:#800000;stroke-width:1.5;\" x=\"287.272159\" xlink:href=\"#m514a6efa29\" y=\"229.428199\"/>\n </g>\n </g>\n <g id=\"PathCollection_2\">\n <defs>\n <path d=\"M -4.031129 4.031129 \nL 4.031129 -4.031129 \nM -4.031129 -4.031129 \nL 4.031129 4.031129 \n\" id=\"m9d4150ad87\" style=\"stroke:#000080;stroke-width:1.5;\"/>\n </defs>\n <g clip-path=\"url(#peddbf5cb5e)\">\n <use style=\"fill:#000080;stroke:#000080;stroke-width:1.5;\" x=\"256.835795\" xlink:href=\"#m9d4150ad87\" y=\"39.888682\"/>\n <use style=\"fill:#000080;stroke:#000080;stroke-width:1.5;\" x=\"266.98125\" xlink:href=\"#m9d4150ad87\" y=\"39.888682\"/>\n <use style=\"fill:#000080;stroke:#000080;stroke-width:1.5;\" x=\"246.690341\" xlink:href=\"#m9d4150ad87\" y=\"92.814493\"/>\n <use style=\"fill:#000080;stroke:#000080;stroke-width:1.5;\" x=\"150.308523\" xlink:href=\"#m9d4150ad87\" y=\"229.874488\"/>\n <use style=\"fill:#000080;stroke:#000080;stroke-width:1.5;\" x=\"208.644886\" xlink:href=\"#m9d4150ad87\" y=\"227.67601\"/>\n <use style=\"fill:#000080;stroke:#000080;stroke-width:1.5;\" x=\"236.544886\" xlink:href=\"#m9d4150ad87\" y=\"158.541597\"/>\n <use style=\"fill:#000080;stroke:#000080;stroke-width:1.5;\" x=\"201.035795\" xlink:href=\"#m9d4150ad87\" y=\"229.320042\"/>\n
"image/png": "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
2020-12-11 21:33:20 +00:00
},
"metadata": {
"needs_background": "light"
}
}
],
"source": [
"state_1_y = [gaussian(i, state1.mean, state1.std_dev) for i in x]\n",
"state_2_y = [gaussian(i, state2.mean, state2.std_dev) for i in x]\n",
"\n",
"plt.plot(x, state_1_y, c='r', label=\"State 1\")\n",
"plt.plot(x, state_2_y, c='b', label=\"State 2\")\n",
"\n",
"plt.legend()\n",
2020-12-31 19:30:39 +00:00
"plt.title(\"State Probability Density Functions With Observations\")\n",
2020-12-11 21:33:20 +00:00
"\n",
2020-12-31 19:30:39 +00:00
"plt.xlabel(x_label)\n",
"plt.ylabel(y_label)\n",
2020-12-11 21:33:20 +00:00
"plt.grid(linestyle=\"--\")\n",
"\n",
"state1_pd = [gaussian(i, state1.mean, state1.std_dev) for i in observations]\n",
"state2_pd = [gaussian(i, state2.mean, state2.std_dev) for i in observations]\n",
"\n",
"#############################################\n",
"# Observation Marks \n",
"#############################################\n",
"\n",
"config = {\n",
" \"s\": 65,\n",
" \"marker\": 'x'\n",
"}\n",
"\n",
"plt.scatter(observations, state1_pd, color=(0.5, 0, 0), **config)\n",
"plt.scatter(observations, state2_pd, color=(0, 0, 0.5), **config)\n",
"\n",
"plt.show()"
]
},
2020-12-23 20:12:08 +00:00
{
"source": [
"# Forward Procedure (3)"
],
"cell_type": "markdown",
"metadata": {}
},
2020-12-11 21:33:20 +00:00
{
"cell_type": "code",
2020-12-23 20:12:08 +00:00
"execution_count": 5,
2020-12-11 21:33:20 +00:00
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
2020-12-31 19:30:39 +00:00
"[[9.61469267e-03 2.00389806e-04 2.89433448e-04 4.30961030e-04\n 9.94968491e-05 7.58875028e-06 2.06308972e-06 4.76335758e-07\n 5.63267096e-10]\n [3.06389408e-01 1.56214298e-01 5.73475605e-02 8.00607227e-11\n 1.63710810e-07 1.25762776e-06 2.59451223e-09 7.98988065e-10\n 6.02373446e-09]]\n"
2020-12-11 21:33:20 +00:00
]
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
2020-12-31 19:30:39 +00:00
"1.9197737567283167e-10"
2020-12-11 21:33:20 +00:00
]
},
"metadata": {},
2020-12-23 20:12:08 +00:00
"execution_count": 5
2020-12-11 21:33:20 +00:00
}
],
"source": [
"model = MarkovModel(states=[state1, state2], observations=observations, state_transitions=state_transition)\n",
"model.populate_forward()\n",
"\n",
2020-12-31 19:30:39 +00:00
"print(model.forward)\n",
2020-12-11 21:33:20 +00:00
"\n",
2020-12-31 19:30:39 +00:00
"forward = model.forward\n",
"model.calculate_p_obs_forward()\n"
2020-12-11 21:33:20 +00:00
]
},
2020-12-23 20:12:08 +00:00
{
"source": [
"# Backward Procedure (4)"
],
"cell_type": "markdown",
"metadata": {}
},
2020-12-11 21:33:20 +00:00
{
"cell_type": "code",
2020-12-23 20:12:08 +00:00
"execution_count": 6,
2020-12-11 21:33:20 +00:00
"metadata": {},
2020-12-23 20:12:08 +00:00
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
2020-12-31 19:30:39 +00:00
"[[6.57892066e-11 2.92661737e-09 6.89869860e-08 4.45463420e-07\n 1.92898428e-06 2.51074677e-05 9.30059204e-05 3.93414211e-04\n 2.00000000e-02]\n [6.24515168e-10 1.22518178e-09 2.99943420e-09 2.11439342e-08\n 3.02470605e-07 1.14745634e-06 3.77015860e-05 5.73240014e-03\n 3.00000000e-02]]\n"
2020-12-23 20:12:08 +00:00
]
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
2020-12-31 19:30:39 +00:00
"1.9197737567283167e-10"
2020-12-23 20:12:08 +00:00
]
},
"metadata": {},
"execution_count": 6
}
],
"source": [
"model = MarkovModel(states=[state1, state2], observations=observations, state_transitions=state_transition)\n",
"model.populate_backward()\n",
"\n",
"print(model.backward)\n",
2020-12-31 19:30:39 +00:00
"\n",
"backward = model.backward\n",
"model.calculate_p_obs_backward()\n"
2020-12-23 20:12:08 +00:00
]
},
{
"source": [
"# Compare Forward/Backward Final"
],
"cell_type": "markdown",
"metadata": {}
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
2020-12-31 19:30:39 +00:00
"forward: 1.9197737567283167e-10\nbackward: 1.9197737567283167e-10\ndiff: 0.0\n"
2020-12-23 20:12:08 +00:00
]
}
],
"source": [
"model = MarkovModel(states=[state1, state2], observations=observations, state_transitions=state_transition)\n",
"model.populate_forward()\n",
"model.populate_backward()\n",
"\n",
"print(\"forward:\", model.calculate_p_obs_forward())\n",
2020-12-31 19:30:39 +00:00
"print(\"backward:\", model.calculate_p_obs_backward())\n",
"\n",
"print(\"diff: \", model.p_obs_forward - model.p_obs_backward)\n"
2020-12-23 20:12:08 +00:00
]
},
{
"source": [
"# Occupation Likelihoods (5)"
],
"cell_type": "markdown",
"metadata": {}
},
2020-12-31 19:30:39 +00:00
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"[[3.29488306e-03 3.05486147e-03 1.04007783e-01 9.99999991e-01\n 9.99742065e-01 9.92483109e-01 9.99490475e-01 9.76142401e-01\n 5.86805704e-02]\n [9.96705117e-01 9.96945139e-01 8.95992217e-01 8.81769869e-09\n 2.57935122e-04 7.51689067e-03 5.09524759e-04 2.38575993e-02\n 9.41319430e-01]]\n"
]
}
],
"source": [
"model = MarkovModel(states=[state1, state2], observations=observations, state_transitions=state_transition).populate()\n",
"\n",
"occupation = model.occupation\n",
"print(model.occupation)"
]
},
{
"source": [
"# Re-estimate Mean & Variance (6)"
],
"cell_type": "markdown",
"metadata": {}
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
2020-12-31 19:30:39 +00:00
"mean: [1, 4]\nvariance: [1.44, 0.49]\n\nmean: [1.6747846620246418, 4.089148442531048]\nvariance: [1.8465047320872243, 0.37804421554121403]\n"
]
}
],
"source": [
2020-12-31 19:30:39 +00:00
"model = MarkovModel(states=[state1, state2], observations=observations, state_transitions=state_transition).populate()\n",
"\n",
"print(\"mean: \", [state1.mean, state2.mean])\n",
"print(\"variance: \", [state1.variance, state2.variance])\n",
"print()\n",
"\n",
"print(\"mean: \", model.reestimated_mean())\n",
"print(\"variance: \", model.reestimated_variance())\n"
]
},
{
"source": [
"New PDFs (7)\n",
"==================="
],
"cell_type": "markdown",
"metadata": {}
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": "<Figure size 432x288 with 1 Axes>",
"image/svg+xml": "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n<!-- Created with matplotlib (https://matplotlib.org/) -->\n<svg height=\"277.314375pt\" version=\"1.1\" viewBox=\"0 0 385.78125 277.314375\" width=\"385.78125pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n <metadata>\n <rdf:RDF xmlns:cc=\"http://creativecommons.org/ns#\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\n <cc:Work>\n <dc:type rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\"/>\n <dc:date>2020-12-31T19:28:12.908064</dc:date>\n <dc:format>image/svg+xml</dc:format>\n <dc:creator>\n <cc:Agent>\n <dc:title>Matplotlib v3.3.3, https://matplotlib.org/</dc:title>\n </cc:Agent>\n </dc:creator>\n </cc:Work>\n </rdf:RDF>\n </metadata>\n <defs>\n <style type=\"text/css\">*{stroke-linecap:butt;stroke-linejoin:round;}</style>\n </defs>\n <g id=\"figure_1\">\n <g id=\"patch_1\">\n <path d=\"M 0 277.314375 \nL 385.78125 277.314375 \nL 385.78125 0 \nL 0 0 \nz\n\" style=\"fill:none;\"/>\n </g>\n <g id=\"axes_1\">\n <g id=\"patch_2\">\n <path d=\"M 43.78125 239.758125 \nL 378.58125 239.758125 \nL 378.58125 22.318125 \nL 43.78125 22.318125 \nz\n\" style=\"fill:#ffffff;\"/>\n </g>\n <g id=\"matplotlib.axis_1\">\n <g id=\"xtick_1\">\n <g id=\"line2d_1\">\n <path clip-path=\"url(#p292afba2f8)\" d=\"M 58.999432 239.758125 \nL 58.999432 22.318125 \n\" style=\"fill:none;stroke:#b0b0b0;stroke-dasharray:2.96,1.28;stroke-dashoffset:0;stroke-width:0.8;\"/>\n </g>\n <g id=\"line2d_2\">\n <defs>\n <path d=\"M 0 0 \nL 0 3.5 \n\" id=\"mf3b816b678\" style=\"stroke:#000000;stroke-width:0.8;\"/>\n </defs>\n <g>\n <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"58.999432\" xlink:href=\"#mf3b816b678\" y=\"239.758125\"/>\n </g>\n </g>\n <g id=\"text_1\">\n <!-- 4 -->\n <g transform=\"translate(51.628338 254.356562)scale(0.1 -0.1)\">\n <defs>\n <path d=\"M 10.59375 35.5 \nL 73.1875 35.5 \nL 73.1875 27.203125 \nL 10.59375 27.203125 \nz\n\" id=\"DejaVuSans-8722\"/>\n <path d=\"M 37.796875 64.3125 \nL 12.890625 25.390625 \nL 37.796875 25.390625 \nz\nM 35.203125 72.90625 \nL 47.609375 72.90625 \nL 47.609375 25.390625 \nL 58.015625 25.390625 \nL 58.015625 17.1875 \nL 47.609375 17.1875 \nL 47.609375 0 \nL 37.796875 0 \nL 37.796875 17.1875 \nL 4.890625 17.1875 \nL 4.890625 26.703125 \nz\n\" id=\"DejaVuSans-52\"/>\n </defs>\n <use xlink:href=\"#DejaVuSans-8722\"/>\n <use x=\"83.789062\" xlink:href=\"#DejaVuSans-52\"/>\n </g>\n </g>\n </g>\n <g id=\"xtick_2\">\n <g id=\"line2d_3\">\n <path clip-path=\"url(#p292afba2f8)\" d=\"M 109.726705 239.758125 \nL 109.726705 22.318125 \n\" style=\"fill:none;stroke:#b0b0b0;stroke-dasharray:2.96,1.28;stroke-dashoffset:0;stroke-width:0.8;\"/>\n </g>\n <g id=\"line2d_4\">\n <g>\n <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"109.726705\" xlink:href=\"#mf3b816b678\" y=\"239.758125\"/>\n </g>\n </g>\n <g id=\"text_2\">\n <!-- 2 -->\n <g transform=\"translate(102.355611 254.356562)scale(0.1 -0.1)\">\n <defs>\n <path d=\"M 19.1875 8.296875 \nL 53.609375 8.296875 \nL 53.609375 0 \nL 7.328125 0 \nL 7.328125 8.296875 \nQ 12.9375 14.109375 22.625 23.890625 \nQ 32.328125 33.6875 34.8125 36.53125 \nQ 39.546875 41.84375 41.421875 45.53125 \nQ 43.3125 49.21875 43.3125 52.78125 \nQ 43.3125 58.59375 39.234375 62.25 \nQ 35.15625 65.921875 28.609375 65.921875 \nQ 23.96875 65.921875 18.8125 64.3125 \nQ 13.671875 62.703125 7.8125 59.421875 \nL 7.8125 69.390625 \nQ 13.765625 71.78125 18.9375 73 \nQ 24.125 74.21875 28.421875 74.21875 \nQ 39.75 74.21875 46.484375 68.546875 \nQ 53.21875 62.890625 53.21875 53.421875 \nQ 53.21875 48.921875 51.53125 44.890625 \nQ 49.859375 40.875 45.40625 35.40625 \nQ 44.
"image/png": "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
},
"metadata": {
"needs_background": "light"
}
}
],
"source": [
"model = MarkovModel(states=[state1, state2], observations=observations, state_transitions=state_transition).populate()\n",
"\n",
2020-12-31 19:30:39 +00:00
"new_mean = model.reestimated_mean()\n",
"new_var = model.reestimated_variance()\n",
"new_std_dev = [sqrt(x) for x in new_var]\n",
"\n",
2020-12-31 19:30:39 +00:00
"state_1_y = [gaussian(i, new_mean[0], new_std_dev[0]) for i in x]\n",
"state_2_y = [gaussian(i, new_mean[1], new_std_dev[1]) for i in x]\n",
"\n",
2020-12-31 19:30:39 +00:00
"plt.plot(x, state_1_y, c='r', label=\"State 1\")\n",
"plt.plot(x, state_2_y, c='b', label=\"State 2\")\n",
"\n",
"plt.legend()\n",
"plt.title(\"Re-estimated Probability Density Functions\")\n",
"\n",
"plt.xlabel(x_label)\n",
"plt.ylabel(y_label)\n",
"plt.grid(linestyle=\"--\")\n",
"\n",
"plt.show()"
]
},
{
"source": [
"# Compare PDFs (7)"
],
"cell_type": "markdown",
"metadata": {}
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": "<Figure size 432x288 with 1 Axes>",
"image/svg+xml": "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n<!-- Created with matplotlib (https://matplotlib.org/) -->\n<svg height=\"277.314375pt\" version=\"1.1\" viewBox=\"0 0 385.78125 277.314375\" width=\"385.78125pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n <metadata>\n <rdf:RDF xmlns:cc=\"http://creativecommons.org/ns#\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\n <cc:Work>\n <dc:type rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\"/>\n <dc:date>2020-12-31T19:28:13.377484</dc:date>\n <dc:format>image/svg+xml</dc:format>\n <dc:creator>\n <cc:Agent>\n <dc:title>Matplotlib v3.3.3, https://matplotlib.org/</dc:title>\n </cc:Agent>\n </dc:creator>\n </cc:Work>\n </rdf:RDF>\n </metadata>\n <defs>\n <style type=\"text/css\">*{stroke-linecap:butt;stroke-linejoin:round;}</style>\n </defs>\n <g id=\"figure_1\">\n <g id=\"patch_1\">\n <path d=\"M 0 277.314375 \nL 385.78125 277.314375 \nL 385.78125 0 \nL 0 0 \nz\n\" style=\"fill:none;\"/>\n </g>\n <g id=\"axes_1\">\n <g id=\"patch_2\">\n <path d=\"M 43.78125 239.758125 \nL 378.58125 239.758125 \nL 378.58125 22.318125 \nL 43.78125 22.318125 \nz\n\" style=\"fill:#ffffff;\"/>\n </g>\n <g id=\"matplotlib.axis_1\">\n <g id=\"xtick_1\">\n <g id=\"line2d_1\">\n <path clip-path=\"url(#p7f60f6186e)\" d=\"M 58.999432 239.758125 \nL 58.999432 22.318125 \n\" style=\"fill:none;stroke:#b0b0b0;stroke-dasharray:2.96,1.28;stroke-dashoffset:0;stroke-width:0.8;\"/>\n </g>\n <g id=\"line2d_2\">\n <defs>\n <path d=\"M 0 0 \nL 0 3.5 \n\" id=\"m8116200e9e\" style=\"stroke:#000000;stroke-width:0.8;\"/>\n </defs>\n <g>\n <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"58.999432\" xlink:href=\"#m8116200e9e\" y=\"239.758125\"/>\n </g>\n </g>\n <g id=\"text_1\">\n <!-- 4 -->\n <g transform=\"translate(51.628338 254.356562)scale(0.1 -0.1)\">\n <defs>\n <path d=\"M 10.59375 35.5 \nL 73.1875 35.5 \nL 73.1875 27.203125 \nL 10.59375 27.203125 \nz\n\" id=\"DejaVuSans-8722\"/>\n <path d=\"M 37.796875 64.3125 \nL 12.890625 25.390625 \nL 37.796875 25.390625 \nz\nM 35.203125 72.90625 \nL 47.609375 72.90625 \nL 47.609375 25.390625 \nL 58.015625 25.390625 \nL 58.015625 17.1875 \nL 47.609375 17.1875 \nL 47.609375 0 \nL 37.796875 0 \nL 37.796875 17.1875 \nL 4.890625 17.1875 \nL 4.890625 26.703125 \nz\n\" id=\"DejaVuSans-52\"/>\n </defs>\n <use xlink:href=\"#DejaVuSans-8722\"/>\n <use x=\"83.789062\" xlink:href=\"#DejaVuSans-52\"/>\n </g>\n </g>\n </g>\n <g id=\"xtick_2\">\n <g id=\"line2d_3\">\n <path clip-path=\"url(#p7f60f6186e)\" d=\"M 109.726705 239.758125 \nL 109.726705 22.318125 \n\" style=\"fill:none;stroke:#b0b0b0;stroke-dasharray:2.96,1.28;stroke-dashoffset:0;stroke-width:0.8;\"/>\n </g>\n <g id=\"line2d_4\">\n <g>\n <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"109.726705\" xlink:href=\"#m8116200e9e\" y=\"239.758125\"/>\n </g>\n </g>\n <g id=\"text_2\">\n <!-- 2 -->\n <g transform=\"translate(102.355611 254.356562)scale(0.1 -0.1)\">\n <defs>\n <path d=\"M 19.1875 8.296875 \nL 53.609375 8.296875 \nL 53.609375 0 \nL 7.328125 0 \nL 7.328125 8.296875 \nQ 12.9375 14.109375 22.625 23.890625 \nQ 32.328125 33.6875 34.8125 36.53125 \nQ 39.546875 41.84375 41.421875 45.53125 \nQ 43.3125 49.21875 43.3125 52.78125 \nQ 43.3125 58.59375 39.234375 62.25 \nQ 35.15625 65.921875 28.609375 65.921875 \nQ 23.96875 65.921875 18.8125 64.3125 \nQ 13.671875 62.703125 7.8125 59.421875 \nL 7.8125 69.390625 \nQ 13.765625 71.78125 18.9375 73 \nQ 24.125 74.21875 28.421875 74.21875 \nQ 39.75 74.21875 46.484375 68.546875 \nQ 53.21875 62.890625 53.21875 53.421875 \nQ 53.21875 48.921875 51.53125 44.890625 \nQ 49.859375 40.875 45.40625 35.40625 \nQ 44.
"image/png": "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
},
"metadata": {
"needs_background": "light"
}
}
],
"source": [
"model = MarkovModel(states=[state1, state2], observations=observations, state_transitions=state_transition).populate()\n",
"\n",
"new_mean = model.reestimated_mean()\n",
"new_var = model.reestimated_variance()\n",
"new_std_dev = [sqrt(x) for x in new_var]\n",
"\n",
"#######################################\n",
"# Original\n",
"#######################################\n",
"state_1_y = [gaussian(i, state1.mean, state1.std_dev) for i in x]\n",
"state_2_y = [gaussian(i, state2.mean, state2.std_dev) for i in x]\n",
"plt.plot(x, state_1_y, '--', c='r', label=\"State 1\", linewidth=1.0)\n",
"plt.plot(x, state_2_y, '--', c='b', label=\"State 2\", linewidth=1.0)\n",
"\n",
"#######################################\n",
"# Re-Estimated\n",
"#######################################\n",
"state_1_new_y = [gaussian(i, new_mean[0], new_std_dev[0]) for i in x]\n",
"state_2_new_y = [gaussian(i, new_mean[1], new_std_dev[1]) for i in x]\n",
"plt.plot(x, state_1_new_y, c='r', label=\"New State 1\")\n",
"plt.plot(x, state_2_new_y, c='b', label=\"New State 2\")\n",
"\n",
"plt.legend()\n",
"plt.title(\"Re-estimated Probability Density Functions\")\n",
"\n",
"plt.xlabel(x_label)\n",
"plt.ylabel(y_label)\n",
"plt.grid(linestyle=\"--\")\n",
"\n",
"plt.show()"
]
},
{
"source": [
"# Multiple Iterations"
],
"cell_type": "markdown",
"metadata": {}
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"mean (0): [1.6747846620246418, 4.089148442531048]\nvar (0): [1.8465047320872243, 0.37804421554121403]\n\nmean (1): [1.9929120009112011, 4.056666511439969]\nvar (1): [2.1156649116379684, 0.2918412170796056]\n\nmean (2): [2.1821733376587726, 3.9904324818569052]\nvar (2): [2.3495798563848562, 0.23463095910597057]\n\nmean (3): [2.2693898497202887, 3.9240609125392]\nvar (3): [2.461617864622651, 0.17784017241318095]\n\nmean (4): [2.301476335144215, 3.8740199830675355]\nvar (4): [2.53136226603993, 0.13079227312275157]\n\n"
]
},
{
"output_type": "display_data",
"data": {
"text/plain": "<Figure size 432x288 with 1 Axes>",
"image/svg+xml": "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n<!-- Created with matplotlib (https://matplotlib.org/) -->\n<svg height=\"277.314375pt\" version=\"1.1\" viewBox=\"0 0 385.78125 277.314375\" width=\"385.78125pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n <metadata>\n <rdf:RDF xmlns:cc=\"http://creativecommons.org/ns#\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\n <cc:Work>\n <dc:type rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\"/>\n <dc:date>2020-12-31T19:28:13.795456</dc:date>\n <dc:format>image/svg+xml</dc:format>\n <dc:creator>\n <cc:Agent>\n <dc:title>Matplotlib v3.3.3, https://matplotlib.org/</dc:title>\n </cc:Agent>\n </dc:creator>\n </cc:Work>\n </rdf:RDF>\n </metadata>\n <defs>\n <style type=\"text/css\">*{stroke-linecap:butt;stroke-linejoin:round;}</style>\n </defs>\n <g id=\"figure_1\">\n <g id=\"patch_1\">\n <path d=\"M 0 277.314375 \nL 385.78125 277.314375 \nL 385.78125 0 \nL 0 0 \nz\n\" style=\"fill:none;\"/>\n </g>\n <g id=\"axes_1\">\n <g id=\"patch_2\">\n <path d=\"M 43.78125 239.758125 \nL 378.58125 239.758125 \nL 378.58125 22.318125 \nL 43.78125 22.318125 \nz\n\" style=\"fill:#ffffff;\"/>\n </g>\n <g id=\"matplotlib.axis_1\">\n <g id=\"xtick_1\">\n <g id=\"line2d_1\">\n <path clip-path=\"url(#pb29c47a8b5)\" d=\"M 58.999432 239.758125 \nL 58.999432 22.318125 \n\" style=\"fill:none;stroke:#b0b0b0;stroke-dasharray:2.96,1.28;stroke-dashoffset:0;stroke-width:0.8;\"/>\n </g>\n <g id=\"line2d_2\">\n <defs>\n <path d=\"M 0 0 \nL 0 3.5 \n\" id=\"m0d247bd06a\" style=\"stroke:#000000;stroke-width:0.8;\"/>\n </defs>\n <g>\n <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"58.999432\" xlink:href=\"#m0d247bd06a\" y=\"239.758125\"/>\n </g>\n </g>\n <g id=\"text_1\">\n <!-- 4 -->\n <g transform=\"translate(51.628338 254.356562)scale(0.1 -0.1)\">\n <defs>\n <path d=\"M 10.59375 35.5 \nL 73.1875 35.5 \nL 73.1875 27.203125 \nL 10.59375 27.203125 \nz\n\" id=\"DejaVuSans-8722\"/>\n <path d=\"M 37.796875 64.3125 \nL 12.890625 25.390625 \nL 37.796875 25.390625 \nz\nM 35.203125 72.90625 \nL 47.609375 72.90625 \nL 47.609375 25.390625 \nL 58.015625 25.390625 \nL 58.015625 17.1875 \nL 47.609375 17.1875 \nL 47.609375 0 \nL 37.796875 0 \nL 37.796875 17.1875 \nL 4.890625 17.1875 \nL 4.890625 26.703125 \nz\n\" id=\"DejaVuSans-52\"/>\n </defs>\n <use xlink:href=\"#DejaVuSans-8722\"/>\n <use x=\"83.789062\" xlink:href=\"#DejaVuSans-52\"/>\n </g>\n </g>\n </g>\n <g id=\"xtick_2\">\n <g id=\"line2d_3\">\n <path clip-path=\"url(#pb29c47a8b5)\" d=\"M 109.726705 239.758125 \nL 109.726705 22.318125 \n\" style=\"fill:none;stroke:#b0b0b0;stroke-dasharray:2.96,1.28;stroke-dashoffset:0;stroke-width:0.8;\"/>\n </g>\n <g id=\"line2d_4\">\n <g>\n <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"109.726705\" xlink:href=\"#m0d247bd06a\" y=\"239.758125\"/>\n </g>\n </g>\n <g id=\"text_2\">\n <!-- 2 -->\n <g transform=\"translate(102.355611 254.356562)scale(0.1 -0.1)\">\n <defs>\n <path d=\"M 19.1875 8.296875 \nL 53.609375 8.296875 \nL 53.609375 0 \nL 7.328125 0 \nL 7.328125 8.296875 \nQ 12.9375 14.109375 22.625 23.890625 \nQ 32.328125 33.6875 34.8125 36.53125 \nQ 39.546875 41.84375 41.421875 45.53125 \nQ 43.3125 49.21875 43.3125 52.78125 \nQ 43.3125 58.59375 39.234375 62.25 \nQ 35.15625 65.921875 28.609375 65.921875 \nQ 23.96875 65.921875 18.8125 64.3125 \nQ 13.671875 62.703125 7.8125 59.421875 \nL 7.8125 69.390625 \nQ 13.765625 71.78125 18.9375 73 \nQ 24.125 74.21875 28.421875 74.21875 \nQ 39.75 74.21875 46.484375 68.546875 \nQ 53.21875 62.890625 53.21875 53.421875 \nQ 53.21875 48.921875 51.53125 44.890625 \nQ 49.859375 40.875 45.40625 35.40625 \nQ 44.
"image/png": "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
},
"metadata": {
"needs_background": "light"
}
}
],
"source": [
"iterations = 5\n",
"\n",
"mean = [state1.mean, state2.mean]\n",
"var = [state1.variance, state2.variance]\n",
"\n",
"plt.plot(x, [gaussian(i, mean[0], sqrt(var[0])) for i in x], '--', c='r', linewidth=1.0)\n",
"plt.plot(x, [gaussian(i, mean[1], sqrt(var[1])) for i in x], '--', c='b', linewidth=1.0)\n",
"\n",
"for i in range(iterations):\n",
" model = MarkovModel(states=[State(mean[0], var[0], state1.entry, state1.exit), State(mean[1], var[1], state2.entry, state2.exit)], \n",
" observations=observations, \n",
" state_transitions=state_transition)\n",
" model.populate()\n",
"\n",
" mean = model.reestimated_mean()\n",
" var = model.reestimated_variance()\n",
"\n",
" print(f\"mean ({i}): \", mean)\n",
" print(f\"var ({i}): \", var)\n",
" print()\n",
"\n",
" state_1_y = [gaussian(i, mean[0], sqrt(var[0])) for i in x]\n",
" state_2_y = [gaussian(i, mean[1], sqrt(var[1])) for i in x]\n",
"\n",
" style = '--'\n",
" linewidth = 1.0\n",
" if i == iterations - 1:\n",
" style = '-'\n",
" linewidth = 2.0\n",
"\n",
" plt.plot(x, state_1_y, style, c='r', linewidth=linewidth)\n",
" plt.plot(x, state_2_y, style, c='b', linewidth=linewidth)\n",
"\n",
"plt.title(\"Probability Density Function Iterations\")\n",
"\n",
"plt.xlabel(x_label)\n",
"plt.ylabel(y_label)\n",
"plt.grid(linestyle=\"--\")\n",
"\n",
"plt.show()\n"
]
},
{
"source": [
"# Baum-Welch State Transition Re-estimations"
],
"cell_type": "markdown",
"metadata": {}
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"[[0.92 0.06]\n [0.04 0.93]]\n"
]
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array([[0.8035064 , 0.18507025],\n",
" [0.26043109, 0.49589971]])"
]
},
"metadata": {},
"execution_count": 13
}
],
"source": [
"model = MarkovModel(states=[state1, state2], observations=observations, state_transitions=state_transition).populate()\n",
"\n",
"print(a_matrix)\n",
"model.reestimated_state_transitions()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
2020-12-11 21:33:20 +00:00
}
]
}