Spaces:
Sleeping
Sleeping
| 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.discriminant_analysis import LinearDiscriminantAnalysis | |
| import matplotlib.pyplot as plt | |
| class LDA_st: | |
| def __init__(self, database, test_size=0.2): | |
| self.database = database | |
| self.test_size = test_size | |
| self.desc = r''' | |
| # **LDA (Linear Discrimination Analysis)** | |
| **Objetivo** | |
| Reducir el número de variables (**features**). | |
| El objetivo es proyectar un conjunto de datos a un espacio dimensional más reducido. (Similar a como se hacía con **PCA**) | |
| **PCA vs LDA** | |
| - **PCA**: Encontrar los ejes que maximizan la varianza en los datos. | |
| - **LDA**: El interés esta puesto en los ejes que maximizan la separación entre clases de datos. | |
| - **LDA**: es un tipo de **aprendizaje supervisado** (utiliza la clasificación (etiquetas) de los datos para entrenar al algoritmo), en cambio **PCA** es un tipo de **aprendizaje no supervisado** (sin etiquetas) | |
| **Within-class scatter matrix** | |
| $$ | |
| S_{w} = \sum_{c} S_{c} | |
| $$ | |
| $$ | |
| S_{c} = \sum_{i \in c} (x_{i} - \bar{x_{c}}) \cdot (x_{i} - \bar{x_{c}})^{T} | |
| $$ | |
| **Between class scatter matrix** | |
| $$ | |
| S_{B} = \sum_{c} η \cdot (\bar{x_{c}} - \bar{x}) \cdot (\bar{x_{c}} - \bar{x})^{T} | |
| $$ | |
| **Vectores y valores propios** | |
| Calcular los vectores y valores propios de la siguiente matriz: | |
| $$ | |
| S_{W}^{-1} S_{B} | |
| $$ | |
| **Método** | |
| - Calcular $S_{B}$ | |
| - Calcular $S_{W}$ | |
| - Calcular los vectores y valores propios de $S_{W}^{-1} S_{B}$ | |
| - Ordenar los vectores propios en función de los valores propios de manera decreciente | |
| - Escoger los primeros k vectores propios los cuales vendrán a representar las nuevas k dimensiones | |
| - Transformar los datos en las nuevas dimensiones (**se hace con producto punto**) ''' | |
| self.x_feature = 1 | |
| self.y_feature = 2 | |
| self.n_components = 2 | |
| def params(self): | |
| self.n_clases = len(set(self.database.target)) | |
| self.n_features = int(self.database.data.shape[1]) | |
| self.min = int(np.min([self.n_clases-1, self.n_features])) | |
| if self.min == 1: pass | |
| elif self.min == 2: self.n_components = 2 | |
| else: self.n_components = st.slider('Numero de componentes', 2, self.min, 2) | |
| def solve(self): | |
| if self.min == 1: pass | |
| else: | |
| 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 = LinearDiscriminantAnalysis(n_components=self.n_components) | |
| sklearn_clus.fit(X, y) | |
| 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(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() | |
| return plt.gcf() | |