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() | |