{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "221542f7",
   "metadata": {},
   "source": [
    "# Exemplo Naive Bayes"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1d4bf50f",
   "metadata": {},
   "source": [
    "## $P(A|B)=\\frac{Qtde(A,B)}{Qtde(B)}$\n",
    "## $P(A|B)=\\frac{P(A,B)}{P(B)}=\\frac{\\frac{Qtde(A,B)}{n}}{\\frac{Qtde(B}{n}}=\\frac{Qtde(A,B)}{Qtde(B)}$\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c12082f4",
   "metadata": {},
   "source": [
    "### Repositório de dados: http://archive.ics.uci.edu"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "17e21d0a",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "42ab66e6",
   "metadata": {},
   "source": [
    "### Definindo campos caso a base de dados não tenha definido"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "d5714d7d",
   "metadata": {},
   "outputs": [],
   "source": [
    "campos=['Classe','Peso Esquerdo','Distância Esquerda', 'Peso Direito','Distância Direita']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "7f28d780",
   "metadata": {},
   "outputs": [],
   "source": [
    "caminhoDados='./balance+scale'"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a5d63a0c",
   "metadata": {},
   "source": [
    "### Importando com pandas"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "b6a6c6d4",
   "metadata": {},
   "outputs": [],
   "source": [
    "df=pd.read_csv(f'{caminhoDados}/balance-scale.data',names=campos) "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4d10d9ba",
   "metadata": {},
   "source": [
    "##### Este conjunto de dados foi gerado para modelar resultados psicológicos    experimentais. \n",
    "##### Cada exemplo é classificado como tendo a balança inclinada     para a direita, inclinada para a esquerda ou equilibrada. \n",
    "##### Os atributos são:\n",
    "#####   -o peso esquerdo;\n",
    "#####   -a distância esquerda;\n",
    "#####   -o peso direito;\n",
    "#####   -a distância direita. \n",
    "#####   A maneira correta de encontrar a classe é a maior entre (distância esquerda   * peso esquerdo) e (distância direita * peso direito). Se forem iguais,   está equilibrado."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bb83cf91",
   "metadata": {},
   "source": [
    "## Mostra as classes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "c8102589",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'R', 'L', 'B'}\n"
     ]
    }
   ],
   "source": [
    "print(set(df['Classe']))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f31a4815",
   "metadata": {},
   "source": [
    "## Mostra a quantidade de cada classe"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "faf98653",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "R    288\n",
      "L    288\n",
      "B     49\n",
      "Name: Classe, dtype: int64\n"
     ]
    }
   ],
   "source": [
    "qtdeClasse=df['Classe'].value_counts()\n",
    "classes=list(qtdeClasse.index)\n",
    "print(qtdeClasse)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "932e723c",
   "metadata": {},
   "source": [
    "## Calculando a probabilidade das classes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "edc7b63b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "R    0.4608\n",
      "L    0.4608\n",
      "B    0.0784\n",
      "Name: Classe, dtype: float64\n"
     ]
    }
   ],
   "source": [
    "prbClasse=qtdeClasse/qtdeClasse.sum()\n",
    "classes=list(qtdeClasse.index)\n",
    "numClasses=len(classes)\n",
    "print(prbClasse)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a6beeb38",
   "metadata": {},
   "source": [
    "### Retira a classe da lista campos para não atrapalhar"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "3d8e5a68",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Classe'"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "campos.pop(0)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ce660cea",
   "metadata": {},
   "source": [
    "### Entrada dos atributos $X=[3, 2, 1, 3]$ a classificar"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "7902eaf3",
   "metadata": {},
   "outputs": [],
   "source": [
    "X=[3,2,1,3]\n",
    "numAtrib=len(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8b2ae877",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "c63b8573",
   "metadata": {},
   "source": [
    "### Calculando $P(X|C_j)$ supondo que cada $X_i$ são independentes entre si"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "83635d5c",
   "metadata": {},
   "outputs": [],
   "source": [
    "prbXC=np.array([[(df[ (df['Classe']== c) & (df[campos[i]]==x) ][[campos[i]]].count())/qtdeClasse[c] for i,x in enumerate(X)] for c in classes]).reshape(numClasses,numAtrib)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "8289285f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.18402778, 0.24652778, 0.05902778, 0.21875   ],\n",
       "       [0.21875   , 0.14930556, 0.34027778, 0.18402778],\n",
       "       [0.18367347, 0.2244898 , 0.20408163, 0.18367347]])"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "prbXC"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "01dd4187",
   "metadata": {},
   "source": [
    "### Agora estimamos $P(C_j|X)=P(C_j)\\displaystyle \\prod_{i}P(X_i|C_j)$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "e3a6027d",
   "metadata": {},
   "outputs": [],
   "source": [
    "prbCX=prbClasse*np.prod(prbXC,axis=1) #3 resultados"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "21f203e3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "R    0.000270\n",
       "L    0.000942\n",
       "B    0.000121\n",
       "Name: Classe, dtype: float64"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "prbCX"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ed7e6a1a",
   "metadata": {},
   "source": [
    "### Normaliza"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "e2438fdb",
   "metadata": {},
   "outputs": [],
   "source": [
    "prbCX=prbCX/np.sum(prbCX)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "9eced971",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "R    0.202421\n",
       "L    0.706713\n",
       "B    0.090866\n",
       "Name: Classe, dtype: float64"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "prbCX"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "42118fd1",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "b7bdb65a",
   "metadata": {},
   "source": [
    "## Encontra o $argmax(P(C_i|X))$, a hipótese da máxima verossimilhança"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "2d352fa1",
   "metadata": {},
   "outputs": [],
   "source": [
    "hMv=np.argmax(prbCX)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "a7e726f9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "hMv"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "df34dc7a",
   "metadata": {},
   "source": [
    "### Pega o índice do maior argumento para o menor"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "610465de",
   "metadata": {},
   "outputs": [],
   "source": [
    "id=np.argsort(np.array(prbCX))[::-1]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "741e2689",
   "metadata": {},
   "source": [
    "### Probabilidade ordenada das classes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "a27c8c74",
   "metadata": {},
   "outputs": [],
   "source": [
    "id=np.argsort(np.array(prbCX))[::-1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "3890dfeb",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, 0, 2])"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "id"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1a12e5e9",
   "metadata": {},
   "source": [
    "### Cria uma lista de classes ordenadas por probabilidade"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "69a126fd",
   "metadata": {},
   "outputs": [],
   "source": [
    "prbOrdC=[[classes[cl],prbCX[cl]] for cl in id]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3d15e0ee",
   "metadata": {},
   "source": [
    "## Imprime as classes ordenadas"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "94e7569c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Classe L = 0.71\n",
      "Classe R = 0.20\n",
      "Classe B = 0.09\n"
     ]
    }
   ],
   "source": [
    "for l in prbOrdC:\n",
    "    print(f'Classe {l[0]} = {l[1]:.2f}')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "58efad9e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[['L', 0.7067132646169335],\n",
       " ['R', 0.20242119373342163],\n",
       " ['B', 0.09086554164964486]]"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "prbOrdC"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "74d2bc7b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      " Classe vencedora: L probabilidade: 0.71\n"
     ]
    }
   ],
   "source": [
    "print(f'\\n Classe vencedora: {classes[hMv]} probabilidade: {prbCX[hMv]:.2f}')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "10a97b1b",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "base",
   "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.10.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
