sklearn_demo / LDA.py
raaraya's picture
Upload 15 files
42d0bac
raw
history blame
3.46 kB
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()