markov-models/markov.ipynb

201 lines
153 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",
"version": "3.8.4-final"
},
"orig_nbformat": 2,
"kernelspec": {
"name": "python3",
"display_name": "Python 3",
"language": "python"
}
},
"nbformat": 4,
"nbformat_minor": 2,
"cells": [
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"\n",
"from constants import *\n",
"from maths import gaussian\n",
"from markov import MarkovModel"
]
},
{
"source": [
"State Probability Functions (1)\n",
"==================="
],
"cell_type": "markdown",
"metadata": {}
},
{
"cell_type": "code",
"execution_count": 3,
"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\"?>\r\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\r\n \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\r\n<!-- Created with matplotlib (https://matplotlib.org/) -->\r\n<svg height=\"263.63625pt\" version=\"1.1\" viewBox=\"0 0 385.78125 263.63625\" width=\"385.78125pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\r\n <metadata>\r\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#\">\r\n <cc:Work>\r\n <dc:type rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\"/>\r\n <dc:date>2020-12-11T21:18:42.713265</dc:date>\r\n <dc:format>image/svg+xml</dc:format>\r\n <dc:creator>\r\n <cc:Agent>\r\n <dc:title>Matplotlib v3.3.3, https://matplotlib.org/</dc:title>\r\n </cc:Agent>\r\n </dc:creator>\r\n </cc:Work>\r\n </rdf:RDF>\r\n </metadata>\r\n <defs>\r\n <style type=\"text/css\">*{stroke-linecap:butt;stroke-linejoin:round;}</style>\r\n </defs>\r\n <g id=\"figure_1\">\r\n <g id=\"patch_1\">\r\n <path d=\"M 0 263.63625 \r\nL 385.78125 263.63625 \r\nL 385.78125 0 \r\nL 0 0 \r\nz\r\n\" style=\"fill:none;\"/>\r\n </g>\r\n <g id=\"axes_1\">\r\n <g id=\"patch_2\">\r\n <path d=\"M 43.78125 239.758125 \r\nL 378.58125 239.758125 \r\nL 378.58125 22.318125 \r\nL 43.78125 22.318125 \r\nz\r\n\" style=\"fill:#ffffff;\"/>\r\n </g>\r\n <g id=\"matplotlib.axis_1\">\r\n <g id=\"xtick_1\">\r\n <g id=\"line2d_1\">\r\n <path clip-path=\"url(#pfdfeec0950)\" d=\"M 79.290341 239.758125 \r\nL 79.290341 22.318125 \r\n\" style=\"fill:none;stroke:#b0b0b0;stroke-dasharray:2.96,1.28;stroke-dashoffset:0;stroke-width:0.8;\"/>\r\n </g>\r\n <g id=\"line2d_2\">\r\n <defs>\r\n <path d=\"M 0 0 \r\nL 0 3.5 \r\n\" id=\"mad3d74403a\" style=\"stroke:#000000;stroke-width:0.8;\"/>\r\n </defs>\r\n <g>\r\n <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"79.290341\" xlink:href=\"#mad3d74403a\" y=\"239.758125\"/>\r\n </g>\r\n </g>\r\n <g id=\"text_1\">\r\n <!-- 4 -->\r\n <g transform=\"translate(71.919247 254.356563)scale(0.1 -0.1)\">\r\n <defs>\r\n <path d=\"M 10.59375 35.5 \r\nL 73.1875 35.5 \r\nL 73.1875 27.203125 \r\nL 10.59375 27.203125 \r\nz\r\n\" id=\"DejaVuSans-8722\"/>\r\n <path d=\"M 37.796875 64.3125 \r\nL 12.890625 25.390625 \r\nL 37.796875 25.390625 \r\nz\r\nM 35.203125 72.90625 \r\nL 47.609375 72.90625 \r\nL 47.609375 25.390625 \r\nL 58.015625 25.390625 \r\nL 58.015625 17.1875 \r\nL 47.609375 17.1875 \r\nL 47.609375 0 \r\nL 37.796875 0 \r\nL 37.796875 17.1875 \r\nL 4.890625 17.1875 \r\nL 4.890625 26.703125 \r\nz\r\n\" id=\"DejaVuSans-52\"/>\r\n </defs>\r\n <use xlink:href=\"#DejaVuSans-8722\"/>\r\n <use x=\"83.789062\" xlink:href=\"#DejaVuSans-52\"/>\r\n </g>\r\n </g>\r\n </g>\r\n <g id=\"xtick_2\">\r\n <g id=\"line2d_3\">\r\n <path clip-path=\"url(#pfdfeec0950)\" d=\"M 119.872159 239.758125 \r\nL 119.872159 22.318125 \r\n\" style=\"fill:none;stroke:#b0b0b0;stroke-dasharray:2.96,1.28;stroke-dashoffset:0;stroke-width:0.8;\"/>\r\n </g>\r\n <g id=\"line2d_4\">\r\n <g>\r\n <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"119.872159\" xlink:href=\"#mad3d74403a\" y=\"239.758125\"/>\r\n </g>\r\n </g>\r\n <g id=\"text_2\">\r\n <!-- 2 -->\r\n <g transform=\"translate(112.501065 254.356563)scale(0.1 -0.1)\">\r\n <defs>\r\n <path d=\"M 19.1875 8.296875 \r\nL 53.609375 8.296875 \r\nL 53.609375 0 \r\nL 7.328125 0 \r\nL 7.328125 8.296875 \r\nQ 12.9375 14.109375 22.625 23.890625 \r\nQ 32.328125 33.6875 34.8125 36.53125 \r\nQ 39.546875 41.84375 41.421875 45.53125 \r\nQ 43.3125 49.21875 43.3125 52.78125 \r\nQ 43.3125 58.59375 39.234375 62.25 \r\nQ 35.15625 65.921875 28.609375 65.921875 \r\nQ 23.96875 65.921875 18.8125 64.3125 \r\nQ 13.671875 62.703125 7.8125 59.421875 \r\nL 7.8125 69.390625 \r\nQ 13.7
"image/png": "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
},
"metadata": {
"needs_background": "light"
}
}
],
"source": [
"x = np.linspace(-5, 10, 120)\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",
"\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",
"plt.ylabel(\"Probability Density\")\n",
"plt.grid(linestyle=\"--\")\n",
"\n",
"plt.show()"
]
},
{
"source": [
"Output Probability Densities (2)\n",
"=========="
],
"cell_type": "markdown",
"metadata": {}
},
{
"cell_type": "code",
"execution_count": 8,
"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",
"execution_count": 5,
"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\"?>\r\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\r\n \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\r\n<!-- Created with matplotlib (https://matplotlib.org/) -->\r\n<svg height=\"263.63625pt\" version=\"1.1\" viewBox=\"0 0 385.78125 263.63625\" width=\"385.78125pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\r\n <metadata>\r\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#\">\r\n <cc:Work>\r\n <dc:type rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\"/>\r\n <dc:date>2020-12-11T21:18:43.366595</dc:date>\r\n <dc:format>image/svg+xml</dc:format>\r\n <dc:creator>\r\n <cc:Agent>\r\n <dc:title>Matplotlib v3.3.3, https://matplotlib.org/</dc:title>\r\n </cc:Agent>\r\n </dc:creator>\r\n </cc:Work>\r\n </rdf:RDF>\r\n </metadata>\r\n <defs>\r\n <style type=\"text/css\">*{stroke-linecap:butt;stroke-linejoin:round;}</style>\r\n </defs>\r\n <g id=\"figure_1\">\r\n <g id=\"patch_1\">\r\n <path d=\"M 0 263.63625 \r\nL 385.78125 263.63625 \r\nL 385.78125 0 \r\nL 0 0 \r\nz\r\n\" style=\"fill:none;\"/>\r\n </g>\r\n <g id=\"axes_1\">\r\n <g id=\"patch_2\">\r\n <path d=\"M 43.78125 239.758125 \r\nL 378.58125 239.758125 \r\nL 378.58125 22.318125 \r\nL 43.78125 22.318125 \r\nz\r\n\" style=\"fill:#ffffff;\"/>\r\n </g>\r\n <g id=\"PathCollection_1\">\r\n <defs>\r\n <path d=\"M -4.031129 4.031129 \r\nL 4.031129 -4.031129 \r\nM -4.031129 -4.031129 \r\nL 4.031129 4.031129 \r\n\" id=\"mcec0fbb187\" style=\"stroke:#800000;stroke-width:1.5;\"/>\r\n </defs>\r\n <g clip-path=\"url(#pe922c2b84d)\">\r\n <use style=\"fill:#800000;stroke:#800000;stroke-width:1.5;\" x=\"237.559432\" xlink:href=\"#mcec0fbb187\" y=\"222.275705\"/>\r\n <use style=\"fill:#800000;stroke:#800000;stroke-width:1.5;\" x=\"245.675795\" xlink:href=\"#mcec0fbb187\" y=\"226.572071\"/>\r\n <use style=\"fill:#800000;stroke:#800000;stroke-width:1.5;\" x=\"229.443068\" xlink:href=\"#mcec0fbb187\" y=\"214.228566\"/>\r\n <use style=\"fill:#800000;stroke:#800000;stroke-width:1.5;\" x=\"152.337614\" xlink:href=\"#mcec0fbb187\" y=\"171.337737\"/>\r\n <use style=\"fill:#800000;stroke:#800000;stroke-width:1.5;\" x=\"199.006705\" xlink:href=\"#mcec0fbb187\" y=\"142.608539\"/>\r\n <use style=\"fill:#800000;stroke:#800000;stroke-width:1.5;\" x=\"221.326705\" xlink:href=\"#mcec0fbb187\" y=\"201.047229\"/>\r\n <use style=\"fill:#800000;stroke:#800000;stroke-width:1.5;\" x=\"192.919432\" xlink:href=\"#mcec0fbb187\" y=\"127.850258\"/>\r\n <use style=\"fill:#800000;stroke:#800000;stroke-width:1.5;\" x=\"199.006705\" xlink:href=\"#mcec0fbb187\" y=\"142.608539\"/>\r\n <use style=\"fill:#800000;stroke:#800000;stroke-width:1.5;\" x=\"261.908523\" xlink:href=\"#mcec0fbb187\" y=\"229.427555\"/>\r\n </g>\r\n </g>\r\n <g id=\"PathCollection_2\">\r\n <defs>\r\n <path d=\"M -4.031129 4.031129 \r\nL 4.031129 -4.031129 \r\nM -4.031129 -4.031129 \r\nL 4.031129 4.031129 \r\n\" id=\"m7a866c9ad6\" style=\"stroke:#000080;stroke-width:1.5;\"/>\r\n </defs>\r\n <g clip-path=\"url(#pe922c2b84d)\">\r\n <use style=\"fill:#000080;stroke:#000080;stroke-width:1.5;\" x=\"237.559432\" xlink:href=\"#m7a866c9ad6\" y=\"39.614686\"/>\r\n <use style=\"fill:#000080;stroke:#000080;stroke-width:1.5;\" x=\"245.675795\" xlink:href=\"#m7a866c9ad6\" y=\"39.614686\"/>\r\n <use style=\"fill:#000080;stroke:#000080;stroke-width:1.5;\" x=\"229.443068\" xlink:href=\"#m7a866c9ad6\" y=\"92.616826\"/>\r\n <use style=\"fill:#000080;stroke:#000080;stroke-width:1.5;\" x=\"152.337614\" xlink:href=\"#m7a866c9ad6\" y=\"229.874488\"/>\r\n <use style=\"fill:#000080;stroke:#000080;stroke-width:1.5;\" x=\"199.006705\" xlink:href=\"#m7a866c9ad6\" y=\"227.672839\"/>\r\n <use style=\"fill:#000080;stroke:#000080;stroke-width:1.5;\" x=\"221.326705\" xlink:href=\"#m7a866c9ad6\" y=\"15
"image/png": "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
},
"metadata": {
"needs_background": "light"
}
}
],
"source": [
"x = np.linspace(-5, 10, 120)\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",
"\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",
"plt.ylabel(\"Probability Density\")\n",
"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()"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"[0.00961469 0.30638941]\n"
]
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array([[0.00961469, 1. , 1. , 1. , 1. ,\n",
" 1. , 1. , 1. , 1. ],\n",
" [0.30638941, 1. , 1. , 1. , 1. ,\n",
" 1. , 1. , 1. , 1. ]])"
]
},
"metadata": {},
"execution_count": 6
}
],
"source": [
"model = MarkovModel(states=[state1, state2], observations=observations, state_transitions=state_transition)\n",
"model.populate_forward()\n",
"\n",
"print(model.forward[:, 0])\n",
"\n",
"model.forward\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
]
}