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 FastICA import matplotlib.pyplot as plt class ICA_st: def __init__(self, database, test_size=0.2): self.database = database self.test_size = test_size self.desc = r''' # **ICA (Independent Component Analysis)** ICA es un método que se utiliza para identificar las componentes de una señal multivariada. De esta manera es que podemos extraer un componente que se encuentre mezclados con otros. - A $X$ restarle su media $\bar{X}$ - Transformar $X$ de manera que las potenciales correlaciones entre las componentes sean removidas y que la varianza para cada componente sea igual a 1. (Hacer que la matriz de covarianza se parezca a la matriz de identidad) $$ \hat{x} = E \cdot \sqrt{D} \cdot E^{T} \cdot x $$ - $D$: Diagonal con valores propios (de la matriz de covarianzas) - $E$: Matrix con vectores propios (de la matriz de covarianzas) - Escoger valores aleatorios para armar la matriz $W$. - Calcular los nuevos valores para $W$ $$ w_{i} = \frac{1}{n} \sum X \cdot tanh(W^{T} \cdot X) - \frac{1}{n} \sum X \cdot (1 - tanh^{2}(W^{T} \cdot X) \cdot W) $$ $$ w_{i} = w_{i} - \sum_{j=1}^{p-1} (w_{p}^{T}w_{j})w_{j} $$ - Normalizar $w_{p}$ $$ w_{p} = \frac{w_{p}}{||w_{p}||} $$ - Chequear condición de termino. Si no se cumple volvemos a calcular los nuevos valores de $w$ $$ w_{p}^{T}w_{p+1} - 1 < Tolerance $$ - Calcular las fuentes independientes como $S = W \cdot X$''' 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 = FastICA(n_components=self.n_components) X_proyected_sk = sklearn_clus.fit_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() return plt.gcf()