File size: 2,786 Bytes
42d0bac
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import streamlit as st
import pandas as pd
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVR
from sklearn.decomposition import PCA as PCA_sk
import matplotlib.pyplot as plt

class PCA_st:
    def __init__(self, database, test_size=0.2):
        self.database = database
        self.test_size = test_size
        self.desc = r'''
        # **PCA (Principal Component Analysis)**

        El objetivo principal con este m茅todo es definir una nueva dimensi贸n para el set de datos (siendo estas nuevas dimensiones ortogonales y por tanto independientes).

        **Varianza**

        $$
        var(X) = \frac{1}{n} \sum (X_{i} - \bar{X})^2
        $$

        **Matriz de Covarianzas**

        $$
        Cov(X, Y) = \frac{1}{n} \sum (X_{i} - \bar{X})(Y_{i} - \bar{Y})^T
        $$

        $$
        Cov(X, X) = \frac{1}{n} \sum (X_{i} - \bar{X})(X_{i} - \bar{X})^T
        $$

        **Valores y Vectores Propios**

        Los vectores propios apuntan en la direcci贸n donde se genera la m谩xima varianza y el correspondiente valor propio indica el grado de importancia del vector.

        $$
        A \vec{v} = 位 \vec{v}
        $$

        **Metodo**
        - Sustraer al vector X su media.
        - Calcular la Cov(X, X)
        - Calcular los vectores y valores propios de las matrices de covarianza
        - Ordenar los vectores propios seg煤n su importancia (en base a su valor propio) en orden decreciente
        - Escoger los primeros k vectores propios y estos pasaran a ser las nuevas k dimensiones
        - Por 煤ltimo, transformar (proyectar) los datos en las nuevas dimensiones (esto se hace con un producto punto)'''

        self.x_feature = 1
        self.y_feature = 2
        self.n_components = 2

    def params(self):
        n_features = int(self.database.data.shape[1])
        self.n_components = st.slider('Numero de componentes', 1, n_features, 2)

    def solve(self):
        self.x_feature = st.slider('Componente eje x', 1, self.n_components, 1)
        self.y_feature = st.slider('Componente eje y', 1, self.n_components, 2)
        X = self.database.data
        y = self.database.target
        sklearn_clus = PCA_sk(n_components=self.n_components)
        sklearn_clus.fit(X)
        X_proyected_sk = sklearn_clus.transform(X)

        x1 = X_proyected_sk[:, self.x_feature-1]
        x2 = X_proyected_sk[:, self.y_feature-1]

        plt.figure(1, figsize=(12, 8))
        plt.scatter(x1, x2, c=y, edgecolors='none', alpha=0.8, cmap=plt.cm.get_cmap('viridis', len(y)))
        plt.xlabel(f'Componente {self.x_feature}')
        plt.ylabel(f'Componente {self.y_feature}')
        plt.colorbar()

        #fig = plt.show().get_fig()
        return plt.gcf()