{ "cells": [ { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Uczenie maszynowe – zastosowania\n", "# 8. Uczenie nienadzorowane" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "Wyobraźmy sobie, że mamy następujący problem:\n", "\n", "Mamy zbiór okazów roślin i dysponujemy pewnymi danymi na ich temat (długość płatków kwiatów, ich szerokość itp.), ale zupełnie **nie wiemy**, do jakich gatunków one należą (nie wiemy nawet, ile jest tych gatunków).\n", "\n", "Chcemy automatycznie podzielić zbiór posiadanych okazów na nie więcej niż $k$ grup (klastrów) ($k$ ustalamy z góry), czyli dokonać **grupowania (klastrowania)** zbioru przykładów.\n", "\n", "Jest to zagadnienie z kategorii uczenia nienadzorowanego.\n", "\n", "W celu jego rozwiązania użyjemy algorytmu $k$ średnich." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## 8.1. Algorytm $k$ średnich" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "slideshow": { "slide_type": "notes" } }, "outputs": [], "source": [ "# Przydatne importy\n", "\n", "import ipywidgets as widgets\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import pandas\n", "import random\n", "import seaborn\n", "\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "slideshow": { "slide_type": "notes" } }, "outputs": [], "source": [ "# Wczytanie danych (gatunki kosaćców)\n", "\n", "data_iris_raw = pandas.read_csv('iris.csv')\n", "data_iris = pandas.DataFrame()\n", "data_iris['x1'] = data_iris_raw['sl']\n", "data_iris['x2'] = data_iris_raw['sw']\n", "data_iris['x3'] = data_iris_raw['pl']\n", "data_iris['x4'] = data_iris_raw['sw']\n", "\n", "# Nie używamy w ogóle kolumny ostatniej kolumny (\"Gatunek\"), \n", "# ponieważ chcemy dokonać uczenia nienadzorowanego.\n", "# Przyjmujemy, że w ogóle nie dysponujemy danymi na temat gatunku,\n", "# mamy tylko 150 nieznanych roślin.\n", "\n", "X = data_iris.values\n", "Xs = data_iris.values[:, 2:4]" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "slideshow": { "slide_type": "notes" } }, "outputs": [], "source": [ "# Wykres danych\n", "def plot_unlabeled_data(X, col1=0, col2=1, x1label=r'$x_1$', x2label=r'$x_2$'): \n", " fig = plt.figure(figsize=(16*.7, 9*.7))\n", " ax = fig.add_subplot(111)\n", " fig.subplots_adjust(left=0.1, right=0.9, bottom=0.1, top=0.9)\n", " X1 = X[:, col1].tolist()\n", " X2 = X[:, col2].tolist()\n", " ax.scatter(X1, X2, c='k', marker='o', s=50, label='Dane')\n", " ax.set_xlabel(x1label)\n", " ax.set_ylabel(x2label)\n", " ax.margins(.05, .05)\n", " return fig" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "slideshow": { "slide_type": "notes" } }, "outputs": [], "source": [ "# Przygotowanie interaktywnego wykresu\n", "\n", "dropdown_arg1 = widgets.Dropdown(options=[0, 1, 2, 3], value=2, description='arg1')\n", "dropdown_arg2 = widgets.Dropdown(options=[0, 1, 2, 3], value=3, description='arg2')\n", "\n", "def interactive_unlabeled_data(arg1, arg2):\n", " fig = plot_unlabeled_data(\n", " X, col1=arg1, col2=arg2, x1label='$x_{}$'.format(arg1), x2label='$x_{}$'.format(arg2))" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "45625984fec24b809709cb7ef9877684", "version_major": 2, "version_minor": 0 }, "text/plain": [ "interactive(children=(Dropdown(description='arg1', index=2, options=(0, 1, 2, 3), value=2), Dropdown(descripti…" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "widgets.interact(interactive_unlabeled_data, arg1=dropdown_arg1, arg2=dropdown_arg2)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "Powyższy wykres przedstawia surowe dane.\n", "Ponieważ nasze obserwacje mają 4 współrzędne, na płaskim wykresie możemy przedstawić tylko dwie z nich.\n", "\n", "Dlatego powyższy wykres umożliwia wybór dwóch współrzędnych, na które chcemy rzutować.\n", "\n", "Wszystkie takie „rzuty” przedstawia również wykres poniżej." ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\pawel\\anaconda3\\lib\\site-packages\\seaborn\\axisgrid.py:2071: UserWarning: The `size` parameter has been renamed to `height`; please update your code.\n", " warnings.warn(msg, UserWarning)\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "seaborn.pairplot(data_iris, vars=data_iris.columns, size=1.5, aspect=1.75)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "slideshow": { "slide_type": "notes" } }, "outputs": [], "source": [ "# Odległość euklidesowa\n", "def euclidean_distance(x1, x2):\n", " return np.linalg.norm(x1 - x2)" ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "slideshow": { "slide_type": "notes" } }, "outputs": [], "source": [ "# Algorytm k średnich\n", "def k_means(X, k, distance=euclidean_distance):\n", " history = []\n", " Y = []\n", " \n", " # Wylosuj centroid dla każdej klasy\n", " centroids = [[random.uniform(X.min(axis=0)[f], X.max(axis=0)[f])\n", " for f in range(X.shape[1])]\n", " for c in range(k)]\n", " history.append((centroids, Y))\n", "\n", " # Powtarzaj, dopóki klasy się zmieniają\n", " while True:\n", " distances = [[distance(centroids[c], x) for c in range(k)] for x in X]\n", " Y_new = [d.index(min(d)) for d in distances]\n", " if Y_new == Y:\n", " break\n", " Y = Y_new\n", " history.append((centroids, Y))\n", " XY = np.asarray(np.concatenate((X, np.matrix(Y).T), axis=1))\n", " Xc = [XY[XY[:, 2] == c][:, :-1] for c in range(k)]\n", " centroids = [[Xc[c].mean(axis=0)[f] for f in range(X.shape[1])]\n", " for c in range(k)]\n", " history.append((centroids, Y))\n", "\n", " result = history[-1][1]\n", " return result, history" ] }, { "cell_type": "code", "execution_count": 74, "metadata": { "slideshow": { "slide_type": "notes" } }, "outputs": [], "source": [ "# Wykres danych - klastrowanie\n", "def plot_clusters(X, Y, k, centroids=None):\n", " color = ['r', 'g', 'b', 'c', 'm', 'y', 'k']\n", " fig = plt.figure(figsize=(16*.7, 9*.7))\n", " ax = fig.add_subplot(111)\n", " fig.subplots_adjust(left=0.1, right=0.9, bottom=0.1, top=0.9)\n", "\n", " if not Y:\n", " ax.scatter(X[:, 0], X[:, 1], c='gray', marker='o', s=25, label='Dane')\n", "\n", " X1 = [[x for x, y in zip(X[:, 0].tolist(), Y) if y == c] for c in range(k)]\n", " X2 = [[x for x, y in zip(X[:, 1].tolist(), Y) if y == c] for c in range(k)]\n", "\n", " for c in range(k):\n", " ax.scatter(X1[c], X2[c], c=color[c], marker='o', s=25, label='Dane')\n", " if centroids:\n", " ax.scatter([centroids[c][0]], [centroids[c][1]], c=color[c], marker='+', s=500, label='Centroid')\n", " \n", " ax.set_xlabel(r'$x_1$')\n", " ax.set_ylabel(r'$x_2$')\n", " ax.margins(.05, .05)\n", " return fig" ] }, { "cell_type": "code", "execution_count": 75, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "Ys, history = k_means(Xs, 2)\n", "fig = plot_clusters(Xs, Ys, 2, centroids=history[-1][0])," ] }, { "cell_type": "code", "execution_count": 82, "metadata": { "slideshow": { "slide_type": "notes" } }, "outputs": [], "source": [ "# Przygotowanie interaktywnego wykresu\n", "\n", "MAXSTEPS = 15\n", "\n", "slider_k = widgets.IntSlider(min=1, max=7, step=1, value=2, description=r'$k$', width=300)\n", "\n", "def interactive_kmeans_k(steps, history, k):\n", " if steps >= len(history) or steps == MAXSTEPS:\n", " steps = len(history) - 1\n", " fig = plot_clusters(Xs, history[steps][1], k, centroids=history[steps][0])\n", " \n", "def interactive_kmeans(k):\n", " slider_steps = widgets.IntSlider(min=0, max=MAXSTEPS, step=1, value=0, description=r'steps', width=300)\n", " _, history = k_means(Xs, k)\n", " widgets.interact(interactive_kmeans_k, steps=slider_steps,\n", " history=widgets.fixed(history), k=widgets.fixed(k))" ] }, { "cell_type": "code", "execution_count": 83, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "d9ada8d382b34f43afa654e6a0b83ced", "version_major": 2, "version_minor": 0 }, "text/plain": [ "interactive(children=(IntSlider(value=2, description='$k$', max=7, min=1), Button(description='Run Interact', …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "" ] }, "execution_count": 83, "metadata": {}, "output_type": "execute_result" } ], "source": [ "widgets.interact_manual(interactive_kmeans, k=slider_k) " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Algorytm $k$ średnich – dane wejściowe\n", "\n", "* $k$ – liczba klastrów\n", "* zbiór uczący $X = \\{ x^{(1)}, x^{(2)}, \\ldots, x^{(m)} \\}$, $x^{(i)} \\in \\mathbb{R}^n$" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Na wejściu nie ma zbioru $Y$, ponieważ jest to uczenie nienadzorowane!" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Algorytm $k$ średnich – pseudokod\n", "\n", "1. Zainicjalizuj losowo $k$ centroidów (środków ciężkości klastrów): $\\mu_1, \\ldots, \\mu_k$.\n", "1. Powtarzaj dopóki przyporządkowania klastrów się zmieniają:\n", " 1. Dla $i = 1$ do $m$:\n", " za $y^{(i)}$ przyjmij klasę najbliższego centroidu.\n", " 1. Dla $c = 1$ do $k$:\n", " za $\\mu_c$ przyjmij średnią wszystkich punktów $x^{(i)}$ takich, że $y^{(i)} = c$." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "# Algorytm k średnich\n", "def k_means(X, k, distance=euclidean_distance):\n", " Y = []\n", " centroids = [[random.uniform(X.min(axis=0)[f],X.max(axis=0)[f])\n", " for f in range(X.shape[1])]\n", " for c in range(k)] # Wylosuj centroidy\n", " while True:\n", " distances = [[distance(centroids[c], x) for c in range(k)]\n", " for x in X] # Oblicz odległości\n", " Y_new = [d.index(min(d)) for d in distances]\n", " if Y_new == Y:\n", " break # Jeśli nic się nie zmienia, przerwij\n", " Y = Y_new\n", " XY = np.asarray(np.concatenate((X,np.matrix(Y).T),axis=1))\n", " Xc = [XY[XY[:, 2] == c][:, :-1] for c in range(k)]\n", " centroids = [[Xc[c].mean(axis=0)[f]\n", " for f in range(X.shape[1])]\n", " for c in range(k)] # Przesuń centroidy\n", " return Y" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "* Liczba klastrów jest określona z góry i wynosi $k$." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "* Jeżeli w którymś kroku algorytmu jedna z klas nie zostanie przyporządkowana żadnemu z przykładów, pomija się ją – w ten sposób wynikiem działania algorytmu może być mniej niż $k$ klastrów." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Funkcja kosztu dla problemu klastrowania\n", "\n", "$$ J \\left( y^{(i)}, \\ldots, y^{(m)}, \\mu_{1}, \\ldots, \\mu_{k} \\right) = \\frac{1}{m} \\sum_{i=1}^{m} || x^{(i)} - \\mu_{y^{(i)}} || ^2 $$" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "* Zauważmy, że z każdym krokiem algorytmu $k$ średnich koszt się zmniejsza (lub ewentualnie pozostaje taki sam)." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Wielokrotna inicjalizacja\n", "\n", "* Algorytm $k$ średnich zawsze znajdzie lokalne minimum funkcji kosztu $J$, ale nie zawsze będzie to globalne minimum." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "* Aby temu zaradzić, można uruchomić algorytm $k$ średnich wiele razy, za każdym razem z innym losowym położeniem centroidów (tzw. **wielokrotna losowa inicjalizacja** – *multiple random initialization*). Za każdym razem obliczamy koszt $J$. Wybieramy ten wynik, który ma najniższy koszt." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Wybór liczby klastrów $k$\n", "\n", "Ile powinna wynosić liczba grup $k$?\n", "* Najlepiej wybrać $k$ ręcznie w zależności od kształtu danych i celu, który chcemy osiągnąć." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## 8.2. Analiza głównych składowych" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "Analiza głównych składowych to inny przykład zagadnienia z dziedziny uczenia nienadzorowanego.\n", "\n", "Polega na próbie zredukowania liczby wymiarów dla danych wielowymiarowych, czyli zmniejszenia liczby cech, gdy rozpatrujemy przykłady o dużej liczbie cech." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Redukcja liczby wymiarów\n", "\n", "Z jakich powodów chcemy redukować liczbę wymiarów?" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "* Chcemy pozbyć się nadmiarowych cech, np. „długość w cm” / „długość w calach”, „długość” i „szerokość” / „powierzchnia”." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "* Chcemy znaleźć bardziej optymalną kombinację cech." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "* Chcemy przyspieszyć działanie algorytmów." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "* Chcemy zwizualizować dane." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Błąd rzutowania\n", "\n", "**Błąd rzutowania** – błąd średniokwadratowy pomiędzy danymi oryginalnymi a danymi zrzutowanymi." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Sformułowanie problemu\n", "\n", "**Analiza głównych składowych** (*Principal Component Analysis*, PCA):\n", "\n", "Zredukować liczbę wymiarów z $n$ do $k$, czyli znaleźć $k$ wektorów $u^{(1)}, u^{(2)}, \\ldots, u^{(k)}$ takich, że rzutowanie danych na podprzeztrzeń rozpiętą na tych wektorach minimalizuje błąd rzutowania." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "* **Uwaga:** analiza głównych składowych to (mimo pozornych podobieństw) zupełnie inne zagadnienie niż regresja liniowa!" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Algorytm PCA\n", "\n", "1. Dany jest zbiór składający się z $x^{(1)}, x^{(2)}, \\ldots, x^{(m)} \\in \\mathbb{R}^n$.\n", "1. Chcemy zredukować liczbę wymiarów z $n$ do $k$ ($k < n$).\n", "1. W ramach wstępnego przetwarzania dokonujemy skalowania i normalizacji średniej.\n", "1. Znajdujemy macierz kowariancji:\n", " $$ \\Sigma = \\frac{1}{m} \\sum_{i=1}^{n} \\left( x^{(i)} \\right) \\left( x^{(i)} \\right)^T $$\n", "1. Znajdujemy wektory własne macierzy $\\Sigma$ (rozkład SVD):\n", " $$ (U, S, V) := \\mathop{\\rm SVD}(\\Sigma) $$\n", "1. Pierwszych $k$ kolumn macierzy $U$ to szukane wektory." ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "from sklearn.preprocessing import StandardScaler\n", "\n", "# Algorytm PCA - implementacja\n", "def pca(X, k):\n", " X_std = StandardScaler().fit_transform(X) # normalizacja\n", " mean_vec = np.mean(X_std, axis=0)\n", " cov_mat = np.cov(X_std.T) # macierz kowariancji\n", " n = cov_mat.shape[0]\n", " eig_vals, eig_vecs = np.linalg.eig(cov_mat) # wektory własne\n", " eig_pairs = [(np.abs(eig_vals[i]), eig_vecs[:, i])\n", " for i in range(len(eig_vals))]\n", " eig_pairs.sort()\n", " eig_pairs.reverse()\n", " matrix_w = np.hstack([eig_pairs[i][1].reshape(n, 1)\n", " for i in range(k)]) # wybór\n", " return X_std.dot(matrix_w) # transformacja" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "image/png": "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pY4acGloaEinT797rfPZs2d5LwEp5Lq7wn+w1u631u6y1v731tqPuYynVyStljUturm4SEsdNeDa8ePHtW3btsBjvJeAdKFcoUclqZY1LbrZoch1HTW1wIjLj370I33hC1/QmTNndO211+qxxx7T+973vtB+fzvvJV7vQDqQ5PawpNSypslWLy5c1lFTC4y4jI+P66GHHlr//s0339Tg4KDuu+8+ff3rXw/lMVq9l6y1yufzvN6BFDBJbER/8OBBe/IkOwCjd1SrVeXz+ct2a6rL5XKR7dbk6nHRe370ox9pcHCw4fGFhQX97M/+bNeP0+w1XX8tB9Xl7tq1S2fOnNHVV1/ddQwAwmOMeclaezDoWGI2gwB6mas6amqBEZcvfOELTY//8i//ciiP0+y9NDo62nAHwnPnzum9730vG7cACUK5AtCluOr3XNRRu64FRu84c+ZM0+OvvPKKlpaWQnm9N3ovPfjggw1f79KlLgyFQoEZDCAhSHIThgURfom7XjXuOuq09VRG5+I651x77bV68803Gx43xrS1YUq7gt5LzV7vde1u3ALAPWpyPbb5w+XAgQO66667AlfmsyAifr1Qr9oLfyMaC7qIi+qc06omV5ImJyc1NTUV6uNu1Oz1HmccANrXrCaXkVxPbf5w2bNnj5aXly+7T320gekzN5rVq66srKRitKebtmdIto0bkNRFec553/vep0OHDumFF14IPB7HzEH99X7o0CGdO3fOWRwAwsHCMw8F7W61OcHdiAVAbjSrV11eXtaLL74Yc0TRqNcvTk9Pa3JyUtPT06pUKswepJyLRYff/va3G+4KGNdujENDQzpz5ox2797tNA4A3WMk10PNPlyCsADIjYGBgcAR9rqnn35ajzzySCpGO+mp3HtcLDrM5XL6oz/6I+czB1dffbWef/5553EA6A5JroeafbgEYfrMjWKxqHvuuafh8W3btqWiZAG9ydWiQ192Y/QlDgBbR5LroXZW+G7E9JkbuVxOd955p5544onA44ywI8mKxaLGx8cDj20+54TdgaHdmYOoOz/4EgeALbLWJu7rpptusmn29ttv21wuZyUFfmUymfX/5nI5e+LECdch96xvfOMb6/8/gv4/lUol1yECW3bixAmby+WannPauY+r2OLgSxxAr5J00jbIF2kh5qlGrXueeuopvf7660yfeYIW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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# X - dane ze zbioru \"iris\" z poprzedniego przykładu\n", "\n", "X_pca = pca(X, 2)\n", "fig = plot_unlabeled_data(X_pca)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "Analiza głównych składowych umożliwiła stworzenie powyższego wykresu, który wizualizuje 4-wymiarowe dane ze zbioru *iris* na 2-wymiarowej płaszczyźnie.\n", "\n", "Współrzędne $x_1$ i $x_2$, stanowiące osi wykresu, zostały uzyskane w wyniku działania algorytmu PCA (nie są to żadne z oryginalnych cech ze zbioru *iris* – długość płatka, szerokość płatka itp.)." ] } ], "metadata": { "celltoolbar": "Slideshow", "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.8.3" }, "livereveal": { "start_slideshow_at": "selected", "theme": "white" } }, "nbformat": 4, "nbformat_minor": 4 }