{ "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{\\ssmDynFn}{f}\n", "\\newcommand{\\ssmObsFn}{h}\n", "\n", "\n", "%%%\n", "\\newcommand{\\gauss}{\\mathcal{N}}\n", "\n", "\\newcommand{\\diag}{\\mathrm{diag}}\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: eq:SSM-ar\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", "\n", "We often consider a simpler setting in which the\n", " 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: eq:SSM-input\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) \\right]\n", "```\n", "Sometimes there are no external inputs, so the model further\n", "simplifies to the following unconditional generative model: \n", "```{math}\n", ":label: eq:SSM-no-input\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", "\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": [ "(sec:lillypad)=\n", "## Example: Lillypad HMM\n", "\n", "\n", "If $\\obs_t$ is continuous, it is common to use a Gaussian\n", "observation model:\n", "```{math}\n", "p(\\obs_t|\\hidden_t=j) = \\gauss(\\obs_t|\\vmu_j,\\vSigma_j)\n", "```\n", "This is sometimes called a Gaussian HMM.\n", "\n", "As a simple example, suppose we have an HMM with 3 hidden states,\n", "each of which generates a 2d Gaussian.\n", "We can represent these Gaussian distributions are 2d ellipses,\n", "as we show below.\n", "We call these ``lilly pads'', because of their shape.\n", "We can imagine a frog hopping from one lilly pad to another.\n", "(This analogy is due to the late Sam Roweis.)\n", "The frog will stay on a pad for a while (corresponding to remaining in the same\n", "discrete state $\\hidden_t$), and then jump to a new pad\n", "(corresponding to a transition to a new state).\n", "The data we see are just the 2d points (e.g., water droplets)\n", "coming from near the pad that the frog is currently on.\n", "Thus this model is like a Gaussian mixture model,\n", "in that it generates clusters of observations,\n", "except now there is temporal correlation between the data points.\n", "\n", "Let us now illustrate this model in code.\n", "\n" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "# Let us create the model\n", "\n", "initial_probs = jnp.array([0.3, 0.2, 0.5])\n", "\n", "# transition matrix\n", "A = jnp.array([\n", "[0.3, 0.4, 0.3],\n", "[0.1, 0.6, 0.3],\n", "[0.2, 0.3, 0.5]\n", "])\n", "\n", "# Observation model\n", "mu_collection = jnp.array([\n", "[0.3, 0.3],\n", "[0.8, 0.5],\n", "[0.3, 0.8]\n", "])\n", "\n", "S1 = jnp.array([[1.1, 0], [0, 0.3]])\n", "S2 = jnp.array([[0.3, -0.5], [-0.5, 1.3]])\n", "S3 = jnp.array([[0.8, 0.4], [0.4, 0.5]])\n", "cov_collection = jnp.array([S1, S2, S3]) / 60\n", "\n", "\n", "import tensorflow_probability as tfp\n", "\n", "if False:\n", " hmm = HMM(trans_dist=distrax.Categorical(probs=A),\n", " init_dist=distrax.Categorical(probs=initial_probs),\n", " obs_dist=distrax.MultivariateNormalFullCovariance(\n", " loc=mu_collection, covariance_matrix=cov_collection))\n", "else:\n", " hmm = HMM(trans_dist=distrax.Categorical(probs=A),\n", " init_dist=distrax.Categorical(probs=initial_probs),\n", " obs_dist=distrax.as_distribution(\n", " tfp.substrates.jax.distributions.MultivariateNormalFullCovariance(loc=mu_collection,\n", " covariance_matrix=cov_collection)))\n", "\n", "print(hmm)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(50,)\n", "(50, 2)\n" ] } ], "source": [ "\n", "n_samples, seed = 50, 10\n", "samples_state, samples_obs = hmm.sample(seed=PRNGKey(seed), seq_len=n_samples)\n", "\n", "print(samples_state.shape)\n", "print(samples_obs.shape)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "\n", "# Let's plot the observed data in 2d\n", "xmin, xmax = 0, 1\n", "ymin, ymax = 0, 1.2\n", "colors = [\"tab:green\", \"tab:blue\", \"tab:red\"]\n", "\n", "def plot_2dhmm(hmm, samples_obs, samples_state, colors, ax, xmin, xmax, ymin, ymax, step=1e-2):\n", " obs_dist = hmm.obs_dist\n", " color_sample = [colors[i] for i in samples_state]\n", "\n", " xs = jnp.arange(xmin, xmax, step)\n", " ys = jnp.arange(ymin, ymax, step)\n", "\n", " v_prob = vmap(lambda x, y: obs_dist.prob(jnp.array([x, y])), in_axes=(None, 0))\n", " z = vmap(v_prob, in_axes=(0, None))(xs, ys)\n", "\n", " grid = np.mgrid[xmin:xmax:step, ymin:ymax:step]\n", "\n", " for k, color in enumerate(colors):\n", " ax.contour(*grid, z[:, :, k], levels=[1], colors=color, linewidths=3)\n", " ax.text(*(obs_dist.mean()[k] + 0.13), f\"$k$={k + 1}\", fontsize=13, horizontalalignment=\"right\")\n", "\n", " ax.plot(*samples_obs.T, c=\"black\", alpha=0.3, zorder=1)\n", " ax.scatter(*samples_obs.T, c=color_sample, s=30, zorder=2, alpha=0.8)\n", "\n", " return ax, color_sample\n", "\n", "\n", "fig, ax = plt.subplots()\n", "_, color_sample = plot_2dhmm(hmm, samples_obs, samples_state, colors, ax, xmin, xmax, ymin, ymax)\n" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Let's plot the hidden state sequence\n", "\n", "fig, ax = plt.subplots()\n", "ax.step(range(n_samples), samples_state, where=\"post\", c=\"black\", linewidth=1, alpha=0.3)\n", "ax.scatter(range(n_samples), samples_state, c=color_sample, zorder=3)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(sec:lds-intro)=\n", "# Linear Gaussian SSMs\n", "\n", "\n", "Consider the state space model in \n", "{eq}`eq:SSM-ar`\n", "where we assume the observations are conditionally iid given the\n", "hidden states and inputs (i.e. there are no auto-regressive dependencies\n", "between the observables).\n", "We can rewrite this model as \n", "a stochastic nonlinear dynamical system (NLDS)\n", "by defining the distribution of the next hidden state \n", "as a deterministic function of the past state\n", "plus random process noise $\\vepsilon_t$ \n", "\\begin{align}\n", "\\hmmhid_t &= \\ssmDynFn(\\hmmhid_{t-1}, \\inputs_t, \\vepsilon_t) \n", "\\end{align}\n", "where $\\vepsilon_t$ is drawn from the distribution such\n", "that the induced distribution\n", "on $\\hmmhid_t$ matches $p(\\hmmhid_t|\\hmmhid_{t-1}, \\inputs_t)$.\n", "Similarly we can rewrite the observation distributions\n", "as a deterministic function of the hidden state\n", "plus observation noise $\\veta_t$:\n", "\\begin{align}\n", "\\hmmobs_t &= \\ssmObsFn(\\hmmhid_{t}, \\inputs_t, \\veta_t)\n", "\\end{align}\n", "\n", "\n", "If we assume additive Gaussian noise,\n", "the model becomes\n", "\\begin{align}\n", "\\hmmhid_t &= \\ssmDynFn(\\hmmhid_{t-1}, \\inputs_t) + \\vepsilon_t \\\\\n", "\\hmmobs_t &= \\ssmObsFn(\\hmmhid_{t}, \\inputs_t) + \\veta_t\n", "\\end{align}\n", "where $\\vepsilon_t \\sim \\gauss(\\vzero,\\vQ_t)$\n", "and $\\veta_t \\sim \\gauss(\\vzero,\\vR_t)$.\n", "We will call these Gaussian SSMs.\n", "\n", "If we additionally assume\n", "the transition function $\\ssmDynFn$\n", "and the observation function $\\ssmObsFn$ are both linear,\n", "then we can rewrite the model as follows:\n", "\\begin{align}\n", "p(\\hmmhid_t|\\hmmhid_{t-1},\\inputs_t) &= \\gauss(\\hmmhid_t|\\ldsDyn_t \\hmmhid_{t-1}\n", "+ \\ldsDynIn_t \\inputs_t, \\vQ_t)\n", "\\\\\n", "p(\\hmmobs_t|\\hmmhid_t,\\inputs_t) &= \\gauss(\\hmmobs_t|\\ldsObs_t \\hmmhid_{t}\n", "+ \\ldsObsIn_t \\inputs_t, \\vR_t)\n", "\\end{align}\n", "This is called a \n", "linear-Gaussian state space model\n", "(LG-SSM),\n", "or a\n", "linear dynamical system (LDS).\n", "We usually assume the parameters are independent of time, in which case\n", "the model is said to be time-invariant or homogeneous.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(sec:tracking-lds)=\n", "(sec:kalman-tracking)=\n", "## Example: tracking a 2d point\n", "\n", "\n", "\n", "% Sarkkar p43\n", "Consider an object moving in $\\real^2$.\n", "Let the state be\n", "the position and velocity of the object,\n", "$$\\vz_t =\\begin{pmatrix} u_t & \\dot{u}_t & v_t & \\dot{v}_t \\end{pmatrix}$$.\n", "(We use $u$ and $v$ for the two coordinates,\n", "to avoid confusion with the state and observation variables.)\n", "If we use Euler discretization,\n", "the dynamics become\n", "\\begin{align}\n", "\\underbrace{\\begin{pmatrix} u_t\\\\ \\dot{u}_t \\\\ v_t \\\\ \\dot{v}_t \\end{pmatrix}}_{\\vz_t}\n", " = \n", "\\underbrace{\n", "\\begin{pmatrix}\n", "1 & 0 & \\Delta & 0 \\\\\n", "0 & 1 & 0 & \\Delta\\\\\n", "0 & 0 & 1 & 0 \\\\\n", "0 & 0 & 0 & 1\n", "\\end{pmatrix}\n", "}_{\\ldsDyn}\n", "\\\n", "\\underbrace{\\begin{pmatrix} u_{t-1} \\\\ \\dot{u}_{t-1} \\\\ v_{t-1} \\\\ \\dot{v}_{t-1} \\end{pmatrix}}_{\\vz_{t-1}}\n", "+ \\vepsilon_t\n", "\\end{align}\n", "where $\\vepsilon_t \\sim \\gauss(\\vzero,\\vQ)$ is\n", "the process noise.\n", "\n", "Let us assume\n", "that the process noise is \n", "a white noise process added to the velocity components\n", "of the state, but not to the location.\n", "(This is known as a random accelerations model.)\n", "We can approximate the resulting process in discrete time by assuming\n", "$\\vQ = \\diag(0, q, 0, q)$.\n", "(See {cite}`Sarkka13` p60 for a more accurate way\n", "to convert the continuous time process to discrete time.)\n", "\n", "\n", "Now suppose that at each discrete time point we\n", "observe the location,\n", "corrupted by Gaussian noise.\n", "Thus the observation model becomes\n", "\\begin{align}\n", "\\underbrace{\\begin{pmatrix} y_{1,t} \\\\ y_{2,t} \\end{pmatrix}}_{\\vy_t}\n", " &=\n", " \\underbrace{\n", " \\begin{pmatrix}\n", "1 & 0 & 0 & 0 \\\\\n", "0 & 0 & 1 & 0\n", " \\end{pmatrix}\n", " }_{\\ldsObs}\n", " \\\n", "\\underbrace{\\begin{pmatrix} u_t\\\\ \\dot{u}_t \\\\ v_t \\\\ \\dot{v}_t \\end{pmatrix}}_{\\vz_t} \n", " + \\veta_t\n", "\\end{align}\n", "where $\\veta_t \\sim \\gauss(\\vzero,\\vR)$ is the \\keywordDef{observation noise}.\n", "We see that the observation matrix $\\ldsObs$ simply ``extracts'' the\n", "relevant parts of the state vector.\n", "\n", "Suppose we sample a trajectory and corresponding set\n", "of noisy observations from this model,\n", "$(\\vz_{1:T}, \\vy_{1:T}) \\sim p(\\vz,\\vy|\\vtheta)$.\n", "(We use diagonal observation noise,\n", "$\\vR = \\diag(\\sigma_1^2, \\sigma_2^2)$.)\n", "The results are shown below. \n" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "LDS(A=DeviceArray([[1., 0., 1., 0.],\n", " [0., 1., 0., 1.],\n", " [0., 0., 1., 0.],\n", " [0., 0., 0., 1.]], dtype=float32), C=DeviceArray([[1, 0, 0, 0],\n", " [0, 1, 0, 0]], dtype=int32), Q=DeviceArray([[0.001, 0. , 0. , 0. ],\n", " [0. , 0.001, 0. , 0. ],\n", " [0. , 0. , 0.001, 0. ],\n", " [0. , 0. , 0. , 0.001]], dtype=float32), R=DeviceArray([[1., 0.],\n", " [0., 1.]], dtype=float32), mu=DeviceArray([ 8., 10., 1., 0.], dtype=float32), Sigma=DeviceArray([[1., 0., 0., 0.],\n", " [0., 1., 0., 0.],\n", " [0., 0., 1., 0.],\n", " [0., 0., 0., 1.]], dtype=float32), state_offset=None, obs_offset=None, nstates=4, nobs=2)\n" ] } ], "source": [ "key = jax.random.PRNGKey(314)\n", "timesteps = 15\n", "delta = 1.0\n", "A = jnp.array([\n", " [1, 0, delta, 0],\n", " [0, 1, 0, delta],\n", " [0, 0, 1, 0],\n", " [0, 0, 0, 1]\n", "])\n", "\n", "C = jnp.array([\n", " [1, 0, 0, 0],\n", " [0, 1, 0, 0]\n", "])\n", "\n", "state_size, _ = A.shape\n", "observation_size, _ = C.shape\n", "\n", "Q = jnp.eye(state_size) * 0.001\n", "R = jnp.eye(observation_size) * 1.0\n", "# Prior parameter distribution\n", "mu0 = jnp.array([8, 10, 1, 0]).astype(float)\n", "Sigma0 = jnp.eye(state_size) * 1.0\n", "\n", "from jsl.lds.kalman_filter import LDS, smooth, filter\n", "\n", "lds = LDS(A, C, Q, R, mu0, Sigma0)\n", "print(lds)\n", "\n" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "from jsl.demos.plot_utils import plot_ellipse\n", "\n", "def plot_tracking_values(observed, filtered, cov_hist, signal_label, ax):\n", " timesteps, _ = observed.shape\n", " ax.plot(observed[:, 0], observed[:, 1], marker=\"o\", linewidth=0,\n", " markerfacecolor=\"none\", markeredgewidth=2, markersize=8, label=\"observed\", c=\"tab:green\")\n", " ax.plot(*filtered[:, :2].T, label=signal_label, c=\"tab:red\", marker=\"x\", linewidth=2)\n", " for t in range(0, timesteps, 1):\n", " covn = cov_hist[t][:2, :2]\n", " plot_ellipse(covn, filtered[t, :2], ax, n_std=2.0, plot_center=False)\n", " ax.axis(\"equal\")\n", " ax.legend()" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(7.24486608505249, 23.857812213897706, 8.0420747756958, 11.636079216003418)" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXAAAAD4CAYAAAD1jb0+AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAd3klEQVR4nO3df3xU9Z3v8dcnP0jCj0ZNKFdFAXuLAjGiRKqrtroR662uXpVaeahbFVBsuy3edltsK9bHY/deVqnFChZ4UJfetloFtd12t11+9LJqL0gj5UeorL11gaK4EqojgTD59bl/zCSGkDCTmZOZc5L38/HIY2bOmTnzySTnPd/5nu/5jrk7IiISPQX5LkBERDKjABcRiSgFuIhIRCnARUQiSgEuIhJRRbl8ssrKSh87dmwun1JEJPJeffXVBncf2X15TgN87Nix1NXV5fIpRUQiz8z29LRcXSgiIhGlABcRiSgFuIhIROW0D1xEBq6Wlhb27dvH0aNH811KZJWWljJ69GiKi4vTur8CXEQCsW/fPkaMGMHYsWMxs3yXEznuzsGDB9m3bx/jxo1L6zHqQhGRQBw9epSKigqFd4bMjIqKij59glGAi0hgFN7Z6evrpy4UEcmLWDzG2j1rOdh0kIqyCqaNmUZ5SXm+y4oUtcBFJKfcnaXbllK7qpaHNj7E4q2LeWjjQ9SuqmXptqUE+R0Fu3fvpqqqKrDtBeXyyy8P5KRGtcBFJKeWbV/Gkq1LALj41IuZVDmJnQ072bh/Y+fyOefNyWeJJ9Ta2kpRUTiiUy1wEcmZWDzGih0rAFh0xSKWX7WcL13wJZZftZxFly8CYMWOFcTisYy2/+ijj1JVVUVVVRWLFiW219rayq233sqECROYPn06R44cAWDevHlMnDiR6upqvvKVrwBw4MABbrrpJi688EIuvPBCfvOb3wDwrW99i9tvv51LLrmE22+/nYsuuoidO3d2Pm9Hi/rw4cPcddddTJ06lfPPP5+f/exnADQ1NXHLLbcwYcIEbrjhBpqamjL6/Y7j7jn7mTJliovIwPT73/8+5X1W/fsqr1pZ5bP/dXaP62f96yyvWlnlq/99dZ+fv66uzquqqryxsdEPHTrkEydO9C1btjjgL7/8sru733nnnf7II494Q0ODjx8/3tvb293d/d1333V39xkzZvhLL73k7u579uzxc845x93dH3zwQb/gggv8yJEj7u7+6KOP+vz5893d/a233vLx48e7u/v999/vP/zhDzu3+dGPftQbGxv929/+tt95553u7r5t2zYvLCz03/72tz3+Hj29jkCd95CpaoGLSM4cbDoIwKTKST2ur6pM9Fc3NDX0edsvv/wyN9xwA8OGDWP48OHceOONvPTSS5xxxhlccsklANx22228/PLLlJeXU1paysyZM3n++ecZOnQoAOvWreMLX/gCkydP5rrrruP999+nsbERgOuuu46ysjIAbr75ZlavXg3As88+y/Tp0wFYs2YNCxYsYPLkyVx++eUcPXqUvXv38uKLL3LbbbcBUF1dTXV1dZ9/v56EoyNHRAaFirIKAHY27OxxfX1DPQCVZZWBPWf3oXlmRlFREZs3b2b9+vWsXr2axYsX8+tf/5r29nY2bdpEaWnpcdsZNmxY5/XTTz+diooKtm/fzjPPPMPSpUuBRI/Gc889x9lnnx1Y/SeiFriI5My0MdMoKSxh4/6NrN+z/ph16/esZ9P+TZQWlnLlmCv7vO3LLruMn/70pxw5coTDhw/zwgsvcNlll7F37142btwIwFNPPcWll15KY2MjsViMT33qU3znO99h27ZtAFx11VU8/vjjndvcunVrr8/3mc98hocffphYLNbZov7kJz/J448/3jmS5ne/+x0AH//4x3nqqacAqK+vZ/v27X3+/XqiABeRnCkvKWfWubMAmLthLrPXzOaxLY8xe81s5m6YC8DMc2dmNB78ggsu4I477mDq1Kl87GMfY9asWZx88smcffbZLFmyhAkTJvDuu+9y7733cujQIa699lqqq6u59NJLefTRRwH47ne/S11dHdXV1UycOLGzZd2T6dOn85Of/ISbb765c9kDDzxAS0sL1dXVTJo0iQceeACAe++9l8bGRiZMmMD8+fOZMmVKn3+/nljHO0Uu1NTUuL7QQWRgeu2115gwYULK+7k7y7YvY8WOFcTb4p3LSwpLmHXuLO6pvmdQn9HZ0+toZq+6e033+6oPXERyysyYc94cZpwzg3V71tHQ1EBlWSVXjrlSZ2L2kQJcRPKivKScm8bflO8yIk194CIiEZUywM3sSTN7x8zqe1j3ZTNzMwtuzI+IiKQlnRb4SuDq7gvN7AzgKmBvwDWJiEgaUga4u78I/LmHVd8BvgrkbhiLiIh0yugg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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "\n", "z_hist, x_hist = lds.sample(key, timesteps)\n", "\n", "fig_truth, axs = plt.subplots()\n", "axs.plot(x_hist[:, 0], x_hist[:, 1],\n", " marker=\"o\", linewidth=0, markerfacecolor=\"none\",\n", " markeredgewidth=2, markersize=8,\n", " label=\"observed\", c=\"tab:green\")\n", "\n", "axs.plot(z_hist[:, 0], z_hist[:, 1],\n", " linewidth=2, label=\"truth\",\n", " marker=\"s\", markersize=8)\n", "axs.legend()\n", "axs.axis(\"equal\")\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The main task is to infer the hidden states given the noisy\n", "observations, i.e., $p(\\vz|\\vy,\\vtheta)$. We discuss the topic of inference in {ref}`sec:inference`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(sec:nlds-intro)=\n", "# Nonlinear Gaussian SSMs\n", "\n", "In this section, we consider SSMs in which the dynamics and/or observation models are nonlinear,\n", "but the process noise and observation noise are Gaussian.\n", "That is, \n", "\\begin{align}\n", "\\hmmhid_t &= \\ssmDynFn(\\hmmhid_{t-1}, \\inputs_t) + \\vepsilon_t \\\\\n", "\\hmmobs_t &= \\ssmObsFn(\\hmmhid_{t}, \\inputs_t) + \\veta_t\n", "\\end{align}\n", "where $\\vepsilon_t \\sim \\gauss(\\vzero,\\vQ_t)$\n", "and $\\veta_t \\sim \\gauss(\\vzero,\\vR_t)$.\n", "This is a very widely used model class. We give some examples below." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(sec:pendulum)=\n", "## Example: tracking a 1d pendulum\n", "\n", "```{figure} /figures/pendulum.png\n", ":scale: 100%\n", ":name: fig:pendulum\n", "\n", "Illustration of a pendulum swinging.\n", "$g$ is the force of gravity,\n", "$w(t)$ is a random external force,\n", "and $\\alpha$ is the angle wrt the vertical.\n", "Based on {cite}`Sarkka13` fig 3.10.\n", "\n", "```\n", "\n", "\n", "% Sarka p45, p74\n", "Consider a simple pendulum of unit mass and length swinging from\n", "a fixed attachment, as in {ref}`fig:pendulum`.\n", "Such an object is in principle entirely deterministic in its behavior.\n", "However, in the real world, there are often unknown forces at work\n", "(e.g., air turbulence, friction).\n", "We will model these by a continuous time random Gaussian noise process $w(t)$.\n", "This gives rise to the following differential equation:\n", "\\begin{align}\n", "\\frac{d^2 \\alpha}{d t^2}\n", "= -g \\sin(\\alpha) + w(t)\n", "\\end{align}\n", "We can write this as a nonlinear SSM by defining the state to be\n", "$z_1(t) = \\alpha(t)$ and $z_2(t) = d\\alpha(t)/dt$.\n", "Thus\n", "\\begin{align}\n", "\\frac{d \\vz}{dt}\n", "= \\begin{pmatrix} z_2 \\\\ -g \\sin(z_1) \\end{pmatrix}\n", "+ \\begin{pmatrix} 0 \\\\ 1 \\end{pmatrix} w(t)\n", "\\end{align}\n", "If we discretize this step size $\\Delta$,\n", "we get the following\n", "formulation {cite}`Sarkka13` p74:\n", "\\begin{align}\n", "\\underbrace{\n", " \\begin{pmatrix} z_{1,t} \\\\ z_{2,t} \\end{pmatrix}\n", " }_{\\hmmhid_t}\n", "=\n", "\\underbrace{\n", " \\begin{pmatrix} z_{1,t-1} + z_{2,t-1} \\Delta \\\\\n", " z_{2,t-1} -g \\sin(z_{1,t-1}) \\Delta \\end{pmatrix}\n", " }_{\\vf(\\hmmhid_{t-1})}\n", "+\\vq_{t-1}\n", "\\end{align}\n", "where $\\vq_{t-1} \\sim \\gauss(\\vzero,\\vQ)$ with\n", "\\begin{align}\n", "\\vQ = q^c \\begin{pmatrix}\n", " \\frac{\\Delta^3}{3} & \\frac{\\Delta^2}{2} \\\\\n", " \\frac{\\Delta^2}{2} & \\Delta\n", " \\end{pmatrix}\n", " \\end{align}\n", "where $q^c$ is the spectral density (continuous time variance)\n", "of the continuous-time noise process.\n", "\n", "\n", "If we observe the angular position, we\n", "get the linear observation model\n", "\\begin{align}\n", "y_t = \\alpha_t + r_t = h(\\hmmhid_t) + r_t\n", "\\end{align}\n", "where $h(\\hmmhid_t) = z_{1,t}$\n", "and $r_t$ is the observation noise.\n", "If we only observe the horizontal position,\n", "we get the nonlinear observation model\n", "\\begin{align}\n", "y_t = \\sin(\\alpha_t) + r_t = h(\\hmmhid_t) + r_t\n", "\\end{align}\n", "where $h(\\hmmhid_t) = \\sin(z_{1,t})$.\n", "\n", "\n", "\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(sec:inference)=\n", "# Inferential goals\n", "\n", "```{figure} /figures/inference-problems-tikz.png\n", ":scale: 100%\n", ":name: fig: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 {ref}`fig:dbn-inference` 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 }