120 lines
4.4 KiB
Markdown
120 lines
4.4 KiB
Markdown
|
Install required dependencies for matplotlib GUI frontend and all pip other packages for this project
|
||
|
|
||
|
```bash
|
||
|
sudo apt install python3-tk
|
||
|
python3.9 -m pip install -r requirements.txt
|
||
|
```
|
||
|
|
||
|
CLI tool to determine most probably path of Hidden Markov Model given an observation sequence of emissions.
|
||
|
|
||
|
Given an observation sequence of emissions, find the most probable path of traversal for a Hidden Markov Model.
|
||
|
Since this is just an example of HMM, a graph can be automatically generated by specifying only the node count.
|
||
|
Edges and weights connecting the nodes will be randomly assigned.
|
||
|
If required, an input graph can be provided through the JSON configuration option.
|
||
|
See provided examples of JSON input files for more detail on options available.
|
||
|
|
||
|
```bash
|
||
|
python3.9 markov-model.py -h
|
||
|
|
||
|
|
||
|
usage: markov-model.py [-h] [--nodes [GRAPH_NODE_COUNT]] [--edges [GRAPH_EDGE_COUNT]] [--show-all] [--interactive] [--silent]
|
||
|
[--file [FILE_PATH]]
|
||
|
[OBSERVATION_SEQUENCE ...]
|
||
|
|
||
|
Calculates most probable path of HMM given an observation sequence
|
||
|
|
||
|
positional arguments:
|
||
|
OBSERVATION_SEQUENCE An observation sequence to calculate the most probable path
|
||
|
(default: '['A', 'B', 'D', 'C']')
|
||
|
|
||
|
|
||
|
optional arguments:
|
||
|
-h, --help show this help message and exit
|
||
|
--nodes [GRAPH_NODE_COUNT], -n [GRAPH_NODE_COUNT]
|
||
|
The total number of node states in the HMM graph
|
||
|
(default: '4')
|
||
|
|
||
|
--edges [GRAPH_EDGE_COUNT], -e [GRAPH_EDGE_COUNT]
|
||
|
The total number of edges in the HMM graph
|
||
|
(default: '8')
|
||
|
|
||
|
--show-all When this flag is set, all path probabilities and their calculations will be output
|
||
|
(default: 'False')
|
||
|
|
||
|
--interactive Allow taking input to update matrices with triple (row, col, value)
|
||
|
(default: 'False')
|
||
|
|
||
|
--silent When this flag is set, final graph will not be shown
|
||
|
(default: 'False')
|
||
|
|
||
|
--file [FILE_PATH], -f [FILE_PATH]
|
||
|
Optionally provide file for data to be read from. Each point must be on it's own line with format x,y
|
||
|
```
|
||
|
|
||
|
Running HMM with a graph using 4 nodes, 8 edges, and random transition / emission matrices
|
||
|
Sometimes there can be a sequence with no possible path due to a constrained transition matrix
|
||
|
Sometimes there can be a sequence with no possible path due to a limited emission matrix
|
||
|
|
||
|
```bash
|
||
|
python3.9 markov-model.py --nodes 4 --edges 8 --show-all A B D C G --silent
|
||
|
|
||
|
|
||
|
1->3: 0.89
|
||
|
1->0: 0.6
|
||
|
3->3: 0.81
|
||
|
3->1: 0.29
|
||
|
0->2: 0.67
|
||
|
0->1: 0.89
|
||
|
2->0: 0.12
|
||
|
2->1: 0.41
|
||
|
Calculating (0, 2, 1, 0, 2): (0.98 * 0.67) * (0.74 * 0.41) * (0.22 * 0.60) * (0.22 * 0.67) * 0.36 = 0.001395
|
||
|
Calculating (0, 2, 1, 3, 3): (0.98 * 0.67) * (0.74 * 0.41) * (0.22 * 0.89) * (0.11 * 0.81) * 0.52 = 0.001807
|
||
|
Finding most probable path for given observation sequence: ['A', 'B', 'D', 'C', 'G']
|
||
|
Total nodes in graph: 4
|
||
|
Total edges in graph: 8
|
||
|
Number of sequences: 5
|
||
|
Interactive mode: False
|
||
|
Emitting nodes: {'A': [0, 2], 'B': [1, 2], 'C': [0, 2, 3], 'D': [1, 2], 'G': [0, 2, 3]}
|
||
|
Transition matrix:
|
||
|
[[0. 0.89 0.67 0. ]
|
||
|
[0.6 0. 0. 0.89]
|
||
|
[0.12 0.41 0. 0. ]
|
||
|
[0. 0.29 0. 0.81]]
|
||
|
Emission matrix:
|
||
|
[[ 0.98 0. 0.22 0. 0.11]
|
||
|
[ 0. 0.1 -0. 0.22 0. ]
|
||
|
[ 0.67 0.74 0.46 0.62 0.36]
|
||
|
[-0. 0. 0.11 0. 0.52]]
|
||
|
Final paths sorted by probability:
|
||
|
(0, 2, 1, 3, 3) has probability: 0.001807
|
||
|
(0, 2, 1, 0, 2) has probability: 0.001395
|
||
|
```
|
||
|
|
||
|
By default, a random Hidden Markov Model and visualization will be generated
|
||
|
|
||
|
```bash
|
||
|
python3.9 markov-model.py
|
||
|
|
||
|
|
||
|
Finding most probable path for given observation sequence: ['A', 'B', 'D', 'C']
|
||
|
Total nodes in graph: 4
|
||
|
Total edges in graph: 8
|
||
|
Number of sequences: 4
|
||
|
Interactive mode: False
|
||
|
Emitting nodes: {'A': [0, 2, 3], 'B': [1, 2, 3], 'C': [0, 3], 'D': [1, 2]}
|
||
|
Transition matrix:
|
||
|
[[0. 0. 0.31 0. ]
|
||
|
[0.55 0.25 0. 0. ]
|
||
|
[0.79 0.47 0. 0.12]
|
||
|
[0.92 0. 0.81 0. ]]
|
||
|
Emission matrix:
|
||
|
[[0.45 0. 0.4 0. ]
|
||
|
[0. 0.89 0. 0.51]
|
||
|
[0.12 0.24 0. 0.78]
|
||
|
[0.08 0.42 0.96 0. ]]
|
||
|
(0, 2, 1, 0) has the highest probability of 0.00176553432
|
||
|
```
|
||
|
|
||
|
![](screenshot.png)
|
||
|
|