Usted tiene a su disposición un laboratorio no calificado denominado "Introducción a skfuzzy". Una vez lo seleccione, va a encontrar unas instrucciones, que le sugerimos que lea, antes de dar clic en "Abrir el laboratorio". Encontrará un archivo de nombre "Introducción", que es el notebook del laboratorio mismo. Pero usted puede crear su propio notebook donde hacer sus propias pruebas. ¿Qué va a encontrar allí en ese notebook? Se lo explicamos a continuación. Skfuzzy es una librería escrita en Python para la construcción y manipulación de conjuntos difusos. En este laboratorio, ilustramos los principios de uso de esa librería. Vamos a mostrar cómo se construyen algunos conjuntos y cómo se hacen operaciones sencillas con ellos. Iniciamos con la importación de las librerías. Aparte de la librería skfussy como tal, vamos a necesitar numpy y matplotlib. La primera sobre todo en la manipulación de arreglos, porque la implementación de conjuntos difusos, vamos a verlo, utiliza arreglos, y la segunda librería para graficar. La importación la hacemos con las instrucciones usuales de Python y vamos a llamarlas "np", "plt" y "fuzz", a las tres librerías. Ahora sí, comencemos a utilizarlas. ¿Cómo se representan los conjuntos difusos en esta librería? Es necesario definir por aparte el universo de discurso y la función de pertenencia del conjunto que queremos crear. En ambos casos, hay que construir un arreglo; es decir, un arreglo para el universo de discurso y otro arreglo para la función de pertenencia. Los dos arreglos tienen que tener el mismo tamaño. De tal manera que la función de pertenencia se refiere al grado de pertenencia del elemento del universo de discurso a un determinado conjunto. Obsérvese que son representaciones discretas de los conjuntos difusos. Eso es importante. No hay una representación continua, sino una representación discreta. Por ejemplo, un universo de discurso con los elementos 1, 2, 3, 4, 5, lo construiremos con la instrucción de la librería numpy de np para construirla y el conjunto difuso A, especificado como está aquí, grado de pertenencia 0 para el 1, grado de pertenencia 0,8 para el 2, grado de pertenencia 0,3 para el 3, etcétera, lo construimos con un arreglo que tiene los grados de pertenencia, y es responsabilidad del usuario de la librería asegurar, por ejemplo, que el tamaño de los dos arreglos es correcto y que en la posición del arreglo del grado de pertenencia, está el grado de pertenencia del elemento correspondiente. Podemos graficarlo. Las siguientes instrucciones son para graficar el conjunto. Lo graficamos como los puntos y su grado de pertenencia. El elemento 1 tiene un grado de pertenencia 0. El elemento 2 tiene un grado de pertenencia 0,8, etcétera. Hemos hecho esta gráfica intencionalmente mostrando los puntos. Para eso, utilizamos en la instrucción plot este argumento, la "o". Si no lo hubiéramos hecho, de hecho acá abajo está sin ese argumento, el graficador interpola y traza líneas rectas entre los puntos, y eso nos da la falsa sensación de creer que la representación del conjunto difuso interna es continua. No lo es, es discreta. Solo está definido en los puntos del universo de discurso. Contamos con instrucciones para obtener los. alfa-cortes de un conjunto difuso. Recordemos que un alfa-corte es un subconjunto del universo de discurso, que tiene aquellos elementos del universo de discurso, cuyo grado de pertenencia a un cierto conjunto es mayor o igual que alfa, donde alfa es un número entre 0 y 1. La definición formal está aquí abajo, donde el mayor o igual se convierte en un mayor si alfa es 0. La instrucción en la librería para obtener el alfa-corte es lambda-corte, lambda_cut. Lambda_cut entrega un arreglo del mismo tamaño del universo de discurso, pero en cada casilla tiene un 1 o un 0. Un 1, si ese elemento forma parte del alfa-corte, un 0 si no forma parte de alfa-corte. Lo ejemplificamos en el laboratorio con 3 casos con el valor de alfa 0,35, 0,3 y 0,0. Y aquí se ilustra el uso de la función. Obsérvese que lo que se entrega es un arreglo con ceros o unos. La librería también nos permite construir de forma más o menos rápida conjuntos difusos con unas formas sencillas. Para eso, lo que hacemos es definir el universo de discurso. En este ejemplo vamos a construir un universo de discurso de nombre "Ux", que tiene los elementos 0, 1, 2, etcétera, hasta 98, 99, 100 y lo construimos, por ejemplo, con la instrucción que se ve aquí. Comience en 0, termine en 100 y utilice 101 datos. Con ese universo de discurso, podemos construir una función de pertenencia triangular, por ejemplo, con la instrucción trimf, "mf" es de "membership function", función de pertenencia y "tri" de triangular. Los argumentos son: el universo de discurso y un arreglo con tres datos que son los vértices del triángulo. Aquí construimos un ejemplo con los vértices en 10, 30 y 50, y los graficamos más abajo. Observen los vértices en 10, en 30 y en 50. Y en esta gráfica, hemos utilizado una instrucción para trazar la línea recta que interpola el graficador, y otra poniendo solo los puntitos en donde está definido el conjunto difuso. Una vez construido un conjunto difuso como este que hay aquí, podemos utilizar funciones de interpolación para encontrar el valor de la función de pertenencia en un dato, en un elemento que no necesariamente esté en el universo de discurso. Por ejemplo, 42,5, como se ilustra aquí abajo, no está en el universo de discurso. En el universo discurso está el 40, 41, 42, 43, 44 el 42,5 no está. Pero podemos hacer una interpolación para obtener la función de pertenencia. 0,375 es el resultado que hay aquí. Observen los argumentos. Se necesita el universo de discurso, el conjunto como tal y el lugar en donde queremos realizar la interpolación. La librería tiene otras funciones para construir conjuntos de otras formas. En este laboratorio, solo hemos traído como ejemplo la construcción de trapecios y de campanas de Gauss, pero se puede consultar la documentación de la librería para obtener otras formas. La construcción del trapecio es muy semejante a la del triángulo, solo que necesitamos ahora 4 vértices, mientras que la construcción de la campana de Gauss requiere especificar como argumento el centro de la campana y la desviación estándar; es decir, la desviación estándar va a controlar qué tan ancha es la campana. En el laboratorio tenemos graficado los conjuntos triangulares, el trapecio y la campana que hemos construido. Y vamos a utilizar dos de estos conjuntos, el triángulo y el trapecio, el conjunto B y el conjunto C, para mostrar algunas operaciones entre conjuntos difusos. Las tres operaciones que vamos a mostrar son: intersección, unión y complemento. Desde una perspectiva teórica, hay muchas funciones con las que se puede implementar la intersección. Cualquier t-norma nos sirve para representar la intersección. Pero en esta librería, la única t-norma que está implementada es la operación mínimo y está implementada en la instrucción fuzzy_and. De manera semejante, la única instrucción con la que está implementada la unión es la s-norma del máximo. Y el complemento, ya veremos con qué se implementa el con el complemento en esta librería. Vamos con el operador AND. El operador AND se utiliza como se muestra aquí. Estamos haciendo la operación AND de dos conjuntos, cada uno de esos conjuntos tiene que tener su universo de discurso. En el ejemplo que tenemos, tanto el conjunto B como el C comparten el mismo universo de discurso, pero tenemos que especificarlo. Para hacer el AND tenemos que dar el universo del primer conjunto y el grado de pertenencia del primer conjunto, el universo del segundo conjunto y el grado de pertenencia del segundo conjunto. ¿Qué entrega la función? Un nuevo conjunto; es decir, el universo y el grado de pertenencia. Estamos graficando también más abajo, por una parte, los conjuntos B y C, y a la derecha, el resultado de hacer la intersección entre los dos con el operador mínimo. Como puede verse, esa intersección corresponde a este pequeño triangulito de la intersección que pudiéramos obtener aquí, gráficamente también. El operador OR se utiliza de forma muy parecida. Esta es la instrucción, fuzzy-or Tenemos que dar universo, grado de pertenencia; universo, grado de pertenencia y la instrucción entrega, universo y grado de pertenencia. Les recuerdo que se implementa en esta librería con el operador máximo y el resultado se ilustra en estas gráficas. El máximo de los grados de pertenencia de los conjuntos B y C. Vamos ahora con el operador de complemento, la negación, que se implementa con la operación 1 menos grado de pertenencia, el complemento a 1. En la función complemento, como tal, la función NOT, opera recibiendo solo el grado de pertenencia, porque entrega un conjunto sobre el mismo universo de discurso de, en este caso, el conjunto B. Entonces, no hay que especificar el universo de discurso. Y aquí tenemos un ejemplo de uso de ese operador. Entregamos el conjunto con forma triangular y lo que nos entrega es el complemento a1 de ese conjunto triangular. En este laboratorio, también tenemos otros ejemplos que los invito a explorarlos. También les recuerdo que pueden construir su propio espacio de prueba, un archivo distinto e ir insertando celdas de código en Python para poder hacer pruebas, pruebas y pruebas. Explórenlo libremente, cambien los datos numéricos de este ejercicio para ver los resultados en cada caso.