uczenie-maszynowe/wyk/08_Uczenie_nienadzorowane.ipynb
2022-12-06 09:55:40 +01:00

820 lines
119 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"### Uczenie maszynowe\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": 14,
"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": 15,
"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": 16,
"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": 17,
"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": 18,
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "1f6d6588f31343a8954f9a91a2971507",
"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": [
"<function __main__.interactive_unlabeled_data(arg1, arg2)>"
]
},
"execution_count": 18,
"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": 19,
"metadata": {
"slideshow": {
"slide_type": "skip"
}
},
"outputs": [
{
"data": {
"text/plain": [
"<seaborn.axisgrid.PairGrid at 0x23b2908c8b0>"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 756x432 with 20 Axes>"
]
},
"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": 20,
"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": 21,
"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": 22,
"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": 23,
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 806.4x453.6 with 1 Axes>"
]
},
"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": 24,
"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": 25,
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "d60eb5f7bce84fabaa43033382b1c9b8",
"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": [
"<function __main__.interactive_kmeans(k)>"
]
},
"execution_count": 25,
"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 kmeans(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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",
"text/plain": [
"<Figure size 806.4x453.6 with 1 Axes>"
]
},
"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.)."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"Tutaj można zobaczyć, jak algorytmy redukcji wymiarów (w tym PCA) działają w praktyce:\n",
" * https://projector.tensorflow.org\n",
" * https://biit.cs.ut.ee/clustvis\n",
" * https://labriata.github.io/jsinscience/pca/index.html"
]
}
],
"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
}