nlds.html 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>Nonlinear Gaussian SSMs &#8212; State Space Models: A Modern Approach</title>
  7. <link href="../../_static/css/theme.css" rel="stylesheet">
  8. <link href="../../_static/css/index.ff1ffe594081f20da1ef19478df9384b.css" rel="stylesheet">
  9. <link rel="stylesheet"
  10. href="../../_static/vendor/fontawesome/5.13.0/css/all.min.css">
  11. <link rel="preload" as="font" type="font/woff2" crossorigin
  12. href="../../_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.woff2">
  13. <link rel="preload" as="font" type="font/woff2" crossorigin
  14. href="../../_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.woff2">
  15. <link rel="stylesheet" type="text/css" href="../../_static/pygments.css" />
  16. <link rel="stylesheet" type="text/css" href="../../_static/sphinx-book-theme.css?digest=c3fdc42140077d1ad13ad2f1588a4309" />
  17. <link rel="stylesheet" type="text/css" href="../../_static/togglebutton.css" />
  18. <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css" />
  19. <link rel="stylesheet" type="text/css" href="../../_static/mystnb.css" />
  20. <link rel="stylesheet" type="text/css" href="../../_static/sphinx-thebe.css" />
  21. <link rel="stylesheet" type="text/css" href="../../_static/panels-main.c949a650a448cc0ae9fd3441c0e17fb0.css" />
  22. <link rel="stylesheet" type="text/css" href="../../_static/panels-variables.06eb56fa6e07937060861dad626602ad.css" />
  23. <link rel="preload" as="script" href="../../_static/js/index.be7d3bbb2ef33a8344ce.js">
  24. <script data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js"></script>
  25. <script src="../../_static/jquery.js"></script>
  26. <script src="../../_static/underscore.js"></script>
  27. <script src="../../_static/doctools.js"></script>
  28. <script src="../../_static/clipboard.min.js"></script>
  29. <script src="../../_static/copybutton.js"></script>
  30. <script>let toggleHintShow = 'Click to show';</script>
  31. <script>let toggleHintHide = 'Click to hide';</script>
  32. <script>let toggleOpenOnPrint = 'true';</script>
  33. <script src="../../_static/togglebutton.js"></script>
  34. <script>var togglebuttonSelector = '.toggle, .admonition.dropdown, .tag_hide_input div.cell_input, .tag_hide-input div.cell_input, .tag_hide_output div.cell_output, .tag_hide-output div.cell_output, .tag_hide_cell.cell, .tag_hide-cell.cell';</script>
  35. <script src="../../_static/sphinx-book-theme.d59cb220de22ca1c485ebbdc042f0030.js"></script>
  36. <script>const THEBE_JS_URL = "https://unpkg.com/thebe@0.8.2/lib/index.js"
  37. const thebe_selector = ".thebe,.cell"
  38. const thebe_selector_input = "pre"
  39. const thebe_selector_output = ".output, .cell_output"
  40. </script>
  41. <script async="async" src="../../_static/sphinx-thebe.js"></script>
  42. <script>window.MathJax = {"TeX": {"Macros": {"N": "\\mathbb{N}", "floor": ["\\lfloor#1\\rfloor", 1], "bmat": ["\\left[\\begin{array}"], "emat": ["\\end{array}\\right]"]}}, "options": {"processHtmlClass": "tex2jax_process|mathjax_process|math|output_area"}}</script>
  43. <script defer="defer" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
  44. <link rel="index" title="Index" href="../../genindex.html" />
  45. <link rel="search" title="Search" href="../../search.html" />
  46. <link rel="next" title="Inferential goals" href="inference.html" />
  47. <link rel="prev" title="Linear Gaussian SSMs" href="lds.html" />
  48. <meta name="viewport" content="width=device-width, initial-scale=1" />
  49. <meta name="docsearch:language" content="None">
  50. <!-- Google Analytics -->
  51. </head>
  52. <body data-spy="scroll" data-target="#bd-toc-nav" data-offset="80">
  53. <div class="container-fluid" id="banner"></div>
  54. <div class="container-xl">
  55. <div class="row">
  56. <div class="col-12 col-md-3 bd-sidebar site-navigation show" id="site-navigation">
  57. <div class="navbar-brand-box">
  58. <a class="navbar-brand text-wrap" href="../../index.html">
  59. <h1 class="site-logo" id="site-title">State Space Models: A Modern Approach</h1>
  60. </a>
  61. </div><form class="bd-search d-flex align-items-center" action="../../search.html" method="get">
  62. <i class="icon fas fa-search"></i>
  63. <input type="search" class="form-control" name="q" id="search-input" placeholder="Search this book..." aria-label="Search this book..." autocomplete="off" >
  64. </form><nav class="bd-links" id="bd-docs-nav" aria-label="Main">
  65. <div class="bd-toc-item active">
  66. <ul class="nav bd-sidenav">
  67. <li class="toctree-l1">
  68. <a class="reference internal" href="../../root.html">
  69. State Space Models: A Modern Approach
  70. </a>
  71. </li>
  72. </ul>
  73. <ul class="current nav bd-sidenav">
  74. <li class="toctree-l1">
  75. <a class="reference internal" href="../scratch.html">
  76. Scratchpad
  77. </a>
  78. </li>
  79. <li class="toctree-l1 current active has-children">
  80. <a class="reference internal" href="ssm_index.html">
  81. State Space Models
  82. </a>
  83. <input checked="" class="toctree-checkbox" id="toctree-checkbox-1" name="toctree-checkbox-1" type="checkbox"/>
  84. <label for="toctree-checkbox-1">
  85. <i class="fas fa-chevron-down">
  86. </i>
  87. </label>
  88. <ul class="current">
  89. <li class="toctree-l2">
  90. <a class="reference internal" href="ssm_intro.html">
  91. What are State Space Models?
  92. </a>
  93. </li>
  94. <li class="toctree-l2">
  95. <a class="reference internal" href="hmm.html">
  96. Hidden Markov Models
  97. </a>
  98. </li>
  99. <li class="toctree-l2">
  100. <a class="reference internal" href="lds.html">
  101. Linear Gaussian SSMs
  102. </a>
  103. </li>
  104. <li class="toctree-l2 current active">
  105. <a class="current reference internal" href="#">
  106. Nonlinear Gaussian SSMs
  107. </a>
  108. </li>
  109. <li class="toctree-l2">
  110. <a class="reference internal" href="inference.html">
  111. Inferential goals
  112. </a>
  113. </li>
  114. </ul>
  115. </li>
  116. <li class="toctree-l1 has-children">
  117. <a class="reference internal" href="../hmm/hmm_index.html">
  118. Hidden Markov Models
  119. </a>
  120. <input class="toctree-checkbox" id="toctree-checkbox-2" name="toctree-checkbox-2" type="checkbox"/>
  121. <label for="toctree-checkbox-2">
  122. <i class="fas fa-chevron-down">
  123. </i>
  124. </label>
  125. <ul>
  126. <li class="toctree-l2">
  127. <a class="reference internal" href="../hmm/hmm_filter.html">
  128. HMM filtering (forwards algorithm)
  129. </a>
  130. </li>
  131. <li class="toctree-l2">
  132. <a class="reference internal" href="../hmm/hmm_smoother.html">
  133. HMM smoothing (forwards-backwards algorithm)
  134. </a>
  135. </li>
  136. <li class="toctree-l2">
  137. <a class="reference internal" href="../hmm/hmm_viterbi.html">
  138. Viterbi algorithm
  139. </a>
  140. </li>
  141. <li class="toctree-l2">
  142. <a class="reference internal" href="../hmm/hmm_parallel.html">
  143. Parallel HMM smoothing
  144. </a>
  145. </li>
  146. <li class="toctree-l2">
  147. <a class="reference internal" href="../hmm/hmm_sampling.html">
  148. Forwards-filtering backwards-sampling algorithm
  149. </a>
  150. </li>
  151. </ul>
  152. </li>
  153. <li class="toctree-l1 has-children">
  154. <a class="reference internal" href="../lgssm/lgssm_index.html">
  155. Inference in linear-Gaussian SSMs
  156. </a>
  157. <input class="toctree-checkbox" id="toctree-checkbox-3" name="toctree-checkbox-3" type="checkbox"/>
  158. <label for="toctree-checkbox-3">
  159. <i class="fas fa-chevron-down">
  160. </i>
  161. </label>
  162. <ul>
  163. <li class="toctree-l2">
  164. <a class="reference internal" href="../lgssm/kalman_filter.html">
  165. Kalman filtering
  166. </a>
  167. </li>
  168. <li class="toctree-l2">
  169. <a class="reference internal" href="../lgssm/kalman_smoother.html">
  170. Kalman (RTS) smoother
  171. </a>
  172. </li>
  173. <li class="toctree-l2">
  174. <a class="reference internal" href="../lgssm/kalman_parallel.html">
  175. Parallel Kalman Smoother
  176. </a>
  177. </li>
  178. <li class="toctree-l2">
  179. <a class="reference internal" href="../lgssm/kalman_sampling.html">
  180. Forwards-filtering backwards sampling
  181. </a>
  182. </li>
  183. </ul>
  184. </li>
  185. <li class="toctree-l1 has-children">
  186. <a class="reference internal" href="../extended/extended_index.html">
  187. Extended (linearized) methods
  188. </a>
  189. <input class="toctree-checkbox" id="toctree-checkbox-4" name="toctree-checkbox-4" type="checkbox"/>
  190. <label for="toctree-checkbox-4">
  191. <i class="fas fa-chevron-down">
  192. </i>
  193. </label>
  194. <ul>
  195. <li class="toctree-l2">
  196. <a class="reference internal" href="../extended/extended_filter.html">
  197. Extended Kalman filtering
  198. </a>
  199. </li>
  200. <li class="toctree-l2">
  201. <a class="reference internal" href="../extended/extended_smoother.html">
  202. Extended Kalman smoother
  203. </a>
  204. </li>
  205. <li class="toctree-l2">
  206. <a class="reference internal" href="../extended/extended_parallel.html">
  207. Parallel extended Kalman smoothing
  208. </a>
  209. </li>
  210. </ul>
  211. </li>
  212. <li class="toctree-l1 has-children">
  213. <a class="reference internal" href="../unscented/unscented_index.html">
  214. Unscented methods
  215. </a>
  216. <input class="toctree-checkbox" id="toctree-checkbox-5" name="toctree-checkbox-5" type="checkbox"/>
  217. <label for="toctree-checkbox-5">
  218. <i class="fas fa-chevron-down">
  219. </i>
  220. </label>
  221. <ul>
  222. <li class="toctree-l2">
  223. <a class="reference internal" href="../unscented/unscented_filter.html">
  224. Unscented filtering
  225. </a>
  226. </li>
  227. <li class="toctree-l2">
  228. <a class="reference internal" href="../unscented/unscented_smoother.html">
  229. Unscented smoothing
  230. </a>
  231. </li>
  232. </ul>
  233. </li>
  234. <li class="toctree-l1">
  235. <a class="reference internal" href="../quadrature/quadrature_index.html">
  236. Quadrature and cubature methods
  237. </a>
  238. </li>
  239. <li class="toctree-l1">
  240. <a class="reference internal" href="../postlin/postlin_index.html">
  241. Posterior linearization
  242. </a>
  243. </li>
  244. <li class="toctree-l1">
  245. <a class="reference internal" href="../adf/adf_index.html">
  246. Assumed Density Filtering
  247. </a>
  248. </li>
  249. <li class="toctree-l1">
  250. <a class="reference internal" href="../vi/vi_index.html">
  251. Variational inference
  252. </a>
  253. </li>
  254. <li class="toctree-l1">
  255. <a class="reference internal" href="../pf/pf_index.html">
  256. Particle filtering
  257. </a>
  258. </li>
  259. <li class="toctree-l1">
  260. <a class="reference internal" href="../smc/smc_index.html">
  261. Sequential Monte Carlo
  262. </a>
  263. </li>
  264. <li class="toctree-l1 has-children">
  265. <a class="reference internal" href="../learning/learning_index.html">
  266. Offline parameter estimation (learning)
  267. </a>
  268. <input class="toctree-checkbox" id="toctree-checkbox-6" name="toctree-checkbox-6" type="checkbox"/>
  269. <label for="toctree-checkbox-6">
  270. <i class="fas fa-chevron-down">
  271. </i>
  272. </label>
  273. <ul>
  274. <li class="toctree-l2">
  275. <a class="reference internal" href="../learning/em.html">
  276. Expectation Maximization (EM)
  277. </a>
  278. </li>
  279. <li class="toctree-l2">
  280. <a class="reference internal" href="../learning/sgd.html">
  281. Stochastic Gradient Descent (SGD)
  282. </a>
  283. </li>
  284. <li class="toctree-l2">
  285. <a class="reference internal" href="../learning/vb.html">
  286. Variational Bayes (VB)
  287. </a>
  288. </li>
  289. <li class="toctree-l2">
  290. <a class="reference internal" href="../learning/mcmc.html">
  291. Markov Chain Monte Carlo (MCMC)
  292. </a>
  293. </li>
  294. </ul>
  295. </li>
  296. <li class="toctree-l1">
  297. <a class="reference internal" href="../tracking/tracking_index.html">
  298. Multi-target tracking
  299. </a>
  300. </li>
  301. <li class="toctree-l1">
  302. <a class="reference internal" href="../ensemble/ensemble_index.html">
  303. Data assimilation using Ensemble Kalman filter
  304. </a>
  305. </li>
  306. <li class="toctree-l1">
  307. <a class="reference internal" href="../bnp/bnp_index.html">
  308. Bayesian non-parametric SSMs
  309. </a>
  310. </li>
  311. <li class="toctree-l1">
  312. <a class="reference internal" href="../changepoint/changepoint_index.html">
  313. Changepoint detection
  314. </a>
  315. </li>
  316. <li class="toctree-l1">
  317. <a class="reference internal" href="../timeseries/timeseries_index.html">
  318. Timeseries forecasting
  319. </a>
  320. </li>
  321. <li class="toctree-l1">
  322. <a class="reference internal" href="../gp/gp_index.html">
  323. Markovian Gaussian processes
  324. </a>
  325. </li>
  326. <li class="toctree-l1">
  327. <a class="reference internal" href="../ode/ode_index.html">
  328. Differential equations and SSMs
  329. </a>
  330. </li>
  331. <li class="toctree-l1">
  332. <a class="reference internal" href="../control/control_index.html">
  333. Optimal control
  334. </a>
  335. </li>
  336. <li class="toctree-l1">
  337. <a class="reference internal" href="../../bib.html">
  338. Bibliography
  339. </a>
  340. </li>
  341. </ul>
  342. </div>
  343. </nav> <!-- To handle the deprecated key -->
  344. <div class="navbar_extra_footer">
  345. Powered by <a href="https://jupyterbook.org">Jupyter Book</a>
  346. </div>
  347. </div>
  348. <main class="col py-md-3 pl-md-4 bd-content overflow-auto" role="main">
  349. <div class="topbar container-xl fixed-top">
  350. <div class="topbar-contents row">
  351. <div class="col-12 col-md-3 bd-topbar-whitespace site-navigation show"></div>
  352. <div class="col pl-md-4 topbar-main">
  353. <button id="navbar-toggler" class="navbar-toggler ml-0" type="button" data-toggle="collapse"
  354. data-toggle="tooltip" data-placement="bottom" data-target=".site-navigation" aria-controls="navbar-menu"
  355. aria-expanded="true" aria-label="Toggle navigation" aria-controls="site-navigation"
  356. title="Toggle navigation" data-toggle="tooltip" data-placement="left">
  357. <i class="fas fa-bars"></i>
  358. <i class="fas fa-arrow-left"></i>
  359. <i class="fas fa-arrow-up"></i>
  360. </button>
  361. <div class="dropdown-buttons-trigger">
  362. <button id="dropdown-buttons-trigger" class="btn btn-secondary topbarbtn" aria-label="Download this page"><i
  363. class="fas fa-download"></i></button>
  364. <div class="dropdown-buttons">
  365. <!-- ipynb file if we had a myst markdown file -->
  366. <!-- Download raw file -->
  367. <a class="dropdown-buttons" href="../../_sources/chapters/ssm/nlds.ipynb"><button type="button"
  368. class="btn btn-secondary topbarbtn" title="Download source file" data-toggle="tooltip"
  369. data-placement="left">.ipynb</button></a>
  370. <!-- Download PDF via print -->
  371. <button type="button" id="download-print" class="btn btn-secondary topbarbtn" title="Print to PDF"
  372. onclick="printPdf(this)" data-toggle="tooltip" data-placement="left">.pdf</button>
  373. </div>
  374. </div>
  375. <!-- Source interaction buttons -->
  376. <div class="dropdown-buttons-trigger">
  377. <button id="dropdown-buttons-trigger" class="btn btn-secondary topbarbtn"
  378. aria-label="Connect with source repository"><i class="fab fa-github"></i></button>
  379. <div class="dropdown-buttons sourcebuttons">
  380. <a class="repository-button"
  381. href="https://github.com/probml/ssm-book"><button type="button" class="btn btn-secondary topbarbtn"
  382. data-toggle="tooltip" data-placement="left" title="Source repository"><i
  383. class="fab fa-github"></i>repository</button></a>
  384. <a class="issues-button"
  385. href="https://github.com/probml/ssm-book/issues/new?title=Issue%20on%20page%20%2Fchapters/ssm/nlds.html&body=Your%20issue%20content%20here."><button
  386. type="button" class="btn btn-secondary topbarbtn" data-toggle="tooltip" data-placement="left"
  387. title="Open an issue"><i class="fas fa-lightbulb"></i>open issue</button></a>
  388. </div>
  389. </div>
  390. <!-- Full screen (wrap in <a> to have style consistency -->
  391. <a class="full-screen-button"><button type="button" class="btn btn-secondary topbarbtn" data-toggle="tooltip"
  392. data-placement="bottom" onclick="toggleFullScreen()" aria-label="Fullscreen mode"
  393. title="Fullscreen mode"><i
  394. class="fas fa-expand"></i></button></a>
  395. <!-- Launch buttons -->
  396. <div class="dropdown-buttons-trigger">
  397. <button id="dropdown-buttons-trigger" class="btn btn-secondary topbarbtn"
  398. aria-label="Launch interactive content"><i class="fas fa-rocket"></i></button>
  399. <div class="dropdown-buttons">
  400. <a class="binder-button" href="https://mybinder.org/v2/gh/probml/ssm-book/main?urlpath=tree/chapters/ssm/nlds.ipynb"><button type="button"
  401. class="btn btn-secondary topbarbtn" title="Launch Binder" data-toggle="tooltip"
  402. data-placement="left"><img class="binder-button-logo"
  403. src="../../_static/images/logo_binder.svg"
  404. alt="Interact on binder">Binder</button></a>
  405. <a class="colab-button" href="https://colab.research.google.com/github/probml/ssm-book/blob/main/chapters/ssm/nlds.ipynb"><button type="button" class="btn btn-secondary topbarbtn"
  406. title="Launch Colab" data-toggle="tooltip" data-placement="left"><img class="colab-button-logo"
  407. src="../../_static/images/logo_colab.png"
  408. alt="Interact on Colab">Colab</button></a>
  409. </div>
  410. </div>
  411. </div>
  412. <!-- Table of contents -->
  413. <div class="d-none d-md-block col-md-2 bd-toc show noprint">
  414. <div class="tocsection onthispage pt-5 pb-3">
  415. <i class="fas fa-list"></i> Contents
  416. </div>
  417. <nav id="bd-toc-nav" aria-label="Page">
  418. <ul class="visible nav section-nav flex-column">
  419. <li class="toc-h2 nav-item toc-entry">
  420. <a class="reference internal nav-link" href="#example-tracking-a-1d-pendulum">
  421. Example: tracking a 1d pendulum
  422. </a>
  423. </li>
  424. </ul>
  425. </nav>
  426. </div>
  427. </div>
  428. </div>
  429. <div id="main-content" class="row">
  430. <div class="col-12 col-md-9 pl-md-3 pr-md-0">
  431. <!-- Table of contents that is only displayed when printing the page -->
  432. <div id="jb-print-docs-body" class="onlyprint">
  433. <h1>Nonlinear Gaussian SSMs</h1>
  434. <!-- Table of contents -->
  435. <div id="print-main-content">
  436. <div id="jb-print-toc">
  437. <div>
  438. <h2> Contents </h2>
  439. </div>
  440. <nav aria-label="Page">
  441. <ul class="visible nav section-nav flex-column">
  442. <li class="toc-h2 nav-item toc-entry">
  443. <a class="reference internal nav-link" href="#example-tracking-a-1d-pendulum">
  444. Example: tracking a 1d pendulum
  445. </a>
  446. </li>
  447. </ul>
  448. </nav>
  449. </div>
  450. </div>
  451. </div>
  452. <div>
  453. <div class="cell docutils container">
  454. <div class="cell_input docutils container">
  455. <div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># meta-data does not work yet in VScode</span>
  456. <span class="c1"># https://github.com/microsoft/vscode-jupyter/issues/1121</span>
  457. <span class="p">{</span>
  458. <span class="s2">&quot;tags&quot;</span><span class="p">:</span> <span class="p">[</span>
  459. <span class="s2">&quot;hide-cell&quot;</span>
  460. <span class="p">]</span>
  461. <span class="p">}</span>
  462. <span class="c1">### Install necessary libraries</span>
  463. <span class="k">try</span><span class="p">:</span>
  464. <span class="kn">import</span> <span class="nn">jax</span>
  465. <span class="k">except</span><span class="p">:</span>
  466. <span class="c1"># For cuda version, see https://github.com/google/jax#installation</span>
  467. <span class="o">%</span><span class="k">pip</span> install --upgrade &quot;jax[cpu]&quot;
  468. <span class="kn">import</span> <span class="nn">jax</span>
  469. <span class="k">try</span><span class="p">:</span>
  470. <span class="kn">import</span> <span class="nn">distrax</span>
  471. <span class="k">except</span><span class="p">:</span>
  472. <span class="o">%</span><span class="k">pip</span> install --upgrade distrax
  473. <span class="kn">import</span> <span class="nn">distrax</span>
  474. <span class="k">try</span><span class="p">:</span>
  475. <span class="kn">import</span> <span class="nn">jsl</span>
  476. <span class="k">except</span><span class="p">:</span>
  477. <span class="o">%</span><span class="k">pip</span> install git+https://github.com/probml/jsl
  478. <span class="kn">import</span> <span class="nn">jsl</span>
  479. <span class="k">try</span><span class="p">:</span>
  480. <span class="kn">import</span> <span class="nn">rich</span>
  481. <span class="k">except</span><span class="p">:</span>
  482. <span class="o">%</span><span class="k">pip</span> install rich
  483. <span class="kn">import</span> <span class="nn">rich</span>
  484. </pre></div>
  485. </div>
  486. </div>
  487. </div>
  488. <div class="cell docutils container">
  489. <div class="cell_input docutils container">
  490. <div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="p">{</span>
  491. <span class="s2">&quot;tags&quot;</span><span class="p">:</span> <span class="p">[</span>
  492. <span class="s2">&quot;hide-cell&quot;</span>
  493. <span class="p">]</span>
  494. <span class="p">}</span>
  495. <span class="c1">### Import standard libraries</span>
  496. <span class="kn">import</span> <span class="nn">abc</span>
  497. <span class="kn">from</span> <span class="nn">dataclasses</span> <span class="kn">import</span> <span class="n">dataclass</span>
  498. <span class="kn">import</span> <span class="nn">functools</span>
  499. <span class="kn">import</span> <span class="nn">itertools</span>
  500. <span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">Any</span><span class="p">,</span> <span class="n">Callable</span><span class="p">,</span> <span class="n">NamedTuple</span><span class="p">,</span> <span class="n">Optional</span><span class="p">,</span> <span class="n">Union</span><span class="p">,</span> <span class="n">Tuple</span>
  501. <span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span>
  502. <span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
  503. <span class="kn">import</span> <span class="nn">jax</span>
  504. <span class="kn">import</span> <span class="nn">jax.numpy</span> <span class="k">as</span> <span class="nn">jnp</span>
  505. <span class="kn">from</span> <span class="nn">jax</span> <span class="kn">import</span> <span class="n">lax</span><span class="p">,</span> <span class="n">vmap</span><span class="p">,</span> <span class="n">jit</span><span class="p">,</span> <span class="n">grad</span>
  506. <span class="kn">from</span> <span class="nn">jax.scipy.special</span> <span class="kn">import</span> <span class="n">logit</span>
  507. <span class="kn">from</span> <span class="nn">jax.nn</span> <span class="kn">import</span> <span class="n">softmax</span>
  508. <span class="kn">from</span> <span class="nn">functools</span> <span class="kn">import</span> <span class="n">partial</span>
  509. <span class="kn">from</span> <span class="nn">jax.random</span> <span class="kn">import</span> <span class="n">PRNGKey</span><span class="p">,</span> <span class="n">split</span>
  510. <span class="kn">import</span> <span class="nn">inspect</span>
  511. <span class="kn">import</span> <span class="nn">inspect</span> <span class="k">as</span> <span class="nn">py_inspect</span>
  512. <span class="kn">import</span> <span class="nn">rich</span>
  513. <span class="kn">from</span> <span class="nn">rich</span> <span class="kn">import</span> <span class="n">inspect</span> <span class="k">as</span> <span class="n">r_inspect</span>
  514. <span class="kn">from</span> <span class="nn">rich</span> <span class="kn">import</span> <span class="nb">print</span> <span class="k">as</span> <span class="n">r_print</span>
  515. <span class="k">def</span> <span class="nf">print_source</span><span class="p">(</span><span class="n">fname</span><span class="p">):</span>
  516. <span class="n">r_print</span><span class="p">(</span><span class="n">py_inspect</span><span class="o">.</span><span class="n">getsource</span><span class="p">(</span><span class="n">fname</span><span class="p">))</span>
  517. </pre></div>
  518. </div>
  519. </div>
  520. </div>
  521. <div class="math notranslate nohighlight">
  522. \[ \begin{align}\begin{aligned}\newcommand\floor[1]{\lfloor#1\rfloor}\\\newcommand{\real}{\mathbb{R}}\\% Numbers
  523. \newcommand{\vzero}{\boldsymbol{0}}
  524. \newcommand{\vone}{\boldsymbol{1}}\\% Greek https://www.latex-tutorial.com/symbols/greek-alphabet/
  525. \newcommand{\valpha}{\boldsymbol{\alpha}}
  526. \newcommand{\vbeta}{\boldsymbol{\beta}}
  527. \newcommand{\vchi}{\boldsymbol{\chi}}
  528. \newcommand{\vdelta}{\boldsymbol{\delta}}
  529. \newcommand{\vDelta}{\boldsymbol{\Delta}}
  530. \newcommand{\vepsilon}{\boldsymbol{\epsilon}}
  531. \newcommand{\vzeta}{\boldsymbol{\zeta}}
  532. \newcommand{\vXi}{\boldsymbol{\Xi}}
  533. \newcommand{\vell}{\boldsymbol{\ell}}
  534. \newcommand{\veta}{\boldsymbol{\eta}}
  535. %\newcommand{\vEta}{\boldsymbol{\Eta}}
  536. \newcommand{\vgamma}{\boldsymbol{\gamma}}
  537. \newcommand{\vGamma}{\boldsymbol{\Gamma}}
  538. \newcommand{\vmu}{\boldsymbol{\mu}}
  539. \newcommand{\vmut}{\boldsymbol{\tilde{\mu}}}
  540. \newcommand{\vnu}{\boldsymbol{\nu}}
  541. \newcommand{\vkappa}{\boldsymbol{\kappa}}
  542. \newcommand{\vlambda}{\boldsymbol{\lambda}}
  543. \newcommand{\vLambda}{\boldsymbol{\Lambda}}
  544. \newcommand{\vLambdaBar}{\overline{\vLambda}}
  545. %\newcommand{\vnu}{\boldsymbol{\nu}}
  546. \newcommand{\vomega}{\boldsymbol{\omega}}
  547. \newcommand{\vOmega}{\boldsymbol{\Omega}}
  548. \newcommand{\vphi}{\boldsymbol{\phi}}
  549. \newcommand{\vvarphi}{\boldsymbol{\varphi}}
  550. \newcommand{\vPhi}{\boldsymbol{\Phi}}
  551. \newcommand{\vpi}{\boldsymbol{\pi}}
  552. \newcommand{\vPi}{\boldsymbol{\Pi}}
  553. \newcommand{\vpsi}{\boldsymbol{\psi}}
  554. \newcommand{\vPsi}{\boldsymbol{\Psi}}
  555. \newcommand{\vrho}{\boldsymbol{\rho}}
  556. \newcommand{\vtheta}{\boldsymbol{\theta}}
  557. \newcommand{\vthetat}{\boldsymbol{\tilde{\theta}}}
  558. \newcommand{\vTheta}{\boldsymbol{\Theta}}
  559. \newcommand{\vsigma}{\boldsymbol{\sigma}}
  560. \newcommand{\vSigma}{\boldsymbol{\Sigma}}
  561. \newcommand{\vSigmat}{\boldsymbol{\tilde{\Sigma}}}
  562. \newcommand{\vsigmoid}{\vsigma}
  563. \newcommand{\vtau}{\boldsymbol{\tau}}
  564. \newcommand{\vxi}{\boldsymbol{\xi}}\\
  565. % Lower Roman (Vectors)
  566. \newcommand{\va}{\mathbf{a}}
  567. \newcommand{\vb}{\mathbf{b}}
  568. \newcommand{\vBt}{\mathbf{\tilde{B}}}
  569. \newcommand{\vc}{\mathbf{c}}
  570. \newcommand{\vct}{\mathbf{\tilde{c}}}
  571. \newcommand{\vd}{\mathbf{d}}
  572. \newcommand{\ve}{\mathbf{e}}
  573. \newcommand{\vf}{\mathbf{f}}
  574. \newcommand{\vg}{\mathbf{g}}
  575. \newcommand{\vh}{\mathbf{h}}
  576. %\newcommand{\myvh}{\mathbf{h}}
  577. \newcommand{\vi}{\mathbf{i}}
  578. \newcommand{\vj}{\mathbf{j}}
  579. \newcommand{\vk}{\mathbf{k}}
  580. \newcommand{\vl}{\mathbf{l}}
  581. \newcommand{\vm}{\mathbf{m}}
  582. \newcommand{\vn}{\mathbf{n}}
  583. \newcommand{\vo}{\mathbf{o}}
  584. \newcommand{\vp}{\mathbf{p}}
  585. \newcommand{\vq}{\mathbf{q}}
  586. \newcommand{\vr}{\mathbf{r}}
  587. \newcommand{\vs}{\mathbf{s}}
  588. \newcommand{\vt}{\mathbf{t}}
  589. \newcommand{\vu}{\mathbf{u}}
  590. \newcommand{\vv}{\mathbf{v}}
  591. \newcommand{\vw}{\mathbf{w}}
  592. \newcommand{\vws}{\vw_s}
  593. \newcommand{\vwt}{\mathbf{\tilde{w}}}
  594. \newcommand{\vWt}{\mathbf{\tilde{W}}}
  595. \newcommand{\vwh}{\hat{\vw}}
  596. \newcommand{\vx}{\mathbf{x}}
  597. %\newcommand{\vx}{\mathbf{x}}
  598. \newcommand{\vxt}{\mathbf{\tilde{x}}}
  599. \newcommand{\vy}{\mathbf{y}}
  600. \newcommand{\vyt}{\mathbf{\tilde{y}}}
  601. \newcommand{\vz}{\mathbf{z}}
  602. %\newcommand{\vzt}{\mathbf{\tilde{z}}}\\
  603. % Upper Roman (Matrices)
  604. \newcommand{\vA}{\mathbf{A}}
  605. \newcommand{\vB}{\mathbf{B}}
  606. \newcommand{\vC}{\mathbf{C}}
  607. \newcommand{\vD}{\mathbf{D}}
  608. \newcommand{\vE}{\mathbf{E}}
  609. \newcommand{\vF}{\mathbf{F}}
  610. \newcommand{\vG}{\mathbf{G}}
  611. \newcommand{\vH}{\mathbf{H}}
  612. \newcommand{\vI}{\mathbf{I}}
  613. \newcommand{\vJ}{\mathbf{J}}
  614. \newcommand{\vK}{\mathbf{K}}
  615. \newcommand{\vL}{\mathbf{L}}
  616. \newcommand{\vM}{\mathbf{M}}
  617. \newcommand{\vMt}{\mathbf{\tilde{M}}}
  618. \newcommand{\vN}{\mathbf{N}}
  619. \newcommand{\vO}{\mathbf{O}}
  620. \newcommand{\vP}{\mathbf{P}}
  621. \newcommand{\vQ}{\mathbf{Q}}
  622. \newcommand{\vR}{\mathbf{R}}
  623. \newcommand{\vS}{\mathbf{S}}
  624. \newcommand{\vT}{\mathbf{T}}
  625. \newcommand{\vU}{\mathbf{U}}
  626. \newcommand{\vV}{\mathbf{V}}
  627. \newcommand{\vW}{\mathbf{W}}
  628. \newcommand{\vX}{\mathbf{X}}
  629. %\newcommand{\vXs}{\vX_{\vs}}
  630. \newcommand{\vXs}{\vX_{s}}
  631. \newcommand{\vXt}{\mathbf{\tilde{X}}}
  632. \newcommand{\vY}{\mathbf{Y}}
  633. \newcommand{\vZ}{\mathbf{Z}}
  634. \newcommand{\vZt}{\mathbf{\tilde{Z}}}
  635. \newcommand{\vzt}{\mathbf{\tilde{z}}}\\
  636. %%%%
  637. \newcommand{\hidden}{\vz}
  638. \newcommand{\hid}{\hidden}
  639. \newcommand{\observed}{\vy}
  640. \newcommand{\obs}{\observed}
  641. \newcommand{\inputs}{\vu}
  642. \newcommand{\input}{\inputs}\\\newcommand{\hmmTrans}{\vA}
  643. \newcommand{\hmmObs}{\vB}
  644. \newcommand{\hmmInit}{\vpi}
  645. \newcommand{\hmmhid}{\hidden}
  646. \newcommand{\hmmobs}{\obs}\\\newcommand{\ldsDyn}{\vA}
  647. \newcommand{\ldsObs}{\vC}
  648. \newcommand{\ldsDynIn}{\vB}
  649. \newcommand{\ldsObsIn}{\vD}
  650. \newcommand{\ldsDynNoise}{\vQ}
  651. \newcommand{\ldsObsNoise}{\vR}\\\newcommand{\ssmDynFn}{f}
  652. \newcommand{\ssmObsFn}{h}\\
  653. %%%
  654. \newcommand{\gauss}{\mathcal{N}}\\\newcommand{\diag}{\mathrm{diag}}\end{aligned}\end{align} \]</div>
  655. <div class="tex2jax_ignore mathjax_ignore section" id="nonlinear-gaussian-ssms">
  656. <span id="sec-nlds-intro"></span><h1>Nonlinear Gaussian SSMs<a class="headerlink" href="#nonlinear-gaussian-ssms" title="Permalink to this headline">¶</a></h1>
  657. <p>In this section, we consider SSMs in which the dynamics and/or observation models are nonlinear,
  658. but the process noise and observation noise are Gaussian.
  659. That is,</p>
  660. <div class="amsmath math notranslate nohighlight" id="equation-48c705c3-8479-4828-87b8-fd179fc23bc4">
  661. <span class="eqno">(11)<a class="headerlink" href="#equation-48c705c3-8479-4828-87b8-fd179fc23bc4" title="Permalink to this equation">¶</a></span>\[\begin{align}
  662. \hmmhid_t &amp;= \ssmDynFn(\hmmhid_{t-1}, \inputs_t) + \vepsilon_t \\
  663. \hmmobs_t &amp;= \ssmObsFn(\hmmhid_{t}, \inputs_t) + \veta_t
  664. \end{align}\]</div>
  665. <p>where <span class="math notranslate nohighlight">\(\vepsilon_t \sim \gauss(\vzero,\vQ_t)\)</span>
  666. and <span class="math notranslate nohighlight">\(\veta_t \sim \gauss(\vzero,\vR_t)\)</span>.
  667. This is a very widely used model class. We give some examples below.</p>
  668. <div class="section" id="example-tracking-a-1d-pendulum">
  669. <span id="sec-pendulum"></span><h2>Example: tracking a 1d pendulum<a class="headerlink" href="#example-tracking-a-1d-pendulum" title="Permalink to this headline">¶</a></h2>
  670. <div class="figure align-default" id="fig-pendulum">
  671. <a class="reference internal image-reference" href="../../_images/pendulum.png"><img alt="../../_images/pendulum.png" src="../../_images/pendulum.png" style="width: 132.5px; height: 147.5px;" /></a>
  672. <p class="caption"><span class="caption-number">Fig. 6 </span><span class="caption-text">Illustration of a pendulum swinging.
  673. <span class="math notranslate nohighlight">\(g\)</span> is the force of gravity,
  674. <span class="math notranslate nohighlight">\(w(t)\)</span> is a random external force,
  675. and <span class="math notranslate nohighlight">\(\alpha\)</span> is the angle wrt the vertical.
  676. Based on <span id="id1">[<a class="reference internal" href="../../bib.html#id18" title="Simo Sarkka. Bayesian Filtering and Smoothing. Cambridge University Press, 2013. URL: https://users.aalto.fi/~ssarkka/pub/cup_book_online_20131111.pdf.">Sar13</a>]</span> fig 3.10.</span><a class="headerlink" href="#fig-pendulum" title="Permalink to this image">¶</a></p>
  677. </div>
  678. <p>Consider a simple pendulum of unit mass and length swinging from
  679. a fixed attachment, as in
  680. <code class="xref std std-numref docutils literal notranslate"><span class="pre">Figure</span> <span class="pre">%s</span></code>.
  681. Such an object is in principle entirely deterministic in its behavior.
  682. However, in the real world, there are often unknown forces at work
  683. (e.g., air turbulence, friction).
  684. We will model these by a continuous time random Gaussian noise process <span class="math notranslate nohighlight">\(w(t)\)</span>.
  685. This gives rise to the following differential equation:</p>
  686. <div class="amsmath math notranslate nohighlight" id="equation-ce7cd5b9-026f-47f8-b6eb-aeb189d67e25">
  687. <span class="eqno">(12)<a class="headerlink" href="#equation-ce7cd5b9-026f-47f8-b6eb-aeb189d67e25" title="Permalink to this equation">¶</a></span>\[\begin{align}
  688. \frac{d^2 \alpha}{d t^2}
  689. = -g \sin(\alpha) + w(t)
  690. \end{align}\]</div>
  691. <p>We can write this as a nonlinear SSM by defining the state to be
  692. <span class="math notranslate nohighlight">\(z_1(t) = \alpha(t)\)</span> and <span class="math notranslate nohighlight">\(z_2(t) = d\alpha(t)/dt\)</span>.
  693. Thus</p>
  694. <div class="amsmath math notranslate nohighlight" id="equation-fdafb753-eac8-4deb-9ab4-5408727f28f7">
  695. <span class="eqno">(13)<a class="headerlink" href="#equation-fdafb753-eac8-4deb-9ab4-5408727f28f7" title="Permalink to this equation">¶</a></span>\[\begin{align}
  696. \frac{d \vz}{dt}
  697. = \begin{pmatrix} z_2 \\ -g \sin(z_1) \end{pmatrix}
  698. + \begin{pmatrix} 0 \\ 1 \end{pmatrix} w(t)
  699. \end{align}\]</div>
  700. <p>If we discretize this step size <span class="math notranslate nohighlight">\(\Delta\)</span>,
  701. we get the following
  702. formulation <span id="id2">[<a class="reference internal" href="../../bib.html#id18" title="Simo Sarkka. Bayesian Filtering and Smoothing. Cambridge University Press, 2013. URL: https://users.aalto.fi/~ssarkka/pub/cup_book_online_20131111.pdf.">Sar13</a>]</span> p74:</p>
  703. <div class="amsmath math notranslate nohighlight" id="equation-b07b597e-169c-4cc9-a403-ff0a210604e8">
  704. <span class="eqno">(14)<a class="headerlink" href="#equation-b07b597e-169c-4cc9-a403-ff0a210604e8" title="Permalink to this equation">¶</a></span>\[\begin{align}
  705. \underbrace{
  706. \begin{pmatrix} z_{1,t} \\ z_{2,t} \end{pmatrix}
  707. }_{\hmmhid_t}
  708. =
  709. \underbrace{
  710. \begin{pmatrix} z_{1,t-1} + z_{2,t-1} \Delta \\
  711. z_{2,t-1} -g \sin(z_{1,t-1}) \Delta \end{pmatrix}
  712. }_{\vf(\hmmhid_{t-1})}
  713. +\vq_{t-1}
  714. \end{align}\]</div>
  715. <p>where <span class="math notranslate nohighlight">\(\vq_{t-1} \sim \gauss(\vzero,\vQ)\)</span> with</p>
  716. <div class="amsmath math notranslate nohighlight" id="equation-45e5300e-4cc7-4e93-900a-875db0283ab1">
  717. <span class="eqno">(15)<a class="headerlink" href="#equation-45e5300e-4cc7-4e93-900a-875db0283ab1" title="Permalink to this equation">¶</a></span>\[\begin{align}
  718. \vQ = q^c \begin{pmatrix}
  719. \frac{\Delta^3}{3} &amp; \frac{\Delta^2}{2} \\
  720. \frac{\Delta^2}{2} &amp; \Delta
  721. \end{pmatrix}
  722. \end{align}\]</div>
  723. <p>where <span class="math notranslate nohighlight">\(q^c\)</span> is the spectral density (continuous time variance)
  724. of the continuous-time noise process.</p>
  725. <p>If we observe the angular position, we
  726. get the linear observation model</p>
  727. <div class="amsmath math notranslate nohighlight" id="equation-adb0a338-37f5-41ae-93d3-b2f9a1a35350">
  728. <span class="eqno">(16)<a class="headerlink" href="#equation-adb0a338-37f5-41ae-93d3-b2f9a1a35350" title="Permalink to this equation">¶</a></span>\[\begin{align}
  729. y_t = \alpha_t + r_t = h(\hmmhid_t) + r_t
  730. \end{align}\]</div>
  731. <p>where <span class="math notranslate nohighlight">\(h(\hmmhid_t) = z_{1,t}\)</span>
  732. and <span class="math notranslate nohighlight">\(r_t\)</span> is the observation noise.
  733. If we only observe the horizontal position,
  734. we get the nonlinear observation model</p>
  735. <div class="amsmath math notranslate nohighlight" id="equation-94cc9e21-b503-4b95-b6cd-7a6bffccae45">
  736. <span class="eqno">(17)<a class="headerlink" href="#equation-94cc9e21-b503-4b95-b6cd-7a6bffccae45" title="Permalink to this equation">¶</a></span>\[\begin{align}
  737. y_t = \sin(\alpha_t) + r_t = h(\hmmhid_t) + r_t
  738. \end{align}\]</div>
  739. <p>where <span class="math notranslate nohighlight">\(h(\hmmhid_t) = \sin(z_{1,t})\)</span>.</p>
  740. </div>
  741. </div>
  742. <script type="text/x-thebe-config">
  743. {
  744. requestKernel: true,
  745. binderOptions: {
  746. repo: "binder-examples/jupyter-stacks-datascience",
  747. ref: "master",
  748. },
  749. codeMirrorConfig: {
  750. theme: "abcdef",
  751. mode: "python"
  752. },
  753. kernelOptions: {
  754. kernelName: "python3",
  755. path: "./chapters/ssm"
  756. },
  757. predefinedOutput: true
  758. }
  759. </script>
  760. <script>kernelName = 'python3'</script>
  761. </div>
  762. <!-- Previous / next buttons -->
  763. <div class='prev-next-area'>
  764. <a class='left-prev' id="prev-link" href="lds.html" title="previous page">
  765. <i class="fas fa-angle-left"></i>
  766. <div class="prev-next-info">
  767. <p class="prev-next-subtitle">previous</p>
  768. <p class="prev-next-title">Linear Gaussian SSMs</p>
  769. </div>
  770. </a>
  771. <a class='right-next' id="next-link" href="inference.html" title="next page">
  772. <div class="prev-next-info">
  773. <p class="prev-next-subtitle">next</p>
  774. <p class="prev-next-title">Inferential goals</p>
  775. </div>
  776. <i class="fas fa-angle-right"></i>
  777. </a>
  778. </div>
  779. </div>
  780. </div>
  781. <footer class="footer">
  782. <p>
  783. By Kevin Murphy, Scott Linderman, et al.<br/>
  784. &copy; Copyright 2021.<br/>
  785. </p>
  786. </footer>
  787. </main>
  788. </div>
  789. </div>
  790. <script src="../../_static/js/index.be7d3bbb2ef33a8344ce.js"></script>
  791. </body>
  792. </html>