{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "view-in-github",
"slideshow": {
"slide_type": "skip"
},
"tags": [
"no-tex"
]
},
"source": [
"\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"id": "JoW4C_OkOMhe",
"slideshow": {
"slide_type": "skip"
},
"tags": [
"remove-cell"
]
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Note: you may need to restart the kernel to use updated packages.\n"
]
}
],
"source": [
"%pip install -q -U gtbook\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"id": "10-snNDwOSuC",
"slideshow": {
"slide_type": "skip"
},
"tags": [
"remove-cell"
]
},
"outputs": [],
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"import gtsam\n",
"\n",
"import plotly.graph_objs as go\n",
"import plotly.express as px\n",
"try:\n",
" import google.colab\n",
"except:\n",
" import plotly.io as pio\n",
" pio.renderers.default = \"png\"\n",
"\n",
"from gtbook.discrete import Variables\n",
"from gtbook.display import pretty, show\n",
"\n",
"# recap from S11:\n",
"variables = Variables()\n",
"categories = [\"cardboard\", \"paper\", \"can\", \"scrap metal\", \"bottle\"]\n",
"Category = variables.discrete(\"Category\", categories)\n"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {
"id": "nAvx4-UCNzt2",
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Learning\n",
"\n",
"> We can learn prior and sensor models from data we collect.\n",
"\n",
"\n",
"
"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "tSvXl_mnYeJ_",
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"At various times in this chapter we seemed to pull information out of thin air. But the various probabilistic models we used can be *learned* from data. This is what we will discuss below:\n",
"\n",
"- In Section 2.1 we talked about priors over state. Here we will estimate prior from counts, and introduce the idea of adding \"bogus counts\" in the case that we do not have a lot of data.\n",
"- In section 2.3 we discussed sensor models. Below we estimate those sensor models from counts recorded for each of the possible states.\n",
"- Counting works for discrete sensors, but for continuous sensors we have to a bit more work. We will end this section by showing how to fit simple Gaussian sensor models to data.\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "HyMNgnbNYeJ_",
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"## Estimating a Discrete PMF\n",
"\n",
"> Count the occurrences for each category."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ER8xW_d2HmHR",
"slideshow": {
"slide_type": "skip"
}
},
"source": [
"In section 1 we introduced the notion of a probability mass function (PMF) to characterize the *a priori* probability of being in a certain state. It turns out that the *normalized counts* we obtain when observing states over a long time period is a good approximation for the PMF. The more samples that go in, the better the approximation.\n",
"\n",
"As an example, let us assume that, at a *different* trash sorting cell, we observe for a while and note the category for each piece of trash, recording as we go. We might see something like:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"id": "Gmnf89Q7YeJ_",
"slideshow": {
"slide_type": "-"
}
},
"outputs": [],
"source": [
"data = [1, 1, 1, 2, 1, 1, 1, 3, 0, 0, 0, 1,\n",
" 2, 2, 2, 2, 4, 4, 4, 1, 1, 2, 1, 2, 1]\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "LtttAWbHZgZ7",
"slideshow": {
"slide_type": "skip"
}
},
"source": [
"Using `numpy` we can get the counts using the [`bincount`](https://numpy.org/doc/stable/reference/generated/numpy.bincount.html) function. We then plot the counts using `plotly.express`:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 542
},
"id": "pxBtzSjmZqR0",
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"data": {
"image/png": "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"
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"#| caption: Counts of each category in the data.\n",
"#| label: fig:counts_of_categories\n",
"counts = np.bincount(data)\n",
"px.bar(x=categories, y=counts)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "c4Jt2Mwrat5Q",
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"We can then estimate the probability of each category $c_k$ simply by dividing the count $N_k$ by the number of data points $N$:\n",
"\n",
"$$P(x_k) \\approx \\frac{N_k}{N}$$\n",
"\n",
"In our example:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "wLX116r9aNdW",
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Counts: [ 3 11 7 1 3]\n",
"Estimated PMF: [0.12 0.44 0.28 0.04 0.12]\n"
]
}
],
"source": [
"estimated_pmf = counts/sum(counts)\n",
"print(f\"Counts: {counts}\\nEstimated PMF: {estimated_pmf}\")"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "tTucUZMYbkX5",
"slideshow": {
"slide_type": "skip"
}
},
"source": [
"We can now easily turn this into a GTSAM discrete prior for pretty-printing:\n"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 175
},
"id": "NrfBXCjqbFVa",
"slideshow": {
"slide_type": "skip"
}
},
"outputs": [
{
"data": {
"text/html": [
"
P(Category):
\n", "Category | value |
---|---|
cardboard | 0.12 |
paper | 0.44 |
can | 0.28 |
scrap metal | 0.04 |
bottle | 0.12 |
P(Category):
\n", "Category | value |
---|---|
cardboard | 0.12 |
paper | 0.44 |
can | 0.28 |
scrap metal | 0.04 |
bottle | 0.12 |
\n", " | raw | \n", "smoothed | \n", "
---|---|---|
cardboard | \n", "0.12 | \n", "0.133333 | \n", "
paper | \n", "0.44 | \n", "0.400000 | \n", "
can | \n", "0.28 | \n", "0.266667 | \n", "
scrap metal | \n", "0.04 | \n", "0.066667 | \n", "
bottle | \n", "0.12 | \n", "0.133333 | \n", "
P(Conductivity|Category):
\n", "Category | false | true |
---|---|---|
cardboard | 0.8 | 0.2 |
paper | 0.4 | 0.6 |
can | 0.75 | 0.25 |
scrap metal | 0.4 | 0.6 |
bottle | 0.5 | 0.5 |
P(ThreeValued|Category):
\n", "Category | Value1 | Value2 | Value3 |
---|---|---|---|
cardboard | 0.1 | 0.7 | 0.2 |
paper | 0.2 | 0.2 | 0.6 |
can | 0.125 | 0.625 | 0.25 |
scrap metal | 0.4 | 0.4 | 0.2 |
bottle | 0.25 | 0.25 | 0.5 |