{ "cells": [ { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Regression" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Preliminaries\n", "\n", "- Goal \n", " - Introduction to Bayesian (Linear) Regression\n", "- Materials \n", " - Mandatory\n", " - These lecture notes\n", " - Optional\n", " - Bishop pp. 152-158 \n", " - In this and forthcoming lectures, we will make use of some elementary matrix calculus. The most important formulas are summarized at the bottom of this notebook in an [OPTIONAL SLIDE on matrix calculus](#matrix-calculus).\n", " " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Regression - Illustration\n", "\n", "\n", "

\n", "\n", "Given a set of (noisy) data measurements, find the 'best' relation between an input variable $x \\in \\mathbb{R}^D$ and input-dependent outcomes $y \\in \\mathbb{R}$\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Regression vs Density Estimation\n", "\n", "\n", "- Observe $N$ IID data **pairs** $D=\\{(x_1,y_1),\\dotsc,(x_N,y_N)\\}$ with $x_n \\in \\mathbb{R}^M$ and $y_n \\in \\mathbb{R}$." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Assume that we are interested in (a model for) the responses $y_n$ for **given inputs** $x_n$?, I.o.w. we are interested in building a model for the conditional distribution $p(y|x)$." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Note that, since $p(x,y)=p(y|x)\\, p(x)$, building a model $p(y|x)$ is similar to density estimation with the assumption that $x$ is drawn from a uniform distribution." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Bayesian Linear Regression\n", "\n", "- Next, we discuss (1) model specification, (2) Inference and (3) a prediction application for a Bayesian linear regression problem. " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "##### 1. Model Specification\n", "\n", "\n", "- In a _regression_ model, we try to 'explain the data' by a purely deterministic term $f(x_n,w)$, plus a purely random term $\\epsilon_n$ for 'unexplained noise',\n", "\n", " $$\n", " y_n = f(x_n,w) + \\epsilon_n\n", " $$" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- In a _linear regression_ model, i.e., linear w.r.t. the parameters $w$, we assume that \n", "$$f(x_n,w)= \\sum_{j=0}^{M-1} w_j \\phi_j(x_n) = w^T \\phi(x_n)$$\n", "where $\\phi_j(x)$ are called basis functions.\n", " - For notational simplicity, from now on we will assume $f(x_n,w) = w^T x_n$, with $x_n \\in \\mathbb{R}^M$." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- In _ordinary linear regression_ , the noise process $\\epsilon_n$ is zero-mean Gaussian with constant variance, i.e.\n", "$$\n", "y_n = w^T x_n + \\mathcal{N}(0,\\beta^{-1}) \\,.\n", "$$" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Hence, given a data set $D=\\{(x_1,y_1),\\dotsc,(x_N,y_N)\\}$, the likelihood for an ordinary linear regression model is \n", "\n", "$$\\begin{align*}\n", "p(y\\,|\\,\\mathbf{X},w,\\beta) &= \\mathcal{N}(y\\,|\\,\\mathbf{X} w,\\beta^{-1} \\mathbf{I}) \\\\\n", " &= \\prod_n \\mathcal{N}(y_n\\,|\\,w^T x_n,\\beta^{-1}) \\tag{B-3.10}\n", "\\end{align*}$$\n", "\n", "where $w = \\left(\\begin{matrix} w_1 \\\\ w_2 \\\\ \\vdots \\\\ w_{M} \\end{matrix} \\right)$, the $(N\\times M)$-dim matrix $\\mathbf{X} = \\left(\\begin{matrix}x_1^T \\\\ x_2^T \\\\ \\vdots \\\\ x_N^T \\end{matrix} \\right) = \\left(\\begin{matrix}x_{11},x_{12},\\dots,x_{1M}\\\\ x_{21},x_{22},\\dots,x_{2M} \\\\ \\vdots \\\\ x_{N1},x_{N2},\\dots,x_{NM} \\end{matrix} \\right) $ and $y = \\left(\\begin{matrix} y_1 \\\\ y_2 \\\\ \\vdots \\\\ y_N \\end{matrix} \\right)$.\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- For full Bayesian learning we should also choose a prior $p(w)$:\n", "\n", "$$\\begin{equation}\n", "p(w\\,|\\,\\alpha) = \\mathcal{N}(w\\,|\\,0,\\alpha^{-1}\\mathbf{I}) \\tag{B-3.52}\n", "\\end{equation}$$\n", "\n", "- For simplicity, we will assume that $\\alpha$ and $\\beta$ are known. \n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "##### 2. Inference\n", "\n", "- We'll do Bayesian inference for the parameters $w$. \n", "\n", "$$\\begin{align*}\n", "p(w|D) &\\propto p(D|w)\\cdot p(w) \\\\\n", " &= \\mathcal{N}(y\\,|\\,\\mathbf{X} w,\\beta^{-1} \\mathbf{I}) \\cdot \\mathcal{N}(w\\,|\\,0,\\alpha^{-1}\\mathbf{I}) \\\\\n", " &\\propto \\exp \\big( -\\frac{\\beta}{2} \\big( {y - \\mathbf{X}w } \\big)^T \\big( {y - \\mathbf{X}w } \\big) - \\frac{\\alpha}{2}w^T w \\big)\\tag{B-3.55} \\\\\n", " &= \\exp\\big( -\\frac{1}{2} w^T\\big(\\underbrace{\\beta \\mathbf{X}^T\\mathbf{X} + \\alpha \\mathbf{I}}_{\\Lambda_N}\\big)w + \\big(\\underbrace{\\beta \\mathbf{X}^Ty}_{\\eta_N}\\big)^T w - \\frac{\\beta}{2}y^T y \\big) \\\\\n", " &\\propto \\mathcal{N}_c\\left(w\\,|\\,\\eta_N,\\Lambda_N \\right)\n", "\\end{align*}$$\n", "\n", "with natural parameters (see the [natural parameterization of Gaussian](https://nbviewer.jupyter.org/github/bertdv/BMLIP/blob/master/lessons/notebooks/The-Gaussian-Distribution.ipynb#natural-parameterization)):\n", "\n", "$$\\begin{align*}\n", "\\eta_N &= \\beta\\mathbf{X}^Ty \\\\\n", "\\Lambda_N &= \\beta \\mathbf{X}^T\\mathbf{X} + \\alpha \\mathbf{I}\n", "\\end{align*}$$\n", "\n", "- Or equivalently (in the moment parameterization of the Gaussian):\n", "$$\\begin{align*}\n", "p(w|D) &= \\mathcal{N}\\left(w\\,|\\,m_N,S_N \\right) \\tag{B-3.49} \\\\\n", "m_N &= \\beta S_N \\mathbf{X}^T y \\tag{B-3.53}\\\\\n", "S_N &= \\left(\\alpha \\mathbf{I} + \\beta \\mathbf{X}^T \\mathbf{X}\\right)^{-1} \\tag{B-3.54}\n", "\\end{align*}$$\n", "\n", "- Note that B-3.53 and B-3.54 combine to\n", "$$\n", "m_N = \\left(\\frac{\\alpha}{\\beta}\\mathbf{I} + \\mathbf{X}^T \\mathbf{X} \\right)^{-1} \\mathbf{X}^T y\\,.\n", "$$\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ " - (Bishop Fig.3.7) Illustration of sequential Bayesian learning for a simple linear model of the form $y(x, w) =\n", "w_0 + w_1 x$. (Bishop Fig.3.7, detailed description at Bishop, pg.154.)\n", "\n", "

" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "##### 3. Application: predictive distribution\n", "\n", "\n", "- Assume we are interested in the distribution $p(y_\\bullet \\,|\\, x_\\bullet, D)$ for a new input $x_\\bullet$. This can be worked out as (exercise B-3.10)\n", "\n", "$$\\begin{align*}\n", "p(y_\\bullet \\,|\\, x_\\bullet, D) &= \\int p(y_\\bullet \\,|\\, x_\\bullet, w) p(w\\,|\\,D)\\,\\mathrm{d}w \\\\\n", "&= \\int \\mathcal{N}(y_\\bullet \\,|\\, w^T x_\\bullet, \\beta^{-1}) \\mathcal{N}(w\\,|\\,m_N,S_N)\\,\\mathrm{d}w \\\\\n", "&= \\int \\mathcal{N}(y_\\bullet \\,|\\, z, \\beta^{-1}) \\mathcal{N}(z\\,|\\,x_\\bullet^T m_N,x_\\bullet^T S_N x_\\bullet)\\,\\mathrm{d}z \\quad \\text{(sub. }z=x_\\bullet^T w \\text{)} \\\\\n", "&= \\int \\underbrace{\\mathcal{N}(z \\,|\\, y_\\bullet, \\beta^{-1}) \\mathcal{N}(z\\,|\\,x_\\bullet^T m_N,x_\\bullet^T S_N x_\\bullet)}_{\\text{Use Gaussian product formula SRG-6}}\\,\\mathrm{d}z \\\\\n", "&= \\int \\mathcal{N}\\left(y_\\bullet\\,|\\, m_N^T x_\\bullet, \\sigma_N^2(x_\\bullet) \\right) \\underbrace{\\mathcal{N}\\left(z\\,|\\, m_z, S_z\\right)}_{\\text{integrate this out}} \\mathrm{d}z\\\\\n", "&= \\mathcal{N}\\left(y_\\bullet\\,|\\, m_N^T x_\\bullet, \\sigma_N^2(x_\\bullet) \\right)\n", "\\end{align*}$$\n", "with\n", "$$\\begin{align*}\n", "\\sigma_N^2(x_\\bullet) = \\beta^{-1} + x^T_\\bullet S_N x_\\bullet \\tag{B-3.59}\n", "\\end{align*}$$\n", "\n", "- So, the uncertainty $\\sigma_N^2(x_\\bullet)$ about the output contains comprises both uncertainty about the process ($\\beta^{-1}$) and about the model parameters ($x^T_\\bullet S_N x_\\bullet$). " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Example Predictive Distribution\n", "\n", "- As an example, let's do Bayesian Linear Regression for a synthetic sinusoidal data set and a model with 9 Gaussian basis functions \n", "$$\\begin{align*}\n", "y &=\\sum_{m=1}^9 w_m \\phi_m(x_n) + \\mathcal{N}(0,\\beta^{-1}) \\\\\n", "\\phi_m(x_n) &= \\exp\\left( \\frac{x_n-\\mu_m}{\\sigma^2}\\right)\n", "\\end{align*}$$\n", "\n", "

\n", "\n", "- The predictive distributions for $y$ are shown in the following plots (Bishop, Fig.3.8)\n", "

\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "- And some plots of draws of posteriors for the functions $w^T \\phi(x)$ (Bishop, Fig.3.9) \n", "\n", "

" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Maximum Likelihood Estimation for Linear Regression Model\n", "\n", "- Recall the posterior mean for the weight vector\n", "$$\n", "m_N = \\left(\\frac{\\alpha}{\\beta}\\mathbf{I} + \\mathbf{X}^T \\mathbf{X} \\right)^{-1} \\mathbf{X}^T y\n", "$$\n", "where $\\alpha$ is the prior precision for the weights." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- The Maximum Likelihood solution for $w$ is obtained by letting $\\alpha \\rightarrow 0$, which leads to \n", "\n", "$$\\begin{equation*}\n", "\\hat w_{\\text{ML}} = (\\mathbf{X}^T \\mathbf{X})^{-1} \\mathbf{X}^T y\n", "\\end{equation*}$$" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- The matrix $\\mathbf{X}^\\dagger \\equiv (\\mathbf{X}^T \\mathbf{X})^{-1}\\mathbf{X}^T$ is also known as the **Moore-Penrose pseudo-inverse** (which is sort-of-an-inverse for non-square matrices)." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Note that if we have fewer training samples than input dimensions, i.e., if $Ngradient \n", "$ \\frac{\\partial \\left( {y - \\mathbf{X}w } \\right)^T \\left( {y - \\mathbf{X}w } \\right)}{\\partial w} = -2 \\mathbf{X}^T \\left(y - \\mathbf{X} w \\right)\n", "$ to zero yields the so-called **normal equations** \n", "$\\mathbf{X}^T\\mathbf{X} \\hat w_{\\text{LS}} = \\mathbf{X}^T y$ and consequently\n", "\n", "$$\n", "\\hat w_{\\text{LS}} = (\\mathbf{X}^T \\mathbf{X})^{-1} \\mathbf{X}^T y\n", "$$\n", "\n", "which is the same answer as we got for the maximum likelihood weights $\\hat w_{\\text{ML}}$." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- $\\Rightarrow$ Least-squares regression ($\\hat w_{\\text{LS}}$) corresponds to the (probabilistic) maximum likelihood solution ($\\hat w_{\\text{ML}}$) if the probabilistic model includes the following assumptions:\n", " 1. The observations are independently and identically distributed (**IID**) (this determines how errors are combined), and\n", " 1. The noise signal $\\epsilon_n \\sim \\mathcal{N}(0,\\,\\beta^{-1})$ is **Gaussian** distributed (determines the error metric) \n", " " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- If you use the Least-Squares method, you cannot see (nor modify) these assumptions. The probabilistic method forces you to state all assumptions explicitly! " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Not Identically Distributed Data\n", "\n", "- Let's do an example regarding changing our assumptions. What if we assume that the variance of the measurement error varies with the sampling index, $\\epsilon_n \\sim \\mathcal{N}(0,\\beta_n^{-1})$?" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- The likelihood is now (using $\\Lambda \\triangleq \\mathrm{diag}(\\beta_n)$ )\n", "$$\n", "p(y\\,|\\,\\mathbf{X},w,\\Lambda) = \\mathcal{N}(y\\,|\\,\\mathbf{X} w,\\Lambda^{-1} ) \\,.\n", "$$" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Combining this likelihood with the prior $p(w) = \\mathcal{N}(w\\,|\\,0,\\alpha^{-1}\\mathbf{I})$ leads to a posterior\n", "\n", "$$\\begin{align*}\n", "p(w|D) &\\propto p(D|w)\\cdot p(w) \\\\\n", " &= \\mathcal{N}(y\\,|\\,\\mathbf{X} w,\\Lambda^{-1} \\mathbf{I}) \\cdot \\mathcal{N}(w\\,|\\,0,\\alpha^{-1}\\mathbf{I}) \\\\\n", " &\\propto \\exp \\left\\{ \\frac{1}{2} \\left( {y - \\mathbf{X}w } \\right)^T \\Lambda \\left( {y - \\mathbf{X}w } \\right) + \\frac{\\alpha}{2}w^T w \\right\\} \\\\\n", " &\\propto \\mathcal{N}\\left(w\\,|\\,m_N,S_N \\right) \n", "\\end{align*}$$\n", "with\n", "$$\\begin{align*}\n", "m_N &= S_N \\mathbf{X}^T \\Lambda y \\\\\n", "S_N &= \\left(\\alpha \\mathbf{I} + \\mathbf{X}^T \\Lambda \\mathbf{X}\\right)^{-1} \n", "\\end{align*}$$\n", "\n", "- And maximum likelihood solution \n", "$$\n", "\\hat{w}_{\\text{ML}} = \\left. m_N\\right|_{\\alpha \\rightarrow 0} = \\left(\\mathbf{X}^T \\Lambda \\mathbf{X}\\right)^{-1} \\mathbf{X}^T \\Lambda y\n", "$$" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- This maximum likelihood solution is also called the **Weighted Least Squares** (WLS) solution. (Note that we just stumbled upon it, the crucial aspect is appropriate model specification!)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Note also that the dimension of $\\Lambda$ grows with the number of data points. In general, models for which the number of parameters grow as the number of observations increase are called **non-parametric models**." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Code Example: Least Squares vs Weighted Least Squares\n", "\n", "- We'll compare the Least Squares and Weighted Least Squares solutions for a simple linear regression model with input-dependent noise:\n", "\n", "$$\\begin{align*}\n", "x &\\sim \\text{Unif}[0,1]\\\\\n", "y|x &\\sim \\mathcal{N}(f(x), v(x))\\\\\n", "f(x) &= 5x - 2\\\\\n", "v(x) &= 10e^{2x^2}-9.5\\\\\n", "\\mathcal{D} &= \\{(x_1,y_1),\\ldots,(x_N,y_N)\\}\n", "\\end{align*}$$" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "using Pkg;Pkg.activate(\"probprog/workspace/\");Pkg.instantiate();\n", "IJulia.clear_output();" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "Figure(PyObject
)" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "using PyPlot, LinearAlgebra\n", "\n", "# Model specification: y|x ~ 𝒩(f(x), v(x))\n", "f(x) = 5*x .- 2 \n", "v(x) = 10*exp.(2*x.^2) .- 9.5 # input dependent noise variance\n", "x_test = [0.0, 1.0]\n", "plot(x_test, f(x_test), \"k--\") # plot f(x)\n", "\n", "# Generate N samples (x,y), where x ~ Unif[0,1]\n", "N = 50\n", "x = rand(N)\n", "y = f(x) + sqrt.(v(x)) .* randn(N)\n", "plot(x, y, \"kx\"); xlabel(\"x\"); ylabel(\"y\") # Plot samples\n", "\n", "# Add constant to input so we can estimate both the offset and the slope\n", "_x = [x ones(N)]\n", "_x_test = hcat(x_test, ones(2))\n", "\n", "# LS regression\n", "w_ls = pinv(_x) * y\n", "plot(x_test, _x_test*w_ls, \"b-\") # plot LS solution\n", "\n", "# Weighted LS regression\n", "W = Diagonal(1 ./ v(x)) # weight matrix\n", "w_wls = inv(_x'*W*_x) * _x' * W * y\n", "plot(x_test, _x_test*w_wls, \"r-\") # plot WLS solution\n", "ylim([-5,8]); legend([\"f(x)\", \"D\", \"LS linear regr.\", \"WLS linear regr.\"],loc=2);" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "##
OPTIONAL SLIDES
" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Some Useful Matrix Calculus\n", "\n", "When doing derivatives with matrices, e.g. for maximum likelihood estimation, it will be helpful to be familiar with some matrix calculus. We shortly recapitulate used formulas here. \n", "\n", "- We define the **gradient** of a scalar function $f(A)$ w.r.t. an $n \\times k$ matrix $A$ as\n", "$$\n", "\\nabla_A f \\triangleq\n", " \\begin{bmatrix}\n", "\\frac{\\partial{f}}{\\partial a_{11}} & \\frac{\\partial{f}}{\\partial a_{12}} & \\cdots & \\frac{\\partial{f}}{\\partial a_{1k}}\\\\\n", "\\frac{\\partial{f}}{\\partial a_{21}} & \\frac{\\partial{f}}{\\partial a_{22}} & \\cdots & \\frac{\\partial{f}}{\\partial a_{2k}}\\\\\n", "\\vdots & \\vdots & \\cdots & \\vdots\\\\\n", "\\frac{\\partial{f}}{\\partial a_{n1}} & \\frac{\\partial{f}}{\\partial a_{n2}} & \\cdots & \\frac{\\partial{f}}{\\partial a_{nk}}\n", " \\end{bmatrix}\n", "$$\n", " \n", "\n", " \n", "- The following formulas are useful (see Bishop App.-C)\n", "$$\\begin{align*}\n", "|A^{-1}|&=|A|^{-1} \\tag{B-C.4} \\\\\n", "\\nabla_A \\log |A| &= (A^{T})^{-1} = (A^{-1})^T \\tag{B-C.28} \\\\\n", "\\mathrm{Tr}[ABC]&= \\mathrm{Tr}[CAB] = \\mathrm{Tr}[BCA] \\tag{B-C.9} \\\\\n", "\\nabla_A \\mathrm{Tr}[AB] &=\\nabla_A \\mathrm{Tr}[BA]= B^T \\tag{B-C.25} \\\\\n", "\\nabla_A \\mathrm{Tr}[ABA^T] &= A(B+B^T) \\tag{B-C.27}\\\\\n", " \\nabla_x x^TAx &= (A+A^T)x \\tag{from B-C.27}\\\\\n", "\\nabla_X a^TXb &= \\nabla_X \\mathrm{Tr}[ba^TX] = ab^T \\notag\n", "\\end{align*}$$" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 8, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "open(\"../../styles/aipstyle.html\") do f\n", " display(\"text/html\", read(f, String))\n", "end" ] } ], "metadata": { "@webio": { "lastCommId": null, "lastKernelId": null }, "anaconda-cloud": {}, "celltoolbar": "Raw Cell Format", "kernelspec": { "display_name": "Julia 1.5.2", "language": "julia", "name": "julia-1.5" }, "language_info": { "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", "version": "1.5.2" } }, "nbformat": 4, "nbformat_minor": 4 }