{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: distrax in /opt/anaconda3/envs/spyder-dev/lib/python3.9/site-packages (0.0.1)\n", "Collecting distrax\n", " Downloading distrax-0.1.2-py3-none-any.whl (272 kB)\n", "\u001b[K |████████████████████████████████| 272 kB 6.9 MB/s eta 0:00:01\n", "\u001b[?25hRequirement already satisfied: jax>=0.1.55 in /opt/anaconda3/envs/spyder-dev/lib/python3.9/site-packages (from distrax) (0.2.11)\n", "Requirement already satisfied: absl-py>=0.9.0 in /opt/anaconda3/envs/spyder-dev/lib/python3.9/site-packages (from distrax) (0.12.0)\n", "Requirement already satisfied: chex>=0.0.7 in /opt/anaconda3/envs/spyder-dev/lib/python3.9/site-packages (from distrax) (0.0.8)\n", "Requirement already satisfied: jaxlib>=0.1.67 in /opt/anaconda3/envs/spyder-dev/lib/python3.9/site-packages (from distrax) (0.1.70)\n", "Requirement already satisfied: numpy>=1.18.0 in /opt/anaconda3/envs/spyder-dev/lib/python3.9/site-packages (from distrax) (1.19.5)\n", "Collecting tensorflow-probability>=0.15.0\n", " Using cached tensorflow_probability-0.16.0-py2.py3-none-any.whl (6.3 MB)\n", "Requirement already satisfied: six in /opt/anaconda3/envs/spyder-dev/lib/python3.9/site-packages (from absl-py>=0.9.0->distrax) (1.15.0)\n", "Requirement already satisfied: dm-tree>=0.1.5 in /opt/anaconda3/envs/spyder-dev/lib/python3.9/site-packages (from chex>=0.0.7->distrax) (0.1.6)\n", "Requirement already satisfied: toolz>=0.9.0 in /opt/anaconda3/envs/spyder-dev/lib/python3.9/site-packages (from chex>=0.0.7->distrax) (0.11.1)\n", "Requirement already satisfied: opt-einsum in /opt/anaconda3/envs/spyder-dev/lib/python3.9/site-packages (from jax>=0.1.55->distrax) (3.3.0)\n", "Requirement already satisfied: flatbuffers<3.0,>=1.12 in /opt/anaconda3/envs/spyder-dev/lib/python3.9/site-packages (from jaxlib>=0.1.67->distrax) (1.12)\n", "Requirement already satisfied: scipy in /opt/anaconda3/envs/spyder-dev/lib/python3.9/site-packages (from jaxlib>=0.1.67->distrax) (1.6.3)\n", "Requirement already satisfied: cloudpickle>=1.3 in /opt/anaconda3/envs/spyder-dev/lib/python3.9/site-packages (from tensorflow-probability>=0.15.0->distrax) (1.6.0)\n", "Requirement already satisfied: decorator in /opt/anaconda3/envs/spyder-dev/lib/python3.9/site-packages (from tensorflow-probability>=0.15.0->distrax) (4.4.2)\n", "Requirement already satisfied: gast>=0.3.2 in /opt/anaconda3/envs/spyder-dev/lib/python3.9/site-packages (from tensorflow-probability>=0.15.0->distrax) (0.4.0)\n", "Installing collected packages: tensorflow-probability, distrax\n", " Attempting uninstall: tensorflow-probability\n", " Found existing installation: tensorflow-probability 0.13.0\n", " Uninstalling tensorflow-probability-0.13.0:\n", " Successfully uninstalled tensorflow-probability-0.13.0\n", " Attempting uninstall: distrax\n", " Found existing installation: distrax 0.0.1\n", " Uninstalling distrax-0.0.1:\n", " Successfully uninstalled distrax-0.0.1\n", "\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", "jsl 0.0.0 requires dataclasses, which is not installed.\u001b[0m\n", "Successfully installed distrax-0.1.2 tensorflow-probability-0.16.0\n", "\u001b[33mWARNING: You are using pip version 21.2.4; however, version 22.0.4 is available.\n", "You should consider upgrading via the '/opt/anaconda3/envs/spyder-dev/bin/python -m pip install --upgrade pip' command.\u001b[0m\n", "Note: you may need to restart the kernel to use updated packages.\n" ] } ], "source": [ "# meta-data does not work yet in VScode\n", "# https://github.com/microsoft/vscode-jupyter/issues/1121\n", "\n", "{\n", " \"tags\": [\n", " \"hide-cell\"\n", " ]\n", "}\n", "\n", "\n", "### Install necessary libraries\n", "\n", "try:\n", " import jax\n", "except:\n", " # For cuda version, see https://github.com/google/jax#installation\n", " %pip install --upgrade \"jax[cpu]\" \n", " import jax\n", "\n", "try:\n", " import distrax\n", "except:\n", " %pip install --upgrade distrax\n", " import distrax\n", "\n", "try:\n", " import jsl\n", "except:\n", " %pip install git+https://github.com/probml/jsl\n", " import jsl\n", "\n", "try:\n", " import rich\n", "except:\n", " %pip install rich\n", " import rich\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "{\n", " \"tags\": [\n", " \"hide-cell\"\n", " ]\n", "}\n", "\n", "\n", "### Import standard libraries\n", "\n", "import abc\n", "from dataclasses import dataclass\n", "import functools\n", "import itertools\n", "\n", "from typing import Any, Callable, NamedTuple, Optional, Union, Tuple\n", "\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "\n", "\n", "import jax\n", "import jax.numpy as jnp\n", "from jax import lax, vmap, jit, grad\n", "from jax.scipy.special import logit\n", "from jax.nn import softmax\n", "from functools import partial\n", "from jax.random import PRNGKey, split\n", "\n", "import inspect\n", "import inspect as py_inspect\n", "import rich\n", "from rich import inspect as r_inspect\n", "from rich import print as r_print\n", "\n", "def print_source(fname):\n", " r_print(py_inspect.getsource(fname))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```{math}\n", "\n", "\\newcommand\\floor[1]{\\lfloor#1\\rfloor}\n", "\n", "\\newcommand{\\real}{\\mathbb{R}}\n", "\n", "% Numbers\n", "\\newcommand{\\vzero}{\\boldsymbol{0}}\n", "\\newcommand{\\vone}{\\boldsymbol{1}}\n", "\n", "% Greek https://www.latex-tutorial.com/symbols/greek-alphabet/\n", "\\newcommand{\\valpha}{\\boldsymbol{\\alpha}}\n", "\\newcommand{\\vbeta}{\\boldsymbol{\\beta}}\n", "\\newcommand{\\vchi}{\\boldsymbol{\\chi}}\n", "\\newcommand{\\vdelta}{\\boldsymbol{\\delta}}\n", "\\newcommand{\\vDelta}{\\boldsymbol{\\Delta}}\n", "\\newcommand{\\vepsilon}{\\boldsymbol{\\epsilon}}\n", "\\newcommand{\\vzeta}{\\boldsymbol{\\zeta}}\n", "\\newcommand{\\vXi}{\\boldsymbol{\\Xi}}\n", "\\newcommand{\\vell}{\\boldsymbol{\\ell}}\n", "\\newcommand{\\veta}{\\boldsymbol{\\eta}}\n", "%\\newcommand{\\vEta}{\\boldsymbol{\\Eta}}\n", "\\newcommand{\\vgamma}{\\boldsymbol{\\gamma}}\n", "\\newcommand{\\vGamma}{\\boldsymbol{\\Gamma}}\n", "\\newcommand{\\vmu}{\\boldsymbol{\\mu}}\n", "\\newcommand{\\vmut}{\\boldsymbol{\\tilde{\\mu}}}\n", "\\newcommand{\\vnu}{\\boldsymbol{\\nu}}\n", "\\newcommand{\\vkappa}{\\boldsymbol{\\kappa}}\n", "\\newcommand{\\vlambda}{\\boldsymbol{\\lambda}}\n", "\\newcommand{\\vLambda}{\\boldsymbol{\\Lambda}}\n", "\\newcommand{\\vLambdaBar}{\\overline{\\vLambda}}\n", "%\\newcommand{\\vnu}{\\boldsymbol{\\nu}}\n", "\\newcommand{\\vomega}{\\boldsymbol{\\omega}}\n", "\\newcommand{\\vOmega}{\\boldsymbol{\\Omega}}\n", "\\newcommand{\\vphi}{\\boldsymbol{\\phi}}\n", "\\newcommand{\\vvarphi}{\\boldsymbol{\\varphi}}\n", "\\newcommand{\\vPhi}{\\boldsymbol{\\Phi}}\n", "\\newcommand{\\vpi}{\\boldsymbol{\\pi}}\n", "\\newcommand{\\vPi}{\\boldsymbol{\\Pi}}\n", "\\newcommand{\\vpsi}{\\boldsymbol{\\psi}}\n", "\\newcommand{\\vPsi}{\\boldsymbol{\\Psi}}\n", "\\newcommand{\\vrho}{\\boldsymbol{\\rho}}\n", "\\newcommand{\\vtheta}{\\boldsymbol{\\theta}}\n", "\\newcommand{\\vthetat}{\\boldsymbol{\\tilde{\\theta}}}\n", "\\newcommand{\\vTheta}{\\boldsymbol{\\Theta}}\n", "\\newcommand{\\vsigma}{\\boldsymbol{\\sigma}}\n", "\\newcommand{\\vSigma}{\\boldsymbol{\\Sigma}}\n", "\\newcommand{\\vSigmat}{\\boldsymbol{\\tilde{\\Sigma}}}\n", "\\newcommand{\\vsigmoid}{\\vsigma}\n", "\\newcommand{\\vtau}{\\boldsymbol{\\tau}}\n", "\\newcommand{\\vxi}{\\boldsymbol{\\xi}}\n", "\n", "\n", "% Lower Roman (Vectors)\n", "\\newcommand{\\va}{\\mathbf{a}}\n", "\\newcommand{\\vb}{\\mathbf{b}}\n", "\\newcommand{\\vBt}{\\mathbf{\\tilde{B}}}\n", "\\newcommand{\\vc}{\\mathbf{c}}\n", "\\newcommand{\\vct}{\\mathbf{\\tilde{c}}}\n", "\\newcommand{\\vd}{\\mathbf{d}}\n", "\\newcommand{\\ve}{\\mathbf{e}}\n", "\\newcommand{\\vf}{\\mathbf{f}}\n", "\\newcommand{\\vg}{\\mathbf{g}}\n", "\\newcommand{\\vh}{\\mathbf{h}}\n", "%\\newcommand{\\myvh}{\\mathbf{h}}\n", "\\newcommand{\\vi}{\\mathbf{i}}\n", "\\newcommand{\\vj}{\\mathbf{j}}\n", "\\newcommand{\\vk}{\\mathbf{k}}\n", "\\newcommand{\\vl}{\\mathbf{l}}\n", "\\newcommand{\\vm}{\\mathbf{m}}\n", "\\newcommand{\\vn}{\\mathbf{n}}\n", "\\newcommand{\\vo}{\\mathbf{o}}\n", "\\newcommand{\\vp}{\\mathbf{p}}\n", "\\newcommand{\\vq}{\\mathbf{q}}\n", "\\newcommand{\\vr}{\\mathbf{r}}\n", "\\newcommand{\\vs}{\\mathbf{s}}\n", "\\newcommand{\\vt}{\\mathbf{t}}\n", "\\newcommand{\\vu}{\\mathbf{u}}\n", "\\newcommand{\\vv}{\\mathbf{v}}\n", "\\newcommand{\\vw}{\\mathbf{w}}\n", "\\newcommand{\\vws}{\\vw_s}\n", "\\newcommand{\\vwt}{\\mathbf{\\tilde{w}}}\n", "\\newcommand{\\vWt}{\\mathbf{\\tilde{W}}}\n", "\\newcommand{\\vwh}{\\hat{\\vw}}\n", "\\newcommand{\\vx}{\\mathbf{x}}\n", "%\\newcommand{\\vx}{\\mathbf{x}}\n", "\\newcommand{\\vxt}{\\mathbf{\\tilde{x}}}\n", "\\newcommand{\\vy}{\\mathbf{y}}\n", "\\newcommand{\\vyt}{\\mathbf{\\tilde{y}}}\n", "\\newcommand{\\vz}{\\mathbf{z}}\n", "%\\newcommand{\\vzt}{\\mathbf{\\tilde{z}}}\n", "\n", "\n", "% Upper Roman (Matrices)\n", "\\newcommand{\\vA}{\\mathbf{A}}\n", "\\newcommand{\\vB}{\\mathbf{B}}\n", "\\newcommand{\\vC}{\\mathbf{C}}\n", "\\newcommand{\\vD}{\\mathbf{D}}\n", "\\newcommand{\\vE}{\\mathbf{E}}\n", "\\newcommand{\\vF}{\\mathbf{F}}\n", "\\newcommand{\\vG}{\\mathbf{G}}\n", "\\newcommand{\\vH}{\\mathbf{H}}\n", "\\newcommand{\\vI}{\\mathbf{I}}\n", "\\newcommand{\\vJ}{\\mathbf{J}}\n", "\\newcommand{\\vK}{\\mathbf{K}}\n", "\\newcommand{\\vL}{\\mathbf{L}}\n", "\\newcommand{\\vM}{\\mathbf{M}}\n", "\\newcommand{\\vMt}{\\mathbf{\\tilde{M}}}\n", "\\newcommand{\\vN}{\\mathbf{N}}\n", "\\newcommand{\\vO}{\\mathbf{O}}\n", "\\newcommand{\\vP}{\\mathbf{P}}\n", "\\newcommand{\\vQ}{\\mathbf{Q}}\n", "\\newcommand{\\vR}{\\mathbf{R}}\n", "\\newcommand{\\vS}{\\mathbf{S}}\n", "\\newcommand{\\vT}{\\mathbf{T}}\n", "\\newcommand{\\vU}{\\mathbf{U}}\n", "\\newcommand{\\vV}{\\mathbf{V}}\n", "\\newcommand{\\vW}{\\mathbf{W}}\n", "\\newcommand{\\vX}{\\mathbf{X}}\n", "%\\newcommand{\\vXs}{\\vX_{\\vs}}\n", "\\newcommand{\\vXs}{\\vX_{s}}\n", "\\newcommand{\\vXt}{\\mathbf{\\tilde{X}}}\n", "\\newcommand{\\vY}{\\mathbf{Y}}\n", "\\newcommand{\\vZ}{\\mathbf{Z}}\n", "\\newcommand{\\vZt}{\\mathbf{\\tilde{Z}}}\n", "\\newcommand{\\vzt}{\\mathbf{\\tilde{z}}}\n", "\n", "\n", "%%%%\n", "\\newcommand{\\hidden}{\\vz}\n", "\\newcommand{\\hid}{\\hidden}\n", "\\newcommand{\\observed}{\\vy}\n", "\\newcommand{\\obs}{\\observed}\n", "\\newcommand{\\inputs}{\\vu}\n", "\\newcommand{\\input}{\\inputs}\n", "\n", "\\newcommand{\\hmmTrans}{\\vA}\n", "\\newcommand{\\hmmObs}{\\vB}\n", "\\newcommand{\\hmmInit}{\\vpi}\n", "\\newcommand{\\hmmhid}{\\hidden}\n", "\\newcommand{\\hmmobs}{\\obs}\n", "\n", "\\newcommand{\\ldsDyn}{\\vA}\n", "\\newcommand{\\ldsObs}{\\vC}\n", "\\newcommand{\\ldsDynIn}{\\vB}\n", "\\newcommand{\\ldsObsIn}{\\vD}\n", "\\newcommand{\\ldsDynNoise}{\\vQ}\n", "\\newcommand{\\ldsObsNoise}{\\vR}\n", "\n", "\\newcommand{\\ssmDyn}{f}\n", "\\newcommand{\\ssmObs}{h}\n", "```\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(sec:ssm-intro)=\n", "# What are State Space Models?\n", "\n", "\n", "A state space model or SSM\n", "is a partially observed Markov model,\n", "in which the hidden state, $\\hidden_t$,\n", "evolves over time according to a Markov process,\n", "possibly conditional on external inputs or controls $\\input_t$,\n", "and each hidden state generates some\n", "observations $\\obs_t$ at each time step.\n", "(In this book, we mostly focus on discrete time systems,\n", "although we consider the continuous-time case in XXX.)\n", "We get to see the observations, but not the hidden state.\n", "Our main goal is to infer the hidden state given the observations.\n", "However, we can also use the model to predict future observations,\n", "by first predicting future hidden states, and then predicting\n", "what observations they might generate.\n", "By using a hidden state $\\hidden_t$\n", "to represent the past observations, $\\obs_{1:t-1}$,\n", "the model can have ``infinite'' memory,\n", "unlike a standard Markov model.\n", "\n", "Formally we can define an SSM \n", "as the following joint distribution:\n", "```{math}\n", ":label: SSMfull\n", "p(\\hmmobs_{1:T},\\hmmhid_{1:T}|\\inputs_{1:T})\n", " = \\left[ p(\\hmmhid_1|\\inputs_1) \\prod_{t=2}^{T}\n", " p(\\hmmhid_t|\\hmmhid_{t-1},\\inputs_t) \\right]\n", " \\left[ \\prod_{t=1}^T p(\\hmmobs_t|\\hmmhid_t, \\inputs_t, \\hmmobs_{t-1}) \\right]\n", "```\n", "where $p(\\hmmhid_t|\\hmmhid_{t-1},\\inputs_t)$ is the\n", "transition model,\n", "$p(\\hmmobs_t|\\hmmhid_t, \\inputs_t, \\hmmobs_{t-1})$ is the\n", "observation model,\n", "and $\\inputs_{t}$ is an optional input or action.\n", "See {numref}`Figure %s ` \n", "for an illustration of the corresponding graphical model.\n", "\n", "\n", "```{figure} /figures/SSM-AR-inputs.png\n", ":scale: 100%\n", ":name: ssm-ar\n", "\n", "Illustration of an SSM as a graphical model.\n", "```\n", "\n", "We often consider a simpler setting in which there\n", "are no external inputs,\n", "and the observations are conditionally independent of each other\n", "(rather than having Markovian dependencies) given the hidden state.\n", "In this case the joint simplifies to \n", "```{math}\n", ":label: SSMsimplified\n", "p(\\hmmobs_{1:T},\\hmmhid_{1:T})\n", " = \\left[ p(\\hmmhid_1) \\prod_{t=2}^{T}\n", " p(\\hmmhid_t|\\hmmhid_{t-1}) \\right]\n", " \\left[ \\prod_{t=1}^T p(\\hmmobs_t|\\hmmhid_t \\right]\n", "```\n", "See {numref}`Figure %s ` \n", "for an illustration of the corresponding graphical model.\n", "Compare {eq}`SSMfull` and {eq}`SSMsimplified`.\n", "\n", "\n", "```{figure} /figures/SSM-simplified.png\n", ":scale: 100%\n", ":name: ssm-simplified\n", "\n", "Illustration of a simplified SSM.\n", "```\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(sec:hmm-intro)=\n", "# Hidden Markov Models\n", "\n", "In this section, we discuss the\n", "hidden Markov model or HMM,\n", "which is a state space model in which the hidden states\n", "are discrete, so $\\hmmhid_t \\in \\{1,\\ldots, K\\}$.\n", "The observations may be discrete,\n", "$\\hmmobs_t \\in \\{1,\\ldots, C\\}$,\n", "or continuous,\n", "$\\hmmobs_t \\in \\real^D$,\n", "or some combination,\n", "as we illustrate below.\n", "More details can be found in e.g., \n", "{cite}`Rabiner89,Fraser08,Cappe05`.\n", "For an interactive introduction,\n", "see https://nipunbatra.github.io/hmm/." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(sec:casino)=\n", "### Example: Casino HMM\n", "\n", "To illustrate HMMs with categorical observation model,\n", "we consider the \"Ocassionally dishonest casino\" model from {cite}`Durbin98`.\n", "There are 2 hidden states, representing whether the dice being used in the casino is fair or loaded.\n", "Each state defines a distribution over the 6 possible observations.\n", "\n", "The transition model is denoted by\n", "```{math}\n", "p(z_t=j|z_{t-1}=i) = \\hmmTrans_{ij}\n", "```\n", "Here the $i$'th row of $\\vA$ corresponds to the outgoing distribution from state $i$.\n", "This is a row stochastic matrix,\n", "meaning each row sums to one.\n", "We can visualize\n", "the non-zero entries in the transition matrix by creating a state transition diagram,\n", "as shown in \n", "{numref}`Figure %s `\n", "%{ref}`casino-fig`.\n", "\n", "```{figure} /figures/casino.png\n", ":scale: 50%\n", ":name: casino-fig\n", "\n", "Illustration of the casino HMM.\n", "```\n", "\n", "The observation model\n", "$p(\\obs_t|\\hidden_t=j)$ has the form\n", "```{math}\n", "p(\\obs_t=k|\\hidden_t=j) = \\hmmObs_{jk} \n", "```\n", "This is represented by the histograms associated with each\n", "state in {ref}`casino-fig`.\n", "\n", "Finally,\n", "the initial state distribution is denoted by\n", "```{math}\n", "p(z_1=j) = \\hmmInit_j\n", "```\n", "\n", "Collectively we denote all the parameters by $\\vtheta=(\\hmmTrans, \\hmmObs, \\hmmInit)$.\n", "\n", "Now let us implement this model in code." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# state transition matrix\n", "A = np.array([\n", " [0.95, 0.05],\n", " [0.10, 0.90]\n", "])\n", "\n", "# observation matrix\n", "B = np.array([\n", " [1/6, 1/6, 1/6, 1/6, 1/6, 1/6], # fair die\n", " [1/10, 1/10, 1/10, 1/10, 1/10, 5/10] # loaded die\n", "])\n", "\n", "pi = np.array([0.5, 0.5])\n", "\n", "(nstates, nobs) = np.shape(B)\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "WARNING:absl:No GPU/TPU found, falling back to CPU. (Set TF_CPP_MIN_LOG_LEVEL=0 and rerun for more info.)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "import distrax\n", "from distrax import HMM\n", "\n", "\n", "hmm = HMM(trans_dist=distrax.Categorical(probs=A),\n", " init_dist=distrax.Categorical(probs=pi),\n", " obs_dist=distrax.Categorical(probs=B))\n", "\n", "print(hmm)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "Let's sample from the model. We will generate a sequence of latent states, $\\hid_{1:T}$,\n", "which we then convert to a sequence of observations, $\\obs_{1:T}$." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Printing sample observed/latent...\n", "x: 633665342652353616444236412331351246651613325161656366246242\n", "z: 222222211111111111111111111111111111111222111111112222211111\n" ] } ], "source": [ "\n", "\n", "\n", "seed = 314\n", "n_samples = 300\n", "z_hist, x_hist = hmm.sample(seed=PRNGKey(seed), seq_len=n_samples)\n", "\n", "z_hist_str = \"\".join((np.array(z_hist) + 1).astype(str))[:60]\n", "x_hist_str = \"\".join((np.array(x_hist) + 1).astype(str))[:60]\n", "\n", "print(\"Printing sample observed/latent...\")\n", "print(f\"x: {x_hist_str}\")\n", "print(f\"z: {z_hist_str}\")" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
  def sample(self,\n",
       "             *,\n",
       "             seed: chex.PRNGKey,\n",
       "             seq_len: chex.Array) -> Tuple:\n",
       "    \"\"\"Sample from this HMM.\n",
       "\n",
       "    Samples an observation of given length according to this\n",
       "    Hidden Markov Model and gives the sequence of the hidden states\n",
       "    as well as the observation.\n",
       "\n",
       "    Args:\n",
       "      seed: Random key of shape (2,) and dtype uint32.\n",
       "      seq_len: The length of the observation sequence.\n",
       "\n",
       "    Returns:\n",
       "      Tuple of hidden state sequence, and observation sequence.\n",
       "    \"\"\"\n",
       "    rng_key, rng_init = jax.random.split(seed)\n",
       "    initial_state = self._init_dist.sample(seed=rng_init)\n",
       "\n",
       "    def draw_state(prev_state, key):\n",
       "      state = self._trans_dist.sample(seed=key)\n",
       "      return state, state\n",
       "\n",
       "    rng_state, rng_obs = jax.random.split(rng_key)\n",
       "    keys = jax.random.split(rng_state, seq_len - 1)\n",
       "    _, states = jax.lax.scan(draw_state, initial_state, keys)\n",
       "    states = jnp.append(initial_state, states)\n",
       "\n",
       "    def draw_obs(state, key):\n",
       "      return self._obs_dist.sample(seed=key)\n",
       "\n",
       "    keys = jax.random.split(rng_obs, seq_len)\n",
       "    obs_seq = jax.vmap(draw_obs, in_axes=(0, 0))(states, keys)\n",
       "\n",
       "    return states, obs_seq\n",
       "\n",
       "
\n" ], "text/plain": [ " def \u001b[1;35msample\u001b[0m\u001b[1m(\u001b[0mself,\n", " *,\n", " seed: chex.PRNGKey,\n", " seq_len: chex.Array\u001b[1m)\u001b[0m -> Tuple:\n", " \u001b[32m\"\"\u001b[0m\"Sample from this HMM.\n", "\n", " Samples an observation of given length according to this\n", " Hidden Markov Model and gives the sequence of the hidden states\n", " as well as the observation.\n", "\n", " Args:\n", " seed: Random key of shape \u001b[1m(\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1m)\u001b[0m and dtype uint32.\n", " seq_len: The length of the observation sequence.\n", "\n", " Returns:\n", " Tuple of hidden state sequence, and observation sequence.\n", " \u001b[32m\"\"\u001b[0m\"\n", " rng_key, rng_init = \u001b[1;35mjax.random.split\u001b[0m\u001b[1m(\u001b[0mseed\u001b[1m)\u001b[0m\n", " initial_state = \u001b[1;35mself._init_dist.sample\u001b[0m\u001b[1m(\u001b[0m\u001b[33mseed\u001b[0m=\u001b[35mrng_init\u001b[0m\u001b[1m)\u001b[0m\n", "\n", " def \u001b[1;35mdraw_state\u001b[0m\u001b[1m(\u001b[0mprev_state, key\u001b[1m)\u001b[0m:\n", " state = \u001b[1;35mself._trans_dist.sample\u001b[0m\u001b[1m(\u001b[0m\u001b[33mseed\u001b[0m=\u001b[35mkey\u001b[0m\u001b[1m)\u001b[0m\n", " return state, state\n", "\n", " rng_state, rng_obs = \u001b[1;35mjax.random.split\u001b[0m\u001b[1m(\u001b[0mrng_key\u001b[1m)\u001b[0m\n", " keys = \u001b[1;35mjax.random.split\u001b[0m\u001b[1m(\u001b[0mrng_state, seq_len - \u001b[1;36m1\u001b[0m\u001b[1m)\u001b[0m\n", " _, states = \u001b[1;35mjax.lax.scan\u001b[0m\u001b[1m(\u001b[0mdraw_state, initial_state, keys\u001b[1m)\u001b[0m\n", " states = \u001b[1;35mjnp.append\u001b[0m\u001b[1m(\u001b[0minitial_state, states\u001b[1m)\u001b[0m\n", "\n", " def \u001b[1;35mdraw_obs\u001b[0m\u001b[1m(\u001b[0mstate, key\u001b[1m)\u001b[0m:\n", " return \u001b[1;35mself._obs_dist.sample\u001b[0m\u001b[1m(\u001b[0m\u001b[33mseed\u001b[0m=\u001b[35mkey\u001b[0m\u001b[1m)\u001b[0m\n", "\n", " keys = \u001b[1;35mjax.random.split\u001b[0m\u001b[1m(\u001b[0mrng_obs, seq_len\u001b[1m)\u001b[0m\n", " obs_seq = \u001b[1;35mjax.vmap\u001b[0m\u001b[1m(\u001b[0mdraw_obs, \u001b[33min_axes\u001b[0m=\u001b[1m(\u001b[0m\u001b[1;36m0\u001b[0m, \u001b[1;36m0\u001b[0m\u001b[1m)\u001b[0m\u001b[1m)\u001b[0m\u001b[1m(\u001b[0mstates, keys\u001b[1m)\u001b[0m\n", "\n", " return states, obs_seq\n", "\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Here is the source code for the sampling algorithm.\n", "\n", "print_source(hmm.sample)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Our primary goal will be to infer the latent state from the observations,\n", "so we can detect if the casino is being dishonest or not. This will\n", "affect how we choose to gamble our money.\n", "We discuss various ways to perform this inference below." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Linear Gaussian SSMs\n", "\n", "Blah blah" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(sec:tracking-lds)=\n", "## Example: model for 2d tracking\n", "\n", "Blah blah" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(sec:inference)=\n", "# Inferential goals\n", "\n", "```{figure} /figures/dbn-inference-problems.png\n", ":scale: 100%\n", ":name: dbn-inference\n", "\n", "Illustration of the different kinds of inference in an SSM.\n", " The main kinds of inference for state-space models.\n", " The shaded region is the interval for which we have data.\n", " The arrow represents the time step at which we want to perform inference.\n", " $t$ is the current time, $T$ is the sequence length,\n", "$\\ell$ is the lag and $h$ is the prediction horizon.\n", "```\n", "\n", "\n", "\n", "Given the sequence of observations, and a known model,\n", "one of the main tasks with SSMs\n", "to perform posterior inference,\n", "about the hidden states; this is also called\n", "state estimation.\n", "At each time step $t$,\n", "there are multiple forms of posterior we may be interested in computing,\n", "including the following:\n", "- the filtering distribution\n", "$p(\\hmmhid_t|\\hmmobs_{1:t})$\n", "- the smoothing distribution\n", "$p(\\hmmhid_t|\\hmmobs_{1:T})$ (note that this conditions on future data $T>t$)\n", "- the fixed-lag smoothing distribution\n", "$p(\\hmmhid_{t-\\ell}|\\hmmobs_{1:t})$ (note that this\n", "infers $\\ell$ steps in the past given data up to the present).\n", "\n", "We may also want to compute the\n", "predictive distribution $h$ steps into the future:\n", "\\begin{align}\n", "p(\\hmmobs_{t+h}|\\hmmobs_{1:t})\n", "&= \\sum_{\\hmmhid_{t+h}} p(\\hmmobs_{t+h}|\\hmmhid_{t+h}) p(\\hmmhid_{t+h}|\\hmmobs_{1:t})\n", "\\end{align}\n", "where the hidden state predictive distribution is\n", "\\begin{align}\n", "p(\\hmmhid_{t+h}|\\hmmobs_{1:t})\n", "&= \\sum_{\\hmmhid_{t:t+h-1}}\n", " p(\\hmmhid_t|\\hmmobs_{1:t}) \n", " p(\\hmmhid_{t+1}|\\hmmhid_{t})\n", " p(\\hmmhid_{t+2}|\\hmmhid_{t+1})\n", "\\cdots\n", " p(\\hmmhid_{t+h}|\\hmmhid_{t+h-1})\n", "\\end{align}\n", "See \\cref{fig:dbn_inf_problems} for a summary of these distributions.\n", "\n", "In addition to comuting posterior marginals,\n", "we may want to compute the most probable hidden sequence,\n", "i.e., the joint MAP estimate\n", "```{math}\n", "\\arg \\max_{\\hmmhid_{1:T}} p(\\hmmhid_{1:T}|\\hmmobs_{1:T})\n", "```\n", "or sample sequences from the posterior\n", "```{math}\n", "\\hmmhid_{1:T} \\sim p(\\hmmhid_{1:T}|\\hmmobs_{1:T})\n", "```\n", "\n", "Algorithms for all these task are discussed in the following chapters,\n", "since the details depend on the form of the SSM.\n", "\n", "\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Example: inference in the casino HMM\n", "\n", "We now illustrate filtering, smoothing and MAP decoding applied\n", "to the casino HMM from {ref}`sec:casino`. \n" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/opt/anaconda3/envs/spyder-dev/lib/python3.9/site-packages/jax/_src/numpy/lax_numpy.py:5256: UserWarning: Explicitly requested dtype requested in astype is not available, and will be truncated to dtype int32. To enable more dtypes, set the jax_enable_x64 configuration option or the JAX_ENABLE_X64 shell environment variable. See https://github.com/google/jax#current-gotchas for more.\n", " lax._check_user_dtype_supported(dtype, \"astype\")\n" ] } ], "source": [ "# Call inference engine\n", "\n", "filtered_dist, _, smoothed_dist, loglik = hmm.forward_backward(x_hist)\n", "map_path = hmm.viterbi(x_hist)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "# Find the span of timesteps that the simulated systems turns to be in state 1\n", "def find_dishonest_intervals(z_hist):\n", " spans = []\n", " x_init = 0\n", " for t, _ in enumerate(z_hist[:-1]):\n", " if z_hist[t + 1] == 0 and z_hist[t] == 1:\n", " x_end = t\n", " spans.append((x_init, x_end))\n", " elif z_hist[t + 1] == 1 and z_hist[t] == 0:\n", " x_init = t + 1\n", " return spans" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "# Plot posterior\n", "def plot_inference(inference_values, z_hist, ax, state=1, map_estimate=False):\n", " n_samples = len(inference_values)\n", " xspan = np.arange(1, n_samples + 1)\n", " spans = find_dishonest_intervals(z_hist)\n", " if map_estimate:\n", " ax.step(xspan, inference_values, where=\"post\")\n", " else:\n", " ax.plot(xspan, inference_values[:, state])\n", "\n", " for span in spans:\n", " ax.axvspan(*span, alpha=0.5, facecolor=\"tab:gray\", edgecolor=\"none\")\n", " ax.set_xlim(1, n_samples)\n", " # ax.set_ylim(0, 1)\n", " ax.set_ylim(-0.1, 1.1)\n", " ax.set_xlabel(\"Observation number\")" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 1.0, 'Filtered')" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ " # Filtering\n", "fig, ax = plt.subplots()\n", "plot_inference(filtered_dist, z_hist, ax)\n", "ax.set_ylabel(\"p(loaded)\")\n", "ax.set_title(\"Filtered\")\n", " \n", "\n", " " ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 1.0, 'Smoothed')" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Smoothing\n", "fig, ax = plt.subplots()\n", "plot_inference(smoothed_dist, z_hist, ax)\n", "ax.set_ylabel(\"p(loaded)\")\n", "ax.set_title(\"Smoothed\")\n", "\n", "\n", " " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# MAP estimation\n", "fig, ax = plt.subplots()\n", "plot_inference(map_path, z_hist, ax, map_estimate=True)\n", "ax.set_ylabel(\"MAP state\")\n", "ax.set_title(\"Viterbi\")\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# TODO: posterior samples\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Example: inference in the tracking SSM\n", "\n", "We now illustrate filtering, smoothing and MAP decoding applied\n", "to the 2d tracking HMM from {ref}`sec:tracking-lds`. " ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "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.9.2" } }, "nbformat": 4, "nbformat_minor": 4 }