From 724be2f486bbfe81c37d39303e755eb5a0f021b5 Mon Sep 17 00:00:00 2001 From: Filip Gralinski Date: Tue, 27 Apr 2021 16:50:25 +0200 Subject: [PATCH] Bernoulli --- wyk/07_Naiwny_klasyfikator_bayesowski.ipynb | 104 +++++++++++++++----- 1 file changed, 79 insertions(+), 25 deletions(-) diff --git a/wyk/07_Naiwny_klasyfikator_bayesowski.ipynb b/wyk/07_Naiwny_klasyfikator_bayesowski.ipynb index 8208481..5468e43 100644 --- a/wyk/07_Naiwny_klasyfikator_bayesowski.ipynb +++ b/wyk/07_Naiwny_klasyfikator_bayesowski.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "damaged-senator", + "id": "moderate-array", "metadata": {}, "source": [ "# Klasyfikacja binarna dla tekstu\n", @@ -14,7 +14,7 @@ }, { "cell_type": "markdown", - "id": "explicit-gathering", + "id": "correct-victory", "metadata": {}, "source": [ "**Pytanie**: Czy można wyobrazić sobie zadanie klasyfikacji mejli, niebędące zadaniem klasyfikacji binarnej?" @@ -22,7 +22,7 @@ }, { "cell_type": "markdown", - "id": "material-watch", + "id": "spiritual-diploma", "metadata": {}, "source": [ "Zakładamy paradygmat uczenia nadzorowanego, tzn. dysponujemy zbiorem uczącym.\n", @@ -32,7 +32,7 @@ }, { "cell_type": "markdown", - "id": "referenced-hello", + "id": "secure-performance", "metadata": {}, "source": [ "## Klasyfikacja regułowa\n", @@ -49,14 +49,14 @@ "body __FRAUD_XJR\t/(?:who was a|as a|an? honest|you being a|to any) foreigner/i\n", "```\n", "\n", - "Jakie są wady i zalety regułowych filtrów antyspamowych?\n", + "**Pytanie:** Jakie są wady i zalety regułowych filtrów antyspamowych?\n", "\n", "Współcześnie zdecydowanie dominuje użycie metod statystycznych (opartych na nadzorowanym uczeniu maszynowym). Do popularności tych metod przyczynił się artykuł [Plan for spam](http://www.paulgraham.com/spam.html) autorstwa Paula Grahama." ] }, { "cell_type": "markdown", - "id": "cathedral-uganda", + "id": "indoor-ending", "metadata": {}, "source": [ "## Podejście generatywne i dyskryminatywne\n", @@ -72,7 +72,7 @@ }, { "cell_type": "markdown", - "id": "powerful-engineer", + "id": "pleased-clinic", "metadata": {}, "source": [ "## Nasz \"dyżurny\" przykład\n", @@ -94,11 +94,31 @@ "Zakładamy, że dokumenty podlegają lematyzacji i sprowadzeniu do mały liter, więc ostatecznie będziemy mieli następujące ciąg termów:\n", "\n", "* $x_1=(\\mathit{kupić}, \\mathit{pan}, \\mathit{viagra})$\n", - "* $x_2=(\\mathit{tani}, \\mathit{miejsce}, \\mathit{dla}, \\mathit{pana})$\n", + "* $x_2=(\\mathit{tani}, \\mathit{miejsce}, \\mathit{dla}, \\mathit{pan})$\n", "* $x_3=(\\mathit{viagra}, \\mathit{viagra}, \\mathit{viagra})$\n", "* $x_4=(\\mathit{kupić}, \\mathit{tani}, \\mathit{cartridge})$\n", "\n", - "Uczymy na tym zbiorze klasyfikator, który będziemy testować na dokumencie $d=\\mathit{tania tania viagra dla pana}$, tj. po normalizacji\n", + "$P(tani|c) = (1+1)/(9+7) = 2/16 = 0.125$\n", + "$P(viagra|c) = \\frac{4+1}{9 + 7} = 5/16 = 0.3125 $\n", + "$P(dla|c) = \\frac{0+1}{9+7} = 1/16 = 0.0625$\n", + "$P(pan|c) = (1+1)/(9+7) = 2/16 = 0.125 $\n", + "$P(c) = 0.75$\n", + "\n", + "w wersji wielomianowej: $P(c)P(tani|c)P(tani|c)P(viagra|c)P(dla|c)P(pan|c) = 0.75 * 0.125 * 0.125 * 0.3125 * 0.0625 * 0.125= 0.0002861$\n", + "\n", + "w werjis Bernoulliego: $P(c)P(U_{dla}=1|c)P(U_{cartridge}=0|c)P(U_{viagra}=1|c)P(U_{pan}=1|c)P(U_{tani}=1|c)P(U_{miejsce}=0|c)P(U_{kup}=0|c)$\n", + "\n", + "$P(tani|\\bar{c}) = (1+1)/(4+7) = 2/11 =0.182 $\n", + "$P(viagra|\\bar{c}) = 1/11 = 0.091 $\n", + "$P(dla|\\bar{c}) = 2/11 = 0.182 $\n", + "$P(pan|\\bar{c}) = 2/11 = 0.182 $\n", + "$P(\\bar{c}) = 0.25$\n", + "\n", + "$P(\\bar{c})P(tani|\\bar{c})P(tani|\\bar{c})P(dla|\\bar{c})P(pan|\\bar{c}) = 0.25 * 0.182 * 0.182 * 0.091 * 0.182 * 0.182 = 0.00002496$\n", + "\n", + "\n", + "\n", + "Uczymy na tym zbiorze klasyfikator, który będziemy testować na dokumencie $d=\\mathit{tania\\ tania\\ viagra\\ dla\\ pana}$, tj. po normalizacji\n", "$d=(\\mathit{tani}, \\mathit{tani}, \\mathit{viagra}, \\mathit{dla}, \\mathit{pan})$.\n", "\n", "**Uwaga:** Przykład jest oczywiście nierealistyczny i trudno będzie nam ocenić sensowność odpowiedzi. Za to będziemy w stanie policzyć ręcznie wynik.\n" @@ -106,7 +126,7 @@ }, { "cell_type": "markdown", - "id": "controversial-rotation", + "id": "partial-military", "metadata": {}, "source": [ "## Naiwny klasyfikator bayesowski\n", @@ -127,7 +147,7 @@ }, { "cell_type": "markdown", - "id": "spatial-citizenship", + "id": "colonial-creature", "metadata": {}, "source": [ "Mamy dokument $d$ i dwie klasy $c$ i $\\bar{c}$. Policzymy prawdopodobieństwa $P(c|d)$ (mamy dokument $d$, jakie jest prawdopodobieństwo, że to klasa $c$) i $P(\\bar{c}|d)$. A właściwie będziemy te prawdopodobieństwa porównywać.\n", @@ -139,25 +159,25 @@ }, { "cell_type": "markdown", - "id": "united-recognition", + "id": "governing-fiction", "metadata": {}, "source": [ "Zastosujmy najpierw wzór Bayesa.\n", "\n", - "$P(c|d) = \\frac{P(d|c) P(c)}{P(d)} \\propto P(d|c) P(c)$" + "$P(c|d) = \\frac{P(d|c) P(c)}{P(d)}$" ] }, { "cell_type": "markdown", - "id": "present-draft", + "id": "northern-spine", "metadata": {}, "source": [ - "$P(\\bar{c}|d) = \\frac{P(d|\\bar{c}) P(\\bar{c})}{P(d)} \\propto P(d|\\bar{c}) P(\\bar{c}) $" + "$P(\\bar{c}|d) = \\frac{P(d|\\bar{c}) P(\\bar{c})}{P(d)}$" ] }, { "cell_type": "markdown", - "id": "accepting-tamil", + "id": "utility-induction", "metadata": {}, "source": [ "(Oczywiście skądinąd $P(\\bar{c}|d) = 1 - P(c|d)$, ale nie będziemy teraz tego wykorzystywali.)" @@ -165,7 +185,7 @@ }, { "cell_type": "markdown", - "id": "equipped-outreach", + "id": "timely-force", "metadata": {}, "source": [ "Co możemy pominąć, jeśli tylko porównujemy $P(c|d)$ i $P(\\bar{c}|d)$?\n", @@ -181,7 +201,7 @@ }, { "cell_type": "markdown", - "id": "active-motor", + "id": "embedded-involvement", "metadata": {}, "source": [ "#### Prawdopodobieństwo _a priori_\n", @@ -193,12 +213,16 @@ "gdzie\n", "\n", "* N - liczba wszystkich dokumentów w zbiorze uczącym\n", - "* N_c - liczba dokumentow w zbiorze uczącym z klasą $c$\n" + "* N_c - liczba dokumentow w zbiorze uczącym z klasą $c$\n", + "\n", + "$\\hat{P}(c) = 0,75$\n", + "\n", + "$\\hat{P}(\\bar{c}) = 0,25$\n" ] }, { "cell_type": "markdown", - "id": "trying-indonesian", + "id": "virgin-premiere", "metadata": {}, "source": [ "#### Prawdopodobieństwo _a posteriori_\n", @@ -212,7 +236,7 @@ }, { "cell_type": "markdown", - "id": "median-nomination", + "id": "acting-zimbabwe", "metadata": {}, "source": [ "$P(d|c) = P(t_1\\dots t_n|c)$\n", @@ -228,7 +252,7 @@ }, { "cell_type": "markdown", - "id": "romantic-verse", + "id": "adjustable-disney", "metadata": {}, "source": [ "Jak oszacować $\\hat{P}(t|c)$?\n", @@ -238,7 +262,7 @@ }, { "cell_type": "markdown", - "id": "interracial-today", + "id": "associate-variance", "metadata": {}, "source": [ "### Wygładzanie\n", @@ -260,12 +284,17 @@ "4. $f(m, 0, 0) = \\frac{1}{m}$\n", "5. $\\lim_{T \\to \\inf} f(m, k, T) = \\frac{k}{T}$\n", "\n", + "\n", + "m=2, k1=2, k2=4, T=6, 2/6 => f(2, 2, 6) > 0.333, f(2, 4, 6) < 0.666 \n", + "\n", "Jaka funkcja spełnia te aksjomaty?\n", "\n", "$$f(m, k, T) = \\frac{k+1}{T+m}$$\n", "\n", "Jest to wygładzanie +1, albo wygładzanie Laplace'a.\n", "\n", + "**Pytanie:** Wymyślić jakiś inny przykład funkcji, która będzie spełniała aksjomaty.\n", + "\n", "\n", "\n", "\n", @@ -275,7 +304,7 @@ }, { "cell_type": "markdown", - "id": "accepting-stockholm", + "id": "complimentary-airplane", "metadata": {}, "source": [ "Po zastosowaniu do naszego naiwnego klasyfikatora otrzymamy:\n", @@ -283,10 +312,35 @@ "$$\\hat{P}(t|c) = \\frac{\\#(t,c) + 1}{\\sum_i^{|V|} \\#(t_i,c) + |V|}$$" ] }, + { + "cell_type": "markdown", + "id": "comprehensive-junior", + "metadata": {}, + "source": [ + "### Metoda Bernoulliego" + ] + }, + { + "cell_type": "markdown", + "id": "vocational-spanish", + "metadata": {}, + "source": [ + "$$P(𝑑|𝑐) \\approx P(U=u_1|c)\\dots P(U=u_{|v|})$$, gdzie $u_i = 1$, $t_i$ pojawił się w dokumencie $d$, 0 - w przeciwnym razie\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "enabling-manitoba", + "metadata": {}, + "source": [ + "$\\hat{P}(U_{viagra}=1|c) = \\frac{\\#(viagra,N_c) + 1}{N_c + 2}$" + ] + }, { "cell_type": "code", "execution_count": null, - "id": "moral-ceremony", + "id": "bearing-execution", "metadata": {}, "outputs": [], "source": []