LÓGICA DIFUSA
CON PYTHON
LIBRERÍA: simpful
LIBRERÍAS FUZZY PARA PYTHON
PyFuzzy, la primera para Python 2, ya no se actualiza.
1. Scikit-Fuzzy es una API de lógica difusa que funciona
en scipy, para modelar sistemas difusos.
2. Fuzzylab es una biblioteca de Python 3, basada en
Octave Fuzzy Logic Toolkit, crea controladores fuzzy.
Ambas bibliotecas no admiten definir funciones de
pertenencia personalizadas (solo preimplementadas) ni
sistemas de inferencia Takagi-Sugeno de orden
arbitrario. No proporcionan una interfaz cercana al
lenguaje natural para la definición de FIS. Fuzzylab
emplea una matriz que el usuario debe ingresar para
definir la base de reglas completa. Scikit-Fuzzy adopta
la notación de prefijo para definir los antecedentes de
las reglas.
CARACTERÍSTICAS DE simpful
Definición personalizada de funciones de
pertenencia: gaussiano (Gaussian_MF), gaussiano
invertido (InvGaussian_MF), doble gaussiano
(DoubleGaussian_MF), sigmoide (Sigmoid_MF),
sigmoide invertido (InvSigmoid_MF),
Triangular_MF), trapezoidal (Trapezoidal_MF).
Definición de reglas difusas como cadenas de
caracteres escritas en lenguaje natural.
Definición de reglas difusas arbitrariamente
complejas construidas con los operadores lógicos
Y (mínimo), NO (complemento a 1), O (máximo).
Métodos de inferencia: Mamdani y cualquier orden
Takagi-Sugeno
INSTALAR simpful
Descomprimir simpful-master.rar (mejor en la carpeta
donde tiene instalado Python). Estará en la carpeta
simpful-master
En Python abrir la ventana de comandos:
(Command Promt.exe)
Ir a la carpeta simpful-master.
Luego ir a la carpeta simpful (está en simpful-master).
Ejecutar:
> pip install simpful
ARQUITECTURA DEL SISTEMA
BASADO EN LÓGICA DIFUSA
REGLAS
Entrada Salida
Discreta Discreta
x Un y=f(x) V
FUZZYFICACIÓN DEFUZZYFICACIÓN
MOTOR DE
INFERENCIA
Entrada difusa DIFUSO
Salida difusa
MOTOR DE INFERENCIA
REGLAS
BORROSIFICADOR DESBORROSIFICADOR
MOTOR DE
INFERENCIA
CONEXIÓN
ANTECEDENTES
IMPLICACIÓN
AGREGACIÓN
CONEXIÓN ANTECEDENTES
REGLAS
BORROSIFICADOR DESBORROSIFICADOR
MOTOR DE
INFERENCIA
Regla 1: SI x es A1 Y y es B1 ENTONCES z es C1
SI x es A1 Y y es B1 ...
x y
A1 B1
MÍNIMO
1
PRODUCTO
x=x0 y=y0
mínimo : 1 min A1 ( x0 ), B1 ( y0 )
producto : 1 A1 ( x0 ) B1 ( y0 )
IMPLICACIÓN
REGLAS
BORROSIFICADOR DESBORROSIFICADOR
MOTOR DE
INFERENCIA
Regla 1: SI x es A1 Y y es B1 ENTONCES z es C1
... ENTONCES z es C1 z
C1
MÍNIMO
C1*
1
C1
PRODUCTO
C1*
mínimo :
C* ( z ) min 1 , C1 ( z )
1
producto : C* ( z ) 1 C1 ( z )
1
AGREGACIÓN
REGLAS
BORROSIFICADOR DESBORROSIFICADOR
MOTOR DE
INFERENCIA
Regla 1: SI x es A1 Y y es B1 ENTONCES z es C1
Regla 2: SI x es A2 Y y es B2 ENTONCES z es C2
z
C
z MÁXIMO
REGLA 1 C1 *
REGLA 2 C2 * C SUMA
ALGEBRAICA
máximo :
C ( z ) max C* ( z ), C* ( z )
1 2
suma algebraica : C ( z ) C* ( z ) C* ( z ) C* ( z ) C* ( z )
1 2 1 2
DEFUZZYFICACIÓN
REGLAS
BORROSIFICADOR DESBORROSIFICADOR
MOTOR DE
INFERENCIA
MEDIA DE LOS PROMEDIO DE
LOS CENTROS
MÁXIMOS
CENTROIDE
y1
y2
z=z0 z=z0 z=z0
MECANISMO DE SUGENO Y TAKAGI
R1: Si x está en A1 e y está en B1 Entonces z1 p1 x q1 y
R2: Si x está en A2 e y está en B2 Entonces z 2 p 2 x q 2 y
Hecho: x es x 0e y es y 0
Consecuencia: z0
Procedimiento
Primero 1 A1 ( x 0 ) B1 ( y 0 )
2 A2 ( x 0 ) B 2 ( y 0 )
Luego se calcula: z1 p1 x 0 q1 y 0 z2 p2 x0 q2 y0
1 z1 2 z2
Y la salida crisp z0
1 2
EJEMPLO DE LA PROPINA
Variable Etiquetas Función de
lingüística pertenencia
SERVICIO pobre, bueno, Triangular
excelente
COMIDA rancia, deliciosa Triangular
PROPINA pequeña, Triangular -
promedio, Trapezoidal
generosa
EJEMPLO DE LA PROPINA
Variables lingüisticas y etiquetas (funciones pertenencia)
from simpful import *
# problema de la propina
# Crear el modelo de sistema difuso
FS = FuzzySystem()
# Definir las variables lingüisticas de entrada y sus
conjuntos difusos (etiquetas y funciones de
pertenencia)
# SERVICIO:
S1 = FuzzySet(function=Triangular_MF(a=0, b=0,
c=5), term="pobre")
S2 = FuzzySet(function=Triangular_MF(a=0, b=5,
c=10), term="bueno")
S3 = FuzzySet(function=Triangular_MF(a=5,b=10,
c=10), term="excelente")
FS.add_linguistic_variable("Servicio",
LinguisticVariable([S1, S2, S3], concept="Calidad
del Servicio", universe_of_discourse=[0,10]))
# COMIDA:
C1 = FuzzySet(function=Triangular_MF(a=0, b=0,
c=10), term="rancia")
C2 = FuzzySet(function=Triangular_MF(a=0, b=10,
c=10), term="deliciosa")
FS.add_linguistic_variable("Comida",
LinguisticVariable([C1, C2], concept="Calidad de la
Comida", universe_of_discourse=[0,10]))
# Definir la variable lingüistica de salida y sus
conjuntos difusos (etiquetas y funciones de
pertenencia)
# PROPINA
P1 = FuzzySet(function=Triangular_MF(a=0, b=0,
c=10), term="pequeña")
P2 = FuzzySet(function=Triangular_MF(a=0, b=10,
c=20), term="promedio")
P3 = FuzzySet(function=Trapezoidal_MF(a=10,
b=20, c=25, d=25), term="generosa")
FS.add_linguistic_variable("Propina",
LinguisticVariable([P1, P2, P3],
universe_of_discourse=[0,25]))
# Definir las reglas difusas
R1 = "IF (Servicio IS pobre) OR (Comida IS rancia)
THEN (Propina IS pequeña)"
R2 = "IF (Servicio IS bueno) THEN (Propina IS
promedio)"
R3 = "IF (Servicio IS excelente) OR (Comida IS
deliciosa) THEN (Propina IS generosa)"
FS.add_rules([R1, R2, R3])
# Realizar una consulta (dar los valores de las
variables de entrada)
FS.set_variable("Servicio", 4)
FS.set_variable("Comida", 8)
# Ejecutar la inferencia Mamdani y mostrar la salida
print(FS.Mamdani_inference(["Propina"]))
SOFTWARE PARA SISTEMAS BASADOS
EN LÓGICA DIFUSA:
- Xfuzzy. Descargar de: (http://www2.imse-
cnm.csic.es/Xfuzzy/index_sp.html) (12Mb)
- Opcional: MATLAB (fuzzy toolbox)
- Python: simpful: Descargar de:
https://github.com/aresio/simpful
GRACIAS