{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Criando uma Transformada de Karhunen-Loeve (TKL)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy.linalg as la"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Inserindo dados"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [],
   "source": [
    "Data=np.array([[2.5, 2.4],\n",
    "      [0.5, 0.7],\n",
    "      [2.2, 2.9],\n",
    "      [1.9, 2.2],\n",
    "      [3.1, 3.0],\n",
    "      [2.3, 2.7],\n",
    "      [2.0, 1.6],\n",
    "      [1.1, 1.0],\n",
    "      [1.5, 1.6],\n",
    "      [1.1, 0.9]],dtype=float)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Guardar as linhas e colunas"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(10, 2)"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "r,c = np.shape(Data)\n",
    "r,c"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Média de cada atributo"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1.82, 1.9 ])"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "u=np.mean(Data,axis=0)\n",
    "u"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Ajustando os dados "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 0.68  0.5 ]\n",
      " [-1.32 -1.2 ]\n",
      " [ 0.38  1.  ]\n",
      " [ 0.08  0.3 ]\n",
      " [ 1.28  1.1 ]\n",
      " [ 0.48  0.8 ]\n",
      " [ 0.18 -0.3 ]\n",
      " [-0.72 -0.9 ]\n",
      " [-0.32 -0.3 ]\n",
      " [-0.72 -1.  ]]\n"
     ]
    }
   ],
   "source": [
    "DataAdjust=Data-u #Data - medias\n",
    "print(DataAdjust)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Repare que $DataAdjust$ está em formato de TABELA DE DADOS, o python só calcula a matriz de covariância conforme os matemáticos veem, ou seja, como VETOR DE VARIÁVEIS ALEATÓRIAS. Logo, temos que usar a transposta.\n",
    "### Matriz $K$ de covariância da transposta da tabela $DataAdjust$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[0.59955556 0.61444444]\n",
      " [0.61444444 0.73555556]]\n"
     ]
    }
   ],
   "source": [
    "K=np.cov(DataAdjust.T)\n",
    "print(K)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Encontrando os Autovalores e autovetores de $K$\n",
    "#### Como $K$ é simétrica, recomenda-se a função eigh()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [],
   "source": [
    "autoVal,autoVet=la.eigh(K)   #autovalores e autovetores da matriz de covariância K"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Autovalores"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0.04935981 1.2857513 ]\n"
     ]
    }
   ],
   "source": [
    "print(autoVal)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Autovetores $V$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[-0.74498239  0.66708413]\n",
      " [ 0.66708413  0.74498239]]\n"
     ]
    }
   ],
   "source": [
    "V=autoVet\n",
    "print(V)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Autovalores $D$ em Diagonal"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[0.04935981 0.        ]\n",
      " [0.         1.2857513 ]]\n"
     ]
    }
   ],
   "source": [
    "D=np.diag(autoVal)\n",
    "print(D)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Lembrando que $AV = VD$, para $A$ matriz quadrada, $V$ autovetores, $D$ autovalores em diagonal\n",
    "### Assim, podemos verificar que $KV=VD$, para a matriz de covariância dos dados"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Verificando $KV$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-0.03677219,  0.85770429],\n",
       "       [ 0.03292715,  0.95786207]])"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "K@V"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Verificando $VD$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-0.03677219,  0.85770429],\n",
       "       [ 0.03292715,  0.95786207]])"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "V@D"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [],
   "source": [
    "i=np.argsort(autoVal)[::-1]  #índices dos autovalores ordenados em ordem decrescente ([::-1])\n",
    "autoVal=autoVal[i]           #autovalores ordenados por ordem decrescente\n",
    "O=autoVet[:,i]               #autovetores ortogonais associados a cada autovalor em ordem decrecente"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Autovalores ordenados em ordem de maior para menor importância (decrescente)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1.2857513 , 0.04935981])"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "autoVal"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Autovetores $O$ (ortogonais) ordenados conforme autovalores correspondentes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.66708413, -0.74498239],\n",
       "       [ 0.74498239,  0.66708413]])"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "O"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### $O$ é o conjunto de autovalores ortogonais de $K$, que será a covariância da transformação de DataAdjust\n",
    "##### Direção dos autovalores"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1.82      , 1.9       ],\n",
       "       [1.07501761, 2.56708413]])"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "eixoMax=np.array([u,u+O[:,0]])\n",
    "eixoMin=np.array([u,u+O[:,1]])\n",
    "eixoMin"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Fazendo a Transformada.\n",
    "### Dado um vetor de Variáveis Aleatórias $X$, achamos $Y$ pela transformação $Y = O'X$\n",
    "#### Se colocarmos em formato de TABELA DE DADOS seria $Y'=(O'X)'=X'O''=X'O$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Transformando $Data$ em $FinalData$, ou dados $X$ em dados $Y$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [],
   "source": [
    "FinalData=Data@O               #Y'=X'O e Y=O'X\n",
    "FinalDataAdjust=DataAdjust@O"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Plotando"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAo4AAAKYCAYAAAD9gXlmAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAA9hAAAPYQGoP6dpAACNJElEQVR4nOzdeVhUZfsH8O+IgOAaqLgMikumhoCKGiYKLpiikoj7a25Zrkm0qG0uPw0rM3g1t9wy1zLckixMEEwtNEnT1DQNxAVFBUGBcXh+f8zLxMAAZ5DhzPL9XBeXzpkz59zPzJlz7nnOsyiEEAJERERERGWoIncARERERGQemDgSERERkSRMHImIiIhIEiaORERERCQJE0ciIiIikoSJIxERERFJwsSRiIiIiCRh4khEREREkjBxJCIiIiJJmDiSSdq4cSMUCoX2r2rVqlAqlRg/fjxSU1MlbWPcuHFwc3MzWoxxcXFQKBSIi4sz2j4Aw8uxb98+DBw4EC4uLrCzs4OTkxN69eqFLVu2QKVSGS9QK7F161ZEREQYZdt37tyBvb09FAoFTpw4YZR96OPm5oZx48YZZdvz5s2DQqEwyrZLY+g55O+//8b06dPRqlUrODg4wNHREc8++yzee++9Es85wcHBUCgUmD59urGLQ2QymDiSSduwYQOOHTuGmJgYTJo0Cdu2bYOvry+ys7PLfO3777+PXbt2GS22Dh064NixY+jQoYPR9mEIIQTGjx+PQYMGIT8/H0uXLsXBgwfx5ZdfwtPTE1OnTsWKFSvkDtPsGTNx/Oqrr5CXlwcAWLdunVH2UdlefvllHDt2TLb9SzmHfPfdd/Dw8MB3332HV155Bd999532//v27cOAAQOKbTctLQ3fffcdAGDLli3IycmptDIRyUoQmaANGzYIACIxMVFn+fvvvy8AiM2bN5f42uzsbGOHV6nGjh0rmjZtWuZ6H330kQAg5s+fr/f5GzduiISEhAqOzvoEBgZK+jzKw93dXdSvX1906tRJ1K5dWzx8+NAo+ymqadOmYuzYsZWyr8oi9Rzy999/i+rVq4v27duL+/fvF9tOfn6++Pbbb4st/+STTwQAERgYKACILVu2GKcgRCaGNY5kVp577jkAwD///ANAcxu3Ro0aOHPmDAICAlCzZk306tVL+1zRW7wFt5W++uortGnTBo6OjvD09NTWHBR2/vx5jBw5Ei4uLrC3t0eTJk3w0ksvITc3F4D+W9UF8Zw9exa9evVC9erVUa9ePUyfPh0PHz7U2f7nn3+O7t27o379+qhevTratWuHjz/+uFy3k1UqFT766CO0bt0a77//vt51GjRogG7dumkf3717F1OnTkXjxo1hZ2eH5s2b491339WWr+h7tmHDBjzzzDNwcHCAt7c3jh8/DiEEPvnkEzRr1gw1atRAz549cenSJZ3X+/n5wd3dHQkJCXjuuefg4OCAxo0b4/3334dardZZ19CYpHyOf/31F0aNGoX69evD3t4ebdq0weeff66zTsFnuW3bNrz77rto1KgRatWqhd69e+PChQs6Zdm/fz/++ecfndugBVauXAlPT0/UqFEDNWvWROvWrfHOO+/o/TyK+uWXX/DHH39gzJgxmDRpEjIyMvDtt98WW6/g/UxMTISvry8cHR3RvHlzLF68GPn5+dr1cnJy8MYbb8DLywu1a9eGk5MTfHx8sGfPnlLjyMrKQp06dfDqq68We+7q1auwsbHBJ598AgB4+PAh3nzzTTRr1gzVqlWDk5MTvL29sW3bNu1r9N2qPnToEPz8/ODs7AwHBwc0adIEQ4YMKfYdMYai55ClS5ciOzsbK1asQO3atYutr1AoEBwcXGz5+vXr4eLigi+//BIODg5Yv369cQMnMhFV5Q6AyBAFSUm9evW0y/Ly8jBo0CC8+uqrmD17Nh4/flzqNvbv34/ExEQsWLAANWrUwMcff4zBgwfjwoULaN68OQDg999/R7du3VC3bl0sWLAATz/9NG7cuIG9e/ciLy8P9vb2JW5fpVKhf//+2niOHj2KhQsX4p9//sG+ffu0612+fBmjRo1Cs2bNYGdnh99//x2LFi3C+fPnDb4InThxAnfv3sWkSZMktSfLycmBv78/Ll++jPnz58PDwwMJCQkIDw9HUlIS9u/fr7P+d999h1OnTmHx4sVQKBSYNWsWAgMDMXbsWPz9999Yvnw5MjIyEBYWhiFDhiApKUknjps3b2LEiBGYPXs2FixYgP3792PhwoW4d+8eli9fXq6YpHyO586dQ9euXdGkSRN8+umnaNCgAX744Qe89tpruHPnDubOnauzzXfeeQfPP/881q5di8zMTMyaNQsDBw7En3/+CRsbG6xYsQKvvPIKLl++XKwZxPbt2zF16lTMmDED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iCqNjB1ziEpU0uC9RY0dO1ZUr169xOf09aqeNm1asXX1DYB87tw5MXToUOHs7Czs7OxEkyZNxLhx40ROTo4QouRe1dWrVxenT58Wfn5+wsHBQTg5OYkpU6bo9EoWQoh9+/YJT09PUa1aNdG4cWPx1ltvie+//17vNg0ZcHrPnj0iMDBQ1KtXT1StWlU89dRTwt/fX6xatUrk5uZq10tPTxeTJ08WDRs2FFWrVhVNmzYVc+bM0ZavtPfsypUrAoD45JNPdJYXvCfffPONdlmPHj3Es88+K+Li4oS3t7ewt7cXDRs2FO+8845QqVQ6r3+SmITQ/zleuXJFTJgwQTRu3FjY2tqKevXqia5du4qFCxeWGnfhcm7YsEG77O7duyIkJETUqVNHKBQKbY/hL7/8Uvj7+wsXFxdhZ2cnGjVqJIYNG6bTw7yogt7pERERJa5z4MABAUB8+umnOu9nUfqOk8WLFws3Nzdhb28v2rRpI7744otivZxLet8KjBs3TlStWlVcu3at2HOzZ88W3t7e4qmnnhL29vaiefPm4vXXXxd37tzRrlN0f8eOHRODBw8WTZs2Ffb29sLZ2Vn06NFD7N27t8T3oDyknkMKXL58WUydOlW0bNlS2NvbCwcHB9G2bVsRFhYmrly5IvLy8kT9+vWFl5dXidt4/PixUCqVol27dhVVDCKToxDif13miOiJjRs3Djt37kRWVpbcoZgMPz8/3LlzB3/88YfcoZCB8vLy4Obmhm7duuHrr7+WOxwiMgG8VU1ERDpu376NCxcuYMOGDbh16xZmz54td0hEZCKYOBIRkY79+/dj/PjxaNiwIVasWKEzBA8RWTfeqiYiIiIiSTgcDxERERFJwsSRiIiIiCRh4khEREREkjBxJCIiIiJJmDgSERERkSRMHImIiIhIEiaORERERCQJE0ciIiIikoSJIxERERFJwsSRiIiIiCRh4khEREREkjBxJCIiIiJJmDgSERERkSRMHImIiIhIEiaORERERCQJE0ciIiIikoSJIxERERFJwsSRiIiIiCRh4khEREREkjBxJCIiIiJJmDgSERERkSRMHImIiIhIEiaORERERCQJE0ciIiIikoSJIxERERFJwsSRiIiIiCRh4khEREREkjBxJCIiIiJJmDgSERERkSRMHImIiIhIEiaORERERCQJE0ciIiIikoSJIxERERFJwsSRiIiIiCRh4khEREREkjBxJCIiIiJJmDgSERERkSRMHImIiIhIEiaORERERCQJE0ciIiIikoSJIxERERFJwsSRiIiIiCRh4khEREREkjBxJCIiIiJJmDgSERERkSRMHImIiIhIEiaORERERCQJE0ciIiIikoSJIxERERFJwsSRiIiIiCRh4khEREREkjBxJCIiIiJJmDgSERERkSRMHImIiIhIEiaORERERCQJE0ciIiIikoSJIxERERFJwsSRiIiIiCRh4khEREREkjBxJCIiIiJJmDgSERERkSRMHImIiIhIEiaORERERCQJE0ciIiIikoSJIxERERFJwsSRiIiIiCRh4khEREREkjBxJCIiIiJJmDhaMTc3N7Ru3Rqenp54+umnERQUhKNHj5ZrW35+fvjuu+8qJK5x48ZBqVTCy8sLHh4e6N69O86fP1+ubSUlJeHrr7+ukLiIqOKZ6nmoNF5eXnj06FG5Xz9v3jzk5eWV67Vubm74448/yr3vosLCwrB9+/YK254+hWPu378/Ll++bNT9GWrZsmUIDw+XOwyzwcTRyu3cuRO///47/vrrL0yYMAH9+/fHL7/8IndYmD17NpKSknD69GkMGDAA77//vt71Hj9+XOp2mDgSmT5TPQ+VJCkpCQ4ODuV+/fz588udOFak1NRUfP/99xg+fHil7TM6OhotWrSotP0BZV8nXn31VXzxxRfIzMyspIjMGxNH0goKCsLUqVOxZMkSAMBPP/0EHx8ftG/fHu7u7tiwYYN23XPnzqFLly7o0KEDRo8ejZycHO1zly5dQu/eveHh4QEvLy/s3r0bAPDo0SMMHz4cbdu2haenJwICAsqMSQiB+/fv46mnngIAXL16FXXr1sWCBQvg6+uLZcuWYd68eXjzzTe1r1m+fDnGjRuHtLQ0fPDBBzh48CC8vLwwefJkAMCBAwfQoUMHeHh4oEePHjh37hwA4K+//sLzzz8PT09PtGvXDu+9996TvaFEZDBTOQ8tXboUnTp1Qvv27dG5c2edRFahUCArKwtA8RpAb29vxMXFAQAWLlyINm3awMvLC15eXvjnn3+056GuXbvCy8sLaWlp2Lp1K7p06YL27dvDy8sL0dHR2u0lJCSgXbt26Ny5M6ZPnw4hhPa5EydOwMfHBx4eHujcuTN+/vlnAMDt27cREBCAdu3awcPD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a9aEr68vFi9erF12/fp1XLt2rdSYCzPkPV6wYAGuX7+OlStX6iwfNGgQFi9erO38cu/ePVy6dEnvNvr06YONGzciLy8Pjx8/xrp163TuKv3555/w9PSU+A5YN96qtnIhISGwt7dHdnY22rZti+joaDz33HMAgMWLF2Pq1KlYvHgx2rZtiy5dumhft2nTJowfPx6fffYZOnTooPPcli1b8OqrryIiIgIKhQJr166Fq6srvv/+e8yePRtCCOTn52PMmDHw8PDQG9fixYuxdu1aCCFgb2+Pb7/9FlWq6P+dM2TIEOzcuRNt27aFm5ubzlAZvXr1wpIlS+Dp6QkfHx+sWrUKX331FUaPHg21Wo06depoe11/88032LJlC+zs7CCEwKpVqyrkPSai0pnaeahWrVpYsGABOnfujCZNmmDQoEHFYi6orVq0aBHGjh2LdevWoUOHDnj22WcBABkZGQgJCUF2djYUCgWefvppjB07FgDwxhtvoGfPnnBwcMCPP/6IyMhIDB48GI0bN4aPjw+aNGkCALC3t8e2bdswdepUODg4wM/PT/ucnZ0dvv32W7z22mvIzs5GtWrV8M0336B69eqIi4vD0qVLYWNjA7VajU8++UR7+7no+75p0yZMmDDB4M9sy5YtCAsL0zYPqFGjBlatWgWlUllizIa+xwXmzp2LVq1awdvbGwDQqFEjREdHIyIiArNmzYKXlxeqVKkCW1tbfPTRR2jZsmWxbbzyyiu4fPkyOnToAEDTeea1117TPn/gwAF8+OGHBr8P1kghpNYrExERWbm0tDQ0bdoUDx8+LPFWubnIz89Hp06dsGfPnhLbX1qDc+fOYfLkydpaUiodb1UTERFJkJiYiOeeew4ffPCB2SeNAFClShWsXr0aV69elTsUWaWkpPAOkwFY40hEREREkrDGkYiIiIgkYeJIRERERJIwcSQiIiIiSZg4EhEREZEkTByJiIiISBImjkREREQkCRNHIiIiIpKEiSMRERERScLEkYiIiIgkYeJIRERERJIwcSQiIiIiSZg4EhEREZEkTByJiIiISJJKSxzDw8OhUCgQGhpaWbskIjJL4eHh6NSpE2rWrIn69evjxRdfxIULF+QOi4iochLHxMRErFmzBh4eHpWxOyIis3b48GFMmzYNx48fR0xMDB4/foyAgABkZ2fLHRoRWTmFEEIYcwdZ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\n",
      "text/plain": [
       "<Figure size 700x700 with 4 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(7,7))\n",
    "plt.subplot(2,2,1)\n",
    "plt.title('Dados Brutos\\n',size=8)\n",
    "plt.scatter(Data[:,0],Data[:,1],color = 'black')\n",
    "plt.axis([-1,4,-1,4])\n",
    "\n",
    "#scale : quanto menor, maior o tamanho da seta\n",
    "plt.quiver(eixoMax[0,0],eixoMax[0,1],O[0,0],O[1,0], angles='xy',scale_units='xy', scale=1,color='red')\n",
    "plt.quiver(eixoMin[0,0],eixoMin[0,1],O[0,1],O[1,1], angles='xy',scale_units='xy', scale=1,color='blue')\n",
    "\n",
    "plt.grid(True)\n",
    "\n",
    "eixoMax=np.array([[0,0],O[:,0]])\n",
    "eixoMin=np.array([[0,0],O[:,1]])\n",
    "\n",
    "plt.subplot(2,2,2)\n",
    "plt.title('Dados ajustados (media zero)\\n',size=8)\n",
    "plt.scatter(DataAdjust[:,0],DataAdjust[:,1],color = 'black')\n",
    "plt.axis([-2,2,-2,2])\n",
    "\n",
    "\n",
    "plt.quiver(eixoMax[0,0],eixoMax[0,1],O[0,0],O[1,0], angles='xy', scale_units='xy', scale=1,color='red')\n",
    "plt.quiver(eixoMin[0,0],eixoMin[0,1],O[0,1],O[1,1], angles='xy', scale_units='xy', scale=1,color='blue')\n",
    "plt.grid(True)\n",
    "\n",
    "\n",
    "udat=np.mean(FinalData,axis=0);\n",
    "xdat=np.array([ [-1, udat[1] ],[5, udat[1] ] ]); #reta horizontal\n",
    "ydat=np.array([ [ udat[1], -1 ],[ udat[1], 4 ] ]); #reta vertical\n",
    "plt.suptitle(\"Principal Components Analysis - PCA\")\n",
    "plt.subplot(2,2,3)\n",
    "plt.title(\"DadosRotacionados=Dados.Autovetores\\n\",size=8)\n",
    "plt.scatter(FinalData[:,0],FinalData[:,1],color = 'black')\n",
    "plt.plot(ydat[:,0],ydat[:,1],color='blue')\n",
    "plt.plot(xdat[:,0],xdat[:,1],color='red')\n",
    "plt.axis([-1,4,-1,4])\n",
    "plt.grid(True)\n",
    "\n",
    "\n",
    "eixoMax=np.array([[-2,0],\n",
    "                  [ 2,0]]) #os pontos p1=(-2,0) e p2=(2,0)\n",
    "eixoMin=np.array([[0,-2],\n",
    "                  [0, 2]])\n",
    "plt.subplot(2,2,4)\n",
    "plt.title('Media zero rotacionados pelo maior eixo (vermelho)\\n',size=8)\n",
    "plt.scatter(FinalDataAdjust[:,0],FinalDataAdjust[:,1],color = 'black')\n",
    "plt.plot(eixoMin[:,0],eixoMin[:,1],color='blue');\n",
    "plt.plot(eixoMax[:,0],eixoMax[:,1],color='red');\n",
    "\n",
    "plt.axis([-2,2,-2,2])\n",
    "plt.grid(True)\n",
    "\n",
    "plt.tight_layout(pad=3) # espaço entre as janelas"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Matriz de Covariância dos dados transformados"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [],
   "source": [
    "Ky=np.cov(FinalDataAdjust.T)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[1.28575130e+00 5.85951041e-17]\n",
      " [5.85951041e-17 4.93598137e-02]]\n"
     ]
    }
   ],
   "source": [
    "print(Ky)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Observe que alguns números acima são da ordem de e-17, ou seja, praticamente zero"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [],
   "source": [
    "D=np.diag(autoVal)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1.2857513 , 0.        ],\n",
       "       [0.        , 0.04935981]])"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "D"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Assim vemos que $K_Y$ é igual aos autovalores de $K$ (ou $K_X$). Ou seja, as diagonais correspondem às variâncias e as não diagonais as covariâncias  $\\sigma^{2}_{X_i,X_j}$, que são praticamente zero. Ou seja, os novos dados estão descorrelacionados."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1.2857513 , 0.        ],\n",
       "       [0.        , 0.04935981]])"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.round(Ky,8)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Vimos que de um VETOR DE VARIÁVEIS ALEATÓRIAS $X$ correlacionados, \n",
    "# podemos encontrar um VETOR DE VARIÁVEIS ALEATÓRIAS $Y = O'X$, \n",
    "# com eixos descorrelacionados"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Cada autovalor $D$ corresponde a quantidade explicativa do seu eixo correspondente\n",
    "## Assim, a proporção de variância explicada pelo $i$-ésimo componente é $pv_i = \\frac{\\lambda_i}{\\sum\\limits_{i=1}^{p}\\lambda_i}$, onde $\\lambda_i$ é um autovalor de $D$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Porcentagem explicativa do primeiro componente (eixo)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "96.30%\n"
     ]
    }
   ],
   "source": [
    "print(f'{(D[0,0]/np.sum(D))*100:.2f}%')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Porcentagem explicativa do segundo componente"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "3.70%\n"
     ]
    }
   ],
   "source": [
    "print(f'{(D[1,1]/np.sum(D))*100:.2f}%')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Vemos que o segundo eixo, explica muito pouco sobre os dados \n",
    "### Podemos realizar a PCA escolhendo somente o primeiro autovetor de $O$ e já explicaríamos $96.3\\%$\n",
    "### Logo, podemos desprezar o segundo eixo, pois explica muito pouco."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Podemos reduzir o conjunto de variáveis aleatórias $Y_=O'_{px1}X$ com somente uma variável"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### No caso analizado acima, os novos dados reduzidos poderiam ser"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-0.17304596,  0.1828758 ,  0.38399082,  0.14052665, -0.21978491,\n",
       "        0.17607576, -0.33422207, -0.0639884 ,  0.03826913, -0.13069681])"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "DataReduz = DataAdjust@O[:,1]\n",
    "DataReduz"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Veja acima que agora temos somente uma VARIÁVEL ALEATÓRIA"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Reduzindo o número de eixos principais\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Dados $k\\leq p$ eixos podemos saber o quanto esses eixos explicam os dados através da porcentagem acumulada  $pvt{_k} = \\frac{{\\sum\\limits_{i=1}^{k}\\lambda_i}}{\\sum\\limits_{i=1}^{p}\\lambda_i}$ \n",
    "### Assim se $pvt{_k}$  já é suficiente, podemos utilizar somente esses $k$ componentes principais para análise"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Enquanto somente rotacionamos os dados nos eixos de maior variação (explicação), estamos fazendo a TKL\n",
    "## Quando reduzimos os eixos, estamos fazendo a PCA"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## A PCA depende da TKL. Grosseiramente, chamamos tudo de PCA, mas não é a mesma coisa."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Eu costumo escolher $k$ quando $pvt_{k} \\geq 0.75$. Mas existem várias regras na literatura."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "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.9.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
