Repository: dpuenteramirez/Semisupervised-learning-and-instance-selection-methods (language: python)

Issue:
Introduction && Directory Structure - TPD

Introduction && Directory Structure - TPD

Create Conda Environment config file

Programmer's Manual - TPD

Programmer's Manual - TPD

Some comments about the documentation
Some comments about the documentation:

[memoriaAAG.pdf](https://github.com/dpr1005/Semisupervised-learning-and-instance-selection-methods/files/8426313/memoriaAAG.pdf)
[anexosAAG.pdf](https://github.com/dpr1005/Semisupervised-learning-and-instance-selection-methods/files/8426314/anexosAAG.pdf)

_Originally posted by @alvarag in https://github.com/dpr1005/Semisupervised-learning-and-instance-selection-methods/issues/157#issuecomment-1090146154_
Change Use Cases long tables to normal tables

Add description to python libraries - Programmer's Manual

Setup User Experience Survey
The objective is to create a survey or similar which a number of users of all ages and knowledge areas will be asked to complete after making some use of the developed software.
E/R Diagram - DSA

E/R Diagram - DSA

E/R Diagram - DSA

Setup User Experience Survey
The objective is to create a survey or similar which a number of users of all ages and knowledge areas will be asked to complete after making some use of the developed software.
Write tests for instance selection algorithms



Discussion / hints:

Fix patch:
diff --git a/docs/anexos.pdf b/docs/anexos.pdf
index a36d3a4..e827998 100644
Binary files a/docs/anexos.pdf and b/docs/anexos.pdf differ
diff --git a/docs/anexos.tex b/docs/anexos.tex
index 27c9814..c340c1c 100644
--- a/docs/anexos.tex
+++ b/docs/anexos.tex
@@ -8,6 +8,7 @@
 \usepackage{lmodern} % scalable font
 \usepackage{microtype}
 \usepackage{placeins}
+\usepackage{tabularx}
 
 \RequirePackage{booktabs}
 \RequirePackage[table]{xcolor}
@@ -45,6 +46,31 @@
 % Evitar solapes en el header
 \nouppercaseheads
 
+% Code
+\usepackage{listings}
+\usepackage{color}
+
+\definecolor{dkgreen}{rgb}{0,0.6,0}
+\definecolor{gray}{rgb}{0.5,0.5,0.5}
+\definecolor{mauve}{rgb}{0.58,0,0.82}
+\lstset{frame=tb,
+  aboveskip=3mm,
+  belowskip=3mm,
+  showstringspaces=false,
+  columns=flexible,
+  basicstyle={\small\ttfamily},
+  numbers=none,
+  numberstyle=\tiny\color{gray},
+  keywordstyle=\color{blue},
+  commentstyle=\color{red},
+  stringstyle=\color{mauve},
+  breaklines=true,
+  breakatwhitespace=true,
+  tabsize=3,
+  captionpos=b
+}
+
+
 % Imagenes
 \usepackage{graphicx}
 \newcommand{\imagen}[2]{
@@ -56,6 +82,15 @@
 	\FloatBarrier
 }
 
+\newcommand{\imagenRuta}[3]{
+	\begin{figure}[!h]
+		\centering
+		\includegraphics[width=0.9\textwidth]{#1}
+		\caption{#2}\label{fig:#3}
+	\end{figure}
+	\FloatBarrier
+}
+
 \newcommand{\imagenflotante}[2]{
 	\begin{figure}%[!h]
 		\centering
@@ -65,7 +100,6 @@
 }
 
 
-
 % El comando \figura nos permite insertar figuras comodamente, y utilizando
 % siempre el mismo formato. Los parametros son:
 % 1 -> Porcentaje del ancho de página que ocupará la figura (de 0 a 1)
diff --git a/docs/bibliografiaAnexos.bib b/docs/bibliografiaAnexos.bib
index bbec315..3dc934f 100644
--- a/docs/bibliografiaAnexos.bib
+++ b/docs/bibliografiaAnexos.bib
@@ -209,4 +209,16 @@ @ARTICLE{720574
 
 @ARTICLE{IEEE1220722020,  author={},  journal={IEEE Std 12207-2-2020},   title={Systems and software engineering--Software life cycle processes--Part 2: Relation and mapping between ISO/IEC/IEEE 12207:2017 and ISO/IEC 12207:2008},   year={2020},  volume={},  number={}}
 
- @misc{ingenieriasoftwareytiemporeal_2020, title={IEEE830-ESP - ctr.unican.es}, url={https://ctr.unican.es/asignaturas/is1/IEEE830_esp.pdf}, journal={ISTR - Ingeniería Software y Tiempo Real}, author={Ingeniería Software y Tiempo Real, ISTR}, year={2020}} 
\ No newline at end of file
+ @misc{ingenieriasoftwareytiemporeal_2020, title={IEEE830-ESP - ctr.unican.es}, url={https://ctr.unican.es/asignaturas/is1/IEEE830_esp.pdf}, journal={ISTR - Ingeniería Software y Tiempo Real}, author={Ingeniería Software y Tiempo Real, ISTR}, year={2020}} 
+
+ @misc{pythonGetIt, title={Python Download}, url={https://www.python.org/getit/}}
+
+ @misc{gitkraken, title={GitKraken}, url={https://www.gitkraken.com/}}
+
+ @misc{VSCode, title={Visual Studio Code}, url= {https://code.visualstudio.com/}}
+
+ @misc{PyCharm, title={PyCharm}, url= {https://www.jetbrains.com/pycharm/}}
+
+ @misc{VSCode-Remote-SSH, title={Remote SSH}, url={https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh}}
+
+ @misc{Remote-Development-Tricks-Tips, title={Remote Development Tips and Tricks}, url={https://code.visualstudio.com/docs/remote/troubleshooting#_installing-a-supported-ssh-client}, year={2022}, author={Microsoft}}
\ No newline at end of file
diff --git a/docs/img/anexos/design/relational.png b/docs/img/anexos/design/relational.png
new file mode 100644
index 0000000..6b57054
Binary files /dev/null and b/docs/img/anexos/design/relational.png differ
diff --git a/docs/img/anexos/manual-programador/gitkraken.png b/docs/img/anexos/manual-programador/gitkraken.png
new file mode 100644
index 0000000..5ebd45c
Binary files /dev/null and b/docs/img/anexos/manual-programador/gitkraken.png differ
diff --git a/docs/memoria.pdf b/docs/memoria.pdf
index b5c950d..078d62c 100644
Binary files a/docs/memoria.pdf and b/docs/memoria.pdf differ
diff --git a/docs/misc/survey_steps.pdf b/docs/misc/survey_steps.pdf
new file mode 100644
index 0000000..018f3eb
Binary files /dev/null and b/docs/misc/survey_steps.pdf differ
diff --git a/docs/misc/survey_steps.tex b/docs/misc/survey_steps.tex
new file mode 100644
index 0000000..094b400
--- /dev/null
+++ b/docs/misc/survey_steps.tex
@@ -0,0 +1,157 @@
+\documentclass[
+	12pt,
+	spanish
+]{article}
+
+% Template-specific packages
+\usepackage[utf8]{inputenc} % Required for inputting international characters
+\usepackage[spanish]{babel}
+\usepackage{cmbright}
+\usepackage{hyperref}
+\hypersetup{
+    colorlinks=true,
+    linkcolor=red,
+    filecolor=magenta,      
+    urlcolor=blue,
+    pdftitle={Overleaf Example},
+    pdfpagemode=FullScreen,
+    }
+\usepackage[T1]{fontenc} % Output font encoding for international characters
+
+\usepackage{graphicx} % Required for including images
+
+\usepackage{booktabs} % Required for better horizontal rules in tables
+
+\usepackage{listings} % Required for insertion of code
+
+\usepackage{enumerate} % To modify the enumerate environment
+\newcommand{\direccion}{http://puenramihome.ddns.net:8081}
+\newcommand{\mailUBU}{mailto:dpr1005@alu.ubu.es}
+\newcommand{\mailPersonal}{mailto:dani.pr21@gmail.com}
+
+%----------------------------------------------------------------------------------------
+%	ASSIGNMENT INFORMATION
+%----------------------------------------------------------------------------------------
+
+\title{
+\begin{figure}[h!]
+\centering
+\includegraphics[width=0.5\linewidth]{../img/escudoInfor.pdf}
+\end{figure}
+Encuesta de funcionalidad de UBUMLaaS} % Assignment title
+
+\author{Daniel Puente Ramírez} % Student name
+
+%----------------------------------------------------------------------------------------
+
+\begin{document}
+
+\maketitle 
+\thispagestyle{empty}
+\clearpage
+\tableofcontents
+\thispagestyle{empty}
+\clearpage
+\setcounter{page}{1}
+\section{Objetivo y actores involucrados}
+Este documento es una recopilación de la información asociada al proceso de pruebas que se realiza en UBUMLaaS por actores externos, los cuales deben de seguir esta documentación con el fin de realizar las pruebas más importantes y para las cuáles se ha diseñado una \href{https://forms.gle/yUoBxDyR3BaF7TjDA}{encuesta} de satisfacción.
+
+El objetivo principal es conocer la interacción del usuario con la aplicación, recibir una retroalimentación tanto positiva como negativa de forma que sirva de entrada al proceso de calidad que se va a llevar a cabo. 
+
+Además, se aprovecha la oportunidad para recuperar información acerca de los posibles fallos que haYa en el sistema que han ido pasando desapercibidos tanto en las pruebas automáticas como durante el proceso de desarrollo <<al ojo>>. 
+
+Los actores que se desea participen en esta encuesta han de ser lo más diversos posibles, tanto en estudios, formación, conocimientos técnicos sobre Aprendizaje Máquina (\textit{Machine Learning}). Así como la propia relación con el equipo de desarrollo, de forma que se eviten sesgos y con todo el conjunto de muestras se obtenga una visión suficientemente amplia del estado del proyecto.
+
+Todas las pruebas que se van a documentar a continuación son lo más sencillas posibles para que cualquier usuario, independientemente de sus conocimientos técnicos, sea capaz de llevarlas a cabo. Se deja a libertad del usuario la posibilidad de seguir probando cualquier funcionalidad de la plataforma de ML una vez haya finalizado estas pruebas.
+
+\clearpage
+\section{Pruebas de Registro e Inició de Sesión}
+A continuación se detallan los pasos deseados a realizar.
+\begin{enumerate}
+\item Navegar hasta la \href{\direccion}{dirección web} con el navegador de su elección.
+\item En caso de no disponer de una cuenta todavía, acceda al registro de nuevos usuarios.
+\begin{enumerate}
+\item Indique un nombre de usuario, deberá ser único en el sistema por lo que puede ser que se le mande repetir la operación hasta que dé con uno disponible.
+\item Se le solicitará un correo electrónico, de igual manera deberá ser un correo electrónico que no exista todavía. Importante que sea un correo electrónico al que tenga acceso pues más adelante deberá utilizarlo.
+\item Indique una contraseña, deberá ser de longitud mínima 8 caracteres, no hay longitud máxima, así como contener al menos una letra mayúscula y una minúscula, un carácter especial, y un número.
+\item Indique el uso que se le va a dar al sistema.
+\item Indique su país de origen o residencia actual.
+\item Una vez todos los campos sean correctos, podrá finalizar enviando el formulario.
+\item Se le enviará un correo electrónico para que verifique su identidad y active la cuenta que acaba de crear.
+\end{enumerate}
+\item Una vez que posee una cuenta y ya la ha activado, deberá de volver al \href{\direccion}{índice} y proceder con el inicio de sesión.
+\item Cuándo se encuentre en la pantalla correspondiente al inicio de sesión se encontrará con un formulario de nuevo, por favor indique en los correspondientes campos sus credenciales.
+\item Este conjunto de pruebas han finalizado, por favor reporte sus resultados en la sección correspondiente.
+\end{enumerate}
+
+\clearpage
+\section{Pruebas de Uso de UBUMLaaS}
+A continuación se detalla el proceso de uso de la plataforma para crear nuevos experimentos. Se detalla el proceso general, se deja a libertad del usuario el indagar en las funcionalidades más específicas del proceso de Aprendizaje Máquina.
+
+\begin{enumerate}
+\item Una vez se encuentre en el índice \textbf{después} de haber iniciado sesión, encontrará un botón que indica la creación de un nuevo experimento. Este botón le llevará a una nueva página que deberá completar.
+\item Ahora se encuentra en la página de creación de nuevos experimentos. Puede rellenar los campos en cualquier orden, pero debe de tener en cuenta que la elección de determinados valores propiciará cambios en otros campos. Por ejemplo, determinados algoritmos poseen filtros, otros no, etc.
+
+El orden recomendado es el siguiente:
+\begin{enumerate}
+\item Seleccione el conjunto de datos que desea utilizar, puede también subir uno de su colección personal, tenga en cuenta que deberán de ser complacientes con el estándar esperado por la aplicación para cada tipo de algoritmos o de lo contrario el modelo puede no ser entrenado correctamente o incluso fallar. Al crear la cuenta se le proporcionaron 5 por defecto.
+\item Seleccione el tipo de algoritmo que desea utilizar, dispone entre Clasificación, Regresión, Clasificación Semi-Supervisada, Multi-Clasificación, Clustering, o Mixed (Algoritmos compatibles con clasificación y regresión).
+\item Seleccione el algoritmo que desea utilizar.
+\item Parametrice el algoritmo tal y como considere apropiado para su problema.
+\item Seleccione un filtro en caso de desear utilizarlo. Son filtros de selección de instancias.
+\item Indique una semilla en caso de querer hacerlo con una no aleatoria. 
+\item Indique si desea utilizar validación cruzada o partición en entrenamiento y pruebas. E indique el número de \textit{folds} o los porcentajes de partición, respectivamente.
+\item Con todos los campos rellenos. Lance el experimento.
+\end{enumerate}
+\item Se le redirigirá a la página web dónde aparecerán los resultados una vez haya finalizado el experimento. También puede acceder desde su perfil.
+\item Se le notificará por correo electrónico cuándo el experimento haya finalizado.
+\end{enumerate}
+
+Este es el proceso de lanzar experimentos en la plataforma, se insta al usuario a que pruebe con distintos conjuntos de datos así como tipos de experimentos. 
+
+Cuando considere que ha finalizado, reporte los resultados en la sección correspondiente de la encuesta.
+\vfill
+
+
+\textbf{NOTA.} Es normal que algunos experimentos fallen, en caso de que el usuario parametrice mal el experimento para el conjunto de datos con el que se encuentra trabajando. En este punto se recomienda a los usuarios con conocimientos más avanzados en ML y experiencia trabajando con \texttt{Weka} y \texttt{Scikit-Learn} pongan a prueba la funcionalidad esperada bajo sus correspondientes criterios.
+\pagebreak
+
+\section{Pruebas de Usuario}
+En esta nueva sección se van a realizar pruebas muy sencillas sobre algunas de las funcionalidades que el usuario puede realizar sobre su propio perfil.
+
+\begin{enumerate}
+\item En caso de no haber iniciado sesión, por favor inicie sesión.
+\item Navegue hasta su perfil, lo puede encontrar como sus experimentos también.
+\item La primera de las pruebas que se desea que realice es actualizar su foto de perfil. La plataforma soporta la mayoría de los formatos de \textbf{imagen}.
+\item Seguidamente actualice sus datos personales, como por ejemplo podría ser su país.
+\item Añada algunos campos adicionales como su Twitter o GitHub.
+\item Si lo desea puede cambiar su contraseña.
+\end{enumerate} 
+
+\pagebreak
+\section{Pruebas de Administrador}
+No todos los usuarios participantes en esta encuesta tendrán acceso de administrador al sistema por razones más que obvias. En caso de estar entre los elegidos, por favor continue con esta sección, de no estarlo acuda a la sección~\ref{sec:fin}.
+
+Las pruebas que se van a realizar aquí son sencillas, principalmente de visualización. No se espera que conozca al detalle todo lo que aparece en pantalla o lo que hace cada botón. No tenga miedo a romper nada, no lo conseguirá, y de conseguirlo, mejor para el desarrollo de la aplicación, ¡indíquelo en la encuesta!
+
+\begin{enumerate}
+\item Con la sesión iniciada notará que hay una barra lateral con diferentes opciones, este es el panel de administración.
+\item En dicho panel seleccione el \textit{Dashboard}. Aquí podrá encontrar las estadísticas y analíticas generales de uso del sistema y algunos datos en concreto de uso de los últimos 7 días. ¿Observa algo extraño? ¿Entiende a qué hace referencia cada gráfico?
+\item Continúe navegando en el panel lateral a la monitorización del sistema en tiempo real. ¿Observa algo extraño? ¿Entiende a qué hace referencia cada gráfico?
+\item Navegue ahora a la administración de usuarios. Pruebe a (de)activar, hacer admin o quitar admin a los usuarios, incluso puede eliminar el usuario que desee. En caso de eliminar usuarios por favor revise la dirección de correo electrónico y elimine aquellas que parezcan falsas.
+\end{enumerate}
+
+Como habíamos prometido iban a ser pruebas sencillas.
+
+\pagebreak
+\section{Finalizando}\label{sec:fin}
+
+Con el proceso finalizado de insta a rellenar todos aquellos campos en la encuesta que todavía quedaran pendientes y a enviar el resultado. No dude en escribir de forma extensa en aquellos campos que así lo permiten, todo el \textit{feedback} recibido será utilizado en el proceso de mejora de la aplicación para hacerla más intuitiva, fácil de utilizar y por supuesto, libre de errores.
+
+En caso de querer comentar algún aspecto en concreto, por favor no dude en ponerse en contacto a través de cualquiera de los siguientes correos electrónicos.
+\begin{itemize}
+\item \href{\mailUBU}{Equipo de desarrollo} de la Universidad de Burgos.
+\item \href{\mailPersonal}{Dirección del proyecto.}
+\end{itemize}
+
+\end{document}
diff --git a/docs/tex/3_Conceptos_teoricos.tex b/docs/tex/3_Conceptos_teoricos.tex
index b9cefcd..1481656 100644
--- a/docs/tex/3_Conceptos_teoricos.tex
+++ b/docs/tex/3_Conceptos_teoricos.tex
@@ -3,11 +3,11 @@
 El proyecto tiene una relación directa con la minería de datos y los conceptos que lo rodean. 
 
 \section{Aprendizaje automático (\textit{machine learning})}\label{sec:machine-learning}
-En~\cite{sanchez_2020} se define el aprendizaje automático (\textit{machine learning}) como una rama dentro del campo de la Inteligencia Artificial que proporciona a los sistemas la capacidad de aprender y mejorar de manera automática, a partir de la experiencia. Estos sistemas transforman los datos en información, y con esta información pueden tomar decisiones. Este tipo de modelos se crean a base del uso masivo de datos. Cuando se dispone de los datos suficientes para entrenar un modelo comienza el proceso de aprendizaje. El objetivo de este aprendizaje es descubrir patrones ocultos en los datos. En muchas ocasiones el resultado del aprendizaje, el modelo, es una función que dadas unos datos de entrada clasifica o predice correctamente una salida. Como se puede ver en la Figura~\ref{fig:../img/memoria/Machine-learning-overview.pdf} el aprendizaje automático, \textit{machine learning}, posee diferentes aproximaciones, cada una de ellas con una aproximación diferente en cuanto al uso de instancias.
-\imagenflotante{../img/memoria/Machine-learning-overview.pdf}{\textit{Machine learning overview}~\cite{technovert_2020}}.
+En~\cite{sanchez_2020} se define el aprendizaje automático (\textit{machine learning}) como una rama dentro del campo de la Inteligencia Artificial que proporciona a los sistemas la capacidad de aprender y mejorar de manera automática, a partir de la experiencia. Estos sistemas transforman los datos en información, y con esta información pueden tomar decisiones. Este tipo de modelos se crean a base del uso masivo de datos. Cuando se dispone de los datos suficientes para entrenar un modelo comienza el proceso de aprendizaje. El objetivo de este aprendizaje es descubrir patrones ocultos en los datos. En muchas ocasiones el resultado del aprendizaje, el modelo, es una función que dadas unos datos de entrada clasifica o predice correctamente una salida. Como se puede ver en la Figura~\ref{fig:../img/memoria/Machine-learning-overview.pdf} el aprendizaje automático, \textit{machine learning}, posee diferentes aproximaciones, siendo la interfaz diferenciadora entre ellas la forma de uso de las instancias.
+\imagenflotante{../img/memoria/Machine-learning-overview.pdf}{\textit{Machine learning overview}~\cite{technovert_2020}}
 
 \subsection{Aprendizaje supervisado}\label{subsec:Aprendizaje-Supervisado}
-El aprendizaje automático puede ser resumido como <<aprender de ejemplos>>. Al programa se le proporcionan dos conjuntos de datos, uno de entrenamiento y otro de validación~\cite{learned2014introduction} El objetivo es simple, debe de <<aprender>> en función del conjunto de datos etiquetado proporcionado como entrenamiento para posteriormente identificar las correspondientes etiqueta/s de cada instancia del conjunto de validación con la mayor precisión posible. 
+El aprendizaje automático puede ser resumido como <<aprender de ejemplos>>. Al programa se le proporcionan dos conjuntos de datos, uno de entrenamiento y otro de validación~\cite{learned2014introduction}. El objetivo es simple, debe de <<aprender>> en función del conjunto de datos etiquetado proporcionado como entrenamiento para posteriormente identificar las correspondientes etiqueta/s de cada instancia del conjunto de validación con la mayor precisión posible. 
 
 Dependiendo del tipo de etiqueta, en el aprendizaje supervisado hay dos modelos~\cite{supervised_learning_mathworks_inc}.
 \begin{enumerate}
@@ -51,15 +51,15 @@ \subsection{Aprendizaje no supervisado}\label{subsec:Aprendizaje-No-Supervisado}
 \begin{enumerate}
 	\item \textbf{\textit{Clustering}}~\cite{unsupervised_learning_clustering}. Proceso por el cual se dividen los datos no clasificados en grupos aparentemente similares. Cuando se identifican datos con algún parecido entre sí, son agrupados. Permite clasificar e identificar atributos únicos de los datos con los que clasificarlos. 
 	
-	Un proceso habitual de agrupamiento es el uso de \textit{K-means}, $K\in\mathbb{R}$, donde se indica en $K$ cuántos \textit{clusters} o grupos se han de hacer con los datos. 
+	Un proceso habitual de agrupamiento es el uso de \textit{K-means}, $K\in\mathbb{R}$, donde se indica en $K$ cuántos \textit{clusters} o grupos se han de identificar en los datos.
 	
 	Con los datos agrupados el proceso de análisis de éstos puede comenzar. En ocasiones si el número de grupos detectados es muy alto, se pueden encontrar grupos o \textit{clusters} irrelevantes, permitiendo a los científicos de datos eliminar esos datos que los forman, reduciendo la dimensionalidad~\cite{boutsidis2014randomized}.
 	
-	\item \textbf{Reducción de la dimensionalidad.}El aprendizaje se basa en instancias/ejemplos y éstos a su vez están formados por atributos o características, lo cual permite su clasificación, valga la redundancia. Cuando los conjuntos de datos poseen múltiples características, más difícil resulta su clasificación. Es por ello que resulta útil identificar aquellos atributos que están fuertemente interrelacinados entre sí para eliminar todos menos un atributo, reduciendo la dimensionalidad~\cite{li2002unsupervised}.
+	\item \textbf{Reducción de la dimensionalidad}. El aprendizaje se basa en instancias/ejemplos y éstos a su vez están formados por atributos o características, lo cual permite su clasificación, valga la redundancia. Cuando los conjuntos de datos poseen múltiples características, más difícil resulta su clasificación. Es por ello que resulta útil identificar aquellos atributos que están fuertemente interrelacinados entre sí para eliminar todos menos un atributo, reduciendo la dimensionalidad~\cite{li2002unsupervised}.
 \end{enumerate}
 
 \subsection{Aprendizaje semi-supervisado}\label{subsec:Aprendizaje-Semi-Supervisado}
-Según~\cite{zhou2014semi} \textit{Semi-Supervised Learning} se define como una forma de entrenamiento de modelos el cual usa tanto datos etiquetados como no etiquetados, \textit{i.e.} si no sería un aprendizaje supervisado, Sección~\ref{subsec:Aprendizaje-Supervisado}, o no supervisado, Sección~\ref{subsec:Aprendizaje-No-Supervisado}. 
+Según~\cite{zhou2014semi} \textit{Semi-Supervised Learning} se define como una forma de entrenamiento de modelos el cual usa tanto datos etiquetados como no etiquetados, \textit{i.e.} si no sería un aprendizaje supervisado, o no supervisado. 
 
 El uso de aprendizaje semi-supervisado se caracteriza por ser menos costoso que el supervisado, ya que este último necesita que todo el conjunto de datos que va a utilizar para aprender esté etiquetado, y ese proceso es largo y costoso. Luego, obtiene mejores resultados en menor tiempo que el aprendizaje no supervisado. 
 Conseguir datos sin etiquetar es una tarea muy sencilla, mientras que conseguir conjuntos de datos etiquetados es un proceso complejo y actualmente no hay <<de todo>>.
@@ -75,10 +75,10 @@ \subsection{Aprendizaje semi-supervisado}\label{subsec:Aprendizaje-Semi-Supervis
 
 
 \section{Algoritmos en el aprendizaje semi-sepervisado}\label{sec_alg:semi-supervised}
-A continuación se van a presentar los algoritmos tratados en este trabajo.
+A continuación se van a presentar los algoritmos tratados en este trabajo dentro del aprendizaje semi-supervisado.
 
 \subsection{\textit{Self-training}}
-Los métodos de auto-entrenamiento (\textit{self-training}), son uno de los métodos más sencillos de pseudo-etiquetado que existen~\cite{triguero2015self} Consisten en un único clasificador el cual utiliza aprendizaje supervisado, el clasificador se encuentra siendo entrenado constantemente con datos etiquetados conocidos y por los que se van conociendo a medida que pasan las iteraciones. Es decir, el clasificador inicialmente es entrenado con aquellos datos para los que se posea una etiqueta, y en sucesivas iteraciones se le reentrenará con el nuevo conjunto de datos etiquetado, que es el resultante de añadir a los datos etiquetados previos, aquellas predicciones con un elevado \textit{condifence level}~\cite{jesper2020survey}.
+Los métodos de auto-entrenamiento (\textit{self-training}), son uno de los métodos más sencillos de pseudo-etiquetado que existen~\cite{triguero2015self}. Consisten en un único clasificador el cual utiliza aprendizaje supervisado, el clasificador es entrenado con datos etiquetados conocidos al comienzo del entrenamiento y por los que se van conociendo a medida que pasan las iteraciones. Es decir, el clasificador inicialmente es entrenado con aquellos datos para los que se posea una etiqueta, y en sucesivas iteraciones se le reentrenará con el nuevo conjunto de datos etiquetado, que es el resultante de añadir a los datos etiquetados previos, aquellas predicciones con un elevado \textit{condifence level}~\cite{jesper2020survey}.
 
 Yarowsky~\cite{yarowsky1995unsupervised} en 1995 propuso la primera versión de \textit{Self-training}, desde entonces numerosas aproximaciones han sido realizadas, modificando la utilización del conjunto de datos etiquetado, los nuevos datos, etcétera. El diseño que se le puede dar y los campos de aplicación del mismo son muy variados.
 
@@ -107,7 +107,7 @@ \subsection{\textit{Co-Training}}
 \end{algorithm}
 
 \subsection{\textit{Tri-Training}}
-Zhou~\cite{zhou2005tri} en 2005 propuso una modificación sobre el algoritmo de \textit{Co-Training} de Blum~\cite{blum1998combining} el cual requería de dos <<vistas significativas>>. Dasgupta~\textit{et al.}~\cite{dasgupta2002pac} demostraron que cuando los requerimientos del conjunto de datos se cumplían, se podían producir un menor número de errores de generalización al maximizar la clasificación de los prototipos sin etiquetar, aunque no es aplicable a cualquier conjunto de datos.
+Zhou~\cite{zhou2005tri} en 2005 propuso una modificación sobre el algoritmo de \textit{Co-Training} de Blum~\cite{blum1998combining}. Dasgupta~\textit{et al.}~\cite{dasgupta2002pac} demostraron que cuando los requerimientos del conjunto de datos se cumplían, se podían producir un menor número de errores de generalización al maximizar la clasificación de los prototipos sin etiquetar, aunque no es aplicable a cualquier conjunto de datos.
 
 El \textit{Tri-Training} se define como una nueva aproximación de \textit{Co-Training}. \textit{Tri-Training} no necesita varias <<vistas significas>> de los datos, tampoco requiere el empleo de múltiples algoritmos de aprendizaje supervisado cuyas hipótesis dividen el espacio de instancias en un conjunto de clases de equivalencia. El \textit{Tri-Training} por tanto emplea tres clasificadores, a diferencia de los dos utilizados anteriormente, esta opción resuelve la dificultad de determinar cómo etiquetar las instancias no etiquetadas y generar la hipótesis final, lo que mejora enormemente la eficiencia del algoritmo. Junto con la capacidad de generalización resultante de la combinación de los tres clasificadores.
 
@@ -169,7 +169,7 @@ \subsection{\textit{Democratic Co-Training}}
 
 Es por ello que \textit{Democratic Co-Learning} utiliza un conjunto de datos etiquetados, \textit{L}, uno de no etiquetados, \textit{U}, y $A_1,\dots ,A_n$ para $n \geq 3$, siendo $n$ los algoritmos de aprendizaje supervisado, ver algoritmo~\ref{alg:Democratic-Co}. El algoritmo comienza entrenando los $n$ clasificadores sobre el conjunto de datos etiquetado $L$; y para cada instancia $x$ del conjunto de no etiquetados $U$, cada clasificador predice una etiqueta $c_i \in \mathcal{C} = \lbrace c_1, c_2, \dots , c_r\rbrace$. Siendo $c_k$ la predicción mayoritaria. Posteriormente los $n$ clasificadores son re-entrenados con los nuevos datos etiquetados (añadidos a los que ya teníamos), este proceso se realiza de manera iterativa hasta que no se seleccionen más datos para realizar el etiquetado. Para la selección final se realizar un voto mayoritario ponderado entre los $n$ clasificadores. 
 
-Una instancia $x$ nunca será etiquetada por la decisión única de un clasificador, a menos que la mayoría de los clasificadores estén de acuerdo. Además se requiere que la suma de los valores medios de confianza de los clasificadores del grupo mayoritario sea mayor, que la suma de los valores medios de confianza de los clasificadores de los grupos minoritarios, siendo la confianza media de un clasificador $ \dfrac{(l + h)}{2}
+Una instancia $x$ nunca será etiquetada por la decisión única de un clasificador, a menos que la mayoría de los clasificadores estén de acuerdo. Además se requiere que la suma de los valores medios de confianza de los clasificadores del grupo mayoritario sea mayor, que la suma de los valores medios de confianza de los clasificadores de los grupos minoritarios, siendo la confianza media de un clasificador $ (l + h)/2
 $ para $l$ y $h$ definidas por el intervalo de confianza del 95\% $\left[l,h\right]$.
 
 Finalmente el algoritmo, ver algoritmo~\ref{alg:Democratic-Co-2}, finaliza con la combinación de todas las hipótesis generadas para retornar la hipótesis final. Para realizar el cálculo utiliza un sistema de votación mayoritaria de entre las posibles clases, para hilar un poco más fino, se considera también para cada clasificador su valor de confianza de la predicción. 
@@ -242,7 +242,7 @@ \subsection{\textit{Self-Training} basado en picos de densidad}
 El proceso por el cuál se consigue este nuevo clasificador <<mejorado>> es el siguiente:
 \begin{enumerate}
 \item Encontrar los picos de densidad de los datos para aprender la estructura subyacente de todo el espacio de datos de entrenamiento. Y se integra esta estructura en el proceso de entrenamiento iterativo de un clasificador.
-\item Se entrena un clasificador con los datos etiquetados. Se clasifican los ejemplos siguientes de los ya etiquetados hasta que no haya más, se predicen, y, se añaden y eliminan de los datos etiquetados y no etiquetados, respectivamente.
+\item Se entrena un clasificador con los datos etiquetados. Se clasifican los ejemplos siguientes de los ya etiquetados hasta que no haya más, se predicen y, se añaden y eliminan de los datos etiquetados y no etiquetados, respectivamente.
 \item Se repite el paso anterior pero con los puntos anteriores.
 \end{enumerate}
 
@@ -295,14 +295,14 @@ \subsection{Proceso de minería de datos}
 
 \begin{figure}
 \centering
-\includegraphics[width=0.75\textwidth]{./img/memoria/CRISP-DM}
-\caption{Enfoque CRISP de la minería de datos~\cite{KOTU201517}}.
+\includegraphics[width=0.7\textwidth]{./img/memoria/CRISP-DM}
+\caption{Enfoque CRISP de la minería de datos~\cite{KOTU201517}.}
 \label{./img/memoria/CRISP-DM}
 \end{figure}
 
 En~\cite{KOTU201517} se divide el proceso de la minería de datos en 5 etapas o pasos principales: establecimiento de los objetivos y comprensión del problema, recopilación y preparación de los datos, desarrollo del modelo, aplicación del modelo y la evaluación de los resultados y despliegue en producción. Ver Figura~\ref{fig:./img/memoria/machine-learning-pipeline}.
 
-\imagen{./img/memoria/machine-learning-pipeline}{\textit{Machine Learning Pipeline}~\cite{mlpipeline2018}}.
+\imagen{./img/memoria/machine-learning-pipeline}{\textit{Machine Learning Pipeline}~\cite{mlpipeline2018}.}
 
 \begin{enumerate}
    \item \textbf{Establecer los objetivos y comprensión del problema.}
@@ -404,14 +404,15 @@ \section{Técnicas de selección de instancias}\label{sec:tecnicas-seleccion-ins
 	\begin{tabular}{lc}
 	\toprule
 	\rowcolor[HTML]{EFEFEF} 
-	\textbf{Método}    & \textbf{Referencia} \\ \midrule
-	Algoritmo de edición de Wilson (ENN)              &~\cite{wilson1972asymptotic}\\ \midrule
+	\textbf{Método}    & \textbf{Referencia} \\
+	\toprule
+	Algoritmo de edición de Wilson (ENN)              &~\cite{wilson1972asymptotic}\\ 
 	\rowcolor[HTML]{EFEFEF} 
-	Algoritmo Condensado de Hart (CNN)              &~\cite{hart1968condensed}\\ \midrule
-	Algoritmo Condensado Reducido (RNN)              &~\cite{gates1972reduced}  \\ \midrule
+	Algoritmo Condensado de Hart (CNN)              &~\cite{hart1968condensed}\\ 
+	Algoritmo Condensado Reducido (RNN)              &~\cite{gates1972reduced}  \\ 
 	\rowcolor[HTML]{EFEFEF} 
-	Algoritmo \textit{Iterative Case Filtering} (ICF)                   &~\cite{brighton2002advances}\\ \midrule
-	Algoritmo Subconjunto Selectivo Modificado (MSS)                 &~\cite{barandela2005decision}\\ \midrule
+	Algoritmo \textit{Iterative Case Filtering} (ICF)                   &~\cite{brighton2002advances}\\ 
+	Algoritmo Subconjunto Selectivo Modificado (MSS)                 &~\cite{barandela2005decision}\\ 
 	\rowcolor[HTML]{EFEFEF} 
 	Algoritmo \textit{Drecremental Reduction Optimization Procedure} (DROP) &~\cite{wilson2000reduction} \\ \bottomrule
 	\end{tabular}
@@ -423,7 +424,7 @@ \section{Técnicas de selección de instancias}\label{sec:tecnicas-seleccion-ins
 En la Tabla~\ref{tab:instance-selection-methods} se aprecian aquellos algoritmos implementados en primera instancia para la reducción de instancias dentro de $T$, el objetivo de todos ellos es que el subconjunto generado, $S$, sea capaz de clasificar correctamente  $T$ en su totalidad prácticamente.
 
 \subsubsection{Algoritmos de selección de instancias}\label{subsubsec:Instance-Selection-Algorithms}
-Existen multitud de algoritmos a día de hoy que son capaces de reducir el número de instancias de $T$, en este trabajo se van a comentar los pertenecientes a la Tabla~\ref{tab:instance-selection-methods}. Cada uno de ellos tiene sus ventajas y sus desventajas como cabe esperar, en la literatura no apreciamos un ``este es mejor que aquel'' o similar.
+Existen multitud de algoritmos a día de hoy que son capaces de reducir el número de instancias de $T$, en este trabajo se van a comentar los pertenecientes a la Tabla~\ref{tab:instance-selection-methods}. Cada uno de ellos tiene sus ventajas y sus desventajas como cabe esperar, en la literatura no apreciamos un <<este es mejor que aquel>> o similar.
 
 \paragraph{Algoritmo de edición de Wilson}\label{paragraph:ENN}
 \hfill \break
@@ -439,6 +440,8 @@ \subsubsection{Algoritmos de selección de instancias}\label{subsubsec:Instance-
 
 Suponiendo que sea \textit{X} un conjunto de \textit{N} instancias y \textit{M} posibles clases y, sea \textit{k} el número de vecinos cercanos,el algoritmo de Wilson se puede formular de la siguiente manera:
 
+El algoritmo de edición de Wilson, ver algoritmo~\ref{alg:Wilson-ENN} posee una complejidad computacional de $O(n^2)$. Una de las ventajas de este algoritmo es su forma de crear el subconjunto $S$, ya que al ser descendente las primeras iteraciones serán lentas --- dependiendo del tamaño de $T$ lógicamente --- pero las finales serán considerablemente más rápidas (siempre y cuando haya un nivel significativo de ruido).
+
 \begin{algorithm}[H]
 	\KwIn{Conjunto de entrenamiento $X = \lbrace\left( x_1, y_1 ,\right)\dots \left(x_n, y_n\right)\rbrace$, $k$ número de vecinos.}
 	\KwOut{Conjunto editado $S \subset X$}
@@ -454,13 +457,20 @@ \subsubsection{Algoritmos de selección de instancias}\label{subsubsec:Instance-
   \caption{Algoritmo de edición de Wilson, \textit{ENN}}\label{alg:Wilson-ENN}
 \end{algorithm}
 
-El algoritmo de edición de Wilson, ver algoritmo~\ref{alg:Wilson-ENN} posee una complejidad computacional de $O(n^2)$. Una de las ventajas de este algoritmo es su forma de crear el subconjunto $S$, ya que al ser descendente las primeras iteraciones serán lentas --- dependiendo del tamaño de $T$ lógicamente --- pero las finales serán considerablemente más rápidas (siempre y cuando haya un nivel significativo de ruido).
-
-
 \paragraph{Algoritmo Condensado de Hart}\label{paragraph:CNN}
 \hfill \break
 Hart~\cite{hart1968condensed} en 1968 propuso la que se considera la primera regla formal de condensador para NN. El algoritmo de condensado de Hart, \textit{CNN --- Condensed Nearest Neighbor}. Está basado en técnicas de consistencia y reducción. Sea $X \not= \emptyset$ y $S \subseteq X$, podremos decir que el subconjunto $S$ es consistente respecto al conjunto $X$ si al utilizar a $S$ como conjunto de aprendizaje, se puede clasificar correctamente a todo el conjunto $X$.
 
+El algoritmo de Hart es una técnica ascendente, a partir de las primeras instancias que se añadan a $S$ se clasificarán y añadirán, o no, a $S$. Consiste en encontrar entre todas las instancias de $T$ un subconjunto $S$ tal que cada instancia de $T$ sea más cercano a las instancias en $S$ de su misma clase que a las instancias de otras clases, permitiendo utilizar $S$ como conjunto de clasificación de $T$. Para el correcto funcionamiento se asume que el conjunto $T$ es consistente, no posee dos instancias idénticas con pertenencia a diferentes clases.
+
+El algoritmo propuesto por Hart~\cite{hart1968condensed}, ver algoritmo~\ref{alg:Hart-CNN}, posee una complejidad computacional de $O(n^2)$. El conjunto obtenido a partir de $T$, \textit{i.e.} $S$, operando con grandes conjuntos de datos demuestra poseer un tamaño considerablemente menor respecto a $T$. 
+
+Si bien es una técnica utilizada por su efectividad, posee una serie de puntos negativos a su vez.
+\begin{itemize}
+\item Sensibilidad ante el ruido. Un objeto ruidoso no será correctamente clasificado por sus vecinos. Estas muestran no se eliminarán del conjunto solución $S$, por lo que no desaparecerán.
+\item $S$ no tiene porqué ser el menor conjunto de $T$. Diferentes ejecuciones del algoritmo sobre el mismo $T$ pueden dar diferentes conjuntos solución $S$. Esto se debe al orden aleatorio por el cual se seleccionan las instancias. Por definición del propio algoritmo se asume que no se va a alcanzar de forma general el subconjunto de tamaño mínimo que cumpla con las características especificadas.
+\end{itemize}
+
 \begin{algorithm}[H]
 	\KwIn{Conjunto de entrenamiento $X$}
 	\KwOut{Conjunto editado $S \subset X$}
@@ -476,18 +486,13 @@ \subsubsection{Algoritmos de selección de instancias}\label{subsubsec:Instance-
 	\caption{Algoritmo Condensado de Hart, \textit{CNN}.}\label{alg:Hart-CNN}
 \end{algorithm}
 
-El algoritmo de Hart es una técnica ascendente, a partir de las primeras instancias que se añadan a $S$ se clasificarán y añadirán, o no, a $S$. Consiste en encontrar entre todas las instancias de $T$ un subconjunto $S$ tal que cada instancia de $T$ sea más cercano a las instancias en $S$ de su misma clase que a las instancias de otras clases, permitiendo utilizar $S$ como conjunto de clasificación de $T$. Para el correcto funcionamiento se asume que el conjunto $T$ es consistente, no posee dos instancias idénticas con pertenencia a diferentes clases.
-
-El algoritmo propuesto por Hart~\cite{hart1968condensed}, ver algoritmo~\ref{alg:Hart-CNN}, posee una complejidad computacional de $O(n^2)$. El conjunto obtenido a partir de $T$, \textit{i.e.} $S$, operando con grandes conjuntos de datos demuestra poseer un tamaño considerablemente menor respecto a $T$. 
-
-Si bien es una técnica utilizada por su efectividad, posee una serie de puntos negativos a su vez.
-\begin{itemize}
-\item Sensibilidad ante el ruido. Un objeto ruidoso no será correctamente clasificado por sus vecinos. Estas muestran no se eliminarán del conjunto solución $S$, por lo que no desaparecerán.
-\item $S$ no tiene porqué ser el menor conjunto de $T$. Diferentes ejecuciones del algoritmo sobre el mismo $T$ pueden dar diferentes conjuntos solución $S$. Esto se debe al orden aleatorio por el cual se seleccionan las instancias. Por definición del propio algoritmo se asume que no se va a alcanzar de forma general el subconjunto de tamaño mínimo que cumpla con las características especificadas.
-\end{itemize}
-
 \paragraph{Algoritmo Condensado Reducido}\label{paragraph:RNN}
 \hfill \break
+Gates~\cite{gates1972reduced} en 1972 propuso el algoritmo del conjunto reducido, basado en las reglas \textit{NN}. El algoritmo propuesto es una modificación del algoritmo \textit{CNN}, ver algoritmo~\ref{alg:Hart-CNN}. No es una nueva regla de decisión puesto que se sigue eligiendo la clase del vecino más cercano para la clasificación. 
+El algoritmo se basa en un procedimiento para seleccionar el subconjunto $T_{CNN}$, el cual debe comportarse igual de bien que $T_{NN}$ ante clasificaciones de instancias desconocidas. Como se puede apreciar en el propio algoritmo~\ref{alg:Gates-RNN}, puede existir una disminución del rendimiento, a cambio se obtiene una mejora de la eficiencia para el algoritmo de clasificación que posteriormente se utilice, tanto en la cantidad de memoria utilizada como en el tiempo de computación.
+
+De igual manera que en \textit{CNN}, posee la problemática de la minimalidad, si bien el conjunto resultante $S \subset T$ será consistente, no se puede asegurar que sea mínimo; y diferentes ejecuciones del algoritmo sobre el mismo conjunto de datos $T$, pueden obtener diferentes subconjuntos solución~$S$.
+
 \begin{algorithm}[H]
 	\KwIn{Conjunto de entrenamiento $X$}
 	\KwOut{Conjunto editado $S \subset X$}
@@ -508,15 +513,21 @@ \subsubsection{Algoritmos de selección de instancias}\label{subsubsec:Instance-
   	\Return{$S$}
 	\caption{Algoritmo Condensado Reducido, \textit{RNN}.}\label{alg:Gates-RNN}
 \end{algorithm}
-Gates~\cite{gates1972reduced} en 1972 propuso el algoritmo del conjunto reducido, basado en las reglas \textit{NN}. El algoritmo propuesto es una modificación del algoritmo \textit{CNN}, ver algoritmo~\ref{alg:Hart-CNN}. No es una nueva regla de decisión puesto que se sigue eligiendo la clase del vecino más cercano para la clasificación. 
-El algoritmo se basa en un procedimiento para seleccionar el subconjunto $T_{CNN}$, el cual debe comportarse igual de bien que $T_{NN}$ ante clasificaciones de instancias desconocidas. Como se puede apreciar en el propio algoritmo~\ref{alg:Gates-RNN}, puede existir una disminución del rendimiento, a cambio se obtiene una mejora de la eficiencia para el algoritmo de clasificación que posteriormente se utilice, tanto en la cantidad de memoria utilizada como en el tiempo de computación.
-
-De igual manera que en \textit{CNN}, posee la problemática de la minimalidad, si bien el conjunto resultante $S \subset T$ será consistente, no se puede asegurar que sea mínimo; y diferentes ejecuciones del algoritmo sobre el mismo conjunto de datos $T$, pueden obtener diferentes subconjuntos solución~$S$.
 
 \paragraph{Algoritmo \textit{Iterative Case Filtering}}\label{subsubsub:ICF}
 \hfill \break
 Brighton~\cite{brighton2002advances} en 2002 propuso el algoritmo iterativo de filtrado, \textit{ICF}, bajo la premisa de predecir la clase de una instancia con la misma precisión, o mayor si fuera el caso, que el $T$ original. Uno de los objetivos principales del propio algoritmo es mantener en el subconjunto $S$ únicamente aquellas instancias que sean críticas para la decisión.
 
+\textit{ICF} utiliza una estrategia decremental, \textit{i.e.} de manera iterativa va borrando instancias del conjunto de datos inicial, inicialmente realiza un filtrado y posteriormente la reducción~\cite{brighton2002advances} Al reducir el tamaño de $T$ los tiempos de respuesta para el proceso de clasificación mejorarán, ya que se examinarán un menor número de instancias para realizar la clasificación; por contrapartida al eliminar muestras que se creen que son dañinas para el proceso, se pueden estar eliminando algunas que sean clave y por lo tanto teniendo una degradación de la calidad del clasificador.
+
+\textit{ICF} se basa en dos categorías para la decisión de si una instancia debe permanecer o no en $S$, ver algoritmo~\ref{alg:Brighton-ICF}, estas son \textit{Coverage} y \textit{Reachable}. Definidas de la siguiente manera para el caso base $\mathcal{CB} = \lbrace x_1, x_2, ..., x_n\rbrace$.
+\begin{align*}
+Coverage (x) = \lbrace x' \in \mathcal{CB} : Adaptable(x, x')\rbrace  \\
+Reachable (x) = \lbrace x' \in \mathcal{CB} : Adaptable(x',x)\rbrace
+\end{align*}
+
+Una instancia $x$ podrá estar en el conjunto adaptable de $x'$ sí y solo si $x$ es una instancia relevante para la solución de $x'$, \textit{i.e.} $x \in k-NN(x)$. La problemática surge en el momento en el cual una instancia con clase diferente no permite la correcta clasificación de $x'$, es por ello que el vecindario de $x'$ viene definido por todas las instancias antes de la primera instancia de diferente clase, utilizando \textit{sets} descritos por Wilson y Martinez. La propiedad \textit{Reachable} no está fijada desde el principio del algoritmo, sino que es dinámica siendo fijada cada vez en función de la instancia de clase diferente más cercana. El criterio seguido para realizar la eliminación de una muestras es: si el \textit{set} formado por el $reachable(x)$ es mayor que el $coverage(x)$, \textit{i.e.} una instancia $x$ es eliminada cuando más instancias pueden resolver $x$ que las que $x$ puede resolver por sí misma.
+
 \begin{algorithm}[H]
 	\KwIn{Conjunto de entrenamiento $X$}
 	\KwOut{Conjunto editado $T \subset X$}
@@ -545,16 +556,6 @@ \subsubsection{Algoritmos de selección de instancias}\label{subsubsec:Instance-
 	\caption{\textit{Iterative Case Filtering}, \textit{ICF}.}\label{alg:Brighton-ICF}
 \end{algorithm}
 
-\textit{ICF} utiliza una estrategia decremental, \textit{i.e.} de manera iterativa va borrando instancias del conjunto de datos inicial, inicialmente realiza un filtrado y posteriormente la reducción~\cite{brighton2002advances} Al reducir el tamaño de $T$ los tiempos de respuesta para el proceso de clasificación mejorarán, ya que se examinarán un menor número de instancias para realizar la clasificación; por contrapartida al eliminar muestras que se creen que son dañinas para el proceso, se pueden estar eliminando algunas que sean clave y por lo tanto teniendo una degradación de la calidad del clasificador.
-
-\textit{ICF} se basa en dos categorías para la decisión de si una instancia debe permanecer o no en $S$, ver algoritmo~\ref{alg:Brighton-ICF}, estas son \textit{Coverage} y \textit{Reachable}. Definidas de la siguiente manera para el caso base $\mathcal{CB} = \lbrace x_1, x_2, ..., x_n\rbrace$.
-\begin{align*}
-Coverage (x) = \lbrace x' \in \mathcal{CB} : Adaptable(x, x')\rbrace  \\
-Reachable (x) = \lbrace x' \in \mathcal{CB} : Adaptable(x',x)\rbrace
-\end{align*}
-
-Una instancia $x$ podrá estar en el conjunto adaptable de $x'$ sí y solo si $x$ es una instancia relevante para la solución de $x'$, \textit{i.e.} $x \in k-NN(x)$. La problemática surge en el momento en el cual una instancia con clase diferente no permite la correcta clasificación de $x'$, es por ello que el vecindario de $x'$ viene definido por todas las instancias antes de la primera instancia de diferente clase, utilizando \textit{sets} descritos por Wilson y Martinez. La propiedad \textit{Reachable} no está fijada desde el principio del algoritmo, sino que es dinámica siendo fijada cada vez en función de la instancia de clase diferente más cercana. El criterio seguido para realizar la eliminación de una muestras es: si el \textit{set} formado por el $reachable(x)$ es mayor que el $coverage(x)$, \textit{i.e.} una instancia $x$ es eliminada cuando más instancias pueden resolver $x$ que las que $x$ puede resolver por sí misma.
-
 \paragraph{Algoritmo Subconjunto Selectivo}\label{paragraph:SS}
 \hfill \break
 Ritter~\cite{ritter1975algorithm} 1975 propone un algoritmo capaz de satisfacer la condición de consistencia del algoritmo condensado de Hart, ver algoritmo~\ref{alg:Hart-CNN}; para ello introduce una condición más <<fuerte>> de consistencia, el objetivo es encontrar aquellas instancias de un orden independiente. 
@@ -612,6 +613,25 @@ \subsubsection{Algoritmos de selección de instancias}\label{subsubsec:Instance-
 
 \paragraph{\textit{Decremental Reduction Optimization Procedure}}\label{paragraph:DROP}
 \hfill \break
+Bajo el nombre de \textit{Decremental Reduction Optimization Procedure, DROP}~\cite{wilson2000reduction} nos encontramos con hasta 5 aproximaciones para la resolución del mismo problema. Todas ellas seleccionan prototipos en función de \textit{socio} y \textit{asociado}. Definidos como:
+\begin{itemize}
+\item Socio. Sea $X \not= \emptyset$, el socio de un objeto $P$ el cual pertenece al conjunto $X$, es aquél objeto que tiene a $P$ como uno de sus $k$ vecinos más cercanos.
+\item Asociado. Todo prototipo que contenga a $P$ como a uno de sus $k$ vecinos más cercanos, será denominado asociado de $P$, denotado con la expresión $P.A_{1,\dots,a}$ donde $a$ es el número de asociados de $P$.
+\end{itemize}
+
+Volviendo sobre los conceptos de \textit{coverage} y \textit{reachable} vistos en el algoritmo \textit{Iterative Case Filtering}, (ICF), podemos relacionar todos los conceptos de la siguiente manera: los asociados de un prototipo $P$ se pueden ver como el conjunto formado por el \textit{reachable} de $P$, y con el \textit{coverage} se pueden obtener los socios del prototipo $P$.
+
+Todas las aproximaciones de $DROP\lbrace 1\dots5\rbrace$ se basan en el mismo algoritmo~\cite{wilson2000reduction} pero con modificaciones en las técnicas de pre-procesado de los prototipos. Sus diferencias son:
+\begin{itemize}
+\item \textit{DROP1}. Eliminará un objeto $P$ de $S$ si sus socios en $S$ se clasifican correctamente sin $P$, \textit{i.e.} la ausencia de $P$ no impide la correcta clasificación del resto de prototipos.
+\item \textit{DROP2}. Eliminará un objeto $P$ de $S$ si los socios que tiene $P$ en $TS$ se clasifican correctamente sin $P$, \textit{i.e.}, verificará el efecto que causa esta eliminación sobre la muestra original. Previo al proceso de eliminación de objetos $P$, ordena los prototipos a tratar en orden a su enemigo más cercano, permitiendo que los primeros prototipos que se van a tratar serán aquellos más alejados de las fronteras de decisión, ergo las más prescindibles.
+\item \textit{DROP3}. Lo primero de todo realiza un filtrado de ruido, para ello aplica la edición de Wilson, ver algoritmo~\ref{alg:Wilson-ENN}. Seguidamente aplica el algoritmo \textit{DROP2}, ver algoritmo~\ref{alg:DROP3}
+\item \textit{DROP4}. Aplica un filtro de ruido diferente, en este casos consistirá en eliminar un prototipo solo si su eliminación no provoca que alguna otra instancia sea mal clasificada.
+\item \textit{DROP5}. Modificación sobre \textit{DROP2}, en este algoritmo el proceso de eliminación de objetos comienza por aquellos más cercanos a sus enemigos. 
+\end{itemize}
+
+El concepto \textit{with} permite recoger el número de asociados correctamente clasificados teniendo en cuenta un prototipo $x$ como vecino, en cambio \textit{without} tiene en cuenta el número de asociados correctamente clasificados los cuales no tienen el prototipo $x$ como vecino. En los casos en los que $without > with$ se está tratando con un prototipo el cual no aporta información sobre el conjunto $S$ permitiendo su eliminación.
+
 \begin{algorithm}[H]
 	\KwIn{Conjunto de entrenamiento $X$ y número de vecinos más cercanos a considerar, $k$}
 	\KwOut{Conjunto editado $S \subset X$}
@@ -637,24 +657,6 @@ \subsubsection{Algoritmos de selección de instancias}\label{subsubsec:Instance-
 	\Return{$S$}
 	\caption{\textit{Decremental Reduction Optimization Procedure 3}, \textit{DROP3}.}\label{alg:DROP3}
 \end{algorithm}
-Bajo el nombre de \textit{Decremental Reduction Optimization Procedure, DROP}~\cite{wilson2000reduction} nos encontramos con hasta 5 aproximaciones para la resolución del mismo problema. Todas ellas seleccionan prototipos en función de \textit{socio} y \textit{asociado}. Definidos como:
-\begin{itemize}
-\item Socio. Sea $X \not= \emptyset$, el socio de un objeto $P$ el cual pertenece al conjunto $X$, es aquél objeto que tiene a $P$ como uno de sus $k$ vecinos más cercanos.
-\item Asociado. Todo prototipo que contenga a $P$ como a uno de sus $k$ vecinos más cercanos, será denominado asociado de $P$, denotado con la expresión $P.A_{1,\dots,a}$ donde $a$ es el número de asociados de $P$.
-\end{itemize}
-
-Volviendo sobre los conceptos de \textit{coverage} y \textit{reachable} vistos en el algoritmo \textit{Iterative Case Filtering}, (ICF), podemos relacionar todos los conceptos de la siguiente manera: los asociados de un prototipo $P$ se pueden ver como el conjunto formado por el \textit{reachable} de $P$, y con el \textit{coverage} se pueden obtener los socios del prototipo $P$.
-
-Todas las aproximaciones de $DROP\lbrace 1\dots5\rbrace$ se basan en el mismo algoritmo~\cite{wilson2000reduction} pero con modificaciones en las técnicas de pre-procesado de los prototipos. Sus diferencias son:
-\begin{itemize}
-\item \textit{DROP1}. Eliminará un objeto $P$ de $S$ si sus socios en $S$ se clasifican correctamente sin $P$, \textit{i.e.} la ausencia de $P$ no impide la correcta clasificación del resto de prototipos.
-\item \textit{DROP2}. Eliminará un objeto $P$ de $S$ si los socios que tiene $P$ en $TS$ se clasifican correctamente sin $P$, \textit{i.e.}, verificará el efecto que causa esta eliminación sobre la muestra original. Previo al proceso de eliminación de objetos $P$, ordena los prototipos a tratar en orden a su enemigo más cercano, permitiendo que los primeros prototipos que se van a tratar serán aquellos más alejados de las fronteras de decisión, ergo las más prescindibles.
-\item \textit{DROP3}. Lo primero de todo realiza un filtrado de ruido, para ello aplica la edición de Wilson, ver algoritmo~\ref{alg:Wilson-ENN}. Seguidamente aplica el algoritmo \textit{DROP2}, ver algoritmo~\ref{alg:DROP3}
-\item \textit{DROP4}. Aplica un filtro de ruido diferente, en este casos consistirá en eliminar un prototipo solo si su eliminación no provoca que alguna otra instancia sea mal clasificada.
-\item \textit{DROP5}. Modificación sobre \textit{DROP2}, en este algoritmo el proceso de eliminación de objetos comienza por aquellos más cercanos a sus enemigos. 
-\end{itemize}
-
-El concepto \textit{with} permite recoger el número de asociados correctamente clasificados teniendo en cuenta un prototipo $x$ como vecino, en cambio \textit{without} tiene en cuenta el número de asociados correctamente clasificados los cuales no tienen el prototipo $x$ como vecino. En los casos en los que $without > with$ se está tratando con un prototipo el cual no aporta información sobre el conjunto $S$ permitiendo su eliminación.
 
 \section{Función distancia entre instancias}
 Una función distancia proporciona información sobre la proximidad entre dos instancias en función de todos sus parámetros. Si la distancia que separa dos instancias es cero, ambas instancias son idénticas. Se tiende a trabajar con conjuntos de datos normalizados, \textit{i.e.} todos los datos son ajustados a una escala común, independientemente de la escala en la que hayan sido medidos, para evitar que atributos/características con mucha varianza puedan <<despistar>> a los algoritmos.
diff --git a/docs/tex/4_Tecnicas_y_herramientas.tex b/docs/tex/4_Tecnicas_y_herramientas.tex
index 4905571..c845176 100644
--- a/docs/tex/4_Tecnicas_y_herramientas.tex
+++ b/docs/tex/4_Tecnicas_y_herramientas.tex
@@ -190,22 +190,6 @@ \subsection{ZenHub}
 \subsection{Visual Paradigm}
 Visual Paradigm es una herramienta UML-CASE: Ingeniería de \textit{Software} Asistida por Computación. Desarrollada para soportar el ciclo de vida completo del proceso de desarrollo \textit{software} a través de la representación de todo tipo de diagramas.
 
-Permitiendo el modelado de modelado de diagramas UML (entre otros), dando soporte principalmente a:
-\begin{itemize}
-\item Diagrama de clases.
-\item Diagrama de casos de uso.
-\item Diagrama de secuencia.
-\item Diagrama de comunicación.
-\item Diagrama de estados.
-\item Diagrama de actividad.
-\item Diagrama de componentes.
-\item Diagrama de despliegue.
-\item Diagrama de paquetes.
-\item Diagrama de objetos.
-\item Diagrama de estructura compuesta.
-\item Diagrama de perfil.
-\item Diagrama de tiempos.
-\item Diagrama de global de interacciones.
-\end{itemize}
+Permitiendo el modelado de modelado de diagramas UML (entre otros), dando soporte principalmente a diagramas de clases, casos de uso,secuencia, estados, actividad, paquetes, etc.
 
 Página web de la herramienta: \url{https://www.visual-paradigm.com/}
\ No newline at end of file
diff --git a/docs/tex/6_Trabajos_relacionados.tex b/docs/tex/6_Trabajos_relacionados.tex
index 87a67b0..d8d0e18 100644
--- a/docs/tex/6_Trabajos_relacionados.tex
+++ b/docs/tex/6_Trabajos_relacionados.tex
@@ -1,6 +1,6 @@
 \capitulo{6}{Trabajos relacionados}
 
-En esta Sección se van a comentar los trabajos relacionados desde dos ópticas, la primera de ellas desde el \textit{Machine Learning As A Service}, MLaaS; y la segunda es desde el punto de vista del Aprendizaje Semi-Supervisado Seguro (\textit{Safe-SSL}).
+En esta Sección se van a comentar los trabajos relacionados desde dos ópticas, la primera de ellas desde el \textit{Machine Learning As A Service}, MLaaS; y la segunda desde el punto de vista del Aprendizaje Semi-Supervisado Seguro (\textit{Safe-SSL}).
 
 \section{\textit{Machine Learning As A Service}}
 \subsection{\textit{Frameworks} y bibiotecas}\label{related:frameworks}
@@ -64,7 +64,7 @@ \subsection{\textit{Proveedores de MLaaS}}\label{related:MLaaS}
 
 La parte automatizada es capaz de resolver problemas de clasificación binaria y multi-etiqueta, y regresión. Permitiendo la opción de que el usuario elija el modelo de \textit{Machine Learning} deseado o que sea el propio sistema el que infiera el que considera mejor a partir de los datos.
 
-\item \textbf{\textit{UBUMLaaS}}. La Universidad de Burgos también dispone de su propio servicio de \textit{MLaaS}, ver~\ref{UBUMLaaS}
+\item \textbf{\textit{UBUMLaaS}}. La Universidad de Burgos también dispone de su propio servicio de \textit{MLaaS}, ver~\ref{UBUMLaaS}.
 
 \end{enumerate}
 \clearpage
@@ -75,6 +75,7 @@ \subsection{Comparativa entre MLaaS y UBUMLaaS}
 
 \begin{table}[b]
 \centering
+\small
 \begin{tabular}{lccccc}
 \rowcolor[rgb]{0.753,0.753,0.753} \diagbox{Soporte}{Servicios}                                                                       & \begin{tabular}[c]{@{}>{\cellcolor[rgb]{0.753,0.753,0.753}}c@{}}Amazon ML\\SageMaker\end{tabular} & \begin{tabular}[c]{@{}>{\cellcolor[rgb]{0.753,0.753,0.753}}c@{}}Microsoft \\Azure\end{tabular} & \begin{tabular}[c]{@{}>{\cellcolor[rgb]{0.753,0.753,0.753}}c@{}}Google \\AI Platform\end{tabular} & \begin{tabular}[c]{@{}>{\cellcolor[rgb]{0.753,0.753,0.753}}c@{}}IBM \\Watson\end{tabular} & UBUMLaaS  \\
 \toprule
@@ -94,15 +95,15 @@ \subsection{Comparativa entre MLaaS y UBUMLaaS}
 \end{table}
 \clearpage
 \section{Aprendizaje Semi-Supervisado Seguro}
-A pesar de que se han hecho multitud de aproximaciones y estudios sobre Clasificación Semi-Supervisada, los prototipos son habitualmente clasificados dependiendo de diferentes suposiciones relacionadas con la distribución de los ejemplos etiquetados y no etiquetados. Habitualmente los modelos se basan en la suposición de existencia de matrices y/o \textit{clusters}. Si los datos corresponden a un colector de menor dimensaionalidad que el espacio de entrada, es adecuado para suposición de colector~\cite{wang2011solution}.
+A pesar de que se han hecho multitud de aproximaciones y estudios sobre Clasificación Semi-Supervisada, los prototipos son habitualmente clasificados dependiendo de diferentes suposiciones relacionadas con la distribución de los ejemplos etiquetados y no etiquetados. Habitualmente los modelos se basan en la suposición de existencia de matrices y/o \textit{clusters}. Si los datos corresponden a un \textit{manifold}\footnote{Término técnico que se utiliza para clasificar espacios de dimensión arbitraria. Para cada número entero existe un espacio plano llamado espacio euclidiano que tiene características muy similares al plano cartesiano. Esencialmente una generalización del espacio euclidiano tal que localmente (áreas pequeñas) es aproximadamente lo mismo que el espacio euclidiano pero el espacio entero no tiene las mismas propiedades del espacio euclidiano cuando se observa en su totalidad.} de menor dimensaionalidad que el espacio de entrada, es adecuado para suposición de \textit{manifold}~\cite{wang2011solution}.
 
 Siguiendo con esta idea en mente, la construcción de grafos permite determinar el comportamiento de los modelos, ya que dos prototipos conectados por una aritsta fuerte probablemente indique que ambos prototipos poseen la misma etiqueta~\cite{wang2013semi}. La suposición de \textit{cluster} supone que prototipos <<similares>> debería tener las mismas etiquetas.
 
-La aplicación de técnicas de técnicas de <<autoetiquetado>> son aquellas que aprovechan un clasificador supervisado para etiquetar la clase desconocida y no hacen suposiciones específicas acerca de los datos de entrada~\cite{triguero2015self}. Para ello lo habitual es entrenar un clasificador o un conjunto de ellos y posteriormente aprovechar el conocimiento adquirido por este (o estos) clasificador(es) para entrenar uno nuevo que produzca mejores resultados~\cite{blum1998combining, zhou2005tri}.
+La aplicación de técnicas de <<autoetiquetado>> son aquellas que aprovechan un clasificador supervisado para etiquetar la clase desconocida y no hacen suposiciones específicas acerca de los datos de entrada~\cite{triguero2015self}. Para ello lo habitual es entrenar un clasificador o un conjunto de ellos y posteriormente aprovechar el conocimiento adquirido por este (os) clasificador(es) para entrenar uno nuevo que produzca mejores resultados~\cite{blum1998combining, zhou2005tri}.
 
 Todos los modelos con los que habitualmente se trabaja se basan únicamente en el uso de aquellas instancias que se encuentran etiquetadas para obtener una mayor diversidad en los clasificadores, sin pararse a utilizar la gran y abundante información que se encuentra dentro de los prototipos no etiquetados~\cite{zhao2021safe}. Pero es aquí donde surge el problema real, no se tiene en cuenta que estos clasificadores iterativos también introducen ruido en el conjunto de datos etiquetados, es decir, clasifican mejor o peor pero no son seguros; todo ello propicia que en determinadas ocasiones el rendimiento empeore.
 
-Con el fin de trabajar con aprendizaje semi-supervisado seguro~\cite{zhao2021safe} propone una nueva forma de trabajar con clasificadores supervisados en un \textit{ensemble}, los cuales a partir de múltiples iteraciones y pasadas sobre el conjunto de datos etiquetados lo acabarán etiquetando de forma segura. Para ello los clasificadores son entrenados con conjuntos de datos extraídos de los prototipos etiquetados y los cuales han sido seleccionados entre aquellos que poseen una baja ambigüedad. Posteriormente se etiquetas aquellos prototipos para los cuales los clasificadores acuerdan mediante mayoría de la clase a la que corresponde y se reentrenan los modelos.
+Con el fin de trabajar con aprendizaje semi-supervisado seguro, en~\cite{zhao2021safe} se propone una nueva forma de trabajar con clasificadores supervisados en un \textit{ensemble}, los cuales a partir de múltiples iteraciones y pasadas sobre el conjunto de datos etiquetados lo acabarán etiquetando de forma segura. Para ello los clasificadores son entrenados con conjuntos de datos extraídos de los prototipos etiquetados y los cuales han sido seleccionados entre aquellos que poseen una baja ambigüedad. Posteriormente se etiquetas aquellos prototipos para los cuales los clasificadores acuerdan mediante mayoría de la clase a la que corresponde y se reentrenan los modelos.
 
 De la misma forma que se acaba de ver cómo hay trabajos en la literatura acerca de mejorar los métodos ya existentes de clasificación semi-supervisada, también existen métodos basados en \textit{clusters} los cuáles eran brevemente introducidos al principio de esta sección. Uno de los mayores problemas que se encontraban éstos métodos era el poder generalizar para cualquier conjunto de datos independientemente de cuál fuese su distribución~\cite{adankon2011help, gan2013using}.
 
diff --git a/docs/tex/A_Plan_proyecto.tex b/docs/tex/A_Plan_proyecto.tex
index 964bf06..dc9f30a 100644
--- a/docs/tex/A_Plan_proyecto.tex
+++ b/docs/tex/A_Plan_proyecto.tex
@@ -11,6 +11,18 @@ \section{Introducción}
 Seguidamente se realizará un estudio de la viabilidad del proyecto, tanto a nivel económico como legal.
 \newpage
 
+\section{Usuarios Participantes}\label{usuarios-participantes}
+En la fase de análisis han participado diversos usuarios, entre los que se han repartido los principales <<papeles>>.
+\begin{itemize}
+\item Dr. Álvar Arnaiz González, tutor del proyecto, ha sido partícipe de multiples papeles a lo largo de esta fase:
+\begin{itemize}
+\item \textit{Cliente}. Descripción de las funcionalidades deseadas de la aplicación y el comportamiento que debe de tener.
+\item \textit{Técnico}. Aportando conocimientos acerca de las técnicas de selección de instancias y su relación con la minería de datos. Junto con ello ha compartido sus conocimientos en el uso de librerías tales como Weka, Scikit-Learn, o el lenguaje de marcas \LaTeX. Así como el aporte de grandes cantidades de documentación en forma de \textit{papers} o documentación web. 
+\end{itemize}
+\item Multitud de compañeros del grado han aportado sus experiencias a la hora de tratar con aplicaciones de este tipo, comentando sus principales dificultades que encuentran habitualmente y lo que esperarían encontrarse en una nueva aplicación. Lo que permite hacer un diseño de la interfaz más intuitivo en función de lo que el usuario espera encontrar sin perder funcionalidades.
+\item \textit{Analista.} El alumno ha realizado el análisis (valga la redundancia) y descripción del problema planteado por el cliente y realización del diseño de la solución propuesta.
+\end{itemize}
+
 \section{Planificación temporal}
 \subsection{\textit{SCRUM}}
 \textit{Scrum} es un marco de trabajo que permite el trabajo colaborativo en equipos. Permite que los equipos que trabajan en proyectos con esta metodología se organicen por sí mismos, siendo ellos los que deciden cómo afrontar los problemas que van surgiendo. 
@@ -403,7 +415,7 @@ \subsubsection{\textit{Sprint} 10: Name}
 
 \item \textbf{\textit{Sprint review meeting}}
 
-El trabajo realizado durante este \textit{sprint} ha sido más duro que el de \textit{sprints} anteriores. Esto se debe a la poca experiencia del equipo de desarrollo con aplicaciones que poseen un \textit{frontend}, el uso de JavaScript, jQuery, AJAX, ... es algo que hasta la fecha no se había utilizado en gran medida y ahora es con lo que más se está trabajando, entonces ha requerido de un esfuerzo extra.
+El trabajo realizado durante este \textit{sprint} ha sido más duro que el de \textit{sprints} anteriores. Esto se debe a la poca experiencia del equipo de desarrollo con aplicaciones que poseen un \textit{frontend}, el uso de JavaScript, jQuery, AJAX,\dots es algo que hasta la fecha no se había utilizado en gran medida y ahora es con lo que más se está trabajando, entonces ha requerido de un esfuerzo extra.
 
 La parte de administración de UBUMLaaS ha sido creada con una base más moderna, sencilla y clara. Siguiendo el esquema de colores de la Universidad de Burgos. Es por ello que ahora mismo parecen dos aplicaciones diferentes, (la parte de administración en comparación con la parte de funcionalidad de MLaaS propiamente dicha).
 
diff --git a/docs/tex/B_Requisitos.tex b/docs/tex/B_Requisitos.tex
index 3f92135..69635ba 100644
--- a/docs/tex/B_Requisitos.tex
+++ b/docs/tex/B_Requisitos.tex
@@ -3,7 +3,7 @@
 \section{Introducción}
 Este anexo recoge las necesidades funcionales que deberán ser soportadas por el sistema que va a ser desarrollado. Con el fin de obtener una buena documentación se deben identificar y describir los requisitos que debe el sistema satisfacer, pero sin entrar en cómo los va a resolver.
 
-A día de hoy, no existe una autoridad que indique cómo se deben de realizar las especificaciones de requisitos \textit{sfotware}, SRS. La comunidad se encuentra dividida entre <<la vieja escuela>> siguiendo guías de buenas prácticas (IEEE 830-1998~\cite{720574} ó 12207-2-2020~\cite{IEEE1220722020}), en contraposición con el \textit{Agile Manifiesto}, donde no se hace una especificación formal de toda la aplicación sino que cada 2-4 semanas se revisa y <<rehace>> en función de las necesidades del cliente.
+A día de hoy, no existe una autoridad que indique cómo se deben de realizar las especificaciones de requisitos \textit{software}, SRS. La comunidad se encuentra dividida entre <<la vieja escuela>> siguiendo guías de buenas prácticas (IEEE 830-1998~\cite{720574} ó 12207-2-2020~\cite{IEEE1220722020}), en contraposición con el \textit{Agile Manifiesto}, donde no se hace una especificación formal de toda la aplicación sino que cada 2-4 semanas se revisa y <<rehace>> en función de las necesidades del cliente.
 
 Se va a realizar una combinación de ambos, por un lado se trabaja a lo largo del proyecto con una planificación ágil, y por otro se va a tener como referencia una especificación de requisitos que va a seguir la guía de buenas prácticas IEEE 830-1998. Ésta última recoge los siguientes puntos como referencias a una buena especificación de requisitos \textit{software}~\cite{ingenieriasoftwareytiemporeal_2020}.
 \begin{itemize}
@@ -21,7 +21,7 @@ \section{Introducción}
 \item \textbf{Identificable.} Será identificable si el origen de cada uno de los requisitos está claro y facilita de igual manera las referencias de cada requisito de desarrollo futuro o documentación del mismo.
 \end{itemize}
 
-\newpage
+
 \section{Objetivos generales}\label{objetivos-generales}
 Los objetivos del proyecto se pueden separar en dos ramas.
 \begin{enumerate}
@@ -32,24 +32,24 @@ \section{Objetivos generales}\label{objetivos-generales}
 \item Administración integral del sistema a cargo del nuevo rol de administrador.
 \end{enumerate}
 
-En la biblioteca referida a los algoritmos de filtrado más comunes se implementarán algoritmos clásicos de la literatura como son CNN, RNN, ICF, ... Mientras que la biblioteca de algoritmos clásicos de Semi Supervisado contendrá \textit{Co-Training}, \textit{Tri-Training}, ... Estando estructuradas en forma de clases accesibles mediante importación clásica de paquetes. Deben de ser fácilmente escalables, posterior a la finalización del proyecto deben poder ampliarse sin añadir complejidad.
+En la biblioteca referida a los algoritmos de filtrado más comunes se implementarán algoritmos clásicos de la literatura como son CNN, RNN, ICF, ... Mientras que la biblioteca de algoritmos clásicos de Semi Supervisado contendrá \textit{Co-Training}, \textit{Tri-Training},\dots Estando estructuradas en forma de clases accesibles mediante importación clásica de paquetes. Deben de ser fácilmente escalables, posterior a la finalización del proyecto deben poder ampliarse sin añadir complejidad.
 
 Las interfaces a diseñar se requieren que sean intuitivas, fáciles de entender y utilizar. Deberán de ser transparentes al usuario, impidiendo que este conozca la lógica de diseño de la aplicación, así como los posibles fallos internos que se puedan producir por acciones del sistema, del usuario, o de terceros.
 
-\newpage
-\section{Usuarios Participantes}\label{usuarios-participantes}
-En la fase de análisis han participado diversos usuarios, entre los que se han repartido los principales <<papeles>>.
-\begin{itemize}
-\item Dr. Álvar Arnaiz González, tutor del proyecto, ha sido partícipe de multiples papeles a lo largo de esta fase:
+
+\section{Usuarios del \textit{software}}\label{usuarios-participantes}
+Cualquier persona podrá hacer uso de la aplicación UBUMLaaS, siendo únicamente necesarios una serie de datos básicos para su registro dentro de ella. 
+
+Dentro de la aplicación se encuentra el usuario base y una generalización del mismo en forma de administrador. 
 \begin{itemize}
-\item \textit{Cliente}. Descripción de las funcionalidades deseadas de la aplicación y el comportamiento que debe de tener.
-\item \textit{Técnico}. Aportando conocimientos acerca de las técnicas de selección de instancias y su relación con la minería de datos. Junto con ello ha compartido sus conocimientos en el uso de librerías tales como Weka, Scikit-Learn, o el lenguaje de marcas \LaTeX. Así como el aporte de grandes cantidades de documentación en forma de \textit{papers} o documentación web. 
-\end{itemize}
-\item Multitud de compañeros del grado han aportado sus experiencias a la hora de tratar con aplicaciones de este tipo, comentando sus principales dificultades que encuentran habitualmente y lo que esperarían encontrarse en una nueva aplicación. Lo que permite hacer un diseño de la interfaz más intuitivo en función de lo que el usuario espera encontrar sin perder funcionalidades.
-\item \textit{Analista.} El alumno ha realizado el análisis (valga la redundancia) y descripción del problema planteado por el cliente y realización del diseño de la solución propuesta.
+\item \textbf{Usuario.} El usuario será el modelo base, en la forma de una persona la cual tendrá las capacidades de: crear experimentos y todas las funcionalidades asociadas con los mismos. Así como editar sus datos personales, añadir nuevos, quitar,\dots Y conocer sus estadísticas de uso de la última semana.
+
+\item \textbf{Administrador.} Actor generalizado de usuario. Tiene todas las funcionalidades propias del usuario, pero además posee acceso a toda la parte de administración de la aplicación. En esta nueva parte posee acceso a la monitorización del sistema en tiempo real, a las estadísticas del mismo en cuanto a uso respecta, administración de todos los usuarios, etc. 
 \end{itemize}
 
-\newpage
+Un usuario es creado por una persona ajena que quiere registrarse en la aplicación, o por un administrador. Pero un administrador sólo puede ser <<creado>> (elevación de usuario a administrador) por otro administrador, y lo mismo para el caso contrario, pasar de administrador a usuario.
+
+
 \section{Factores de riesgo}\label{factores-de-riesgo}
 En esta sección se va a realizar un análisis de las `principales dificultades que se pueden encontrar a lo largo del desarrollo del proyecto \textit{software}. Mediante una identificación preventiva se podrá poner remedio a éstas de una manera más eficiente e impedir <<que vayan a más>>.
 
@@ -67,8 +67,7 @@ \section{Factores de riesgo}\label{factores-de-riesgo}
 \item \textbf{Falta de claridad.} La comunicación entre todas las partes implicadas debe de ser lo más fluida y natural posible, permitiendo minimizar los retrasos por tener que rehacer algo que se había especificado de una forma y no se había entendido correctamente (Inequívoco).
 \end{enumerate}
 
-\newpage
-\section{Catalogo de requisitos}\label{catalogo-de-riquisitos}
+\section{Catálogo de requisitos}\label{catalogo-de-riquisitos}
 En esta sección se van a definir de forma clara, completa, precisa y verificable todas las funcionalidades y restricciones del sistema.
 
 A pesar de que el proyecto tiene dos <<enfoques>>, la parte de UBUMLaaS y la parte de bibliotecas, los requisitos funcionales y no funcionales se van a desglosar juntos, siguiendo el orden en el que aparecen en este texto.
@@ -141,7 +140,7 @@ \subsection{Requisitos funcionales}\label{requisitos-funcionales}
 	\end{itemize}
 	\item \textbf{RF-6.2 Estadísticas de uso para administradores.}
 	\begin{itemize}
-		\item \textbf{RF-6.2.1 Estadísticas generales}. El administrador debe de poder de un vistazo conocer el uso general que se le está dando al sistema. (Número de experimentos, número de usuarios, tipo de experimentos, \dots)
+		\item \textbf{RF-6.2.1 Estadísticas generales}. El administrador debe de poder de un vistazo conocer el uso general que se le está dando al sistema. (Número de experimentos, número de usuarios, tipo de experimentos,\dots)
 		\item \textbf{RF-6.2.2 Uso últimos 7 días.} El administrador debe de poder conocer el número de experimentos que se han ejecutado cada día de los últimos 7 días naturales.
 		\item \textbf{RF-6.2.3 Distribución de los usuarios.} El administrador debe de poder conocer las estadísticas generales de uso y países de origen de los usuarios del sistema.
 	\end{itemize}
@@ -177,114 +176,54 @@ \subsection{Actores}
 Actuarán dos actores con el sistema, un usuario (el actor general) y un administrador (actor especializado heredado del usuario).
 
 \subsection{Casos de uso}\label{casos-de-uso}
+A continuación se detallan las tablas correspondientes a los casos de uso anteriormente planteados, en orden.
 
 % Caso de Uso 1 -> Consultar Experimentos.
-\begin{longtable}[H]{@{}ll@{}}
+\begin{table}[p]
+\centering
+\begin{tabularx}{\linewidth}{ p{0.21\columnwidth} p{0.71\columnwidth} }
+\toprule
+\textbf{CU-1} & \textbf{Consultar Experimentos}\\
 \toprule
-\begin{minipage}[b]{0.23\columnwidth}\raggedright\strut
-\textbf{CU-1}\strut
-\end{minipage} & \begin{minipage}[b]{0.71\columnwidth}\raggedright\strut
-\textbf{Consultar Experimentos}\strut
-\end{minipage}\tabularnewline
-\midrule
-\endhead
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Versión}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-1.0\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Autor}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-Daniel Puente Ramírez\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Requisitos asociados}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-RF-1.3, RF-1.5, RF-1.6\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Descripción}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-Permite al usuario consultar sus experimentos y reutilizarlos.\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Precondición}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-El sistema de colas se encuentra en ejecución.\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Acciones}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
+\textbf{Versión} & 1.0\\
+\textbf{Autor} & Daniel Puente Ramírez\\
+\textbf{Requisitos asociados} & RF-1.3, RF-1.5, RF-1.6\\
+\textbf{Descripción} & Permite al usuario consultar sus experimentos y reutilizarlos.\\
+\textbf{Precondición} & El sistema de colas se encuentra en ejecución.\\
+\textbf{Acciones} &
 \begin{enumerate}
 \def\labelenumi{\arabic{enumi}.}
 \tightlist
 \item El usuario entra en la plataforma.
 \item Hace \textit{click} en <<Mis Experimentos>>.
 \item Por cada experimento lanzado se da la opción de ver detalle, reutilizar o eliminar.
-\end{enumerate}\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Postcondición}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-El número de experimentos mostrados al usuario es igual al número de experimentos asociados con ese ID en la base de datos.\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Excepciones}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-No existen excepciones posibles.\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Importancia}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-Alta\strut
-\end{minipage}\tabularnewline
+\end{enumerate}\\
+\textbf{Postcondición} & El número de experimentos mostrados al usuario es igual al número de experimentos asociados con ese ID en la base de datos.\\
+\textbf{Excepciones} & No existen excepciones posibles.\\
+\textbf{Importancia} & Alta \\
 \bottomrule
+\end{tabularx}
 \caption{CU-1 Consultar Experimentos.}
-\end{longtable}
+\end{table}
 
 % Caso de Uso 1.1 -> Consultar Experimento
-\begin{longtable}[H]{@{}ll@{}}
+\begin{table}[p]
+\centering
+\begin{tabularx}{\linewidth}{ p{0.21\columnwidth} p{0.71\columnwidth} }
 \toprule
-\begin{minipage}[b]{0.23\columnwidth}\raggedright\strut
-\textbf{CU-1.1}\strut
-\end{minipage} & \begin{minipage}[b]{0.71\columnwidth}\raggedright\strut
-\textbf{Consultar Experimento}\strut
-\end{minipage}\tabularnewline
-\midrule
-\endhead
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Versión}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-1.0\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Autor}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-Daniel Puente Ramírez\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Requisitos asociados}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-RF-1.2, RF-1.3, RF-1.4, RF-1.5\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Descripción}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-Permite al usuario consultar un experimento en concreto, si ha finalizado, junto con las métricas reportadas.\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Precondiciones}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
+\textbf{CU-1.1} & \textbf{Consultar Experimento}\\
+\toprule
+\textbf{Versión} & 1.0\\
+\textbf{Autor} & Daniel Puente Ramírez\\
+\textbf{Requisitos asociados} & RF-1.2, RF-1.3, RF-1.4, RF-1.5\\
+\textbf{Descripción} & Permite al usuario consultar un experimento en concreto, si ha finalizado, junto con las métricas reportadas.\\
+\textbf{Precondiciones} & 
 \begin{itemize}
 \tightlist
 \item El experimento existe.
 \item En caso de haber finalizado y tener métricas de rendimiento, se cargan.
-\end{itemize}\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Acciones}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
+\end{itemize}\\
+\textbf{Acciones} &
 \begin{enumerate}
 \def\labelenumi{\arabic{enumi}.}
 \tightlist
@@ -292,69 +231,34 @@ \subsection{Casos de uso}\label{casos-de-uso}
 \item Hace \textit{click} en <<Mis Experimentos>>.
 \item Por cada experimento lanzado se da la opción de ver detalle, reutilizar o eliminar.
 \item Dentro de ver en detalle puede predecir nuevas instancias o descargar el modelo, así como consultar las métricas resultantes. En caso de haber fallado se muestra el motivo del fallo.
-\end{enumerate}\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Postcondición}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-El identificador del experimento no varía independientemente de lo que el usuario haga con él.\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Excepciones}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-No existen excepciones posibles.\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Importancia}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-Media\strut
-\end{minipage}\tabularnewline
+\end{enumerate}\\
+\textbf{Postcondición} & El identificador del experimento no varía independientemente de lo que el usuario haga con él.\\
+\textbf{Excepciones} & No existen excepciones posibles.\\
+\textbf{Importancia} & Media \\
 \bottomrule
+\end{tabularx}
 \caption{CU-1.1 Consultar Experimento.}
-\end{longtable}
+\end{table}
+
 
 % Caso de Uso 1.1.1 -> Predecir Nuevas Instancias
-\begin{longtable}[H]{@{}ll@{}}
+\begin{table}[p]
+\centering
+\begin{tabularx}{\linewidth}{ p{0.21\columnwidth} p{0.71\columnwidth} }
 \toprule
-\begin{minipage}[b]{0.23\columnwidth}\raggedright\strut
-\textbf{CU-1.1.1}\strut
-\end{minipage} & \begin{minipage}[b]{0.71\columnwidth}\raggedright\strut
-\textbf{Predecir Nuevas Instancias}\strut
-\end{minipage}\tabularnewline
-\midrule
-\endhead
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Versión}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-1.0\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Autor}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-Daniel Puente Ramírez\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Requisitos asociados}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-RF-1.4\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Descripción}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-Permite al usuario predecir nuevas instancias en función a un modelo previamente entrenado.\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Precondiciones}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
+\textbf{CU-1.1.1} & \textbf{Predecir Nuevas Instancias}\\
+\toprule
+\textbf{Versión} & 1.0\\
+\textbf{Autor} & Daniel Puente Ramírez\\
+\textbf{Requisitos asociados} & RF-1.4\\
+\textbf{Descripción} & Permite al usuario predecir nuevas instancias en función a un modelo previamente entrenado.\\
+\textbf{Precondiciones} & 
 \begin{itemize}
 \tightlist
 \item El experimento existe y ha finalizado.
 \item Las nuevas instancias a predecir tienen los mismos atributos que con las que se entrenó el modelo.
-\end{itemize}\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Acciones}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
+\end{itemize}\\
+\textbf{Acciones} &
 \begin{enumerate}
 \def\labelenumi{\arabic{enumi}.}
 \tightlist
@@ -364,65 +268,29 @@ \subsection{Casos de uso}\label{casos-de-uso}
 \item Dentro de ver en detalle hace \textit{click} en <<Predict>>.
 \item Sube el conjunto de datos a predecir.
 \item Se le muestra al usuario el resultado de la predicción.
-\end{enumerate}\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Postcondición}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-El modelo no se ha visto afectado por el proceso de predicción.\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Excepciones}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-El conjunto de datos pasado no cumple con los requisitos para el modelo.\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Importancia}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-Alta\strut
-\end{minipage}\tabularnewline
+\end{enumerate}\\
+\textbf{Postcondición} & El modelo no se ha visto afectado por el proceso de predicción.\\
+\textbf{Excepciones} & El conjunto de datos pasado no cumple con los requisitos para el modelo.\\
+\textbf{Importancia} & Alta \\
 \bottomrule
+\end{tabularx}
 \caption{CU-1.1.1 Predecir Nuevas Instancias.}
-\end{longtable}
+\end{table}
+
 
 % Caso de Uso 1.1.2 -> Reutilizar Experimento
-\begin{longtable}[H]{@{}ll@{}}
+\begin{table}[p]
+\centering
+\begin{tabularx}{\linewidth}{ p{0.21\columnwidth} p{0.71\columnwidth} }
 \toprule
-\begin{minipage}[b]{0.23\columnwidth}\raggedright\strut
-\textbf{CU-1.1.1}\strut
-\end{minipage} & \begin{minipage}[b]{0.71\columnwidth}\raggedright\strut
-\textbf{Reutilizar Experimento}\strut
-\end{minipage}\tabularnewline
-\midrule
-\endhead
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Versión}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-1.0\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Autor}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-Daniel Puente Ramírez\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Requisitos asociados}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-RF-1, RF-1.1, RF-1.1.1, RF-1.1.2, RF-1.1.3, RF-1.3\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Descripción}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-Permite al usuario reutilizar el experimento que ya había creado.\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Precondiciones}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-El experimento base existe.\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Acciones}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
+\textbf{CU-1.1.2} & \textbf{Reutilizar Experimento}\\
+\toprule
+\textbf{Versión} & 1.0\\
+\textbf{Autor} & Daniel Puente Ramírez\\
+\textbf{Requisitos asociados} & RF-1, RF-1.1, RF-1.1.1, RF-1.1.2, RF-1.1.3, RF-1.3\\
+\textbf{Descripción} & Permite al usuario reutilizar el experimento que ya había creado.\\
+\textbf{Precondición} & El experimento base existe.\\
+\textbf{Acciones} &
 \begin{enumerate}
 \def\labelenumi{\arabic{enumi}.}
 \tightlist
@@ -430,73 +298,67 @@ \subsection{Casos de uso}\label{casos-de-uso}
 \item Hace \textit{click} en <<Mis Experimentos>>.
 \item Busca el experimento del que desea obtener la parametrización para uno nuevo.
 \item Hace \textit{click} en <<Reuse>>.
-\end{enumerate}\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Postcondición}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
+\end{enumerate}\\
+\textbf{Postcondiciones} & 
 \begin{enumerate}
 \tightlist
 \item El modelo base no se ha visto afectado.
 \item El usuario se encuentra en la pantalla <<Nuevo Experimento>> con la configuración <<nueva>>.
-\end{enumerate}\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Excepciones}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
+\end{enumerate}\\
+\textbf{Excepciones} & 
 \begin{itemize}
 \tightlist
 \item Algún parámetro interno ha cambiado y ya no se puede reutilizar el experimento.
 \item Solo se puede recuperar parte de la configuración.
-\end{itemize}\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Importancia}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-Media\strut
-\end{minipage}\tabularnewline
+\end{itemize}\\
+\textbf{Importancia} & Media \\
 \bottomrule
+\end{tabularx}
 \caption{CU-1.1.2 Reutilizar Experimento.}
-\end{longtable}
+\end{table}
+
+% Caso de Uso 1.2 -> Consultar Registros en la Base de Datos
+\begin{table}[p]
+\centering
+\begin{tabularx}{\linewidth}{ p{0.21\columnwidth} p{0.71\columnwidth} }
+\toprule
+\textbf{CU-1.2} & \textbf{Consultar Registros en la Base de Datos}\\
+\toprule
+\textbf{Versión} & 1.0\\
+\textbf{Autor} & Daniel Puente Ramírez\\
+\textbf{Requisitos asociados} & RF-1, RF-2, RF-3, RF-4, RF-5, RF-6\\
+\textbf{Descripción} & Recuperación de los registros necesarios de la base de datos.\\
+\textbf{Precondición} & Existen los registros.\\
+\textbf{Acciones} &
+\begin{enumerate}
+\def\labelenumi{\arabic{enumi}.}
+\tightlist
+\item El usuario entra en la plataforma.
+\item Realiza alguna acción relacionada con la base de datos.
+\item Se le devuelven los datos solicitados, y/o
+\item Se almacenan los nuevos datos.
+\end{enumerate}\\
+\textbf{Postcondición} & La integridad de la base de datos no se ha visto afectada.\\
+\textbf{Excepciones} & Intento de escritura simultánea por parte de dos usuarios.\\
+\textbf{Importancia} & Alta \\
+\bottomrule
+\end{tabularx}
+\caption{CU-1.2 Consultar Registros en la Base de Datos.}
+\end{table}
 
 % Caso de Uso 2 -> Crear Experimento
-\begin{longtable}[H]{@{}ll@{}}
+\begin{table}[p]
+\centering
+\begin{tabularx}{\linewidth}{ p{0.21\columnwidth} p{0.71\columnwidth} }
+\toprule
+\textbf{CU-2} & \textbf{Crear Experimento}\\
 \toprule
-\begin{minipage}[b]{0.23\columnwidth}\raggedright\strut
-\textbf{CU-2}\strut
-\end{minipage} & \begin{minipage}[b]{0.71\columnwidth}\raggedright\strut
-\textbf{Crear Experimento}\strut
-\end{minipage}\tabularnewline
-\midrule
-\endhead
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Versión}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-1.0\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Autor}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-Daniel Puente Ramírez\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Requisitos asociados}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-RF-1, RF-1.1, RF-1.1.1, RF-1.1.2, RF-1.1.3, RF-2, RF-2.1\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Descripción}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-Permite al usuario crear un nuevo experimento.\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Precondiciones}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-La parametrización es correcta.\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Acciones}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
+\textbf{Versión} & 1.0\\
+\textbf{Autor} & Daniel Puente Ramírez\\
+\textbf{Requisitos asociados} & RF-1, RF-1.1, RF-1.1.1, RF-1.1.2, RF-1.1.3, RF-2, RF-2.1\\
+\textbf{Descripción} & Permite al usuario crear un nuevo experimento.\\
+\textbf{Precondición} & La parametrización es correcta.\\
+\textbf{Acciones} &
 \begin{enumerate}
 \def\labelenumi{\arabic{enumi}.}
 \tightlist
@@ -504,69 +366,33 @@ \subsection{Casos de uso}\label{casos-de-uso}
 \item Hace \textit{click} en <<Nuevo Experimento>>.
 \item Rellena el formulario en función de un conjunto de datos y una técnica de aprendizaje automático.
 \item Hace \textit{click} en <<Crear>>.
-\end{enumerate}\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Postcondición}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
+\end{enumerate}\\
+\textbf{Postcondiciones} & 
 \begin{enumerate}
 \tightlist
 \item El experimento ha sido añadido a las colas de ejecución.
 \item El usuario recibe un correo electrónico con la finalización del experimento.
-\end{enumerate}\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Excepciones}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-El experimento ha sido incorrectamente parametrizado y se ha levantado una excepción al intentar ejecutarlo.\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Importancia}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-Alta\strut
-\end{minipage}\tabularnewline
+\end{enumerate}\\
+\textbf{Excepciones} & El experimento ha sido incorrectamente parametrizado y se ha levantado una excepción al intentar ejecutarlo.\\
+\textbf{Importancia} & Alta \\
 \bottomrule
+\end{tabularx}
 \caption{CU-2 Crear Experimento.}
-\end{longtable}
+\end{table}
 
 % Caso de Uso 3 -> Modificar Usuario
-\begin{longtable}[H]{@{}ll@{}}
+\begin{table}[p]
+\centering
+\begin{tabularx}{\linewidth}{ p{0.21\columnwidth} p{0.71\columnwidth} }
 \toprule
-\begin{minipage}[b]{0.23\columnwidth}\raggedright\strut
-\textbf{CU-3}\strut
-\end{minipage} & \begin{minipage}[b]{0.71\columnwidth}\raggedright\strut
-\textbf{Modificar Usuario}\strut
-\end{minipage}\tabularnewline
-\midrule
-\endhead
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Versión}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-1.0\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Autor}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-Daniel Puente Ramírez\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Requisitos asociados}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-RF-4, RF-4.1, RF-4.2, RF-4.3, RF-4.4\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Descripción}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-Permite al usuario modificar sus datos personales dentro de la plataforma.\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Precondiciones}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-Los datos del usuarios son recuperados de la base de datos.\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Acciones}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
+\textbf{CU-3} & \textbf{Modificar Usuario}\\
+\toprule
+\textbf{Versión} & 1.0\\
+\textbf{Autor} & Daniel Puente Ramírez\\
+\textbf{Requisitos asociados} & RF-4, RF-4.1, RF-4.2, RF-4.3, RF-4.4\\
+\textbf{Descripción} & Permite al usuario modificar sus datos personales dentro de la plataforma.\\
+\textbf{Precondición} & Los datos del usuarios son recuperados de la base de datos.\\
+\textbf{Acciones} &
 \begin{enumerate}
 \def\labelenumi{\arabic{enumi}.}
 \tightlist
@@ -575,70 +401,34 @@ \subsection{Casos de uso}\label{casos-de-uso}
 \item Hace \textit{click} en <<Editar Perfil>>.
 \item Modifica los datos como considere oportuno.
 \item Hace \textit{click} en <<Guardar>>.
-\end{enumerate}\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Postcondición}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
+\end{enumerate}\\
+\textbf{Postcondiciones} & 
 \begin{enumerate}
 \tightlist
 \item Todos los campos son validados de forma que individualmente cumplan sus respectivas restricciones de formato.
 \item Para aquellos campos que deben ser únicos, se garantiza su unicidad.
 \item Los datos actualizados son visibles desde el momento en el que se actualiza la página para el usuario.
-\end{enumerate}\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Excepciones}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-Modificación concurrente en la base de datos.\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Importancia}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-Baja\strut
-\end{minipage}\tabularnewline
+\end{enumerate}\\
+\textbf{Excepciones} & Modificación concurrente de la base de datos.\\
+\textbf{Importancia} & Baja \\
 \bottomrule
+\end{tabularx}
 \caption{CU-3 Modificar Usuario.}
-\end{longtable}
+\end{table}
 
 % Caso de Uso 4 -> Registro de Usuario
-\begin{longtable}[H]{@{}ll@{}}
+\begin{table}[p]
+\centering
+\begin{tabularx}{\linewidth}{ p{0.21\columnwidth} p{0.71\columnwidth} }
+\toprule
+\textbf{CU-4} & \textbf{Registro de Usuario}\\
 \toprule
-\begin{minipage}[b]{0.23\columnwidth}\raggedright\strut
-\textbf{CU-4}\strut
-\end{minipage} & \begin{minipage}[b]{0.71\columnwidth}\raggedright\strut
-\textbf{Registro de Usuario}\strut
-\end{minipage}\tabularnewline
-\midrule
-\endhead
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Versión}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-1.0\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Autor}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-Daniel Puente Ramírez\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Requisitos asociados}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-RF-3, RF-3.1, RF-3.1.1, RF-3.1.2\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Descripción}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-Permite al administrador crear un nuevo usuario, o a un cliente registrarse en la plataforma y convertirse en administrador.\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Precondiciones}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-No existen precondiciones.\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Acciones} (para el administrador)\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
+\textbf{Versión} & 1.0\\
+\textbf{Autor} & Daniel Puente Ramírez\\
+\textbf{Requisitos asociados} & RF-3, RF-3.1, RF-3.1.1, RF-3.1.2\\
+\textbf{Descripción} & Permite al administrador crear un nuevo usuario, o a un cliente registrarse en la plataforma y convertirse en administrador.\\
+\textbf{Precondiciones} & No existen precondiciones.\\
+\textbf{Acciones} &
 \begin{enumerate}
 \def\labelenumi{\arabic{enumi}.}
 \tightlist
@@ -647,70 +437,34 @@ \subsection{Casos de uso}\label{casos-de-uso}
 \item Hace \textit{click} en <<Nuevo Usuario>>.
 \item Introduce los datos del nuevo usuario.
 \item Hace \textit{click} en <<Guardar>>.
-\end{enumerate}\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Postcondición}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
+\end{enumerate}\\
+\textbf{Postcondiciones} & 
 \begin{enumerate}
 \tightlist
 \item Todos los campos son validados de forma que individualmente cumplan sus respectivas restricciones de formato.
 \item Para aquellos campos que deben ser únicos, se garantiza su unicidad.
 \item El nuevo usuario recibe un correo electrónico con el \textit{token} de activación de la cuenta.
-\end{enumerate}\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Excepciones}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-Modificación concurrente en la base de datos.\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Importancia}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-Baja\strut
-\end{minipage}\tabularnewline
+\end{enumerate}\\
+\textbf{Excepciones} & Modificación concurrente en la base de datos.\\
+\textbf{Importancia} & Baja \\
 \bottomrule
+\end{tabularx}
 \caption{CU-4 Registro de Usuario.}
-\end{longtable}
+\end{table}
 
 % Caso de Uso 5 -> Administrar Usuarios
-\begin{longtable}[H]{@{}ll@{}}
+\begin{table}[p]
+\centering
+\begin{tabularx}{\linewidth}{ p{0.21\columnwidth} p{0.71\columnwidth} }
 \toprule
-\begin{minipage}[b]{0.23\columnwidth}\raggedright\strut
-\textbf{CU-5}\strut
-\end{minipage} & \begin{minipage}[b]{0.71\columnwidth}\raggedright\strut
-\textbf{Administrar Usuarios}\strut
-\end{minipage}\tabularnewline
-\midrule
-\endhead
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Versión}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-1.0\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Autor}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-Daniel Puente Ramírez\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Requisitos asociados}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-RF-3, RF-3.1, RF-3.1.1, RF-3.1.2, RF-3.2, RF-3.3, RF-3.4, RF-3.5\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Descripción}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-Permite al administrador crear, (de)activar, hacer (o quitar de) administrador, o eliminar a un usuario.\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Precondiciones}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-El usuario a modificar no es el mismo usuario que está modificando.\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Acciones} (para el administrador)\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
+\textbf{CU-5} & \textbf{Administrar Usuarios}\\
+\toprule
+\textbf{Versión} & 1.0\\
+\textbf{Autor} & Daniel Puente Ramírez\\
+\textbf{Requisitos asociados} & RF-3, RF-3.1, RF-3.1.1, RF-3.1.2, RF-3.2, RF-3.3, RF-3.4, RF-3.5\\
+\textbf{Descripción} & Permite al administrador crear, (de)activar, hacer (o quitar de) administrador, o eliminar a un usuario.\\
+\textbf{Precondición} & El usuario a modificar no es el mismo usuario que está modificando.\\
+\textbf{Acciones} &
 \begin{enumerate}
 \def\labelenumi{\arabic{enumi}.}
 \tightlist
@@ -718,65 +472,28 @@ \subsection{Casos de uso}\label{casos-de-uso}
 \item Hace \textit{click} en <<Usuarios>> en el panel lateral de administración.
 \item Puede buscar si así lo desea al usuario en cuestión.
 \item Realiza las modificaciones pertinentes.
-\end{enumerate}\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Postcondición}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-La modificación ha sido correcta.\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Excepciones}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-Modificación concurrente en la base de datos.\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Importancia}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-Media\strut
-\end{minipage}\tabularnewline
+\end{enumerate}\\
+\textbf{Postcondición} & La modificación ha sido correcta.\\
+\textbf{Excepciones} & Modificación concurrente en la base de datos.\\
+\textbf{Importancia} & Media \\
 \bottomrule
+\end{tabularx}
 \caption{CU-5 Administrar Usuarios.}
-\end{longtable}
+\end{table}
 
 % Caso de Uso 6 -> Consultar Analíticas de Uso
-\begin{longtable}[H]{@{}ll@{}}
+\begin{table}[p]
+\centering
+\begin{tabularx}{\linewidth}{ p{0.21\columnwidth} p{0.71\columnwidth} }
+\toprule
+\textbf{CU-6} & \textbf{Consultar Analíticas de Uso}\\
 \toprule
-\begin{minipage}[b]{0.23\columnwidth}\raggedright\strut
-\textbf{CU-6}\strut
-\end{minipage} & \begin{minipage}[b]{0.71\columnwidth}\raggedright\strut
-\textbf{Consultar Analíticas de Uso}\strut
-\end{minipage}\tabularnewline
-\midrule
-\endhead
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Versión}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-1.0\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Autor}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-Daniel Puente Ramírez\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Requisitos asociados}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-RF-6, RF-6.1, RF-6.1.1, RF-6.1.2, RF-6.1.3, RF-6.2, RF-6.2.1, RF-6.2.2, RF-6.2.3\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Descripción}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-Permite a un usuario comprobar sus estadísticas de uso. Y si es administrador, las del la plataforma.\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Precondiciones}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-Existen estadísticas que mostrar.\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Acciones} (para el usuario)\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
+\textbf{Versión} & 1.0\\
+\textbf{Autor} & Daniel Puente Ramírez\\
+\textbf{Requisitos asociados} & RF-6, RF-6.1, RF-6.1.1, RF-6.1.2, RF-6.1.3, RF-6.2, RF-6.2.1, RF-6.2.2, RF-6.2.3\\
+\textbf{Descripción} & Permite a un usuario comprobar sus estadísticas de uso. Y si es administrador, las del la plataforma.\\
+\textbf{Precondición} & Existen estadísticas que mostrar.\\
+\textbf{Acciones} (para el usuario) &
 \begin{enumerate}
 \def\labelenumi{\arabic{enumi}.}
 \tightlist
@@ -784,158 +501,68 @@ \subsection{Casos de uso}\label{casos-de-uso}
 \item Hace \textit{click} en <<Mis Experimentos>>.
 \item Hace \textit{click} en <<Estadísticas>>.
 \item Puede visualizar las estadísticas generales de la plataforma.
-\end{enumerate}\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Acciones} (para el administrador)\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
+\end{enumerate}\\
+\textbf{Acciones} (para el administrador) &
 \begin{enumerate}
 \def\labelenumi{\arabic{enumi}.}
 \tightlist
 \item El administrador entra en la plataforma.
 \item Hace \textit{click} en \textit{<<Dashboard>>} en el panel lateral de administración.
 \item Puede visualizar las estadísticas generales de la plataforma.
-\end{enumerate}\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Postcondición}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-No existen postcondiciones.\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Excepciones}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-No existen excepciones.\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Importancia}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-Alta\strut
-\end{minipage}\tabularnewline
+\end{enumerate}\\
+\textbf{Postcondiciones} & No existen postcondiciones.\\
+\textbf{Excepciones} & No existen excepciones.\\
+\textbf{Importancia} & Alta \\
 \bottomrule
+\end{tabularx}
 \caption{CU-6 Consultar Analíticas de Uso.}
-\end{longtable}
+\end{table}
 
 % Caso de Uso 7 -> Monitorización del Sistema en Tiempo Real
-\begin{longtable}[H]{@{}ll@{}}
+\begin{table}[p]
+\centering
+\begin{tabularx}{\linewidth}{ p{0.21\columnwidth} p{0.71\columnwidth} }
 \toprule
-\begin{minipage}[b]{0.23\columnwidth}\raggedright\strut
-\textbf{CU-7}\strut
-\end{minipage} & \begin{minipage}[b]{0.71\columnwidth}\raggedright\strut
-\textbf{Monitorización del Sistema en Tiempo Real}\strut
-\end{minipage}\tabularnewline
-\midrule
-\endhead
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Versión}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-1.0\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Autor}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-Daniel Puente Ramírez\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Requisitos asociados}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-RF-5, RF-5.1, RF-5.2, RF-5.3\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Descripción}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-Permite al administrador comprobar el estado de carga actual del sistema.\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Precondiciones}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-Existen registros de datos para calcular las estadísticas que mostrar.\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Acciones}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
+\textbf{CU-7} & \textbf{Monitorización del Sistema en Tiempo Real}\\
+\toprule
+\textbf{Versión} & 1.0\\
+\textbf{Autor} & Daniel Puente Ramírez\\
+\textbf{Requisitos asociados} & RF-5, RF-5.1, RF-5.2, RF-5.3\\
+\textbf{Descripción} & Permite al administrador comprobar el estado de carga actual del sistema.\\
+\textbf{Precondición} & Existen registros de datos para calcular las estadísticas que mostrar.\\
+\textbf{Acciones} &
 \begin{enumerate}
 \def\labelenumi{\arabic{enumi}.}
 \tightlist
 \item El administrador entra en la plataforma.
 \item Hace \textit{click} en \textit{<<Live Monitor>>} en el panel lateral de administración.
 \item Puede visualizar las estadísticas generales de la plataforma.
-\end{enumerate}\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Postcondición}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-No existen postcondiciones.\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Excepciones}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-Si no existen datos que mostrar aún.\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Importancia}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-Alta\strut
-\end{minipage}\tabularnewline
+\end{enumerate}\\
+\textbf{Postcondiciones} & No existen postcondiciones.\\
+\textbf{Excepción} & En caso de que no existan datos aún.\\
+\textbf{Importancia} & Alta \\
 \bottomrule
+\end{tabularx}
 \caption{CU-7 Monitorización del Sistema en Tiempo Real.}
-\end{longtable}
+\end{table}
 
 % Caso de Uso 7.1 -> Monitor del Sitema
-\begin{longtable}[H]{@{}ll@{}}
+\begin{table}[p]
+\centering
+\begin{tabularx}{\linewidth}{ p{0.21\columnwidth} p{0.71\columnwidth} }
+\toprule
+\textbf{CU-7.1} & \textbf{Monitor del Sistema}\\
 \toprule
-\begin{minipage}[b]{0.23\columnwidth}\raggedright\strut
-\textbf{CU-7.1}\strut
-\end{minipage} & \begin{minipage}[b]{0.71\columnwidth}\raggedright\strut
-\textbf{Monitor del Sitema}\strut
-\end{minipage}\tabularnewline
-\midrule
-\endhead
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Versión}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-1.0\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Autor}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-Daniel Puente Ramírez\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Requisitos asociados}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-RF-5.1, RF-5.2, RF-5.3\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Descripción}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-Proceso de recolección de información de uso del sistema.\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Precondiciones}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-Glances está instalado en el sistema.\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Acciones}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-Ninguna, ejecución en paralelo en el sistema.\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Postcondición}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-No existen postcondiciones.\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Excepciones}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-No existen excepciones.\strut
-\end{minipage}\tabularnewline
-\begin{minipage}[t]{0.23\columnwidth}\raggedright\strut
-\textbf{Importancia}\strut
-\end{minipage} & \begin{minipage}[t]{0.71\columnwidth}\raggedright\strut
-Alta\strut
-\end{minipage}\tabularnewline
+\textbf{Versión} & 1.0\\
+\textbf{Autor} & Daniel Puente Ramírez\\
+\textbf{Requisitos asociados} & RF-5.1, RF-5.2, RF-5.3\\
+\textbf{Descripción} & Proceso de recolección de información de uso del sistema.\\
+\textbf{Precondición} & Glances está instalado en el sistema.\\
+\textbf{Acciones} & Ninguna, ejecución en paralelo en el sistema.\\
+\textbf{Postcondiciones} & No existen postcondiciones.\\
+\textbf{Excepción} & No existen excepciones.\\
+\textbf{Importancia} & Alta \\
 \bottomrule
-\caption{CU-7.1 Monitor del Sitema.}
-\end{longtable}
\ No newline at end of file
+\end{tabularx}
+\caption{CU-7.1 Monitor del Sistema.}
+\end{table}
diff --git a/docs/tex/D_Manual_programador.tex b/docs/tex/D_Manual_programador.tex
index 61d0652..24a5d68 100644
--- a/docs/tex/D_Manual_programador.tex
+++ b/docs/tex/D_Manual_programador.tex
@@ -1,11 +1,445 @@
 \apendice{Documentación técnica de programación}
 
 \section{Introducción}
+En este anexo se va a describir con detalle la documentación técnica de programación. Se describirá la estructura de directorios que posee, la instalación del propio entorno de desarrollo, cómo llevar a cabo su compilación, instalación y ejecución; además de las pruebas que se han realizado.
 
-\section{Estructura de directorios}
+Se debe recordar que el proyecto se encuentra dividido en dos repositorios diferenciados, UBUMLaaS e IS-SSL\footnote{Biblioteca de algoritmos de selección de instancias y aprendizaje semi-supervisado programado.}; es por ello que, se dividirá en dos secciones respectivamente, y tantas subsecciones como son necesarias para cada uno de ellos.
 
-\section{Manual del programador}
+\section{UBUMLaaS}
 
-\section{Compilación, instalación y ejecución del proyecto}
+\subsection{Estructura de directorios}
+La estructura del repositorio es la siguiente:
+\begin{itemize}
+\tightlist
+\item \texttt{/}: raíz del proyecto, aquí se encuentra el README, la licencia, los ficheros de configuración de las pruebas de integración y despliegue continuo (CI-CD), junto con los ficheros de requisitos para \texttt{conda} y \texttt{pyenv}. 
+\item \texttt{/lib/}: librerías utilizadas por el sistema.
+\item \texttt{/lib/is\_ssl}: librería propia de métodos de selección de instancias y aprendizaje semi-supervisado.
+\item \texttt{/lib/scikit\_ml\_learn\_data/meka/meka-release-1.9.2/}: librería \texttt{Meka} en su versión 1.9.2.
+\item \texttt{/lib/skmultilearn/}: librería \texttt{scikit-multilearn}.
+\item \texttt{/lib/unofficial\_weka\_packages/}: algoritmos de ADMIRABLE.
+\item \texttt{/lib/wekafiles/}: algoritmos concretos de \texttt{weka}.
+\item \texttt{/test/*}: ficheros de prueba CI-CD.
+\item \texttt{/ubumlaas/}: directorio principal de la plataforma.
+\item \texttt{/ubumlaas/admin/}: contiene toda la parte de \textit{backend} de administración.
+\item \texttt{/ubumlaas/core/}: contiene el \textit{backend} de las vistas de índice y acerca de.
+\item \texttt{/ubumlaas/default\_datasets/}: conjuntos de datos por defecto que se añaden a los nuevos usuarios.
+\item \texttt{/ubumlaas/error\_pages/}: contiene el \textit{backend} de las vistas de error.
+\item \texttt{/ubumlaas/experiments/}: contiene el \textit{backend} para la realización de experimentos.
+\item \texttt{/ubumlaas/experiments/algorithm/}: contiene las métricas para el análisis del modelo entrenado.
+\item \texttt{/ubumlaas/experiments/execute\_algorithm/}: contiene opciones de ejecución para cada librería.
+\item \texttt{/ubumlaas/experiments/views/}: control de las vistas relacionadas con los experimentos.
+\item \texttt{/ubumlaas/jobs/}: descripción de \textit{RQ Worker Builder}.
+\item \texttt{/ubumlaas/static/}: contiene los ficheros estáticos de la plataforma.
+\item \texttt{/ubumlaas/static/avatars/}: contiene las imágenes de perfil de cada usuario.
+\item \texttt{/ubumlaas/static/css/}: contiene el código \texttt{CSS} del \textit{frontend}.
+\item \texttt{/ubumlaas/static/img/}: contiene las imágenes que aparecen en la pltaforma.
+\item \texttt{/ubumlaas/static/js/}: contiene el código \texttt{JavaScript} del \textit{frontend}.
+\item \texttt{/ubumlaas/templates/}: ficheros \texttt{HTML}.
+\item \texttt{/ubumlaas/templates/admin/}: ficheros web de administración.
+\item \texttt{/ubumlaas/templates/blocks/}: ficheros web de bloques que se añaden sobre otros documentos web.
+\item \texttt{/ubumlaas/templates/error\_pages/}: ficheros web de errores (403, 404, \dots)
+\item \texttt{/ubumlaas/templates/modals/}: ficheros para la representación de modales.
+\item \texttt{/ubumlaas/users/}: contiene el \textit{backend} de las actividades relacionadas con el usuario.
+\item \texttt{/ubumlaas/weka/}: contiene los ficheros de configuración de \texttt{Weka} y su \texttt{VM}.
 
-\section{Pruebas del sistema}
+\end{itemize}
+
+\subsection{Manual del programador}
+En esta subsección se describen todos aquellos recursos seguidos por el equipo de desarrollo para, valga la redundancia, desarrollar el proyecto. De tal forma que un futuro desarrollador/mantenedor del proyecto no tenga inconvenientes a la hora de retomar el proyecto y conocerlo.
+
+\subsubsection{Entorno de desarrollo}
+Para poder continuar con el desarrollo del proyecto, se requiere tener instalado el siguiente \textit{software} en el equipo:
+\begin{itemize}
+\tightlist
+\item Python 3.7+.
+\item Bibliotecas Python.
+\item Git
+\item VSCode
+\end{itemize}
+
+En los siguientes apartados se detalla la instalación de cada uno de los componentes anteriormente citados.
+
+\subsubsection{Python 3.7+}
+Al comienzo del proyecto, muchas de sus funcionalidades eran compatibles con Python 2, pero el nuevo desarrollo ha utilizado indistintamente métodos existentes en versiones anteriores de Python y algunos que se han introducido a partir de la version 3.7, disponible desde~\cite{pythonGetIt}. Es importante que los binarios se encuentren en el \texttt{path} del sistema para que no de problemas de ejecución.
+
+\subsubsection{Bibliotecas Python}
+A continuación (ver Tabla~\ref{tab:bibliotecas-python-ubumlaas}), se van a detallar uno de los puntos más importantes para poder <<hacer funcionar>> el proyecto, puesto que se van a necesitar versiones concretas de determinadas librerías para que todo se integre correctamente con todo y se pueda ver y utilizar como un sistema homogéneo.
+
+\begin{table}[p]
+\centering
+\begin{tabular}{lcl}
+	\textbf{Biblioteca} & \textbf{Versión} & \textbf{Descripción}\\
+	\toprule
+	\rowcolor[HTML]{EFEFEF} 
+	\texttt{email-validator} & 1.1.1 & Validar direcciones de correo electrónico.\\
+	\texttt{flask} & 1.1.1 & Web \textit{framework}.\\ \rowcolor[HTML]{EFEFEF}
+	\texttt{flask-login} & 0.4.1 & Control usuarios y sesiones en Flask.\\
+	\texttt{flask-mail} & 0.9.1 & Envío de \textit{emails} con Flask.\\ \rowcolor[HTML]{EFEFEF}
+	\texttt{flask-migrate} & 2.5.2 & Migrar SQLAchemy DB a Flask.\\
+	\texttt{flask-redis} & 0.4.0 & Soporte a Redis en Flask.\\ \rowcolor[HTML]{EFEFEF}
+	\texttt{flask-sqlalchemy} & 2.4.0 & Soporte a SQLAchemy en Flask.\\
+	\texttt{flask-wtf} & 0.14.2 & Render, validar y CSRF formularios.\\ \rowcolor[HTML]{EFEFEF}
+	\texttt{future} & 0.16.0 & Soporte a Python 2 y 3.\\ 
+	\texttt{geopy} & 2.2.0 & Geocodificación.\\ \rowcolor[HTML]{EFEFEF}
+	\texttt{glances} & 3.2.4.2 & Monitorización del sistema.\\ 
+	\texttt{imbalanced-learn} & 0.5.0 & ML con datos desbalanceados.\\ \rowcolor[HTML]{EFEFEF}
+	\texttt{itsdangerous} & 1.1.0 & Paso de datos en entornos no seguros.\\
+	\texttt{liac-arff} & 2.2.1 & Escritura y lectura de ficheros ARFF.\\ \rowcolor[HTML]{EFEFEF}
+	\texttt{numpy} & 1.22.3 & Computación de \textit{arrays}.\\
+	\texttt{pandas} & 0.25.1 & Estructuras de datos.\\ \rowcolor[HTML]{EFEFEF}
+	\texttt{psutil} & 5.9.0 & Procesar y monitorizar sistemas.\\
+	\texttt{pycountry} & 22.3.5 & Datos de países.\\ \rowcolor[HTML]{EFEFEF}
+	\texttt{pytest} & 5.2.1 & Pruebas en Python.\\
+	\texttt{python-weka-wrapper3} & 0.1.7 & \textit{Wrapper} para Weka.\\ \rowcolor[HTML]{EFEFEF}
+	\texttt{requests} & 2.22.0 & \textit{Requests} para humanos.\\
+	\texttt{rq} & 1.1.0 & Crear y procesar trabajos <<de fondo>>.\\ \rowcolor[HTML]{EFEFEF}
+	\texttt{scikit-learn} & 0.24 & Módulos de minería de datos y ML.\\ 
+	\texttt{selenium} & 3.141.0 & Auto interacción con navegador web.\\ \rowcolor[HTML]{EFEFEF}
+	\texttt{urllib3} & 1.25.6 & Conexiones HTTP seguras.\\
+	\texttt{werkzeug} & 0.15.6 & Biblioteca de aplicaciones web WSGI.\footnote{\textit{Web Server Gateway Interface.}. Es una especificación que describe cómo un servidor web se comunica con las aplicaciones web, y cómo las aplicaciones web pueden encadenarse para procesar una solicitud.}\\ \rowcolor[HTML]{EFEFEF}
+	\texttt{whichcraft} & 0.4.1 & Funcionalidad \textit{shutil.which}. \\
+	\bottomrule
+\end{tabular}
+\caption{Bibliotecas utilizadas y sus versiones.}\label{tab:bibliotecas-python-ubumlaas}
+\end{table}
+
+Las versiones indicadas en la tabla~\ref{tab:bibliotecas-python-ubumlaas} son las que se han utilizado para el desarrollo del proyecto, se pueden actualizar a versiones futuras, siempre y cuando sean compatibles entre sí.
+
+\subsubsection{Git}
+\imagenRuta{../img/anexos/manual-programador/gitkraken}{Interfaz de \texttt{GitKraken}.}{gitkraken}
+Para poder utilizar el repositorio ha de utilizarse el gestor de versiones \texttt{Git}. Se recomienda utilizar GUI con soporte a VC\footnote{Control de versiones (\textit{Version Control}).} tales que no requieran de una interfaz de comandos para su utilización, pero eso se deja a decisión del futuro desarrollador.
+
+En la Figura~\ref{fig:gitkraken} se aprecia como el \textit{software} \texttt{GitKraken} permite, de forma intuitiva y sencilla, el uso de \texttt{Git} y todo su potencial. Se puede obtener desde~\cite{gitkraken}.
+
+El repositorio posee una serie diferente de ramas de trabajo, se recomienda para producción utilizar o el último \textit{release} o bien la rama principal.
+
+\subsubsection{Visual Studio Code}
+\texttt{Visual Studio Code} es una herramienta de amplia versatilidad la cual soporta todos los lenguajes de programación utilizados en este proyecto (y muchos más) de forma nativa; además, posee ciertos \textit{plugins} que facilitan el desarrollo proporcionando \textit{snippets} y similares. Se recomienda su uso ya que es un IDE <<todo-en-uno>>, facilitando las tareas de desarrollo. 
+
+Se puede obtener desde~\cite{VSCode}.
+
+\subsection{Compilación, instalación y ejecución del proyecto}
+En esta subsección se va a detallar el proceso a seguir para poder hacer uso del proyecto en local, modificarlo y/o utilizarlo. La forma de desarrollo del proyecto no ha sido estrictamente en local, sino que el proyecto se encontraba alojado en un equipo servidor y mediante SSH\footnote{\textit{Suite} de protocolos los cuales especifican estándares para operar los servicios de red de forma segura entre anfitriones para los que no existe una relación de confianza a través de redes no seguras. Las comunicaciones entre pares se encuentran encriptadas.} se realizaba la conexión y posterior edición de los ficheros.
+
+\subsubsection{Adquisición del código fuente}
+Lo primero que se necesita es obtener el código en el equipo, para ello podemos seguir una de las siguientes aproximaciones:
+\begin{itemize}
+\item Mediante el uso de la terminal.
+\begin{enumerate}
+\tightlist
+\item Apertura de la terminal.
+\item Desplazarse al directorio en donde se desee clonar el repositorio (usando \texttt{cd} en Unix o \texttt{dir} en Windows).
+\item Hacer uso del siguiente comando:\\
+\texttt{git clone https://github.com/dpr1005/UBUMLaaS.git}
+\item Se dispone de una copia idéntica a la alojada en el repositorio de \texttt{GitHub}.
+\end{enumerate}
+
+\item Descarga desde el navegador.
+\begin{itemize}
+\tightlist
+\item Apertura del navegador preferido.
+\item Introducir en la barra de búsqueda la siguiente dirección:\\
+\texttt{https://github.com/dpr1005/UBUMLaaS/archive/refs/\\heads/master.zip}
+\item Aceptar la descarga en caso de tener habilitada la comprobación.
+\item Navegar con el Explorador de archivos del sistema hasta el directorio de descarga.
+\end{itemize}
+
+\item Uso de \texttt{GitKraken}.
+\begin{itemize}
+\tightlist
+\item Apertura de la aplicación.
+\item Hacer \textit{click} en \textit{Clone a repo}.
+\item En \textit{Repository Management} $\rightarrow$ \textit{Clone} $\rightarrow$ \textit{Clone with URL}: 
+\begin{itemize}
+\item Indicar la ruta local en la que nos interesa que se clone el repositorio.
+\item En URL introducir:\\
+\texttt{git clone https://github.com/dpr1005/UBUMLaaS.git}
+\end{itemize}
+\item Hacer \textit{click} en \textit{Clone the repo!}.
+\end{itemize}
+\end{itemize}
+
+\subsubsection{Importar el proyecto en Visual Studio Code}
+Se diferencian dos aproximaciones, local o como se ha operado, conexión mediante SSH.
+
+\begin{itemize}
+\item Importar el proyecto en la propia máquina donde se va a desplegar y será en ella en la que se edite.
+\begin{enumerate}
+\item Apertura de \texttt{Visual Studio Code}.
+\item Hacer \textit{click} en Abrir.
+\item Seleccionar el directorio raíz dónde lo hayamos alojado.
+\end{enumerate}
+\item Importar el proyecto en una máquina y editarlo desde otra.
+\begin{enumerate}
+\item Seguir los pasos de la adquisición del código en la máquina en la que se va a alojar el código. En el equipo local no va a estar.
+\item Apertura de \texttt{Visual Studio Code}
+\item Navegar a las Extensiones e instalar \texttt{Remote - SSH}, disponible desde~\cite{VSCode-Remote-SSH}.
+\item Instalar un cliente SSH compatible con \texttt{OpenSSH}. Ver guía~\cite{Remote-Development-Tricks-Tips}.
+\item Con todo instalado, se realiza la conexión a la máquina remota.
+\begin{enumerate}
+\item Presionar \texttt{F1} y correr el comando: \texttt{Remote-SSH: Open SSH Host...}
+\item Introducir el usuario y el \texttt{host/IP} en el formato:\\
+\texttt{user@host-o-ip} ó \texttt{user@domain@host-o-ip}
+\item En caso de que se solicite, introducir la contraseña, pero se recomienda configurar el uso de llaves SSH, ver guía~\cite{Remote-Development-Tricks-Tips}.
+\item Después de la conexión usar Archivo $\rightarrow$ Abrir carpeta, para abrir el directorio donde se encuentra el proyecto en la máquina remota.
+\end{enumerate}
+\item Todos los cambios que se realicen, se harán sobre el código en la máquina remota, la máquina local no hará más que el efecto de editor.
+\end{enumerate}
+\end{itemize}
+
+\subsubsection{Crear entorno virtual de trabajo}
+Para poder trabajar con este proyecto (independientemente de si es para desarrollo o producción) hacen falta una serie de bibliotecas concretas de Python, las cuales, como es lógico, deben estar en la máquina en la que se va a correr; dicho con otras palabras, en la que está el código. El proyecto está preparado para crear un entorno de \texttt{Conda} propio, de forma que no interfiera con otros proyectos y sea más sencillo de mantener y actualizar.
+
+Se recomienda que los binarios de anaconda o miniconda estén configurados en el \texttt{path} del sistema para poder utilizar el comando \texttt{conda} desde la línea de comandos.
+
+El proceso de creación del entrono virtual con \texttt{Conda} es el siguiente:
+\begin{enumerate}
+\tightlist
+\item Apertura de la terminal.
+\item Navegar hasta la raíz del proyecto.
+\item Crear el entorno con:\\
+\texttt{conda env create -f UBUMLaaS\_env.yml}
+\item Cuando se desee utilizar se debe activar:\\
+\texttt{conda activate UBUMLaaS}
+\end{enumerate}
+
+También se puede utilizar el procedimiento habitual para importar las bibliotecas al actual \texttt{venv} de la sesión de la terminal, pero se desaconseja su uso ya que un entorno <<genérico>> antes o después se actualizará por otros proyectos, pudiendo generar incompatibilidades con el proyecto UBUMLaaS.
+
+\subsubsection{Instalación en Linux}
+Con los anteriores pasos realizados, la importación del proyecto y la activación del entorno virtual, se deben modificar una serie de ficheros con el fin de habilitar todas las funcionalidades que ofrece el proyecto. 
+
+Se deben seguir los siguientes pasos:
+\begin{enumerate}
+\item Modificar \texttt{env\_variables.sh} con los valores correctos para cada uno de los campos:
+\begin{lstlisting}[language=bash]
+export SECRET_KEY=<app secret key>
+export EMAIL_AC=<email>
+export EMAIL_PASS=<email-password>
+export EMAIL_URL=<email-url>
+export FLASK_ENV=development #development or production
+LIBFOLDER=/absolute/path/to/UBUMLaaS
+\end{lstlisting}
+\item Dentro del entorno virtual de UBUMLaaS en \texttt{Conda}, se debe ejecutar el siguiente comando para permitir la importación de las variables anteriormente declaradas al entorno virtual.\\
+\texttt{source env\_vars\_to\_conda.sh}
+\item Creación de la base de datos.\\
+\texttt{mv data\_base.sqlite ubumlaas/data.sqlite}\\
+* En caso de poseer una base de datos con la configuración correcta, se puede poner en \texttt{./ubumlaas/} bajo el nombre de \texttt{data.sqlite}.
+\item En caso de no tener instalado y configurado \texttt{Redis-Server}, ejecutar:
+\begin{lstlisting}[language=bash]
+sudo apt install redis-server
+sudo service redis-server start
+sudo systemctl enable redis-server
+\end{lstlisting}
+\end{enumerate}
+
+\subsubsection{Uso del proyecto}
+Lo primero de todo para poder tener el producto trabajando, es desplegarlo, para ello es requisito haber completado todos los pasos previos de esta sección. Activar el entorno virtual de \texttt{Conda}, correr el lanzador, y ya está en ejecución.
+\begin{lstlisting}[language=bash]
+conda activate UBUMLaaS
+./run.sh
+\end{lstlisting}
+\textbf{Nota.} Es importante asegurarnos que todos los ficheros de las librerías y el lanzador del proyecto poseen permisos de ejecución necesarios (en instalaciones <<por defecto>> de Debian, CentOS, SUSE, no debería de ser necesario más que dar permisos de ejecución al lanzador).
+
+El usuario administrador por defecto es \texttt{Admin@AdminUBUMLaaS.es} y su contraseña es \texttt{admin4123!UBUMLaaS}.
+
+\subsection{Pruebas del sistema}
+
+\clearpage
+\section{IS-SSL}
+
+\subsection{Estructura de directorios}
+La estructura del repositorio es la siguiente:
+\begin{itemize}
+\tightlist
+\item \texttt{/}: raíz del proyecto, aquí se encuentra el README, la licencia, los ficheros de configuración de PIP, los ficheros de configuración de las pruebas de integración y despliegue continuo (CI-CD); y, el fichero de requisitos.
+\item \texttt{/datasets/*}: conjuntos de datasets en formatos \texttt{csv} y \texttt{arff}, normalizados y no normalizados.
+\item \texttt{/docs/}: documentación del proyecto.
+\item \texttt{/docs/img/}: imágenes utilizadas en la documentación.
+\item \texttt{/docs/img/anexos/*}: imágenes utilizadas en los anexos.
+\item \texttt{/docs/img/draws/}: diagramas en su formato original.
+\item \texttt{/docs/img/memoria/*}: imágenes utilizadas en la memoria.
+\item \texttt{/hypothesis/*}: primera aproximación a la investigación realizada.
+\item \texttt{/implementation\_tests/}: conjunto de pruebas de validación sobre los algoritmos implementados.
+\item \texttt{/instance\_selection/}: algoritmos implementados de selección de instancias.
+\item \texttt{/instance\_selection/utils/}: métodos de apoyo comunes a los algoritmos de selección de instancias.
+\item \texttt{/misc/}: contiene archivos varios de formato para el repositorio (cabeceras, logos, etc.).
+\item \texttt{/semisupervised/}: algoritmos implementados de aprendizaje semi-supervisado.
+\item \texttt{/semisupervised/utils/}: métodos de apoyo comunes a los algoritmos de aprendizaje semi-supervisado.
+\item \texttt{/utils/}: diferentes clases y métodos de apoyo comunes tanto a selección de instancias como a semi-supervisado.
+\end{itemize}
+
+\subsection{Manual del programador}
+En esta subsección se describen todos aquellos métodos seguidos por el equipo de desarrollo para, valga la redundancia, desarrollar el proyecto. De tal forma que un futuro desarrollador no tenga inconvenientes a la hora de retomar el proyecto.
+
+\subsubsection{Entorno de desarrollo}
+Para poder continuar con el desarrollo del proyecto, se requiere tener instalado el siguiente \textit{software} en el equipo:
+\begin{itemize}
+\tightlist
+\item Python 3.7+.
+\item Bibliotecas Python.
+\item Git
+\item VSCode/PyCharm/\dots.
+\end{itemize}
+
+En los siguientes apartados se detalla la instalación de cada uno de los componentes anteriormente citados.
+
+\subsubsection{Python 3.7+}
+El desarrollo se ha realizado siguiendo las últimas formas de programación disponibles a partir de la versión 3.7 de Python. El desarrollo se comenzó después de que se dejara de mantener Python 2, por lo que se trabajó desde el inicio con versiones de Python 3. Se puede obtener la última versión disponible de Python desde~\cite{pythonGetIt}. Es importante que el desarrollador se asegure que los binarios han sido añadidos al \texttt{path} del sistema que esté utilizando.
+
+\subsubsection{Bibliotecas Python}
+Esta sección es la más importante de todas junto con la anterior, debido a que el proyecto depende de (está construido utilizando) bibliotecas de $3^{os}$. Y en especial, determinadas versiones de las mismas. 
+
+En la Tabla~\ref{tab:bibliotecas-python-is-ssl} se detallan las bibliotecas necesarias para utilizar el proyecto tal y como se encuentra en el repositorio. Para el uso en exclusiva de las librerías de \texttt{IS-SSL} se deben utilizar aquellas que se encuentran en negrita.
+
+\begin{table}[]
+\centering
+\begin{tabular}{lcl}
+	\textbf{Biblioteca} & \textbf{Versión} & \textbf{Descripción}\\ \rowcolor[HTML]{EFEFEF} 
+	\toprule
+	\rowcolor[HTML]{EFEFEF} 
+	\texttt{matplotlib}    & 3.4.3   & Representación gráfica.   \\  
+	\textbf{\texttt{numpy}}    & 1.20.3 &  Computación de \textit{arrays}.  \\ \rowcolor[HTML]{EFEFEF} 
+	\textbf{\texttt{pandas}}    & 1.3.4  & Estructuras de datos    \\  
+	\textbf{\texttt{scikit-learn}}    & 0.24.2 & Módulos de minería de datos y ML.   \\ \rowcolor[HTML]{EFEFEF} 
+	\textbf{\texttt{scipy}}    & 1.7.1  & Módulos científicos.    \\ 
+	\texttt{yagmail}    & 0.15.277  & Cliente de GMAIL.    \\ 
+	\bottomrule
+\end{tabular}
+\caption{Bibliotecas utilizadas y sus versiones.}\label{tab:bibliotecas-python-is-ssl}
+\end{table}
+
+Se recomienda el uso de un entorno de desarrollo de \texttt{Conda}, se facilitan ficheros de configuración tanto para \texttt{Conda} como para instalación con \texttt{PIP}.
+
+\subsubsection{Git}
+Para poder utilizar el repositorio ha de utilizarse el gestor de versiones \texttt{Git}. Se recomienda utilizar GUI con soporte a VC tales que no requieran de una interfaz de comandos para su utilización, pero eso se deja a decisión del futuro desarrollador.
+
+\subsubsection{VSCode/Pycharm/\dots}
+El desarrollo propio del producto puede ser realizado en cualquier editor de textos, incluso en \texttt{Vi} si así se desea. La ventaja de herramientas como \texttt{Visual Studio Code} o \texttt{PyCharm}, es que permiten el uso de \textit{plugins} añadidos a los complementos del propio IDE, lo cual permite la generación de código un proceso mucho más sencillo y directo, reduciendo el número de errores ocasionados y permitiendo una depuración o refactorización del código fuente mucho más eficiente y sencilla.
+
+Se puede obtener cada una de las herramientas desde~\cite{VSCode, PyCharm}, respectivamente.
+
+\subsection{Compilación, instalación y ejecución del proyecto}
+En esta subsección se va a detallar el proceso a seguir para poder hacer uso del proyecto en local, modificarlo y/o utilizarlo. 
+
+\subsubsection{Adquisición del código fuente}
+Lo primero que se necesita es obtener el código en el equipo, para ello podemos seguir una de las siguientes aproximaciones:
+\begin{itemize}
+\item Mediante el uso de la terminal.
+\begin{enumerate}
+\tightlist
+\item Apertura de la terminal.
+\item Desplazarse al directorio en donde se desee clonar el repositorio (usando \texttt{cd} en Unix o \texttt{dir} en Windows).
+\item Hacer uso del siguiente comando:\\
+\texttt{git clone https://github.com/dpr1005/\\Semisupervised-learning-and-instance-selection-\\methods.git}
+\item Se dispone de una copia idéntica a la alojada en el repositorio de \texttt{GitHub}.
+\end{enumerate}
+
+\item Descarga desde el navegador.
+\begin{itemize}
+\tightlist
+\item Apertura del navegador preferido.
+\item Introducir en la barra de búsqueda la siguiente dirección:\\
+\texttt{https://github.com/dpr1005/\\Semisupervised-learning-and-instance-selection-methods/\\archive/refs/heads/main.zip}
+\item Aceptar la descarga en caso de tener habilitada la comprobación.
+\item Navegar con el Explorador de archivos del sistema hasta el directorio de descarga.
+\end{itemize}
+
+\item Uso de \texttt{GitKraken}.
+\begin{itemize}
+\tightlist
+\item Apertura de la aplicación.
+\item Hacer \textit{click} en \textit{Clone a repo}.
+\item En \textit{Repository Management} $\rightarrow$ \textit{Clone} $\rightarrow$ \textit{Clone with URL}: 
+\begin{itemize}
+\item Indicar la ruta local en la que nos interesa que se clone el repositorio.
+\item En URL introducir:\\
+\texttt{git clone https://github.com/dpr1005/\\Semisupervised-learning-and-instance-selection-\\methods.git}
+\end{itemize}
+\item Hacer \textit{click} en \textit{Clone the repo!}.
+\end{itemize}
+\end{itemize}
+
+\subsubsection{Importar el proyecto en PyCharm}
+Importar un proyecto en \texttt{PyCharm} es tan sencillo como:
+\begin{enumerate}
+\tightlist
+\item Apertura de \texttt{PyCharm}.
+\item Hacer \textit{click} en \textit{Open.} (Notar que también podríamos clonar el proyecto en este momento haciendo \textit{click} en \textit{Get from VCS}).
+\item Seleccionar la ruta en el equipo dónde se encuentra el directorio raíz del proyecto.
+\end{enumerate}
+
+\subsubsection{Crear entorno virtual de trabajo}
+Como se ha comentado previamente, para poder trabajar con este proyecto se requieren de una serie de bibliotecas de Python. El proyecto está preparado para crear un entorno de \texttt{Conda} propio, de forma que no interfiera con otros proyectos y sea más sencillo de mantener y actualizar.
+
+Se recomienda que los binarios de anaconda o miniconda estén configurados en el \texttt{path} del sistema para poder utilizar el comando \texttt{conda} desde la línea de comandos.
+
+El proceso de creación del entrono virtual con \texttt{Conda} es el siguiente:
+\begin{enumerate}
+\tightlist
+\item Apertura de la terminal.
+\item Navegar hasta la raíz del proyecto.
+\item Crear el entorno con:\\
+\texttt{conda env create -f is-ssl.yml}
+\item Cuando se desee utilizar se debe activar:\\
+\texttt{conda activate is-ssl}
+\end{enumerate}
+
+En caso de que se desee añadir al entorno (\texttt{venv}) actual en el que se encuentre el usuario:
+\begin{enumerate}
+\tightlist
+\item Apertura de la terminal.
+\item Navegar hasta la raíz del proyecto.
+\item Instalar los requerimientos del proyecto con:\\
+\texttt{pip install -r requeriments.txt}
+\end{enumerate}
+
+\subsubsection{Uso del proyecto}
+La forma de usar la biblioteca es muy sencilla, todo \texttt{IS-SSL} ha sido codificado siguiendo la misma guía de estilo (PEP 8), de forma que cualquier programador habituado con el uso de bibliotecas en Python lo encuentre intuitivo y sencillo.
+
+Todos los métodos de selección de instancias y algoritmos de aprendizaje semi-supervisado son clases de Python, de manera que para utilizarlo hay que hacer una importación del paquete y de la clase.
+
+Un ejemplo del uso completo de este \textit{software} es lo encontramos en Listing~\ref{lst:ejemplo}, donde se detallan los tipos de datos de entrada.
+
+Según la codificación realizada, todos los métodos accesibles de las clases esperan la entrada de objetos de tipo \texttt{DataFrame} de la librería de \texttt{Pandas}. Internamente en función de las operaciones que tenga que realizar, serán convertidos estos objetos a listas de Python o arreglos de \texttt{NumPy}. Independientemente de las operaciones internas, siempre la salida producida (en caso de tenerla) serán objetos de \texttt{Pandas}, no teniendo que ser necesariamente el mismo objeto de entrada modificado, en la mayor parte de las ocasiones serán objetos nuevos.
+
+\begin{lstlisting}[language=Python, caption={Ejemplo de uso de IS-SSL}, label={lst:ejemplo}]
+from ssl_dnx import TriTraining
+from is_dnx import ENN
+from sklearn.naive_bayes import GaussianNB
+from sklearn.neighbors import KNeighborsClassifier
+from sklearn.tree import DecisionTreeClassifier
+from sklearn.datasets import load_iris
+	
+if __name__ == "__main__":
+	model = TriTraining(
+		random_state = 42,
+		c1 = GaussianNB, c1_params = None,
+		c2 = KNeighborsClassifier, c2_params = {n_neighbors: 2},
+		c3 = DecisionTreeClassifier, c3_params = None	
+	)
+	filter_model = ENN(nearest_neighbors = 5, power_parameter = 2)
+	
+	iris = load_iris()
+	X = iris['data']
+	y = iris['target']
+
+	X = pd.DataFrame(X)
+	y = pd.DataFrame(y)
+	X, y = filter_model.filter(X, y)
+
+	val = [True if i % 2 == 0 else False for i in range(len(y))]
+	y[val] = -1
+
+	X, X_test, y, y_test = train_test_split(X.to_numpy(), y.to_numpy())
+
+	X = pd.DataFrame(X)
+	y = pd.DataFrame(y)
+
+	model.fit(X, y)
+	y_pred = model.predict(X_test)
+	print(accuracy_score(y_true=y_test, y_pred=y_pred))
+	
+\end{lstlisting}
+\pagebreak
+
+\subsection{Pruebas del sistema}
diff --git a/instance_selection/_DROP3.py b/instance_selection/_DROP3.py
index 22ca6ca..a23cb15 100644
--- a/instance_selection/_DROP3.py
+++ b/instance_selection/_DROP3.py
@@ -138,10 +138,6 @@ def filter(self, samples, y):
                         if np.array_equal(neigh, x_sample):
                             break
                     a_neighs = a_neighs[:index_a] + a_neighs[index_a + 1:]
-                    try:
-                        assert len(a_neighs) == self.nearest_neighbors
-                    except AssertionError:
-                        breakpoint()
                     # Find a new neigh for the associate
                     remaining_samples = [x for x, _, _ in initial_distances]
                     knn = NearestNeighbors(
@@ -162,20 +158,12 @@ def filter(self, samples, y):
                             a_neighs.append(pos_neigh)
                             break
 
-                    try:
-                        assert len(a_neighs) == self.nearest_neighbors + 1
-                    except AssertionError:
-                        print('Duplicated instances')
-
                     samples_info[tuple(a_associate_of_x)][0] = a_neighs
 
                     # Add a_associate to the associates list of the new neigh
                     new_neigh = a_neighs[-1]
-                    try:
-                        samples_info[tuple(new_neigh)][1].append(
-                            a_associate_of_x)
-                    except TypeError:
-                        pass
+                    samples_info[tuple(new_neigh)][1].append(
+                        a_associate_of_x)
 
         samples = pd.DataFrame([x for x, _, _ in initial_distances],
                                columns=self.x_attr)
diff --git a/instance_selection/_ENN.py b/instance_selection/_ENN.py
index 5cb2332..c21d7d2 100644
--- a/instance_selection/_ENN.py
+++ b/instance_selection/_ENN.py
@@ -18,7 +18,7 @@ def __init__(self, nearest_neighbors=3, power_parameter=2):
         self.power_parameter = power_parameter
         self.x_attr = None
 
-    def neighs(self, s_samples, s_targets, index, removed):
+    def __neighs(self, s_samples, s_targets, index, removed):
         x_sample = s_samples[index - removed]
         x_target = s_targets[index - removed]
         knn = NearestNeighbors(n_jobs=-1,
@@ -56,8 +56,8 @@ def filter(self, samples, y):
         removed = 0
 
         for index in range(size):
-            _, x_target, targets_not_x, samples_not_x, neigh_ind = self.neighs(
-                s_samples, s_targets, index, removed)
+            _, x_target, targets_not_x, samples_not_x, neigh_ind = \
+                self.__neighs(s_samples, s_targets, index, removed)
             y_targets = np.ravel(
                 np.array([targets_not_x[x] for x in neigh_ind[0]])).astype(int)
             count = np.bincount(y_targets)
@@ -100,9 +100,9 @@ def filter_original_complete(self, original, original_y, complete,
 
         for index in range(size):
             x_sample, x_target, targets_not_x, samples_not_x, neigh_ind = \
-                self.neighs(s_samples, s_targets, index, removed)
+                self.__neighs(s_samples, s_targets, index, removed)
             y_targets = [targets_not_x[x] for x in neigh_ind[0]]
-            count = np.bincount(y_targets)
+            count = np.bincount(np.ravel(y_targets))
             max_class = np.where(count == np.amax(count))[0][0]
             if max_class != x_target:
                 delete = True
diff --git a/instance_selection/_LocalSets.py b/instance_selection/_LocalSets.py
index 9984ee3..bc6884b 100644
--- a/instance_selection/_LocalSets.py
+++ b/instance_selection/_LocalSets.py
@@ -6,6 +6,7 @@
 # @Version:     2.0
 import sys
 
+import numpy as np
 import pandas as pd
 from sklearn.metrics import pairwise_distances
 
@@ -65,6 +66,12 @@ def usefulness(self, e):
     def get_local_sets(self):
         return self.local_sets
 
+    @staticmethod
+    def check_frame_to_numpy(y):
+        if isinstance(y, pd.DataFrame):
+            return np.ravel(y.to_numpy())
+        return y
+
 
 class LSSm(LocalSets):
     def __init__(self):
@@ -73,8 +80,8 @@ def __init__(self):
     def filter(self, instances, labels):
         names = instances.keys()
         instances = instances.to_numpy()
-        import numpy as np
         instances = [np.ravel(i) for i in instances]
+        labels = self.check_frame_to_numpy(labels)
         if len(instances) != len(labels):
             raise ValueError(
                 f'The dimension of the labeled data must be the same as the '
@@ -113,6 +120,7 @@ def filter(self, instances, labels):
                 f'number of labels given. {len(instances)} != {len(labels)}'
             )
         self.n_id = len(instances)
+        labels = self.check_frame_to_numpy(labels)
         lssm = LSSm()
         instances, labels = lssm.filter(instances, labels)
         instances = instances.to_numpy()
diff --git a/instance_selection/utils/__init__.py b/instance_selection/utils/__init__.py
index 6cae3ad..61248ec 100644
--- a/instance_selection/utils/__init__.py
+++ b/instance_selection/utils/__init__.py
@@ -1,4 +1,4 @@
-from ._transformer import transform, transform_original_complete,\
+from ._transformer import transform, transform_original_complete, \
     delete_multiple_element
 
 __all__ = [
diff --git a/is-ssl.yml b/is-ssl.yml
new file mode 100644
index 0000000..03274f3
--- /dev/null
+++ b/is-ssl.yml
@@ -0,0 +1,13 @@
+name: IS-SSL
+channels:
+  - conda-forge
+  - default
+  - anaconda
+dependencies:
+  - numpy=1.20.3
+  - scikit-learn=0.24.2
+  - matplotlib=3.4.3
+  - pandas=1.3.4
+  - yagmail=0.15.277
+  - scipy=1.7.1
+  - pytest=7.1.1
\ No newline at end of file
diff --git a/requirements.txt b/requirements.txt
index bd0b49a..37aeab6 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,8 +1,7 @@
-numpy
+numpy~=1.20.3
 scikit-learn~=0.24.2
 matplotlib~=3.4.3
 pandas~=1.3.4
-joblib~=1.1.0
-seaborn~=0.11.2
 yagmail~=0.15.277
-tqdm~=4.62.3
+scipy~=1.7.1
+pytest~=7.1.1
\ No newline at end of file


Test patch:
diff --git a/tests/InstanceSelection.py b/tests/InstanceSelection.py
new file mode 100644
index 0000000..3bfea95
--- /dev/null
+++ b/tests/InstanceSelection.py
@@ -0,0 +1,129 @@
+#!/usr/bin/env python
+# -*- coding:utf-8 -*-
+# @Filename:    InstanceSelection.py
+# @Author:      Daniel Puente Ramírez
+# @Time:        15/4/22 16:20
+
+import random
+
+import numpy as np
+import pandas as pd
+import pytest
+from sklearn.datasets import load_iris
+
+from instance_selection import ENN, CNN, RNN, ICF, MSS, DROP3, LSSm, LSBo
+
+
+def to_dataframe(y):
+    if not isinstance(y, pd.DataFrame):
+        return pd.DataFrame(y)
+    return y
+
+
+@pytest.fixture
+def iris_dataset():
+    x, y = load_iris(return_X_y=True, as_frame=True)
+    y = to_dataframe(y)
+    return x, y
+
+
+@pytest.fixture
+def iris_dataset_ss():
+    x, y = load_iris(return_X_y=True, as_frame=True)
+    y = to_dataframe(y)
+    li = list(set(range(x.shape[0])))
+
+    unlabeled = random.sample(li, int(x.shape[0] * 0.3))
+    labeled = [x for x in range(x.shape[0]) if x not in unlabeled]
+
+    complete = x
+    complete_labels = y
+
+    original = x.loc[labeled]
+    original_labels = y.loc[labeled]
+
+    return original, original_labels, complete, complete_labels
+
+
+def base(x, y, algorithm, params=None):
+    assert isinstance(x, pd.DataFrame) and isinstance(y, pd.DataFrame)
+    model = algorithm(**params) if params is not None else algorithm()
+    x_filtered, y_filtered = model.filter(x, y)
+
+    assert x_filtered.shape[1] == x.shape[1] and y_filtered.shape[1] == \
+           y.shape[1]
+
+    assert x_filtered.shape[0] == y_filtered.shape[0]
+    assert x_filtered.shape[0] < x.shape[0]
+
+
+def test_enn_original(iris_dataset):
+    x, y = iris_dataset
+    base(x, y, ENN, {'nearest_neighbors': 3, 'power_parameter': 2})
+
+
+def test_cnn(iris_dataset):
+    x, y = iris_dataset
+    base(x, y, CNN)
+
+
+def test_rnn(iris_dataset):
+    x, y = iris_dataset
+    base(x, y, RNN)
+
+
+def test_icf(iris_dataset):
+    x, y = iris_dataset
+    base(x, y, ICF, {'nearest_neighbors': 3, 'power_parameter': 2})
+
+
+def test_mss(iris_dataset):
+    x, y = iris_dataset
+    base(x, y, MSS)
+
+
+def test_drop3(iris_dataset):
+    x, y = iris_dataset
+    base(x, y, DROP3, {'nearest_neighbors': 3, 'power_parameter': 2})
+
+
+def test_local_sets_lssm(iris_dataset):
+    x, y = iris_dataset
+    base(x, y, LSSm)
+
+
+def test_local_sets_lsbo(iris_dataset):
+    x, y = iris_dataset
+    base(x, y, LSBo)
+
+
+def test_enn_ss(iris_dataset_ss):
+    original, original_labels, complete, complete_labels, = iris_dataset_ss
+
+    model = ENN()
+    x, y = model.filter_original_complete(original, original_labels,
+                                          complete, complete_labels)
+
+    new_orig = []
+    for ori in original.to_numpy():
+        for index, x_sample in enumerate(x.to_numpy()):
+            if np.array_equal(ori, x_sample):
+                new_orig.append(index)
+                break
+
+    a = np.ravel(y.loc[new_orig].to_numpy())
+    o = np.ravel(original_labels.to_numpy())
+    assert np.array_equal(o, a)
+    assert complete.shape[1] == x.shape[1]
+    assert complete.shape[0] >= x.shape[0]
+
+
+def test_different_len(iris_dataset):
+    x, y = iris_dataset
+    y = y.loc[:-1]
+    model1 = LSSm()
+    with pytest.raises(ValueError):
+        model1.filter(x, y)
+    model2 = LSBo()
+    with pytest.raises(ValueError):
+        model2.filter(x, y)
diff --git a/tests/__init__.py b/tests/__init__.py
new file mode 100644
index 0000000..7ee9a42
--- /dev/null
+++ b/tests/__init__.py
@@ -0,0 +1,7 @@
+#!/usr/bin/env python
+# -*- coding:utf-8 -*-
+# @Filename:    __init__.py
+# @Author:      Daniel Puente Ramírez
+# @Time:        15/4/22 16:19
+
+"""Python module for testing"""